|
|
@@ -150,24 +150,39 @@ inline void intrusive_list<T>::clear() noexcept {
|
|
|
|
|
|
template <typename T>
|
|
|
typename intrusive_list<T>::iterator
|
|
|
- intrusive_list<T>::insert(const_iterator pos, pointer value) {
|
|
|
+intrusive_list<T>::insert(const_iterator pos, pointer value) {
|
|
|
node_type* n = &(value->*node_);
|
|
|
+ if ( n->list_ == nullptr ) {
|
|
|
+ insert_impl( pos, n );
|
|
|
+ } else {
|
|
|
+ throw std::logic_error{ "cannot use intrusive_list<T>::insert to perform a splice" };
|
|
|
+ }
|
|
|
+ return iterator{n};
|
|
|
+}
|
|
|
+
|
|
|
+template <typename T>
|
|
|
+typename intrusive_list<T>::iterator
|
|
|
+intrusive_list<T>::transfer(const_iterator pos, pointer value) {
|
|
|
+ node_type* n = &(value->*node_);
|
|
|
+ n->unlink( );
|
|
|
+ insert_impl( pos, n );
|
|
|
+ return iterator{n};
|
|
|
+}
|
|
|
+
|
|
|
+template <typename T>
|
|
|
+void intrusive_list<T>::insert_impl( const_iterator pos, node_type * n ) {
|
|
|
link(pos.get()->prev_, n);
|
|
|
link(n, pos.get());
|
|
|
n->list_ = this;
|
|
|
++size_;
|
|
|
- return iterator{n};
|
|
|
}
|
|
|
|
|
|
template <typename T>
|
|
|
typename intrusive_list<T>::iterator
|
|
|
intrusive_list<T>::insert(const_iterator pos, std::initializer_list<pointer> ilist) {
|
|
|
for (pointer p : ilist) {
|
|
|
- link(pos.get()->prev_, p->*node_);
|
|
|
- link(p->*node_, pos.get());
|
|
|
- p->*node_->list_ = this;
|
|
|
+ insert( pos, p );
|
|
|
}
|
|
|
- size_ += ilist.size();
|
|
|
return iterator{pos.get()};
|
|
|
}
|
|
|
|
|
|
@@ -189,9 +204,6 @@ typename intrusive_list<T>::iterator intrusive_list<T>::erase(iterator first, it
|
|
|
|
|
|
template <typename T>
|
|
|
inline void intrusive_list<T>::push_back(pointer value) {
|
|
|
-// link(end_.prev_, &(value->*node_));
|
|
|
-// (value->*node_).list_ = this;
|
|
|
-// ++size_;
|
|
|
insert(cend(), value);
|
|
|
}
|
|
|
|