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