Skip to content

Commit f36d333

Browse files
Abseil Teamcopybara-github
authored andcommitted
Make mutable CompressedTuple::get() constexpr.
This change makes the mutable overloads of CompressedTuple::get() constexpr. This is consistent with std::get(std::tuple), which is constexpr since C++14. PiperOrigin-RevId: 648603141 Change-Id: Icbd61809f7a06723cf581dbed5488b7bae998cc9
1 parent 1278ee9 commit f36d333

File tree

2 files changed

+45
-9
lines changed

2 files changed

+45
-9
lines changed

absl/container/internal/compressed_tuple.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ struct Storage {
8989
explicit constexpr Storage(absl::in_place_t, V&& v)
9090
: value(std::forward<V>(v)) {}
9191
constexpr const T& get() const& { return value; }
92-
T& get() & { return value; }
92+
constexpr T& get() & { return value; }
9393
constexpr const T&& get() const&& { return std::move(*this).value; }
94-
T&& get() && { return std::move(*this).value; }
94+
constexpr T&& get() && { return std::move(*this).value; }
9595
};
9696

9797
template <typename T, size_t I>
@@ -102,9 +102,9 @@ struct ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC Storage<T, I, true> : T {
102102
explicit constexpr Storage(absl::in_place_t, V&& v) : T(std::forward<V>(v)) {}
103103

104104
constexpr const T& get() const& { return *this; }
105-
T& get() & { return *this; }
105+
constexpr T& get() & { return *this; }
106106
constexpr const T&& get() const&& { return std::move(*this); }
107-
T&& get() && { return std::move(*this); }
107+
constexpr T&& get() && { return std::move(*this); }
108108
};
109109

110110
template <typename D, typename I, bool ShouldAnyUseBase>
@@ -237,7 +237,7 @@ class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple
237237
std::forward<Vs>(base)...) {}
238238

239239
template <int I>
240-
ElemT<I>& get() & {
240+
constexpr ElemT<I>& get() & {
241241
return StorageT<I>::get();
242242
}
243243

@@ -247,7 +247,7 @@ class ABSL_INTERNAL_COMPRESSED_TUPLE_DECLSPEC CompressedTuple
247247
}
248248

249249
template <int I>
250-
ElemT<I>&& get() && {
250+
constexpr ElemT<I>&& get() && {
251251
return std::move(*this).StorageT<I>::get();
252252
}
253253

absl/container/internal/compressed_tuple_test.cc

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,22 @@
3131

3232
// These are declared at global scope purely so that error messages
3333
// are smaller and easier to understand.
34-
enum class CallType { kConstRef, kConstMove };
34+
enum class CallType { kMutableRef, kConstRef, kMutableMove, kConstMove };
3535

3636
template <int>
3737
struct Empty {
38+
constexpr CallType value() & { return CallType::kMutableRef; }
3839
constexpr CallType value() const& { return CallType::kConstRef; }
40+
constexpr CallType value() && { return CallType::kMutableMove; }
3941
constexpr CallType value() const&& { return CallType::kConstMove; }
4042
};
4143

44+
// Unconditionally return an lvalue reference to `t`.
45+
template <typename T>
46+
constexpr T& AsLValue(T&& t) {
47+
return t;
48+
}
49+
4250
template <typename T>
4351
struct NotEmpty {
4452
T value;
@@ -375,8 +383,24 @@ TEST(CompressedTupleTest, Constexpr) {
375383
constexpr int value() const { return v; }
376384
int v;
377385
};
378-
constexpr CompressedTuple<int, double, CompressedTuple<int>, Empty<0>> x(
379-
7, 1.25, CompressedTuple<int>(5), {});
386+
387+
using Tuple = CompressedTuple<int, double, CompressedTuple<int>, Empty<0>>;
388+
389+
constexpr int r0 =
390+
AsLValue(Tuple(1, 0.75, CompressedTuple<int>(9), {})).get<0>();
391+
constexpr double r1 =
392+
AsLValue(Tuple(1, 0.75, CompressedTuple<int>(9), {})).get<1>();
393+
constexpr int r2 =
394+
AsLValue(Tuple(1, 0.75, CompressedTuple<int>(9), {})).get<2>().get<0>();
395+
constexpr CallType r3 =
396+
AsLValue(Tuple(1, 0.75, CompressedTuple<int>(9), {})).get<3>().value();
397+
398+
EXPECT_EQ(r0, 1);
399+
EXPECT_EQ(r1, 0.75);
400+
EXPECT_EQ(r2, 9);
401+
EXPECT_EQ(r3, CallType::kMutableRef);
402+
403+
constexpr Tuple x(7, 1.25, CompressedTuple<int>(5), {});
380404
constexpr int x0 = x.get<0>();
381405
constexpr double x1 = x.get<1>();
382406
constexpr int x2 = x.get<2>().get<0>();
@@ -387,6 +411,18 @@ TEST(CompressedTupleTest, Constexpr) {
387411
EXPECT_EQ(x2, 5);
388412
EXPECT_EQ(x3, CallType::kConstRef);
389413

414+
constexpr int m0 = Tuple(5, 0.25, CompressedTuple<int>(3), {}).get<0>();
415+
constexpr double m1 = Tuple(5, 0.25, CompressedTuple<int>(3), {}).get<1>();
416+
constexpr int m2 =
417+
Tuple(5, 0.25, CompressedTuple<int>(3), {}).get<2>().get<0>();
418+
constexpr CallType m3 =
419+
Tuple(5, 0.25, CompressedTuple<int>(3), {}).get<3>().value();
420+
421+
EXPECT_EQ(m0, 5);
422+
EXPECT_EQ(m1, 0.25);
423+
EXPECT_EQ(m2, 3);
424+
EXPECT_EQ(m3, CallType::kMutableMove);
425+
390426
constexpr CompressedTuple<Empty<0>, TrivialStruct, int> trivial = {};
391427
constexpr CallType trivial0 = trivial.get<0>().value();
392428
constexpr int trivial1 = trivial.get<1>().value();

0 commit comments

Comments
 (0)