| /* |
| * Copyright 2015 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "SkScopeExit.h" |
| #include "SkTypes.h" |
| #include "Test.h" |
| |
| #include <utility> |
| |
| namespace { |
| class Moveable { |
| public: |
| Moveable() {} |
| Moveable(Moveable&&) {} |
| Moveable& operator=(Moveable&&) { return *this; } |
| 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(std::move(src1)); |
| Moveable src2, dst2; dst2 = std::move(src2); |
| } |
| |
| DEF_TEST(CPlusPlusEleven_constexpr, r) { |
| static constexpr int x = Sk32ToBool(50); |
| REPORTER_ASSERT(r, x == 1); |
| static constexpr int y = SkTPin<int>(100, 0, 10); |
| REPORTER_ASSERT(r, y == 10); |
| } |
| |
| namespace { |
| struct MoveableCopyable { |
| bool fCopied; |
| MoveableCopyable() : fCopied(false) {} |
| MoveableCopyable(const MoveableCopyable &o) : fCopied(true) {} |
| MoveableCopyable(MoveableCopyable &&o) : fCopied(o.fCopied) {} |
| }; |
| struct TestClass { |
| MoveableCopyable fFoo; |
| }; |
| } // namespace |
| |
| DEF_TEST(CPlusPlusEleven_default_move, r) { |
| TestClass a; |
| TestClass b(a); |
| TestClass c(std::move(a)); |
| REPORTER_ASSERT(r, b.fFoo.fCopied); |
| REPORTER_ASSERT(r, !c.fFoo.fCopied); |
| } |
| |
| DEF_TEST(SkAtScopeExit, r) { |
| int x = 5; |
| { |
| SK_AT_SCOPE_EXIT(x--); |
| REPORTER_ASSERT(r, x == 5); |
| } |
| REPORTER_ASSERT(r, x == 4); |
| } |