Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(961)

Side by Side Diff: base/tuple.h

Issue 1673563002: Replace base::Tuple implementation with std::tuple (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/bind_unittest.cc ('k') | ipc/ipc_message_utils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // A Tuple is a generic templatized container, similar in concept to std::pair 5 // A Tuple is a generic templatized container, similar in concept to std::pair
6 // and std::tuple. The convenient MakeTuple() function takes any number of 6 // and std::tuple. The convenient MakeTuple() function takes any number of
7 // arguments and will construct and return the appropriate Tuple object. The 7 // arguments and will construct and return the appropriate Tuple object. The
8 // functions DispatchToMethod and DispatchToFunction take a function pointer or 8 // functions DispatchToMethod and DispatchToFunction take a function pointer or
9 // instance and method pointer, and unpack a tuple into arguments to the call. 9 // instance and method pointer, and unpack a tuple into arguments to the call.
10 // 10 //
(...skipping 11 matching lines...) Expand all
22 // &SomeFunc, MakeTuple(10, "foo")); // SomeFunc(10, "foo") 22 // &SomeFunc, MakeTuple(10, "foo")); // SomeFunc(10, "foo")
23 // 23 //
24 // struct { void SomeMeth(int a, int b, int c) { } } foo; 24 // struct { void SomeMeth(int a, int b, int c) { } } foo;
25 // DispatchToMethod(&foo, &Foo::SomeMeth, MakeTuple(1, 2, 3)); 25 // DispatchToMethod(&foo, &Foo::SomeMeth, MakeTuple(1, 2, 3));
26 // // foo->SomeMeth(1, 2, 3); 26 // // foo->SomeMeth(1, 2, 3);
27 27
28 #ifndef BASE_TUPLE_H_ 28 #ifndef BASE_TUPLE_H_
29 #define BASE_TUPLE_H_ 29 #define BASE_TUPLE_H_
30 30
31 #include <stddef.h> 31 #include <stddef.h>
32 #include <tuple>
32 33
33 #include "base/bind_helpers.h" 34 #include "base/bind_helpers.h"
34 #include "build/build_config.h" 35 #include "build/build_config.h"
35 36
36 namespace base { 37 namespace base {
37 38
38 // Index sequences 39 // Index sequences
39 // 40 //
40 // Minimal clone of the similarly-named C++14 functionality. 41 // Minimal clone of the similarly-named C++14 functionality.
41 42
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 // function objects that need to take an arbitrary number of parameters; see 139 // function objects that need to take an arbitrary number of parameters; see
139 // RunnableMethod and IPC::MessageWithTuple. 140 // RunnableMethod and IPC::MessageWithTuple.
140 // 141 //
141 // Tuple<> is supplied to act as a 'void' type. It can be used, for example, 142 // Tuple<> is supplied to act as a 'void' type. It can be used, for example,
142 // when dispatching to a function that accepts no arguments (see the 143 // when dispatching to a function that accepts no arguments (see the
143 // Dispatchers below). 144 // Dispatchers below).
144 // Tuple<A> is rarely useful. One such use is when A is non-const ref that you 145 // Tuple<A> is rarely useful. One such use is when A is non-const ref that you
145 // want filled by the dispatchee, and the tuple is merely a container for that 146 // want filled by the dispatchee, and the tuple is merely a container for that
146 // output (a "tier"). See MakeRefTuple and its usages. 147 // output (a "tier"). See MakeRefTuple and its usages.
147 148
148 template <typename IxSeq, typename... Ts>
149 struct TupleBaseImpl;
150 template <typename... Ts> 149 template <typename... Ts>
151 using TupleBase = TupleBaseImpl<MakeIndexSequence<sizeof...(Ts)>, Ts...>; 150 using Tuple = std::tuple<Ts...>;
152 template <size_t N, typename T>
153 struct TupleLeaf;
154 151
155 template <typename... Ts> 152 using std::get;
156 struct Tuple final : TupleBase<Ts...> {
157 Tuple() : TupleBase<Ts...>() {}
158 explicit Tuple(typename TupleTraits<Ts>::ParamType... args)
159 : TupleBase<Ts...>(args...) {}
160 };
161
162 // Avoids ambiguity between Tuple's two constructors.
163 template <>
164 struct Tuple<> final {};
165
166 template <size_t... Ns, typename... Ts>
167 struct TupleBaseImpl<IndexSequence<Ns...>, Ts...> : TupleLeaf<Ns, Ts>... {
168 TupleBaseImpl() : TupleLeaf<Ns, Ts>()... {}
169 explicit TupleBaseImpl(typename TupleTraits<Ts>::ParamType... args)
170 : TupleLeaf<Ns, Ts>(args)... {}
171 };
172
173 template <size_t N, typename T>
174 struct TupleLeaf {
175 TupleLeaf() {}
176 explicit TupleLeaf(typename TupleTraits<T>::ParamType x) : x(x) {}
177
178 T& get() { return x; }
179 const T& get() const { return x; }
180
181 T x;
182 };
183
184 // Tuple getters --------------------------------------------------------------
185 //
186 // Allows accessing an arbitrary tuple element by index.
187 //
188 // Example usage:
189 // base::Tuple<int, double> t2;
190 // base::get<0>(t2) = 42;
191 // base::get<1>(t2) = 3.14;
192
193 template <size_t I, typename T>
194 T& get(TupleLeaf<I, T>& leaf) {
195 return leaf.get();
196 }
197
198 template <size_t I, typename T>
199 const T& get(const TupleLeaf<I, T>& leaf) {
200 return leaf.get();
201 }
202 153
203 // Tuple types ---------------------------------------------------------------- 154 // Tuple types ----------------------------------------------------------------
204 // 155 //
205 // Allows for selection of ValueTuple/RefTuple/ParamTuple without needing the 156 // Allows for selection of ValueTuple/RefTuple/ParamTuple without needing the
206 // definitions of class types the tuple takes as parameters. 157 // definitions of class types the tuple takes as parameters.
207 158
208 template <typename T> 159 template <typename T>
209 struct TupleTypes; 160 struct TupleTypes;
210 161
211 template <typename... Ts> 162 template <typename... Ts>
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 const Tuple<InTs...>& in, 248 const Tuple<InTs...>& in,
298 Tuple<OutTs...>* out) { 249 Tuple<OutTs...>* out) {
299 DispatchToMethodImpl(obj, method, in, out, 250 DispatchToMethodImpl(obj, method, in, out,
300 MakeIndexSequence<sizeof...(InTs)>(), 251 MakeIndexSequence<sizeof...(InTs)>(),
301 MakeIndexSequence<sizeof...(OutTs)>()); 252 MakeIndexSequence<sizeof...(OutTs)>());
302 } 253 }
303 254
304 } // namespace base 255 } // namespace base
305 256
306 #endif // BASE_TUPLE_H_ 257 #endif // BASE_TUPLE_H_
OLDNEW
« no previous file with comments | « base/bind_unittest.cc ('k') | ipc/ipc_message_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698