38 #ifndef BLOCXX_SORTED_VECTOR_MAP_HPP_ 39 #define BLOCXX_SORTED_VECTOR_MAP_HPP_ 40 #include "blocxx/BLOCXX_config.h" 51 template <
class Key,
class T,
class Compare>
52 class SortedVectorMapDataCompare
54 typedef std::pair<Key, T>
Data;
58 return keyLess(lhs.first, rhs.first);
61 bool operator()(
const Data& lhs,
const typename Data::first_type& k)
const 66 bool operator()(
const typename Data::first_type& k,
const Data& rhs)
const 70 bool operator()(
const typename Data::first_type& k,
const typename Data::first_type& rhs)
const 75 bool keyLess(
const typename Data::first_type& k1,
76 const typename Data::first_type& k2)
const 78 return Compare()(k1, k2);
84 template<
class Key,
class T,
class Compare>
88 template<
class Key,
class T,
class Compare>
89 inline bool operator<(const SortedVectorMap<Key, T, Compare>& x,
92 template <
class Key,
class T,
class Compare>
96 template<
class Key,
class T,
class Compare>
99 typedef std::pair<Key, T>
Data;
108 typedef typename container_t::pointer
pointer;
120 std::sort(m_impl->begin(), m_impl->end(), Compare());
121 m_impl->erase(std::unique(m_impl->begin(), m_impl->end(), &equivalent), m_impl->end());
123 template <
class InputIterator>
125 m_impl(new container_t(first, last))
127 std::sort(m_impl->begin(), m_impl->end(), Compare());
128 m_impl->erase(std::unique(m_impl->begin(), m_impl->end(), &equivalent), m_impl->end());
132 return m_impl->begin();
134 const_iterator
end()
const 136 return m_impl->end();
141 return m_impl->begin();
145 return m_impl->end();
149 return m_impl->rbegin();
151 const_reverse_iterator
rend()
const 153 return m_impl->rend();
157 return m_impl->empty();
161 return m_impl->size();
165 return m_impl->max_size();
169 iterator
i = std::lower_bound(m_impl->begin(), m_impl->end(), k, Compare());
170 if (i != m_impl->end() && equivalent(i->first, k))
174 return (*(m_impl->insert(i, value_type(k, data_type())))).second;
180 std::pair<iterator, bool>
insert(
const value_type& x)
182 iterator
i = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
183 if (i != m_impl->end() && equivalent(i->first, x.first))
185 return std::pair<iterator, bool>(
i,
false);
189 return std::pair<iterator, bool>(m_impl->insert(i, x),
true);
192 iterator
insert(iterator,
const value_type& x)
194 iterator
i = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
196 return m_impl->insert(i, x);
198 template <
class InputIterator>
199 void insert(InputIterator first, InputIterator last)
201 m_impl->insert(m_impl->end(), first, last);
202 std::sort(m_impl->begin(), m_impl->end(), Compare());
203 m_impl->erase(std::unique(m_impl->begin(), m_impl->end(), &equivalent), m_impl->end());
207 return m_impl->erase(position);
211 iterator
i = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
212 if (i != m_impl->end() && equivalent(i->first, x))
222 iterator
erase(iterator first, iterator last)
224 return m_impl->erase(first, last);
230 const_iterator
find(
const key_type& x)
const 232 const_iterator pos = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
233 if (pos != m_impl->end() && equivalent(pos->first, x))
239 return m_impl->end();
242 iterator
find(
const key_type& x)
244 iterator pos = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
245 if (pos != m_impl->end() && equivalent(pos->first, x))
251 return m_impl->end();
254 size_type
count(
const key_type& x)
const 256 if (std::binary_search(m_impl->begin(), m_impl->end(), x, Compare()))
267 return std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
271 return std::upper_bound(m_impl->begin(), m_impl->end(), x, Compare());
273 std::pair<const_iterator, const_iterator>
276 return std::equal_range(m_impl->begin(), m_impl->end(), x, Compare());
286 return (!Compare()(x, y) && !Compare()(y, x));
289 template<
class Key,
class T,
class Compare>
295 template<
class Key,
class T,
class Compare>
296 inline bool operator<(const SortedVectorMap<Key, T, Compare>& x,
301 template <
class Key,
class T,
class Compare>
COWReference< container_t > m_impl
size_type count(const key_type &x) const
container_t::pointer pointer
std::pair< const key_type, data_type > value_type
const_iterator end() const
SortedVectorMap(InputIterator first, InputIterator last)
container_t::const_reference const_reference
void swap(Array< T > &x, Array< T > &y)
container_t::reference reference
container_t::size_type size_type
void swap(COWReference< T > &arg)
const_reverse_iterator rbegin() const
const_reverse_iterator rend() const
bool operator()(const typename Data::first_type &k, const typename Data::first_type &rhs) const
bool operator()(const Data &lhs, const Data &rhs) const
iterator erase(iterator first, iterator last)
bool keyLess(const typename Data::first_type &k1, const typename Data::first_type &k2) const
container_t::const_reverse_iterator const_reverse_iterator
data_type & operator[](const key_type &k)
bool operator()(const Data &lhs, const typename Data::first_type &k) const
size_type max_size() const
void insert(InputIterator first, InputIterator last)
iterator insert(iterator, const value_type &x)
iterator erase(iterator position)
std::pair< iterator, bool > insert(const value_type &x)
bool operator==(const Array< T > &x, const Array< T > &y)
container_t::const_iterator const_iterator
container_t::reverse_iterator reverse_iterator
container_t::iterator iterator
static bool equivalent(const key_type &x, const key_type &y)
SortedVectorMap(container_t *toWrap)
bool operator()(const typename Data::first_type &k, const Data &rhs) const
void swap(SortedVectorMap< Key, T, Compare > &x)
const_iterator begin() const
const_iterator find(const key_type &x) const
container_t::difference_type difference_type
size_type erase(const key_type &x)
const_iterator upper_bound(const key_type &x) const
const_iterator lower_bound(const key_type &x) const
std::pair< const_iterator, const_iterator > equal_range(const key_type &x) const
iterator find(const key_type &x)
std::vector< Data > container_t