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

Side by Side Diff: src/core/SkFunction.h

Issue 1052663004: Implicit constructors for SkFunction are much more readable. (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Created 5 years, 8 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 | « no previous file | tests/FunctionTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkFunction_DEFINED 8 #ifndef SkFunction_DEFINED
9 #define SkFunction_DEFINED 9 #define SkFunction_DEFINED
10 10
11 // TODO: document 11 // TODO: document
12 12
13 #include "SkTypes.h" 13 #include "SkTypes.h"
14 #include "SkTLogic.h" 14 #include "SkTLogic.h"
15 15
16 template <typename> class SkFunction; 16 template <typename> class SkFunction;
17 17
18 template <typename R, typename... Args> 18 template <typename R, typename... Args>
19 class SkFunction<R(Args...)> : SkNoncopyable { 19 class SkFunction<R(Args...)> : SkNoncopyable {
20 public: 20 public:
21 explicit SkFunction(R (*fn)(Args...)) : fVTable(GetFunctionPointerVTable()) { 21 SkFunction(R (*fn)(Args...)) : fVTable(GetFunctionPointerVTable()) {
22 // We've been passed a function pointer. We'll just store it. 22 // We've been passed a function pointer. We'll just store it.
23 fFunction = reinterpret_cast<void*>(fn); 23 fFunction = reinterpret_cast<void*>(fn);
24 } 24 }
25 25
26 template <typename Fn> 26 template <typename Fn>
27 explicit SkFunction(Fn fn, SK_WHEN_C((sizeof(Fn) > sizeof(void*)), void*) = nullptr) 27 SkFunction(Fn fn, SK_WHEN_C((sizeof(Fn) > sizeof(void*)), void*) = nullptr)
28 : fVTable(GetOutlineVTable<Fn>()) { 28 : fVTable(GetOutlineVTable<Fn>()) {
29 // We've got a functor larger than a pointer. We've go to copy it onto the heap. 29 // We've got a functor larger than a pointer. We've go to copy it onto the heap.
30 fFunction = SkNEW_ARGS(Fn, (Forward(fn))); 30 fFunction = SkNEW_ARGS(Fn, (Forward(fn)));
31 } 31 }
32 32
33 template <typename Fn> 33 template <typename Fn>
34 explicit SkFunction(Fn fn, SK_WHEN_C((sizeof(Fn) <= sizeof(void*)), void*) = nullptr) 34 SkFunction(Fn fn, SK_WHEN_C((sizeof(Fn) <= sizeof(void*)), void*) = nullptr)
35 : fVTable(GetInlineVTable<Fn>()) { 35 : fVTable(GetInlineVTable<Fn>()) {
36 // We've got a functor that fits in a pointer. We copy it right inline. 36 // We've got a functor that fits in a pointer. We copy it right inline.
37 fFunction = NULL; // Quiets a (spurious) warning that fFunction might b e uninitialized. 37 fFunction = NULL; // Quiets a (spurious) warning that fFunction might b e uninitialized.
38 SkNEW_PLACEMENT_ARGS(&fFunction, Fn, (Forward(fn))); 38 SkNEW_PLACEMENT_ARGS(&fFunction, Fn, (Forward(fn)));
39 } 39 }
40 40
41 ~SkFunction() { fVTable.fCleanUp(fFunction); } 41 ~SkFunction() { fVTable.fCleanUp(fFunction); }
42 42
43 R operator()(Args... args) { return fVTable.fCall(fFunction, Forward(args).. .); } 43 R operator()(Args... args) { return fVTable.fCall(fFunction, Forward(args).. .); }
44 44
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 return vtable; 89 return vtable;
90 } 90 }
91 91
92 92
93 void* fFunction; // A function pointer, a pointer to a functor, or an inlined functor. 93 void* fFunction; // A function pointer, a pointer to a functor, or an inlined functor.
94 const VTable& fVTable; // How to call, delete (and one day copy, move) fFun ction. 94 const VTable& fVTable; // How to call, delete (and one day copy, move) fFun ction.
95 }; 95 };
96 96
97 // TODO: 97 // TODO:
98 // - is it worth moving fCall out of the VTable into SkFunction itself to avoi d the indirection? 98 // - is it worth moving fCall out of the VTable into SkFunction itself to avoi d the indirection?
99 // - should constructors be implicit?
100 // - make SkFunction copyable 99 // - make SkFunction copyable
101 100
102 #endif//SkFunction_DEFINED 101 #endif//SkFunction_DEFINED
OLDNEW
« no previous file with comments | « no previous file | tests/FunctionTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698