Skip to content

Commit 6c41410

Browse files
committed
Merge branch 'master' of https://github.com/libmir/mir-algorithm
2 parents 75f78a2 + de92120 commit 6c41410

File tree

13 files changed

+108
-98
lines changed

13 files changed

+108
-98
lines changed

meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ this_dep = declare_dependency(
102102
dependencies: required_deps,
103103
)
104104

105-
test_versions = ['mir_test']
105+
test_versions = ['mir_test', 'NOGCEXP']
106106

107107
if has_cpp_headers
108108
install_subdir('include/',

source/mir/algorithm/iteration.d

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,6 @@ private void checkShapesMatch(
536536
(scope ref const Slices slices)
537537
if (Slices.length > 1)
538538
{
539-
enum msg = "all arguments must be slices" ~ tailErrorMessage!(fun, pfun);
540539
enum msgShape = "all slices must have the same shape" ~ tailErrorMessage!(fun, pfun);
541540
enum N = slices[0].shape.length;
542541
foreach (i, Slice; Slices)
@@ -2399,32 +2398,49 @@ template equal(alias pred = "a == b")
23992398
{
24002399
import mir.functional: naryFun;
24012400
static if (__traits(isSame, naryFun!pred, pred))
2402-
/++
2403-
Params:
2404-
slices = Two or more slices, slices, ranges, and arrays.
2405-
2406-
Returns:
2407-
`true` any of the elements verify `pred` and `false` otherwise.
2408-
+/
2409-
bool equal(Slices...)(scope Slices slices)
2410-
if (Slices.length >= 2)
24112401
{
2412-
enum msg = "all arguments must be slices" ~ tailErrorMessage!();
2413-
enum msgShape = "all slices must have the same dimension count" ~ tailErrorMessage!();
2414-
import mir.internal.utility;
2415-
foreach (i, Slice; Slices)
2402+
/++
2403+
Params:
2404+
slices = Two or more ndslices, ranges, and arrays.
2405+
2406+
Returns:
2407+
`true` any of the elements verify `pred` and `false` otherwise.
2408+
+/
2409+
bool equal(Slices...)(scope Slices slices)
2410+
if (Slices.length >= 2)
24162411
{
2417-
// static assert (isSlice!Slice, msg);
2418-
static if (i)
2412+
import mir.internal.utility;
2413+
static if (allSatisfy!(hasShape, Slices))
2414+
{
2415+
auto shape0 = slices[0].shape;
2416+
enum N = DimensionCount!(Slices[0]);
2417+
foreach (ref slice; slices[1 .. $])
2418+
{
2419+
if (slice.shape != shape0)
2420+
goto False;
2421+
}
2422+
return all!pred(allLightScope!slices);
2423+
}
2424+
else
24192425
{
2420-
static assert (DimensionCount!(Slices[i]) == DimensionCount!(Slices[0]));
2421-
foreach (j; Iota!(DimensionCount!(Slices[0])))
2422-
if (slices[i].shape[j] != slices[0].shape[j])
2426+
for(;;)
2427+
{
2428+
auto empty = slices[0].empty;
2429+
foreach (ref slice; slices[1 .. $])
2430+
{
2431+
if (slice.empty != empty)
2432+
goto False;
2433+
}
2434+
if (empty)
2435+
return true;
2436+
if (!pred(frontOf!slices))
24232437
goto False;
2438+
foreach (ref slice; slices)
2439+
slice.popFront;
2440+
}
24242441
}
2442+
False: return false;
24252443
}
2426-
return all!pred(allLightScope!slices);
2427-
False: return false;
24282444
}
24292445
else
24302446
alias equal = .equal!(naryFun!pred);
@@ -2466,7 +2482,6 @@ version(mir_test) unittest
24662482
@safe pure nothrow @nogc
24672483
version(mir_test) unittest
24682484
{
2469-
import mir.algorithm.iteration: equal;
24702485
import mir.math.common: approxEqual;
24712486
import mir.ndslice.allocation: rcslice;
24722487
import mir.ndslice.topology: as, iota;
@@ -3563,7 +3578,6 @@ if (isInputRange!Range && is(typeof(naryFun!pred(r.front, r.front)) == bool))
35633578
///
35643579
@safe version(mir_test) unittest
35653580
{
3566-
import std.algorithm.comparison : equal;
35673581
import std.algorithm.mutation : copy;
35683582

35693583
int[] arr = [ 1, 2, 2, 2, 2, 3, 4, 4, 4, 5 ];
@@ -3655,7 +3669,6 @@ struct Uniq(alias pred, Range)
36553669
version(none)
36563670
@safe version(mir_test) unittest
36573671
{
3658-
import std.algorithm.comparison : equal;
36593672
import std.internal.test.dummyrange;
36603673
import std.range;
36613674

@@ -3683,8 +3696,6 @@ version(none)
36833696

36843697
@safe version(mir_test) unittest // https://issues.dlang.org/show_bug.cgi?id=17264
36853698
{
3686-
import std.algorithm.comparison : equal;
3687-
36883699
const(int)[] var = [0, 1, 1, 2];
36893700
assert(var.uniq.equal([0, 1, 2]));
36903701
}

source/mir/algorithm/setops.d

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ MultiwayMerge!(naryFun!less, RangeOfRanges) multiwayMerge
122122
///
123123
@safe nothrow @nogc version(mir_test) unittest
124124
{
125-
import std.algorithm.comparison : equal;
125+
import mir.algorithm.iteration: equal;
126126

127127
static a =
128128
[
@@ -174,7 +174,7 @@ auto multiwayUnion(alias less = "a < b", RangeOfRanges)(RangeOfRanges ror)
174174
///
175175
@safe version(mir_test) unittest
176176
{
177-
import std.algorithm.comparison : equal;
177+
import mir.algorithm.iteration: equal;
178178

179179
// sets
180180
double[][] a =

source/mir/container/binaryheap.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ if (isRandomAccessRange!Store || isRandomAccessRange!(typeof(Store.init[])))
6767
{
6868
import mir.utility : min;
6969
import mir.functional : naryFun;
70-
static if (__VERSION__ >= 2085) import core.lifetime: move; else import std.algorithm.mutation: move;
70+
import core.lifetime: move;
7171
import std.algorithm.mutation : swapAt;
7272

7373
static if (isRandomAccessRange!Store)

source/mir/exception.d

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ module mir.exception;
77

88
version(D_Exceptions):
99

10+
version(D_Ddoc)
11+
private enum _version_D_Ddoc = true;
12+
else
13+
private enum _version_D_Ddoc = false;
14+
15+
private enum NOGCEXP = __traits(compiles, (()@nogc {throw new Exception("");})());
16+
1017
///
1118
auto ref enforce(string fmt, string file = __FILE__, int line = __LINE__, Expr)(scope auto return ref Expr arg) @trusted
1219
{
@@ -35,14 +42,6 @@ version (mir_test) unittest
3542
catch(Exception e) assert(e.msg == "Msg");
3643
}
3744

38-
version(D_Ddoc)
39-
private enum _version_D_Ddoc = true;
40-
else
41-
private enum _version_D_Ddoc = false;
42-
43-
static if (_version_D_Ddoc || __traits(compiles, (()@nogc {throw new Exception("");})()))
44-
{
45-
4645
/++
4746
+/
4847
class MirException : Exception
@@ -52,17 +51,19 @@ class MirException : Exception
5251
}
5352

5453
/// Generic style
54+
version (mir_test) static if (NOGCEXP)
5555
@safe pure nothrow @nogc
56-
version (mir_test) unittest
56+
unittest
5757
{
5858
import mir.exception;
5959
try throw new MirException("Hi D", 2, "!");
6060
catch(Exception e) assert(e.msg == "Hi D2!");
6161
}
6262

6363
/// C++ style
64+
version (mir_test) static if (NOGCEXP)
6465
@safe pure nothrow @nogc
65-
version (mir_test) unittest
66+
unittest
6667
{
6768
import mir.exception;
6869
import mir.format;
@@ -71,8 +72,9 @@ version (mir_test) unittest
7172
}
7273

7374
/// Low-level style
75+
version (mir_test) static if (NOGCEXP)
7476
@safe pure nothrow @nogc
75-
version (mir_test) unittest
77+
unittest
7678
{
7779
import mir.exception;
7880
import mir.format;
@@ -82,8 +84,9 @@ version (mir_test) unittest
8284
}
8385

8486
///
87+
version (mir_test) static if (NOGCEXP)
8588
@safe pure nothrow @nogc
86-
version (mir_test) unittest
89+
unittest
8790
{
8891
@safe pure nothrow @nogc
8992
bool func(scope const(char)[] msg)
@@ -127,7 +130,7 @@ version (mir_test) unittest
127130

128131
// ///
129132
// @safe pure nothrow @nogc
130-
// version (mir_test) unittest
133+
// version (mir_test) unittest static if (NOGCEXP)
131134
// {
132135
// import mir.exception;
133136
// try enforce(false, "Hi D", 2, "!");
@@ -154,7 +157,7 @@ version (mir_test) unittest
154157

155158
// ///
156159
// @safe pure nothrow @nogc
157-
// version (mir_test) unittest
160+
// version (mir_test) unittest static if (NOGCEXP)
158161
// {
159162
// import mir.exception;
160163
// try enforce(false, "Msg");
@@ -172,7 +175,8 @@ class MirError : Error
172175

173176
///
174177
@system pure nothrow @nogc
175-
version (mir_test) unittest
178+
version (mir_test) static if (NOGCEXP)
179+
unittest
176180
{
177181
@system pure nothrow @nogc
178182
bool func(scope const(char)[] msg)
@@ -294,5 +298,3 @@ private const(char)[] initilizePayload(ref return char[maxMsgLen] payload, scope
294298
(() @trusted => memcpy(payload.ptr, msg.ptr, msg.length))();
295299
return payload[0 .. msg.length];
296300
}
297-
298-
}

source/mir/format.d

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ pragma(inline, false)
191191
ref W printEscaped(C = char, W)(scope return ref W w, scope const(char)[] str)
192192
{
193193
// TODO: replace with Mir implementation.
194-
import std.uni: isGraphical;
195194
w.put('\"');
196195
foreach (char c; str[])
197196
{

source/mir/interpolate/polynomial.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ struct Lagrange(T, uint maxAdditionalFunctions = 0, X = T)
140140
+/
141141
this(Slice!(RCI!(immutable X)) grid, RCArray!T values)
142142
{
143-
static if (__VERSION__ >= 2085) import core.lifetime: move; else import std.algorithm.mutation: move;
143+
import core.lifetime: move;
144144
auto weights = grid.lightScope.inversedBarycentricWeights;
145145
this(grid.move, values.move, weights.move);
146146
}

source/mir/ndslice/allocation.d

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,7 @@ version(mir_test)
333333
{
334334
import mir.ndslice.slice;
335335
import mir.ndslice.allocation: slice;
336-
337-
import std.datetime.date;
336+
import mir.date: Date;
338337

339338
auto dataframe = slice!(double, Date, string)(4, 3);
340339
assert(dataframe.length == 4);

source/mir/ndslice/dynamic.d

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -764,29 +764,29 @@ auto reversed(Iterator, size_t N, SliceKind kind)(Slice!(Iterator, N, kind) slic
764764

765765
@safe @nogc pure nothrow version(mir_test) unittest
766766
{
767+
import mir.algorithm.iteration : equal;
768+
import mir.ndslice.concatenation : concatenation;
767769
import mir.ndslice.slice;
768770
import mir.ndslice.topology;
769-
import std.algorithm.comparison : equal;
770-
import std.range : chain;
771771
auto i0 = iota([4], 0); auto r0 = i0.retro;
772772
auto i1 = iota([4], 4); auto r1 = i1.retro;
773773
auto i2 = iota([4], 8); auto r2 = i2.retro;
774774
auto slice = iota(3, 4).universal;
775-
assert(slice .flattened.equal(chain(i0, i1, i2)));
775+
assert(slice .flattened.equal(concatenation(i0, i1, i2)));
776776
// Template
777-
assert(slice.reversed!(0) .flattened.equal(chain(i2, i1, i0)));
778-
assert(slice.reversed!(1) .flattened.equal(chain(r0, r1, r2)));
779-
assert(slice.reversed!(0, 1) .flattened.equal(chain(r2, r1, r0)));
780-
assert(slice.reversed!(1, 0) .flattened.equal(chain(r2, r1, r0)));
781-
assert(slice.reversed!(1, 1) .flattened.equal(chain(i0, i1, i2)));
782-
assert(slice.reversed!(0, 0, 0).flattened.equal(chain(i2, i1, i0)));
777+
assert(slice.reversed!(0) .flattened.equal(concatenation(i2, i1, i0)));
778+
assert(slice.reversed!(1) .flattened.equal(concatenation(r0, r1, r2)));
779+
assert(slice.reversed!(0, 1) .flattened.equal(concatenation(r2, r1, r0)));
780+
assert(slice.reversed!(1, 0) .flattened.equal(concatenation(r2, r1, r0)));
781+
assert(slice.reversed!(1, 1) .flattened.equal(concatenation(i0, i1, i2)));
782+
assert(slice.reversed!(0, 0, 0).flattened.equal(concatenation(i2, i1, i0)));
783783
// Function
784-
assert(slice.reversed (0) .flattened.equal(chain(i2, i1, i0)));
785-
assert(slice.reversed (1) .flattened.equal(chain(r0, r1, r2)));
786-
assert(slice.reversed (0, 1) .flattened.equal(chain(r2, r1, r0)));
787-
assert(slice.reversed (1, 0) .flattened.equal(chain(r2, r1, r0)));
788-
assert(slice.reversed (1, 1) .flattened.equal(chain(i0, i1, i2)));
789-
assert(slice.reversed (0, 0, 0).flattened.equal(chain(i2, i1, i0)));
784+
assert(slice.reversed (0) .flattened.equal(concatenation(i2, i1, i0)));
785+
assert(slice.reversed (1) .flattened.equal(concatenation(r0, r1, r2)));
786+
assert(slice.reversed (0, 1) .flattened.equal(concatenation(r2, r1, r0)));
787+
assert(slice.reversed (1, 0) .flattened.equal(concatenation(r2, r1, r0)));
788+
assert(slice.reversed (1, 1) .flattened.equal(concatenation(i0, i1, i2)));
789+
assert(slice.reversed (0, 0, 0).flattened.equal(concatenation(i2, i1, i0)));
790790
}
791791

792792
private enum _stridedCode = q{
@@ -919,23 +919,23 @@ pure nothrow version(mir_test) unittest
919919

920920
@safe @nogc pure nothrow version(mir_test) unittest
921921
{
922-
import mir.ndslice.slice;
923-
import mir.ndslice.topology;
924-
import std.algorithm.comparison : equal;
922+
import mir.ndslice;
923+
import mir.algorithm.iteration : equal;
924+
925925
import std.range : chain;
926926
auto i0 = iota([4], 0); auto s0 = stride(i0, 3);
927927
auto i1 = iota([4], 4); auto s1 = stride(i1, 3);
928928
auto i2 = iota([4], 8); auto s2 = stride(i2, 3);
929929
auto slice = iota(3, 4).universal;
930-
assert(slice .flattened.equal(chain(i0, i1, i2)));
930+
assert(slice .flattened.equal(concatenation(i0, i1, i2)));
931931
// Template
932-
assert(slice.strided!0(2) .flattened.equal(chain(i0, i2)));
933-
assert(slice.strided!1(3) .flattened.equal(chain(s0, s1, s2)));
934-
assert(slice.strided!(0, 1)(2, 3).flattened.equal(chain(s0, s2)));
932+
assert(slice.strided!0(2) .flattened.equal(concatenation(i0, i2)));
933+
assert(slice.strided!1(3) .flattened.equal(concatenation(s0, s1, s2)));
934+
assert(slice.strided!(0, 1)(2, 3).flattened.equal(concatenation(s0, s2)));
935935
// Function
936-
assert(slice.strided(0, 2).flattened.equal(chain(i0, i2)));
937-
assert(slice.strided(1, 3).flattened.equal(chain(s0, s1, s2)));
938-
assert(slice.strided(0, 2).strided(1, 3).flattened.equal(chain(s0, s2)));
936+
assert(slice.strided(0, 2).flattened.equal(concatenation(i0, i2)));
937+
assert(slice.strided(1, 3).flattened.equal(concatenation(s0, s1, s2)));
938+
assert(slice.strided(0, 2).strided(1, 3).flattened.equal(concatenation(s0, s2)));
939939
}
940940

941941
/++

source/mir/ndslice/package.d

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,7 @@ version(mir_test) unittest
608608

609609
pure nothrow version(mir_test) unittest
610610
{
611-
import std.algorithm.comparison : equal;
612-
import std.range : iota;
611+
import mir.ndslice.topology : iota;
613612
import mir.array.allocation : array;
614613
auto r = 1000.iota.array;
615614

@@ -634,7 +633,7 @@ pure nothrow version(mir_test) unittest
634633
t1.popBack();
635634
assert(t1.back == 17);
636635

637-
assert(t1.equal(iota(12, 18)));
636+
assert(t1 == iota([6], 12));
638637

639638
t1.front = 13;
640639
assert(t1.front == 13);

0 commit comments

Comments
 (0)