More IndexedBy
"Nordlöw" via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun Feb 22 02:54:09 PST 2015
On Sunday, 22 February 2015 at 10:52:26 UTC, Nordlöw wrote:
> At
>
> https://github.com/nordlow/justd/blob/master/typecons_ex.d#L93
>
> I'm trying to implement a wrapper type that provides type-safe
> indexing and slicing via an integer-like wrapper type I call
Here's a copy of the definitions for reference:
struct Index(T = size_t)
{
@safe pure: @nogc nothrow:
this(T ix) { this._ix = ix; }
alias _ix this;
private T _ix = 0;
}
import std.traits: isIntegral, isInstanceOf;
import std.range: hasSlicing;
enum IndexableBy(R, I) = (hasSlicing!R &&
(isIntegral!I || // TODO should we allo
isIntegral here?
isInstanceOf!(Index, I) ||
is(I == enum)));
/** Wrapper for $(D R) with Type-Safe $(D I)-Indexing.
See also:
http://forum.dlang.org/thread/gayfjaslyairnzrygbvh@forum.dlang.org#post-gayfjaslyairnzrygbvh:40forum.dlang.org
TODO Support indexing by tuples
TODO Use std.range.indexed
*/
struct IndexedBy(R, I) if (IndexableBy!(R, I))
{
alias RI = size_t; /* TODO: Extract this from R somehow. */
auto ref opIndex(I ix) inout { return _r[ix]; }
auto ref opIndexAssign(V)(V value, I ix) { return _r[ix] =
value; }
auto ref opSlice(I lower, I upper) inout { return _r[lower ..
upper]; }
auto ref opSliceAssign(V)(V value, I lower, I upper) { return
_r[lower .. upper] = value; }
static if (!is(RI == I))
{
@disable void opIndex(RI i);
@disable void opIndexAssign(V)(V value, RI i);
@disable void opSlice(RI i, RI j);
@disable void opSliceAssign(V)(V value, RI i, RI j);
}
R _r;
alias _r this; // TODO Use opDispatch instead; to override
only opSlice and opIndex
}
/** Instantiator for $(D IndexedBy).
*/
auto indexedBy(I, R)(R range) if (IndexableBy!(R, I))
{
return IndexedBy!(R, I)(range);
}
More information about the Digitalmars-d-learn
mailing list