@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]); }