29 template <
typename ForwardIterator,
typename T,
typename Compare >
30 inline ForwardIterator
31 eastl_lower_bound(ForwardIterator first, ForwardIterator last,
const T& value,
const Compare& compare) {
32 typedef typename std::iterator_traits<ForwardIterator>::difference_type DifferenceType;
34 DifferenceType d = std::distance(first, last);
37 ForwardIterator i = first;
38 DifferenceType d2 = d >> 1;
42 if (compare(*i, value)) {
52 template<
class FwdIt,
class T,
class P>
53 inline FwdIt branchless_lower_bound(FwdIt begin, FwdIt end, T
const &val, P pred) {
54 while (begin != end) {
56 std::advance(middle, std::distance(begin, end) >> 1);
57 FwdIt middle_plus_one(middle);
59 bool const b = pred(*middle, val);
60 begin = b ? middle_plus_one : begin;
61 end = b ? end : middle;
66 template<
class Key,
class T>
70 typedef std::pair<Key, T> value_type;
72 typedef T mapped_type;
75 std::vector<value_type > data_m;
77 struct compare_elems {
79 inline const bool operator()(
const value_type& x,
const value_type& y)
const {
80 return x.first < y.first;
83 inline const bool operator()(
const value_type& x,
const key_type& y)
const {
87 inline const bool operator()(
const key_type& x,
const value_type& y)
const {
93 typedef typename std::vector<value_type>::iterator iterator;
94 typedef typename std::vector<value_type>::const_iterator const_iterator;
95 typedef typename std::vector<value_type>::reverse_iterator reverse_iterator;
96 typedef typename std::vector<value_type>::const_reverse_iterator const_reverse_iterator;
102 inline std::pair<iterator, bool> insert(
const value_type& value) {
103 iterator it = eastl_lower_bound(data_m.begin(), data_m.end(), value.first, compare_elems());
104 if (it == data_m.end() || it->first != value.first) {
105 iterator it2 = data_m.insert(it, value);
106 return std::make_pair(it2,
true);
108 return std::make_pair(it,
false);
112 inline T& operator[](
const Key& key) {
113 iterator it = eastl_lower_bound(data_m.begin(), data_m.end(), key, compare_elems());
114 if (it == data_m.end() || it->first != key) {
115 iterator it2 = data_m.insert(it, value_type(key, T()));
123 data_m.swap(m.data_m);
126 iterator find(
const Key& key) {
127 iterator it = eastl_lower_bound(data_m.begin(), data_m.end(), key, compare_elems());
128 if (it == data_m.end() || it->first != key) {
135 const_iterator find(
const Key& key)
const {
136 const_iterator it = eastl_lower_bound(data_m.begin(), data_m.end(), key, compare_elems());
137 if (it == data_m.end() || it->first != key) {
144 void erase(
const Key& key) {
145 iterator it = eastl_lower_bound(data_m.begin(), data_m.end(), key, compare_elems());
146 if (it != data_m.end() && it->first == key) {
160 return data_m.empty();
163 std::size_t size()
const {
164 return data_m.size();
168 return data_m.begin();
175 const_iterator begin()
const {
176 return data_m.begin();
179 const_iterator end()
const {
183 reverse_iterator rbegin() {
184 return data_m.rbegin();
187 reverse_iterator rend() {
188 return data_m.rend();
191 const_reverse_iterator rbegin()
const {
192 return data_m.rbegin();
195 const_reverse_iterator rend()
const {
196 return data_m.rend();
199 std::vector<value_type >& data() {
203 const std::vector<value_type >& data()
const {
Definition: flat_map.hpp:67