density
C++11 library for paged memory management, function queues, heterogeneous queues and lifo memory management
sp_function_queue.h
1 
2 // Copyright Giuseppe Campana (giu.campana@gmail.com) 2016-2018.
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 
7 #pragma once
8 #include <density/detail/function_runtime_type.h>
9 #include <density/sp_heter_queue.h>
10 
11 namespace density
12 {
13  template <
14  typename CALLABLE,
15  typename ALLOCATOR_TYPE = default_allocator,
18  concurrency_cardinality CONSUMER_CARDINALITY = concurrency_multiple,
19  typename BUSY_WAIT_FUNC = default_busy_wait>
21 
58 #ifndef DOXYGEN_DOC_GENERATION
59  template <
60  typename RET_VAL,
61  typename... PARAMS,
62  typename ALLOCATOR_TYPE,
63  function_type_erasure ERASURE,
64  concurrency_cardinality PROD_CARDINALITY,
65  concurrency_cardinality CONSUMER_CARDINALITY,
66  typename BUSY_WAIT_FUNC>
67  class sp_function_queue<
68  RET_VAL(PARAMS...),
69  ALLOCATOR_TYPE,
70  ERASURE,
71  PROD_CARDINALITY,
72  CONSUMER_CARDINALITY,
73  BUSY_WAIT_FUNC>
74 #else
75  template <
76  typename CALLABLE,
77  typename ALLOCATOR_TYPE = default_allocator,
80  concurrency_cardinality CONSUMER_CARDINALITY = concurrency_multiple,
81  typename BUSY_WAIT_FUNC = default_busy_wait>
82  class sp_function_queue
83 #endif
84  {
85  private:
87  detail::FunctionRuntimeType<ERASURE, RET_VAL(PARAMS...)>,
88  ALLOCATOR_TYPE,
89  PROD_CARDINALITY,
90  CONSUMER_CARDINALITY,
91  BUSY_WAIT_FUNC>;
92  UnderlyingQueue m_queue;
93 
94  public:
96  static constexpr bool concurrent_puts = PROD_CARDINALITY == concurrency_multiple;
97 
99  static constexpr bool concurrent_consumes = CONSUMER_CARDINALITY == concurrency_multiple;
100 
103  static constexpr bool concurrent_put_consumes = true;
104 
106  static constexpr bool is_seq_cst = true;
107 
111  sp_function_queue() noexcept = default;
112 
116  sp_function_queue(sp_function_queue && i_source) noexcept = default;
117 
121  sp_function_queue & operator=(sp_function_queue && i_source) noexcept = default;
122 
126  friend void swap(sp_function_queue & i_first, sp_function_queue & i_second) noexcept
127  {
128  using std::swap;
129  swap(i_first.m_queue, i_second.m_queue);
130  }
131 
134  {
135  auto erasure = ERASURE;
136  if (erasure == function_manual_clear)
137  {
139  }
140  }
141 
143  template <typename ELEMENT_COMPLETE_TYPE>
144  using put_transaction =
145  typename UnderlyingQueue::template put_transaction<ELEMENT_COMPLETE_TYPE>;
146 
148  template <typename ELEMENT_COMPLETE_TYPE>
150  typename UnderlyingQueue::template reentrant_put_transaction<ELEMENT_COMPLETE_TYPE>;
151 
153  using consume_operation = typename UnderlyingQueue::consume_operation;
154 
156  using reentrant_consume_operation = typename UnderlyingQueue::reentrant_consume_operation;
157 
165  template <typename ELEMENT_COMPLETE_TYPE> void push(ELEMENT_COMPLETE_TYPE && i_source)
166  {
167  m_queue.push(std::forward<ELEMENT_COMPLETE_TYPE>(i_source));
168  }
169 
177  template <typename ELEMENT_COMPLETE_TYPE, typename... CONSTRUCTION_PARAMS>
178  void emplace(CONSTRUCTION_PARAMS &&... i_construction_params)
179  {
180  m_queue.template emplace<ELEMENT_COMPLETE_TYPE>(
181  std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
182  }
183 
191  template <typename ELEMENT_TYPE>
193  start_push(ELEMENT_TYPE && i_source)
194  {
195  return m_queue.start_push(std::forward<ELEMENT_TYPE>(i_source));
196  }
197 
198 
206  template <typename ELEMENT_TYPE, typename... CONSTRUCTION_PARAMS>
207  put_transaction<ELEMENT_TYPE> start_emplace(CONSTRUCTION_PARAMS &&... i_construction_params)
208  {
209  return m_queue.template start_emplace<ELEMENT_TYPE>(
210  std::forward<ELEMENT_TYPE>(i_construction_params)...);
211  }
212 
218  template <typename ELEMENT_COMPLETE_TYPE>
219  void reentrant_push(ELEMENT_COMPLETE_TYPE && i_source)
220  {
221  m_queue.reentrant_push(std::forward<ELEMENT_COMPLETE_TYPE>(i_source));
222  }
223 
231  template <typename ELEMENT_COMPLETE_TYPE, typename... CONSTRUCTION_PARAMS>
232  void reentrant_emplace(CONSTRUCTION_PARAMS &&... i_construction_params)
233  {
234  m_queue.template reentrant_emplace<ELEMENT_COMPLETE_TYPE>(
235  std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
236  }
237 
245  template <typename ELEMENT_TYPE>
247  start_reentrant_push(ELEMENT_TYPE && i_source)
248  {
249  return m_queue.start_reentrant_push(std::forward<ELEMENT_TYPE>(i_source));
250  }
251 
252 
260  template <typename ELEMENT_TYPE, typename... CONSTRUCTION_PARAMS>
262  start_reentrant_emplace(CONSTRUCTION_PARAMS &&... i_construction_params)
263  {
264  return m_queue.template start_reentrant_emplace<ELEMENT_TYPE>(
265  std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
266  }
267 
273  template <typename ELEMENT_COMPLETE_TYPE>
274  bool try_push(
275  progress_guarantee i_progress_guarantee,
276  ELEMENT_COMPLETE_TYPE &&
277  i_source) noexcept(noexcept(m_queue
278  .try_push(
279  i_progress_guarantee,
280  std::forward<ELEMENT_COMPLETE_TYPE>(i_source))))
281  {
282  return m_queue.try_push(
283  i_progress_guarantee, std::forward<ELEMENT_COMPLETE_TYPE>(i_source));
284  }
285 
293  template <typename ELEMENT_COMPLETE_TYPE, typename... CONSTRUCTION_PARAMS>
294  bool
295  try_emplace(progress_guarantee i_progress_guarantee, CONSTRUCTION_PARAMS &&... i_construction_params) noexcept(
296  noexcept(m_queue.template try_emplace<ELEMENT_COMPLETE_TYPE>(
297  i_progress_guarantee, std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...)))
298  {
299  return m_queue.template try_emplace<ELEMENT_COMPLETE_TYPE>(
300  i_progress_guarantee, std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
301  }
302 
310  template <typename ELEMENT_TYPE>
312  progress_guarantee i_progress_guarantee,
313  ELEMENT_TYPE && i_source) noexcept(noexcept(m_queue
315  i_progress_guarantee,
316  std::forward<ELEMENT_TYPE>(i_source))))
317  {
318  return m_queue.try_start_push(
319  i_progress_guarantee, std::forward<ELEMENT_TYPE>(i_source));
320  }
321 
322 
330  template <typename ELEMENT_TYPE, typename... CONSTRUCTION_PARAMS>
332  progress_guarantee i_progress_guarantee,
333  CONSTRUCTION_PARAMS &&... i_construction_params) noexcept(noexcept(m_queue
334  .template try_start_emplace<
335  ELEMENT_TYPE>(
336  i_progress_guarantee,
337  std::forward<
338  ELEMENT_TYPE>(
339  i_construction_params)...)))
340  {
341  return m_queue.template try_start_emplace<ELEMENT_TYPE>(
342  i_progress_guarantee, std::forward<ELEMENT_TYPE>(i_construction_params)...);
343  }
344 
350  template <typename ELEMENT_COMPLETE_TYPE>
352  progress_guarantee i_progress_guarantee,
353  ELEMENT_COMPLETE_TYPE &&
354  i_source) noexcept(noexcept(m_queue
356  i_progress_guarantee,
357  std::forward<ELEMENT_COMPLETE_TYPE>(i_source))))
358  {
359  return m_queue.try_reentrant_push(
360  i_progress_guarantee, std::forward<ELEMENT_COMPLETE_TYPE>(i_source));
361  }
362 
370  template <typename ELEMENT_COMPLETE_TYPE, typename... CONSTRUCTION_PARAMS>
372  progress_guarantee i_progress_guarantee,
373  CONSTRUCTION_PARAMS &&... i_construction_params) noexcept(noexcept(m_queue
374  .template try_reentrant_emplace<
375  ELEMENT_COMPLETE_TYPE>(
376  i_progress_guarantee,
377  std::forward<
378  CONSTRUCTION_PARAMS>(
379  i_construction_params)...)))
380  {
381  return m_queue.template try_reentrant_emplace<ELEMENT_COMPLETE_TYPE>(
382  i_progress_guarantee, std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
383  }
384 
392  template <typename ELEMENT_TYPE>
394  progress_guarantee i_progress_guarantee,
395  ELEMENT_TYPE && i_source) noexcept(noexcept(m_queue
397  i_progress_guarantee,
398  std::forward<ELEMENT_TYPE>(i_source))))
399  {
400  return m_queue.try_start_reentrant_push(
401  i_progress_guarantee, std::forward<ELEMENT_TYPE>(i_source));
402  }
403 
404 
412  template <typename ELEMENT_TYPE, typename... CONSTRUCTION_PARAMS>
414  progress_guarantee i_progress_guarantee,
415  CONSTRUCTION_PARAMS &&... i_construction_params) noexcept(noexcept(m_queue
416  .template try_start_reentrant_emplace<
417  ELEMENT_TYPE>(
418  i_progress_guarantee,
419  std::forward<
420  ELEMENT_TYPE>(
421  i_construction_params)...)))
422  {
423  return m_queue.template try_start_reentrant_emplace<ELEMENT_TYPE>(
424  i_progress_guarantee, std::forward<ELEMENT_TYPE>(i_construction_params)...);
425  }
426 
442  typename std::conditional<std::is_void<RET_VAL>::value, bool, density::optional<RET_VAL>>::
443  type
444  try_consume(PARAMS... i_params)
445  {
446  return try_consume_impl(std::is_void<RET_VAL>(), std::forward<PARAMS>(i_params)...);
447  }
448 
469  typename std::conditional<std::is_void<RET_VAL>::value, bool, optional<RET_VAL>>::type
470  try_consume(consume_operation & i_consume, PARAMS... i_params)
471  {
472  return try_consume_impl_cached(
473  std::is_void<RET_VAL>(), i_consume, std::forward<PARAMS>(i_params)...);
474  }
475 
490  typename std::conditional<std::is_void<RET_VAL>::value, bool, density::optional<RET_VAL>>::
491  type
492  try_reentrant_consume(PARAMS... i_params)
493  {
494  return try_reentrant_consume_impl(
495  std::is_void<RET_VAL>(), std::forward<PARAMS>(i_params)...);
496  }
497 
517  typename std::conditional<std::is_void<RET_VAL>::value, bool, optional<RET_VAL>>::type
518  try_reentrant_consume(reentrant_consume_operation & i_consume, PARAMS... i_params)
519  {
520  return try_reentrant_consume_impl_cached(
521  std::is_void<RET_VAL>(), i_consume, std::forward<PARAMS>(i_params)...);
522  }
523 
531  template <
532  function_type_erasure ERASURE_ = ERASURE,
533  typename std::enable_if<ERASURE_ != function_manual_clear>::type * = nullptr>
534  void clear() noexcept
535  {
536  auto erasure = ERASURE;
537  if (erasure == function_manual_clear)
538  {
539  DENSITY_ASSUME(false);
540  }
541  else
542  {
543  m_queue.clear();
544  }
545  }
546 
548  bool empty() noexcept { return m_queue.empty(); }
549 
550  private:
552  optional<RET_VAL> try_consume_impl(std::false_type, PARAMS... i_params)
553  {
554  if (auto cons = m_queue.try_start_consume())
555  {
556  auto && result = cons.complete_type().align_invoke_destroy(
557  cons.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
558  cons.commit_nodestroy();
559  return optional<RET_VAL>(std::move(result));
560  }
561  else
562  {
563  return optional<RET_VAL>();
564  }
565  }
566 
568  bool try_consume_impl(std::true_type, PARAMS... i_params)
569  {
570  if (auto cons = m_queue.try_start_consume())
571  {
572  cons.complete_type().align_invoke_destroy(
573  cons.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
574  cons.commit_nodestroy();
575  return true;
576  }
577  else
578  {
579  return false;
580  }
581  }
582 
584  optional<RET_VAL> try_consume_impl_cached(
585  std::false_type, consume_operation & i_consume, PARAMS... i_params)
586  {
587  if (m_queue.try_start_consume(i_consume))
588  {
589  auto && result = i_consume.complete_type().align_invoke_destroy(
590  i_consume.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
591  i_consume.commit_nodestroy();
592  return optional<RET_VAL>(std::move(result));
593  }
594  else
595  {
596  return optional<RET_VAL>();
597  }
598  }
599 
601  bool
602  try_consume_impl_cached(std::true_type, consume_operation & i_consume, PARAMS... i_params)
603  {
604  if (m_queue.try_start_consume(i_consume))
605  {
606  i_consume.complete_type().align_invoke_destroy(
607  i_consume.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
608  i_consume.commit_nodestroy();
609  return true;
610  }
611  else
612  {
613  return false;
614  }
615  }
616 
618  optional<RET_VAL> try_reentrant_consume_impl(std::false_type, PARAMS... i_params)
619  {
620  if (auto cons = m_queue.try_start_reentrant_consume())
621  {
622  auto && result = cons.complete_type().align_invoke_destroy(
623  cons.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
624  cons.commit_nodestroy();
625  return optional<RET_VAL>(std::move(result));
626  }
627  else
628  {
629  return optional<RET_VAL>();
630  }
631  }
632 
634  bool try_reentrant_consume_impl(std::true_type, PARAMS... i_params)
635  {
636  if (auto cons = m_queue.try_start_reentrant_consume())
637  {
638  cons.complete_type().align_invoke_destroy(
639  cons.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
640  cons.commit_nodestroy();
641  return true;
642  }
643  else
644  {
645  return false;
646  }
647  }
648 
650  optional<RET_VAL> try_reentrant_consume_impl_cached(
651  std::false_type, reentrant_consume_operation & i_consume, PARAMS... i_params)
652  {
653  if (m_queue.try_start_reentrant_consume(i_consume))
654  {
655  auto && result = i_consume.complete_type().align_invoke_destroy(
656  i_consume.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
657  i_consume.commit_nodestroy();
658  return optional<RET_VAL>(std::move(result));
659  }
660  else
661  {
662  return optional<RET_VAL>();
663  }
664  }
665 
667  bool try_reentrant_consume_impl_cached(
668  std::true_type, reentrant_consume_operation & i_consume, PARAMS... i_params)
669  {
670  if (m_queue.try_start_reentrant_consume(i_consume))
671  {
672  i_consume.complete_type().align_invoke_destroy(
673  i_consume.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
674  i_consume.commit_nodestroy();
675  return true;
676  }
677  else
678  {
679  return false;
680  }
681  }
682  };
683 
684 } // namespace density
friend void swap(sp_function_queue &i_first, sp_function_queue &i_second) noexcept
Definition: sp_function_queue.h:126
static constexpr bool is_seq_cst
Definition: sp_function_queue.h:106
put_transaction< typename std::decay< ELEMENT_TYPE >::type > try_start_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept(noexcept(m_queue .try_start_push( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: sp_function_queue.h:311
basic_default_allocator< default_page_capacity > default_allocator
Definition: default_allocator.h:152
concurrency_cardinality
Definition: density_common.h:56
Definition: conc_function_queue.h:11
typename UnderlyingQueue::consume_operation consume_operation
Definition: sp_function_queue.h:153
bool try_push(progress_guarantee i_progress_guarantee, ELEMENT_COMPLETE_TYPE &&i_source) noexcept(noexcept(m_queue .try_push( i_progress_guarantee, std::forward< ELEMENT_COMPLETE_TYPE >(i_source))))
Definition: sp_function_queue.h:274
std::conditional< std::is_void< RET_VAL >::value, bool, density::optional< RET_VAL > >::type try_consume(PARAMS...i_params)
Definition: sp_function_queue.h:444
void reentrant_push(ELEMENT_COMPLETE_TYPE &&i_source)
Definition: sp_function_queue.h:219
Definition: density_common.h:60
void reentrant_push(ELEMENT_TYPE &&i_source)
Definition: sp_heter_queue.h:2778
void push(ELEMENT_COMPLETE_TYPE &&i_source)
Definition: sp_function_queue.h:165
put_transaction< typename std::decay< ELEMENT_TYPE >::type > start_push(ELEMENT_TYPE &&i_source)
Definition: sp_function_queue.h:193
reentrant_put_transaction< typename std::decay< ELEMENT_TYPE >::type > start_reentrant_push(ELEMENT_TYPE &&i_source)
Definition: sp_heter_queue.h:2834
Definition: runtime_type.h:1061
typename UnderlyingQueue::template reentrant_put_transaction< ELEMENT_COMPLETE_TYPE > reentrant_put_transaction
Definition: sp_function_queue.h:150
static constexpr bool concurrent_put_consumes
Definition: sp_function_queue.h:103
sp_function_queue() noexcept=default
static constexpr bool concurrent_puts
Definition: sp_function_queue.h:96
void clear() noexcept
Definition: sp_heter_queue.h:483
#define DENSITY_ASSERT(...)
Definition: density_config.h:19
typename UnderlyingQueue::template put_transaction< ELEMENT_COMPLETE_TYPE > put_transaction
Definition: sp_function_queue.h:145
void emplace(CONSTRUCTION_PARAMS &&...i_construction_params)
Definition: sp_function_queue.h:178
reentrant_put_transaction< ELEMENT_TYPE > start_reentrant_emplace(CONSTRUCTION_PARAMS &&...i_construction_params)
Definition: sp_function_queue.h:262
void clear() noexcept
Definition: sp_function_queue.h:534
bool try_reentrant_push(progress_guarantee i_progress_guarantee, ELEMENT_COMPLETE_TYPE &&i_source) noexcept(noexcept(m_queue .try_reentrant_push( i_progress_guarantee, std::forward< ELEMENT_COMPLETE_TYPE >(i_source))))
Definition: sp_function_queue.h:351
std::conditional< std::is_void< RET_VAL >::value, bool, optional< RET_VAL > >::type try_consume(consume_operation &i_consume, PARAMS...i_params)
Definition: sp_function_queue.h:470
Definition: density_common.h:99
put_transaction< typename std::decay< ELEMENT_TYPE >::type > try_start_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept(noexcept(std::declval< sp_heter_queue >() .template try_start_emplace< typename std::decay< ELEMENT_TYPE >::type >( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: sp_heter_queue.h:1740
void reentrant_emplace(CONSTRUCTION_PARAMS &&...i_construction_params)
Definition: sp_function_queue.h:232
Definition: sp_heter_queue.h:47
reentrant_put_transaction< typename std::decay< ELEMENT_TYPE >::type > start_reentrant_push(ELEMENT_TYPE &&i_source)
Definition: sp_function_queue.h:247
std::conditional< std::is_void< RET_VAL >::value, bool, optional< RET_VAL > >::type try_reentrant_consume(reentrant_consume_operation &i_consume, PARAMS...i_params)
Definition: sp_function_queue.h:518
progress_guarantee
Definition: density_common.h:84
reentrant_put_transaction< typename std::decay< ELEMENT_TYPE >::type > try_start_reentrant_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept(noexcept(std::declval< sp_heter_queue >() .template try_start_reentrant_emplace< typename std::decay< ELEMENT_TYPE >::type >( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: sp_heter_queue.h:3067
bool try_emplace(progress_guarantee i_progress_guarantee, CONSTRUCTION_PARAMS &&...i_construction_params) noexcept( noexcept(m_queue.template try_emplace< ELEMENT_COMPLETE_TYPE >( i_progress_guarantee, std::forward< CONSTRUCTION_PARAMS >(i_construction_params)...)))
Definition: sp_function_queue.h:295
Definition: density_common.h:101
bool empty() const noexcept
Definition: sp_heter_queue.h:474
put_transaction< ELEMENT_TYPE > try_start_emplace(progress_guarantee i_progress_guarantee, CONSTRUCTION_PARAMS &&...i_construction_params) noexcept(noexcept(m_queue .template try_start_emplace< ELEMENT_TYPE >( i_progress_guarantee, std::forward< ELEMENT_TYPE >( i_construction_params)...)))
Definition: sp_function_queue.h:331
builtin_optional< TYPE > optional
Definition: density_config.h:218
bool empty() noexcept
Definition: sp_function_queue.h:548
static constexpr bool concurrent_consumes
Definition: sp_function_queue.h:99
bool try_reentrant_emplace(progress_guarantee i_progress_guarantee, CONSTRUCTION_PARAMS &&...i_construction_params) noexcept(noexcept(m_queue .template try_reentrant_emplace< ELEMENT_COMPLETE_TYPE >( i_progress_guarantee, std::forward< CONSTRUCTION_PARAMS >( i_construction_params)...)))
Definition: sp_function_queue.h:371
typename UnderlyingQueue::reentrant_consume_operation reentrant_consume_operation
Definition: sp_function_queue.h:156
reentrant_put_transaction< ELEMENT_TYPE > try_start_reentrant_emplace(progress_guarantee i_progress_guarantee, CONSTRUCTION_PARAMS &&...i_construction_params) noexcept(noexcept(m_queue .template try_start_reentrant_emplace< ELEMENT_TYPE >( i_progress_guarantee, std::forward< ELEMENT_TYPE >( i_construction_params)...)))
Definition: sp_function_queue.h:413
std::conditional< std::is_void< RET_VAL >::value, bool, density::optional< RET_VAL > >::type try_reentrant_consume(PARAMS...i_params)
Definition: sp_function_queue.h:492
reentrant_put_transaction< typename std::decay< ELEMENT_TYPE >::type > try_start_reentrant_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept(noexcept(m_queue .try_start_reentrant_push( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: sp_function_queue.h:393
void push(ELEMENT_TYPE &&i_source)
Definition: sp_heter_queue.h:1207
function_type_erasure
Definition: density_common.h:97
reentrant_consume_operation try_start_reentrant_consume() noexcept
Definition: sp_heter_queue.h:3283
consume_operation try_start_consume() noexcept
Definition: sp_heter_queue.h:2045
Definition: sp_function_queue.h:20
~sp_function_queue()
Definition: sp_function_queue.h:133
bool try_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept( noexcept(std::declval< sp_heter_queue >() .template try_emplace< typename std::decay< ELEMENT_TYPE >::type >( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: sp_heter_queue.h:1552
#define DENSITY_ASSUME(bool_expr,...)
Definition: density_config.h:46
put_transaction< ELEMENT_TYPE > start_emplace(CONSTRUCTION_PARAMS &&...i_construction_params)
Definition: sp_function_queue.h:207
bool try_reentrant_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept(noexcept(std::declval< sp_heter_queue >() .template try_reentrant_emplace< typename std::decay< ELEMENT_TYPE >::type >( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: sp_heter_queue.h:2980
put_transaction< typename std::decay< ELEMENT_TYPE >::type > start_push(ELEMENT_TYPE &&i_source)
Definition: sp_heter_queue.h:1326