From 3666e1633ef0db81b1271080c0b3ea7aa0cfe819 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 9 Jun 2023 13:49:46 +0200 Subject: newtype: merge concepts header to main header --- source/lib/include/newtype/concepts.hpp | 516 ------------------------------- source/lib/include/newtype/newtype.hpp | 508 +++++++++++++++++++++++++++++- source/tests/src/equality_comparison.cpp | 1 - source/tests/src/hash.cpp | 1 - 4 files changed, 507 insertions(+), 519 deletions(-) delete mode 100644 source/lib/include/newtype/concepts.hpp diff --git a/source/lib/include/newtype/concepts.hpp b/source/lib/include/newtype/concepts.hpp deleted file mode 100644 index 88313b9..0000000 --- a/source/lib/include/newtype/concepts.hpp +++ /dev/null @@ -1,516 +0,0 @@ -#ifndef NEWTYPE_CONCEPTS_HPP -#define NEWTYPE_CONCEPTS_HPP - -#include -#include -#include -#include - -namespace nt::concepts -{ - - inline namespace arithmetic - { - - template - concept addable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs + rhs - } -> std::same_as; - }; - - template - concept nothrow_addable = requires(SubjectType lhs, SubjectType rhs) { - requires addable; - { - lhs + rhs - } noexcept; - }; - - template - concept divisible = requires(SubjectType lhs, SubjectType rhs) { - { - lhs / rhs - } -> std::same_as; - }; - - template - concept nothrow_divisible = requires(SubjectType lhs, SubjectType rhs) { - requires divisible; - { - lhs / rhs - } noexcept; - }; - - template - concept multipliable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs * rhs - } -> std::same_as; - }; - - template - concept nothrow_multipliable = requires(SubjectType lhs, SubjectType rhs) { - requires multipliable; - { - lhs / rhs - } noexcept; - }; - - template - concept subtractable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs - rhs - } -> std::same_as; - }; - - template - concept nothrow_subtractable = requires(SubjectType lhs, SubjectType rhs) { - requires subtractable; - { - lhs - rhs - } noexcept; - }; - - } // namespace arithmetic - - inline namespace comparability - { - - template - concept equality_comparable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs == rhs - } -> std::convertible_to; - }; - - template - concept nothrow_equality_comparable = requires(SubjectType lhs, SubjectType rhs) { - requires equality_comparable; - { - lhs == rhs - } noexcept; - }; - - template - concept inequality_comparable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs != rhs - } -> std::convertible_to; - }; - - template - concept nothrow_inequality_comparable = requires(SubjectType lhs, SubjectType rhs) { - requires inequality_comparable; - { - lhs != rhs - } noexcept; - }; - - template - concept less_than_comparable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs < rhs - } -> std::convertible_to; - }; - - template - concept nothrow_less_than_comparable = requires(SubjectType lhs, SubjectType rhs) { - requires less_than_comparable; - { - lhs < rhs - } noexcept; - }; - - template - concept less_than_equal_comparable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs <= rhs - } -> std::convertible_to; - }; - - template - concept nothrow_less_than_equal_comparable = requires(SubjectType lhs, SubjectType rhs) { - requires less_than_equal_comparable; - { - lhs <= rhs - } noexcept; - }; - - template - concept greater_than_comparable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs > rhs - } -> std::convertible_to; - }; - - template - concept nothrow_greater_than_comparable = requires(SubjectType lhs, SubjectType rhs) { - requires greater_than_comparable; - { - lhs > rhs - } noexcept; - }; - - template - concept greater_than_equal_comparable = requires(SubjectType lhs, SubjectType rhs) { - { - lhs >= rhs - } -> std::convertible_to; - }; - - template - concept nothrow_greater_than_equal_comparable = requires(SubjectType lhs, SubjectType rhs) { - requires greater_than_equal_comparable; - { - lhs >= rhs - } noexcept; - }; - - } // namespace comparability - - inline namespace compound_arithmetic - { - template - concept compound_addable = requires(SubjectType & lhs, SubjectType const & rhs) { - { - lhs += rhs - } -> std::convertible_to; - }; - - template - concept nothrow_compound_addable = requires(SubjectType & lhs, SubjectType const & rhs) { - requires compound_addable; - { - lhs += rhs - } noexcept; - }; - - template - concept compound_divisible = requires(SubjectType & lhs, SubjectType const & rhs) { - { - lhs /= rhs - } -> std::convertible_to; - }; - - template - concept nothrow_compound_divisible = requires(SubjectType & lhs, SubjectType const & rhs) { - requires compound_divisible; - { - lhs /= rhs - } noexcept; - }; - - template - concept compound_multipliable = requires(SubjectType & lhs, SubjectType const & rhs) { - { - lhs *= rhs - } -> std::convertible_to; - }; - - template - concept nothrow_compound_multipliable = requires(SubjectType & lhs, SubjectType const & rhs) { - requires compound_multipliable; - { - lhs *= rhs - } noexcept; - }; - - template - concept compound_subtractable = requires(SubjectType & lhs, SubjectType const & rhs) { - { - lhs -= rhs - } -> std::convertible_to; - }; - - template - concept nothrow_compound_subtractable = requires(SubjectType & lhs, SubjectType const & rhs) { - requires compound_subtractable; - { - lhs -= rhs - } noexcept; - }; - } // namespace compound_arithmetic - - inline namespace iostreamable - { - - template - concept input_streamable = requires(SubjectType subject) { - { - std::declval &>() >> subject - } -> std::same_as &>; - }; - - template - concept nothrow_input_streamable = requires(SubjectType subject) { - requires input_streamable; - { - std::declval &>() >> subject - } noexcept; - }; - - template - concept output_streamable = requires(SubjectType subject) { - { - std::declval &>() << subject - } -> std::same_as &>; - }; - - template - concept nothrow_output_streamable = requires(SubjectType subject) { - requires output_streamable; - { - std::declval &>() << subject - } noexcept; - }; - - } // namespace iostreamable - - inline namespace iterable - { - - template - concept free_begin = requires(SubjectType & subject) { - typename SubjectType::iterator; - { - begin(subject) - } -> std::same_as; - }; - - template - concept const_free_begin = requires(SubjectType const & subject) { - typename SubjectType::const_iterator; - { - begin(subject) - } -> std::same_as; - }; - - template - concept member_begin = requires(SubjectType & subject) { - typename SubjectType::iterator; - { - subject.begin() - } -> std::same_as; - }; - - template - concept const_member_begin = requires(SubjectType const & subject) { - typename SubjectType::const_iterator; - { - subject.begin() - } -> std::same_as; - }; - - template - concept beginnable = free_begin || member_begin; - - template - concept const_beginnable = const_free_begin || const_member_begin; - - template - concept free_cbegin = requires(SubjectType const & subject) { - typename SubjectType::const_iterator; - { - cbegin(subject) - } -> std::same_as; - }; - - template - concept member_cbegin = requires(SubjectType const & subject) { - typename SubjectType::const_iterator; - { - subject.cbegin() - } -> std::same_as; - }; - - template - concept cbeginnable = free_cbegin || member_cbegin; - - template - concept free_rbegin = requires(SubjectType & subject) { - typename SubjectType::reverse_iterator; - { - rbegin(subject) - } -> std::same_as; - }; - - template - concept const_free_rbegin = requires(SubjectType const & subject) { - typename SubjectType::const_reverse_iterator; - { - rbegin(subject) - } -> std::same_as; - }; - - template - concept member_rbegin = requires(SubjectType & subject) { - typename SubjectType::reverse_iterator; - { - subject.rbegin() - } -> std::same_as; - }; - - template - concept const_member_rbegin = requires(SubjectType const & subject) { - typename SubjectType::const_reverse_iterator; - { - subject.rbegin() - } -> std::same_as; - }; - - template - concept rbeginnable = free_rbegin || member_rbegin; - - template - concept const_rbeginnable = const_free_rbegin || const_member_rbegin; - - template - concept free_crbegin = requires(SubjectType const & subject) { - typename SubjectType::const_reverse_iterator; - { - crbegin(subject) - } -> std::same_as; - }; - - template - concept member_crbegin = requires(SubjectType const & subject) { - typename SubjectType::const_reverse_iterator; - { - subject.crbegin() - } -> std::same_as; - }; - - template - concept crbeginnable = free_crbegin || member_crbegin; - - template - concept free_end = requires(SubjectType & subject) { - typename SubjectType::iterator; - { - end(subject) - } -> std::same_as; - }; - - template - concept const_free_end = requires(SubjectType const & subject) { - typename SubjectType::const_iterator; - { - end(subject) - } -> std::same_as; - }; - - template - concept member_end = requires(SubjectType & subject) { - typename SubjectType::iterator; - { - subject.end() - } -> std::same_as; - }; - - template - concept const_member_end = requires(SubjectType const & subject) { - typename SubjectType::const_iterator; - { - subject.end() - } -> std::same_as; - }; - - template - concept endable = free_end || member_end; - - template - concept const_endable = const_free_end || const_member_end; - - template - concept free_cend = requires(SubjectType const & subject) { - typename SubjectType::const_iterator; - { - cend(subject) - } -> std::same_as; - }; - - template - concept member_cend = requires(SubjectType const & subject) { - typename SubjectType::const_iterator; - { - subject.cend() - } -> std::same_as; - }; - - template - concept cendable = free_cend || member_cend; - - template - concept free_rend = requires(SubjectType & subject) { - typename SubjectType::reverse_iterator; - { - rend(subject) - } -> std::same_as; - }; - - template - concept const_free_rend = requires(SubjectType const & subject) { - typename SubjectType::const_reverse_iterator; - { - rend(subject) - } -> std::same_as; - }; - - template - concept member_rend = requires(SubjectType & subject) { - typename SubjectType::reverse_iterator; - { - subject.rend() - } -> std::same_as; - }; - - template - concept const_member_rend = requires(SubjectType const & subject) { - typename SubjectType::const_reverse_iterator; - { - subject.rend() - } -> std::same_as; - }; - - template - concept rendable = free_rend || member_rend; - - template - concept const_rendable = const_free_rend || const_member_rend; - - template - concept free_crend = requires(SubjectType const & subject) { - typename SubjectType::const_reverse_iterator; - { - crend(subject) - } -> std::same_as; - }; - - template - concept member_crend = requires(SubjectType const & subject) { - typename SubjectType::const_reverse_iterator; - { - subject.crend() - } -> std::same_as; - }; - - template - concept crendable = free_crend || member_crend; - } // namespace iterable - - inline namespace standard_extensions - { - - template - concept hashable = requires(SubjectType subject) { - { - std::hash{}(subject) - } -> std::convertible_to; - }; - - } - -} // namespace nt::concepts - -#endif \ No newline at end of file diff --git a/source/lib/include/newtype/newtype.hpp b/source/lib/include/newtype/newtype.hpp index 824a3da..5a1d936 100644 --- a/source/lib/include/newtype/newtype.hpp +++ b/source/lib/include/newtype/newtype.hpp @@ -1,7 +1,6 @@ #ifndef NEWTYPE_NEWTYPE_HPP #define NEWTYPE_NEWTYPE_HPP -#include "newtype/concepts.hpp" #include "newtype/derivable.hpp" #include "newtype/deriving.hpp" #include "newtype/impl/new_type_iterator_types.hpp" @@ -16,6 +15,513 @@ namespace nt { + namespace concepts + { + + inline namespace arithmetic + { + + template + concept addable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs + rhs + } -> std::same_as; + }; + + template + concept nothrow_addable = requires(SubjectType lhs, SubjectType rhs) { + requires addable; + { + lhs + rhs + } noexcept; + }; + + template + concept divisible = requires(SubjectType lhs, SubjectType rhs) { + { + lhs / rhs + } -> std::same_as; + }; + + template + concept nothrow_divisible = requires(SubjectType lhs, SubjectType rhs) { + requires divisible; + { + lhs / rhs + } noexcept; + }; + + template + concept multipliable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs * rhs + } -> std::same_as; + }; + + template + concept nothrow_multipliable = requires(SubjectType lhs, SubjectType rhs) { + requires multipliable; + { + lhs / rhs + } noexcept; + }; + + template + concept subtractable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs - rhs + } -> std::same_as; + }; + + template + concept nothrow_subtractable = requires(SubjectType lhs, SubjectType rhs) { + requires subtractable; + { + lhs - rhs + } noexcept; + }; + + } // namespace arithmetic + + inline namespace comparability + { + + template + concept equality_comparable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs == rhs + } -> std::convertible_to; + }; + + template + concept nothrow_equality_comparable = requires(SubjectType lhs, SubjectType rhs) { + requires equality_comparable; + { + lhs == rhs + } noexcept; + }; + + template + concept inequality_comparable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs != rhs + } -> std::convertible_to; + }; + + template + concept nothrow_inequality_comparable = requires(SubjectType lhs, SubjectType rhs) { + requires inequality_comparable; + { + lhs != rhs + } noexcept; + }; + + template + concept less_than_comparable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs < rhs + } -> std::convertible_to; + }; + + template + concept nothrow_less_than_comparable = requires(SubjectType lhs, SubjectType rhs) { + requires less_than_comparable; + { + lhs < rhs + } noexcept; + }; + + template + concept less_than_equal_comparable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs <= rhs + } -> std::convertible_to; + }; + + template + concept nothrow_less_than_equal_comparable = requires(SubjectType lhs, SubjectType rhs) { + requires less_than_equal_comparable; + { + lhs <= rhs + } noexcept; + }; + + template + concept greater_than_comparable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs > rhs + } -> std::convertible_to; + }; + + template + concept nothrow_greater_than_comparable = requires(SubjectType lhs, SubjectType rhs) { + requires greater_than_comparable; + { + lhs > rhs + } noexcept; + }; + + template + concept greater_than_equal_comparable = requires(SubjectType lhs, SubjectType rhs) { + { + lhs >= rhs + } -> std::convertible_to; + }; + + template + concept nothrow_greater_than_equal_comparable = requires(SubjectType lhs, SubjectType rhs) { + requires greater_than_equal_comparable; + { + lhs >= rhs + } noexcept; + }; + + } // namespace comparability + + inline namespace compound_arithmetic + { + template + concept compound_addable = requires(SubjectType & lhs, SubjectType const & rhs) { + { + lhs += rhs + } -> std::convertible_to; + }; + + template + concept nothrow_compound_addable = requires(SubjectType & lhs, SubjectType const & rhs) { + requires compound_addable; + { + lhs += rhs + } noexcept; + }; + + template + concept compound_divisible = requires(SubjectType & lhs, SubjectType const & rhs) { + { + lhs /= rhs + } -> std::convertible_to; + }; + + template + concept nothrow_compound_divisible = requires(SubjectType & lhs, SubjectType const & rhs) { + requires compound_divisible; + { + lhs /= rhs + } noexcept; + }; + + template + concept compound_multipliable = requires(SubjectType & lhs, SubjectType const & rhs) { + { + lhs *= rhs + } -> std::convertible_to; + }; + + template + concept nothrow_compound_multipliable = requires(SubjectType & lhs, SubjectType const & rhs) { + requires compound_multipliable; + { + lhs *= rhs + } noexcept; + }; + + template + concept compound_subtractable = requires(SubjectType & lhs, SubjectType const & rhs) { + { + lhs -= rhs + } -> std::convertible_to; + }; + + template + concept nothrow_compound_subtractable = requires(SubjectType & lhs, SubjectType const & rhs) { + requires compound_subtractable; + { + lhs -= rhs + } noexcept; + }; + } // namespace compound_arithmetic + + inline namespace iostreamable + { + + template + concept input_streamable = requires(SubjectType subject) { + { + std::declval &>() >> subject + } -> std::same_as &>; + }; + + template + concept nothrow_input_streamable = requires(SubjectType subject) { + requires input_streamable; + { + std::declval &>() >> subject + } noexcept; + }; + + template + concept output_streamable = requires(SubjectType subject) { + { + std::declval &>() << subject + } -> std::same_as &>; + }; + + template + concept nothrow_output_streamable = requires(SubjectType subject) { + requires output_streamable; + { + std::declval &>() << subject + } noexcept; + }; + + } // namespace iostreamable + + inline namespace iterable + { + + template + concept free_begin = requires(SubjectType & subject) { + typename SubjectType::iterator; + { + begin(subject) + } -> std::same_as; + }; + + template + concept const_free_begin = requires(SubjectType const & subject) { + typename SubjectType::const_iterator; + { + begin(subject) + } -> std::same_as; + }; + + template + concept member_begin = requires(SubjectType & subject) { + typename SubjectType::iterator; + { + subject.begin() + } -> std::same_as; + }; + + template + concept const_member_begin = requires(SubjectType const & subject) { + typename SubjectType::const_iterator; + { + subject.begin() + } -> std::same_as; + }; + + template + concept beginnable = free_begin || member_begin; + + template + concept const_beginnable = const_free_begin || const_member_begin; + + template + concept free_cbegin = requires(SubjectType const & subject) { + typename SubjectType::const_iterator; + { + cbegin(subject) + } -> std::same_as; + }; + + template + concept member_cbegin = requires(SubjectType const & subject) { + typename SubjectType::const_iterator; + { + subject.cbegin() + } -> std::same_as; + }; + + template + concept cbeginnable = free_cbegin || member_cbegin; + + template + concept free_rbegin = requires(SubjectType & subject) { + typename SubjectType::reverse_iterator; + { + rbegin(subject) + } -> std::same_as; + }; + + template + concept const_free_rbegin = requires(SubjectType const & subject) { + typename SubjectType::const_reverse_iterator; + { + rbegin(subject) + } -> std::same_as; + }; + + template + concept member_rbegin = requires(SubjectType & subject) { + typename SubjectType::reverse_iterator; + { + subject.rbegin() + } -> std::same_as; + }; + + template + concept const_member_rbegin = requires(SubjectType const & subject) { + typename SubjectType::const_reverse_iterator; + { + subject.rbegin() + } -> std::same_as; + }; + + template + concept rbeginnable = free_rbegin || member_rbegin; + + template + concept const_rbeginnable = const_free_rbegin || const_member_rbegin; + + template + concept free_crbegin = requires(SubjectType const & subject) { + typename SubjectType::const_reverse_iterator; + { + crbegin(subject) + } -> std::same_as; + }; + + template + concept member_crbegin = requires(SubjectType const & subject) { + typename SubjectType::const_reverse_iterator; + { + subject.crbegin() + } -> std::same_as; + }; + + template + concept crbeginnable = free_crbegin || member_crbegin; + + template + concept free_end = requires(SubjectType & subject) { + typename SubjectType::iterator; + { + end(subject) + } -> std::same_as; + }; + + template + concept const_free_end = requires(SubjectType const & subject) { + typename SubjectType::const_iterator; + { + end(subject) + } -> std::same_as; + }; + + template + concept member_end = requires(SubjectType & subject) { + typename SubjectType::iterator; + { + subject.end() + } -> std::same_as; + }; + + template + concept const_member_end = requires(SubjectType const & subject) { + typename SubjectType::const_iterator; + { + subject.end() + } -> std::same_as; + }; + + template + concept endable = free_end || member_end; + + template + concept const_endable = const_free_end || const_member_end; + + template + concept free_cend = requires(SubjectType const & subject) { + typename SubjectType::const_iterator; + { + cend(subject) + } -> std::same_as; + }; + + template + concept member_cend = requires(SubjectType const & subject) { + typename SubjectType::const_iterator; + { + subject.cend() + } -> std::same_as; + }; + + template + concept cendable = free_cend || member_cend; + + template + concept free_rend = requires(SubjectType & subject) { + typename SubjectType::reverse_iterator; + { + rend(subject) + } -> std::same_as; + }; + + template + concept const_free_rend = requires(SubjectType const & subject) { + typename SubjectType::const_reverse_iterator; + { + rend(subject) + } -> std::same_as; + }; + + template + concept member_rend = requires(SubjectType & subject) { + typename SubjectType::reverse_iterator; + { + subject.rend() + } -> std::same_as; + }; + + template + concept const_member_rend = requires(SubjectType const & subject) { + typename SubjectType::const_reverse_iterator; + { + subject.rend() + } -> std::same_as; + }; + + template + concept rendable = free_rend || member_rend; + + template + concept const_rendable = const_free_rend || const_member_rend; + + template + concept free_crend = requires(SubjectType const & subject) { + typename SubjectType::const_reverse_iterator; + { + crend(subject) + } -> std::same_as; + }; + + template + concept member_crend = requires(SubjectType const & subject) { + typename SubjectType::const_reverse_iterator; + { + subject.crend() + } -> std::same_as; + }; + + template + concept crendable = free_crend || member_crend; + } // namespace iterable + + inline namespace standard_extensions + { + + template + concept hashable = requires(SubjectType subject) { + { + std::hash{}(subject) + } -> std::convertible_to; + }; + + } + + } // namespace concepts + template class new_type : impl::new_type_move_assignment diff --git a/source/tests/src/equality_comparison.cpp b/source/tests/src/equality_comparison.cpp index 0876dc2..f01c3f9 100644 --- a/source/tests/src/equality_comparison.cpp +++ b/source/tests/src/equality_comparison.cpp @@ -1,4 +1,3 @@ -#include "newtype/concepts.hpp" #include "newtype/derivable.hpp" #include "newtype/deriving.hpp" #include "newtype/newtype.hpp" diff --git a/source/tests/src/hash.cpp b/source/tests/src/hash.cpp index 9bf6862..4c848d2 100644 --- a/source/tests/src/hash.cpp +++ b/source/tests/src/hash.cpp @@ -1,4 +1,3 @@ -#include "newtype/concepts.hpp" #include "newtype/derivable.hpp" #include "newtype/deriving.hpp" #include "newtype/newtype.hpp" -- cgit v1.2.3