diff options
Diffstat (limited to 'src/unique.hpp')
-rw-r--r-- | src/unique.hpp | 44 |
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 | ||
6 | template <typename T, auto = [] {}, typename specialization = void> | ||
7 | class 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 | |||
33 | template <typename T, auto lambda> | ||
34 | class 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 | }; | ||