Chris@16
|
1 // Boost.Geometry Index
|
Chris@16
|
2 //
|
Chris@16
|
3 // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
|
Chris@16
|
4 //
|
Chris@16
|
5 // Use, modification and distribution is subject to the Boost Software License,
|
Chris@16
|
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8
|
Chris@16
|
9 #ifndef BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP
|
Chris@16
|
10 #define BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP
|
Chris@16
|
11
|
Chris@16
|
12 #include <boost/array.hpp>
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/geometry/index/detail/assert.hpp>
|
Chris@16
|
15
|
Chris@16
|
16 namespace boost { namespace geometry { namespace index { namespace detail {
|
Chris@16
|
17
|
Chris@16
|
18 template <typename Element, size_t Capacity>
|
Chris@16
|
19 class pushable_array
|
Chris@16
|
20 {
|
Chris@16
|
21 typedef typename boost::array<Element, Capacity> array_type;
|
Chris@16
|
22
|
Chris@16
|
23 public:
|
Chris@16
|
24 typedef typename array_type::value_type value_type;
|
Chris@16
|
25 typedef typename array_type::size_type size_type;
|
Chris@16
|
26 typedef typename array_type::iterator iterator;
|
Chris@16
|
27 typedef typename array_type::const_iterator const_iterator;
|
Chris@16
|
28 typedef typename array_type::reverse_iterator reverse_iterator;
|
Chris@16
|
29 typedef typename array_type::const_reverse_iterator const_reverse_iterator;
|
Chris@16
|
30 typedef typename array_type::reference reference;
|
Chris@16
|
31 typedef typename array_type::const_reference const_reference;
|
Chris@16
|
32
|
Chris@16
|
33 inline pushable_array()
|
Chris@16
|
34 : m_size(0)
|
Chris@16
|
35 {}
|
Chris@16
|
36
|
Chris@16
|
37 inline explicit pushable_array(size_type s)
|
Chris@16
|
38 : m_size(s)
|
Chris@16
|
39 {
|
Chris@16
|
40 BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
|
Chris@16
|
41 }
|
Chris@16
|
42
|
Chris@16
|
43 inline void resize(size_type s)
|
Chris@16
|
44 {
|
Chris@16
|
45 BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
|
Chris@16
|
46 m_size = s;
|
Chris@16
|
47 }
|
Chris@16
|
48
|
Chris@16
|
49 inline void reserve(size_type /*s*/)
|
Chris@16
|
50 {
|
Chris@16
|
51 //BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big");
|
Chris@16
|
52 // do nothing
|
Chris@16
|
53 }
|
Chris@16
|
54
|
Chris@16
|
55 inline Element & operator[](size_type i)
|
Chris@16
|
56 {
|
Chris@16
|
57 BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container");
|
Chris@16
|
58 return m_array[i];
|
Chris@16
|
59 }
|
Chris@16
|
60
|
Chris@16
|
61 inline Element const& operator[](size_type i) const
|
Chris@16
|
62 {
|
Chris@16
|
63 BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container");
|
Chris@16
|
64 return m_array[i];
|
Chris@16
|
65 }
|
Chris@16
|
66
|
Chris@16
|
67 inline Element const& front() const
|
Chris@16
|
68 {
|
Chris@16
|
69 BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
|
Chris@16
|
70 return m_array.front();
|
Chris@16
|
71 }
|
Chris@16
|
72
|
Chris@16
|
73 inline Element & front()
|
Chris@16
|
74 {
|
Chris@16
|
75 BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
|
Chris@16
|
76 return m_array.front();
|
Chris@16
|
77 }
|
Chris@16
|
78
|
Chris@16
|
79 inline Element const& back() const
|
Chris@16
|
80 {
|
Chris@16
|
81 BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
|
Chris@16
|
82 return *(begin() + (m_size - 1));
|
Chris@16
|
83 }
|
Chris@16
|
84
|
Chris@16
|
85 inline Element & back()
|
Chris@16
|
86 {
|
Chris@16
|
87 BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
|
Chris@16
|
88 return *(begin() + (m_size - 1));
|
Chris@16
|
89 }
|
Chris@16
|
90
|
Chris@16
|
91 inline iterator begin()
|
Chris@16
|
92 {
|
Chris@16
|
93 return m_array.begin();
|
Chris@16
|
94 }
|
Chris@16
|
95
|
Chris@16
|
96 inline iterator end()
|
Chris@16
|
97 {
|
Chris@16
|
98 return m_array.begin() + m_size;
|
Chris@16
|
99 }
|
Chris@16
|
100
|
Chris@16
|
101 inline const_iterator begin() const
|
Chris@16
|
102 {
|
Chris@16
|
103 return m_array.begin();
|
Chris@16
|
104 }
|
Chris@16
|
105
|
Chris@16
|
106 inline const_iterator end() const
|
Chris@16
|
107 {
|
Chris@16
|
108 return m_array.begin() + m_size;
|
Chris@16
|
109 }
|
Chris@16
|
110
|
Chris@16
|
111 inline reverse_iterator rbegin()
|
Chris@16
|
112 {
|
Chris@16
|
113 return reverse_iterator(end());
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 inline reverse_iterator rend()
|
Chris@16
|
117 {
|
Chris@16
|
118 return reverse_iterator(begin());
|
Chris@16
|
119 }
|
Chris@16
|
120
|
Chris@16
|
121 inline const_reverse_iterator rbegin() const
|
Chris@16
|
122 {
|
Chris@16
|
123 return const_reverse_iterator(end());
|
Chris@16
|
124 }
|
Chris@16
|
125
|
Chris@16
|
126 inline const_reverse_iterator rend() const
|
Chris@16
|
127 {
|
Chris@16
|
128 return const_reverse_iterator(begin());
|
Chris@16
|
129 }
|
Chris@16
|
130
|
Chris@16
|
131 inline void clear()
|
Chris@16
|
132 {
|
Chris@16
|
133 m_size = 0;
|
Chris@16
|
134 }
|
Chris@16
|
135
|
Chris@16
|
136 inline void push_back(Element const& v)
|
Chris@16
|
137 {
|
Chris@16
|
138 BOOST_GEOMETRY_INDEX_ASSERT(m_size < Capacity, "can't further increase the size of the container");
|
Chris@16
|
139 m_array[m_size] = v;
|
Chris@16
|
140 ++m_size;
|
Chris@16
|
141 }
|
Chris@16
|
142
|
Chris@16
|
143 inline void pop_back()
|
Chris@16
|
144 {
|
Chris@16
|
145 BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container");
|
Chris@16
|
146 --m_size;
|
Chris@16
|
147 }
|
Chris@16
|
148
|
Chris@16
|
149 inline bool empty() const
|
Chris@16
|
150 {
|
Chris@16
|
151 return m_size == 0;
|
Chris@16
|
152 }
|
Chris@16
|
153
|
Chris@16
|
154 inline size_t size() const
|
Chris@16
|
155 {
|
Chris@16
|
156 return m_size;
|
Chris@16
|
157 }
|
Chris@16
|
158
|
Chris@16
|
159 inline size_t capacity() const
|
Chris@16
|
160 {
|
Chris@16
|
161 return Capacity;
|
Chris@16
|
162 }
|
Chris@16
|
163
|
Chris@16
|
164 private:
|
Chris@16
|
165 boost::array<Element, Capacity> m_array;
|
Chris@16
|
166 size_type m_size;
|
Chris@16
|
167 };
|
Chris@16
|
168
|
Chris@16
|
169 }}}} // namespace boost::geometry::index::detail
|
Chris@16
|
170
|
Chris@16
|
171 #endif // BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP
|