density
C++11 library for paged memory management, function queues, heterogeneous queues and lifo memory management
lf_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/lf_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  consistency_model CONSISTENCY_MODEL = consistency_sequential>
21 
65 #ifndef DOXYGEN_DOC_GENERATION
66  template <
67  typename RET_VAL,
68  typename... PARAMS,
69  typename ALLOCATOR_TYPE,
70  function_type_erasure ERASURE,
71  concurrency_cardinality PROD_CARDINALITY,
72  concurrency_cardinality CONSUMER_CARDINALITY,
73  consistency_model CONSISTENCY_MODEL>
74  class lf_function_queue<
75  RET_VAL(PARAMS...),
76  ALLOCATOR_TYPE,
77  ERASURE,
78  PROD_CARDINALITY,
79  CONSUMER_CARDINALITY,
80  CONSISTENCY_MODEL>
81 #else
82  template <
83  typename CALLABLE,
84  typename ALLOCATOR_TYPE = default_allocator,
87  concurrency_cardinality CONSUMER_CARDINALITY = concurrency_multiple,
88  consistency_model CONSISTENCY_MODEL = consistency_sequential>
89  class lf_function_queue
90 #endif
91  {
92  private:
94  detail::FunctionRuntimeType<ERASURE, RET_VAL(PARAMS...)>,
95  ALLOCATOR_TYPE,
96  PROD_CARDINALITY,
97  CONSUMER_CARDINALITY,
98  CONSISTENCY_MODEL>;
99  UnderlyingQueue m_queue;
100 
101  public:
103  static constexpr bool concurrent_puts = PROD_CARDINALITY == concurrency_multiple;
104 
106  static constexpr bool concurrent_consumes = CONSUMER_CARDINALITY == concurrency_multiple;
107 
110  static constexpr bool concurrent_put_consumes = true;
111 
113  static constexpr bool is_seq_cst = CONSISTENCY_MODEL == consistency_sequential;
114 
118  lf_function_queue() noexcept = default;
119 
123  lf_function_queue(lf_function_queue && i_source) noexcept = default;
124 
128  lf_function_queue & operator=(lf_function_queue && i_source) noexcept = default;
129 
133  friend void swap(lf_function_queue & i_first, lf_function_queue & i_second) noexcept
134  {
135  using std::swap;
136  swap(i_first.m_queue, i_second.m_queue);
137  }
138 
141  {
142  auto erasure = ERASURE;
143  if (erasure == function_manual_clear)
144  {
146  }
147  }
148 
150  template <typename ELEMENT_COMPLETE_TYPE>
151  using put_transaction =
152  typename UnderlyingQueue::template put_transaction<ELEMENT_COMPLETE_TYPE>;
153 
155  template <typename ELEMENT_COMPLETE_TYPE>
157  typename UnderlyingQueue::template reentrant_put_transaction<ELEMENT_COMPLETE_TYPE>;
158 
160  using consume_operation = typename UnderlyingQueue::consume_operation;
161 
163  using reentrant_consume_operation = typename UnderlyingQueue::reentrant_consume_operation;
164 
172  template <typename ELEMENT_COMPLETE_TYPE> void push(ELEMENT_COMPLETE_TYPE && i_source)
173  {
174  m_queue.push(std::forward<ELEMENT_COMPLETE_TYPE>(i_source));
175  }
176 
184  template <typename ELEMENT_COMPLETE_TYPE, typename... CONSTRUCTION_PARAMS>
185  void emplace(CONSTRUCTION_PARAMS &&... i_construction_params)
186  {
187  m_queue.template emplace<ELEMENT_COMPLETE_TYPE>(
188  std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
189  }
190 
198  template <typename ELEMENT_TYPE>
200  start_push(ELEMENT_TYPE && i_source)
201  {
202  return m_queue.start_push(std::forward<ELEMENT_TYPE>(i_source));
203  }
204 
205 
213  template <typename ELEMENT_TYPE, typename... CONSTRUCTION_PARAMS>
214  put_transaction<ELEMENT_TYPE> start_emplace(CONSTRUCTION_PARAMS &&... i_construction_params)
215  {
216  return m_queue.template start_emplace<ELEMENT_TYPE>(
217  std::forward<ELEMENT_TYPE>(i_construction_params)...);
218  }
219 
225  template <typename ELEMENT_COMPLETE_TYPE>
226  void reentrant_push(ELEMENT_COMPLETE_TYPE && i_source)
227  {
228  m_queue.reentrant_push(std::forward<ELEMENT_COMPLETE_TYPE>(i_source));
229  }
230 
238  template <typename ELEMENT_COMPLETE_TYPE, typename... CONSTRUCTION_PARAMS>
239  void reentrant_emplace(CONSTRUCTION_PARAMS &&... i_construction_params)
240  {
241  m_queue.template reentrant_emplace<ELEMENT_COMPLETE_TYPE>(
242  std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
243  }
244 
252  template <typename ELEMENT_TYPE>
254  start_reentrant_push(ELEMENT_TYPE && i_source)
255  {
256  return m_queue.start_reentrant_push(std::forward<ELEMENT_TYPE>(i_source));
257  }
258 
259 
267  template <typename ELEMENT_TYPE, typename... CONSTRUCTION_PARAMS>
269  start_reentrant_emplace(CONSTRUCTION_PARAMS &&... i_construction_params)
270  {
271  return m_queue.template start_reentrant_emplace<ELEMENT_TYPE>(
272  std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
273  }
274 
280  template <typename ELEMENT_COMPLETE_TYPE>
281  bool try_push(
282  progress_guarantee i_progress_guarantee,
283  ELEMENT_COMPLETE_TYPE &&
284  i_source) noexcept(noexcept(m_queue
285  .try_push(
286  i_progress_guarantee,
287  std::forward<ELEMENT_COMPLETE_TYPE>(i_source))))
288  {
289  return m_queue.try_push(
290  i_progress_guarantee, std::forward<ELEMENT_COMPLETE_TYPE>(i_source));
291  }
292 
300  template <typename ELEMENT_COMPLETE_TYPE, typename... CONSTRUCTION_PARAMS>
301  bool
302  try_emplace(progress_guarantee i_progress_guarantee, CONSTRUCTION_PARAMS &&... i_construction_params) noexcept(
303  noexcept(m_queue.template try_emplace<ELEMENT_COMPLETE_TYPE>(
304  i_progress_guarantee, std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...)))
305  {
306  return m_queue.template try_emplace<ELEMENT_COMPLETE_TYPE>(
307  i_progress_guarantee, std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
308  }
309 
317  template <typename ELEMENT_TYPE>
319  progress_guarantee i_progress_guarantee,
320  ELEMENT_TYPE && i_source) noexcept(noexcept(m_queue
322  i_progress_guarantee,
323  std::forward<ELEMENT_TYPE>(i_source))))
324  {
325  return m_queue.try_start_push(
326  i_progress_guarantee, std::forward<ELEMENT_TYPE>(i_source));
327  }
328 
329 
337  template <typename ELEMENT_TYPE, typename... CONSTRUCTION_PARAMS>
339  progress_guarantee i_progress_guarantee,
340  CONSTRUCTION_PARAMS &&... i_construction_params) noexcept(noexcept(m_queue
341  .template try_start_emplace<
342  ELEMENT_TYPE>(
343  i_progress_guarantee,
344  std::forward<
345  ELEMENT_TYPE>(
346  i_construction_params)...)))
347  {
348  return m_queue.template try_start_emplace<ELEMENT_TYPE>(
349  i_progress_guarantee, std::forward<ELEMENT_TYPE>(i_construction_params)...);
350  }
351 
357  template <typename ELEMENT_COMPLETE_TYPE>
359  progress_guarantee i_progress_guarantee,
360  ELEMENT_COMPLETE_TYPE &&
361  i_source) noexcept(noexcept(m_queue
363  i_progress_guarantee,
364  std::forward<ELEMENT_COMPLETE_TYPE>(i_source))))
365  {
366  return m_queue.try_reentrant_push(
367  i_progress_guarantee, std::forward<ELEMENT_COMPLETE_TYPE>(i_source));
368  }
369 
377  template <typename ELEMENT_COMPLETE_TYPE, typename... CONSTRUCTION_PARAMS>
379  progress_guarantee i_progress_guarantee,
380  CONSTRUCTION_PARAMS &&... i_construction_params) noexcept(noexcept(m_queue
381  .template try_reentrant_emplace<
382  ELEMENT_COMPLETE_TYPE>(
383  i_progress_guarantee,
384  std::forward<
385  CONSTRUCTION_PARAMS>(
386  i_construction_params)...)))
387  {
388  return m_queue.template try_reentrant_emplace<ELEMENT_COMPLETE_TYPE>(
389  i_progress_guarantee, std::forward<CONSTRUCTION_PARAMS>(i_construction_params)...);
390  }
391 
399  template <typename ELEMENT_TYPE>
401  progress_guarantee i_progress_guarantee,
402  ELEMENT_TYPE && i_source) noexcept(noexcept(m_queue
404  i_progress_guarantee,
405  std::forward<ELEMENT_TYPE>(i_source))))
406  {
407  return m_queue.try_start_reentrant_push(
408  i_progress_guarantee, std::forward<ELEMENT_TYPE>(i_source));
409  }
410 
411 
419  template <typename ELEMENT_TYPE, typename... CONSTRUCTION_PARAMS>
421  progress_guarantee i_progress_guarantee,
422  CONSTRUCTION_PARAMS &&... i_construction_params) noexcept(noexcept(m_queue
423  .template try_start_reentrant_emplace<
424  ELEMENT_TYPE>(
425  i_progress_guarantee,
426  std::forward<
427  ELEMENT_TYPE>(
428  i_construction_params)...)))
429  {
430  return m_queue.template try_start_reentrant_emplace<ELEMENT_TYPE>(
431  i_progress_guarantee, std::forward<ELEMENT_TYPE>(i_construction_params)...);
432  }
433 
449  typename std::conditional<std::is_void<RET_VAL>::value, bool, optional<RET_VAL>>::type
450  try_consume(PARAMS... i_params)
451  {
452  return try_consume_impl(std::is_void<RET_VAL>(), std::forward<PARAMS>(i_params)...);
453  }
454 
475  typename std::conditional<std::is_void<RET_VAL>::value, bool, optional<RET_VAL>>::type
476  try_consume(consume_operation & i_consume, PARAMS... i_params)
477  {
478  return try_consume_impl_cached(
479  std::is_void<RET_VAL>(), i_consume, std::forward<PARAMS>(i_params)...);
480  }
481 
496  typename std::conditional<std::is_void<RET_VAL>::value, bool, optional<RET_VAL>>::type
497  try_reentrant_consume(PARAMS... i_params)
498  {
499  return try_reentrant_consume_impl(
500  std::is_void<RET_VAL>(), std::forward<PARAMS>(i_params)...);
501  }
502 
522  typename std::conditional<std::is_void<RET_VAL>::value, bool, optional<RET_VAL>>::type
523  try_reentrant_consume(reentrant_consume_operation & i_consume, PARAMS... i_params)
524  {
525  return try_reentrant_consume_impl_cached(
526  std::is_void<RET_VAL>(), i_consume, std::forward<PARAMS>(i_params)...);
527  }
528 
536  template <
537  function_type_erasure ERASURE_ = ERASURE,
538  typename std::enable_if<ERASURE_ != function_manual_clear>::type * = nullptr>
539  void clear() noexcept
540  {
541  auto erasure = ERASURE;
542  if (erasure == function_manual_clear)
543  {
544  DENSITY_ASSUME(false);
545  }
546  else
547  {
548  m_queue.clear();
549  }
550  }
551 
553  bool empty() noexcept { return m_queue.empty(); }
554 
555  private:
557  optional<RET_VAL> try_consume_impl(std::false_type, PARAMS... i_params)
558  {
559  if (auto cons = m_queue.try_start_consume())
560  {
561  auto && result = cons.complete_type().align_invoke_destroy(
562  cons.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
563  cons.commit_nodestroy();
564  return optional<RET_VAL>(std::move(result));
565  }
566  else
567  {
568  return optional<RET_VAL>();
569  }
570  }
571 
573  bool try_consume_impl(std::true_type, PARAMS... i_params)
574  {
575  if (auto cons = m_queue.try_start_consume())
576  {
577  cons.complete_type().align_invoke_destroy(
578  cons.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
579  cons.commit_nodestroy();
580  return true;
581  }
582  else
583  {
584  return false;
585  }
586  }
587 
589  optional<RET_VAL> try_consume_impl_cached(
590  std::false_type, consume_operation & i_consume, PARAMS... i_params)
591  {
592  if (m_queue.try_start_consume(i_consume))
593  {
594  auto && result = i_consume.complete_type().align_invoke_destroy(
595  i_consume.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
596  i_consume.commit_nodestroy();
597  return optional<RET_VAL>(std::move(result));
598  }
599  else
600  {
601  return optional<RET_VAL>();
602  }
603  }
604 
606  bool
607  try_consume_impl_cached(std::true_type, consume_operation & i_consume, PARAMS... i_params)
608  {
609  if (m_queue.try_start_consume(i_consume))
610  {
611  i_consume.complete_type().align_invoke_destroy(
612  i_consume.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
613  i_consume.commit_nodestroy();
614  return true;
615  }
616  else
617  {
618  return false;
619  }
620  }
621 
623  optional<RET_VAL> try_reentrant_consume_impl(std::false_type, PARAMS... i_params)
624  {
625  if (auto cons = m_queue.try_start_reentrant_consume())
626  {
627  auto && result = cons.complete_type().align_invoke_destroy(
628  cons.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
629  cons.commit_nodestroy();
630  return optional<RET_VAL>(std::move(result));
631  }
632  else
633  {
634  return optional<RET_VAL>();
635  }
636  }
637 
639  bool try_reentrant_consume_impl(std::true_type, PARAMS... i_params)
640  {
641  if (auto cons = m_queue.try_start_reentrant_consume())
642  {
643  cons.complete_type().align_invoke_destroy(
644  cons.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
645  cons.commit_nodestroy();
646  return true;
647  }
648  else
649  {
650  return false;
651  }
652  }
653 
655  optional<RET_VAL> try_reentrant_consume_impl_cached(
656  std::false_type, reentrant_consume_operation & i_consume, PARAMS... i_params)
657  {
658  if (m_queue.try_start_reentrant_consume(i_consume))
659  {
660  auto && result = i_consume.complete_type().align_invoke_destroy(
661  i_consume.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
662  i_consume.commit_nodestroy();
663  return optional<RET_VAL>(std::move(result));
664  }
665  else
666  {
667  return optional<RET_VAL>();
668  }
669  }
670 
672  bool try_reentrant_consume_impl_cached(
673  std::true_type, reentrant_consume_operation & i_consume, PARAMS... i_params)
674  {
675  if (m_queue.try_start_reentrant_consume(i_consume))
676  {
677  i_consume.complete_type().align_invoke_destroy(
678  i_consume.unaligned_element_ptr(), std::forward<PARAMS>(i_params)...);
679  i_consume.commit_nodestroy();
680  return true;
681  }
682  else
683  {
684  return false;
685  }
686  }
687  };
688 
689 } // namespace density
lf_function_queue() noexcept=default
std::conditional< std::is_void< RET_VAL >::value, bool, optional< RET_VAL > >::type try_consume(consume_operation &i_consume, PARAMS...i_params)
Definition: lf_function_queue.h:476
Definition: density_common.h:70
put_transaction< typename std::decay< ELEMENT_TYPE >::type > start_push(ELEMENT_TYPE &&i_source)
Definition: lf_function_queue.h:200
Definition: lf_function_queue.h:20
reentrant_consume_operation try_start_reentrant_consume() noexcept
Definition: lf_heter_queue.h:3160
basic_default_allocator< default_page_capacity > default_allocator
Definition: default_allocator.h:152
void push(ELEMENT_TYPE &&i_source)
Definition: lf_heter_queue.h:1085
concurrency_cardinality
Definition: density_common.h:56
Definition: conc_function_queue.h:11
typename UnderlyingQueue::template put_transaction< ELEMENT_COMPLETE_TYPE > put_transaction
Definition: lf_function_queue.h:152
std::conditional< std::is_void< RET_VAL >::value, bool, optional< RET_VAL > >::type try_reentrant_consume(PARAMS...i_params)
Definition: lf_function_queue.h:497
typename UnderlyingQueue::consume_operation consume_operation
Definition: lf_function_queue.h:160
friend void swap(lf_function_queue &i_first, lf_function_queue &i_second) noexcept
Definition: lf_function_queue.h:133
static constexpr bool concurrent_put_consumes
Definition: lf_function_queue.h:110
Definition: density_common.h:60
Definition: runtime_type.h:1061
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: lf_function_queue.h:400
consume_operation try_start_consume() noexcept
Definition: lf_heter_queue.h:1923
put_transaction< typename std::decay< ELEMENT_TYPE >::type > try_start_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept(noexcept(std::declval< lf_heter_queue >() .template try_start_emplace< typename std::decay< ELEMENT_TYPE >::type >( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: lf_heter_queue.h:1618
put_transaction< typename std::decay< ELEMENT_TYPE >::type > start_push(ELEMENT_TYPE &&i_source)
Definition: lf_heter_queue.h:1204
bool empty() const noexcept
Definition: lf_heter_queue.h:352
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< lf_heter_queue >() .template try_start_reentrant_emplace< typename std::decay< ELEMENT_TYPE >::type >( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: lf_heter_queue.h:2944
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: lf_function_queue.h:302
void reentrant_push(ELEMENT_COMPLETE_TYPE &&i_source)
Definition: lf_function_queue.h:226
#define DENSITY_ASSERT(...)
Definition: density_config.h:19
std::conditional< std::is_void< RET_VAL >::value, bool, optional< RET_VAL > >::type try_consume(PARAMS...i_params)
Definition: lf_function_queue.h:450
void emplace(CONSTRUCTION_PARAMS &&...i_construction_params)
Definition: lf_function_queue.h:185
void push(ELEMENT_COMPLETE_TYPE &&i_source)
Definition: lf_function_queue.h:172
void clear() noexcept
Definition: lf_function_queue.h:539
reentrant_put_transaction< ELEMENT_TYPE > start_reentrant_emplace(CONSTRUCTION_PARAMS &&...i_construction_params)
Definition: lf_function_queue.h:269
Definition: density_common.h:99
typename UnderlyingQueue::reentrant_consume_operation reentrant_consume_operation
Definition: lf_function_queue.h:163
static constexpr bool concurrent_consumes
Definition: lf_function_queue.h:106
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: lf_function_queue.h:378
progress_guarantee
Definition: density_common.h:84
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: lf_function_queue.h:318
static constexpr bool is_seq_cst
Definition: lf_function_queue.h:113
static constexpr bool concurrent_puts
Definition: lf_function_queue.h:103
Definition: density_common.h:101
put_transaction< ELEMENT_TYPE > start_emplace(CONSTRUCTION_PARAMS &&...i_construction_params)
Definition: lf_function_queue.h:214
builtin_optional< TYPE > optional
Definition: density_config.h:218
bool empty() noexcept
Definition: lf_function_queue.h:553
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: lf_function_queue.h:338
reentrant_put_transaction< typename std::decay< ELEMENT_TYPE >::type > start_reentrant_push(ELEMENT_TYPE &&i_source)
Definition: lf_function_queue.h:254
void reentrant_emplace(CONSTRUCTION_PARAMS &&...i_construction_params)
Definition: lf_function_queue.h:239
~lf_function_queue()
Definition: lf_function_queue.h:140
reentrant_put_transaction< typename std::decay< ELEMENT_TYPE >::type > start_reentrant_push(ELEMENT_TYPE &&i_source)
Definition: lf_heter_queue.h:2712
void clear() noexcept
Definition: lf_heter_queue.h:361
typename UnderlyingQueue::template reentrant_put_transaction< ELEMENT_COMPLETE_TYPE > reentrant_put_transaction
Definition: lf_function_queue.h:157
bool try_reentrant_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept(noexcept(std::declval< lf_heter_queue >() .template try_reentrant_emplace< typename std::decay< ELEMENT_TYPE >::type >( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: lf_heter_queue.h:2857
function_type_erasure
Definition: density_common.h:97
consistency_model
Definition: density_common.h:65
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: lf_function_queue.h:281
void reentrant_push(ELEMENT_TYPE &&i_source)
Definition: lf_heter_queue.h:2656
#define DENSITY_ASSUME(bool_expr,...)
Definition: density_config.h:46
bool try_push(progress_guarantee i_progress_guarantee, ELEMENT_TYPE &&i_source) noexcept( noexcept(std::declval< lf_heter_queue >() .template try_emplace< typename std::decay< ELEMENT_TYPE >::type >( i_progress_guarantee, std::forward< ELEMENT_TYPE >(i_source))))
Definition: lf_heter_queue.h:1430
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: lf_function_queue.h:358
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: lf_function_queue.h:420
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: lf_function_queue.h:523