add value ctor copy constraints

This commit is contained in:
BlackMATov
2022-01-17 04:10:55 +07:00
parent f510ba8ca4
commit 79b26bef09
2 changed files with 12 additions and 9 deletions

View File

@@ -93,7 +93,6 @@ namespace meta_hpp::detail
public: public:
noncopyable(noncopyable&&) = delete; noncopyable(noncopyable&&) = delete;
noncopyable(const noncopyable&) = delete; noncopyable(const noncopyable&) = delete;
noncopyable& operator=(noncopyable&&) = delete; noncopyable& operator=(noncopyable&&) = delete;
noncopyable& operator=(const noncopyable&) = delete; noncopyable& operator=(const noncopyable&) = delete;
}; };
@@ -115,10 +114,12 @@ namespace meta_hpp
~value() = default; ~value() = default;
template < detail::decay_non_uvalue_kind T > template < detail::decay_non_uvalue_kind T, typename Tp = std::decay_t<T> >
requires detail::stdex::copy_constructible<Tp>
explicit value(T&& val); explicit value(T&& val);
template < detail::decay_non_uvalue_kind T > template < detail::decay_non_uvalue_kind T, typename Tp = std::decay_t<T> >
requires detail::stdex::copy_constructible<Tp>
value& operator=(T&& val); value& operator=(T&& val);
void swap(value& other) noexcept; void swap(value& other) noexcept;

View File

@@ -154,12 +154,14 @@ namespace meta_hpp
return *this; return *this;
} }
template < detail::decay_non_uvalue_kind T > template < detail::decay_non_uvalue_kind T, typename Tp >
requires detail::stdex::copy_constructible<Tp>
value::value(T&& val) value::value(T&& val)
: raw_{std::forward<T>(val)} : raw_{std::forward<T>(val)}
, traits_{traits::get<std::decay_t<T>>()} {} , traits_{traits::get<std::decay_t<T>>()} {}
template < detail::decay_non_uvalue_kind T > template < detail::decay_non_uvalue_kind T, typename Tp >
requires detail::stdex::copy_constructible<Tp>
value& value::operator=(T&& val) { value& value::operator=(T&& val) {
value temp{std::forward<T>(val)}; value temp{std::forward<T>(val)};
swap(temp); swap(temp);
@@ -241,14 +243,14 @@ namespace meta_hpp
namespace meta_hpp namespace meta_hpp
{ {
template < typename T > template < detail::has_value_less_traits T >
[[nodiscard]] bool operator<(const value& l, const T& r) { [[nodiscard]] bool operator<(const value& l, const T& r) {
const any_type& r_type = resolve_type<T>(); const any_type& r_type = resolve_type<T>();
return (l.get_type() < r_type) return (l.get_type() < r_type)
|| (l.get_type() == r_type && std::less<>{}(l.cast<T>(), r)); || (l.get_type() == r_type && std::less<>{}(l.cast<T>(), r));
} }
template < typename T > template < detail::has_value_less_traits T >
[[nodiscard]] bool operator<(const T& l, const value& r) { [[nodiscard]] bool operator<(const T& l, const value& r) {
const any_type& l_type = resolve_type<T>(); const any_type& l_type = resolve_type<T>();
return (l_type < r.get_type()) return (l_type < r.get_type())
@@ -263,13 +265,13 @@ namespace meta_hpp
namespace meta_hpp namespace meta_hpp
{ {
template < typename T > template < detail::has_value_equals_traits T >
[[nodiscard]] bool operator==(const value& l, const T& r) { [[nodiscard]] bool operator==(const value& l, const T& r) {
return l.get_type() == resolve_type<T>() return l.get_type() == resolve_type<T>()
&& std::equal_to<>{}(l.cast<T>(), r); && std::equal_to<>{}(l.cast<T>(), r);
} }
template < typename T > template < detail::has_value_equals_traits T >
[[nodiscard]] bool operator==(const T& l, const value& r) { [[nodiscard]] bool operator==(const T& l, const value& r) {
return resolve_type<T>() == r.get_type() return resolve_type<T>() == r.get_type()
&& std::equal_to<>{}(l, r.cast<T>()); && std::equal_to<>{}(l, r.cast<T>());