blob: 815b43bb1b3236b10cc5a142b4d5ef1e264d84b1 [file] [log] [blame]
[email protected]302bdc132008-08-25 13:42:071// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/tuple.h"
[email protected]40350b12010-03-30 17:29:276
7#include "base/compiler_specific.h"
[email protected]302bdc132008-08-25 13:42:078#include "testing/gtest/include/gtest/gtest.h"
9
brettwd5ca2bc2015-05-29 22:15:4710namespace base {
11
[email protected]302bdc132008-08-25 13:42:0712namespace {
13
14void DoAdd(int a, int b, int c, int* res) {
15 *res = a + b + c;
16}
17
18struct Addy {
19 Addy() { }
20 void DoAdd(int a, int b, int c, int d, int* res) {
21 *res = a + b + c + d;
22 }
23};
24
[email protected]8a2820a2008-10-09 21:58:0525struct Addz {
26 Addz() { }
27 void DoAdd(int a, int b, int c, int d, int e, int* res) {
28 *res = a + b + c + d + e;
29 }
30};
31
[email protected]302bdc132008-08-25 13:42:0732} // namespace
33
34TEST(TupleTest, Basic) {
tzik1068f1be2016-06-03 07:25:2035 std::tuple<> t0 = std::make_tuple();
pkasting99867ef2014-10-16 23:49:2436 ALLOW_UNUSED_LOCAL(t0);
tzik1068f1be2016-06-03 07:25:2037 std::tuple<int> t1(1);
38 std::tuple<int, const char*> t2 =
39 std::make_tuple(1, static_cast<const char*>("wee"));
40 ALLOW_UNUSED_LOCAL(t2);
41 std::tuple<int, int, int> t3(1, 2, 3);
42 std::tuple<int, int, int, int*> t4(1, 2, 3, &std::get<0>(t1));
43 std::tuple<int, int, int, int, int*> t5(1, 2, 3, 4, &std::get<0>(t4));
44 std::tuple<int, int, int, int, int, int*> t6(1, 2, 3, 4, 5, &std::get<0>(t4));
[email protected]302bdc132008-08-25 13:42:0745
tzik1068f1be2016-06-03 07:25:2046 EXPECT_EQ(1, std::get<0>(t1));
[email protected]302bdc132008-08-25 13:42:0747 DispatchToFunction(&DoAdd, t4);
tzik1068f1be2016-06-03 07:25:2048 EXPECT_EQ(6, std::get<0>(t1));
[email protected]302bdc132008-08-25 13:42:0749
50 int res = 0;
tzik1068f1be2016-06-03 07:25:2051 DispatchToFunction(&DoAdd, std::make_tuple(9, 8, 7, &res));
[email protected]302bdc132008-08-25 13:42:0752 EXPECT_EQ(24, res);
53
54 Addy addy;
tzik1068f1be2016-06-03 07:25:2055 EXPECT_EQ(1, std::get<0>(t4));
[email protected]302bdc132008-08-25 13:42:0756 DispatchToMethod(&addy, &Addy::DoAdd, t5);
tzik1068f1be2016-06-03 07:25:2057 EXPECT_EQ(10, std::get<0>(t4));
[email protected]8a2820a2008-10-09 21:58:0558
59 Addz addz;
tzik1068f1be2016-06-03 07:25:2060 EXPECT_EQ(10, std::get<0>(t4));
[email protected]8a2820a2008-10-09 21:58:0561 DispatchToMethod(&addz, &Addz::DoAdd, t6);
tzik1068f1be2016-06-03 07:25:2062 EXPECT_EQ(15, std::get<0>(t4));
[email protected]302bdc132008-08-25 13:42:0763}
64
65namespace {
66
67struct CopyLogger {
68 CopyLogger() { ++TimesConstructed; }
69 CopyLogger(const CopyLogger& tocopy) { ++TimesConstructed; ++TimesCopied; }
70 ~CopyLogger() { }
71
72 static int TimesCopied;
73 static int TimesConstructed;
74};
75
76void SomeLoggerMethRef(const CopyLogger& logy, const CopyLogger* ptr, bool* b) {
77 *b = &logy == ptr;
78}
79
80void SomeLoggerMethCopy(CopyLogger logy, const CopyLogger* ptr, bool* b) {
81 *b = &logy == ptr;
82}
83
84int CopyLogger::TimesCopied = 0;
85int CopyLogger::TimesConstructed = 0;
86
87} // namespace
88
89TEST(TupleTest, Copying) {
90 CopyLogger logger;
91 EXPECT_EQ(0, CopyLogger::TimesCopied);
92 EXPECT_EQ(1, CopyLogger::TimesConstructed);
93
94 bool res = false;
95
96 // Creating the tuple should copy the class to store internally in the tuple.
tzik1068f1be2016-06-03 07:25:2097 std::tuple<CopyLogger, CopyLogger*, bool*> tuple(logger, &logger, &res);
98 std::get<1>(tuple) = &std::get<0>(tuple);
[email protected]302bdc132008-08-25 13:42:0799 EXPECT_EQ(2, CopyLogger::TimesConstructed);
100 EXPECT_EQ(1, CopyLogger::TimesCopied);
101
102 // Our internal Logger and the one passed to the function should be the same.
103 res = false;
104 DispatchToFunction(&SomeLoggerMethRef, tuple);
105 EXPECT_TRUE(res);
106 EXPECT_EQ(2, CopyLogger::TimesConstructed);
107 EXPECT_EQ(1, CopyLogger::TimesCopied);
108
109 // Now they should be different, since the function call will make a copy.
110 res = false;
111 DispatchToFunction(&SomeLoggerMethCopy, tuple);
112 EXPECT_FALSE(res);
113 EXPECT_EQ(3, CopyLogger::TimesConstructed);
114 EXPECT_EQ(2, CopyLogger::TimesCopied);
115}
brettwd5ca2bc2015-05-29 22:15:47116
117} // namespace base