88
88
typedef typename base_type::range_type range_type;
89
89
typedef typename base_type::mapped_type mapped_type;
90
90
typedef typename base_type::mapped_value_type mapped_value_type;
91
// typedef std::pair<key_type, mapped_type> value_type;
91
typedef typename base_type::table_type table_type;
93
93
static const key_type mask_bits = MaskBits;
94
94
static const key_type table_bits = TableBits;
133
133
template <typename Key, typename Tp, unsigned int MaskBits, unsigned int TableSize, unsigned int TableBits>
135
135
extents<Key, Tp, MaskBits, TableSize, TableBits>::insert(key_type pos, unsigned int mb, const mapped_value_type& val) {
136
// Temporarily removed.
136
key_type mask = ~key_type() << mb;
138
base_type::insert(pos & mask, mb, val);
139
141
template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits>
141
143
extents_base<Key, Tp, TableSize, TableBits>::insert(key_type pos, unsigned int mb, const mapped_value_type& val) {
142
// Temporarily removed.
145
typename table_type::iterator first = partition_at(pos);
146
typename table_type::iterator last = partition_at(pos) + mask_distance(mb) + 1;
148
if (mb < mask_bits) {
149
if (first->first == NULL)
150
first->first = new extents_base(this, first);
152
first->first->insert(pos, mb, val);
156
while (first != last) {
157
if (first->first != NULL) {
162
(first++)->second = val;
145
166
template <typename Key, typename Tp, unsigned int MaskBits, unsigned int TableSize, unsigned int TableBits>
147
168
extents<Key, Tp, MaskBits, TableSize, TableBits>::is_equal_range(key_type first, key_type last, const mapped_value_type& val) const {
148
// Temporarily removed.
170
first = std::max(first, key_type());
171
last = std::min(last, key_type() + (~key_type() >> (sizeof(key_type) * 8 - MaskBits)));
174
return base_type::is_equal_range(first, last, val);
152
179
template <typename Key, typename Tp, unsigned int TableSize, unsigned int TableBits>
154
181
extents_base<Key, Tp, TableSize, TableBits>::is_equal_range(key_type key_first, key_type key_last, const mapped_value_type& val) const {
155
// Temporarily removed.
183
typename table_type::const_iterator first = partition_at(key_first);
184
typename table_type::const_iterator last = partition_at(key_last) + 1;
187
// std::cout << "shift_amount " << key_first << ' ' << key_last << std::endl;
189
if (first->first == NULL && val != first->second)
192
if (first->first != NULL && !first->first->is_equal_range(std::max(key_first, partition_pos(first)),
193
std::min(key_last, partition_pos(first + 1) - 1), val))
196
} while (++first != last);
159
201
// Assumes 'key' is within the range of the range.