Skip to content

Commit c889f23

Browse files
authored
fix Cartesian, lightConst, lightImmutable (#151)
1 parent 794b1ce commit c889f23

File tree

5 files changed

+82
-74
lines changed

5 files changed

+82
-74
lines changed

source/mir/ndslice/field.d

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@ struct MapField(Field, alias _fun)
7777
///
7878
auto lightConst()() const @property
7979
{
80-
return MapField!(LightConstOf!Field, _fun)(_field.lightConst);
80+
return MapField!(LightConstOf!Field, _fun)(.lightConst(_field));
8181
}
8282

8383
///
8484
auto lightImmutable()() immutable @property
8585
{
86-
return MapField!(LightImmutableOf!Field, _fun)(_field.lightImmutable);
86+
return MapField!(LightImmutableOf!Field, _fun)(.lightImmutable(_field));
8787
}
8888

8989
/++
@@ -104,19 +104,19 @@ struct MapField(Field, alias _fun)
104104
}
105105

106106
static if (__traits(hasMember, Field, "length"))
107-
auto length()() @property
107+
auto length() @property
108108
{
109109
return _field.length;
110110
}
111111

112112
static if (__traits(hasMember, Field, "shape"))
113-
auto shape()() @property
113+
auto shape() @property
114114
{
115115
return _field.shape;
116116
}
117117

118118
static if (__traits(hasMember, Field, "elementCount"))
119-
auto elementCount()() @property
119+
auto elementCount() @property
120120
{
121121
return _field.elementCount;
122122
}
@@ -143,13 +143,13 @@ struct VmapField(Field, Fun)
143143
///
144144
auto lightConst()() const @property
145145
{
146-
return VmapField!(LightConstOf!Field, _fun)(_field.lightConst);
146+
return VmapField!(LightConstOf!Field, _fun)(.lightConst(_field));
147147
}
148148

149149
///
150150
auto lightImmutable()() immutable @property
151151
{
152-
return VmapField!(LightImmutableOf!Field, _fun)(_field.lightImmutable);
152+
return VmapField!(LightImmutableOf!Field, _fun)(.lightImmutable(_field));
153153
}
154154

155155
auto ref opIndex(T...)(auto ref T index)
@@ -165,19 +165,19 @@ struct VmapField(Field, Fun)
165165
}
166166

167167
static if (__traits(hasMember, Field, "length"))
168-
auto length()() @property
168+
auto length() @property
169169
{
170170
return _field.length;
171171
}
172172

173173
static if (__traits(hasMember, Field, "shape"))
174-
auto shape()() @property
174+
auto shape() @property
175175
{
176176
return _field.shape;
177177
}
178178

179179
static if (__traits(hasMember, Field, "elementCount"))
180-
auto elementCount()() @property
180+
auto elementCount() @property
181181
{
182182
return _field.elementCount;
183183
}
@@ -324,7 +324,7 @@ struct RepeatField(T)
324324
/++
325325
`BitField` is used by $(SUBREF topology, bitwise).
326326
+/
327-
struct BitField(Field, I = typeof(Field.init[size_t.init]))
327+
struct BitField(Field, I = typeof(cast()Field.init[size_t.init]))
328328
if (__traits(isUnsigned, I))
329329
{
330330
@optmath:
@@ -363,13 +363,13 @@ struct BitField(Field, I = typeof(Field.init[size_t.init]))
363363
///
364364
auto lightConst()() const @property
365365
{
366-
return BitField!(LightConstOf!Field)(_field.lightConst);
366+
return BitField!(LightConstOf!Field, I)(mir.qualifier.lightConst(_field));
367367
}
368368

369369
///
370370
auto lightImmutable()() immutable @property
371371
{
372-
return BitField!(LightImmutableOf!Field)(_field.lightImmutable);
372+
return BitField!(LightImmutableOf!Field, I)(mir.qualifier.lightImmutable(_field));
373373
}
374374

375375
bool opIndex()(size_t index)
@@ -422,7 +422,7 @@ auto BitField__map(Field, I, alias fun)(BitField!(Field, I) field)
422422
/++
423423
`BitpackField` is used by $(SUBREF topology, bitpack).
424424
+/
425-
struct BitpackField(Field, uint pack, I = typeof(Field.init[size_t.init]))
425+
struct BitpackField(Field, uint pack, I = typeof(cast()Field.init[size_t.init]))
426426
if (__traits(isUnsigned, I))
427427
{
428428
//static assert();
@@ -437,13 +437,13 @@ struct BitpackField(Field, uint pack, I = typeof(Field.init[size_t.init]))
437437
///
438438
auto lightConst()() const @property
439439
{
440-
return BitpackField!(LightConstOf!Field, pack)(_field.lightConst);
440+
return BitpackField!(LightConstOf!Field, pack)(.lightConst(_field));
441441
}
442442

443443
///
444444
auto lightImmutable()() immutable @property
445445
{
446-
return BitpackField!(LightImmutableOf!Field, pack)(_field.lightImmutable);
446+
return BitpackField!(LightImmutableOf!Field, pack)(.lightImmutable(_field));
447447
}
448448

449449
I opIndex()(size_t index)
@@ -590,14 +590,14 @@ struct CycleField(Field)
590590
///
591591
auto lightConst()() const @property
592592
{
593-
auto field = _field.lightConst;
593+
auto field = .lightConst(_field);
594594
return CycleField!(typeof(field))(_length, field);
595595
}
596596

597597
///
598598
auto lightImmutable()() immutable @property
599599
{
600-
auto field = _field.lightImmutable;
600+
auto field = .lightImmutable(_field);
601601
return CycleField!(typeof(field))(_length, field);
602602
}
603603

@@ -638,14 +638,14 @@ struct CycleField(Field, size_t length)
638638
///
639639
auto lightConst()() const @property
640640
{
641-
auto field = _field.lightConst;
641+
auto field = .lightConst(_field);
642642
return CycleField!(typeof(field), _length)(field);
643643
}
644644

645645
///
646646
auto lightImmutable()() immutable @property
647647
{
648-
auto field = _field.lightImmutable;
648+
auto field = .lightImmutable(_field);
649649
return CycleField!(typeof(field), _length)(field);
650650
}
651651

@@ -748,7 +748,7 @@ struct LinspaceField(T)
748748
@optmath:
749749

750750
///
751-
size_t length()() const @property
751+
size_t length() const @property
752752
{
753753
return _length;
754754
}
@@ -770,7 +770,6 @@ struct MagicField()
770770

771771
/++
772772
Magic Square size.
773-
Should be even.
774773
+/
775774
size_t _n;
776775

@@ -794,7 +793,7 @@ struct MagicField()
794793
}
795794

796795
///
797-
size_t[1] shape()() const @property @nogc
796+
size_t[1] shape() const @property @nogc
798797
{
799798
return [_n * _n];
800799
}

source/mir/ndslice/iterator.d

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -227,13 +227,13 @@ struct RetroIterator(Iterator)
227227
///
228228
auto lightConst()() const @property
229229
{
230-
return RetroIterator!(LightConstOf!Iterator)(.lightConst(_iterator));
230+
return RetroIterator!(LightConstOf!Iterator)(mir.qualifier.lightConst(_iterator));
231231
}
232232

233233
///
234234
auto lightImmutable()() immutable @property
235235
{
236-
return RetroIterator!(LightImmutableOf!Iterator)(.lightImmutable(_iterator));
236+
return RetroIterator!(LightImmutableOf!Iterator)(mir.qualifier.lightImmutable(_iterator));
237237
}
238238

239239
///
@@ -346,13 +346,13 @@ struct StrideIterator(Iterator)
346346
///
347347
auto lightConst()() const @property
348348
{
349-
return StrideIterator!(LightConstOf!Iterator)(_stride, _iterator.lightConst);
349+
return StrideIterator!(LightConstOf!Iterator)(_stride, .lightConst(_iterator));
350350
}
351351

352352
///
353353
auto lightImmutable()() immutable @property
354354
{
355-
return StrideIterator!(LightImmutableOf!Iterator)(_stride, _iterator.lightImmutable);
355+
return StrideIterator!(LightImmutableOf!Iterator)(_stride, .lightImmutable(_iterator));
356356
}
357357

358358
///
@@ -498,7 +498,9 @@ struct ZipIterator(Iterators...)
498498
import std.format;
499499
import mir.ndslice.topology: iota;
500500
import std.meta: staticMap;
501-
return mixin("ZipIterator!(staticMap!(LightConstOf, Iterators))(%(_iterators[%s].lightConst,%)].lightConst)".format(_iterators.length.iota));
501+
alias Ret = ZipIterator!(staticMap!(LightConstOf, Iterators));
502+
enum ret = "Ret(%(.lightConst(_iterators[%s]),%)]))".format(_iterators.length.iota);
503+
return mixin(ret);
502504
}
503505

504506
///
@@ -507,7 +509,9 @@ struct ZipIterator(Iterators...)
507509
import std.format;
508510
import mir.ndslice.topology: iota;
509511
import std.meta: staticMap;
510-
return mixin("ZipIterator!(staticMap!(LightImmutableOf, Iterators))(%(_iterators[%s].lightImmutable,%)].lightImmutable)".format(_iterators.length.iota));
512+
alias Ret = ZipIterator!(staticMap!(LightImmutableOf, Iterators));
513+
enum ret = "Ret(%(.lightImmutable(_iterators[%s]),%)]))".format(_iterators.length.iota);
514+
return mixin(ret);
511515
}
512516

513517
auto opUnary(string op : "*")()
@@ -624,7 +628,7 @@ struct CachedIterator(Iterator, CacheIterator, FlagIterator)
624628
auto lightConst()() const @property
625629
{
626630
return CachedIterator!(LightConstOf!Iterator, LightConstOf!CacheIterator, LightConstOf!FlagIterator)(
627-
_iterator.lightConst,
631+
.lightConst(_iterator),
628632
_caches.lightConst,
629633
_flags.lightConst,
630634
);
@@ -634,7 +638,7 @@ struct CachedIterator(Iterator, CacheIterator, FlagIterator)
634638
auto lightImmutable()() immutable @property
635639
{
636640
return CachedIterator!(LightImmutableOf!Iterator, LightImmutableOf!CacheIterator, LightImmutableOf!FlagIterator)(
637-
_iterator.lightImmutable,
641+
.lightImmutable(_iterator),
638642
_caches.lightImmutable,
639643
_flags.lightImmutable,
640644
);
@@ -1147,7 +1151,7 @@ struct IndexIterator(Iterator, Field)
11471151
///
11481152
auto lightConst()() const @property
11491153
{
1150-
return IndexIterator!(LightConstOf!Iterator, LightConstOf!Field)(.lightConst(_iterator), _field.lightConst);
1154+
return IndexIterator!(LightConstOf!Iterator, LightConstOf!Field)(.lightConst(_iterator), .lightConst(_field));
11511155
}
11521156

11531157
///
@@ -1287,13 +1291,13 @@ struct SliceIterator(Iterator, size_t N = 1, SliceKind kind = Contiguous)
12871291
///
12881292
auto lightConst()() const @property
12891293
{
1290-
return SliceIterator!(LightConstOf!Iterator, N, kind)(_lengths, _strides, _iterator.lightConst);
1294+
return SliceIterator!(LightConstOf!Iterator, N, kind)(_lengths, _strides, .lightConst(_iterator));
12911295
}
12921296

12931297
///
12941298
auto lightImmutable()() immutable @property
12951299
{
1296-
return SliceIterator!(LightImmutableOf!Iterator, N, kind)(_lengths, _strides, _iterator.lightImmutable);
1300+
return SliceIterator!(LightImmutableOf!Iterator, N, kind)(_lengths, _strides, .lightImmutable(_iterator));
12971301
}
12981302

12991303
auto opUnary(string op : "*")()
@@ -1341,13 +1345,13 @@ struct FieldIterator(Field)
13411345
///
13421346
auto lightConst()() const @property
13431347
{
1344-
return FieldIterator!(LightConstOf!Field)(_index, _field.lightConst);
1348+
return FieldIterator!(LightConstOf!Field)(_index, .lightConst(_field));
13451349
}
13461350

13471351
///
13481352
auto lightImmutable()() immutable @property
13491353
{
1350-
return FieldIterator!(LightImmutableOf!Field)(_index, _field.lightImmutable);
1354+
return FieldIterator!(LightImmutableOf!Field)(_index, .lightImmutable(_field));
13511355
}
13521356

13531357
///
@@ -1688,13 +1692,13 @@ struct StairsIterator(Iterator, string direction)
16881692
///
16891693
auto lightConst()() const @property
16901694
{
1691-
return StairsIterator!(LightConstOf!Iterator, direction)(_length, _iterator.lightConst);
1695+
return StairsIterator!(LightConstOf!Iterator, direction)(_length, .lightConst(_iterator));
16921696
}
16931697

16941698
///
16951699
auto lightImmutable()() immutable @property
16961700
{
1697-
return StairsIterator!(LightImmutableOf!Iterator, direction)(_length, _iterator.lightImmutable);
1701+
return StairsIterator!(LightImmutableOf!Iterator, direction)(_length, .lightImmutable(_iterator));
16981702
}
16991703

17001704
@optmath:

source/mir/ndslice/ndfield.d

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,14 @@ struct Cartesian(NdFields...)
8484
size_t length(size_t d = 0)() @property
8585
{
8686
foreach(f, ref field; _fields)
87-
static if (M!(f + 1) > d)
88-
return field.length!(d - M!f);
87+
static if (M!f <= d && M!(f + 1) > d)
88+
{
89+
enum d = d - M!f;
90+
static if (d)
91+
return field.length!(d - M!f);
92+
else
93+
return field.length;
94+
}
8995
}
9096

9197
///
@@ -114,7 +120,7 @@ struct Cartesian(NdFields...)
114120
size_t ret = 1;
115121
foreach (ref field; _fields)
116122
ret *= field.elementCount;
117-
ret;
123+
return ret;
118124
}
119125

120126
///

source/mir/ndslice/topology.d

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3578,18 +3578,19 @@ auto magic(size_t length)
35783578
@safe pure nothrow
35793579
version(mir_test) unittest
35803580
{
3581+
import mir.math.sum;
3582+
import mir.ndslice: slice, magic, byDim, map, as, repeat, diagonal, antidiagonal;
3583+
35813584
bool isMagic(S)(S matrix)
35823585
{
3583-
import mir.math.sum;
3584-
import mir.ndslice: magic, byDim, map, all, diagonal, antidiagonal;
35853586
auto n = matrix.length;
35863587
auto c = n * (n * n + 1) / 2; // magic number
35873588
return // check shape
35883589
matrix.length!0 > 0 && matrix.length!0 == matrix.length!1
35893590
&& // each row sum should equal magic number
3590-
matrix.byDim!0.map!sum.all!(a => a == c)
3591+
matrix.byDim!0.map!sum == c.repeat(n)
35913592
&& // each columns sum should equal magic number
3592-
matrix.byDim!1.map!sum.all!(a => a == c)
3593+
matrix.byDim!1.map!sum == c.repeat(n)
35933594
&& // diagonal sum should equal magic number
35943595
matrix.diagonal.sum == c
35953596
&& // antidiagonal sum should equal magic number
@@ -3600,6 +3601,7 @@ version(mir_test) unittest
36003601
assert(!isMagic(magic(2))); // 2x2 magic square does not exist
36013602
foreach(n; 3 .. 24)
36023603
assert(isMagic(magic(n)));
3604+
assert(isMagic(magic(3).as!double.slice));
36033605
}
36043606

36053607
/++

0 commit comments

Comments
 (0)