mirror of
https://github.com/BlackMATov/enum.hpp.git
synced 2025-12-15 11:53:50 +07:00
18
.github/workflows/linux.yml
vendored
18
.github/workflows/linux.yml
vendored
@@ -10,16 +10,14 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
config:
|
config:
|
||||||
# https://github.com/actions/virtual-environments/tree/main/images/linux
|
# https://github.com/actions/virtual-environments/tree/main/images/linux
|
||||||
- { os: "ubuntu-18.04", cc: "gcc-7", cxx: "g++-7" }
|
- { os: "ubuntu-20.04", cc: "gcc-7", cxx: "g++-7" }
|
||||||
- { os: "ubuntu-18.04", cc: "gcc-8", cxx: "g++-8" }
|
- { os: "ubuntu-20.04", cc: "gcc-8", cxx: "g++-8" }
|
||||||
- { os: "ubuntu-18.04", cc: "gcc-9", cxx: "g++-9" }
|
- { os: "ubuntu-20.04", cc: "gcc-9", cxx: "g++-9" }
|
||||||
- { os: "ubuntu-18.04", cc: "gcc-10", cxx: "g++-10" }
|
- { os: "ubuntu-20.04", cc: "gcc-10", cxx: "g++-10" }
|
||||||
- { os: "ubuntu-18.04", cc: "clang-5.0", cxx: "clang++-5.0" }
|
- { os: "ubuntu-20.04", cc: "clang-7", cxx: "clang++-7" }
|
||||||
- { os: "ubuntu-18.04", cc: "clang-6.0", cxx: "clang++-6.0" }
|
- { os: "ubuntu-20.04", cc: "clang-8", cxx: "clang++-8" }
|
||||||
- { os: "ubuntu-18.04", cc: "clang-7", cxx: "clang++-7" }
|
- { os: "ubuntu-20.04", cc: "clang-9", cxx: "clang++-9" }
|
||||||
- { os: "ubuntu-18.04", cc: "clang-8", cxx: "clang++-8" }
|
- { os: "ubuntu-20.04", cc: "clang-10", cxx: "clang++-10" }
|
||||||
- { os: "ubuntu-18.04", cc: "clang-9", cxx: "clang++-9" }
|
|
||||||
- { os: "ubuntu-18.04", cc: "clang-10", cxx: "clang++-10" }
|
|
||||||
name: "${{matrix.config.cxx}}"
|
name: "${{matrix.config.cxx}}"
|
||||||
steps:
|
steps:
|
||||||
- name: Setup
|
- name: Setup
|
||||||
|
|||||||
@@ -11,6 +11,17 @@ add_library(${PROJECT_NAME} INTERFACE)
|
|||||||
target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_17)
|
target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_17)
|
||||||
target_include_directories(${PROJECT_NAME} INTERFACE headers)
|
target_include_directories(${PROJECT_NAME} INTERFACE headers)
|
||||||
|
|
||||||
|
target_compile_options(${PROJECT_NAME}
|
||||||
|
INTERFACE
|
||||||
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
||||||
|
-Wno-c++98-compat-pedantic
|
||||||
|
-Wno-covered-switch-default
|
||||||
|
-Wno-ctad-maybe-unsupported
|
||||||
|
-Wno-old-style-cast
|
||||||
|
-Wno-shadow
|
||||||
|
-Wno-unknown-warning-option
|
||||||
|
-Wno-weak-vtables>)
|
||||||
|
|
||||||
if(BUILD_AS_STANDALONE)
|
if(BUILD_AS_STANDALONE)
|
||||||
option(BUILD_WITH_UNTESTS "Build with unit tests" ON)
|
option(BUILD_WITH_UNTESTS "Build with unit tests" ON)
|
||||||
if(BUILD_WITH_UNTESTS)
|
if(BUILD_WITH_UNTESTS)
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- [gcc](https://www.gnu.org/software/gcc/) **>= 7**
|
- [gcc](https://www.gnu.org/software/gcc/) **>= 7**
|
||||||
- [clang](https://clang.llvm.org/) **>= 5.0**
|
- [clang](https://clang.llvm.org/) **>= 7**
|
||||||
- [msvc](https://visualstudio.microsoft.com/) **>= 2017**
|
- [msvc](https://visualstudio.microsoft.com/) **>= 2017**
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|||||||
@@ -260,30 +260,28 @@ namespace enum_hpp::detail
|
|||||||
{ ENUM_HPP_GENERATE_NAMES(Fields) }\
|
{ ENUM_HPP_GENERATE_NAMES(Fields) }\
|
||||||
};\
|
};\
|
||||||
public:\
|
public:\
|
||||||
static constexpr underlying_type to_underlying(enum_type e) noexcept {\
|
[[maybe_unused]] static constexpr underlying_type to_underlying(enum_type e) noexcept {\
|
||||||
return static_cast<underlying_type>(e);\
|
return static_cast<underlying_type>(e);\
|
||||||
}\
|
}\
|
||||||
\
|
[[maybe_unused]] static constexpr std::optional<std::string_view> to_string(enum_type e) noexcept {\
|
||||||
static constexpr std::optional<std::string_view> to_string(enum_type e) noexcept {\
|
|
||||||
switch ( e ) {\
|
switch ( e ) {\
|
||||||
ENUM_HPP_GENERATE_VALUE_TO_NAME_CASES(Enum, Fields)\
|
ENUM_HPP_GENERATE_VALUE_TO_NAME_CASES(Enum, Fields)\
|
||||||
default: return std::nullopt;\
|
default: return std::nullopt;\
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
static constexpr std::string_view to_string_or_empty(enum_type e) noexcept {\
|
[[maybe_unused]] static constexpr std::string_view to_string_or_empty(enum_type e) noexcept {\
|
||||||
if ( auto s = to_string(e) ) {\
|
if ( auto s = to_string(e) ) {\
|
||||||
return *s;\
|
return *s;\
|
||||||
}\
|
}\
|
||||||
return ::enum_hpp::empty_string;\
|
return ::enum_hpp::empty_string;\
|
||||||
}\
|
}\
|
||||||
static std::string_view to_string_or_throw(enum_type e) {\
|
[[maybe_unused]] static std::string_view to_string_or_throw(enum_type e) {\
|
||||||
if ( auto s = to_string(e) ) {\
|
if ( auto s = to_string(e) ) {\
|
||||||
return *s;\
|
return *s;\
|
||||||
}\
|
}\
|
||||||
::enum_hpp::detail::throw_exception_with(#Enum "_traits::to_string_or_throw(): invalid argument");\
|
::enum_hpp::detail::throw_exception_with(#Enum "_traits::to_string_or_throw(): invalid argument");\
|
||||||
}\
|
}\
|
||||||
\
|
[[maybe_unused]] static constexpr std::optional<enum_type> from_string(std::string_view name) noexcept {\
|
||||||
static constexpr std::optional<enum_type> from_string(std::string_view name) noexcept {\
|
|
||||||
for ( std::size_t i = 0; i < size; ++i) {\
|
for ( std::size_t i = 0; i < size; ++i) {\
|
||||||
if ( name == names[i] ) {\
|
if ( name == names[i] ) {\
|
||||||
return values[i];\
|
return values[i];\
|
||||||
@@ -291,52 +289,49 @@ namespace enum_hpp::detail
|
|||||||
}\
|
}\
|
||||||
return std::nullopt;\
|
return std::nullopt;\
|
||||||
}\
|
}\
|
||||||
static constexpr enum_type from_string_or_default(std::string_view name, enum_type def) noexcept {\
|
[[maybe_unused]] static constexpr enum_type from_string_or_default(std::string_view name, enum_type def) noexcept {\
|
||||||
if ( auto e = from_string(name) ) {\
|
if ( auto e = from_string(name) ) {\
|
||||||
return *e;\
|
return *e;\
|
||||||
}\
|
}\
|
||||||
return def;\
|
return def;\
|
||||||
}\
|
}\
|
||||||
static enum_type from_string_or_throw(std::string_view name) {\
|
[[maybe_unused]] static enum_type from_string_or_throw(std::string_view name) {\
|
||||||
if ( auto e = from_string(name) ) {\
|
if ( auto e = from_string(name) ) {\
|
||||||
return *e;\
|
return *e;\
|
||||||
}\
|
}\
|
||||||
::enum_hpp::detail::throw_exception_with(#Enum "_traits::from_string_or_throw(): invalid argument");\
|
::enum_hpp::detail::throw_exception_with(#Enum "_traits::from_string_or_throw(): invalid argument");\
|
||||||
}\
|
}\
|
||||||
\
|
[[maybe_unused]] static constexpr std::optional<std::size_t> to_index(enum_type e) noexcept {\
|
||||||
static constexpr std::optional<std::size_t> to_index(enum_type e) noexcept {\
|
|
||||||
switch ( e ) {\
|
switch ( e ) {\
|
||||||
ENUM_HPP_GENERATE_VALUE_TO_INDEX_CASES(Enum, Fields)\
|
ENUM_HPP_GENERATE_VALUE_TO_INDEX_CASES(Enum, Fields)\
|
||||||
default: return std::nullopt;\
|
default: return std::nullopt;\
|
||||||
}\
|
}\
|
||||||
}\
|
}\
|
||||||
\
|
[[maybe_unused]] static constexpr std::size_t to_index_or_invalid(enum_type e) noexcept {\
|
||||||
static constexpr std::size_t to_index_or_invalid(enum_type e) noexcept {\
|
|
||||||
if ( auto i = to_index(e) ) {\
|
if ( auto i = to_index(e) ) {\
|
||||||
return *i;\
|
return *i;\
|
||||||
}\
|
}\
|
||||||
return ::enum_hpp::invalid_index;\
|
return ::enum_hpp::invalid_index;\
|
||||||
}\
|
}\
|
||||||
static std::size_t to_index_or_throw(enum_type e) {\
|
[[maybe_unused]] static std::size_t to_index_or_throw(enum_type e) {\
|
||||||
if ( auto i = to_index(e) ) {\
|
if ( auto i = to_index(e) ) {\
|
||||||
return *i;\
|
return *i;\
|
||||||
}\
|
}\
|
||||||
::enum_hpp::detail::throw_exception_with(#Enum "_traits::to_index_or_throw(): invalid argument");\
|
::enum_hpp::detail::throw_exception_with(#Enum "_traits::to_index_or_throw(): invalid argument");\
|
||||||
}\
|
}\
|
||||||
\
|
[[maybe_unused]] static constexpr std::optional<enum_type> from_index(std::size_t index) noexcept {\
|
||||||
static constexpr std::optional<enum_type> from_index(std::size_t index) noexcept {\
|
|
||||||
if ( index < size ) {\
|
if ( index < size ) {\
|
||||||
return values[index];\
|
return values[index];\
|
||||||
}\
|
}\
|
||||||
return std::nullopt;\
|
return std::nullopt;\
|
||||||
}\
|
}\
|
||||||
static constexpr enum_type from_index_or_default(std::size_t index, enum_type def) noexcept {\
|
[[maybe_unused]] static constexpr enum_type from_index_or_default(std::size_t index, enum_type def) noexcept {\
|
||||||
if ( auto e = from_index(index) ) {\
|
if ( auto e = from_index(index) ) {\
|
||||||
return *e;\
|
return *e;\
|
||||||
}\
|
}\
|
||||||
return def;\
|
return def;\
|
||||||
}\
|
}\
|
||||||
static enum_type from_index_or_throw(std::size_t index) {\
|
[[maybe_unused]] static enum_type from_index_or_throw(std::size_t index) {\
|
||||||
if ( auto e = from_index(index) ) {\
|
if ( auto e = from_index(index) ) {\
|
||||||
return *e;\
|
return *e;\
|
||||||
}\
|
}\
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ namespace enum_hpp::bitflags
|
|||||||
constexpr bitflags& toggle(bitflags flags) noexcept {
|
constexpr bitflags& toggle(bitflags flags) noexcept {
|
||||||
flags_ ^= flags.flags_;
|
flags_ ^= flags.flags_;
|
||||||
return *this;
|
return *this;
|
||||||
};
|
}
|
||||||
|
|
||||||
constexpr bitflags& clear(bitflags flags) noexcept {
|
constexpr bitflags& clear(bitflags flags) noexcept {
|
||||||
flags_ &= ~flags.flags_;
|
flags_ &= ~flags.flags_;
|
||||||
|
|||||||
@@ -25,7 +25,10 @@ target_compile_options(${PROJECT_NAME}
|
|||||||
$<$<CXX_COMPILER_ID:MSVC>:
|
$<$<CXX_COMPILER_ID:MSVC>:
|
||||||
/WX /W4>
|
/WX /W4>
|
||||||
PRIVATE
|
PRIVATE
|
||||||
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
$<$<CXX_COMPILER_ID:GNU>:
|
||||||
-Werror -Wall -Wextra -Wpedantic>)
|
-Werror -Wall -Wextra -Wpedantic>
|
||||||
|
PRIVATE
|
||||||
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
||||||
|
-Werror -Weverything -Wconversion>)
|
||||||
|
|
||||||
add_test(${PROJECT_NAME} ${PROJECT_NAME})
|
add_test(${PROJECT_NAME} ${PROJECT_NAME})
|
||||||
|
|||||||
Reference in New Issue
Block a user