15 #include "absl/types/any.h"
18 #if !defined(ABSL_USES_STD_ANY)
20 #include <initializer_list>
21 #include <type_traits>
25 #include "gtest/gtest.h"
26 #include "absl/base/config.h"
27 #include "absl/base/internal/exception_testing.h"
28 #include "absl/base/internal/raw_logging.h"
29 #include "absl/container/internal/test_instance_tracker.h"
36 const T& AsConst(
const T& t) {
43 MoveOnly(MoveOnly&&) =
default;
44 MoveOnly& operator=(MoveOnly&&) =
default;
52 CopyOnly(CopyOnly&&) =
delete;
53 CopyOnly& operator=(CopyOnly&&) =
delete;
54 CopyOnly(
const CopyOnly&) =
default;
55 CopyOnly& operator=(
const CopyOnly&) =
default;
60 struct MoveOnlyWithListConstructor {
61 MoveOnlyWithListConstructor() =
default;
62 explicit MoveOnlyWithListConstructor(std::initializer_list<int> ,
65 MoveOnlyWithListConstructor(MoveOnlyWithListConstructor&&) =
default;
66 MoveOnlyWithListConstructor& operator=(MoveOnlyWithListConstructor&&) =
72 struct IntMoveOnlyCopyOnly {
73 IntMoveOnlyCopyOnly(
int value, MoveOnly , CopyOnly )
79 struct ListMoveOnlyCopyOnly {
80 ListMoveOnlyCopyOnly(std::initializer_list<int> ilist, MoveOnly ,
87 using FunctionType = void();
88 void FunctionToEmplace() {}
90 using ArrayType =
int[2];
93 TEST(AnyTest, Noexcept) {
94 static_assert(std::is_nothrow_default_constructible<absl::any>(),
"");
95 static_assert(std::is_nothrow_move_constructible<absl::any>(),
"");
96 static_assert(std::is_nothrow_move_assignable<absl::any>(),
"");
97 static_assert(noexcept(std::declval<absl::any&>().has_value()),
"");
98 static_assert(noexcept(std::declval<absl::any&>().
type()),
"");
99 static_assert(noexcept(absl::any_cast<int>(std::declval<absl::any*>())),
"");
101 noexcept(std::declval<absl::any&>().
swap(std::declval<absl::any&>())),
106 noexcept(
swap(std::declval<absl::any&>(), std::declval<absl::any&>())),
110 TEST(AnyTest, HasValue) {
124 o.emplace<
float>(5.f);
130 TEST(AnyTest, EmptyPointerCast) {
144 EXPECT_EQ(
nullptr, absl::any_cast<int>(&AsConst(
o)));
146 EXPECT_NE(
nullptr, absl::any_cast<int>(&AsConst(
o)));
148 EXPECT_EQ(
nullptr, absl::any_cast<int>(&AsConst(
o)));
152 TEST(AnyTest, InPlaceConstruction) {
153 const CopyOnly copy_only{};
156 IntMoveOnlyCopyOnly&
v = absl::any_cast<IntMoveOnlyCopyOnly&>(
o);
160 TEST(AnyTest, InPlaceConstructionVariableTemplate) {
161 const CopyOnly copy_only{};
162 absl::any o(absl::in_place_type<IntMoveOnlyCopyOnly>, 5, MoveOnly(),
164 auto&
v = absl::any_cast<IntMoveOnlyCopyOnly&>(
o);
168 TEST(AnyTest, InPlaceConstructionWithCV) {
169 const CopyOnly copy_only{};
171 MoveOnly(), copy_only);
172 IntMoveOnlyCopyOnly&
v = absl::any_cast<IntMoveOnlyCopyOnly&>(
o);
176 TEST(AnyTest, InPlaceConstructionWithCVVariableTemplate) {
177 const CopyOnly copy_only{};
178 absl::any o(absl::in_place_type<const volatile IntMoveOnlyCopyOnly>, 5,
179 MoveOnly(), copy_only);
180 auto&
v = absl::any_cast<IntMoveOnlyCopyOnly&>(
o);
184 TEST(AnyTest, InPlaceConstructionWithFunction) {
186 FunctionType*& construction_result = absl::any_cast<FunctionType*&>(
o);
187 EXPECT_EQ(&FunctionToEmplace, construction_result);
190 TEST(AnyTest, InPlaceConstructionWithFunctionVariableTemplate) {
191 absl::any o(absl::in_place_type<FunctionType>, FunctionToEmplace);
192 auto& construction_result = absl::any_cast<FunctionType*&>(
o);
193 EXPECT_EQ(&FunctionToEmplace, construction_result);
196 TEST(AnyTest, InPlaceConstructionWithArray) {
197 ArrayType ar = {5, 42};
199 DecayedArray& construction_result = absl::any_cast<DecayedArray&>(
o);
203 TEST(AnyTest, InPlaceConstructionWithArrayVariableTemplate) {
204 ArrayType ar = {5, 42};
205 absl::any o(absl::in_place_type<ArrayType>, ar);
206 auto& construction_result = absl::any_cast<DecayedArray&>(
o);
210 TEST(AnyTest, InPlaceConstructionIlist) {
211 const CopyOnly copy_only{};
213 MoveOnly(), copy_only);
214 ListMoveOnlyCopyOnly&
v = absl::any_cast<ListMoveOnlyCopyOnly&>(
o);
215 std::vector<int> expected_values = {1, 2, 3, 4};
219 TEST(AnyTest, InPlaceConstructionIlistVariableTemplate) {
220 const CopyOnly copy_only{};
221 absl::any o(absl::in_place_type<ListMoveOnlyCopyOnly>, {1, 2, 3, 4},
222 MoveOnly(), copy_only);
223 auto&
v = absl::any_cast<ListMoveOnlyCopyOnly&>(
o);
224 std::vector<int> expected_values = {1, 2, 3, 4};
228 TEST(AnyTest, InPlaceConstructionIlistWithCV) {
229 const CopyOnly copy_only{};
231 {1, 2, 3, 4}, MoveOnly(), copy_only);
232 ListMoveOnlyCopyOnly&
v = absl::any_cast<ListMoveOnlyCopyOnly&>(
o);
233 std::vector<int> expected_values = {1, 2, 3, 4};
237 TEST(AnyTest, InPlaceConstructionIlistWithCVVariableTemplate) {
238 const CopyOnly copy_only{};
239 absl::any o(absl::in_place_type<const volatile ListMoveOnlyCopyOnly>,
240 {1, 2, 3, 4}, MoveOnly(), copy_only);
241 auto&
v = absl::any_cast<ListMoveOnlyCopyOnly&>(
o);
242 std::vector<int> expected_values = {1, 2, 3, 4};
246 TEST(AnyTest, InPlaceNoArgs) {
251 TEST(AnyTest, InPlaceNoArgsVariableTemplate) {
256 template <
typename Enabler,
typename T,
typename...
Args>
259 template <
typename T,
typename...
Args>
260 struct CanEmplaceAnyImpl<
262 std::declval<absl::any&>().emplace<T>(std::declval<Args>()...))>,
265 template <
typename T,
typename...
Args>
266 using CanEmplaceAny = CanEmplaceAnyImpl<void,
T,
Args...>;
268 TEST(AnyTest, Emplace) {
269 const CopyOnly copy_only{};
271 EXPECT_TRUE((std::is_same<decltype(
o.emplace<IntMoveOnlyCopyOnly>(
272 5, MoveOnly(), copy_only)),
273 IntMoveOnlyCopyOnly&>::
value));
274 IntMoveOnlyCopyOnly& emplace_result =
275 o.emplace<IntMoveOnlyCopyOnly>(5, MoveOnly(), copy_only);
277 IntMoveOnlyCopyOnly&
v = absl::any_cast<IntMoveOnlyCopyOnly&>(
o);
285 TEST(AnyTest, EmplaceWithCV) {
286 const CopyOnly copy_only{};
289 (std::is_same<decltype(
o.emplace<
const volatile IntMoveOnlyCopyOnly>(
290 5, MoveOnly(), copy_only)),
291 IntMoveOnlyCopyOnly&>::
value));
292 IntMoveOnlyCopyOnly& emplace_result =
293 o.emplace<
const volatile IntMoveOnlyCopyOnly>(5, MoveOnly(), copy_only);
295 IntMoveOnlyCopyOnly&
v = absl::any_cast<IntMoveOnlyCopyOnly&>(
o);
300 TEST(AnyTest, EmplaceWithFunction) {
303 (std::is_same<decltype(
o.emplace<FunctionType>(FunctionToEmplace)),
304 FunctionType*&>::
value));
305 FunctionType*& emplace_result =
o.emplace<FunctionType>(FunctionToEmplace);
306 EXPECT_EQ(&FunctionToEmplace, emplace_result);
309 TEST(AnyTest, EmplaceWithArray) {
311 ArrayType ar = {5, 42};
313 (std::is_same<decltype(
o.emplace<ArrayType>(ar)), DecayedArray&>::
value));
314 DecayedArray& emplace_result =
o.emplace<ArrayType>(ar);
318 TEST(AnyTest, EmplaceIlist) {
319 const CopyOnly copy_only{};
321 EXPECT_TRUE((std::is_same<decltype(
o.emplace<ListMoveOnlyCopyOnly>(
322 {1, 2, 3, 4}, MoveOnly(), copy_only)),
323 ListMoveOnlyCopyOnly&>::
value));
324 ListMoveOnlyCopyOnly& emplace_result =
325 o.emplace<ListMoveOnlyCopyOnly>({1, 2, 3, 4}, MoveOnly(), copy_only);
326 ListMoveOnlyCopyOnly&
v = absl::any_cast<ListMoveOnlyCopyOnly&>(
o);
328 std::vector<int> expected_values = {1, 2, 3, 4};
331 static_assert(!CanEmplaceAny<
int, std::initializer_list<int>>::
value,
"");
332 static_assert(!CanEmplaceAny<MoveOnlyWithListConstructor,
333 std::initializer_list<int>,
int>::
value,
337 TEST(AnyTest, EmplaceIlistWithCV) {
338 const CopyOnly copy_only{};
341 (std::is_same<decltype(
o.emplace<
const volatile ListMoveOnlyCopyOnly>(
342 {1, 2, 3, 4}, MoveOnly(), copy_only)),
343 ListMoveOnlyCopyOnly&>::
value));
344 ListMoveOnlyCopyOnly& emplace_result =
345 o.emplace<
const volatile ListMoveOnlyCopyOnly>({1, 2, 3, 4}, MoveOnly(),
347 ListMoveOnlyCopyOnly&
v = absl::any_cast<ListMoveOnlyCopyOnly&>(
o);
349 std::vector<int> expected_values = {1, 2, 3, 4};
353 TEST(AnyTest, EmplaceNoArgs) {
359 TEST(AnyTest, ConversionConstruction) {
366 const CopyOnly copy_only(5);
374 TEST(AnyTest, ConversionAssignment) {
382 const CopyOnly copy_only(5);
395 #pragma warning( push )
396 #pragma warning( disable : 4521)
402 struct WeirdConstructor42 {
406 WeirdConstructor42(
const WeirdConstructor42& other) :
value(other.
value) {}
410 WeirdConstructor42& )
416 #pragma warning( pop )
419 TEST(AnyTest, WeirdConversionConstruction) {
421 const WeirdConstructor42 source(5);
427 WeirdConstructor42 source(5);
433 TEST(AnyTest, WeirdConversionAssignment) {
435 const WeirdConstructor42 source(5);
442 WeirdConstructor42 source(5);
451 TEST(AnyTest, AnyCastValue) {
456 EXPECT_EQ(5, absl::any_cast<int>(AsConst(
o)));
458 std::is_same<decltype(absl::any_cast<Value>(
o)),
Value>::
value,
"");
465 EXPECT_EQ(5, absl::any_cast<const int>(AsConst(
o)));
466 static_assert(std::is_same<decltype(absl::any_cast<const Value>(
o)),
472 TEST(AnyTest, AnyCastReference) {
477 EXPECT_EQ(5, absl::any_cast<const int&>(AsConst(
o)));
479 std::is_same<decltype(absl::any_cast<Value&>(
o)),
Value&>::
value,
"");
486 EXPECT_EQ(5, absl::any_cast<const int>(AsConst(
o)));
487 static_assert(std::is_same<decltype(absl::any_cast<const Value&>(
o)),
496 static_assert(std::is_same<decltype(absl::any_cast<Value&&>(
std::move(
o))),
506 std::is_same<decltype(absl::any_cast<const Value&&>(
std::move(
o))),
512 TEST(AnyTest, AnyCastPointer) {
518 o.emplace<
char>(
'a');
521 std::is_same<decltype(absl::any_cast<Value>(&
o)),
Value*>::
value,
"");
526 EXPECT_EQ(
nullptr, absl::any_cast<const char>(&
o));
528 EXPECT_EQ(
nullptr, absl::any_cast<const char>(&
o));
529 o.emplace<
char>(
'a');
530 EXPECT_EQ(
'a', *absl::any_cast<const char>(&
o));
531 static_assert(std::is_same<decltype(absl::any_cast<const Value>(&
o)),
537 TEST(AnyTest, MakeAny) {
538 const CopyOnly copy_only{};
539 auto o = absl::make_any<IntMoveOnlyCopyOnly>(5, MoveOnly(), copy_only);
544 TEST(AnyTest, MakeAnyIList) {
545 const CopyOnly copy_only{};
547 absl::make_any<ListMoveOnlyCopyOnly>({1, 2, 3}, MoveOnly(), copy_only);
549 ListMoveOnlyCopyOnly&
v = absl::any_cast<ListMoveOnlyCopyOnly&>(
o);
550 std::vector<int> expected_values = {1, 2, 3};
556 InstanceTracker tracker_raii;
559 absl::any o(absl::in_place_type<CopyableOnlyInstance>, 123);
560 CopyableOnlyInstance*
f1 = absl::any_cast<CopyableOnlyInstance>(&
o);
563 const CopyableOnlyInstance*
f2 = absl::any_cast<CopyableOnlyInstance>(&o2);
569 const CopyableOnlyInstance*
f3 = absl::any_cast<CopyableOnlyInstance>(&o3);
586 TEST(AnyTest, Move) {
587 InstanceTracker tracker_raii;
590 any1.
emplace<CopyableOnlyInstance>(5);
594 EXPECT_EQ(5, absl::any_cast<CopyableOnlyInstance&>(any1).
value());
595 EXPECT_EQ(5, absl::any_cast<CopyableOnlyInstance&>(any2).
value());
600 EXPECT_EQ(5, absl::any_cast<CopyableOnlyInstance&>(any3).
value());
605 EXPECT_EQ(5, absl::any_cast<CopyableOnlyInstance&>(any4).
value());
633 TEST(AnyTest, ConversionConstructionCausesOneCopy) {
634 InstanceTracker tracker_raii;
635 CopyableOnlyInstance
counter(5);
645 #if defined(ABSL_USES_STD_ANY)
648 #define ABSL_ANY_TEST_EXPECT_BAD_ANY_CAST(...) \
649 ABSL_BASE_INTERNAL_EXPECT_FAIL((__VA_ARGS__), absl::bad_any_cast, \
655 #define ABSL_ANY_TEST_EXPECT_BAD_ANY_CAST(...) \
656 ABSL_BASE_INTERNAL_EXPECT_FAIL((__VA_ARGS__), absl::bad_any_cast, \
659 #endif // defined(ABSL_USES_STD_ANY)
661 TEST(AnyTest, ThrowBadAlloc) {
685 absl::any_cast<const float&&>(
absl::any{}));
701 BadCopyable() =
default;
702 BadCopyable(BadCopyable&&) =
default;
703 BadCopyable(
const BadCopyable&) {
704 #ifdef ABSL_HAVE_EXCEPTIONS
712 #define ABSL_ANY_TEST_EXPECT_BAD_COPY(...) \
713 ABSL_BASE_INTERNAL_EXPECT_FAIL((__VA_ARGS__), BadCopy, "Bad copy")
716 TEST(AnyTest, FailedCopy) {
718 const BadCopyable
bad{};
723 absl::any src(absl::in_place_type<BadCopyable>);
741 absl::any src(absl::in_place_type<BadCopyable>);
748 absl::any src(absl::in_place_type<BadCopyable>);
756 TEST(AnyTest, FailedEmplace) {
766 TEST(AnyTest, DISABLED_FailedEmplaceInPlace) {
768 TEST(AnyTest, FailedEmplaceInPlace) {
778 #endif // #if !defined(ABSL_USES_STD_ANY)