From a3434d83cf988f930a73aaca5ba88f6f6fa8f547 Mon Sep 17 00:00:00 2001 From: bungeman Date: Mon, 7 Sep 2015 12:45:52 -0700 Subject: Add skstd::unique_ptr and use it. TBR=bsalomon@google.com The one gpu include change is just to fix swap in implementation. Review URL: https://codereview.chromium.org/1330503006 --- tests/CPlusPlusEleven.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/CPlusPlusEleven.cpp b/tests/CPlusPlusEleven.cpp index 41821126ad..4f74b80225 100644 --- a/tests/CPlusPlusEleven.cpp +++ b/tests/CPlusPlusEleven.cpp @@ -5,10 +5,10 @@ * found in the LICENSE file. */ #include "Test.h" +#include "SkTemplates.h" +#include "SkFunction.h" namespace { -template T&& Move(T& o) { return static_cast(o); } - class Moveable { public: Moveable() {} @@ -18,9 +18,82 @@ private: Moveable(const Moveable&); Moveable& operator=(const Moveable&); }; +template void deleter(T*) { } +template struct Deleter { + void operator()(T* t) { delete static_cast(t); } +}; } // namespace DEF_TEST(CPlusPlusEleven_RvalueAndMove, r) { - Moveable src1; Moveable dst1(Move(src1)); - Moveable src2, dst2; dst2 = Move(src2); + Moveable src1; Moveable dst1(skstd::move(src1)); + Moveable src2, dst2; dst2 = skstd::move(src2); +} + +#define TOO_BIG "The unique_ptr was bigger than expected." +#define WEIRD_SIZE "The unique_ptr was a different size than expected." + +DEF_TEST(CPlusPlusEleven_UniquePtr, r) { + struct SmallUniquePtr { + Moveable* p; + }; + struct BigUniquePtr { + void(*d)(Moveable*); + Moveable* p; + }; + + static_assert(sizeof(skstd::unique_ptr) == sizeof(SmallUniquePtr), TOO_BIG); + static_assert(sizeof(skstd::unique_ptr) == sizeof(SmallUniquePtr), TOO_BIG); + + using proc = void(*)(Moveable*); + static_assert(sizeof(skstd::unique_ptr) == sizeof(BigUniquePtr), WEIRD_SIZE); + static_assert(sizeof(skstd::unique_ptr) == sizeof(BigUniquePtr), WEIRD_SIZE); + + { + skstd::unique_ptr u(nullptr, deleter); + static_assert(sizeof(u) == sizeof(BigUniquePtr), WEIRD_SIZE); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(BigUniquePtr), WEIRD_SIZE); + } + + { + skstd::unique_ptr u(nullptr, [](Moveable* m){ deleter(m); }); + static_assert(sizeof(u) == sizeof(BigUniquePtr), WEIRD_SIZE); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(BigUniquePtr), WEIRD_SIZE); + } + + { + auto d = [](Moveable* m){ deleter(m); }; + skstd::unique_ptr u(nullptr, d); + static_assert(sizeof(u) == sizeof(SmallUniquePtr), TOO_BIG); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(SmallUniquePtr), TOO_BIG); + } + + { + skstd::unique_ptr> u(nullptr, Deleter()); + static_assert(sizeof(u) == sizeof(SmallUniquePtr), TOO_BIG); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(SmallUniquePtr), TOO_BIG); + } + + { + skstd::unique_ptr> u(new Moveable(), Deleter()); + static_assert(sizeof(u) == sizeof(SmallUniquePtr), TOO_BIG); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(SmallUniquePtr), TOO_BIG); + } + + { + skstd::unique_ptr> u(new Moveable(), Deleter()); + static_assert(sizeof(u) == sizeof(SmallUniquePtr), TOO_BIG); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(SmallUniquePtr), TOO_BIG); + } } -- cgit v1.2.3