1 // Boost.Range library
2 //
3 //  Copyright Thorsten Ottosen, Neil Groves 2006. Use, modification and
4 //  distribution is subject to the Boost Software License, Version
5 //  1.0. (See accompanying file LICENSE_1_0.txt or copy at
6 //  http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // For more information, see http://www.boost.org/libs/range/
9 //
10 
11 #ifndef BOOST_RANGE_ADAPTOR_COPIED_HPP
12 #define BOOST_RANGE_ADAPTOR_COPIED_HPP
13 
14 #include <boost/range/adaptor/argument_fwd.hpp>
15 #include <boost/range/adaptor/sliced.hpp>
16 #include <boost/range/size_type.hpp>
17 #include <boost/range/iterator_range.hpp>
18 #include <boost/range/concepts.hpp>
19 
20 namespace boost
21 {
22     namespace adaptors
23     {
24         struct copied
25         {
copiedboost::adaptors::copied26             copied(std::size_t t_, std::size_t u_)
27                 : t(t_), u(u_) {}
28 
29             std::size_t t;
30             std::size_t u;
31         };
32 
33         template<class CopyableRandomAccessRange>
34         inline CopyableRandomAccessRange
operator |(const CopyableRandomAccessRange & r,const copied & f)35         operator|(const CopyableRandomAccessRange& r, const copied& f)
36         {
37             BOOST_RANGE_CONCEPT_ASSERT((
38                 RandomAccessRangeConcept<const CopyableRandomAccessRange>));
39 
40             iterator_range<
41                 BOOST_DEDUCED_TYPENAME range_iterator<
42                     const CopyableRandomAccessRange
43                 >::type
44             > temp(adaptors::slice(r, f.t, f.u));
45 
46             return CopyableRandomAccessRange(temp.begin(), temp.end());
47         }
48 
49         template<class CopyableRandomAccessRange>
50         inline CopyableRandomAccessRange
copy(const CopyableRandomAccessRange & rng,std::size_t t,std::size_t u)51         copy(const CopyableRandomAccessRange& rng, std::size_t t, std::size_t u)
52         {
53             BOOST_RANGE_CONCEPT_ASSERT((
54                 RandomAccessRangeConcept<const CopyableRandomAccessRange>));
55 
56             iterator_range<
57                 BOOST_DEDUCED_TYPENAME range_iterator<
58                     const CopyableRandomAccessRange
59                 >::type
60             > temp(adaptors::slice(rng, t, u));
61 
62             return CopyableRandomAccessRange( temp.begin(), temp.end() );
63         }
64     } // 'adaptors'
65 
66 }
67 
68 #endif // include guard
69