aboutsummaryrefslogtreecommitdiff
path: root/src/unique.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/unique.hpp')
-rw-r--r--src/unique.hpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/unique.hpp b/src/unique.hpp
new file mode 100644
index 0000000..aeb7a67
--- /dev/null
+++ b/src/unique.hpp
@@ -0,0 +1,44 @@
1#pragma once
2
3// #################################################################################################
4
5// A unique type generator
6template <typename T, auto = [] {}, typename specialization = void>
7class Unique
8{
9 private:
10 T val;
11
12 public:
13 using type = T;
14 Unique() = default;
15 operator T() const { return val; }
16 explicit Unique(T b_)
17 : val{ b_ }
18 {
19 }
20 // pre-imcrement
21 auto& operator++()
22 {
23 ++val;
24 return *this;
25 }
26 // post-increment
27 auto operator++(int)
28 {
29 return Unique<T>{ std::exchange(val, val + 1) };
30 }
31};
32
33template <typename T, auto lambda>
34class Unique<T, lambda, std::enable_if_t<!std::is_scalar_v<T>>>
35: public T
36{
37 public:
38 using type = T;
39 using T::T;
40 explicit Unique(T const& b_)
41 : T{ b_ }
42 {
43 }
44};