#pragma once namespace stream { namespace detail { namespace source { template class iterator : public iterator_impl { public: typedef iterator_impl super; explicit iterator(typename C::iterator it) : impl_(it) {} ~iterator() {} typename C::value_type operator*() override { return *impl_; } DELEGATE_ITERATOR_IMPL(impl_) private: typename C::const_iterator impl_; }; } template class source_stream : public stream_impl { public: typedef typename C::value_type value_type; explicit source_stream(C const& cont) : source_(cont) {} explicit source_stream(C && cont) : source_(std::forward(cont)) {} ~source_stream() override {} iterator begin() override { return {new source::iterator{source_.begin()}}; } iterator end() override { return {new source::iterator{source_.end()}}; } private: C source_; }; } template detail::stream_base make_stream(C const& cont) { return {std::make_shared>(cont)}; } }