aboutsummaryrefslogtreecommitdiff
path: root/src/unique.hpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/unique.hpp22
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
6template <typename T, auto = [] {}, typename specialization = void> 6template <typename T, typename TAG, typename specialization = void>
7class Unique 7class 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
33template <typename T, auto lambda> 35template <typename T, typename TAG>
34class Unique<T, lambda, std::enable_if_t<!std::is_scalar_v<T>>> 36class 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
51DECLARE_UNIQUE_TYPE(StackIndex, int);
52static constexpr StackIndex kIdxTop{ -1 };