cleanup, details in body
removes: - is_basic_json_compatible_type traits - a useless operator= - void_t - disjunction changes: - is_compatible_object_type's first argument is BasicJson
This commit is contained in:
parent
4e8089b9de
commit
317883b21b
2 changed files with 22 additions and 90 deletions
56
src/json.hpp
56
src/json.hpp
|
@ -326,15 +326,7 @@ struct external_constructor<value_t::object>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// very useful construct against boilerplate (more boilerplate needed than in
|
// Implementation of 2 C++17 constructs: conjunction, negation.
|
||||||
// C++17: http://en.cppreference.com/w/cpp/types/void_t)
|
|
||||||
template <typename...> struct make_void
|
|
||||||
{
|
|
||||||
using type = void;
|
|
||||||
};
|
|
||||||
template <typename... Ts> using void_t = typename make_void<Ts...>::type;
|
|
||||||
|
|
||||||
// Implementation of 3 C++17 constructs: conjunction, disjunction, negation.
|
|
||||||
// This is needed to avoid evaluating all the traits in a condition
|
// This is needed to avoid evaluating all the traits in a condition
|
||||||
//
|
//
|
||||||
// For example: not std::is_same<void, T>::value and has_value_type<T>::value
|
// For example: not std::is_same<void, T>::value and has_value_type<T>::value
|
||||||
|
@ -352,11 +344,6 @@ struct conjunction<B1, Bn...>
|
||||||
: conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
|
: conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
|
||||||
|
|
||||||
template <class B> struct negation : std::integral_constant < bool, !B::value > {};
|
template <class B> struct negation : std::integral_constant < bool, !B::value > {};
|
||||||
template <class...> struct disjunction : std::false_type {};
|
|
||||||
template <class B1> struct disjunction<B1> : B1 {};
|
|
||||||
template <class B1, class... Bn>
|
|
||||||
struct disjunction<B1, Bn...>
|
|
||||||
: conditional_t<bool(B1::value), B1, disjunction<Bn...>> {};
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief Helper to determine whether there's a key_type for T.
|
@brief Helper to determine whether there's a key_type for T.
|
||||||
|
@ -399,16 +386,16 @@ struct is_compatible_object_type_impl<true, RealType, CompatibleObjectType>
|
||||||
typename CompatibleObjectType::mapped_type>::value;
|
typename CompatibleObjectType::mapped_type>::value;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class RealType, class CompatibleObjectType>
|
template<class BasicJson, class CompatibleObjectType>
|
||||||
struct is_compatible_object_type
|
struct is_compatible_object_type
|
||||||
{
|
{
|
||||||
// As noted ahead, we need to stop evaluating traits if
|
// As noted ahead, we need to stop evaluating traits if
|
||||||
// `CompatibleObjectType = void`, hence the conjunction
|
// `CompatibleObjectType = void`, hence the conjunction
|
||||||
static auto constexpr value = is_compatible_object_type_impl <
|
static auto constexpr value = is_compatible_object_type_impl<
|
||||||
conjunction<negation<std::is_same<void, CompatibleObjectType>>,
|
conjunction<negation<std::is_same<void, CompatibleObjectType>>,
|
||||||
has_mapped_type<CompatibleObjectType>,
|
has_mapped_type<CompatibleObjectType>,
|
||||||
has_key_type<CompatibleObjectType>>::value,
|
has_key_type<CompatibleObjectType>>::value,
|
||||||
RealType, CompatibleObjectType >::value;
|
typename BasicJson::object_t, CompatibleObjectType>::value;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <bool B, class BasicJson, class CompatibleArrayType>
|
template <bool B, class BasicJson, class CompatibleArrayType>
|
||||||
|
@ -439,7 +426,7 @@ struct is_compatible_array_type
|
||||||
// `is_compatible_object_type`, but we need the conjunction here as well
|
// `is_compatible_object_type`, but we need the conjunction here as well
|
||||||
static auto constexpr value = is_compatible_array_type_impl<
|
static auto constexpr value = is_compatible_array_type_impl<
|
||||||
conjunction<negation<is_compatible_object_type<
|
conjunction<negation<is_compatible_object_type<
|
||||||
typename BasicJson::object_t, CompatibleArrayType>>,
|
BasicJson, CompatibleArrayType>>,
|
||||||
negation<std::is_constructible<typename BasicJson::string_t,
|
negation<std::is_constructible<typename BasicJson::string_t,
|
||||||
CompatibleArrayType>>,
|
CompatibleArrayType>>,
|
||||||
has_value_type<CompatibleArrayType>,
|
has_value_type<CompatibleArrayType>,
|
||||||
|
@ -482,12 +469,6 @@ struct is_compatible_float_type
|
||||||
std::is_floating_point<CompatibleFloat>::value;
|
std::is_floating_point<CompatibleFloat>::value;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, typename BasicJson>
|
|
||||||
struct is_compatible_basic_json_type
|
|
||||||
{
|
|
||||||
static auto constexpr value = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename BasicJson, typename PrimitiveIterator>
|
template <typename T, typename BasicJson, typename PrimitiveIterator>
|
||||||
struct is_basic_json_nested_class
|
struct is_basic_json_nested_class
|
||||||
{
|
{
|
||||||
|
@ -639,7 +620,7 @@ void to_json(Json &j, CompatibleArrayType const &arr)
|
||||||
|
|
||||||
template <
|
template <
|
||||||
typename Json, typename CompatibleObjectType,
|
typename Json, typename CompatibleObjectType,
|
||||||
enable_if_t<is_compatible_object_type<typename Json::object_t, CompatibleObjectType>::value,
|
enable_if_t<is_compatible_object_type<Json, CompatibleObjectType>::value,
|
||||||
int> = 0>
|
int> = 0>
|
||||||
void to_json(Json &j, CompatibleObjectType const &arr)
|
void to_json(Json &j, CompatibleObjectType const &arr)
|
||||||
{
|
{
|
||||||
|
@ -745,7 +726,7 @@ void from_json(Json const &j, CompatibleArrayType &arr)
|
||||||
|
|
||||||
template <
|
template <
|
||||||
typename Json, typename CompatibleObjectType,
|
typename Json, typename CompatibleObjectType,
|
||||||
enable_if_t<is_compatible_object_type<typename Json::object_t, CompatibleObjectType>::value,
|
enable_if_t<is_compatible_object_type<Json, CompatibleObjectType>::value,
|
||||||
int> = 0>
|
int> = 0>
|
||||||
void from_json(Json const &j, CompatibleObjectType &obj)
|
void from_json(Json const &j, CompatibleObjectType &obj)
|
||||||
{
|
{
|
||||||
|
@ -1863,7 +1844,6 @@ class basic_json
|
||||||
// constructor chosen when:
|
// constructor chosen when:
|
||||||
// - JSONSerializer::to_json exists for type T
|
// - JSONSerializer::to_json exists for type T
|
||||||
// - T is not a istream, nor convertible to basic_json (float, vectors, etc)
|
// - T is not a istream, nor convertible to basic_json (float, vectors, etc)
|
||||||
// is_compatible_basic_json_type == not is_user_defined_type
|
|
||||||
template <
|
template <
|
||||||
typename T,
|
typename T,
|
||||||
enable_if_t<not std::is_base_of<std::istream, uncvref_t<T>>::value and
|
enable_if_t<not std::is_base_of<std::istream, uncvref_t<T>>::value and
|
||||||
|
@ -1871,10 +1851,8 @@ class basic_json
|
||||||
not std::is_same<uncvref_t<T>, basic_json_t>::value and
|
not std::is_same<uncvref_t<T>, basic_json_t>::value and
|
||||||
not std::is_same<uncvref_t<T>, typename basic_json_t::array_t::iterator>::value and
|
not std::is_same<uncvref_t<T>, typename basic_json_t::array_t::iterator>::value and
|
||||||
not std::is_same<uncvref_t<T>, typename basic_json_t::object_t::iterator>::value and
|
not std::is_same<uncvref_t<T>, typename basic_json_t::object_t::iterator>::value and
|
||||||
detail::conjunction<detail::negation<detail::is_compatible_basic_json_type<
|
|
||||||
uncvref_t<T>, basic_json_t>>,
|
|
||||||
detail::has_to_json<JSONSerializer, basic_json,
|
detail::has_to_json<JSONSerializer, basic_json,
|
||||||
uncvref_t<T>>>::value,
|
uncvref_t<T>>::value,
|
||||||
int> = 0 >
|
int> = 0 >
|
||||||
basic_json(T && val)
|
basic_json(T && val)
|
||||||
{
|
{
|
||||||
|
@ -2428,18 +2406,6 @@ class basic_json
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this overload is needed, since constructor for udt is explicit
|
|
||||||
template <typename T, enable_if_t<not detail::is_compatible_basic_json_type<
|
|
||||||
uncvref_t<T>, basic_json_t>::value and
|
|
||||||
detail::has_to_json<JSONSerializer, basic_json_t, uncvref_t<T>>::value>>
|
|
||||||
reference& operator=(T&& val) noexcept(std::is_nothrow_constructible<basic_json_t, uncvref_t<T>>::value and
|
|
||||||
std::is_nothrow_move_assignable<uncvref_t<T>>::value)
|
|
||||||
{
|
|
||||||
static_assert(sizeof(T) == 0 , "");
|
|
||||||
// I'm not sure this a is good practice...
|
|
||||||
return *this = basic_json_t{std::forward<T>(val)};
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief destructor
|
@brief destructor
|
||||||
|
|
||||||
|
|
|
@ -326,15 +326,7 @@ struct external_constructor<value_t::object>
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// very useful construct against boilerplate (more boilerplate needed than in
|
// Implementation of 2 C++17 constructs: conjunction, negation.
|
||||||
// C++17: http://en.cppreference.com/w/cpp/types/void_t)
|
|
||||||
template <typename...> struct make_void
|
|
||||||
{
|
|
||||||
using type = void;
|
|
||||||
};
|
|
||||||
template <typename... Ts> using void_t = typename make_void<Ts...>::type;
|
|
||||||
|
|
||||||
// Implementation of 3 C++17 constructs: conjunction, disjunction, negation.
|
|
||||||
// This is needed to avoid evaluating all the traits in a condition
|
// This is needed to avoid evaluating all the traits in a condition
|
||||||
//
|
//
|
||||||
// For example: not std::is_same<void, T>::value and has_value_type<T>::value
|
// For example: not std::is_same<void, T>::value and has_value_type<T>::value
|
||||||
|
@ -352,11 +344,6 @@ struct conjunction<B1, Bn...>
|
||||||
: conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
|
: conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};
|
||||||
|
|
||||||
template <class B> struct negation : std::integral_constant < bool, !B::value > {};
|
template <class B> struct negation : std::integral_constant < bool, !B::value > {};
|
||||||
template <class...> struct disjunction : std::false_type {};
|
|
||||||
template <class B1> struct disjunction<B1> : B1 {};
|
|
||||||
template <class B1, class... Bn>
|
|
||||||
struct disjunction<B1, Bn...>
|
|
||||||
: conditional_t<bool(B1::value), B1, disjunction<Bn...>> {};
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief Helper to determine whether there's a key_type for T.
|
@brief Helper to determine whether there's a key_type for T.
|
||||||
|
@ -399,16 +386,16 @@ struct is_compatible_object_type_impl<true, RealType, CompatibleObjectType>
|
||||||
typename CompatibleObjectType::mapped_type>::value;
|
typename CompatibleObjectType::mapped_type>::value;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class RealType, class CompatibleObjectType>
|
template<class BasicJson, class CompatibleObjectType>
|
||||||
struct is_compatible_object_type
|
struct is_compatible_object_type
|
||||||
{
|
{
|
||||||
// As noted ahead, we need to stop evaluating traits if
|
// As noted ahead, we need to stop evaluating traits if
|
||||||
// `CompatibleObjectType = void`, hence the conjunction
|
// `CompatibleObjectType = void`, hence the conjunction
|
||||||
static auto constexpr value = is_compatible_object_type_impl <
|
static auto constexpr value = is_compatible_object_type_impl<
|
||||||
conjunction<negation<std::is_same<void, CompatibleObjectType>>,
|
conjunction<negation<std::is_same<void, CompatibleObjectType>>,
|
||||||
has_mapped_type<CompatibleObjectType>,
|
has_mapped_type<CompatibleObjectType>,
|
||||||
has_key_type<CompatibleObjectType>>::value,
|
has_key_type<CompatibleObjectType>>::value,
|
||||||
RealType, CompatibleObjectType >::value;
|
typename BasicJson::object_t, CompatibleObjectType>::value;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <bool B, class BasicJson, class CompatibleArrayType>
|
template <bool B, class BasicJson, class CompatibleArrayType>
|
||||||
|
@ -439,7 +426,7 @@ struct is_compatible_array_type
|
||||||
// `is_compatible_object_type`, but we need the conjunction here as well
|
// `is_compatible_object_type`, but we need the conjunction here as well
|
||||||
static auto constexpr value = is_compatible_array_type_impl<
|
static auto constexpr value = is_compatible_array_type_impl<
|
||||||
conjunction<negation<is_compatible_object_type<
|
conjunction<negation<is_compatible_object_type<
|
||||||
typename BasicJson::object_t, CompatibleArrayType>>,
|
BasicJson, CompatibleArrayType>>,
|
||||||
negation<std::is_constructible<typename BasicJson::string_t,
|
negation<std::is_constructible<typename BasicJson::string_t,
|
||||||
CompatibleArrayType>>,
|
CompatibleArrayType>>,
|
||||||
has_value_type<CompatibleArrayType>,
|
has_value_type<CompatibleArrayType>,
|
||||||
|
@ -482,12 +469,6 @@ struct is_compatible_float_type
|
||||||
std::is_floating_point<CompatibleFloat>::value;
|
std::is_floating_point<CompatibleFloat>::value;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, typename BasicJson>
|
|
||||||
struct is_compatible_basic_json_type
|
|
||||||
{
|
|
||||||
static auto constexpr value = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename BasicJson, typename PrimitiveIterator>
|
template <typename T, typename BasicJson, typename PrimitiveIterator>
|
||||||
struct is_basic_json_nested_class
|
struct is_basic_json_nested_class
|
||||||
{
|
{
|
||||||
|
@ -639,7 +620,7 @@ void to_json(Json &j, CompatibleArrayType const &arr)
|
||||||
|
|
||||||
template <
|
template <
|
||||||
typename Json, typename CompatibleObjectType,
|
typename Json, typename CompatibleObjectType,
|
||||||
enable_if_t<is_compatible_object_type<typename Json::object_t, CompatibleObjectType>::value,
|
enable_if_t<is_compatible_object_type<Json, CompatibleObjectType>::value,
|
||||||
int> = 0>
|
int> = 0>
|
||||||
void to_json(Json &j, CompatibleObjectType const &arr)
|
void to_json(Json &j, CompatibleObjectType const &arr)
|
||||||
{
|
{
|
||||||
|
@ -745,7 +726,7 @@ void from_json(Json const &j, CompatibleArrayType &arr)
|
||||||
|
|
||||||
template <
|
template <
|
||||||
typename Json, typename CompatibleObjectType,
|
typename Json, typename CompatibleObjectType,
|
||||||
enable_if_t<is_compatible_object_type<typename Json::object_t, CompatibleObjectType>::value,
|
enable_if_t<is_compatible_object_type<Json, CompatibleObjectType>::value,
|
||||||
int> = 0>
|
int> = 0>
|
||||||
void from_json(Json const &j, CompatibleObjectType &obj)
|
void from_json(Json const &j, CompatibleObjectType &obj)
|
||||||
{
|
{
|
||||||
|
@ -1863,7 +1844,6 @@ class basic_json
|
||||||
// constructor chosen when:
|
// constructor chosen when:
|
||||||
// - JSONSerializer::to_json exists for type T
|
// - JSONSerializer::to_json exists for type T
|
||||||
// - T is not a istream, nor convertible to basic_json (float, vectors, etc)
|
// - T is not a istream, nor convertible to basic_json (float, vectors, etc)
|
||||||
// is_compatible_basic_json_type == not is_user_defined_type
|
|
||||||
template <
|
template <
|
||||||
typename T,
|
typename T,
|
||||||
enable_if_t<not std::is_base_of<std::istream, uncvref_t<T>>::value and
|
enable_if_t<not std::is_base_of<std::istream, uncvref_t<T>>::value and
|
||||||
|
@ -1871,10 +1851,8 @@ class basic_json
|
||||||
not std::is_same<uncvref_t<T>, basic_json_t>::value and
|
not std::is_same<uncvref_t<T>, basic_json_t>::value and
|
||||||
not std::is_same<uncvref_t<T>, typename basic_json_t::array_t::iterator>::value and
|
not std::is_same<uncvref_t<T>, typename basic_json_t::array_t::iterator>::value and
|
||||||
not std::is_same<uncvref_t<T>, typename basic_json_t::object_t::iterator>::value and
|
not std::is_same<uncvref_t<T>, typename basic_json_t::object_t::iterator>::value and
|
||||||
detail::conjunction<detail::negation<detail::is_compatible_basic_json_type<
|
|
||||||
uncvref_t<T>, basic_json_t>>,
|
|
||||||
detail::has_to_json<JSONSerializer, basic_json,
|
detail::has_to_json<JSONSerializer, basic_json,
|
||||||
uncvref_t<T>>>::value,
|
uncvref_t<T>>::value,
|
||||||
int> = 0 >
|
int> = 0 >
|
||||||
basic_json(T && val)
|
basic_json(T && val)
|
||||||
{
|
{
|
||||||
|
@ -2428,18 +2406,6 @@ class basic_json
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this overload is needed, since constructor for udt is explicit
|
|
||||||
template <typename T, enable_if_t<not detail::is_compatible_basic_json_type<
|
|
||||||
uncvref_t<T>, basic_json_t>::value and
|
|
||||||
detail::has_to_json<JSONSerializer, basic_json_t, uncvref_t<T>>::value>>
|
|
||||||
reference& operator=(T&& val) noexcept(std::is_nothrow_constructible<basic_json_t, uncvref_t<T>>::value and
|
|
||||||
std::is_nothrow_move_assignable<uncvref_t<T>>::value)
|
|
||||||
{
|
|
||||||
static_assert(sizeof(T) == 0 , "");
|
|
||||||
// I'm not sure this a is good practice...
|
|
||||||
return *this = basic_json_t{std::forward<T>(val)};
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief destructor
|
@brief destructor
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue