From 943033bc921bb328bbc354f15627dbf4bd6ab1e4 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sat, 22 Feb 2020 18:29:07 +0100 Subject: new_type: fix enablement of begin --- include/newtype/impl/type_traits_extensions.hpp | 23 +---------------------- include/newtype/new_type.hpp | 25 ++++++++++++++++++------- 2 files changed, 19 insertions(+), 29 deletions(-) (limited to 'include') diff --git a/include/newtype/impl/type_traits_extensions.hpp b/include/newtype/impl/type_traits_extensions.hpp index 7096578..80ba5b0 100644 --- a/include/newtype/impl/type_traits_extensions.hpp +++ b/include/newtype/impl/type_traits_extensions.hpp @@ -6,7 +6,6 @@ #include #include #include -#include #include namespace nt::impl @@ -1054,26 +1053,6 @@ namespace nt::impl inline namespace iterable { - template - struct has_std_begin : std::false_type - { - }; - - template - struct has_std_begin()))>> - : std::is_same()))>> - { - }; - - template - struct has_std_begin()))>> - : std::is_same()))>> - { - }; - - template - auto constexpr has_std_begin_v = has_std_begin::value; - template struct has_free_begin : std::false_type { @@ -1115,7 +1094,7 @@ namespace nt::impl auto constexpr has_member_begin_v = has_member_begin::value; template - struct has_begin : std::disjunction, has_free_begin, has_member_begin> + struct has_begin : std::disjunction, has_member_begin> { }; diff --git a/include/newtype/new_type.hpp b/include/newtype/new_type.hpp index 0cf6ec3..0db01b2 100644 --- a/include/newtype/new_type.hpp +++ b/include/newtype/new_type.hpp @@ -10,7 +10,6 @@ #include #include -#include #include #include @@ -62,6 +61,16 @@ namespace nt -> std::enable_if_t, new_type &>; + template + auto constexpr friend begin(new_type & obj) + -> std::enable_if_t, + typename new_type::iterator>; + + template + auto constexpr friend begin(new_type const & obj) + -> std::enable_if_t, + typename new_type::const_iterator>; + using super = impl::new_type_move_assignment; public: @@ -448,21 +457,23 @@ namespace nt /** * Get an iterator to the beginning of the object contained by an instance of new_type */ - template> + template auto constexpr begin(new_type & obj) - -> std::enable_if_t, typename NewType::iterator> + -> std::enable_if_t, + typename new_type::iterator> { - return begin(obj); + return begin(obj.m_value); } /** * Get a constant iterator to the beginning of the object contained by an instance of new_type */ - template> + template auto constexpr begin(new_type const & obj) - -> std::enable_if_t, typename NewType::const_iterator> + -> std::enable_if_t, + typename new_type::const_iterator> { - return begin(obj); + return begin(obj.m_value); } } // namespace nt -- cgit v1.2.3