mirror of
https://github.com/red0124/ssp.git
synced 2025-01-23 04:55:20 +01:00
add variant support
This commit is contained in:
parent
879c726964
commit
bf92abdb2c
@ -7,6 +7,7 @@
|
|||||||
#include <optional>
|
#include <optional>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <variant>
|
||||||
|
|
||||||
namespace ss {
|
namespace ss {
|
||||||
|
|
||||||
@ -315,7 +316,8 @@ struct unsupported_type {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
std::enable_if_t<!std::is_integral_v<T> && !std::is_floating_point_v<T> &&
|
std::enable_if_t<!std::is_integral_v<T> && !std::is_floating_point_v<T> &&
|
||||||
!is_instance_of<T, std::optional>::value,
|
!is_instance_of<T, std::optional>::value &&
|
||||||
|
!is_instance_of<T, std::variant>::value,
|
||||||
bool>
|
bool>
|
||||||
extract(const char*, const char*, T&) {
|
extract(const char*, const char*, T&) {
|
||||||
static_assert(error::unsupported_type<T>::value,
|
static_assert(error::unsupported_type<T>::value,
|
||||||
@ -346,6 +348,25 @@ std::enable_if_t<is_instance_of<T, std::optional>::value, bool> extract(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, size_t I>
|
||||||
|
bool extract_variant(const char* begin, const char* end, T& value) {
|
||||||
|
using IthType = std::variant_alternative_t<I, std::decay_t<T>>;
|
||||||
|
IthType ithValue;
|
||||||
|
if (extract<IthType>(begin, end, ithValue)) {
|
||||||
|
value = ithValue;
|
||||||
|
return true;
|
||||||
|
} else if constexpr (I + 1 < std::variant_size_v<T>) {
|
||||||
|
return extract_variant<T, I + 1>(begin, end, value);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
std::enable_if_t<is_instance_of<T, std::variant>::value, bool> extract(
|
||||||
|
const char* begin, const char* end, T& value) {
|
||||||
|
return extract_variant<T, 0>(begin, end, value);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////
|
////////////////
|
||||||
// extract specialization
|
// extract specialization
|
||||||
////////////////
|
////////////////
|
||||||
|
Loading…
Reference in New Issue
Block a user