| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| auto a = array([1, 2, 3, 4, 5][]); |
| assert(a == [ 1, 2, 3, 4, 5 ]); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| import std.range.primitives : isRandomAccessRange; |
| import std.traits : isAutodecodableString; |
| |
| // note that if autodecoding is turned off, `array` will not transcode these. |
| static if (isAutodecodableString!string) |
| assert("Hello D".array == "Hello D"d); |
| else |
| assert("Hello D".array == "Hello D"); |
| |
| static if (isAutodecodableString!wstring) |
| assert("Hello D"w.array == "Hello D"d); |
| else |
| assert("Hello D"w.array == "Hello D"w); |
| |
| static assert(isRandomAccessRange!dstring == true); |
| } |
| |
| @safe pure unittest |
| { |
| import std.array; |
| |
| import std.range : repeat, zip; |
| import std.typecons : tuple; |
| import std.range.primitives : autodecodeStrings; |
| auto a = assocArray(zip([0, 1, 2], ["a", "b", "c"])); // aka zipMap |
| static assert(is(typeof(a) == string[int])); |
| assert(a == [0:"a", 1:"b", 2:"c"]); |
| |
| auto b = assocArray([ tuple("foo", "bar"), tuple("baz", "quux") ]); |
| static assert(is(typeof(b) == string[string])); |
| assert(b == ["foo":"bar", "baz":"quux"]); |
| |
| static if (autodecodeStrings) |
| alias achar = dchar; |
| else |
| alias achar = immutable(char); |
| auto c = assocArray("ABCD", true.repeat); |
| static assert(is(typeof(c) == bool[achar])); |
| bool[achar] expected = ['D':true, 'A':true, 'B':true, 'C':true]; |
| assert(c == expected); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| import std.algorithm.sorting : sort; |
| import std.typecons : tuple, Tuple; |
| |
| auto aa = ["a": 1, "b": 2, "c": 3]; |
| Tuple!(string, int)[] pairs; |
| |
| // Iteration over key/value pairs. |
| foreach (pair; aa.byPair) |
| { |
| if (pair.key == "b") |
| pairs ~= tuple("B", pair.value); |
| else |
| pairs ~= pair; |
| } |
| |
| // Iteration order is implementation-dependent, so we should sort it to get |
| // a fixed order. |
| pairs.sort(); |
| assert(pairs == [ |
| tuple("B", 2), |
| tuple("a", 1), |
| tuple("c", 3) |
| ]); |
| } |
| |
| @system nothrow pure unittest |
| { |
| import std.array; |
| |
| double[] arr = uninitializedArray!(double[])(100); |
| assert(arr.length == 100); |
| |
| double[][] matrix = uninitializedArray!(double[][])(42, 31); |
| assert(matrix.length == 42); |
| assert(matrix[0].length == 31); |
| |
| char*[] ptrs = uninitializedArray!(char*[])(100); |
| assert(ptrs.length == 100); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| import std.algorithm.comparison : equal; |
| import std.range : repeat; |
| |
| auto arr = minimallyInitializedArray!(int[])(42); |
| assert(arr.length == 42); |
| |
| // Elements aren't necessarily initialized to 0, so don't do this: |
| // assert(arr.equal(0.repeat(42))); |
| // If that is needed, initialize the array normally instead: |
| auto arr2 = new int[42]; |
| assert(arr2.equal(0.repeat(42))); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| int[] a = [ 10, 11, 12, 13, 14 ]; |
| int[] b = a[1 .. 3]; |
| assert(overlap(a, b) == [ 11, 12 ]); |
| b = b.dup; |
| // overlap disappears even though the content is the same |
| assert(overlap(a, b).empty); |
| |
| static test()() @nogc |
| { |
| auto a = "It's three o'clock"d; |
| auto b = a[5 .. 10]; |
| return b.overlap(a); |
| } |
| |
| //works at compile-time |
| static assert(test == "three"d); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| import std.meta : AliasSeq; |
| |
| // can be used as an alternative implementation of overlap that returns |
| // `true` or `false` instead of a slice of the overlap |
| bool isSliceOf(T)(const scope T[] part, const scope T[] whole) |
| { |
| return part.overlap(whole) is part; |
| } |
| |
| auto x = [1, 2, 3, 4, 5]; |
| |
| assert(isSliceOf(x[3..$], x)); |
| assert(isSliceOf(x[], x)); |
| assert(!isSliceOf(x, x[3..$])); |
| assert(!isSliceOf([7, 8], x)); |
| assert(isSliceOf(null, x)); |
| |
| // null is a slice of itself |
| assert(isSliceOf(null, null)); |
| |
| foreach (T; AliasSeq!(int[], const(int)[], immutable(int)[], const int[], immutable int[])) |
| { |
| T a = [1, 2, 3, 4, 5]; |
| T b = a; |
| T c = a[1 .. $]; |
| T d = a[0 .. 1]; |
| T e = null; |
| |
| assert(isSliceOf(a, a)); |
| assert(isSliceOf(b, a)); |
| assert(isSliceOf(a, b)); |
| |
| assert(isSliceOf(c, a)); |
| assert(isSliceOf(c, b)); |
| assert(!isSliceOf(a, c)); |
| assert(!isSliceOf(b, c)); |
| |
| assert(isSliceOf(d, a)); |
| assert(isSliceOf(d, b)); |
| assert(!isSliceOf(a, d)); |
| assert(!isSliceOf(b, d)); |
| |
| assert(isSliceOf(e, a)); |
| assert(isSliceOf(e, b)); |
| assert(isSliceOf(e, c)); |
| assert(isSliceOf(e, d)); |
| |
| //verifies R-value compatibilty |
| assert(!isSliceOf(a[$ .. $], a)); |
| assert(isSliceOf(a[0 .. 0], a)); |
| assert(isSliceOf(a, a[0.. $])); |
| assert(isSliceOf(a[0 .. $], a)); |
| } |
| } |
| |
| @safe pure unittest |
| { |
| import std.array; |
| |
| int[] a = [ 1, 2, 3, 4 ]; |
| a.insertInPlace(2, [ 1, 2 ]); |
| assert(a == [ 1, 2, 1, 2, 3, 4 ]); |
| a.insertInPlace(3, 10u, 11); |
| assert(a == [ 1, 2, 1, 10, 11, 2, 3, 4]); |
| |
| union U |
| { |
| float a = 3.0; |
| int b; |
| } |
| |
| U u1 = { b : 3 }; |
| U u2 = { b : 4 }; |
| U u3 = { b : 5 }; |
| U[] unionArr = [u2, u3]; |
| unionArr.insertInPlace(2, [u1]); |
| assert(unionArr == [u2, u3, u1]); |
| unionArr.insertInPlace(0, [u3, u2]); |
| assert(unionArr == [u3, u2, u2, u3, u1]); |
| |
| static class C |
| { |
| int a; |
| float b; |
| |
| this(int a, float b) { this.a = a; this.b = b; } |
| } |
| |
| C c1 = new C(42, 1.0); |
| C c2 = new C(0, 0.0); |
| C c3 = new C(int.max, float.init); |
| |
| C[] classArr = [c1, c2, c3]; |
| insertInPlace(classArr, 3, [c2, c3]); |
| C[5] classArr1 = classArr; |
| assert(classArr1 == [c1, c2, c3, c2, c3]); |
| insertInPlace(classArr, 0, c3, c1); |
| C[7] classArr2 = classArr; |
| assert(classArr2 == [c3, c1, c1, c2, c3, c2, c3]); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| auto a = [1, 2, 3, 4, 5]; |
| auto b = a[0 .. 2]; |
| |
| assert(a.sameHead(b)); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| auto a = [1, 2, 3, 4, 5]; |
| auto b = a[3..$]; |
| |
| assert(a.sameTail(b)); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| auto a = "abc"; |
| auto s = replicate(a, 3); |
| |
| assert(s == "abcabcabc"); |
| |
| auto b = [1, 2, 3]; |
| auto c = replicate(b, 3); |
| |
| assert(c == [1, 2, 3, 1, 2, 3, 1, 2, 3]); |
| |
| auto d = replicate(b, 0); |
| |
| assert(d == []); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| import std.uni : isWhite; |
| assert("Learning,D,is,fun".split(",") == ["Learning", "D", "is", "fun"]); |
| assert("Learning D is fun".split!isWhite == ["Learning", "D", "is", "fun"]); |
| assert("Learning D is fun".split(" D ") == ["Learning", "is fun"]); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| string str = "Hello World!"; |
| assert(str.split == ["Hello", "World!"]); |
| |
| string str2 = "Hello\t\tWorld\t!"; |
| assert(str2.split == ["Hello", "World", "!"]); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| assert(split("hello world") == ["hello","world"]); |
| assert(split("192.168.0.1", ".") == ["192", "168", "0", "1"]); |
| |
| auto a = split([1, 2, 3, 4, 5, 1, 2, 3, 4, 5], [2, 3]); |
| assert(a == [[1], [4, 5, 1], [4, 5]]); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| assert(join(["hello", "silly", "world"], " ") == "hello silly world"); |
| assert(join(["hello", "silly", "world"]) == "hellosillyworld"); |
| |
| assert(join([[1, 2, 3], [4, 5]], [72, 73]) == [1, 2, 3, 72, 73, 4, 5]); |
| assert(join([[1, 2, 3], [4, 5]]) == [1, 2, 3, 4, 5]); |
| |
| const string[] arr = ["apple", "banana"]; |
| assert(arr.join(",") == "apple,banana"); |
| assert(arr.join() == "applebanana"); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| assert("Hello Wörld".replace("o Wö", "o Wo") == "Hello World"); |
| assert("Hello Wörld".replace("l", "h") == "Hehho Wörhd"); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| size_t changed = 0; |
| assert("Hello Wörld".replace("o Wö", "o Wo", changed) == "Hello World"); |
| assert(changed == 1); |
| |
| changed = 0; |
| assert("Hello Wörld".replace("l", "h", changed) == "Hehho Wörhd"); |
| import std.stdio : writeln; |
| writeln(changed); |
| assert(changed == 3); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| auto arr = [1, 2, 3, 4, 5]; |
| auto from = [2, 3]; |
| auto to = [4, 6]; |
| auto sink = appender!(int[])(); |
| |
| replaceInto(sink, arr, from, to); |
| |
| assert(sink.data == [1, 4, 6, 4, 5]); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| auto arr = [1, 2, 3, 4, 5]; |
| auto from = [2, 3]; |
| auto to = [4, 6]; |
| auto sink = appender!(int[])(); |
| |
| size_t changed = 0; |
| replaceInto(sink, arr, from, to, changed); |
| |
| assert(sink.data == [1, 4, 6, 4, 5]); |
| assert(changed == 1); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| auto a = [ 1, 2, 3, 4 ]; |
| auto b = a.replace(1, 3, [ 9, 9, 9 ]); |
| assert(a == [ 1, 2, 3, 4 ]); |
| assert(b == [ 1, 9, 9, 9, 4 ]); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| int[] a = [1, 4, 5]; |
| replaceInPlace(a, 1u, 2u, [2, 3, 4]); |
| assert(a == [1, 2, 3, 4, 5]); |
| replaceInPlace(a, 1u, 2u, cast(int[])[]); |
| assert(a == [1, 3, 4, 5]); |
| replaceInPlace(a, 1u, 3u, a[2 .. 4]); |
| assert(a == [1, 4, 5, 5]); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| auto a = [1, 2, 2, 3, 4, 5]; |
| auto b = a.replaceFirst([2], [1337]); |
| assert(b == [1, 1337, 2, 3, 4, 5]); |
| |
| auto s = "This is a foo foo list"; |
| auto r = s.replaceFirst("foo", "silly"); |
| assert(r == "This is a silly foo list"); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| auto a = [1, 2, 2, 3, 4, 5]; |
| auto b = a.replaceLast([2], [1337]); |
| assert(b == [1, 2, 1337, 3, 4, 5]); |
| |
| auto s = "This is a foo foo list"; |
| auto r = s.replaceLast("foo", "silly"); |
| assert(r == "This is a foo silly list", r); |
| } |
| |
| @safe unittest |
| { |
| import std.array; |
| |
| auto a = [1, 2, 3, 4, 5]; |
| auto b = replaceSlice(a, a[1 .. 4], [0, 0, 0]); |
| |
| assert(b == [1, 0, 0, 0, 5]); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| auto app = appender!string(); |
| string b = "abcdefg"; |
| foreach (char c; b) |
| app.put(c); |
| assert(app[] == "abcdefg"); |
| |
| int[] a = [ 1, 2 ]; |
| auto app2 = appender(a); |
| app2.put(3); |
| app2.put([ 4, 5, 6 ]); |
| assert(app2[] == [ 1, 2, 3, 4, 5, 6 ]); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| auto app = appender!string(); |
| string b = "abcdefg"; |
| foreach (char c; b) |
| app.put(c); |
| assert(app[] == "abcdefg"); |
| |
| int[] a = [ 1, 2 ]; |
| auto app2 = appender(a); |
| app2.put(3); |
| assert(app2.length == 3); |
| app2.put([ 4, 5, 6 ]); |
| assert(app2[] == [ 1, 2, 3, 4, 5, 6 ]); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| int[] a = [1, 2]; |
| auto app2 = appender(&a); |
| assert(app2[] == [1, 2]); |
| assert(a == [1, 2]); |
| app2 ~= 3; |
| assert(app2.length == 3); |
| app2 ~= [4, 5, 6]; |
| assert(app2[] == [1, 2, 3, 4, 5, 6]); |
| assert(a == [1, 2, 3, 4, 5, 6]); |
| |
| app2.reserve(5); |
| assert(app2.capacity >= 5); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| auto w = appender!string; |
| // pre-allocate space for at least 10 elements (this avoids costly reallocations) |
| w.reserve(10); |
| assert(w.capacity >= 10); |
| |
| w.put('a'); // single elements |
| w.put("bc"); // multiple elements |
| |
| // use the append syntax |
| w ~= 'd'; |
| w ~= "ef"; |
| |
| assert(w[] == "abcdef"); |
| } |
| |
| @safe pure nothrow unittest |
| { |
| import std.array; |
| |
| int[] a = [1, 2]; |
| auto app2 = appender(&a); |
| assert(app2[] == [1, 2]); |
| assert(a == [1, 2]); |
| app2 ~= 3; |
| app2 ~= [4, 5, 6]; |
| assert(app2[] == [1, 2, 3, 4, 5, 6]); |
| assert(a == [1, 2, 3, 4, 5, 6]); |
| |
| app2.reserve(5); |
| assert(app2.capacity >= 5); |
| } |
| |
| nothrow pure @safe @nogc unittest |
| { |
| import std.array; |
| |
| auto a = [0, 1].staticArray; |
| static assert(is(typeof(a) == int[2])); |
| assert(a == [0, 1]); |
| } |
| |
| nothrow pure @safe @nogc unittest |
| { |
| import std.array; |
| |
| auto b = [0, 1].staticArray!long; |
| static assert(is(typeof(b) == long[2])); |
| assert(b == [0, 1]); |
| } |
| |
| nothrow pure @safe @nogc unittest |
| { |
| import std.array; |
| |
| import std.range : iota; |
| |
| auto input = 3.iota; |
| auto a = input.staticArray!2; |
| static assert(is(typeof(a) == int[2])); |
| assert(a == [0, 1]); |
| auto b = input.staticArray!(long[4]); |
| static assert(is(typeof(b) == long[4])); |
| assert(b == [0, 1, 2, 0]); |
| } |
| |
| nothrow pure @safe @nogc unittest |
| { |
| import std.array; |
| |
| import std.range : iota; |
| |
| enum a = staticArray!(2.iota); |
| static assert(is(typeof(a) == int[2])); |
| assert(a == [0, 1]); |
| |
| enum b = staticArray!(long, 2.iota); |
| static assert(is(typeof(b) == long[2])); |
| assert(b == [0, 1]); |
| } |
| |