Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.
Requires a signed-in GitHub account. This works well for small changes.
If you'd like to make larger changes you may want to consider using
a local clone.
std.range.interfaces
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.
InputRange | Wrapper for input ranges. |
InputAssignable | Wrapper for input ranges with assignable elements. |
ForwardRange | Wrapper for forward ranges. |
ForwardAssignable | Wrapper for forward ranges with assignable elements. |
BidirectionalRange | Wrapper for bidirectional ranges. |
BidirectionalAssignable | Wrapper for bidirectional ranges with assignable elements. |
RandomAccessFinite | Wrapper for finite random-access ranges. |
RandomAccessAssignable | Wrapper for finite random-access ranges with assignable elements. |
RandomAccessInfinite | Wrapper for infinite random-access ranges. |
OutputRange | Wrapper for output ranges. |
OutputRangeObject | Class that implements the OutputRange interface and wraps the put methods in virtual functions. |
outputRangeObject | Convenience function for creating an OutputRangeObject with a base range of type R that accepts types E. |
InputRangeObject | Class that implements the InputRange interface and wraps the input range methods in virtual functions. |
inputRangeObject | Convenience function for creating an InputRangeObject of the proper type. |
MostDerivedInputRange | Returns the interface type that best matches the range. |
Source std/range/interfaces.d
License:
Authors:
Andrei Alexandrescu, David Simcha, and
Jonathan M Davis. Credit for some of the ideas
in building this module goes to
Leonardo Maffi.
- interface
InputRange
(E); - 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 isInputRange and 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.See Also:Examples:import std.algorithm.iteration : map; import std.range : iota; void useRange(InputRange!int range) { // Function body. } // Create a range type. auto squares = map!"a * a"(iota(10)); // Wrap it in an interface. auto squaresWrapped = inputRangeObject(squares); // Use it. useRange(squaresWrapped);
- @property E
front
(); - E
moveFront
(); - void
popFront
(); - @property bool
empty
(); - int
opApply
(scope int delegate(E));
intopApply
(scope int delegate(size_t, E)); - foreach iteration uses opApply, since one delegate call per loop iteration is faster than three virtual function calls.
- interface
ForwardRange
(E): InputRange!E; - Interface for a forward range of type E.
- @property ForwardRange!E
save
();
- interface
BidirectionalRange
(E): ForwardRange!E; - Interface for a bidirectional range of type E.
- @property BidirectionalRange!E
save
(); - @property E
back
(); - E
moveBack
(); - void
popBack
();
- interface
RandomAccessFinite
(E): BidirectionalRange!E; - Interface for a finite random access range of type E.
- @property RandomAccessFinite!E
save
(); - E
opIndex
(size_t); - E
moveAt
(size_t); - @property size_t
length
(); - alias
opDollar
= length; - RandomAccessFinite!E
opSlice
(size_t, size_t);
- interface
RandomAccessInfinite
(E): ForwardRange!E; - Interface for an infinite random access range of type E.
- E
moveAt
(size_t); - @property RandomAccessInfinite!E
save
(); - E
opIndex
(size_t);
- interface
InputAssignable
(E): InputRange!E; - Adds assignable elements to InputRange.
- @property void
front
(EnewVal
);
- interface
ForwardAssignable
(E): InputAssignable!E, ForwardRange!E; - Adds assignable elements to ForwardRange.
- @property ForwardAssignable!E
save
();
- interface
BidirectionalAssignable
(E): ForwardAssignable!E, BidirectionalRange!E; - Adds assignable elements to BidirectionalRange.
- @property BidirectionalAssignable!E
save
(); - @property void
back
(EnewVal
);
- interface
RandomFiniteAssignable
(E): RandomAccessFinite!E, BidirectionalAssignable!E; - Adds assignable elements to RandomAccessFinite.
- @property RandomFiniteAssignable!E
save
(); - void
opIndexAssign
(Eval
, size_tindex
);
- interface
OutputRange
(E); - Interface for an output range of type E. Usage is similar to the InputRange interface and descendants.
- void
put
(E);
- class
OutputRangeObject
(R, E...): staticMap!(OutputRange, E); - Implements the OutputRange interface for all types E and wraps the put method for each type E in a virtual function.
- this(R
range
);
- template
MostDerivedInputRange
(R) if (isInputRange!(Unqual!R)) - Returns the interface type that best matches R.
- template
InputRangeObject
(R) if (isInputRange!(Unqual!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.
- InputRangeObject!R
inputRangeObject
(R)(Rrange
)
if (isInputRange!R); - Convenience function for creating an InputRangeObject of the proper type. See InputRange for an example.
- template
outputRangeObject
(E...) - Convenience function for creating an OutputRangeObject with a base range of type R that accepts types E.Examples:
import std.array; auto app = appender!(uint[])(); auto appWrapped = outputRangeObject!(uint, uint[])(app); static assert(is(typeof(appWrapped) : OutputRange!(uint[]))); static assert(is(typeof(appWrapped) : OutputRange!(uint)));
- OutputRangeObject!(R, E)
outputRangeObject
(R)(Rrange
);
Copyright © 1999-2022 by the D Language Foundation | Page generated by
Ddoc on (no date time)