Interface std.range.interfaces.InputRange
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.
						
				interface InputRange(E)
				;
						
					
				Properties
| Name | Type | Description | 
|---|---|---|
								empty[get]
							 | 
							bool | |
								front[get]
							 | 
							E | 
Methods
| Name | Description | 
|---|---|
								
									moveFront
								
								()
							 | 
							Calls moveFront on the wrapped range, if
 possible. Otherwise, throws an UnsupportedRangeMethod exception.
 | 
						
								
									opApply
								
								()
							 | 
							foreach iteration uses opApply, since one delegate call per loop
 iteration is faster than three virtual function calls.
 | 
						
								
									popFront
								
								()
							 | 
							
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
Example
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);
Authors
Andrei Alexandrescu, David Simcha, and Jonathan M Davis. Credit for some of the ideas in building this module goes to Leonardo Maffi.