38 #ifndef BLOCXX_SORTED_VECTOR_SET_HPP_
39 #define BLOCXX_SORTED_VECTOR_SET_HPP_
40 #include "blocxx/BLOCXX_config.h"
50 template<
class T,
class Compare >
53 template<
class T,
class Compare>
57 template<
class T,
class Compare>
58 inline bool operator<(const SortedVectorSet<T, Compare>& x,
61 template<
class T,
class Compare = std::less<T> >
66 #pragma warning (push)
67 #pragma warning (disable: 4251)
79 typedef typename container_t::pointer
pointer;
83 typedef typename container_t::iterator
iterator;
92 std::sort(m_impl->begin(), m_impl->end(), Compare());
93 m_impl->erase(std::unique(m_impl->begin(), m_impl->end(), &
equivalent), m_impl->end());
95 template <
class InputIterator>
97 m_impl(new container_t(first, last))
99 std::sort(m_impl->begin(), m_impl->end(), Compare());
100 m_impl->erase(std::unique(m_impl->begin(), m_impl->end(), &
equivalent), m_impl->end());
102 const_iterator
begin()
const {
return m_impl->begin(); }
103 const_iterator
end()
const {
return m_impl->end(); }
104 const_reverse_iterator
rbegin()
const {
return m_impl->rbegin(); }
105 const_reverse_iterator
rend()
const {
return m_impl->rend(); }
106 bool empty()
const {
return m_impl->empty(); }
107 size_type
size()
const {
return m_impl->size(); }
108 size_type
max_size()
const {
return m_impl->max_size(); }
113 std::pair<iterator, bool>
insert(
const value_type& x)
115 iterator
i = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
118 return std::pair<iterator, bool>(
i,
false);
122 return std::pair<iterator, bool>(m_impl->insert(i, x),
true);
125 iterator
insert(iterator,
const value_type& x)
129 template <
class InputIterator>
130 void insert(InputIterator first, InputIterator last)
132 m_impl->insert(m_impl->end(), first, last);
133 std::sort(m_impl->begin(), m_impl->end(), Compare());
134 m_impl->erase(std::unique(m_impl->begin(), m_impl->end(), &
equivalent), m_impl->end());
138 return m_impl->erase(position);
142 iterator
i = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
153 iterator
erase(iterator first, iterator last)
155 return m_impl->erase(first, last);
161 iterator
find(
const key_type& x)
163 iterator pos = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
164 if (pos != m_impl->end() &&
equivalent(*pos, x))
170 return m_impl->end();
173 const_iterator
find(
const key_type& x)
const
175 const_iterator pos = std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
176 if (pos != m_impl->end() &&
equivalent(*pos, x))
182 return m_impl->end();
185 size_type
count(
const key_type& x)
const
187 if (std::binary_search(m_impl->begin(), m_impl->end(), x, Compare()))
198 return std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
202 return std::lower_bound(m_impl->begin(), m_impl->end(), x, Compare());
206 return std::upper_bound(m_impl->begin(), m_impl->end(), x, Compare());
210 return std::upper_bound(m_impl->begin(), m_impl->end(), x, Compare());
213 std::pair<iterator, iterator>
216 return std::equal_range(m_impl->begin(), m_impl->end(), x, Compare());
219 std::pair<const_iterator, const_iterator>
222 return std::equal_range(m_impl->begin(), m_impl->end(), x, Compare());
234 return (!Compare()(x, y) && !Compare()(y, x));
237 template<
class T,
class Compare>
243 template<
class T,
class Compare>
244 inline bool operator<(const SortedVectorSet<T, Compare>& x,
247 return *x.
m_impl < *y.m_impl;
249 template <
class T,
class Compare>
iterator lower_bound(const key_type &x)
const_iterator upper_bound(const key_type &x) const
void swap(SortedVectorSet< T, Compare > &x)
container_t::size_type size_type
std::vector< T > container_t
container_t::const_iterator const_iterator
const_iterator begin() const
iterator upper_bound(const key_type &x)
container_t::iterator iterator
void swap(Array< T > &x, Array< T > &y)
iterator erase(iterator first, iterator last)
const_reverse_iterator rend() const
const_iterator lower_bound(const key_type &x) const
void swap(COWReference< T > &arg)
size_type count(const key_type &x) const
container_t::const_reverse_iterator const_reverse_iterator
iterator erase(iterator position)
SortedVectorSet(container_t *toWrap)
static bool equivalent(const key_type &x, const key_type &y)
container_t::reverse_iterator reverse_iterator
bool operator==(const Array< T > &x, const Array< T > &y)
const_iterator end() const
const_iterator find(const key_type &x) const
container_t::reference reference
void insert(InputIterator first, InputIterator last)
const_reverse_iterator rbegin() const
std::pair< iterator, bool > insert(const value_type &x)
COWReference< container_t > m_impl
container_t::const_pointer const_pointer
std::pair< const_iterator, const_iterator > equal_range(const key_type &x) const
std::pair< iterator, iterator > equal_range(const key_type &x)
container_t::const_reference const_reference
container_t::pointer pointer
iterator insert(iterator, const value_type &x)
size_type erase(const key_type &x)
SortedVectorSet(InputIterator first, InputIterator last)
iterator find(const key_type &x)
container_t::difference_type difference_type
size_type max_size() const