1 Commits

Author SHA1 Message Date
Javi 48486a57d7 Added epilogue 2024-07-05 07:48:15 +02:00
2 changed files with 40 additions and 13 deletions
+24
View File
@@ -0,0 +1,24 @@
#pragma once
#include "tl/functional.h"
namespace tl
{
class epilogue
{
public:
epilogue(function<void()> i_function) noexcept
: m_function(std::move(i_function))
{
}
~epilogue() noexcept
{
m_function();
}
private:
function<void()> m_function;
};
}
+16 -13
View File
@@ -7,43 +7,46 @@
namespace tl
{
template<typename T, typename Tag>
template<typename T, T invalid_value, typename Tag>
struct identifier
{
using underlying_type = T;
identifier() = delete;
constexpr identifier() noexcept = default;
explicit constexpr identifier(T value) noexcept : m_value(std::move(value)) {}
constexpr T value() const noexcept { return m_value; }
auto operator<=>(const identifier<T, Tag>& other) const noexcept { return m_value <=> other.value(); }
constexpr bool is_valid() const noexcept { return m_value != invalid_value; }
//inline static identifier<T, invalid_value, Tag> invalid() noexcept { return identifier<T, invalid_value, Tag>(); }
auto operator<=>(const identifier<T, invalid_value, Tag>& other) const noexcept { return m_value <=> other.value(); }
auto operator<=>(const T& other) const noexcept { return m_value <=> other; }
bool operator==(const identifier<T, Tag>& other) const noexcept { return m_value == other.value(); }
bool operator==(const identifier<T, invalid_value, Tag>& other) const noexcept { return m_value == other.value(); }
bool operator==(const T& other) const noexcept { return m_value == other; }
private:
T m_value;
T m_value = invalid_value;
};
}
#define TL_DECLARE_INTEGRAL_ID(NAME, TYPE) \
#define TL_DECLARE_INTEGRAL_ID(NAME, TYPE, INVALID_VALUE) \
struct NAME##_tag {};\
using NAME = tl::identifier<TYPE, NAME##_tag>;
using NAME = tl::identifier<TYPE, INVALID_VALUE, NAME##_tag>;
template <typename T, typename Tag>
struct std::formatter<tl::identifier<T, Tag>>
template <typename T, T invalid_value, typename Tag>
struct std::formatter<tl::identifier<T, invalid_value, Tag>>
{
constexpr auto parse(format_parse_context& ctx) noexcept { return ctx.begin(); }
auto format(const tl::identifier<T, Tag>& id, std::format_context& ctx) const
auto format(const tl::identifier<T, invalid_value, Tag>& id, std::format_context& ctx) const
{
return format_to(ctx.out(), "{}", id.value());
}
};
template<typename T, typename Tag>
struct eastl::hash<tl::identifier<T, Tag>>
template<typename T, T invalid_value, typename Tag>
struct eastl::hash<tl::identifier<T, invalid_value, Tag>>
{
size_t operator()(tl::identifier<T, Tag> const& id) const
size_t operator()(tl::identifier<T, invalid_value, Tag> const& id) const
{
return hash<T>()(id.value());
}