aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoit Germain <benoit.germain@ubisoft.com>2024-10-09 09:43:24 +0200
committerBenoit Germain <benoit.germain@ubisoft.com>2024-10-09 09:43:24 +0200
commitea290e120ee0069e0c4a983d49fb69fc942dc3f2 (patch)
treed98f519b0a39f0f195b91f78ae62e040b5c59a79
parent08ceea621246a5085d75d698af5e7968262f4b3a (diff)
downloadlanes-ea290e120ee0069e0c4a983d49fb69fc942dc3f2.tar.gz
lanes-ea290e120ee0069e0c4a983d49fb69fc942dc3f2.tar.bz2
lanes-ea290e120ee0069e0c4a983d49fb69fc942dc3f2.zip
Improved Unique<> implementation, moved StackIndex into a separate header
-rw-r--r--src/compat.h5
-rw-r--r--src/luaerrors.h2
-rw-r--r--src/stackindex.hpp11
-rw-r--r--src/unique.hpp33
4 files changed, 34 insertions, 17 deletions
diff --git a/src/compat.h b/src/compat.h
index 90e72a3..081e4c7 100644
--- a/src/compat.h
+++ b/src/compat.h
@@ -1,6 +1,7 @@
1#pragma once 1#pragma once
2 2
3#include "debug.h" 3#include "debug.h"
4#include "stackindex.hpp"
4 5
5// try to detect if we are building against LuaJIT or MoonJIT 6// try to detect if we are building against LuaJIT or MoonJIT
6#if defined(LUA_JITLIBNAME) 7#if defined(LUA_JITLIBNAME)
@@ -32,10 +33,6 @@
32 33
33// ################################################################################################# 34// #################################################################################################
34 35
35static constexpr StackIndex kIdxRegistry{ LUA_REGISTRYINDEX };
36
37// #################################################################################################
38
39// a strong-typed wrapper over lua types to see them easier in a debugger 36// a strong-typed wrapper over lua types to see them easier in a debugger
40enum class LuaType 37enum class LuaType
41{ 38{
diff --git a/src/luaerrors.h b/src/luaerrors.h
index cf04f6c..ef32c60 100644
--- a/src/luaerrors.h
+++ b/src/luaerrors.h
@@ -1,6 +1,6 @@
1#pragma once 1#pragma once
2 2
3#include "unique.hpp" 3#include "stackindex.hpp"
4 4
5// ################################################################################################# 5// #################################################################################################
6 6
diff --git a/src/stackindex.hpp b/src/stackindex.hpp
new file mode 100644
index 0000000..7c2c17a
--- /dev/null
+++ b/src/stackindex.hpp
@@ -0,0 +1,11 @@
1#pragma once
2
3#include "unique.hpp"
4
5DECLARE_UNIQUE_TYPE(StackIndex, int);
6static_assert(std::is_trivial_v<StackIndex>);
7
8// #################################################################################################
9
10static constexpr StackIndex kIdxRegistry{ LUA_REGISTRYINDEX };
11static constexpr StackIndex kIdxTop{ -1 };
diff --git a/src/unique.hpp b/src/unique.hpp
index 846708e..829fa49 100644
--- a/src/unique.hpp
+++ b/src/unique.hpp
@@ -7,26 +7,39 @@ template <typename T, typename TAG, typename specialization = void>
7class Unique 7class Unique
8{ 8{
9 private: 9 private:
10 T val; 10 T val; // no default initialization so that std::is_trivial_v<Unique<T>> == true
11 11
12 public: 12 public:
13 using type = T; 13 using type = T;
14 constexpr Unique() = default; 14
15 operator T() const { return val; } 15 ~Unique() = default;
16 Unique& operator=(T const&) = delete; 16 constexpr explicit Unique(T b_)
17 Unique& operator=(T&&) = delete;
18 explicit constexpr Unique(T b_)
19 : val{ b_ } 17 : val{ b_ }
20 { 18 {
21 } 19 }
20
21 // rule of 5
22 constexpr Unique() = default;
23 constexpr Unique(Unique const&) = default;
24 constexpr Unique(Unique&&) = default;
25 constexpr Unique& operator=(Unique const&) = default;
26 constexpr Unique& operator=(Unique&&) = default;
27
28 // can't implicitly affect from base type
29 Unique& operator=(T const&) = delete;
30 constexpr Unique& operator=(T&&) = delete;
31
32 // cast
33 constexpr operator T() const noexcept { return val; }
34
22 // pre-increment 35 // pre-increment
23 auto& operator++() 36 auto& operator++() noexcept
24 { 37 {
25 ++val; 38 ++val;
26 return *this; 39 return *this;
27 } 40 }
28 // post-increment 41 // post-increment
29 auto operator++(int) 42 auto operator++(int) noexcept
30 { 43 {
31 return Unique<T, TAG>{ std::exchange(val, val + 1) }; 44 return Unique<T, TAG>{ std::exchange(val, val + 1) };
32 } 45 }
@@ -46,7 +59,3 @@ class Unique<T, TAG, std::enable_if_t<!std::is_scalar_v<T>>>
46}; 59};
47 60
48#define DECLARE_UNIQUE_TYPE(_name, _type) using _name = Unique<_type, class Unique_##_name##_Tag> 61#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 };