#ifndef SPROUT_RANGE_ADAPTOR_VALUED_HPP #define SPROUT_RANGE_ADAPTOR_VALUED_HPP #include #include #include #include #include #include #include #include #include #include #include namespace sprout { namespace adaptors { // // valued_range // template class valued_range : public sprout::range::range_container< sprout::valued_iterator::iterator, T> > , public sprout::detail::container_nosy_static_size , public sprout::detail::container_nosy_fixed_size { public: typedef Range range_type; typedef sprout::range::range_container< sprout::valued_iterator::iterator, T> > base_type; typedef typename base_type::iterator iterator; typedef typename base_type::value_type value_type; typedef typename iterator::param_type param_type; public: valued_range() = default; valued_range(valued_range const&) = default; SPROUT_CONSTEXPR valued_range(param_type param, range_type& range) : base_type( iterator(sprout::begin(range), param), iterator(sprout::end(range), param) ) {} }; // // valued_holder // template class valued_holder { public: typedef T content_type; typedef sprout::value_holder holder_type; typedef typename holder_type::param_type param_type; typedef typename holder_type::mutable_or_const_reference get_type; private: holder_type holder_; public: valued_holder() = default; valued_holder(valued_holder const&) = default; explicit SPROUT_CONSTEXPR valued_holder(param_type param) : holder_(param) {} SPROUT_CONSTEXPR get_type get() const { return holder_.get(); } }; // // valued_forwarder // class valued_forwarder { public: template SPROUT_CONSTEXPR sprout::adaptors::valued_holder operator()(T const& param) { return sprout::adaptors::valued_holder(param); } }; // // valued // namespace { SPROUT_STATIC_CONSTEXPR sprout::adaptors::valued_forwarder valued{}; } // anonymous-namespace // // operator| // template inline SPROUT_CONSTEXPR sprout::adaptors::valued_range< typename std::remove_reference::type>::type, T > operator|(Range&& lhs, sprout::adaptors::valued_holder const& rhs) { return sprout::adaptors::valued_range< typename std::remove_reference::type>::type, T >( rhs.get(), sprout::lvalue_forward(lhs) ); } } // namespace adaptors // // container_construct_traits // template struct container_construct_traits > { public: typedef typename sprout::container_construct_traits::copied_type copied_type; public: template static SPROUT_CONSTEXPR copied_type deep_copy(Cont&& cont) { return sprout::range::fixed::copy(sprout::forward(cont), sprout::pit()); } template static SPROUT_CONSTEXPR copied_type make(Args&&... args) { return sprout::make(sprout::forward(args)...); } template static SPROUT_CONSTEXPR copied_type remake( Cont&& cont, typename sprout::container_traits >::difference_type size, Args&&... args ) { return sprout::remake(sprout::forward(cont), size, sprout::forward(args)...); } }; } // namespace sprout #endif // #ifndef SPROUT_RANGE_ADAPTOR_VALUED_HPP