| Index: include/private/SkTemplates.h
|
| diff --git a/include/private/SkTemplates.h b/include/private/SkTemplates.h
|
| index 023bba379c170092eb027e4b07accd7e9807fa7e..533cb264d163ee7354f1e53de7bac4a2de36cd61 100644
|
| --- a/include/private/SkTemplates.h
|
| +++ b/include/private/SkTemplates.h
|
| @@ -10,9 +10,11 @@
|
| #ifndef SkTemplates_DEFINED
|
| #define SkTemplates_DEFINED
|
|
|
| -#include "../private/SkTLogic.h"
|
| #include "SkMath.h"
|
| +#include "SkTLogic.h"
|
| #include "SkTypes.h"
|
| +#include "SkUniquePtr.h"
|
| +#include "SkUtility.h"
|
| #include <limits.h>
|
| #include <new>
|
|
|
| @@ -28,25 +30,6 @@
|
| */
|
| template<typename T> inline void sk_ignore_unused_variable(const T&) { }
|
|
|
| -namespace skstd {
|
| -
|
| -template <typename T> inline remove_reference_t<T>&& move(T&& t) {
|
| - return static_cast<remove_reference_t<T>&&>(t);
|
| -}
|
| -
|
| -template <typename T> inline T&& forward(remove_reference_t<T>& t) /*noexcept*/ {
|
| - return static_cast<T&&>(t);
|
| -}
|
| -template <typename T> inline T&& forward(remove_reference_t<T>&& t) /*noexcept*/ {
|
| - static_assert(!is_lvalue_reference<T>::value,
|
| - "Forwarding an rvalue reference as an lvalue reference is not allowed.");
|
| - return static_cast<T&&>(t);
|
| -}
|
| -
|
| -template <typename T> add_rvalue_reference_t<T> declval();
|
| -
|
| -} // namespace skstd
|
| -
|
| /**
|
| * Returns a pointer to a D which comes immediately after S[count].
|
| */
|
| @@ -63,6 +46,10 @@ template <typename D, typename S> static D* SkTAddOffset(S* ptr, size_t byteOffs
|
| return reinterpret_cast<D*>(reinterpret_cast<sknonstd::same_cv_t<char, D>*>(ptr) + byteOffset);
|
| }
|
|
|
| +template <typename R, typename T, R (*P)(T*)> struct SkFunctionWrapper {
|
| + R operator()(T* t) { return P(t); }
|
| +};
|
| +
|
| /** \class SkAutoTCallVProc
|
|
|
| Call a function when this goes out of scope. The template uses two
|
| @@ -71,25 +58,13 @@ template <typename D, typename S> static D* SkTAddOffset(S* ptr, size_t byteOffs
|
| reference is null when the destructor is called, we do not call the
|
| function.
|
| */
|
| -template <typename T, void (*P)(T*)> class SkAutoTCallVProc : SkNoncopyable {
|
| +template <typename T, void (*P)(T*)> class SkAutoTCallVProc
|
| + : public skstd::unique_ptr<T, SkFunctionWrapper<void, T, P>> {
|
| public:
|
| - SkAutoTCallVProc(T* obj): fObj(obj) {}
|
| - ~SkAutoTCallVProc() { if (fObj) P(fObj); }
|
| + SkAutoTCallVProc(T* obj): skstd::unique_ptr<T, SkFunctionWrapper<void, T, P>>(obj) {}
|
|
|
| - operator T*() const { return fObj; }
|
| - T* operator->() const { SkASSERT(fObj); return fObj; }
|
| -
|
| - T* detach() { T* obj = fObj; fObj = NULL; return obj; }
|
| - void reset(T* obj = NULL) {
|
| - if (fObj != obj) {
|
| - if (fObj) {
|
| - P(fObj);
|
| - }
|
| - fObj = obj;
|
| - }
|
| - }
|
| -private:
|
| - T* fObj;
|
| + operator T*() const { return this->get(); }
|
| + T* detach() { return this->release(); }
|
| };
|
|
|
| /** \class SkAutoTCallIProc
|
| @@ -100,17 +75,13 @@ If detach() is called, the object reference is set to null. If the object
|
| reference is null when the destructor is called, we do not call the
|
| function.
|
| */
|
| -template <typename T, int (*P)(T*)> class SkAutoTCallIProc : SkNoncopyable {
|
| +template <typename T, int (*P)(T*)> class SkAutoTCallIProc
|
| + : public skstd::unique_ptr<T, SkFunctionWrapper<int, T, P>> {
|
| public:
|
| - SkAutoTCallIProc(T* obj): fObj(obj) {}
|
| - ~SkAutoTCallIProc() { if (fObj) P(fObj); }
|
| -
|
| - operator T*() const { return fObj; }
|
| - T* operator->() const { SkASSERT(fObj); return fObj; }
|
| + SkAutoTCallIProc(T* obj): skstd::unique_ptr<T, SkFunctionWrapper<int, T, P>>(obj) {}
|
|
|
| - T* detach() { T* obj = fObj; fObj = NULL; return obj; }
|
| -private:
|
| - T* fObj;
|
| + operator T*() const { return this->get(); }
|
| + T* detach() { return this->release(); }
|
| };
|
|
|
| /** \class SkAutoTDelete
|
| @@ -123,89 +94,21 @@ private:
|
|
|
| The size of a SkAutoTDelete is small: sizeof(SkAutoTDelete<T>) == sizeof(T*)
|
| */
|
| -template <typename T> class SkAutoTDelete : SkNoncopyable {
|
| -public:
|
| - SkAutoTDelete(T* obj = NULL) : fObj(obj) {}
|
| - ~SkAutoTDelete() { delete fObj; }
|
| -
|
| - T* get() const { return fObj; }
|
| - operator T*() const { return fObj; }
|
| - T& operator*() const { SkASSERT(fObj); return *fObj; }
|
| - T* operator->() const { SkASSERT(fObj); return fObj; }
|
| -
|
| - void reset(T* obj) {
|
| - if (fObj != obj) {
|
| - delete fObj;
|
| - fObj = obj;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Delete the owned object, setting the internal pointer to NULL.
|
| - */
|
| - void free() {
|
| - delete fObj;
|
| - fObj = NULL;
|
| - }
|
| -
|
| - /**
|
| - * Transfer ownership of the object to the caller, setting the internal
|
| - * pointer to NULL. Note that this differs from get(), which also returns
|
| - * the pointer, but it does not transfer ownership.
|
| - */
|
| - T* detach() {
|
| - T* obj = fObj;
|
| - fObj = NULL;
|
| - return obj;
|
| - }
|
| -
|
| - void swap(SkAutoTDelete* that) {
|
| - SkTSwap(fObj, that->fObj);
|
| - }
|
| -
|
| -private:
|
| - T* fObj;
|
| -};
|
| -
|
| -// Calls ~T() in the destructor.
|
| -template <typename T> class SkAutoTDestroy : SkNoncopyable {
|
| +template <typename T> class SkAutoTDelete : public skstd::unique_ptr<T> {
|
| public:
|
| - SkAutoTDestroy(T* obj = NULL) : fObj(obj) {}
|
| - ~SkAutoTDestroy() {
|
| - if (fObj) {
|
| - fObj->~T();
|
| - }
|
| - }
|
| -
|
| - T* get() const { return fObj; }
|
| - T& operator*() const { SkASSERT(fObj); return *fObj; }
|
| - T* operator->() const { SkASSERT(fObj); return fObj; }
|
| + SkAutoTDelete(T* obj = NULL) : skstd::unique_ptr<T>(obj) {}
|
|
|
| -private:
|
| - T* fObj;
|
| + operator T*() const { return this->get(); }
|
| + void free() { this->reset(nullptr); }
|
| + T* detach() { return this->release(); }
|
| };
|
|
|
| -template <typename T> class SkAutoTDeleteArray : SkNoncopyable {
|
| +template <typename T> class SkAutoTDeleteArray : public skstd::unique_ptr<T[]> {
|
| public:
|
| - SkAutoTDeleteArray(T array[]) : fArray(array) {}
|
| - ~SkAutoTDeleteArray() { delete[] fArray; }
|
| -
|
| - T* get() const { return fArray; }
|
| - void free() {
|
| - delete[] fArray;
|
| - fArray = NULL;
|
| - }
|
| - T* detach() { T* array = fArray; fArray = NULL; return array; }
|
| -
|
| - void reset(T array[]) {
|
| - if (fArray != array) {
|
| - delete[] fArray;
|
| - fArray = array;
|
| - }
|
| - }
|
| + SkAutoTDeleteArray(T array[]) : skstd::unique_ptr<T[]>(array) {}
|
|
|
| -private:
|
| - T* fArray;
|
| + void free() { this->reset(nullptr); }
|
| + T* detach() { return this->release(); }
|
| };
|
|
|
| /** Allocate an array of T elements, and free the array in the destructor
|
|
|