diff options
Diffstat (limited to 'libphobos/src/std/conv.d')
-rw-r--r-- | libphobos/src/std/conv.d | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/libphobos/src/std/conv.d b/libphobos/src/std/conv.d index 98df7fd1ccf..a10f4da7f9c 100644 --- a/libphobos/src/std/conv.d +++ b/libphobos/src/std/conv.d @@ -50,9 +50,9 @@ module std.conv; public import std.ascii : LetterCase; import std.meta; -import std.range.primitives; +import std.range; import std.traits; -import std.typecons : Flag, Yes, No, tuple; +import std.typecons : Flag, Yes, No, tuple, isTuple; // Same as std.string.format, but "self-importing". // Helps reduce code and imports, particularly in static asserts. @@ -653,6 +653,32 @@ if (isImplicitlyConvertible!(S, T) && }} } +// https://issues.dlang.org/show_bug.cgi?id=13551 +private T toImpl(T, S)(S value) +if (isTuple!T) +{ + T t; + static foreach (i; 0 .. T.length) + { + t[i] = value[i].to!(typeof(T[i])); + } + return t; +} + +@safe unittest +{ + import std.typecons : Tuple; + + auto test = ["10", "20", "30"]; + assert(test.to!(Tuple!(int, int, int)) == Tuple!(int, int, int)(10, 20, 30)); + + auto test1 = [1, 2]; + assert(test1.to!(Tuple!(int, int)) == Tuple!(int, int)(1, 2)); + + auto test2 = [1.0, 2.0, 3.0]; + assert(test2.to!(Tuple!(int, int, int)) == Tuple!(int, int, int)(1, 2, 3)); +} + /* Converting static arrays forwards to their dynamic counterparts. */ @@ -1970,7 +1996,7 @@ if (isInputRange!S && isSomeChar!(ElementEncodingType!S) && /// ditto private T toImpl(T, S)(S value, uint radix) -if (isInputRange!S && !isInfinite!S && isSomeChar!(ElementEncodingType!S) && +if (isSomeFiniteCharInputRange!S && isIntegral!T && is(typeof(parse!T(value, radix)))) { scope(success) |