OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #ifndef SkTemplatesPriv_DEFINED | 10 #ifndef SkTemplatesPriv_DEFINED |
11 #define SkTemplatesPriv_DEFINED | 11 #define SkTemplatesPriv_DEFINED |
12 | 12 |
13 #include "SkTemplates.h" | 13 #include "SkTemplates.h" |
14 | 14 |
15 //////////////////////////////////////////////////////////////////////////////// | 15 //////////////////////////////////////////////////////////////////////////////// |
16 | 16 |
17 #ifdef SK_BUILD_FOR_WIN32 | 17 #ifdef SK_BUILD_FOR_WIN32 |
18 #define SK_PLACEMENT_NEW(result, classname, storage, storageSize) \ | 18 #define SK_PLACEMENT_NEW(result, classname, storage, storageSize) \ |
19 result = SkNEW(classname) | 19 result = SkNEW(classname) |
20 | 20 |
21 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storageSize, args)
\ | 21 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storageSize, args)
\ |
22 result = SkNEW_ARGS(classname, args) | 22 result = SkNEW_ARGS(classname, args) |
| 23 |
| 24 #define SK_PLACEMENT_SAFE_NEW(result, classname, storage, storageSize) \ |
| 25 result = SkNEW(classname) |
| 26 |
| 27 #define SK_PLACEMENT_SAFE_NEW_ARGS(result, classname, storage, storageSize,
args) \ |
| 28 result = SkNEW_ARGS(classname, args) |
23 #else | 29 #else |
24 #include <new> | 30 #include <new> |
25 #define SK_PLACEMENT_NEW(result, classname, storage, storagesize) \ | 31 #define SK_PLACEMENT_NEW(result, classname, storage, storagesize) \ |
26 do { \ | 32 do { \ |
27 if (storagesize) \ | 33 if (storagesize) \ |
28 { \ | 34 { \ |
29 SkASSERT(storageSize >= sizeof(classname)); \ | 35 SkASSERT(storageSize >= sizeof(classname)); \ |
30 result = new(storage) classname; \ | 36 result = new(storage) classname; \ |
31 } \ | 37 } \ |
32 else \ | 38 else \ |
33 result = SkNEW(classname); \ | 39 result = SkNEW(classname); \ |
34 } while (0) | 40 } while (0) |
35 | 41 |
36 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storagesize, args)
\ | 42 #define SK_PLACEMENT_NEW_ARGS(result, classname, storage, storagesize, args)
\ |
37 do {
\ | 43 do {
\ |
38 if (storagesize)
\ | 44 if (storagesize)
\ |
39 {
\ | 45 {
\ |
40 SkASSERT(storageSize >= sizeof(classname));
\ | 46 SkASSERT(storageSize >= sizeof(classname));
\ |
41 result = new(storage) classname args;
\ | 47 result = new(storage) classname args;
\ |
42 }
\ | 48 }
\ |
43 else
\ | 49 else
\ |
44 result = SkNEW_ARGS(classname, args);
\ | 50 result = SkNEW_ARGS(classname, args);
\ |
45 } while (0) | 51 } while (0) |
| 52 |
| 53 #define SK_PLACEMENT_SAFE_NEW(result, classname, storage, storagesize) \ |
| 54 do { \ |
| 55 if (storagesize >= sizeof(classname)) \ |
| 56 result = new(storage) classname; \ |
| 57 else \ |
| 58 result = SkNEW(classname); \ |
| 59 } while (0) |
| 60 |
| 61 #define SK_PLACEMENT_SAFE_NEW_ARGS(result, classname, storage, storagesize,
args) \ |
| 62 do {
\ |
| 63 if (storagesize >= sizeof(classname))
\ |
| 64 result = new(storage) classname args;
\ |
| 65 else
\ |
| 66 result = SkNEW_ARGS(classname, args);
\ |
| 67 } while (0) |
46 #endif | 68 #endif |
47 | 69 |
48 //////////////////////////////////////////////////////////////////////////////// | 70 //////////////////////////////////////////////////////////////////////////////// |
49 | 71 |
50 template <class T> class SkAutoTPlacementDelete { | 72 template <class T> class SkAutoTPlacementDelete { |
51 public: | 73 public: |
52 SkAutoTPlacementDelete(T* obj, void* storage) : fObj(obj), fStorage(storage) | 74 SkAutoTPlacementDelete(T* obj, void* storage) : fObj(obj), fStorage(storage) |
53 { | 75 { |
54 } | 76 } |
55 ~SkAutoTPlacementDelete() | 77 ~SkAutoTPlacementDelete() |
(...skipping 11 matching lines...) Expand all Loading... |
67 T* obj = fObj; | 89 T* obj = fObj; |
68 fObj = NULL; | 90 fObj = NULL; |
69 return obj; | 91 return obj; |
70 } | 92 } |
71 private: | 93 private: |
72 T* fObj; | 94 T* fObj; |
73 void* fStorage; | 95 void* fStorage; |
74 }; | 96 }; |
75 | 97 |
76 #endif | 98 #endif |
OLD | NEW |