1*6777b538SAndroid Build Coastguard Worker // Copyright 2006-2008 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/tuple.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker namespace base {
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker namespace {
12*6777b538SAndroid Build Coastguard Worker
DoAdd(int a,int b,int c,int * res)13*6777b538SAndroid Build Coastguard Worker void DoAdd(int a, int b, int c, int* res) {
14*6777b538SAndroid Build Coastguard Worker *res = a + b + c;
15*6777b538SAndroid Build Coastguard Worker }
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker struct Addy {
18*6777b538SAndroid Build Coastguard Worker Addy() = default;
DoAddbase::__anon080dd7a80111::Addy19*6777b538SAndroid Build Coastguard Worker void DoAdd(int a, int b, int c, int d, int* res) {
20*6777b538SAndroid Build Coastguard Worker *res = a + b + c + d;
21*6777b538SAndroid Build Coastguard Worker }
22*6777b538SAndroid Build Coastguard Worker };
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Worker struct Addz {
25*6777b538SAndroid Build Coastguard Worker Addz() = default;
DoAddbase::__anon080dd7a80111::Addz26*6777b538SAndroid Build Coastguard Worker void DoAdd(int a, int b, int c, int d, int e, int* res) {
27*6777b538SAndroid Build Coastguard Worker *res = a + b + c + d + e;
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker };
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker } // namespace
32*6777b538SAndroid Build Coastguard Worker
TEST(TupleTest,Basic)33*6777b538SAndroid Build Coastguard Worker TEST(TupleTest, Basic) {
34*6777b538SAndroid Build Coastguard Worker std::tuple<int> t1(1);
35*6777b538SAndroid Build Coastguard Worker std::tuple<int, int, int, int*> t4(1, 2, 3, &std::get<0>(t1));
36*6777b538SAndroid Build Coastguard Worker std::tuple<int, int, int, int, int*> t5(1, 2, 3, 4, &std::get<0>(t4));
37*6777b538SAndroid Build Coastguard Worker std::tuple<int, int, int, int, int, int*> t6(1, 2, 3, 4, 5, &std::get<0>(t4));
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, std::get<0>(t1));
40*6777b538SAndroid Build Coastguard Worker DispatchToFunction(&DoAdd, t4);
41*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(6, std::get<0>(t1));
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker int res = 0;
44*6777b538SAndroid Build Coastguard Worker DispatchToFunction(&DoAdd, std::make_tuple(9, 8, 7, &res));
45*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(24, res);
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker Addy addy;
48*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, std::get<0>(t4));
49*6777b538SAndroid Build Coastguard Worker DispatchToMethod(&addy, &Addy::DoAdd, t5);
50*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(10, std::get<0>(t4));
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker Addz addz;
53*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(10, std::get<0>(t4));
54*6777b538SAndroid Build Coastguard Worker DispatchToMethod(&addz, &Addz::DoAdd, t6);
55*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(15, std::get<0>(t4));
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker namespace {
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard Worker struct CopyLogger {
CopyLoggerbase::__anon080dd7a80211::CopyLogger61*6777b538SAndroid Build Coastguard Worker CopyLogger() { ++TimesConstructed; }
CopyLoggerbase::__anon080dd7a80211::CopyLogger62*6777b538SAndroid Build Coastguard Worker CopyLogger(const CopyLogger& tocopy) { ++TimesConstructed; ++TimesCopied; }
63*6777b538SAndroid Build Coastguard Worker ~CopyLogger() = default;
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker static int TimesCopied;
66*6777b538SAndroid Build Coastguard Worker static int TimesConstructed;
67*6777b538SAndroid Build Coastguard Worker };
68*6777b538SAndroid Build Coastguard Worker
SomeLoggerMethRef(const CopyLogger & logy,const CopyLogger * ptr,bool * b)69*6777b538SAndroid Build Coastguard Worker void SomeLoggerMethRef(const CopyLogger& logy, const CopyLogger* ptr, bool* b) {
70*6777b538SAndroid Build Coastguard Worker *b = &logy == ptr;
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker
SomeLoggerMethCopy(CopyLogger logy,const CopyLogger * ptr,bool * b)73*6777b538SAndroid Build Coastguard Worker void SomeLoggerMethCopy(CopyLogger logy, const CopyLogger* ptr, bool* b) {
74*6777b538SAndroid Build Coastguard Worker *b = &logy == ptr;
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker int CopyLogger::TimesCopied = 0;
78*6777b538SAndroid Build Coastguard Worker int CopyLogger::TimesConstructed = 0;
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker } // namespace
81*6777b538SAndroid Build Coastguard Worker
TEST(TupleTest,Copying)82*6777b538SAndroid Build Coastguard Worker TEST(TupleTest, Copying) {
83*6777b538SAndroid Build Coastguard Worker CopyLogger logger;
84*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, CopyLogger::TimesCopied);
85*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, CopyLogger::TimesConstructed);
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker bool res = false;
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard Worker // Creating the tuple should copy the class to store internally in the tuple.
90*6777b538SAndroid Build Coastguard Worker std::tuple<CopyLogger, CopyLogger*, bool*> tuple(logger, &logger, &res);
91*6777b538SAndroid Build Coastguard Worker std::get<CopyLogger*>(tuple) = &std::get<CopyLogger>(tuple);
92*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, CopyLogger::TimesConstructed);
93*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, CopyLogger::TimesCopied);
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker // Our internal Logger and the one passed to the function should be the same.
96*6777b538SAndroid Build Coastguard Worker res = false;
97*6777b538SAndroid Build Coastguard Worker DispatchToFunction(&SomeLoggerMethRef, tuple);
98*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(res);
99*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, CopyLogger::TimesConstructed);
100*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, CopyLogger::TimesCopied);
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker // Now they should be different, since the function call will make a copy.
103*6777b538SAndroid Build Coastguard Worker res = false;
104*6777b538SAndroid Build Coastguard Worker DispatchToFunction(&SomeLoggerMethCopy, tuple);
105*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(res);
106*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, CopyLogger::TimesConstructed);
107*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, CopyLogger::TimesCopied);
108*6777b538SAndroid Build Coastguard Worker }
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker } // namespace base
111