summaryrefslogtreecommitdiff
path: root/boost/container/detail/tree.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/container/detail/tree.hpp')
-rw-r--r--boost/container/detail/tree.hpp75
1 files changed, 41 insertions, 34 deletions
diff --git a/boost/container/detail/tree.hpp b/boost/container/detail/tree.hpp
index c2d6b1d17d..0fd6097650 100644
--- a/boost/container/detail/tree.hpp
+++ b/boost/container/detail/tree.hpp
@@ -50,6 +50,7 @@
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
#include <boost/move/detail/fwd_macros.hpp>
#endif
+#include <boost/move/detail/move_helpers.hpp>
// other
#include <boost/core/no_exceptions_support.hpp>
@@ -136,13 +137,13 @@ struct tree_node
typedef tree_node< T, VoidPointer
, tree_type_value, OptimizeSize> node_type;
- T &get_data()
+ BOOST_CONTAINER_FORCEINLINE T &get_data()
{
T* ptr = reinterpret_cast<T*>(&this->m_data);
return *ptr;
}
- const T &get_data() const
+ BOOST_CONTAINER_FORCEINLINE const T &get_data() const
{
const T* ptr = reinterpret_cast<const T*>(&this->m_data);
return *ptr;
@@ -151,39 +152,39 @@ struct tree_node
internal_type m_data;
template<class T1, class T2>
- void do_assign(const std::pair<const T1, T2> &p)
+ BOOST_CONTAINER_FORCEINLINE void do_assign(const std::pair<const T1, T2> &p)
{
const_cast<T1&>(m_data.first) = p.first;
m_data.second = p.second;
}
template<class T1, class T2>
- void do_assign(const pair<const T1, T2> &p)
+ BOOST_CONTAINER_FORCEINLINE void do_assign(const pair<const T1, T2> &p)
{
const_cast<T1&>(m_data.first) = p.first;
m_data.second = p.second;
}
template<class V>
- void do_assign(const V &v)
+ BOOST_CONTAINER_FORCEINLINE void do_assign(const V &v)
{ m_data = v; }
template<class T1, class T2>
- void do_move_assign(std::pair<const T1, T2> &p)
+ BOOST_CONTAINER_FORCEINLINE void do_move_assign(std::pair<const T1, T2> &p)
{
const_cast<T1&>(m_data.first) = ::boost::move(p.first);
m_data.second = ::boost::move(p.second);
}
template<class T1, class T2>
- void do_move_assign(pair<const T1, T2> &p)
+ BOOST_CONTAINER_FORCEINLINE void do_move_assign(pair<const T1, T2> &p)
{
const_cast<T1&>(m_data.first) = ::boost::move(p.first);
m_data.second = ::boost::move(p.second);
}
template<class V>
- void do_move_assign(V &v)
+ BOOST_CONTAINER_FORCEINLINE void do_move_assign(V &v)
{ m_data = ::boost::move(v); }
};
@@ -526,12 +527,12 @@ class tree
const const_iterator end_it(this->cend());
if(unique_insertion){
for ( ; first != last; ++first){
- this->insert_unique(end_it, *first);
+ this->insert_unique_convertible(end_it, *first);
}
}
else{
for ( ; first != last; ++first){
- this->insert_equal(end_it, *first);
+ this->insert_equal_convertible(end_it, *first);
}
}
}
@@ -555,7 +556,7 @@ class tree
//for the constructor
const const_iterator end_it(this->cend());
for ( ; first != last; ++first){
- this->insert_unique(end_it, *first);
+ this->insert_unique_convertible(end_it, *first);
}
}
else{
@@ -983,19 +984,8 @@ class tree
#endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- iterator insert_unique(const_iterator hint, const value_type& v)
- {
- BOOST_ASSERT((priv_is_linked)(hint));
- insert_commit_data data;
- std::pair<iterator,bool> ret =
- this->insert_unique_check(hint, KeyOfValue()(v), data);
- if(!ret.second)
- return ret.first;
- return this->insert_unique_commit(v, data);
- }
-
template<class MovableConvertible>
- iterator insert_unique(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
+ iterator insert_unique_convertible(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
{
BOOST_ASSERT((priv_is_linked)(hint));
insert_commit_data data;
@@ -1006,6 +996,8 @@ class tree
return this->insert_unique_commit(boost::forward<MovableConvertible>(v), data);
}
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(insert_unique, value_type, iterator, this->insert_unique_convertible, const_iterator, const_iterator)
+
template <class InputIterator>
void insert_unique(InputIterator first, InputIterator last)
{
@@ -1032,18 +1024,8 @@ class tree
return ret;
}
- iterator insert_equal(const_iterator hint, const value_type& v)
- {
- BOOST_ASSERT((priv_is_linked)(hint));
- NodePtr tmp(AllocHolder::create_node(v));
- scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());
- iterator ret(this->icont().insert_equal(hint.get(), *tmp));
- destroy_deallocator.release();
- return ret;
- }
-
template<class MovableConvertible>
- iterator insert_equal(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
+ iterator insert_equal_convertible(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
{
BOOST_ASSERT((priv_is_linked)(hint));
NodePtr tmp(AllocHolder::create_node(boost::forward<MovableConvertible>(v)));
@@ -1053,6 +1035,8 @@ class tree
return ret;
}
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(insert_equal, value_type, iterator, this->insert_equal_convertible, const_iterator, const_iterator)
+
template <class InputIterator>
void insert_equal(InputIterator first, InputIterator last)
{
@@ -1060,6 +1044,29 @@ class tree
this->insert_equal(*first);
}
+ template<class KeyConvertible>
+ iterator insert_from_key(BOOST_FWD_REF(KeyConvertible) key)
+ {
+ insert_commit_data data;
+ const key_type & k = key; //Support emulated rvalue references
+ std::pair<iiterator, bool> ret =
+ this->icont().insert_unique_check(k, KeyNodeCompare(value_comp()), data);
+ return ret.second
+ ? this->insert_unique_key_commit(boost::forward<KeyConvertible>(key), data)
+ : iterator(ret.first);
+ }
+
+ template<class KeyConvertible>
+ iterator insert_unique_key_commit
+ (BOOST_FWD_REF(KeyConvertible) key, insert_commit_data &data)
+ {
+ NodePtr tmp = AllocHolder::create_node_from_key(boost::forward<KeyConvertible>(key));
+ scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());
+ iterator ret(this->icont().insert_unique_commit(*tmp, data));
+ destroy_deallocator.release();
+ return ret;
+ }
+
iterator erase(const_iterator position)
{
BOOST_ASSERT(position != this->cend() && (priv_is_linked)(position));