aboutsummaryrefslogtreecommitdiff
path: root/src/unique.hpp
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2024-10-07 09:29:49 +0200
committerBenoit Germain <benoit.germain@ubisoft.com>2024-10-07 09:29:49 +0200
commite939e5e6a894a042d3301e47faa05264445f27f6 (patch)
treee913615e3fd0ed9e94d9494d6e266420dd7a771b /src/unique.hpp
parentb064bedccebe511b96c9d99d689d6634f5873ec2 (diff)
downloadlanes-e939e5e6a894a042d3301e47faa05264445f27f6.tar.gz
lanes-e939e5e6a894a042d3301e47faa05264445f27f6.tar.bz2
lanes-e939e5e6a894a042d3301e47faa05264445f27f6.zip
Internal improvements: new strong types StackIndex and KeeperIndex
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};