1 /*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 #include "Test.h"
8 #include "SkTemplates.h"
9 #include "SkScopeExit.h"
10 #include <utility>
11
12 namespace {
13 class Moveable {
14 public:
Moveable()15 Moveable() {}
Moveable(Moveable &&)16 Moveable(Moveable&&) {}
operator =(Moveable &&)17 Moveable& operator=(Moveable&&) { return *this; }
18 private:
19 Moveable(const Moveable&);
20 Moveable& operator=(const Moveable&);
21 };
deleter(T *)22 template <typename T> void deleter(T*) { }
23 template <typename T> struct Deleter {
operator ()__anone0367c040111::Deleter24 void operator()(T* t) { delete static_cast<const Moveable*>(t); }
25 };
26 } // namespace
27
DEF_TEST(CPlusPlusEleven_RvalueAndMove,r)28 DEF_TEST(CPlusPlusEleven_RvalueAndMove, r) {
29 Moveable src1; Moveable dst1(std::move(src1));
30 Moveable src2, dst2; dst2 = std::move(src2);
31 }
32
DEF_TEST(CPlusPlusEleven_constexpr,r)33 DEF_TEST(CPlusPlusEleven_constexpr, r) {
34 static constexpr int x = Sk32ToBool(50);
35 REPORTER_ASSERT(r, x == 1);
36 static constexpr int y = SkTPin<int>(100, 0, 10);
37 REPORTER_ASSERT(r, y == 10);
38 }
39
40 namespace {
41 struct MoveableCopyable {
42 bool fCopied;
MoveableCopyable__anone0367c040211::MoveableCopyable43 MoveableCopyable() : fCopied(false) {}
MoveableCopyable__anone0367c040211::MoveableCopyable44 MoveableCopyable(const MoveableCopyable &o) : fCopied(true) {}
MoveableCopyable__anone0367c040211::MoveableCopyable45 MoveableCopyable(MoveableCopyable &&o) : fCopied(o.fCopied) {}
46 };
47 struct TestClass {
48 MoveableCopyable fFoo;
49 };
50 } // namespace
51
DEF_TEST(CPlusPlusEleven_default_move,r)52 DEF_TEST(CPlusPlusEleven_default_move, r) {
53 TestClass a;
54 TestClass b(a);
55 TestClass c(std::move(a));
56 REPORTER_ASSERT(r, b.fFoo.fCopied);
57 REPORTER_ASSERT(r, !c.fFoo.fCopied);
58 }
59
DEF_TEST(SkAtScopeExit,r)60 DEF_TEST(SkAtScopeExit, r) {
61 int x = 5;
62 {
63 SK_AT_SCOPE_EXIT(x--);
64 REPORTER_ASSERT(r, x == 5);
65 }
66 REPORTER_ASSERT(r, x == 4);
67 }
68