template ForEachIndex(size_t N, L...)
enum result =
Replace!(q{
alias IndexedBy.Indices[$N] L$N;
alias L$N.Inner!(typeof(this),ThisNode,Value, ValueView,$N,Allocator) M$N;
mixin M$N.IndexMixin!(M$N.IndexTuple) index$N;
template index(size_t n) if(n == $N){ alias index$N index; }
struct Index$N{
MultiIndexContainer _this;
// grr opdispatch not handle this one
auto opSlice(T...)(T ts){
return _this.index!($N).opSlice(ts);
}
// grr opdispatch not handle this one
auto opIndex(T...)(T ts){
return _this.index!($N).opIndex(ts);
}
// grr opdispatch not handle this one
auto opIndexAssign(T...)(T ts){
return _this.index!($N).opIndexAssign(ts);
}
// grr opdispatch not handle this one
auto opBinaryRight(string op, T...)(T ts){
return _this.index!($N).opBinaryRight!(op)(ts);
}
// grr opdispatch not handle this one
auto bounds(string bs = "[]", T)(T t1, T t2){
return _this.index!($N).bounds!(bs,T)(t1,t2);
}
// grr opdispatch not handle this one
auto bounds(V, string bs = "[]", T)(T t1, T t2){
return _this.index!($N).cbounds!(V,bs,T)(t1,t2);
}
// grr opdispatch not handle this one
auto cEqualRange(L, K)(K k)
{
return _this.index!($N).cEqualRange!(L, K).equalRange(k);
}
// grr opdispatch not handle this one
auto cEqualRange(L, K)(K k) const
{
return _this.index!($N).cEqualRange!(L, K).equalRange(k);
}
auto opDispatch(string s, T...)(T args){
mixin("return _this.index!($N)."~s~"(args);");
}
}
@property Index$N get_index(size_t n)() if(n == $N){
return Index$N(this);
}
}, "$N", N) ~ ForEachIndex!(N + 1, L[1..$]).result;