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. |
InputRangeObject | Class that implements the InputRange interface and wraps the input range methods in virtual functions. |
RefRange | Wrapper around a forward range that gives it reference semantics. |
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-2017 by the D Language Foundation | Page generated by
Ddoc on (no date time)