/// \file // Range v3 library // // Copyright Eric Niebler 2014-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_VIEW_COMMON_HPP #define RANGES_V3_VIEW_COMMON_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ranges { /// \addtogroup group-views /// @{ /// \cond namespace detail { // clang-format off /// \concept random_access_and_sized_range /// \brief The \c random_access_and_sized_range concept template CPP_concept random_access_and_sized_range = random_access_range && sized_range; // clang-format on template using common_view_iterator_t = meta::if_c, iterator_t, common_iterator_t, sentinel_t>>; template struct is_common_range : meta::bool_> {}; } // namespace detail /// \endcond template::value> struct common_view : view_interface, range_cardinality::value> { private: CPP_assert(view_); CPP_assert(!(common_range && view_)); Rng rng_; sentinel_t end_(std::false_type) { return ranges::end(rng_); } iterator_t end_(std::true_type) { return ranges::begin(rng_) + ranges::distance(rng_); } template(bool Const = true)( requires Const AND range>) sentinel_t> end_(std::false_type) const { return ranges::end(rng_); } template(bool Const = true)( requires Const AND range>) iterator_t> end_(std::true_type) const { return ranges::begin(rng_) + ranges::distance(rng_); } public: common_view() = default; explicit common_view(Rng rng) : rng_(detail::move(rng)) {} Rng base() const { return rng_; } detail::common_view_iterator_t begin() { return detail::common_view_iterator_t{ranges::begin(rng_)}; } detail::common_view_iterator_t end() { return detail::common_view_iterator_t{ end_(meta::bool_>{})}; } CPP_auto_member auto CPP_fun(size)()( requires sized_range) { return ranges::size(rng_); } template(bool Const = true)( requires range>) auto begin() const -> detail::common_view_iterator_t> { return detail::common_view_iterator_t>{ ranges::begin(rng_)}; } template(bool Const = true)( requires range>) auto end() const -> detail::common_view_iterator_t> { return detail::common_view_iterator_t>{ end_(meta::bool_>>{})}; } CPP_auto_member auto CPP_fun(size)()(const requires sized_range) { return ranges::size(rng_); } }; template RANGES_INLINE_VAR constexpr bool enable_borrowed_range> = // enable_borrowed_range; #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17 template(typename Rng)( requires (!common_range)) // common_view(Rng &&) ->common_view>; #endif template struct common_view : identity_adaptor { CPP_assert(common_range); using identity_adaptor::identity_adaptor; }; namespace views { struct cpp20_common_fn { template(typename Rng)( requires viewable_range AND common_range) all_t operator()(Rng && rng) const { return all(static_cast(rng)); } template(typename Rng)( requires viewable_range AND (!common_range)) // common_view> operator()(Rng && rng) const { return common_view>{all(static_cast(rng))}; } }; struct common_fn { template(typename Rng)( requires viewable_range) common_view> operator()(Rng && rng) const { return common_view>{all(static_cast(rng))}; } }; /// \relates common_fn /// \ingroup group-views RANGES_INLINE_VARIABLE(view_closure, common) } // namespace views /// @} /// \cond template using bounded_view RANGES_DEPRECATED( "The name bounded_view is deprecated. " "Please use common_view instead.") = common_view; /// \endcond namespace views { /// \cond namespace { RANGES_DEPRECATED( "The name views::bounded is deprecated. " "Please use views::common instead.") RANGES_INLINE_VAR constexpr auto & bounded = common; } // namespace template using bounded_t RANGES_DEPRECATED("The name views::bounded_t is deprecated.") = decltype(common(std::declval())); /// \endcond } // namespace views namespace cpp20 { namespace views { RANGES_INLINE_VARIABLE( ranges::views::view_closure, common) } template(typename Rng)( requires view_ && (!common_range)) // using common_view = ranges::common_view; } // namespace cpp20 } // namespace ranges #include #include RANGES_SATISFY_BOOST_RANGE(::ranges::common_view) #endif