1
0
Fork 0
mirror of https://github.com/bolero-MURAKAMI/Sprout synced 2025-08-03 12:49:50 +00:00

add sprout/range/adaptor/deep_copied.hpp

fix sprout/range/adaptor/sized.hpp
This commit is contained in:
bolero-MURAKAMI 2012-06-16 15:35:10 +09:00
parent bcd7674cc0
commit 955561e36c
10 changed files with 178 additions and 15 deletions

View file

@ -0,0 +1,36 @@
#ifndef SPROUT_RANGE_ADAPTOR_DEEP_COPIED_HPP
#define SPROUT_RANGE_ADAPTOR_DEEP_COPIED_HPP
#include <sprout/config.hpp>
#include <sprout/container/traits.hpp>
#include <sprout/container/functions.hpp>
#include <sprout/utility/forward.hpp>
namespace sprout {
namespace adaptors {
//
// deep_copied_forwarder
//
class deep_copied_forwarder {};
//
// deep_copied
//
namespace {
SPROUT_STATIC_CONSTEXPR sprout::adaptors::deep_copied_forwarder deep_copied{};
} // anonymous-namespace
//
// operator|
//
template<typename Range>
inline SPROUT_CONSTEXPR typename sprout::container_construct_traits<
typename std::remove_reference<Range>::type
>::copied_type
operator|(Range&& lhs, sprout::adaptors::deep_copied_forwarder const& rhs) {
return sprout::deep_copy(sprout::forward<Range>(lhs));
}
} // namespace adaptors
} // namespace sprout
#endif // #ifndef SPROUT_RANGE_ADAPTOR_DEEP_COPIED_HPP

View file

@ -7,6 +7,7 @@
#include <sprout/pit.hpp>
#include <sprout/container/traits.hpp>
#include <sprout/container/functions.hpp>
#include <sprout/container/metafunctions.hpp>
#include <sprout/range/range_container.hpp>
#include <sprout/range/algorithm/copy.hpp>
#include <sprout/type_traits/lvalue_reference.hpp>
@ -80,7 +81,8 @@ namespace sprout {
explicit SPROUT_CONSTEXPR sized_range(range_type& range)
: base_type(
sprout::begin(range),
sized_impl_type::static_size < sprout::size(range)
sized_impl_type::static_size
< static_cast<typename sprout::container_traits<Range>::size_type>(sprout::size(range))
? sprout::next(sprout::begin(range), sized_impl_type::static_size)
: sprout::end(range)
)
@ -126,8 +128,13 @@ namespace sprout {
//
template<typename Range, typename sprout::container_traits<Range>::size_type Size>
struct container_construct_traits<sprout::adaptors::sized_range<Range, Size> > {
private:
typedef typename sprout::container_construct_traits<Range>::copied_type range_copied_type;
public:
typedef typename sprout::container_construct_traits<Range>::copied_type copied_type;
typedef typename sprout::containers::weak_rebind_size<
range_copied_type,
sprout::adaptors::sized_range<Range, Size>::static_size
>::type copied_type;
public:
template<typename Cont>
static SPROUT_CONSTEXPR copied_type deep_copy(Cont&& cont) {