| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- // Range v3 library
- //
- // Copyright Eric Niebler 2014-present
- // Copyright Google LLC 2020-present
- //
- // Use, modification and distribution is subject to the
- // Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //
- // Project home: https://github.com/ericniebler/range-v3
- //#define RANGES_USE_LEGACY_CONCEPTS 1
- #include <sstream>
- #include <vector>
- #include <concepts/concepts.hpp>
- #include <range/v3/iterator/concepts.hpp>
- #include <range/v3/iterator/traits.hpp>
- #include <range/v3/range/concepts.hpp>
- #include <range/v3/range/traits.hpp>
- #include <range/v3/view/istream.hpp>
- #include <range/v3/iterator/common_iterator.hpp>
- #include "../simple_test.hpp"
- struct moveonly
- {
- moveonly(moveonly&&) = default;
- moveonly& operator=(moveonly&&) = default;
- };
- struct nonmovable
- {
- nonmovable(nonmovable const &) = delete;
- nonmovable& operator=(nonmovable const &) = delete;
- };
- struct nondefaultconstructible
- {
- nondefaultconstructible(int) {}
- };
- struct NotDestructible
- {
- ~NotDestructible() = delete;
- };
- struct IntComparable
- {
- operator int() const;
- friend bool operator==(IntComparable, IntComparable);
- friend bool operator!=(IntComparable, IntComparable);
- friend bool operator<(IntComparable, IntComparable);
- friend bool operator>(IntComparable, IntComparable);
- friend bool operator<=(IntComparable, IntComparable);
- friend bool operator>=(IntComparable, IntComparable);
- friend bool operator==(int, IntComparable);
- friend bool operator!=(int, IntComparable);
- friend bool operator==(IntComparable, int);
- friend bool operator!=(IntComparable, int);
- friend bool operator<(int, IntComparable);
- friend bool operator<(IntComparable, int);
- friend bool operator>(int, IntComparable);
- friend bool operator>(IntComparable, int);
- friend bool operator<=(int, IntComparable);
- friend bool operator<=(IntComparable, int);
- friend bool operator>=(int, IntComparable);
- friend bool operator>=(IntComparable, int);
- };
- struct IntSwappable
- {
- operator int() const;
- friend void swap(int &, IntSwappable);
- friend void swap(IntSwappable, int &);
- friend void swap(IntSwappable, IntSwappable);
- };
- static_assert(ranges::same_as<int, int>, "");
- static_assert(ranges::same_as<void, void>, "");
- static_assert(ranges::same_as<void const, void const>, "");
- static_assert(!ranges::same_as<int&, int>, "");
- static_assert(!ranges::same_as<void, void const>, "");
- static_assert(!ranges::same_as<void(), void(*)()>, "");
- static_assert(ranges::convertible_to<int, int>, "");
- static_assert(ranges::convertible_to<short&, short const&>, "");
- static_assert(ranges::convertible_to<int, short>, "");
- static_assert(!ranges::convertible_to<int&, short&>, "");
- static_assert(!ranges::convertible_to<int, void>, "");
- static_assert(!ranges::convertible_to<int, int&>, "");
- static_assert(ranges::unsigned_integral<unsigned>, "");
- static_assert(!ranges::unsigned_integral<int>, "");
- static_assert(ranges::assignable_from<int&, int>, "");
- static_assert(!ranges::assignable_from<int const&, int>, "");
- static_assert(!ranges::assignable_from<int, int>, "");
- static_assert(ranges::destructible<int>, "");
- static_assert(ranges::destructible<const int>, "");
- static_assert(!ranges::destructible<void>, "");
- static_assert(ranges::destructible<int&>, "");
- static_assert(!ranges::destructible<void()>, "");
- static_assert(ranges::destructible<void(*)()>, "");
- static_assert(ranges::destructible<void(&)()>, "");
- static_assert(!ranges::destructible<int[]>, "");
- static_assert(ranges::destructible<int[2]>, "");
- static_assert(ranges::destructible<int(*)[2]>, "");
- static_assert(ranges::destructible<int(&)[2]>, "");
- static_assert(ranges::destructible<moveonly>, "");
- static_assert(ranges::destructible<nonmovable>, "");
- static_assert(!ranges::destructible<NotDestructible>, "");
- static_assert(ranges::constructible_from<int>, "");
- static_assert(ranges::constructible_from<int const>, "");
- static_assert(!ranges::constructible_from<void>, "");
- static_assert(!ranges::constructible_from<int const &>, "");
- static_assert(!ranges::constructible_from<int ()>, "");
- static_assert(!ranges::constructible_from<int(&)()>, "");
- static_assert(!ranges::constructible_from<int[]>, "");
- static_assert(ranges::constructible_from<int[5]>, "");
- static_assert(!ranges::constructible_from<nondefaultconstructible>, "");
- static_assert(ranges::constructible_from<int const(&)[5], int(&)[5]>, "");
- static_assert(!ranges::constructible_from<int, int(&)[3]>, "");
- static_assert(ranges::constructible_from<int, int>, "");
- static_assert(ranges::constructible_from<int, int&>, "");
- static_assert(ranges::constructible_from<int, int&&>, "");
- static_assert(ranges::constructible_from<int, const int>, "");
- static_assert(ranges::constructible_from<int, const int&>, "");
- static_assert(ranges::constructible_from<int, const int&&>, "");
- static_assert(!ranges::constructible_from<int&, int>, "");
- static_assert(ranges::constructible_from<int&, int&>, "");
- static_assert(!ranges::constructible_from<int&, int&&>, "");
- static_assert(!ranges::constructible_from<int&, const int>, "");
- static_assert(!ranges::constructible_from<int&, const int&>, "");
- static_assert(!ranges::constructible_from<int&, const int&&>, "");
- static_assert(ranges::constructible_from<const int&, int>, "");
- static_assert(ranges::constructible_from<const int&, int&>, "");
- static_assert(ranges::constructible_from<const int&, int&&>, "");
- static_assert(ranges::constructible_from<const int&, const int>, "");
- static_assert(ranges::constructible_from<const int&, const int&>, "");
- static_assert(ranges::constructible_from<const int&, const int&&>, "");
- static_assert(ranges::constructible_from<int&&, int>, "");
- static_assert(!ranges::constructible_from<int&&, int&>, "");
- static_assert(ranges::constructible_from<int&&, int&&>, "");
- static_assert(!ranges::constructible_from<int&&, const int>, "");
- static_assert(!ranges::constructible_from<int&&, const int&>, "");
- static_assert(!ranges::constructible_from<int&&, const int&&>, "");
- static_assert(ranges::constructible_from<const int&&, int>, "");
- static_assert(!ranges::constructible_from<const int&&, int&>, "");
- static_assert(ranges::constructible_from<const int&&, int&&>, "");
- static_assert(ranges::constructible_from<const int&&, const int>, "");
- static_assert(!ranges::constructible_from<const int&&, const int&>, "");
- static_assert(ranges::constructible_from<const int&&, const int&&>, "");
- struct XXX
- {
- XXX() = default;
- XXX(XXX&&) = delete;
- explicit XXX(int) {}
- };
- static_assert(ranges::constructible_from<XXX, int>, "");
- static_assert(!ranges::move_constructible<XXX>, "");
- static_assert(!ranges::movable<XXX>, "");
- static_assert(!ranges::semiregular<XXX>, "");
- static_assert(!ranges::regular<XXX>, "");
- static_assert(ranges::default_constructible<int>, "");
- static_assert(ranges::default_constructible<int const>, "");
- static_assert(!ranges::default_constructible<int const &>, "");
- static_assert(!ranges::default_constructible<int ()>, "");
- static_assert(!ranges::default_constructible<int(&)()>, "");
- static_assert(!ranges::default_constructible<int[]>, "");
- static_assert(ranges::default_constructible<int[5]>, "");
- static_assert(!ranges::default_constructible<nondefaultconstructible>, "");
- static_assert(ranges::move_constructible<int>, "");
- static_assert(ranges::move_constructible<const int>, "");
- static_assert(ranges::move_constructible<int &>, "");
- static_assert(ranges::move_constructible<int &&>, "");
- static_assert(ranges::move_constructible<const int &>, "");
- static_assert(ranges::move_constructible<const int &&>, "");
- static_assert(ranges::destructible<moveonly>, "");
- static_assert(ranges::constructible_from<moveonly, moveonly>, "");
- static_assert(ranges::move_constructible<moveonly>, "");
- static_assert(!ranges::move_constructible<nonmovable>, "");
- static_assert(ranges::move_constructible<nonmovable &>, "");
- static_assert(ranges::move_constructible<nonmovable &&>, "");
- static_assert(ranges::move_constructible<const nonmovable &>, "");
- static_assert(ranges::move_constructible<const nonmovable &&>, "");
- static_assert(ranges::copy_constructible<int>, "");
- static_assert(ranges::copy_constructible<const int>, "");
- static_assert(ranges::copy_constructible<int &>, "");
- static_assert(!ranges::copy_constructible<int &&>, "");
- static_assert(ranges::copy_constructible<const int &>, "");
- static_assert(!ranges::copy_constructible<const int &&>, "");
- static_assert(!ranges::copy_constructible<moveonly>, "");
- static_assert(!ranges::copy_constructible<nonmovable>, "");
- static_assert(ranges::copy_constructible<nonmovable &>, "");
- static_assert(!ranges::copy_constructible<nonmovable &&>, "");
- static_assert(ranges::copy_constructible<const nonmovable &>, "");
- static_assert(!ranges::copy_constructible<const nonmovable &&>, "");
- static_assert(ranges::movable<int>, "");
- static_assert(!ranges::movable<int const>, "");
- static_assert(ranges::movable<moveonly>, "");
- static_assert(!ranges::movable<nonmovable>, "");
- static_assert(ranges::copyable<int>, "");
- static_assert(!ranges::copyable<int const>, "");
- static_assert(!ranges::copyable<moveonly>, "");
- static_assert(!ranges::copyable<nonmovable>, "");
- // static_assert(ranges::predicate<std::less<int>, int, int>, "");
- // static_assert(!ranges::predicate<std::less<int>, char*, int>, "");
- static_assert(ranges::input_iterator<int*>, "");
- static_assert(!ranges::input_iterator<int>, "");
- static_assert(ranges::forward_iterator<int*>, "");
- static_assert(!ranges::forward_iterator<int>, "");
- static_assert(ranges::bidirectional_iterator<int*>, "");
- static_assert(!ranges::bidirectional_iterator<int>, "");
- static_assert(ranges::random_access_iterator<int*>, "");
- static_assert(!ranges::random_access_iterator<int>, "");
- static_assert(ranges::contiguous_iterator<int*>, "");
- static_assert(!ranges::contiguous_iterator<int>, "");
- static_assert(ranges::view_<ranges::istream_view<int>>, "");
- static_assert(ranges::input_iterator<ranges::iterator_t<ranges::istream_view<int>>>, "");
- static_assert(!ranges::view_<int>, "");
- static_assert(ranges::common_range<std::vector<int> >, "");
- static_assert(ranges::common_range<std::vector<int> &>, "");
- static_assert(!ranges::view_<std::vector<int>>, "");
- static_assert(!ranges::view_<std::vector<int> &>, "");
- static_assert(ranges::random_access_iterator<ranges::iterator_t<std::vector<int> const &>>, "");
- static_assert(!ranges::common_range<ranges::istream_view<int>>, "");
- static_assert(ranges::predicate<std::less<int>, int, int>, "");
- static_assert(!ranges::predicate<std::less<int>, char*, int>, "");
- static_assert(ranges::output_iterator<int *, int>, "");
- static_assert(!ranges::output_iterator<int const *, int>, "");
- static_assert(ranges::swappable<int &>, "");
- static_assert(ranges::swappable<int>, "");
- static_assert(!ranges::swappable<int const &>, "");
- static_assert(ranges::swappable<IntSwappable>, "");
- static_assert(ranges::swappable_with<IntSwappable, int &>, "");
- static_assert(!ranges::swappable_with<IntSwappable, int const &>, "");
- static_assert(ranges::totally_ordered<int>, "");
- static_assert(ranges::common_with<int, IntComparable>, "");
- static_assert(ranges::common_reference_with<int &, IntComparable &>, "");
- static_assert(ranges::totally_ordered_with<int, IntComparable>, "");
- static_assert(ranges::totally_ordered_with<IntComparable, int>, "");
- static_assert(ranges::detail::weakly_equality_comparable_with_<int, int>, "");
- static_assert(ranges::equality_comparable<int>, "");
- static_assert(ranges::equality_comparable_with<int, int>, "");
- static_assert(ranges::equality_comparable_with<int, IntComparable>, "");
- static_assert(ranges::equality_comparable_with<int &, IntComparable &>, "");
- #if __cplusplus > 201703L && __has_include(<compare>) && \
- defined(__cpp_concepts) && defined(__cpp_impl_three_way_comparison)
- #include <compare>
- static_assert(ranges::three_way_comparable<int>);
- static_assert(ranges::three_way_comparable<int, std::partial_ordering>);
- static_assert(ranges::three_way_comparable<int, std::weak_ordering>);
- static_assert(ranges::three_way_comparable<int, std::strong_ordering>);
- static_assert(ranges::three_way_comparable_with<int, IntComparable>);
- static_assert(ranges::three_way_comparable_with<int, IntComparable, std::partial_ordering>);
- static_assert(ranges::three_way_comparable_with<int, IntComparable, std::weak_ordering>);
- static_assert(ranges::three_way_comparable_with<int, IntComparable, std::strong_ordering>);
- static_assert(ranges::three_way_comparable_with<IntComparable, int>);
- static_assert(ranges::three_way_comparable_with<IntComparable, int, std::partial_ordering>);
- static_assert(ranges::three_way_comparable_with<IntComparable, int, std::weak_ordering>);
- static_assert(ranges::three_way_comparable_with<IntComparable, int, std::strong_ordering>);
- #endif // supports spaceship
- static_assert(
- std::is_same<
- ranges::common_range_tag_of<std::vector<int>>,
- ranges::common_range_tag
- >::value, "");
- static_assert(
- std::is_same<
- ranges::sized_range_tag_of<std::vector<int>>,
- ranges::sized_range_tag
- >::value, "");
- static_assert(ranges::view_<ranges::istream_view<int>>, "");
- static_assert(!ranges::common_range<ranges::istream_view<int>>, "");
- static_assert(!ranges::sized_range<ranges::istream_view<int>>, "");
- struct myview : ranges::view_base {
- const char *begin();
- const char *end();
- };
- CPP_assert(ranges::view_<myview>);
- CPP_template(class T)
- (requires ranges::regular<T>)
- constexpr bool is_regular(T&&)
- {
- return true;
- }
- CPP_template(class T)
- (requires (!ranges::regular<T>))
- constexpr bool is_regular(T&&)
- {
- return false;
- }
- static_assert(is_regular(42), "");
- static_assert(!is_regular(XXX{}), "");
- int main()
- {
- return test_result();
- }
|