Changed ordered insertion function and added comments

[SVN r77895]
This commit is contained in:
Ion Gaztañaga
2012-04-10 20:14:31 +00:00
parent d8fda23564
commit a377237401

View File

@@ -301,7 +301,6 @@ class flat_tree
return ret; return ret;
} }
iterator insert_equal(const value_type& val) iterator insert_equal(const value_type& val)
{ {
iterator i = this->upper_bound(KeyOfValue()(val)); iterator i = this->upper_bound(KeyOfValue()(val));
@@ -339,14 +338,14 @@ class flat_tree
iterator insert_equal(const_iterator pos, const value_type& val) iterator insert_equal(const_iterator pos, const value_type& val)
{ {
insert_commit_data data; insert_commit_data data;
priv_insert_equal_prepare(pos, val, data); this->priv_insert_equal_prepare(pos, val, data);
return priv_insert_commit(data, val); return priv_insert_commit(data, val);
} }
iterator insert_equal(const_iterator pos, BOOST_RV_REF(value_type) mval) iterator insert_equal(const_iterator pos, BOOST_RV_REF(value_type) mval)
{ {
insert_commit_data data; insert_commit_data data;
priv_insert_equal_prepare(pos, mval, data); this->priv_insert_equal_prepare(pos, mval, data);
return priv_insert_commit(data, boost::move(mval)); return priv_insert_commit(data, boost::move(mval));
} }
@@ -362,7 +361,15 @@ class flat_tree
{ {
typedef typename typedef typename
std::iterator_traits<InIt>::iterator_category ItCat; std::iterator_traits<InIt>::iterator_category ItCat;
priv_insert_equal(first, last, ItCat()); this->priv_insert_equal(first, last, ItCat());
}
template <class InIt>
void insert_equal(ordered_range_t, InIt first, InIt last)
{
typedef typename
std::iterator_traits<InIt>::iterator_category ItCat;
this->priv_insert_equal(ordered_range_t(), first, last, ItCat());
} }
#ifdef BOOST_CONTAINER_PERFECT_FORWARDING #ifdef BOOST_CONTAINER_PERFECT_FORWARDING
@@ -406,7 +413,7 @@ class flat_tree
{ {
value_type &&val = value_type(boost::forward<Args>(args)...); value_type &&val = value_type(boost::forward<Args>(args)...);
insert_commit_data data; insert_commit_data data;
priv_insert_equal_prepare(hint, val, data); this->priv_insert_equal_prepare(hint, val, data);
return priv_insert_commit(data, boost::move(val)); return priv_insert_commit(data, boost::move(val));
} }
@@ -466,7 +473,7 @@ class flat_tree
BOOST_PP_ENUM(n, BOOST_CONTAINER_PP_PARAM_FORWARD, _) BOOST_PP_RPAREN_IF(n); \ BOOST_PP_ENUM(n, BOOST_CONTAINER_PP_PARAM_FORWARD, _) BOOST_PP_RPAREN_IF(n); \
value_type &val = vval; \ value_type &val = vval; \
insert_commit_data data; \ insert_commit_data data; \
priv_insert_equal_prepare(hint, val, data); \ this->priv_insert_equal_prepare(hint, val, data); \
return priv_insert_commit(data, boost::move(val)); \ return priv_insert_commit(data, boost::move(val)); \
} \ } \
//! //!
@@ -746,10 +753,39 @@ class flat_tree
return std::pair<RanIt, RanIt>(first, first); return std::pair<RanIt, RanIt>(first, first);
} }
template <class FwdIt> template <class BidirIt>
void priv_insert_equal(FwdIt first, FwdIt last, std::forward_iterator_tag) void priv_insert_equal(ordered_range_t, BidirIt first, BidirIt last, std::bidirectional_iterator_tag)
{ {
size_type len = static_cast<size_type>(std::distance(first, last)); size_type len = static_cast<size_type>(std::distance(first, last));
const size_type BurstSize = 16;
size_type positions[BurstSize];
while(len){
const size_type burst = len < BurstSize ? len : BurstSize;
len -= burst;
const iterator beg(this->cbegin());
iterator pos;
for(size_type i = 0; i != burst; ++i){
pos = this->upper_bound(KeyOfValue()(*first));
positions[i] = static_cast<size_type>(pos - beg);
++first;
}
this->m_data.m_vect.insert_ordered_at(burst, positions + burst, first);
}
}
template <class FwdIt>
void priv_insert_equal_forward(ordered_range_t, FwdIt first, FwdIt last, std::forward_iterator_tag)
{ this->priv_insert_equal(first, last, std::forward_iterator_tag()); }
template <class InIt>
void priv_insert_equal(ordered_range_t, InIt first, InIt last, std::input_iterator_tag)
{ this->priv_insert_equal(first, last, std::input_iterator_tag()); }
template <class FwdIt>
void priv_insert_equal_forward(FwdIt first, FwdIt last, std::forward_iterator_tag)
{
const size_type len = static_cast<size_type>(std::distance(first, last));
this->reserve(this->size()+len); this->reserve(this->size()+len);
this->priv_insert_equal(first, last, std::input_iterator_tag()); this->priv_insert_equal(first, last, std::input_iterator_tag());
} }