blob: 0ec0dd63e48d36a6ef7551dacad11b1f5763da9b [file] [log] [blame]
// REQUIRED_ARGS: -o-
// PERMUTE_ARGS:
struct Take(R)
{
public R source;
private size_t _maxAvailable;
alias R Source;
@property bool empty()
{
return _maxAvailable == 0 || source.empty;
}
@property auto ref front()
{
return source.front;
}
void popFront()
{
source.popFront();
--_maxAvailable;
}
@property size_t length() const
{
return _maxAvailable;
}
}
struct Repeat(T)
{
private T _value;
enum bool empty = false;
@property inout(T) front() inout { return _value; }
void popFront() {}
}
Take!(Repeat!T) repeat(T)(T value, size_t n)
{
return typeof(return)(Repeat!T(value), n);
}
auto array(Range)(Range r)
{
alias E = typeof(r.front);
//static if (hasLength!Range)
{
if (r.length == 0)
return null;
auto result = new E[](r.length);
size_t i;
static auto trustedGetAddr(T)(ref T t) @trusted nothrow pure
{
return &t;
}
foreach (e; r)
{
*trustedGetAddr(result[i]) = e;
++i;
}
return cast(E[])result;
}
}
enum r = [1].repeat(1).array;
static assert(r == [[1]]);