/// \file // Range v3 library // // Copyright Eric Niebler 2013-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 // #ifndef RANGES_V3_ACTION_CONCEPTS_HPP #define RANGES_V3_ACTION_CONCEPTS_HPP #include #include #include #include #include #include namespace ranges { /// \cond namespace detail { template struct movable_input_iterator { using iterator_category = std::input_iterator_tag; using value_type = T; using difference_type = std::ptrdiff_t; using pointer = T *; using reference = T &&; movable_input_iterator() = default; movable_input_iterator & operator++(); movable_input_iterator operator++(int); bool operator==(movable_input_iterator const &) const; bool operator!=(movable_input_iterator const &) const; T && operator*() const; }; } // namespace detail /// \endcond /// \addtogroup group-range /// @{ // clang-format off /// \concept semi_container /// \brief The \c semi_container concept /// \c std::array is a \c semi_container, native arrays are not. template CPP_concept semi_container = forward_range && default_constructible> && movable> && !view_; /// \concept container_ /// \brief The \c container_ concept /// \c std::vector is a container, \c std::array is not template(typename T)( concept (container_)(T), constructible_from< uncvref_t, detail::movable_input_iterator>, detail::movable_input_iterator>> ); /// \concept container /// \brief The \c container concept template CPP_concept container = semi_container && CPP_concept_ref(ranges::container_, T); /// \concept reservable_ /// \brief The \c reservable_ concept template CPP_requires(reservable_, requires(C & c, C const & cc) // ( c.reserve(ranges::size(c)), cc.capacity(), cc.max_size(), concepts::requires_>, concepts::requires_> )); /// \concept reservable /// \brief The \c reservable concept template CPP_concept reservable = container && sized_range && CPP_requires_ref(ranges::reservable_, C); /// \concept reservable_with_assign_ /// \brief The \c reservable_with_assign_ concept template CPP_requires(reservable_with_assign_, requires(C & c, I i) // ( c.assign(i, i) )); /// \concept reservable_with_assign /// \brief The \c reservable_with_assign concept template CPP_concept reservable_with_assign = reservable && // input_iterator && // CPP_requires_ref(ranges::reservable_with_assign_, C, I); /// \concept random_access_reservable /// \brief The \c random_access_reservable concept template CPP_concept random_access_reservable = reservable && random_access_range; // clang-format on /// \cond namespace detail { template(typename T)( requires container) std::true_type is_lvalue_container_like(T &) noexcept { return {}; } template(typename T)( requires container) meta::not_> // is_lvalue_container_like(reference_wrapper) noexcept { return {}; } template(typename T)( requires container) std::true_type is_lvalue_container_like(std::reference_wrapper) noexcept { return {}; } template(typename T)( requires container) std::true_type is_lvalue_container_like(ref_view) noexcept { return {}; } template using is_lvalue_container_like_t = decltype(detail::is_lvalue_container_like(std::declval())); } // namespace detail /// \endcond // clang-format off /// \concept lvalue_container_like_ /// \brief The \c lvalue_container_like_ concept template(typename T)( concept (lvalue_container_like_)(T), implicitly_convertible_to, std::true_type> ); /// \concept lvalue_container_like /// \brief The \c lvalue_container_like concept template CPP_concept lvalue_container_like = forward_range && CPP_concept_ref(ranges::lvalue_container_like_, T); // clang-format on /// @} } // namespace ranges #include #endif