/// \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_SINGLE_HPP #define RANGES_V3_VIEW_SINGLE_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ranges { /// \addtogroup group-views /// @{ template struct single_view : view_interface, (cardinality)1> { private: CPP_assert(copy_constructible); static_assert(std::is_object::value, "The template parameter of single_view must be an object type"); semiregular_box_t value_; template constexpr single_view(in_place_t, std::true_type, Args &&... args) : value_{static_cast(args)...} {} template constexpr single_view(in_place_t, std::false_type, Args &&... args) : value_{in_place, static_cast(args)...} {} public: single_view() = default; constexpr explicit single_view(T const & t) : value_(t) {} constexpr explicit single_view(T && t) : value_(std::move(t)) {} CPP_template(class... Args)( // requires constructible_from) // constexpr single_view(in_place_t, Args &&... args) : single_view{in_place, meta::bool_<(bool)semiregular>{}, static_cast(args)...} {} constexpr T * begin() noexcept { return data(); } constexpr T const * begin() const noexcept { return data(); } constexpr T * end() noexcept { return data() + 1; } constexpr T const * end() const noexcept { return data() + 1; } constexpr static std::size_t size() noexcept { return 1u; } constexpr T * data() noexcept { return detail::addressof(static_cast(value_)); } constexpr T const * data() const noexcept { return detail::addressof(static_cast(value_)); } }; #if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17 template explicit single_view(T &&)->single_view>; #endif namespace views { struct single_fn { template auto operator()(Val value) const -> CPP_ret(single_view)( // requires copy_constructible) { return single_view{std::move(value)}; } }; /// \relates single_fn /// \ingroup group-views RANGES_INLINE_VARIABLE(single_fn, single) } // namespace views namespace cpp20 { namespace views { using ranges::views::single; } CPP_template(typename T)( // requires std::is_object::value) // using single_view = ranges::single_view; } // namespace cpp20 /// @} } // namespace ranges #include RANGES_SATISFY_BOOST_RANGE(::ranges::single_view) #endif