Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
05e652d
support CMake modules
fdr400 May 9, 2026
fafc629
add public interface exports
fdr400 May 9, 2026
67d104d
fix example build
fdr400 May 9, 2026
d543e3c
add module test support
fdr400 May 9, 2026
83aeecf
add CI tests
fdr400 May 9, 2026
cce1cd4
fix build with libc++
fdr400 May 9, 2026
f7fda36
fix bazel include dir
fdr400 May 9, 2026
b9f1e62
add ninja generator
fdr400 May 9, 2026
db747d1
fix bazel include dir
fdr400 May 9, 2026
55445a8
fix bazel include dir
fdr400 May 9, 2026
97e1997
add module usage example
fdr400 May 10, 2026
d7c80cf
add module usage sample
fdr400 May 10, 2026
6354331
fix installed testing
fdr400 May 10, 2026
2502797
add install module test
fdr400 May 10, 2026
17e6ad8
better workflow names
fdr400 May 10, 2026
22a4826
try use clang++-19 in module install test
fdr400 May 10, 2026
0aff5d0
add ctest run in install
fdr400 May 10, 2026
185b98c
Merge branch 'master' of github.com:fdr400/magic_enum into feature/cx…
fdr400 May 13, 2026
2302964
Merge branch 'master' of github.com:fdr400/magic_enum into feature/cx…
fdr400 May 22, 2026
6ca87fb
try use import style
fdr400 May 22, 2026
f42c896
remove export
fdr400 May 22, 2026
c0f42c1
add missing declarations
fdr400 May 22, 2026
97835a7
improve using aliases
fdr400 May 22, 2026
ee42b88
rollback ifndef
fdr400 May 22, 2026
fd29b17
rollback BAZEL
fdr400 May 22, 2026
437855d
less diff
fdr400 May 22, 2026
e466c9f
less diff
fdr400 May 22, 2026
496eb92
fix import std build
fdr400 May 22, 2026
056a648
add import std test to CI
fdr400 May 22, 2026
4437807
use Ubuntu codename
fdr400 May 22, 2026
c174878
fix standard for import std
fdr400 May 22, 2026
9afd713
try fix clang-16
fdr400 May 22, 2026
283490e
set extensions before
fdr400 May 22, 2026
6a6488a
try use explicit path to modules json
fdr400 May 22, 2026
c97f1a5
test import std only for clang-19
fdr400 May 22, 2026
88bebf0
fix typo
fdr400 May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 67 additions & 43 deletions .github/workflows/ubuntu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,27 @@ jobs:
fail-fast: false
matrix:
compiler:
- { cc: "gcc-11", cxx: "g++-11", os: "ubuntu-22.04", nonascii: "TRUE" }
- { cc: "gcc-11", cxx: "g++-11", os: "ubuntu-22.04", nonascii: "FALSE" }
- { cc: "gcc-12", cxx: "g++-12", os: "ubuntu-22.04", nonascii: "FALSE" }
- { cc: "gcc-13", cxx: "g++-13", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "gcc-14", cxx: "g++-14", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "gcc-15", cxx: "g++-15", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "clang-13", cxx: "clang++-13", os: "ubuntu-22.04", nonascii: "FALSE" }
- { cc: "clang-14", cxx: "clang++-14", os: "ubuntu-22.04", nonascii: "FALSE" }
- { cc: "clang-15", cxx: "clang++-15", os: "ubuntu-22.04", nonascii: "FALSE" }
- { cc: "clang-16", cxx: "clang++-16", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "clang-17", cxx: "clang++-17", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "clang-18", cxx: "clang++-18", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "clang-19", cxx: "clang++-19", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "clang-20", cxx: "clang++-20", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "clang-21", cxx: "clang++-21", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "clang-22", cxx: "clang++-22", os: "ubuntu-24.04", nonascii: "FALSE" }
- { cc: "gcc-11", cxx: "g++-11", os: "ubuntu-22.04", nonascii: "TRUE", modules: "FALSE", import_std: "FALSE" }
- { cc: "gcc-11", cxx: "g++-11", os: "ubuntu-22.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "gcc-12", cxx: "g++-12", os: "ubuntu-22.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "gcc-13", cxx: "g++-13", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "gcc-14", cxx: "g++-14", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "gcc-15", cxx: "g++-15", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-13", cxx: "clang++-13", os: "ubuntu-22.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-14", cxx: "clang++-14", os: "ubuntu-22.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-15", cxx: "clang++-15", os: "ubuntu-22.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-16", cxx: "clang++-16", os: "ubuntu-22.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-17", cxx: "clang++-17", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-18", cxx: "clang++-18", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-19", cxx: "clang++-19", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-19", cxx: "clang++-19", os: "ubuntu-24.04", nonascii: "FALSE", modules: "TRUE", import_std: "FALSE" }
- { cc: "clang-19", cxx: "clang++-19", os: "ubuntu-24.04", nonascii: "FALSE", modules: "TRUE", import_std: "TRUE" }
- { cc: "clang-20", cxx: "clang++-20", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-21", cxx: "clang++-21", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-22", cxx: "clang++-22", os: "ubuntu-24.04", nonascii: "FALSE", modules: "FALSE", import_std: "FALSE" }
- { cc: "clang-22", cxx: "clang++-22", os: "ubuntu-24.04", nonascii: "FALSE", modules: "TRUE", import_std: "FALSE" }

name: "${{ format('{0} NONASCII={1}', matrix.compiler.cc, matrix.compiler.nonascii) }}"
name: "${{ format('{0} NONASCII={1} MODULES={2} IMPORT_STD={3}', matrix.compiler.cc, matrix.compiler.nonascii, matrix.compiler.modules, matrix.compiler.import_std) }}"
runs-on: ${{ matrix.compiler.os }}
steps:
- uses: actions/checkout@v6
Expand All @@ -36,24 +39,23 @@ jobs:
run: |
if [[ "${{ matrix.compiler.cc }}" == "clang"* ]]; then
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
# Add repositories based on Ubuntu version
if [[ "${{ matrix.compiler.os }}" == "ubuntu-22.04" ]]; then
sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-13 main"
sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-14 main"
sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-15 main"
sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main"
sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main"
sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-18 main"
sudo apt-add-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy main"
elif [[ "${{ matrix.compiler.os }}" == "ubuntu-24.04" ]]; then
sudo apt-add-repository "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main"
sudo apt-add-repository "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-20 main"
sudo apt-add-repository "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-21 main"
sudo apt-add-repository "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-22 main"
sudo apt-add-repository "deb http://apt.llvm.org/noble/ llvm-toolchain-noble main"
fi

clang_version="${{ matrix.compiler.cc }}"
clang_version="${clang_version#clang-}"
ubuntu_codename="$(lsb_release -cs)"

sudo apt-add-repository "deb http://apt.llvm.org/${ubuntu_codename}/ llvm-toolchain-${ubuntu_codename}-${clang_version} main"
sudo apt update
sudo apt install ${{ matrix.compiler.cc }} -y

if [[ "${{ matrix.compiler.import_std }}" == "TRUE" ]]; then
# Note: std module is currently supported only with libc++
sudo apt install -y \
"libclang-rt-${clang_version}-dev" \
"libc++-${clang_version}-dev" \
"libc++abi-${clang_version}-dev" \
"clang-tools-${clang_version}"
fi
fi

- name: Configure gcc
Expand All @@ -67,20 +69,42 @@ jobs:
- name: Build Release
run: |
rm -rf build
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} -DMAGIC_ENUM_OPT_ENABLE_NONASCII:BOOL=${{ matrix.compiler.nonascii }}
cmake --build . -j 4 --config Release
ctest --output-on-failure -C Release
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} \
-DMAGIC_ENUM_OPT_ENABLE_NONASCII:BOOL=${{ matrix.compiler.nonascii }} \
-DMAGIC_ENUM_USE_MODULES:BOOL=${{ matrix.compiler.modules }} \
${{ matrix.compiler.modules == 'TRUE' && '-G Ninja' || '' }}
cmake --build build -j 4 --config Release
ctest --test-dir build --output-on-failure -C Release

- name: Build Debug
run: |
rm -rf build
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} -DMAGIC_ENUM_OPT_ENABLE_NONASCII:BOOL=${{ matrix.compiler.nonascii }}
cmake --build . -j 4 --config Debug
ctest --output-on-failure -C Debug
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} \
-DMAGIC_ENUM_OPT_ENABLE_NONASCII:BOOL=${{ matrix.compiler.nonascii }} \
-DMAGIC_ENUM_USE_MODULES:BOOL=${{ matrix.compiler.modules }} \
${{ matrix.compiler.modules == 'TRUE' && '-G Ninja' || '' }}
cmake --build build -j 4 --config Debug
ctest --test-dir build --output-on-failure -C Debug

- name: Build with `import std;`
if: ${{matrix.compiler.import_std == 'TRUE'}}
run: |
rm -rf build
cmake -S . -B build \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} \
-DMAGIC_ENUM_USE_MODULES:BOOL=TRUE \
-GNinja \
-DCMAKE_CXX_MODULE_STD:BOOL=TRUE \
-DCMAKE_EXPERIMENTAL_CXX_IMPORT_STD:STRING=0e5b6991-d74f-4b3d-a41c-cf096e0b2508 \
-DCMAKE_CXX_FLAGS:STRING="-stdlib=libc++" \
-DCMAKE_CXX_STANDARD=23
cmake --build build -j 4 --config Debug
ctest --test-dir build --output-on-failure -C Debug

- name: Bazel Test
working-directory: test
Expand Down
36 changes: 36 additions & 0 deletions .github/workflows/ubuntu_test_installed_version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,42 @@ jobs:
cd build2
ctest --build-config Debug -j$(nproc)
- name: clear
run: rm -rf build2

- name: configure clang
run: |
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-add-repository "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-19 main"
sudo apt update
sudo apt install clang-19 -y
- name: install module library
run: |
cmake -S. -Bbuild \
-GNinja \
--log-level=DEBUG \
-DCMAKE_INSTALL_PREFIX=./install_dir_module \
-DMAGIC_ENUM_USE_MODULES=ON \
-DCMAKE_CXX_COMPILER=clang++-19
cmake --build build --target magic_enum
cmake --install build
rm -rf build
- name: configure with installed module version via cmake
run: |
CMAKE_PREFIX_PATH="./install_dir_module" cmake -S. -Bbuild2 \
-GNinja \
-DMAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=1 \
-DCMAKE_CXX_COMPILER=clang++-19 \
--log-level=DEBUG
- name: build with installed module version via cmake
run: cmake --build build2 -j$(nproc) --target test_flags-cpp20 --verbose

- name: test
run: ctest --test-dir build2 -VV -R test_flags-cpp20

- name: clear
run: rm -rf build2

Expand Down
81 changes: 76 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
cmake_minimum_required(VERSION 3.14)
cmake_minimum_required(VERSION 3.14...4.20)

if(MAGIC_ENUM_USE_MODULES)
set(CMAKE_CXX_EXTENSIONS OFF)
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 20)
endif()
endif()

project(
magic_enum
Expand Down Expand Up @@ -35,20 +42,65 @@ a local magic_enum via pkgconfig" NO
)

if(${MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION} OR ${MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG})
enable_testing()
add_subdirectory(test)
return()
endif()

set(INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/include/magic_enum")
set(MODULE "${CMAKE_CURRENT_SOURCE_DIR}/module")
set(EXPORT_NAMESPACE "${PROJECT_NAME}::")

add_library(${PROJECT_NAME} INTERFACE)
add_library(${EXPORT_NAMESPACE}${PROJECT_NAME} ALIAS ${PROJECT_NAME})
function(magic_enum_make_library name)

if(MAGIC_ENUM_USE_MODULES)
add_library(${name})
target_sources(${name}
PUBLIC
FILE_SET CXX_MODULES
BASE_DIRS "${MODULE}"
FILES "${MODULE}/magic_enum.cppm"
PUBLIC
FILE_SET HEADERS
BASE_DIRS "${INCLUDES}"
FILES
"${INCLUDES}/magic_enum.hpp"
"${INCLUDES}/magic_enum_all.hpp"
"${INCLUDES}/magic_enum_containers.hpp"
"${INCLUDES}/magic_enum_flags.hpp"
"${INCLUDES}/magic_enum_format.hpp"
"${INCLUDES}/magic_enum_fuse.hpp"
"${INCLUDES}/magic_enum_iostream.hpp"
"${INCLUDES}/magic_enum_switch.hpp"
"${INCLUDES}/magic_enum_utility.hpp"
)
target_compile_features(${name} PUBLIC cxx_std_20)
target_compile_definitions(${name}
PUBLIC MAGIC_ENUM_USE_MODULES
PRIVATE ${ARGN}
)
if((CMAKE_CXX_STANDARD IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD) AND CMAKE_CXX_MODULE_STD)
message("${name}: using import std")
target_compile_features(${name} PRIVATE cxx_std_23)
target_compile_definitions(${name} PRIVATE MAGIC_ENUM_USE_STD_MODULE)
endif()

set(__scope PUBLIC)
else()
add_library(${name} INTERFACE)
set(__scope INTERFACE)
endif()

add_library(${EXPORT_NAMESPACE}${name} ALIAS ${name})
target_include_directories(
${PROJECT_NAME} INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
${name} ${__scope} $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

endfunction()

magic_enum_make_library(${PROJECT_NAME})

if(MAGIC_ENUM_OPT_BUILD_EXAMPLES)
add_subdirectory(example)
endif()
Expand All @@ -64,11 +116,13 @@ if(MAGIC_ENUM_OPT_INSTALL)
include(CPackComponent)
include(CMakePackageConfigHelpers)

if(NOT MAGIC_ENUM_USE_MODULES)

install(
TARGETS "${PROJECT_NAME}"
EXPORT ${PROJECT_NAME}
INCLUDES
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
# COMPONENT "${SDK_COMPONENT_NAME}" # component is not allowed for
# includes!
# Headers are installed separately! Includes only marks the headers for
Expand All @@ -86,6 +140,23 @@ if(MAGIC_ENUM_OPT_INSTALL)
PATTERN "${PROJECT_INCLUDE_HEADER_PATTERN}"
)

else()

install(
TARGETS "${PROJECT_NAME}"
EXPORT ${PROJECT_NAME}
INCLUDES
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
FILE_SET HEADERS
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}"
FILE_SET CXX_MODULES
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}"
CXX_MODULES_BMI
DESTINATION ""
)

endif()

set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
set(CPACK_PACKAGE_DESCRIPTION "${PROJECT_DESCRIPTION}")
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "all")
Expand Down
7 changes: 6 additions & 1 deletion example/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
include(CheckCXXCompilerFlag)

set(CMAKE_CXX_STANDARD 17)
if(NOT MAGIC_ENUM_USE_MODULES)
set(CMAKE_CXX_STANDARD 17)
endif()
if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
set(OPTIONS -Wall -Wextra -Wshadow -pedantic-errors -Werror)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
Expand Down Expand Up @@ -28,3 +30,6 @@ make_example(example_switch)
if(MAGIC_ENUM_OPT_ENABLE_NONASCII)
make_example(example_nonascii_name)
endif()
if(MAGIC_ENUM_USE_MODULES)
make_example(example_module_usage)
endif()
1 change: 1 addition & 0 deletions example/enum_flag_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

#include <cstdint>
#include <iostream>
#include <string>

Expand Down
1 change: 1 addition & 0 deletions example/example_containers_array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

#include <cstdint>
#include <iostream>

#include <magic_enum/magic_enum_containers.hpp>
Expand Down
44 changes: 44 additions & 0 deletions example/example_module_usage.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Licensed under the MIT License <http://opensource.org/licenses/MIT>.
// SPDX-License-Identifier: MIT
// Copyright (c) 2019 - 2024 Daniil Goncharov <neargye@gmail.com>.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

#include <iostream>

import magic_enum;

enum class Color : int { RED = -10, BLUE = 0, GREEN = 10 };

int main() {
for (const auto c : magic_enum::enum_values<Color>()) {
std::cout << magic_enum::enum_name(c) << '\n';
}

constexpr auto result = magic_enum::enum_integer(Color::RED) + magic_enum::enum_integer(Color::GREEN);
if (result == magic_enum::enum_integer(Color::BLUE)) {
std::cout << "RED + GREEN == BLUE\n";
}

using magic_enum::iostream_operators::operator<<;
constexpr auto c = Color::GREEN;
std::cout << "Color: " << Color::RED << " " << c << '\n';

return 0;
}
2 changes: 2 additions & 0 deletions example/example_switch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

#include <cassert>
#include <iostream>
#include <optional>

#define MAGIC_ENUM_ENABLE_HASH
#include <magic_enum/magic_enum_switch.hpp>
Expand Down
Loading