1 | #pragma once |
1 | #pragma once |
2 | |
2 | |
3 | template<typename Container> |
3 | template<typename Container> |
4 | struct container_slice |
4 | struct slice_view |
5 | { |
5 | { |
6 | typedef Container container_type; |
6 | typedef Container container_type; |
7 | |
7 | |
8 | typedef typename container_type::const_iterator const_iterator; |
8 | typedef typename container_type::const_iterator const_iterator; |
9 | typedef typename container_type::iterator iterator; |
9 | typedef typename container_type::iterator iterator; |
10 | |
10 | |
|
|
11 | typedef typename container_type::const_reverse_iterator const_reverse_iterator; |
|
|
12 | typedef typename container_type::reverse_iterator reverse_iterator; |
|
|
13 | |
11 | container_slice (Container const &container, size_t offset) |
14 | slice_view (Container const &container, size_t offset) |
12 | : container (container) |
15 | : container (container) |
13 | , offset (offset) |
16 | , offset (offset) |
14 | { |
17 | { |
15 | if (container.size () < offset) |
18 | if (container.size () < offset) |
16 | throw "slice out of bounds"; |
19 | throw "slice out of bounds"; |
… | |
… | |
19 | } |
22 | } |
20 | |
23 | |
21 | const_iterator begin () const { return container.begin () + offset; } |
24 | const_iterator begin () const { return container.begin () + offset; } |
22 | const_iterator end () const { return container.end (); } |
25 | const_iterator end () const { return container.end (); } |
23 | |
26 | |
|
|
27 | const_reverse_iterator rbegin () const { return container.rbegin () + offset; } |
|
|
28 | const_reverse_iterator rend () const { return container.rend (); } |
|
|
29 | |
24 | private: |
30 | private: |
25 | container_type const &container; |
31 | container_type const &container; |
26 | size_t offset; |
32 | size_t offset; |
27 | }; |
33 | }; |
28 | |
34 | |
29 | template<typename Container> |
35 | template<typename Container> |
30 | container_slice<Container> |
36 | slice_view<Container> |
31 | slice (Container const &container, size_t offset) |
37 | slice (Container const &container, size_t offset) |
32 | { |
38 | { |
33 | return container_slice<Container> (container, offset); |
39 | return slice_view<Container> (container, offset); |
34 | } |
40 | } |