based

Opinionated utility library
git clone git://git.dimitrijedobrota.com/based.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

commit 01258c99d50a4507f526c66dc27984927ba05f7c
parent 7cae92534482a20a534cc248416b582533a1a01b
author Dimitrije Dobrota < mail@dimitrijedobrota.com >
date Fri, 9 May 2025 17:29:09 +0200

First enum_flag is empty with value zero

Diffstat:
M include/based/enum/enum_flag.hpp | +++++++ --
M include/based/macro/get_macro.hpp | ++++
M test/source/enum_flag_test.cpp | ++++++++ ---
M test/source/enum_test.cpp | ++++ -

4 files changed, 23 insertions(+), 6 deletions(-)


diff --git a/ include/based/enum/enum_flag.hpp b/ include/based/enum/enum_flag.hpp

@@ -26,9 +26,14 @@

#define BASED_DETAIL_DEFINE_ENUM_FLAG_VAL(Qualifier, Name, Index) \
inline constexpr BASED_DETAIL_SET( \
Qualifier::Name, \
Qualifier::type::size_t {1} << Qualifier::type::size_t {(Index)} \
Qualifier::type::size_t {1} \
<< Qualifier::type::size_t {Qualifier::type::size - (Index) - 2} \
)

#define BASED_DETAIL_DEFINE_ENUM_FLAG_VALS(Qualifier, First, ...) \
BASED_FOREACH_1(Qualifier, BASED_DETAIL_DEFINE_ENUM_FLAG_VAL, __VA_ARGS__) \
inline constexpr BASED_DETAIL_SET(Qualifier::First, 0)

#define BASED_DETAIL_DEFINE_ENUM_GET(Qualifier, Type, ...) \
inline const Qualifier::type& Qualifier::type::get(Type idx) \
{ \

@@ -42,7 +47,7 @@

}

#define BASED_DETAIL_DEFINE_ENUM(Qualifier, Type, ...) \
BASED_FOREACH_1(Qualifier, BASED_DETAIL_DEFINE_ENUM_FLAG_VAL, __VA_ARGS__) \
BASED_DETAIL_DEFINE_ENUM_FLAG_VALS(Qualifier, __VA_ARGS__) \
BASED_DETAIL_DEFINE_ENUM_GET(Qualifier, Type, __VA_ARGS__)

#define BASED_DECLARE_ENUM_FLAG(Name, Type, ...) \

diff --git a/ include/based/macro/get_macro.hpp b/ include/based/macro/get_macro.hpp

@@ -1,5 +1,7 @@

#pragma once

// NOLINTBEGIN(*macro-usage*)

// clang-format off
#define BASED_GET_MACRO( \
_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, \

@@ -9,3 +11,5 @@

_58, _59, _60, _61, _62, _63, _64, NAME, ... \
) NAME
// clang-format on

// NOLINTEND(*macro-usage*)

diff --git a/ test/source/enum_flag_test.cpp b/ test/source/enum_flag_test.cpp

@@ -12,16 +12,21 @@

#include "based/concepts/is/same.hpp"
#include "based/types/types.hpp"

BASED_DECLARE_ENUM_FLAG(var, based::u8, a, b, c)
BASED_DEFINE_ENUM_FLAG(var, based::u8, a, b, c)
BASED_DECLARE_ENUM_FLAG(var, based::u8, empty, a, b, c)
BASED_DEFINE_ENUM_FLAG(var, based::u8, empty, a, b, c)

TEST_CASE("types", "[enum/enum]")
{
STATIC_REQUIRE(requires { typename var; });
STATIC_REQUIRE(requires { var::type::size == 3; });
STATIC_REQUIRE(requires { var::empty; });
STATIC_REQUIRE(requires { var::a; });
STATIC_REQUIRE(requires { var::b; });
STATIC_REQUIRE(requires { var::c; });
STATIC_REQUIRE(var::type::size == 4);
STATIC_REQUIRE(var::empty.value == 0);
STATIC_REQUIRE(var::a.value == 1);
STATIC_REQUIRE(var::b.value == 2);
STATIC_REQUIRE(var::c.value == 4);
}

TEST_CASE("operations", "[enum/enum]")

diff --git a/ test/source/enum_test.cpp b/ test/source/enum_test.cpp

@@ -44,10 +44,13 @@ inline int test::get_var(var::type req) const

TEST_CASE("types", "[enum/enum]")
{
STATIC_REQUIRE(requires { typename test::var; });
STATIC_REQUIRE(requires { test::var::type::size == 3; });
STATIC_REQUIRE(requires { test::var::a; });
STATIC_REQUIRE(requires { test::var::b; });
STATIC_REQUIRE(requires { test::var::c; });
STATIC_REQUIRE(test::var::type::size == 3);
STATIC_REQUIRE(test::var::a.value == 0);
STATIC_REQUIRE(test::var::b.value == 1);
STATIC_REQUIRE(test::var::c.value == 2);
}

TEST_CASE("safety", "[enum/enum]")