80 class ForwardIterator_;
84 typedef value_type& reference;
85 typedef const value_type& const_reference;
86 typedef value_type* pointer;
87 typedef value_type
const* const_pointer;
88 typedef ForwardIterator_<T> iterator;
89 typedef ForwardIterator_<const T> const_iterator;
113 nonvirtual
bool empty () const noexcept;
125 nonvirtual
size_t clear ();
141 nonvirtual reference
front ();
142 nonvirtual const_reference
front () const;
151 nonvirtual iterator
push_front (const T& value);
159 template <typename... U>
177 nonvirtual iterator
begin ();
178 nonvirtual const_iterator
begin () const;
186 nonvirtual const_iterator
cbegin () const;
194 nonvirtual iterator
end ();
195 nonvirtual const_iterator
end () const;
203 nonvirtual const_iterator
cend () const;
212 nonvirtual iterator
insert_after (const_iterator position, T const& value);
213 nonvirtual iterator
insert_after (const_iterator position, T&& value);
214 nonvirtual iterator
insert_after (const_iterator pos,
int count, const T& value);
215 template <typename InputIt>
216 nonvirtual iterator
insert_after (const_iterator pos, InputIt first, InputIt last);
217 nonvirtual iterator
insert_after (const_iterator pos,
std::initializer_list<T> ilist);
225 template <typename... U>
246 for (
auto i =
begin (); i != this->
end (); ++i) {
247 if ((i + 1) != this->
end () and *i == value) {
264 nonvirtual
bool erase_after (const_iterator position, T* value);
277 static inline node_*
const kTerminalSentinel_ =
reinterpret_cast<node_*
> (1);
278 static inline node_*
const kSpinSentinel_ =
reinterpret_cast<node_*
> (2);
280 std::atomic<node_*> fFirst_;
284 static iterator insert_node_ (std::atomic<node_*>& atomic_ptr, node_* n);
287 static node_* separate_ (std::atomic<node_*>& atomic_ptr);
291 static bool remove_node_ (std::atomic<node_*>& atomic_ptr, T* value);
294 static void decrement_reference_count_ (node_*& n);
298 static node_* increment_reference_count_ (node_* n);
301 static node_* spin_get_ (
const std::atomic<node_*>& n);
304 static void exchange_ (std::atomic<node_*>& left, node_*& right);
307 static void exchange_ (std::atomic<node_*>& left, std::atomic<node_*>& right);
311 static node_* owner_lock_ (std::atomic<node_*>& atomic_ptr);
315 static void owner_unlock_ (std::atomic<node_*>& atomic_ptr, node_*& n);
318 static node_* new_ownership_ (std::atomic<node_*>& atomic_ptr);