std.typecons.Tuple.rename
- multiple declarations
Function Tuple.rename
Renames the elements of a Tuple
.
inout ref auto rename(names...)()
if (names .length == 0 || allSatisfy!(isSomeString, typeof(names)));
rename
uses the passed names
and returns a new
Tuple
using these names, with the content
unchanged.
If fewer names are passed than there are members
of the Tuple
then those trailing members are unchanged.
An empty string will remove the name for that member.
It is an compile-time error to pass more names than
there are members of the Tuple
.
Example
auto t0 = tuple(4, "hello");
auto t0Named = t0 .rename!("val", "tag");
writeln(t0Named .val); // 4
writeln(t0Named .tag); // "hello"
Tuple!(float, "dat", size_t[2], "pos") t1;
t1 .pos = [2, 1];
auto t1Named = t1 .rename!"height";
t1Named .height = 3.4f;
writeln(t1Named .height); // 3.4f
writeln(t1Named .pos); // [2, 1]
t1Named .rename!"altitude" .altitude = 5;
writeln(t1Named .height); // 5
Tuple!(int, "a", int, int, "c") t2;
t2 = tuple(3,4,5);
auto t2Named = t2 .rename!("", "b");
// "a" no longer has a name
static assert(!hasMember!(typeof(t2Named), "a"));
writeln(t2Named[0]); // 3
writeln(t2Named .b); // 4
writeln(t2Named .c); // 5
// not allowed to specify more names than the tuple has members
static assert(!__traits(compiles, t2 .rename!("a","b","c","d")));
// use it in a range pipeline
import std .range : iota, zip;
import std .algorithm .iteration : map, sum;
auto res = zip(iota(1, 4), iota(10, 13))
.map!(t => t .rename!("a", "b"))
.map!(t => t .a * t .b)
.sum;
writeln(res); // 68
const tup = Tuple!(int, "a", int, "b")(2, 3);
const renamed = tup .rename!("c", "d");
writeln(renamed .c + renamed .d); // 5
Function Tuple.rename
Overload of rename
that takes an associative array
translate
as a template parameter, where the keys are
either the names or indices of the members to be changed
and the new names are the corresponding values.
Every key in translate
must be the name of a member of the
tuple
.
The same rules for empty strings apply as for the variadic
template overload of rename
.
inout ref auto rename(alias translate)()
if (is(typeof(translate) : V[K], V, K) && isSomeString!V && (isSomeString!K || is(K : size_t)));
Example
//replacing names by their current name
Tuple!(float, "dat", size_t[2], "pos") t1;
t1 .pos = [2, 1];
auto t1Named = t1 .rename!(["dat": "height"]);
t1Named .height = 3.4;
writeln(t1Named .pos); // [2, 1]
t1Named .rename!(["height": "altitude"]) .altitude = 5;
writeln(t1Named .height); // 5
Tuple!(int, "a", int, "b") t2;
t2 = tuple(3, 4);
auto t2Named = t2 .rename!(["a": "b", "b": "c"]);
writeln(t2Named .b); // 3
writeln(t2Named .c); // 4
const t3 = Tuple!(int, "a", int, "b")(3, 4);
const t3Named = t3 .rename!(["a": "b", "b": "c"]);
writeln(t3Named .b); // 3
writeln(t3Named .c); // 4
Example
//replace names by their position
Tuple!(float, "dat", size_t[2], "pos") t1;
t1 .pos = [2, 1];
auto t1Named = t1 .rename!([0: "height"]);
t1Named .height = 3.4;
writeln(t1Named .pos); // [2, 1]
t1Named .rename!([0: "altitude"]) .altitude = 5;
writeln(t1Named .height); // 5
Tuple!(int, "a", int, "b", int, "c") t2;
t2 = tuple(3, 4, 5);
auto t2Named = t2 .rename!([0: "c", 2: "a"]);
writeln(t2Named .a); // 5
writeln(t2Named .b); // 4
writeln(t2Named .c); // 3
Authors
Andrei Alexandrescu, Bartosz Milewski, Don Clugston, Shin Fujishiro, Kenji Hara