Add some BOOST_INTRUSIVE_FORCEINLINE to trivial functions, and take advantage of new algorithms like end_node and detach_and_dispose

This commit is contained in:
Ion Gaztañaga
2022-05-04 23:34:19 +02:00
parent ba298c775e
commit 8be3b54d35

View File

@ -38,6 +38,7 @@
#include <boost/intrusive/detail/size_holder.hpp> #include <boost/intrusive/detail/size_holder.hpp>
#include <boost/intrusive/detail/algorithm.hpp> #include <boost/intrusive/detail/algorithm.hpp>
#include <boost/intrusive/detail/value_functors.hpp> #include <boost/intrusive/detail/value_functors.hpp>
#include <boost/intrusive/detail/node_cloner_disposer.hpp>
#include <boost/move/utility_core.hpp> #include <boost/move/utility_core.hpp>
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>
@ -171,49 +172,47 @@ class slist_impl
//A list with cached last node is incompatible with auto-unlink hooks! //A list with cached last node is incompatible with auto-unlink hooks!
BOOST_STATIC_ASSERT(!(cache_last && ((int)value_traits::link_mode == (int)auto_unlink))); BOOST_STATIC_ASSERT(!(cache_last && ((int)value_traits::link_mode == (int)auto_unlink)));
node_ptr get_end_node() BOOST_INTRUSIVE_FORCEINLINE node_ptr get_end_node()
{ return node_ptr(linear ? node_ptr() : this->get_root_node()); } { return node_algorithms::end_node(this->get_root_node()); }
const_node_ptr get_end_node() const BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_end_node() const
{ { return node_algorithms::end_node(this->get_root_node()); }
return const_node_ptr
(linear ? const_node_ptr() : this->get_root_node()); }
node_ptr get_root_node() BOOST_INTRUSIVE_FORCEINLINE node_ptr get_root_node()
{ return data_.root_plus_size_.header_holder_.get_node(); } { return data_.root_plus_size_.header_holder_.get_node(); }
const_node_ptr get_root_node() const BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_root_node() const
{ return data_.root_plus_size_.header_holder_.get_node(); } { return data_.root_plus_size_.header_holder_.get_node(); }
node_ptr get_last_node() BOOST_INTRUSIVE_FORCEINLINE node_ptr get_last_node()
{ return this->get_last_node(detail::bool_<cache_last>()); } { return this->get_last_node(detail::bool_<cache_last>()); }
const_node_ptr get_last_node() const BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_last_node() const
{ return this->get_last_node(detail::bool_<cache_last>()); } { return this->get_last_node(detail::bool_<cache_last>()); }
void set_last_node(node_ptr n) BOOST_INTRUSIVE_FORCEINLINE void set_last_node(node_ptr n)
{ return this->set_last_node(n, detail::bool_<cache_last>()); } { return this->set_last_node(n, detail::bool_<cache_last>()); }
static node_ptr get_last_node(detail::bool_<false>) BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_last_node(detail::bool_<false>)
{ {
//This function shall not be used if cache_last is not true //This function shall not be used if cache_last is not true
BOOST_INTRUSIVE_INVARIANT_ASSERT(cache_last); BOOST_INTRUSIVE_INVARIANT_ASSERT(cache_last);
return node_ptr(); return node_ptr();
} }
static void set_last_node(node_ptr , detail::bool_<false>) BOOST_INTRUSIVE_FORCEINLINE static void set_last_node(node_ptr , detail::bool_<false>)
{ {
//This function shall not be used if cache_last is not true //This function shall not be used if cache_last is not true
BOOST_INTRUSIVE_INVARIANT_ASSERT(cache_last); BOOST_INTRUSIVE_INVARIANT_ASSERT(cache_last);
} }
node_ptr get_last_node(detail::bool_<true>) BOOST_INTRUSIVE_FORCEINLINE node_ptr get_last_node(detail::bool_<true>)
{ return node_ptr(data_.root_plus_size_.last_); } { return node_ptr(data_.root_plus_size_.last_); }
const_node_ptr get_last_node(detail::bool_<true>) const BOOST_INTRUSIVE_FORCEINLINE const_node_ptr get_last_node(detail::bool_<true>) const
{ return const_node_ptr(data_.root_plus_size_.last_); } { return const_node_ptr(data_.root_plus_size_.last_); }
void set_last_node(node_ptr n, detail::bool_<true>) BOOST_INTRUSIVE_FORCEINLINE void set_last_node(node_ptr n, detail::bool_<true>)
{ data_.root_plus_size_.last_ = n; } { data_.root_plus_size_.last_ = n; }
void set_default_constructed_state() void set_default_constructed_state()
@ -242,22 +241,22 @@ class slist_impl
root_plus_size root_plus_size_; root_plus_size root_plus_size_;
} data_; } data_;
size_traits &priv_size_traits() BOOST_INTRUSIVE_FORCEINLINE size_traits &priv_size_traits()
{ return data_.root_plus_size_; } { return data_.root_plus_size_; }
const size_traits &priv_size_traits() const BOOST_INTRUSIVE_FORCEINLINE const size_traits &priv_size_traits() const
{ return data_.root_plus_size_; } { return data_.root_plus_size_; }
const value_traits &priv_value_traits() const BOOST_INTRUSIVE_FORCEINLINE const value_traits &priv_value_traits() const
{ return data_; } { return data_; }
value_traits &priv_value_traits() BOOST_INTRUSIVE_FORCEINLINE value_traits &priv_value_traits()
{ return data_; } { return data_; }
typedef typename boost::intrusive::value_traits_pointers typedef typename boost::intrusive::value_traits_pointers
<ValueTraits>::const_value_traits_ptr const_value_traits_ptr; <ValueTraits>::const_value_traits_ptr const_value_traits_ptr;
const_value_traits_ptr priv_value_traits_ptr() const BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr priv_value_traits_ptr() const
{ return pointer_traits<const_value_traits_ptr>::pointer_to(this->priv_value_traits()); } { return pointer_traits<const_value_traits_ptr>::pointer_to(this->priv_value_traits()); }
/// @endcond /// @endcond
@ -407,14 +406,10 @@ class slist_impl
template <class Disposer> template <class Disposer>
void clear_and_dispose(Disposer disposer) BOOST_NOEXCEPT void clear_and_dispose(Disposer disposer) BOOST_NOEXCEPT
{ {
const_iterator it(this->begin()), itend(this->end()); node_algorithms::detach_and_dispose
while(it != itend){ ( this->get_root_node()
node_ptr to_erase(it.pointed_node()); , detail::node_disposer<Disposer, value_traits, CommonSListAlgorithms>
++it; (disposer, &this->priv_value_traits()) );
BOOST_IF_CONSTEXPR(safemode_or_autounlink)
node_algorithms::init(to_erase);
disposer(priv_value_traits().to_value_ptr(to_erase));
}
this->set_default_constructed_state(); this->set_default_constructed_state();
} }
@ -704,7 +699,7 @@ class slist_impl
//! //!
//! <b>Note</b>: Does not affect the validity of iterators and references. //! <b>Note</b>: Does not affect the validity of iterators and references.
BOOST_INTRUSIVE_FORCEINLINE bool empty() const BOOST_NOEXCEPT BOOST_INTRUSIVE_FORCEINLINE bool empty() const BOOST_NOEXCEPT
{ return node_algorithms::unique(this->get_root_node()); } { return node_algorithms::is_empty(this->get_root_node()); }
//! <b>Effects</b>: Swaps the elements of x and *this. //! <b>Effects</b>: Swaps the elements of x and *this.
//! //!
@ -1946,7 +1941,7 @@ class slist_impl
while (true) while (true)
{ {
const_node_ptr next_p = node_traits::get_next(p); const_node_ptr next_p = node_traits::get_next(p);
if (!linear) BOOST_IF_CONSTEXPR(!linear)
{ {
BOOST_INTRUSIVE_INVARIANT_ASSERT(next_p); BOOST_INTRUSIVE_INVARIANT_ASSERT(next_p);
} }