diff options
author | bungeman <bungeman@google.com> | 2015-09-07 12:45:52 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-07 12:45:52 -0700 |
commit | a3434d83cf988f930a73aaca5ba88f6f6fa8f547 (patch) | |
tree | bdde2f531a8643d4936cdd402ebd4218393e6e5d /tests | |
parent | 2d126b5c45e65a67a9945afa9294038a8eb3f2c8 (diff) |
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
Diffstat (limited to 'tests')
-rw-r--r-- | tests/CPlusPlusEleven.cpp | 81 |
1 files changed, 77 insertions, 4 deletions
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 <class T> T&& Move(T& o) { return static_cast<T&&>(o); } - class Moveable { public: Moveable() {} @@ -18,9 +18,82 @@ private: Moveable(const Moveable&); Moveable& operator=(const Moveable&); }; +template <typename T> void deleter(T*) { } +template <typename T> struct Deleter { + void operator()(T* t) { delete static_cast<const Moveable*>(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<Moveable>) == sizeof(SmallUniquePtr), TOO_BIG); + static_assert(sizeof(skstd::unique_ptr<Moveable[]>) == sizeof(SmallUniquePtr), TOO_BIG); + + using proc = void(*)(Moveable*); + static_assert(sizeof(skstd::unique_ptr<Moveable, proc>) == sizeof(BigUniquePtr), WEIRD_SIZE); + static_assert(sizeof(skstd::unique_ptr<Moveable[], proc>) == sizeof(BigUniquePtr), WEIRD_SIZE); + + { + skstd::unique_ptr<Moveable, void(*)(Moveable*)> u(nullptr, deleter<Moveable>); + static_assert(sizeof(u) == sizeof(BigUniquePtr), WEIRD_SIZE); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(BigUniquePtr), WEIRD_SIZE); + } + + { + skstd::unique_ptr<Moveable, void(*)(Moveable*)> 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<Moveable, decltype(d)> 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<Moveable, Deleter<Moveable>> u(nullptr, Deleter<Moveable>()); + static_assert(sizeof(u) == sizeof(SmallUniquePtr), TOO_BIG); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(SmallUniquePtr), TOO_BIG); + } + + { + skstd::unique_ptr<Moveable, Deleter<Moveable>> u(new Moveable(), Deleter<Moveable>()); + static_assert(sizeof(u) == sizeof(SmallUniquePtr), TOO_BIG); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(SmallUniquePtr), TOO_BIG); + } + + { + skstd::unique_ptr<const void, Deleter<const void>> u(new Moveable(), Deleter<const void>()); + static_assert(sizeof(u) == sizeof(SmallUniquePtr), TOO_BIG); + + auto u2 = skstd::move(u); + static_assert(sizeof(u2) == sizeof(SmallUniquePtr), TOO_BIG); + } } |