diff options
Diffstat (limited to 'src/unique.hpp')
-rw-r--r-- | src/unique.hpp | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/unique.hpp b/src/unique.hpp index 846708e..829fa49 100644 --- a/src/unique.hpp +++ b/src/unique.hpp | |||
@@ -7,26 +7,39 @@ template <typename T, typename TAG, typename specialization = void> | |||
7 | class Unique | 7 | class Unique |
8 | { | 8 | { |
9 | private: | 9 | private: |
10 | T val; | 10 | T val; // no default initialization so that std::is_trivial_v<Unique<T>> == true |
11 | 11 | ||
12 | public: | 12 | public: |
13 | using type = T; | 13 | using type = T; |
14 | constexpr Unique() = default; | 14 | |
15 | operator T() const { return val; } | 15 | ~Unique() = default; |
16 | Unique& operator=(T const&) = delete; | 16 | constexpr explicit Unique(T b_) |
17 | Unique& operator=(T&&) = delete; | ||
18 | explicit constexpr Unique(T b_) | ||
19 | : val{ b_ } | 17 | : val{ b_ } |
20 | { | 18 | { |
21 | } | 19 | } |
20 | |||
21 | // rule of 5 | ||
22 | constexpr Unique() = default; | ||
23 | constexpr Unique(Unique const&) = default; | ||
24 | constexpr Unique(Unique&&) = default; | ||
25 | constexpr Unique& operator=(Unique const&) = default; | ||
26 | constexpr Unique& operator=(Unique&&) = default; | ||
27 | |||
28 | // can't implicitly affect from base type | ||
29 | Unique& operator=(T const&) = delete; | ||
30 | constexpr Unique& operator=(T&&) = delete; | ||
31 | |||
32 | // cast | ||
33 | constexpr operator T() const noexcept { return val; } | ||
34 | |||
22 | // pre-increment | 35 | // pre-increment |
23 | auto& operator++() | 36 | auto& operator++() noexcept |
24 | { | 37 | { |
25 | ++val; | 38 | ++val; |
26 | return *this; | 39 | return *this; |
27 | } | 40 | } |
28 | // post-increment | 41 | // post-increment |
29 | auto operator++(int) | 42 | auto operator++(int) noexcept |
30 | { | 43 | { |
31 | return Unique<T, TAG>{ std::exchange(val, val + 1) }; | 44 | return Unique<T, TAG>{ std::exchange(val, val + 1) }; |
32 | } | 45 | } |
@@ -46,7 +59,3 @@ class Unique<T, TAG, std::enable_if_t<!std::is_scalar_v<T>>> | |||
46 | }; | 59 | }; |
47 | 60 | ||
48 | #define DECLARE_UNIQUE_TYPE(_name, _type) using _name = Unique<_type, class Unique_##_name##_Tag> | 61 | #define DECLARE_UNIQUE_TYPE(_name, _type) using _name = Unique<_type, class Unique_##_name##_Tag> |
49 | |||
50 | // putting this here to break a header circular dependency until I find a better place | ||
51 | DECLARE_UNIQUE_TYPE(StackIndex, int); | ||
52 | static constexpr StackIndex kIdxTop{ -1 }; | ||