From 61ada695e306565796605f0e9b267248ceb7fabb Mon Sep 17 00:00:00 2001 From: monarchdodra Date: Sat, 10 May 2014 21:21:13 +0200 Subject: [PATCH 1/3] Remove gratuitous string mixins --- std/range.d | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/std/range.d b/std/range.d index b34d83849..5da4c8f5b 100644 --- a/std/range.d +++ b/std/range.d @@ -3755,30 +3755,28 @@ unittest import std.string : format; - foreach(range; TypeTuple!(`[1, 2, 3, 4, 5]`, - `"hello world"`, - `"hello world"w`, - `"hello world"d`, - `SliceStruct([1, 2, 3])`, + foreach(range; TypeTuple!([1, 2, 3, 4, 5], + "hello world", + "hello world"w, + "hello world"d, + SliceStruct([1, 2, 3]), //@@@BUG@@@ 8339 forces this to be takeExactly - //`InitStruct([1, 2, 3])`, - `TakeNoneStruct([1, 2, 3])`)) + //`InitStruct([1, 2, 3]), + TakeNoneStruct([1, 2, 3]))) { - mixin(format("enum a = takeNone(%s).empty;", range)); + enum a = takeNone(range).empty; assert(a, typeof(range).stringof); - mixin(format("assert(takeNone(%s).empty);", range)); - mixin(format("static assert(is(typeof(%s) == typeof(takeNone(%s))), typeof(%s).stringof);", - range, range, range)); + assert(takeNone(range).empty); + static assert(is(typeof(range) == typeof(takeNone(range))), typeof(range).stringof); } - foreach(range; TypeTuple!(`NormalStruct([1, 2, 3])`, - `InitStruct([1, 2, 3])`)) + foreach(range; TypeTuple!(NormalStruct([1, 2, 3]), + InitStruct([1, 2, 3]))) { - mixin(format("enum a = takeNone(%s).empty;", range)); + enum a = takeNone(range).empty; assert(a, typeof(range).stringof); - mixin(format("assert(takeNone(%s).empty);", range)); - mixin(format("static assert(is(typeof(takeExactly(%s, 0)) == typeof(takeNone(%s))), typeof(%s).stringof);", - range, range, range)); + assert(takeNone(range).empty); + static assert(is(typeof(takeExactly(range, 0)) == typeof(takeNone(range))), typeof(range).stringof); } //Don't work in CTFE. From c7dfd80e61d8f83f7766cd8546560c979025b569 Mon Sep 17 00:00:00 2001 From: monarchdodra Date: Sat, 10 May 2014 21:47:37 +0200 Subject: [PATCH 2/3] Use template mixin over string mixin --- std/range.d | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/std/range.d b/std/range.d index 5da4c8f5b..5edd9aad1 100644 --- a/std/range.d +++ b/std/range.d @@ -3685,20 +3685,24 @@ unittest unittest { - string genInput() + struct Dummy { - return "@property bool empty() { return _arr.empty; }" ~ - "@property auto front() { return _arr.front; }" ~ - "void popFront() { _arr.popFront(); }" ~ - "static assert(isInputRange!(typeof(this)));"; + mixin template genInput() + { + @property bool empty() { return _arr.empty; } + @property auto front() { return _arr.front; } + void popFront() { _arr.popFront(); } + static assert(isInputRange!(typeof(this))); + } } + alias genInput = Dummy.genInput; static struct NormalStruct { //Disabled to make sure that the takeExactly version is used. @disable this(); this(int[] arr) { _arr = arr; } - mixin(genInput()); + mixin genInput; int[] _arr; } @@ -3706,7 +3710,7 @@ unittest { @disable this(); this(int[] arr) { _arr = arr; } - mixin(genInput()); + mixin genInput; @property auto save() { return this; } auto opSlice(size_t i, size_t j) { return typeof(this)(_arr[i .. j]); } @property size_t length() { return _arr.length; } @@ -3715,7 +3719,7 @@ unittest static struct InitStruct { - mixin(genInput()); + mixin genInput; int[] _arr; } @@ -3723,7 +3727,7 @@ unittest { this(int[] arr) { _arr = arr; } @disable this(); - mixin(genInput()); + mixin genInput; auto takeNone() { return typeof(this)(null); } int[] _arr; } @@ -3731,14 +3735,14 @@ unittest static class NormalClass { this(int[] arr) {_arr = arr;} - mixin(genInput()); + mixin genInput; int[] _arr; } static class SliceClass { this(int[] arr) { _arr = arr; } - mixin(genInput()); + mixin genInput; @property auto save() { return new typeof(this)(_arr); } auto opSlice(size_t i, size_t j) { return new typeof(this)(_arr[i .. j]); } @property size_t length() { return _arr.length; } @@ -3748,7 +3752,7 @@ unittest static class TakeNoneClass { this(int[] arr) { _arr = arr; } - mixin(genInput()); + mixin genInput; auto takeNone() { return new typeof(this)(null); } int[] _arr; } From 510c1c5a0e31c7dd5c3114229122c53633816589 Mon Sep 17 00:00:00 2001 From: monarchdodra Date: Sat, 10 May 2014 21:56:03 +0200 Subject: [PATCH 3/3] Remove useless variable --- std/range.d | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/std/range.d b/std/range.d index 5edd9aad1..c91fadcb1 100644 --- a/std/range.d +++ b/std/range.d @@ -3768,8 +3768,7 @@ unittest //`InitStruct([1, 2, 3]), TakeNoneStruct([1, 2, 3]))) { - enum a = takeNone(range).empty; - assert(a, typeof(range).stringof); + static assert(takeNone(range).empty, typeof(range).stringof); assert(takeNone(range).empty); static assert(is(typeof(range) == typeof(takeNone(range))), typeof(range).stringof); } @@ -3777,8 +3776,7 @@ unittest foreach(range; TypeTuple!(NormalStruct([1, 2, 3]), InitStruct([1, 2, 3]))) { - enum a = takeNone(range).empty; - assert(a, typeof(range).stringof); + static assert(takeNone(range).empty, typeof(range).stringof); assert(takeNone(range).empty); static assert(is(typeof(takeExactly(range, 0)) == typeof(takeNone(range))), typeof(range).stringof); }