Skip to content

Commit d583832

Browse files
authored
Merge pull request #32 from shad0wshayd3-FO4/dev-rex
feat: REX 2
2 parents b4cf559 + d350461 commit d583832

13 files changed

Lines changed: 1103 additions & 261 deletions

File tree

CommonLibF4/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
cmake_minimum_required(VERSION 3.21)
22

33
option(F4SE_SUPPORT_XBYAK "Enables trampoline support for Xbyak." OFF)
4+
option(REX_OPTION_INI "Enables ini config support for REX." OFF)
5+
option(REX_OPTION_JSON "Enables json config support for REX." OFF)
6+
option(REX_OPTION_TOML "Enables toml config support for REX." OFF)
47

58
project(
69
CommonLibF4
@@ -39,6 +42,9 @@ target_compile_definitions(
3942
WINVER=0x0601 # windows 7, minimum supported version by fallout 4
4043
_WIN32_WINNT=0x0601
4144
"$<$<BOOL:${F4SE_SUPPORT_XBYAK}>:F4SE_SUPPORT_XBYAK=1>"
45+
"$<$<BOOL:${REX_OPTION_INI}>:REX_OPTION_INI=1>"
46+
"$<$<BOOL:${REX_OPTION_JSON}>:REX_OPTION_JSON=1>"
47+
"$<$<BOOL:${REX_OPTION_TOML}>:REX_OPTION_TOML=1>"
4248
)
4349

4450
target_compile_features(

CommonLibF4/cmake/sourcelist.cmake

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,13 @@ set(SOURCES
370370
include/REX/PS4.h
371371
include/REX/PS4/SCEPAD.h
372372
include/REX/REX.h
373+
include/REX/REX/Enum.h
374+
include/REX/REX/EnumSet.h
375+
include/REX/REX/INI.h
376+
include/REX/REX/JSON.h
377+
include/REX/REX/Setting.h
378+
include/REX/REX/Singleton.h
379+
include/REX/REX/TOML.h
373380
include/REX/W32.h
374381
include/REX/W32/ADVAPI32.h
375382
include/REX/W32/BASE.h
@@ -446,5 +453,6 @@ set(SOURCES
446453
src/REL/Module.cpp
447454
src/REL/Relocation.cpp
448455
src/REL/Version.cpp
456+
src/REX/REX.cpp
449457
src/REX/W32.cpp
450458
)

CommonLibF4/include/F4SE/Impl/PCH.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <ctime>
1515
#include <execution>
1616
#include <filesystem>
17+
#include <fstream>
1718
#include <functional>
1819
#include <initializer_list>
1920
#include <intrin.h>
@@ -41,15 +42,16 @@ static_assert(
4142
std::is_integral_v<std::time_t> && sizeof(std::time_t) == sizeof(std::size_t),
4243
"wrap std::time_t instead");
4344

45+
#include "REX/REX/Enum.h"
46+
#include "REX/REX/EnumSet.h"
47+
#include "REX/W32/KERNEL32.h"
48+
#include "REX/W32/USER32.h"
49+
4450
#pragma warning(push, 0)
4551
#include <mmio/mmio.hpp>
4652
#include <spdlog/spdlog.h>
4753
#pragma warning(pop)
4854

49-
#include "REX/REX.h"
50-
#include "REX/W32/KERNEL32.h"
51-
#include "REX/W32/USER32.h"
52-
5355
namespace F4SE
5456
{
5557
using namespace std::literals;

CommonLibF4/include/REX/REX.h

Lines changed: 7 additions & 256 deletions
Original file line numberDiff line numberDiff line change
@@ -1,258 +1,9 @@
11
#pragma once
22

3-
namespace REX
4-
{
5-
template <
6-
class E,
7-
class U = std::underlying_type_t<E>>
8-
class Enum
9-
{
10-
public:
11-
using enum_type = E;
12-
using underlying_type = U;
13-
14-
static_assert(std::is_enum_v<E>, "Enum<E, ...> must be an enum");
15-
static_assert(std::is_integral_v<U>, "Enum<..., U> must be an integral");
16-
17-
constexpr Enum() noexcept = default;
18-
constexpr Enum(const Enum&) noexcept = default;
19-
constexpr Enum(Enum&&) noexcept = default;
20-
21-
template <class U2> // NOLINTNEXTLINE(google-explicit-constructor)
22-
constexpr Enum(Enum<E, U2> a_rhs) noexcept :
23-
_impl(static_cast<U>(a_rhs.get()))
24-
{}
25-
26-
constexpr Enum(E a_value) noexcept :
27-
_impl(static_cast<U>(a_value))
28-
{}
29-
30-
~Enum() noexcept = default;
31-
32-
constexpr Enum& operator=(const Enum&) noexcept = default;
33-
constexpr Enum& operator=(Enum&&) noexcept = default;
34-
35-
template <class U2>
36-
constexpr Enum& operator=(Enum<E, U2> a_rhs) noexcept
37-
{
38-
_impl = static_cast<U>(a_rhs.get());
39-
}
40-
41-
constexpr Enum& operator=(E a_value) noexcept
42-
{
43-
_impl = static_cast<U>(a_value);
44-
return *this;
45-
}
46-
47-
public:
48-
[[nodiscard]] explicit constexpr operator bool() const noexcept { return _impl != static_cast<U>(0); }
49-
[[nodiscard]] constexpr E operator*() const noexcept { return get(); }
50-
[[nodiscard]] constexpr E get() const noexcept { return static_cast<E>(_impl); }
51-
[[nodiscard]] constexpr U underlying() const noexcept { return _impl; }
52-
53-
public:
54-
friend constexpr bool operator==(Enum a_lhs, Enum a_rhs) noexcept { return a_lhs.underlying() == a_rhs.underlying(); }
55-
friend constexpr bool operator==(Enum a_lhs, E a_rhs) noexcept { return a_lhs.underlying() == static_cast<U>(a_rhs); }
56-
friend constexpr bool operator==(E a_lhs, Enum a_rhs) noexcept { return static_cast<U>(a_lhs) == a_rhs.underlying(); }
57-
58-
private:
59-
U _impl{ 0 };
60-
};
61-
template <class... Args>
62-
Enum(Args...) -> Enum<
63-
std::common_type_t<Args...>,
64-
std::underlying_type_t<
65-
std::common_type_t<Args...>>>;
66-
}
67-
68-
namespace REX
69-
{
70-
template <
71-
class E,
72-
class U = std::underlying_type_t<E>>
73-
class EnumSet
74-
{
75-
public:
76-
using enum_type = E;
77-
using underlying_type = U;
78-
79-
static_assert(std::is_enum_v<E>, "EnumSet<E, ...> must be an enum");
80-
static_assert(std::is_integral_v<U>, "EnumSet<..., U> must be an integral");
81-
82-
constexpr EnumSet() noexcept = default;
83-
constexpr EnumSet(const EnumSet&) noexcept = default;
84-
constexpr EnumSet(EnumSet&&) noexcept = default;
85-
86-
template <class U2> // NOLINTNEXTLINE(google-explicit-constructor)
87-
constexpr EnumSet(EnumSet<E, U2> a_rhs) noexcept :
88-
_impl(static_cast<U>(a_rhs.get()))
89-
{}
90-
91-
template <class... Args>
92-
constexpr EnumSet(Args... a_values) noexcept
93-
requires(std::same_as<Args, E>&&...) :
94-
_impl((static_cast<U>(a_values) | ...))
95-
{}
96-
97-
~EnumSet() noexcept = default;
98-
99-
constexpr EnumSet& operator=(const EnumSet&) noexcept = default;
100-
constexpr EnumSet& operator=(EnumSet&&) noexcept = default;
101-
102-
template <class U2>
103-
constexpr EnumSet& operator=(EnumSet<E, U2> a_rhs) noexcept
104-
{
105-
_impl = static_cast<U>(a_rhs.get());
106-
}
107-
108-
constexpr EnumSet& operator=(E a_value) noexcept
109-
{
110-
_impl = static_cast<U>(a_value);
111-
return *this;
112-
}
113-
114-
public:
115-
[[nodiscard]] explicit constexpr operator bool() const noexcept { return _impl != static_cast<U>(0); }
116-
117-
[[nodiscard]] constexpr E operator*() const noexcept { return get(); }
118-
[[nodiscard]] constexpr E get() const noexcept { return static_cast<E>(_impl); }
119-
[[nodiscard]] constexpr U underlying() const noexcept { return _impl; }
120-
121-
public:
122-
template <class... Args>
123-
constexpr EnumSet& set(Args... a_args) noexcept
124-
requires(std::same_as<Args, E>&&...)
125-
{
126-
_impl |= (static_cast<U>(a_args) | ...);
127-
return *this;
128-
}
129-
130-
template <class... Args>
131-
constexpr EnumSet& reset(Args... a_args) noexcept
132-
requires(std::same_as<Args, E>&&...)
133-
{
134-
_impl &= ~(static_cast<U>(a_args) | ...);
135-
return *this;
136-
}
137-
138-
constexpr EnumSet& reset() noexcept
139-
{
140-
_impl = 0;
141-
return *this;
142-
}
143-
144-
template <class... Args>
145-
[[nodiscard]] constexpr bool any(Args... a_args) const noexcept
146-
requires(std::same_as<Args, E>&&...)
147-
{
148-
return (_impl & (static_cast<U>(a_args) | ...)) != static_cast<U>(0);
149-
}
150-
151-
template <class... Args>
152-
[[nodiscard]] constexpr bool all(Args... a_args) const noexcept
153-
requires(std::same_as<Args, E>&&...)
154-
{
155-
return (_impl & (static_cast<U>(a_args) | ...)) == (static_cast<U>(a_args) | ...);
156-
}
157-
158-
template <class... Args>
159-
[[nodiscard]] constexpr bool none(Args... a_args) const noexcept
160-
requires(std::same_as<Args, E>&&...)
161-
{
162-
return (_impl & (static_cast<U>(a_args) | ...)) == static_cast<U>(0);
163-
}
164-
165-
public:
166-
friend constexpr bool operator==(EnumSet a_lhs, EnumSet a_rhs) noexcept { return a_lhs.underlying() == a_rhs.underlying(); }
167-
friend constexpr bool operator==(EnumSet a_lhs, E a_rhs) noexcept { return a_lhs.underlying() == static_cast<U>(a_rhs); }
168-
friend constexpr bool operator==(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<U>(a_lhs) == a_rhs.underlying(); }
169-
170-
friend constexpr std::strong_ordering operator<=>(EnumSet a_lhs, EnumSet a_rhs) noexcept { return a_lhs.underlying() <=> a_rhs.underlying(); }
171-
friend constexpr std::strong_ordering operator<=>(EnumSet a_lhs, E a_rhs) noexcept { return a_lhs.underlying() <=> static_cast<U>(a_rhs); }
172-
friend constexpr std::strong_ordering operator<=>(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<U>(a_lhs) <=> a_rhs.underlying(); }
173-
174-
friend constexpr EnumSet operator&(EnumSet a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() & a_rhs.underlying()); }
175-
friend constexpr EnumSet operator&(EnumSet a_lhs, E a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() & static_cast<U>(a_rhs)); }
176-
friend constexpr EnumSet operator&(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(static_cast<U>(a_lhs) & a_rhs.underlying()); }
177-
178-
friend constexpr EnumSet& operator&=(EnumSet& a_lhs, EnumSet a_rhs) noexcept { return a_lhs = a_lhs & a_rhs; }
179-
friend constexpr EnumSet& operator&=(EnumSet& a_lhs, E a_rhs) noexcept { return a_lhs = a_lhs & a_rhs; }
180-
181-
friend constexpr EnumSet operator|(EnumSet a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() | a_rhs.underlying()); }
182-
friend constexpr EnumSet operator|(EnumSet a_lhs, E a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() | static_cast<U>(a_rhs)); }
183-
friend constexpr EnumSet operator|(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(static_cast<U>(a_lhs) | a_rhs.underlying()); }
184-
185-
friend constexpr EnumSet& operator|=(EnumSet& a_lhs, EnumSet a_rhs) noexcept { return a_lhs = a_lhs | a_rhs; }
186-
friend constexpr EnumSet& operator|=(EnumSet& a_lhs, E a_rhs) noexcept { return a_lhs = a_lhs | a_rhs; }
187-
188-
friend constexpr EnumSet operator^(EnumSet a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() ^ a_rhs.underlying()); }
189-
friend constexpr EnumSet operator^(EnumSet a_lhs, E a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() ^ static_cast<U>(a_rhs)); }
190-
friend constexpr EnumSet operator^(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(static_cast<U>(a_lhs) ^ a_rhs.underlying()); }
191-
192-
friend constexpr EnumSet& operator^=(EnumSet& a_lhs, EnumSet a_rhs) noexcept { return a_lhs = a_lhs ^ a_rhs; }
193-
friend constexpr EnumSet& operator^=(EnumSet& a_lhs, E a_rhs) noexcept { return a_lhs = a_lhs ^ a_rhs; }
194-
195-
friend constexpr EnumSet operator+(EnumSet a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() + a_rhs.underlying()); }
196-
friend constexpr EnumSet operator+(EnumSet a_lhs, E a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() + static_cast<U>(a_rhs)); }
197-
friend constexpr EnumSet operator+(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(static_cast<U>(a_lhs) + a_rhs.underlying()); }
198-
199-
friend constexpr EnumSet& operator+=(EnumSet& a_lhs, EnumSet a_rhs) noexcept { return a_lhs = a_lhs + a_rhs; }
200-
friend constexpr EnumSet& operator+=(EnumSet& a_lhs, E a_rhs) noexcept { return a_lhs = a_lhs + a_rhs; }
201-
202-
friend constexpr EnumSet operator-(EnumSet a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() - a_rhs.underlying()); }
203-
friend constexpr EnumSet operator-(EnumSet a_lhs, E a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() - static_cast<U>(a_rhs)); }
204-
friend constexpr EnumSet operator-(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(static_cast<U>(a_lhs) - a_rhs.underlying()); }
205-
206-
friend constexpr EnumSet& operator-=(EnumSet& a_lhs, EnumSet a_rhs) noexcept { return a_lhs = a_lhs - a_rhs; }
207-
friend constexpr EnumSet& operator-=(EnumSet& a_lhs, E a_rhs) noexcept { return a_lhs = a_lhs - a_rhs; }
208-
209-
friend constexpr EnumSet operator<<(EnumSet a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() << a_rhs.underlying()); }
210-
friend constexpr EnumSet operator<<(EnumSet a_lhs, E a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() << static_cast<U>(a_rhs)); }
211-
friend constexpr EnumSet operator<<(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(static_cast<U>(a_lhs) << a_rhs.underlying()); }
212-
213-
friend constexpr EnumSet& operator<<=(EnumSet& a_lhs, EnumSet a_rhs) noexcept { return a_lhs = a_lhs << a_rhs; }
214-
friend constexpr EnumSet& operator<<=(EnumSet& a_lhs, E a_rhs) noexcept { return a_lhs = a_lhs << a_rhs; }
215-
216-
friend constexpr EnumSet operator>>(EnumSet a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() >> a_rhs.underlying()); }
217-
friend constexpr EnumSet operator>>(EnumSet a_lhs, E a_rhs) noexcept { return static_cast<E>(a_lhs.underlying() >> static_cast<U>(a_rhs)); }
218-
friend constexpr EnumSet operator>>(E a_lhs, EnumSet a_rhs) noexcept { return static_cast<E>(static_cast<U>(a_lhs) >> a_rhs.underlying()); }
219-
220-
friend constexpr EnumSet& operator>>=(EnumSet& a_lhs, EnumSet a_rhs) noexcept { return a_lhs = a_lhs >> a_rhs; }
221-
friend constexpr EnumSet& operator>>=(EnumSet& a_lhs, E a_rhs) noexcept { return a_lhs = a_lhs >> a_rhs; }
222-
223-
friend constexpr EnumSet& operator~(EnumSet& a_lhs) noexcept { return a_lhs = ~a_lhs.underlying(); }
224-
225-
private:
226-
U _impl{ 0 };
227-
};
228-
229-
template <class... Args>
230-
EnumSet(Args...) -> EnumSet<
231-
std::common_type_t<Args...>,
232-
std::underlying_type_t<
233-
std::common_type_t<Args...>>>;
234-
}
235-
236-
namespace REX
237-
{
238-
template <class T>
239-
class Singleton
240-
{
241-
public:
242-
static T* GetSingleton()
243-
{
244-
static T singleton;
245-
return std::addressof(singleton);
246-
}
247-
248-
protected:
249-
Singleton() = default;
250-
~Singleton() = default;
251-
252-
Singleton(const Singleton&) = delete;
253-
Singleton(Singleton&&) = delete;
254-
255-
Singleton& operator=(const Singleton&) = delete;
256-
Singleton& operator=(Singleton&&) = delete;
257-
};
258-
}
3+
#include "REX/REX/Enum.h"
4+
#include "REX/REX/EnumSet.h"
5+
#include "REX/REX/INI.h"
6+
#include "REX/REX/JSON.h"
7+
#include "REX/REX/Setting.h"
8+
#include "REX/REX/Singleton.h"
9+
#include "REX/REX/TOML.h"

0 commit comments

Comments
 (0)