/// \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_VIEW_REF_HPP #define RANGES_V3_VIEW_REF_HPP #include #include #include #include #include #include #include #include namespace ranges { template struct ref_view; template RANGES_INLINE_VAR constexpr bool enable_borrowed_range> = true; /// \addtogroup group-views /// @{ template struct ref_view : view_interface, range_cardinality::value> { private: CPP_assert(range); static_assert(std::is_object::value, ""); Rng * rng_ = nullptr; // exposition only public: constexpr ref_view() noexcept = default; constexpr ref_view(Rng & rng) noexcept : rng_(detail::addressof(rng)) {} constexpr Rng & base() const noexcept { return *rng_; } constexpr iterator_t begin() const noexcept(noexcept(ranges::begin(*rng_))) { return ranges::begin(*rng_); } constexpr sentinel_t end() const noexcept(noexcept(ranges::end(*rng_))) { return ranges::end(*rng_); } CPP_member constexpr auto empty() const noexcept(noexcept(ranges::empty(*rng_))) -> CPP_ret(bool)( requires detail::can_empty_) { return ranges::empty(*rng_); } CPP_auto_member constexpr auto CPP_fun(size)()(const // noexcept(noexcept(ranges::size(*rng_))) // requires sized_range) { return ranges::size(*rng_); } CPP_auto_member constexpr auto CPP_fun(data)()(const // noexcept(noexcept(ranges::data(*rng_))) // requires contiguous_range) { return ranges::data(*rng_); } }; #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17 template(typename R)( requires range) ref_view(R &) // -> ref_view; #endif namespace views { struct ref_fn { template(typename Rng)( requires range) constexpr ref_view operator()(Rng & rng) const noexcept { return ref_view(rng); } template void operator()(Rng const && rng) const = delete; }; /// \relates const_fn /// \ingroup group-views RANGES_INLINE_VARIABLE(ref_fn, ref) } // namespace views namespace cpp20 { template(typename Rng)( requires std::is_object::value) // using ref_view = ranges::ref_view; } } // namespace ranges #include RANGES_SATISFY_BOOST_RANGE(::ranges::ref_view) #include #endif