28 #ifndef ZYPPNG_BASE_RANGES_H 29 #define ZYPPNG_BASE_RANGES_H 32 #include <type_traits> 40 #if defined(__cpp_lib_ranges) && __cpp_lib_ranges >= 201911L && !defined(ZYPPNG_FORCE_NANORANGE) 44 # include <nanorange/nanorange.hpp> 59 using namespace ::zyppng::_detail::polyfill;
62 namespace views = ::zyppng::_detail::polyfill::views;
81 using reserve_op = decltype( std::declval<T&>().reserve( std::declval<std::size_t>() ) );
84 using size_op = decltype( std::declval<const T&>().size() );
87 template<
typename Container,
typename Range>
90 if constexpr ( std::is_detected_v<reserve_op, Container>
91 && std::is_detected_v<size_op, Range> )
92 c.reserve( r.size() );
108 template<
typename Container,
typename Range>
117 if constexpr ( std::is_rvalue_reference<Range&&>::value ) {
118 std::move( std::begin(range), std::end(range),
119 std::inserter(result, std::end(result)) );
121 std::copy( std::begin(range), std::end(range),
122 std::inserter(result, std::end(result)) );
128 template<
typename Container>
130 template<
typename Range>
133 return zyppng::ranges::to<Container>( std::forward<Range>(range) );
137 template<
typename Container>
142 #endif // ZYPPNG_BASE_RANGES_H
decltype(std::declval< const T & >().size()) size_op
Container to(Range &&range)
Convert any range into a Container.
friend Container operator|(Range &&range, to_fn)
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
void maybe_reserve(Container &c, const Range &r)
decltype(std::declval< T & >().reserve(std::declval< std::size_t >())) reserve_op