Skip to content

Commit a9b2a91

Browse files
Used better references for NamedTuple
1 parent ec6ab3b commit a9b2a91

File tree

1 file changed

+28
-22
lines changed

1 file changed

+28
-22
lines changed

include/rfl/NamedTuple.hpp

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -85,27 +85,29 @@ class NamedTuple {
8585
/// Move constructor.
8686
template <class... OtherFieldTypes>
8787
NamedTuple(NamedTuple<OtherFieldTypes...>&& _other)
88-
: NamedTuple(retrieve_fields(_other.fields(), seq_)) {}
88+
: NamedTuple(retrieve_fields(
89+
std::forward<NamedTuple<OtherFieldTypes...>>(_other).fields(),
90+
seq_)) {}
8991

9092
~NamedTuple() = default;
9193

9294
/// Returns a new named tuple with additional fields.
9395
template <internal::StringLiteral _name, class FType, class... Tail>
94-
auto add(Field<_name, FType>&& _head, Tail&&... _tail) {
96+
auto add(Field<_name, FType>&& _head, Tail&&... _tail) && {
9597
using Head = Field<_name, FType>;
9698
if constexpr (sizeof...(Tail) > 0) {
9799
return NamedTuple<FieldTypes..., std::remove_cvref_t<Head>>(
98-
make_fields(seq_, std::forward<Head>(_head)))
100+
std::move(*this).make_fields(seq_, std::forward<Head>(_head)))
99101
.add(std::forward<Tail>(_tail)...);
100102
} else {
101103
return NamedTuple<FieldTypes..., std::remove_cvref_t<Head>>(
102-
make_fields(seq_, std::forward<Head>(_head)));
104+
std::move(*this).make_fields(seq_, std::forward<Head>(_head)));
103105
}
104106
}
105107

106108
/// Returns a new named tuple with additional fields.
107109
template <internal::StringLiteral _name, class FType, class... Tail>
108-
auto add(Field<_name, FType> _head, const Tail&... _tail) const {
110+
auto add(Field<_name, FType> _head, const Tail&... _tail) const& {
109111
using Head = Field<_name, FType>;
110112
if constexpr (sizeof...(Tail) > 0) {
111113
return NamedTuple<FieldTypes..., std::remove_cvref_t<Head>>(
@@ -120,19 +122,21 @@ class NamedTuple {
120122
/// Template specialization for rfl::Tuple, so we can pass fields from other
121123
/// named tuples.
122124
template <class... TupContent, class... Tail>
123-
auto add(rfl::Tuple<TupContent...>&& _tuple, Tail&&... _tail) {
125+
auto add(rfl::Tuple<TupContent...>&& _tuple, Tail&&... _tail) && {
124126
if constexpr (sizeof...(Tail) > 0) {
125-
return add_tuple(std::forward<rfl::Tuple<TupContent...>>(_tuple))
127+
return std::move(*this)
128+
.add_tuple(std::forward<rfl::Tuple<TupContent...>>(_tuple))
126129
.add(std::forward<Tail>(_tail)...);
127130
} else {
128-
return add_tuple(std::forward<rfl::Tuple<TupContent...>>(_tuple));
131+
return std::move(*this).add_tuple(
132+
std::forward<rfl::Tuple<TupContent...>>(_tuple));
129133
}
130134
}
131135

132136
/// Template specialization for rfl::Tuple, so we can pass fields from other
133137
/// named tuples.
134138
template <class... TupContent, class... Tail>
135-
auto add(rfl::Tuple<TupContent...> _tuple, const Tail&... _tail) const {
139+
auto add(rfl::Tuple<TupContent...> _tuple, const Tail&... _tail) const& {
136140
if constexpr (sizeof...(Tail) > 0) {
137141
return add_tuple(std::move(_tuple)).add(_tail...);
138142
} else {
@@ -143,15 +147,18 @@ class NamedTuple {
143147
/// Template specialization for NamedTuple, so we can pass fields from other
144148
/// named tuples.
145149
template <class... TupContent, class... Tail>
146-
auto add(NamedTuple<TupContent...>&& _named_tuple, Tail&&... _tail) {
147-
return add(std::forward<rfl::Tuple<TupContent...>>(_named_tuple.fields()),
148-
std::forward<Tail>(_tail)...);
150+
auto add(NamedTuple<TupContent...>&& _named_tuple, Tail&&... _tail) && {
151+
return std::move(*this).add(
152+
std::forward<rfl::Tuple<TupContent...>>(
153+
std::forward<NamedTuple<TupContent...>>(_named_tuple).fields()),
154+
std::forward<Tail>(_tail)...);
149155
}
150156

151157
/// Template specialization for NamedTuple, so we can pass fields from other
152158
/// named tuples.
153159
template <class... TupContent, class... Tail>
154-
auto add(NamedTuple<TupContent...> _named_tuple, const Tail&... _tail) const {
160+
auto add(NamedTuple<TupContent...> _named_tuple,
161+
const Tail&... _tail) const& {
155162
return add(_named_tuple.fields(), _tail...);
156163
}
157164

@@ -193,10 +200,10 @@ class NamedTuple {
193200
}
194201

195202
/// Returns a tuple containing the fields.
196-
Fields fields() { return make_fields(seq_); }
203+
Fields fields() && { return std::move(*this).make_fields(seq_); }
197204

198205
/// Returns a tuple containing the fields.
199-
Fields fields() const { return make_fields(seq_); }
206+
Fields fields() const& { return make_fields(seq_); }
200207

201208
/// Gets a field by index.
202209
template <int _index>
@@ -383,17 +390,17 @@ class NamedTuple {
383390
/// Adds the elements of a tuple to a newly created named tuple,
384391
/// and other elements to a newly created named tuple.
385392
template <class... TupContent>
386-
constexpr auto add_tuple(rfl::Tuple<TupContent...>&& _tuple) {
393+
constexpr auto add_tuple(rfl::Tuple<TupContent...>&& _tuple) && {
387394
const auto a = [this](auto&&... _fields) {
388-
return this->add(std::forward<TupContent>(_fields)...);
395+
return std::move(*this).add(std::forward<TupContent>(_fields)...);
389396
};
390397
return rfl::apply(a, std::forward<rfl::Tuple<TupContent...>>(_tuple));
391398
}
392399

393400
/// Adds the elements of a tuple to a newly created named tuple,
394401
/// and other elements to a newly created named tuple.
395402
template <class... TupContent>
396-
constexpr auto add_tuple(rfl::Tuple<TupContent...>&& _tuple) const {
403+
constexpr auto add_tuple(rfl::Tuple<TupContent...>&& _tuple) const& {
397404
const auto a = [this](auto&&... _fields) {
398405
return this->add(std::forward<TupContent>(_fields)...);
399406
};
@@ -435,11 +442,10 @@ class NamedTuple {
435442
/// Generates the fields.
436443
template <int... _is, class... AdditionalArgs>
437444
auto make_fields(std::integer_sequence<int, _is...>,
438-
AdditionalArgs&&... _args) {
445+
AdditionalArgs&&... _args) && {
439446
const auto wrap = [this]<int _i>(Index<_i>) {
440447
using FieldType = internal::nth_element_t<_i, FieldTypes...>;
441-
using T = std::remove_cvref_t<typename FieldType::Type>;
442-
return FieldType(std::forward<T>(rfl::get<_i>(values_)));
448+
return FieldType(std::move(rfl::get<_i>(values_)));
443449
};
444450
return rfl::make_tuple(wrap(Index<_is>{})...,
445451
std::forward<AdditionalArgs>(_args)...);
@@ -448,7 +454,7 @@ class NamedTuple {
448454
/// Generates the fields.
449455
template <int... _is, class... AdditionalArgs>
450456
auto make_fields(std::integer_sequence<int, _is...>,
451-
AdditionalArgs... _args) const {
457+
AdditionalArgs... _args) const& {
452458
const auto wrap = [this]<int _i>(Index<_i>) {
453459
using FieldType = internal::nth_element_t<_i, FieldTypes...>;
454460
return FieldType(rfl::get<_i>(values_));

0 commit comments

Comments
 (0)