understanding mir, generic nd array iterator
monkyyy
crazymonkyyy at gmail.com
Mon Sep 15 05:01:13 UTC 2025
On Wednesday, 10 September 2025 at 20:23:28 UTC, monkyyy wrote:
> I asked
>> does a preexisting nd array iterator exist?
>
> got links to mir, docs I can barely read (srsly math language
> is anticomprehension)
>
> ndslice allocates, so, hottake misnamed. A slice is a reference
> to an array, a dynmaic array is a gc allocated array
> https://opendlang.org/library/mir.ndslice.allocation.slice.4.html#Slice
>
> Found `field`, says its a something defined by an opIndex,
> better, but no nd
>
> `fieldnd.d`or something exists but it defines 2 types of nd
> fields and not a generic mapping, idk
>
> `FieldIterator` exists but its opSlice only takes 2 arguments
> so I think I can rule it out as nd
>
> etc.
>
> So I dont think it exists in this tangled mess? Maybe, idk? I
> think in its naming scheme it would be called an ndfield
Will need to gentricify this, but this seems promising
```d
import std;
struct Tuple(T...){
enum istuple=true;
T expand; alias expand this;
}
auto tuple(T...)(T args){
return Tuple!T(args);
}
unittest{
auto foo=tuple(1,"hi");
assert(foo[0]==1);
assert(foo[1]=="hi");
auto bar=tuple();
}
enum istuple(T)=is(typeof(T.istuple));
unittest{
assert(istuple!(typeof(tuple(1,2)))==true);
assert(istuple!int==false);
}
auto iterate(T,S)(T t,S s){
struct foreach_{
int opApply(int delegate(int,int) dg){
int result;
static foreach(TI;0..t.length){
foreach(x;t[TI]){
static foreach(SI;0..s.length){
foreach(y;s[SI]){
result=dg(x,y);
if(result>2){return result;}
if(result==1){break;}
}}
}}
return result;
}}
return foreach_();
}
unittest{
loop:foreach(x,y;iterate(tuple(iota(0,3),iota(6,9)),tuple(iota(4,6)))){
writeln(x,',',y);
if(x==6){break;}
if(x==7){break loop;}
}}
```
More information about the Digitalmars-d-learn
mailing list