Skip to content

Commit

Permalink
ci
Browse files Browse the repository at this point in the history
  • Loading branch information
p-groarke committed Mar 24, 2024
1 parent f4b42a4 commit 232879f
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 48 deletions.
107 changes: 62 additions & 45 deletions include_cpp17/fea/enum/enum_to_strings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,26 @@ inline my_enum from_string(...);
See unit tests for examples.
*/
#if FEA_MACOS
// Clang complains about braces around lambdas, which is silly.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-braces"
#endif
// #if FEA_MACOS
//// Clang complains about braces around lambdas, which is silly.
// #pragma clang diagnostic push
// #pragma clang diagnostic ignored "-Wmissing-braces"
// #endif

// Silence clang?
#define FEA_DETAIL_STRINGIFY_SV(name) std::string_view{ FEA_STRINGIFY(name) },
#define FEA_DETAIL_WSTRINGIFY_SV(name) \
std::wstring_view{ FEA_WSTRINGIFY(name) },
#define FEA_DETAIL_U16STRINGIFY_SV(name) \
std::u16string_view{ FEA_U16STRINGIFY(name) },
#define FEA_DETAIL_U32STRINGIFY_SV(name) \
std::u32string_view{ FEA_U32STRINGIFY(name) },
#define FEA_DETAIL_STRINGIFY_STR(name) std::string{ FEA_STRINGIFY(name) },
#define FEA_DETAIL_WSTRINGIFY_STR(name) std::wstring{ FEA_WSTRINGIFY(name) },
#define FEA_DETAIL_U16STRINGIFY_STR(name) \
std::u16string{ FEA_U16STRINGIFY(name) },
#define FEA_DETAIL_U32STRINGIFY_STR(name) \
std::u32string{ FEA_U32STRINGIFY(name) },

#define FEA_DETAIL_LOOKUP_PAIR(name) { FEA_STRINGIFY(name), enum_type::name },
#define FEA_DETAIL_WLOOKUP_PAIR(name) { FEA_WSTRINGIFY(name), enum_type::name },
Expand All @@ -79,6 +94,45 @@ See unit tests for examples.
#define FEA_STRING_ENUM(enum_t, underlying_t, ...) \
/* Declare your enum. */ \
enum class enum_t : underlying_t { __VA_ARGS__ }; \
/* Implement to_string for all supported string types. */ \
inline auto to_string(enum_t e__) { \
using namespace std::literals::string_view_literals; \
static constexpr size_t N = FEA_SIZEOF_VAARGS(__VA_ARGS__); \
static constexpr fea::enum_array<std::string_view, enum_t, N> sv_arr{ \
FEA_FOR_EACH(FEA_DETAIL_STRINGIFY_SV, __VA_ARGS__) \
}; \
static constexpr fea::enum_array<std::wstring_view, enum_t, N> \
wsv_arr{ FEA_FOR_EACH( \
FEA_DETAIL_WSTRINGIFY_SV, __VA_ARGS__) }; \
static constexpr fea::enum_array<std::u16string_view, enum_t, N> \
u16sv_arr{ FEA_FOR_EACH( \
FEA_DETAIL_U16STRINGIFY_SV, __VA_ARGS__) }; \
static constexpr fea::enum_array<std::u32string_view, enum_t, N> \
u32sv_arr{ FEA_FOR_EACH( \
FEA_DETAIL_U32STRINGIFY_SV, __VA_ARGS__) }; \
static const fea::enum_array<std::string, enum_t, N> str_arr{ \
FEA_FOR_EACH(FEA_DETAIL_STRINGIFY_STR, __VA_ARGS__) \
}; \
static const fea::enum_array<std::wstring, enum_t, N> wstr_arr{ \
FEA_FOR_EACH(FEA_DETAIL_WSTRINGIFY_STR, __VA_ARGS__) \
}; \
static const fea::enum_array<std::u16string, enum_t, N> u16str_arr{ \
FEA_FOR_EACH(FEA_DETAIL_U16STRINGIFY_STR, __VA_ARGS__) \
}; \
static const fea::enum_array<std::u32string, enum_t, N> u32str_arr{ \
FEA_FOR_EACH(FEA_DETAIL_U32STRINGIFY_STR, __VA_ARGS__) \
}; \
return fea::return_overload{ \
[=]() -> std::string_view { return sv_arr[e__]; }, \
[=]() -> std::wstring_view { return wsv_arr[e__]; }, \
[=]() -> std::u16string_view { return u16sv_arr[e__]; }, \
[=]() -> std::u32string_view { return u32sv_arr[e__]; }, \
[=]() -> const std::string& { return str_arr[e__]; }, \
[=]() -> const std::wstring& { return wstr_arr[e__]; }, \
[=]() -> const std::u16string& { return u16str_arr[e__]; }, \
[=]() -> const std::u32string& { return u32str_arr[e__]; }, \
}; \
} \
/* Implement from_string for all supported string types. */ \
inline enum_t from_string(std::string_view s__) { \
using enum_type = enum_t; \
Expand Down Expand Up @@ -135,45 +189,8 @@ See unit tests for examples.
FEA_FOR_EACH(FEA_DETAIL_U32LOOKUP_PAIR, __VA_ARGS__) \
}; \
return lookup.at(s__); \
} \
/* Implement to_string for all supported string types. */ \
inline auto to_string(enum_t e__) { \
static constexpr size_t N = FEA_SIZEOF_VAARGS(__VA_ARGS__); \
static constexpr fea::enum_array<std::string_view, enum_t, N> sv_arr{ \
FEA_FOR_EACH(FEA_STRINGIFY_COMMA, __VA_ARGS__) \
}; \
static constexpr fea::enum_array<std::wstring_view, enum_t, N> \
wsv_arr{ FEA_FOR_EACH(FEA_WSTRINGIFY_COMMA, __VA_ARGS__) }; \
static constexpr fea::enum_array<std::u16string_view, enum_t, N> \
u16sv_arr{ FEA_FOR_EACH( \
FEA_U16STRINGIFY_COMMA, __VA_ARGS__) }; \
static constexpr fea::enum_array<std::u32string_view, enum_t, N> \
u32sv_arr{ FEA_FOR_EACH( \
FEA_U32STRINGIFY_COMMA, __VA_ARGS__) }; \
static const fea::enum_array<std::string, enum_t, N> str_arr{ \
FEA_FOR_EACH(FEA_STRINGIFY_COMMA, __VA_ARGS__) \
}; \
static const fea::enum_array<std::wstring, enum_t, N> wstr_arr{ \
FEA_FOR_EACH(FEA_WSTRINGIFY_COMMA, __VA_ARGS__) \
}; \
static const fea::enum_array<std::u16string, enum_t, N> u16str_arr{ \
FEA_FOR_EACH(FEA_U16STRINGIFY_COMMA, __VA_ARGS__) \
}; \
static const fea::enum_array<std::u32string, enum_t, N> u32str_arr{ \
FEA_FOR_EACH(FEA_U32STRINGIFY_COMMA, __VA_ARGS__) \
}; \
return fea::return_overload{ \
[=]() -> std::string_view { return sv_arr[e__]; }, \
[=]() -> std::wstring_view { return wsv_arr[e__]; }, \
[=]() -> std::u16string_view { return u16sv_arr[e__]; }, \
[=]() -> std::u32string_view { return u32sv_arr[e__]; }, \
[=]() -> const std::string& { return str_arr[e__]; }, \
[=]() -> const std::wstring& { return wstr_arr[e__]; }, \
[=]() -> const std::u16string& { return u16str_arr[e__]; }, \
[=]() -> const std::u32string& { return u32str_arr[e__]; }, \
}; \
}

#if FEA_MACOS
#pragma clang diagnostic pop
#endif
// #if FEA_MACOS
// #pragma clang diagnostic pop
// #endif
28 changes: 25 additions & 3 deletions include_cpp17/fea/meta/return_overload.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,27 @@ With return_overload, you can overload by return type.
See unit tests for examples.
*/

// #if FEA_MACOS
//// Clang complains about braces around lambdas, which is silly.
// #pragma clang diagnostic push
// #pragma clang diagnostic ignored "-Wmissing-braces"
// #endif

namespace fea {
namespace detail {
template <class T>
using has_const_paren = decltype(std::declval<const T&>()());

template <class T, bool IsConst>
template <class, bool IsConst>
struct ro_expose_const;

template <class T>
struct ro_expose_const<T, true> : T {
using overload_t = decltype(std::declval<T>()());

operator overload_t() const noexcept(noexcept(std::declval<T>()())) {
// Fix VS2017?
operator decltype(std::declval<T>()())() const
noexcept(noexcept(std::declval<T>()())) {
return T::operator()();
}
};
Expand All @@ -67,7 +75,8 @@ template <class T>
struct ro_expose_const<T, false> : T {
using overload_t = decltype(std::declval<T>()());

operator overload_t() noexcept(noexcept(std::declval<T>()())) {
operator decltype(std::declval<T>()())() noexcept(
noexcept(std::declval<T>()())) {
return T::operator()();
}
};
Expand All @@ -80,6 +89,11 @@ struct return_overload
using overload_t = typename base_t::overload_t;
using base_t::operator typename base_t::overload_t;
};

// Fix gcc?
template <class T>
using moverloaded_t = typename detail::return_overload<T>::overload_t;

} // namespace detail

template <class... Ts>
Expand All @@ -91,5 +105,13 @@ struct return_overload : detail::return_overload<Ts>... {

template <class... Ts>
return_overload(Ts...) -> return_overload<Ts...>;
// template <class... Ts>
// return_overload(const Ts&...) -> return_overload<Ts...>;
// template <class... Ts>
// return_overload(Ts&&...) -> return_overload<Ts...>;

} // namespace fea

// #if FEA_MACOS
// #pragma clang diagnostic pop
// #endif
76 changes: 76 additions & 0 deletions tests_cpp17/enum/enum_to_strings.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,82 @@
#include <fea/enum/enum_to_strings.hpp>
#include <gtest/gtest.h>

// inline auto to_string(enum_t e__) {
// using namespace std::literals::string_view_literals;
// static constexpr size_t N = FEA_SIZEOF_VAARGS(__VA_ARGS__);
// static constexpr fea::enum_array<std::string_view, enum_t, N> sv_arr{
// FEA_FOR_EACH(FEA_STRINGIFY_COMMA, __VA_ARGS__)
// };
// static constexpr fea::enum_array<std::wstring_view, enum_t, N> wsv_arr{
// FEA_FOR_EACH(FEA_WSTRINGIFY_COMMA, __VA_ARGS__)
// };
// static constexpr fea::enum_array<std::u16string_view, enum_t, N> u16sv_arr{
// FEA_FOR_EACH(FEA_U16STRINGIFY_COMMA, __VA_ARGS__)
// };
// static constexpr fea::enum_array<std::u32string_view, enum_t, N> u32sv_arr{
// FEA_FOR_EACH(FEA_U32STRINGIFY_COMMA, __VA_ARGS__)
// };
// static const fea::enum_array<std::string, enum_t, N> str_arr{ FEA_FOR_EACH(
// FEA_STRINGIFY_COMMA, __VA_ARGS__) };
// static const fea::enum_array<std::wstring, enum_t, N> wstr_arr{
// FEA_FOR_EACH(FEA_WSTRINGIFY_COMMA, __VA_ARGS__)
// };
// static const fea::enum_array<std::u16string, enum_t, N> u16str_arr{
// FEA_FOR_EACH(FEA_U16STRINGIFY_COMMA, __VA_ARGS__)
// };
// static const fea::enum_array<std::u32string, enum_t, N> u32str_arr{
// FEA_FOR_EACH(FEA_U32STRINGIFY_COMMA, __VA_ARGS__)
// };
// return fea::return_overload{
// [=]() -> std::string_view { return sv_arr[e__]; },
// [=]() -> std::wstring_view { return wsv_arr[e__]; },
// [=]() -> std::u16string_view { return u16sv_arr[e__]; },
// [=]() -> std::u32string_view { return u32sv_arr[e__]; },
// [=]() -> const std::string& { return str_arr[e__]; },
// [=]() -> const std::wstring& { return wstr_arr[e__]; },
// [=]() -> const std::u16string& { return u16str_arr[e__]; },
// [=]() -> const std::u32string& { return u32str_arr[e__]; },
// };
// }

// inline auto to_string(enum_t e__) {
// using namespace std::literals::string_view_literals;
// static constexpr size_t N = FEA_SIZEOF_VAARGS(__VA_ARGS__);
// static constexpr fea::enum_array<std::string_view, enum_t, N> sv_arr{
// FEA_FOR_EACH(FEA_DETAIL_STRINGIFY_SV, __VA_ARGS__)
// };
// static constexpr fea::enum_array<std::wstring_view, enum_t, N> wsv_arr{
// FEA_FOR_EACH(FEA_DETAIL_WSTRINGIFY_SV, __VA_ARGS__)
// };
// static constexpr fea::enum_array<std::u16string_view, enum_t, N> u16sv_arr{
// FEA_FOR_EACH(FEA_DETAIL_U16STRINGIFY_SV, __VA_ARGS__)
// };
// static constexpr fea::enum_array<std::u32string_view, enum_t, N> u32sv_arr{
// FEA_FOR_EACH(FEA_DETAIL_U32STRINGIFY_SV, __VA_ARGS__)
// };
// static const fea::enum_array<std::string, enum_t, N> str_arr{ FEA_FOR_EACH(
// FEA_DETAIL_STRINGIFY_BRACE, __VA_ARGS__) };
// static const fea::enum_array<std::wstring, enum_t, N> wstr_arr{
// FEA_FOR_EACH(FEA_DETAIL_WSTRINGIFY_BRACE, __VA_ARGS__)
// };
// static const fea::enum_array<std::u16string, enum_t, N> u16str_arr{
// FEA_FOR_EACH(FEA_DETAIL_U16STRINGIFY_BRACE, __VA_ARGS__)
// };
// static const fea::enum_array<std::u32string, enum_t, N> u32str_arr{
// FEA_FOR_EACH(FEA_DETAIL_U32STRINGIFY_BRACE, __VA_ARGS__)
// };
// return fea::return_overload{
// [=]() -> std::string_view { return sv_arr[e__]; },
// [=]() -> std::wstring_view { return wsv_arr[e__]; },
// [=]() -> std::u16string_view { return u16sv_arr[e__]; },
// [=]() -> std::u32string_view { return u32sv_arr[e__]; },
// [=]() -> const std::string& { return str_arr[e__]; },
// [=]() -> const std::wstring& { return wstr_arr[e__]; },
// [=]() -> const std::u16string& { return u16str_arr[e__]; },
// [=]() -> const std::u32string& { return u32str_arr[e__]; },
// };
// }

namespace {
FEA_STRING_ENUM(my_enum, unsigned, potato, tomato)

Expand Down

0 comments on commit 232879f

Please sign in to comment.