diff options
Diffstat (limited to '')
-rw-r--r-- | src/unique.hpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/unique.hpp b/src/unique.hpp index aeb7a67..846708e 100644 --- a/src/unique.hpp +++ b/src/unique.hpp | |||
@@ -3,7 +3,7 @@ | |||
3 | // ################################################################################################# | 3 | // ################################################################################################# |
4 | 4 | ||
5 | // A unique type generator | 5 | // A unique type generator |
6 | template <typename T, auto = [] {}, typename specialization = void> | 6 | template <typename T, typename TAG, typename specialization = void> |
7 | class Unique | 7 | class Unique |
8 | { | 8 | { |
9 | private: | 9 | private: |
@@ -11,13 +11,15 @@ class Unique | |||
11 | 11 | ||
12 | public: | 12 | public: |
13 | using type = T; | 13 | using type = T; |
14 | Unique() = default; | 14 | constexpr Unique() = default; |
15 | operator T() const { return val; } | 15 | operator T() const { return val; } |
16 | explicit Unique(T b_) | 16 | Unique& operator=(T const&) = delete; |
17 | Unique& operator=(T&&) = delete; | ||
18 | explicit constexpr Unique(T b_) | ||
17 | : val{ b_ } | 19 | : val{ b_ } |
18 | { | 20 | { |
19 | } | 21 | } |
20 | // pre-imcrement | 22 | // pre-increment |
21 | auto& operator++() | 23 | auto& operator++() |
22 | { | 24 | { |
23 | ++val; | 25 | ++val; |
@@ -26,12 +28,12 @@ class Unique | |||
26 | // post-increment | 28 | // post-increment |
27 | auto operator++(int) | 29 | auto operator++(int) |
28 | { | 30 | { |
29 | return Unique<T>{ std::exchange(val, val + 1) }; | 31 | return Unique<T, TAG>{ std::exchange(val, val + 1) }; |
30 | } | 32 | } |
31 | }; | 33 | }; |
32 | 34 | ||
33 | template <typename T, auto lambda> | 35 | template <typename T, typename TAG> |
34 | class Unique<T, lambda, std::enable_if_t<!std::is_scalar_v<T>>> | 36 | class Unique<T, TAG, std::enable_if_t<!std::is_scalar_v<T>>> |
35 | : public T | 37 | : public T |
36 | { | 38 | { |
37 | public: | 39 | public: |
@@ -42,3 +44,9 @@ class Unique<T, lambda, std::enable_if_t<!std::is_scalar_v<T>>> | |||
42 | { | 44 | { |
43 | } | 45 | } |
44 | }; | 46 | }; |
47 | |||
48 | #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 }; | ||