Authors
Andrei Alexandrescu, David Simcha, and
Jonathan M Davis. Credit for some of the ideas
in building this module goes to
Leonardo Maffi.This module is a submodule of std.range.
The main std.range module provides template-based tools for working with ranges, but sometimes an object-based interface for ranges is needed, such as when runtime polymorphism is required. For this purpose, this submodule provides a number of object and interface definitions that can be used to wrap around range objects created by the std.range templates.
Source: std/range/interfaces.d
These interfaces are intended to provide virtual function-based wrappers around input ranges with element type E. This is useful where a well-defined binary interface is required, such as when a DLL function or virtual function needs to accept a generic range as a parameter. Note that
isInputRangeand friends check for conformance to structural interfaces not for implementation of these interface types.
Limitations:
These interfaces are not capable of forwarding ref access to elements.
Infiniteness of the wrapped range is not propagated.
Length is not propagated in the case of non-random access ranges.
E front() @propertyE moveFront()Calls moveFront on the wrapped range, if possible. Otherwise, throws an UnsupportedRangeMethod exception.void popFront()bool empty() @propertyint opApply(scope int delegate(E))`foreach` iteration uses opApply, since one delegate call per loop iteration is faster than three virtual function calls.int opApply(scope int delegate(size_t, E))DittoInterface for a forward range of type E.
ForwardRange!E save() @propertyInterface for a bidirectional range of type E.
BidirectionalRange!E save() @propertyE back() @propertyE moveBack()Calls moveBack on the wrapped range, if possible. Otherwise, throws an UnsupportedRangeMethod exceptionvoid popBack()Interface for a finite random access range of type E.
RandomAccessFinite!E save() @propertyE opIndex(size_t)E moveAt(size_t)size_t length() @propertyInterface for an infinite random access range of type E.
bool emptyE moveAt(size_t)Calls moveAt on the wrapped range, if possible. Otherwise, throws an UnsupportedRangeMethod exception.RandomAccessInfinite!E save() @propertyE opIndex(size_t)Adds assignable elements to InputRange.
void front(E newVal) @propertyAdds assignable elements to ForwardRange.
ForwardAssignable!E save() @propertyAdds assignable elements to BidirectionalRange.
Adds assignable elements to RandomAccessFinite.
Interface for an output range of type E. Usage is similar to the InputRange interface and descendants.
void put(E)Thrown when an interface method is not supported by the wrapped range
InputRangeObject!R inputRangeObject(R)(R range) if (isInputRange!R)Convenience function for creating an `InputRangeObject` of the proper type. See InputRange for an example.Returns the interface type that best matches R.
Implements the most derived interface that R works with and wraps all relevant range primitives in virtual functions. If R is already derived from the InputRange interface, aliases itself away.
Convenience function for creating an OutputRangeObject with a base range of type R that accepts types E.