Chris@16: // Boost.Geometry Index Chris@16: // Chris@16: // Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland. Chris@16: // Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP Chris@16: #define BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace geometry { namespace index { namespace detail { Chris@16: Chris@16: template Chris@16: class pushable_array Chris@16: { Chris@16: typedef typename boost::array array_type; Chris@16: Chris@16: public: Chris@16: typedef typename array_type::value_type value_type; Chris@16: typedef typename array_type::size_type size_type; Chris@16: typedef typename array_type::iterator iterator; Chris@16: typedef typename array_type::const_iterator const_iterator; Chris@16: typedef typename array_type::reverse_iterator reverse_iterator; Chris@16: typedef typename array_type::const_reverse_iterator const_reverse_iterator; Chris@16: typedef typename array_type::reference reference; Chris@16: typedef typename array_type::const_reference const_reference; Chris@16: Chris@16: inline pushable_array() Chris@16: : m_size(0) Chris@16: {} Chris@16: Chris@16: inline explicit pushable_array(size_type s) Chris@16: : m_size(s) Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big"); Chris@16: } Chris@16: Chris@16: inline void resize(size_type s) Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big"); Chris@16: m_size = s; Chris@16: } Chris@16: Chris@16: inline void reserve(size_type /*s*/) Chris@16: { Chris@16: //BOOST_GEOMETRY_INDEX_ASSERT(s <= Capacity, "size too big"); Chris@16: // do nothing Chris@16: } Chris@16: Chris@16: inline Element & operator[](size_type i) Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container"); Chris@16: return m_array[i]; Chris@16: } Chris@16: Chris@16: inline Element const& operator[](size_type i) const Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(i < m_size, "index of the element outside the container"); Chris@16: return m_array[i]; Chris@16: } Chris@16: Chris@16: inline Element const& front() const Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container"); Chris@16: return m_array.front(); Chris@16: } Chris@16: Chris@16: inline Element & front() Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container"); Chris@16: return m_array.front(); Chris@16: } Chris@16: Chris@16: inline Element const& back() const Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container"); Chris@16: return *(begin() + (m_size - 1)); Chris@16: } Chris@16: Chris@16: inline Element & back() Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container"); Chris@16: return *(begin() + (m_size - 1)); Chris@16: } Chris@16: Chris@16: inline iterator begin() Chris@16: { Chris@16: return m_array.begin(); Chris@16: } Chris@16: Chris@16: inline iterator end() Chris@16: { Chris@16: return m_array.begin() + m_size; Chris@16: } Chris@16: Chris@16: inline const_iterator begin() const Chris@16: { Chris@16: return m_array.begin(); Chris@16: } Chris@16: Chris@16: inline const_iterator end() const Chris@16: { Chris@16: return m_array.begin() + m_size; Chris@16: } Chris@16: Chris@16: inline reverse_iterator rbegin() Chris@16: { Chris@16: return reverse_iterator(end()); Chris@16: } Chris@16: Chris@16: inline reverse_iterator rend() Chris@16: { Chris@16: return reverse_iterator(begin()); Chris@16: } Chris@16: Chris@16: inline const_reverse_iterator rbegin() const Chris@16: { Chris@16: return const_reverse_iterator(end()); Chris@16: } Chris@16: Chris@16: inline const_reverse_iterator rend() const Chris@16: { Chris@16: return const_reverse_iterator(begin()); Chris@16: } Chris@16: Chris@16: inline void clear() Chris@16: { Chris@16: m_size = 0; Chris@16: } Chris@16: Chris@16: inline void push_back(Element const& v) Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(m_size < Capacity, "can't further increase the size of the container"); Chris@16: m_array[m_size] = v; Chris@16: ++m_size; Chris@16: } Chris@16: Chris@16: inline void pop_back() Chris@16: { Chris@16: BOOST_GEOMETRY_INDEX_ASSERT(0 < m_size, "there are no elements in the container"); Chris@16: --m_size; Chris@16: } Chris@16: Chris@16: inline bool empty() const Chris@16: { Chris@16: return m_size == 0; Chris@16: } Chris@16: Chris@16: inline size_t size() const Chris@16: { Chris@16: return m_size; Chris@16: } Chris@16: Chris@16: inline size_t capacity() const Chris@16: { Chris@16: return Capacity; Chris@16: } Chris@16: Chris@16: private: Chris@16: boost::array m_array; Chris@16: size_type m_size; Chris@16: }; Chris@16: Chris@16: }}}} // namespace boost::geometry::index::detail Chris@16: Chris@16: #endif // BOOST_GEOMETRY_INDEX_DETAIL_PUSHABLE_ARRAY_HPP