51 assert(
dynamic_cast<atomic_t *>(have_work_));
53 return have_work_->lock(0);
56 template<
class Lk>
inline void
58 for (
typename atomic_t::count_type i=0; i<c; ++i) {
59 [[maybe_unused]]
const typename atomic_t::lock_result_type ret=remove();
60 assert(ret.second!=atomic_t::lock_result_type::second_type::atom_abandoned);
66 assert(
dynamic_cast<atomic_t *>(have_work_));
67 return have_work_->try_lock();
70 template<
class Lk>
inline void
72 assert(
dynamic_cast<atomic_t *>(have_work_));
78 assert(
dynamic_cast<atomic_t
const *>(have_work_));
79 return have_work_->count();
82 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
87 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
92 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
97 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
102 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
103 template<
class T1,
class T2>
inline
109 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
115 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
123 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
127 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline ppd::
safe_colln<C, M, WL, Sig, MLk> &
137 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
144 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
154 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
161 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
168 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
175 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
182 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
189 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
196 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline
202 while ((b=
std::find(
this->c.begin(),
this->c.end(), v))!=
this->c.end()) {
210 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
216 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
225 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline bool
229 return this->colln()==sc.colln();
232 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
233 template<
typename M1,
typename WL1,
class Sig1,
class MLk1>
236 const typename safe_colln<C, M1, WL1, Sig1, MLk1>::read_lock_type lk(sc.pop_lock(),
safe_colln<C, M1, WL1, Sig1, MLk1>::lock_traits::infinite_timeout());
238 return this->colln()==sc.colln();
241 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
248 }
else if (cont_sz>sz) {
255 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
262 }
else if (cont_sz>sz) {
267 template<
typename C,
typename M,
typename WL,
class Sig,
class MLk>
inline void
272 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
276 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
280 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
289 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
293 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline ppd::
queue<QT, M, WL, Sig, ValRet, MLk> &
303 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline bool
309 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
size_type
318 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
size_type
324 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
value_type
332 _T(
"Collection empty."),
343 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
350 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
357 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
364 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
371 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
size_type
379 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
388 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
value_type
393 const pop_t pop(*
this);
397 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
value_type
402 const pop_t pop(*
this);
406 #pragma GCC diagnostic push
408 #pragma GCC diagnostic ignored "-Wmissing-braces"
409 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
value_ret_type
415 #pragma GCC diagnostic pop
417 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
value_ret_type
420 return this->pop_front_nochk_nolk();
423 _T(
"Collection empty."),
434 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
queue<QT, M, WL, Sig, ValRet, MLk>::
value_ret_type
440 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
444 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
448 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
457 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
461 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk> &
463 const scoped_lock<atomic_t, atomic_t, atomic_t, atomic_t> wait(t.push_lock(), t.pop_lock(), push_lock(), pop_lock());
470 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline bool
477 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
size_type
487 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
size_type
493 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
496 const scoped_lock<atomic_t, atomic_t> wait(push_lock(), pop_lock());
501 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline bool
504 const scoped_lock<atomic_t, atomic_t> wait(push_lock(), pop_lock());
508 assert(ret.second!=have_work_type::lock_traits::atom_abandoned);
516 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_type
528 _T(
"Collection empty."),
540 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_type
552 _T(
"Collection empty."),
564 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
576 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
588 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
594 const scoped_lock<atomic_t, atomic_t> wait(push_lock(), pop_lock());
600 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
606 const scoped_lock<atomic_t, atomic_t> wait(push_lock(), pop_lock());
612 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_type &
617 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_type const &
618 ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::back_nolk()
const noexcept(
true) {
622 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
629 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
636 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
643 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
650 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline void
651 ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::pop_nochk_nolk()
noexcept(
false) {
653 assert(ret.second!=have_work_type::lock_traits::atom_abandoned);
657 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_type
662 const pop_t pop(*
this);
666 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_type
671 const pop_t pop(*
this);
675 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_ret_type
682 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_ret_type
683 ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::pop_nolk()
noexcept(
false) {
687 assert(ret.second!=have_work_type::lock_traits::atom_abandoned);
688 const pop_t pop(*
this);
692 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_ret_type
695 return this->pop_front_nochk_nolk();
699 return this->pop_front_nochk_nolk();
702 _T(
"Collection empty."),
714 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_ret_type
725 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline typename ppd::
funky_queue<QT, M, WL, Sig, ValRet, MLk>::
value_ret_type
729 return this->pop_front_nochk_nolk();
733 return this->pop_front_nochk_nolk();
736 _T(
"Collection empty."),
748 template<
typename QT,
typename M,
typename WL,
class Sig,
class ValRet,
class MLk>
inline
752 const scoped_lock<atomic_t, atomic_t> wait(push_lock(), pop_lock());
753 assert(!container_type::empty());
755 assert(ret!=have_work_type::atomic_t::atom_abandoned);