From e094d6e85a0517dd9fdc9dc8e0709a4a4727c81d Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Sun, 2 Jun 2019 20:43:08 +0900 Subject: [PATCH] refactor: move type alias from get to trait --- toml/get.hpp | 120 ++++++++++++++++++++++++------------------------ toml/traits.hpp | 5 ++ 2 files changed, 66 insertions(+), 59 deletions(-) diff --git a/toml/get.hpp b/toml/get.hpp index 4e53d2b..c2327a4 100644 --- a/toml/get.hpp +++ b/toml/get.hpp @@ -10,16 +10,12 @@ namespace toml { -// C++14 alias -template -using enable_if_t = typename std::enable_if::type; - // ============================================================================ // exact toml::* type template class M, template class V> -enable_if_t>::value, T> & +detail::enable_if_t>::value, T> & get(basic_value& v) { return v.template cast>::value>(); @@ -27,7 +23,7 @@ get(basic_value& v) template class M, template class V> -enable_if_t>::value, T> const& +detail::enable_if_t>::value, T> const& get(const basic_value& v) { return v.template cast>::value>(); @@ -35,7 +31,7 @@ get(const basic_value& v) template class M, template class V> -enable_if_t>::value, T> && +detail::enable_if_t>::value, T> && get(basic_value&& v) { return v.template cast>::value>(); @@ -46,7 +42,7 @@ get(basic_value&& v) template class M, template class V> -inline enable_if_t>::value, T>& +inline detail::enable_if_t>::value, T>& get(basic_value& v) { return v; @@ -54,7 +50,7 @@ get(basic_value& v) template class M, template class V> -inline enable_if_t>::value, T> const& +inline detail::enable_if_t>::value, T> const& get(const basic_value& v) { return v; @@ -62,7 +58,7 @@ get(const basic_value& v) template class M, template class V> -inline enable_if_t>::value, T> && +inline detail::enable_if_t>::value, T> && get(basic_value&& v) { return std::move(v); @@ -73,7 +69,7 @@ get(basic_value&& v) template class M, template class V> -inline enable_if_t::value, T> +inline detail::enable_if_t::value, T> get(const basic_value& v) { return T(v); @@ -84,7 +80,7 @@ get(const basic_value& v) template class M, template class V> -inline enable_if_t, // T is integral detail::negation>, // but not bool detail::negation< // but not toml::integer @@ -100,7 +96,7 @@ get(const basic_value& v) template class M, template class V> -inline enable_if_t, // T is floating_point detail::negation< // but not toml::floating detail::is_exact_toml_type>> @@ -116,7 +112,7 @@ get(const basic_value& v) template class M, template class V> -inline enable_if_t::value, std::string>& +inline detail::enable_if_t::value, std::string>& get(basic_value& v) { return v.template cast().str; @@ -124,7 +120,7 @@ get(basic_value& v) template class M, template class V> -inline enable_if_t::value, std::string> const& +inline detail::enable_if_t::value, std::string> const& get(const basic_value& v) { return v.template cast().str; @@ -132,7 +128,7 @@ get(const basic_value& v) template class M, template class V> -inline enable_if_t::value, std::string> const& +inline detail::enable_if_t::value, std::string> const& get(basic_value&& v) { return std::move(v.template cast().str); @@ -144,7 +140,7 @@ get(basic_value&& v) #if __cplusplus >= 201703L template class M, template class V> -inline enable_if_t::value, std::string_view> +inline detail::enable_if_t::value, std::string_view> get(const basic_value& v) { return std::string_view(v.template cast().str); @@ -156,7 +152,7 @@ get(const basic_value& v) template class M, template class V> -inline enable_if_t::value, T> +inline detail::enable_if_t::value, T> get(const basic_value& v) { return std::chrono::duration_cast( @@ -168,7 +164,7 @@ get(const basic_value& v) template class M, template class V> -inline enable_if_t< +inline detail::enable_if_t< std::is_same::value, T> get(const basic_value& v) { @@ -206,7 +202,7 @@ get(const basic_value& v) // array-like type with resize(N) method template class M, template class V> -enable_if_t, // T is container detail::has_resize_method, // T::resize(N) works detail::negation< // but not toml::array @@ -217,7 +213,7 @@ get(const basic_value&); // array-like type with resize(N) method template class M, template class V> -enable_if_t, // T is container detail::negation>, // no T::resize() exists detail::negation< // not toml::array @@ -228,19 +224,19 @@ get(const basic_value&); // std::pair template class M, template class V> -enable_if_t::value, T> +detail::enable_if_t::value, T> get(const basic_value&); // std::tuple template class M, template class V> -enable_if_t::value, T> +detail::enable_if_t::value, T> get(const basic_value&); // map-like classes template class M, template class V> -enable_if_t, // T is map detail::negation< // but not toml::table detail::is_exact_toml_type>> @@ -250,7 +246,7 @@ get(const basic_value&); // T.from_toml(v) template class M, template class V> -enable_if_t>>, detail::has_from_toml_method, // but has from_toml(toml::value) @@ -269,7 +265,7 @@ T get(const basic_value&); template class M, template class V> -enable_if_t, // T is container detail::has_resize_method, // T::resize(N) works detail::negation< // but not toml::array @@ -291,7 +287,7 @@ get(const basic_value& v) template class M, template class V> -enable_if_t, // T is container detail::negation>, // no T::resize() exists detail::negation< // but not toml::array @@ -321,7 +317,7 @@ get(const basic_value& v) template class M, template class V> -enable_if_t::value, T> +detail::enable_if_t::value, T> get(const basic_value& v) { using first_type = typename T::first_type; @@ -355,7 +351,7 @@ T get_tuple_impl(const Array& a, index_sequence) template class M, template class V> -enable_if_t::value, T> +detail::enable_if_t::value, T> get(const basic_value& v) { const auto& ar = v.template cast(); @@ -377,7 +373,7 @@ get(const basic_value& v) template class M, template class V> -enable_if_t, // T is map detail::negation< // but not toml::array detail::is_exact_toml_type>> @@ -402,7 +398,7 @@ get(const basic_value& v) template class M, template class V> -enable_if_t>>, detail::has_from_toml_method, // but has from_toml(toml::value) memfn @@ -427,7 +423,7 @@ T get(const basic_value& v) // for toml::table. template -enable_if_t, +detail::enable_if_t, detail::is_basic_value>::value, decltype(::toml::get(std::declval()))> find(Table& tab, const toml::key& ky, std::string tn = "unknown table") @@ -440,7 +436,7 @@ find(Table& tab, const toml::key& ky, std::string tn = "unknown table") return ::toml::get(tab.at(ky)); } template -enable_if_t, +detail::enable_if_t, detail::is_basic_value>::value, decltype(::toml::get(std::declval()))> find(Table const& tab, const toml::key& ky, std::string tn = "unknown table") @@ -453,7 +449,7 @@ find(Table const& tab, const toml::key& ky, std::string tn = "unknown table") return ::toml::get(tab.at(ky)); } template -enable_if_t, +detail::enable_if_t, detail::is_basic_value>::value, decltype(::toml::get(std::declval()))> find(typename std::remove_reference&& tab, const toml::key& ky, @@ -571,7 +567,8 @@ find(basic_value&& v, const key& ky) template class M, template class V> -enable_if_t>::value, T> const& +detail::enable_if_t< + detail::is_exact_toml_type>::value, T> const& get_or(const basic_value& v, const T& opt) { try @@ -586,7 +583,8 @@ get_or(const basic_value& v, const T& opt) } template class M, template class V> -enable_if_t>::value, T>& +detail::enable_if_t< + detail::is_exact_toml_type>::value, T>& get_or(basic_value& v, T& opt) { try @@ -601,7 +599,8 @@ get_or(basic_value& v, T& opt) } template class M, template class V> -enable_if_t>::value, T>&& +detail::enable_if_t< + detail::is_exact_toml_type>::value, T>&& get_or(basic_value&& v, T&& opt) { try @@ -620,7 +619,7 @@ get_or(basic_value&& v, T&& opt) template class M, template class V> -enable_if_t::type>::type, std::string>::value, std::string> const& get_or(const basic_value& v, T&& opt) @@ -636,7 +635,7 @@ get_or(const basic_value& v, T&& opt) } template class M, template class V> -enable_if_t::type>::type, std::string>::value, std::string>& get_or(basic_value& v, T& opt) @@ -652,7 +651,7 @@ get_or(basic_value& v, T& opt) } template class M, template class V> -enable_if_t::type>::type, std::string>::value, std::string> get_or(basic_value&& v, T&& opt) @@ -672,7 +671,7 @@ get_or(basic_value&& v, T&& opt) template class M, template class V> -enable_if_t::type>::value, std::string> get_or(basic_value&& v, T&& opt) { @@ -691,7 +690,7 @@ get_or(basic_value&& v, T&& opt) template class M, template class V> -enable_if_t>>, detail::negation>, detail::negation::type>> @@ -716,7 +715,8 @@ get_or(const basic_value& v, T&& opt) // exact types (return type can be a reference) template class M, template class V> -enable_if_t>::value, T> const& +detail::enable_if_t< + detail::is_exact_toml_type>::value, T> const& find_or(const basic_value& v, const key& ky, const T& opt) { if(!v.is_table()) {return opt;} @@ -727,7 +727,8 @@ find_or(const basic_value& v, const key& ky, const T& opt) template class M, template class V> -enable_if_t>::value, T>& +detail::enable_if_t< + detail::is_exact_toml_type>::value, T>& find_or(basic_value& v, const toml::key& ky, T& opt) { if(!v.is_table()) {return opt;} @@ -738,7 +739,8 @@ find_or(basic_value& v, const toml::key& ky, T& opt) template class M, template class V> -enable_if_t>::value, T>&& +detail::enable_if_t< + detail::is_exact_toml_type>::value, T>&& find_or(basic_value&& v, const toml::key& ky, T&& opt) { if(!v.is_table()) {return opt;} @@ -752,7 +754,7 @@ find_or(basic_value&& v, const toml::key& ky, T&& opt) template class M, template class V> -enable_if_t::value, std::string> const& +detail::enable_if_t::value, std::string> const& find_or(const basic_value& v, const key& ky, const T& opt) { if(!v.is_table()) {return opt;} @@ -762,7 +764,7 @@ find_or(const basic_value& v, const key& ky, const T& opt) } template class M, template class V> -enable_if_t::value, std::string>& +detail::enable_if_t::value, std::string>& find_or(basic_value& v, const toml::key& ky, T& opt) { if(!v.is_table()) {return opt;} @@ -772,7 +774,7 @@ find_or(basic_value& v, const toml::key& ky, T& opt) } template class M, template class V> -enable_if_t::value, std::string> +detail::enable_if_t::value, std::string> find_or(basic_value&& v, const toml::key& ky, T&& opt) { if(!v.is_table()) {return opt;} @@ -785,7 +787,7 @@ find_or(basic_value&& v, const toml::key& ky, T&& opt) // string literal (deduced as std::string) template class M, template class V> -enable_if_t< +detail::enable_if_t< detail::is_string_literal::type>::value, std::string> find_or(const basic_value& v, const toml::key& ky, T&& opt) @@ -800,7 +802,7 @@ find_or(const basic_value& v, const toml::key& ky, T&& opt) // others (require type conversion and return type cannot be lvalue reference) template class M, template class V> -enable_if_t>>, detail::negation>, detail::negation::type>> @@ -819,7 +821,7 @@ find_or(const basic_value& v, const toml::key& ky, T&& opt) // --------------------------------------------------------------------------- // exact types (return type can be a reference) template -enable_if_t, detail::is_basic_value, detail::is_exact_toml_type >::value, T> const& @@ -830,7 +832,7 @@ find_or(const Table& tab, const key& ky, const T& opt) } template -enable_if_t, detail::is_basic_value, detail::is_exact_toml_type >::value, T>& @@ -841,7 +843,7 @@ find_or(Table& tab, const key& ky, T& opt) } template -enable_if_t, detail::is_basic_value, detail::is_exact_toml_type >::value, T>&& @@ -854,7 +856,7 @@ find_or(typename std::remove_reference
::type&& tab, const key& ky, T&& op // --------------------------------------------------------------------------- // std::string (return type can be a reference) template -enable_if_t, detail::is_basic_value, std::is_same >::value, std::string> const& @@ -864,7 +866,7 @@ find_or(const Table& tab, const key& ky, const T& opt) return get_or(tab.at(ky), opt); } template -enable_if_t, detail::is_basic_value, std::is_same >::value, std::string>& @@ -874,7 +876,7 @@ find_or(Table& tab, const key& ky, T& opt) return get_or(tab[ky], opt); } template -enable_if_t, detail::is_basic_value, std::is_same >::value, std::string> @@ -887,7 +889,7 @@ find_or(Table&& tab, const key& ky, T&& opt) // --------------------------------------------------------------------------- // string literal (deduced as std::string) template -enable_if_t, detail::is_basic_value, detail::is_string_literal::type> @@ -901,7 +903,7 @@ find_or(const Table& tab, const key& ky, T&& opt) // --------------------------------------------------------------------------- // others (require type conversion and return type cannot be lvalue reference) template -enable_if_t, detail::is_basic_value, detail::negation>, @@ -945,7 +947,7 @@ expect(const basic_value& v, const toml::key& k) noexcept } } template -enable_if_t, detail::is_basic_value >::value, result> expect(const Table& t, const toml::key& k, diff --git a/toml/traits.hpp b/toml/traits.hpp index 408e4a4..cbc1a2c 100644 --- a/toml/traits.hpp +++ b/toml/traits.hpp @@ -197,6 +197,11 @@ struct index_sequence_maker<0> template using make_index_sequence = typename index_sequence_maker::type; +// --------------------------------------------------------------------------- +// C++14 enable_if_t +template +using enable_if_t = typename std::enable_if::type; + // --------------------------------------------------------------------------- // return_type_of_t