hmbdc
simplify-high-performance-messaging-programming
MonoLockFreeBuffer.hpp
1 #include "hmbdc/Copyright.hpp"
2 #pragma once
3 
4 #include "hmbdc/pattern/LockFreeBufferMisc.hpp"
5 #include "hmbdc/os/Allocators.hpp"
6 #include "hmbdc/Config.hpp"
7 
8 #include <utility>
9 #include <limits>
10 #include <stdexcept>
11 #include <cstddef>
12 
13 namespace hmbdc { namespace pattern {
15  using Sequence = HMBDC_SEQ_TYPE;
17  using value_type = void *;
19  enum {
20  max_parallel_consumer = 0xffff
21  };
22 
23  template <typename Allocator = os::DefaultAllocator>
24  MonoLockFreeBuffer(size_t, uint32_t, Allocator& allocator = os::DefaultAllocator::instance);
26 
27  size_t maxItemSize() const;
28  size_t capacity() const;
29  void put(void const*, size_t sizeHint = 0);
30  template <typename T> void put(T const& item) {put(&item, sizeof(item));}
31 
32  template <typename T, typename ...Args>
33  void putInPlace(Args&&... args) {
34  auto s = claim();
35  new (*s) T(std::forward<Args>(args)...);
36  commit(s);
37  }
38 
39  bool tryPut(void const*, size_t sizeHint = 0);
40  bool isFull() const;
41  Sequence readSeq() const;
42  iterator claim();
43  iterator tryClaim();
44  iterator claim(size_t);
45  iterator tryClaim(size_t);
46  iterator killClaim();
47  iterator killClaim(size_t);
48  void commit(iterator);
49  void commit(iterator, size_t);
50  void take(void *, size_t = 0);
51  bool tryTake(void *, size_t = 0);
52  iterator peek();
53  size_t peek(iterator&, iterator&
54  , size_t maxPeekSize = std::numeric_limits<size_t>::max());
55  /**
56  * @brief if size not matching - please refer to the impl for details
57  */
58  void wasteAfterPeek(iterator, size_t, bool = false);
59  size_t remainingSize() const;
60  size_t parallelConsumerAlive() const {return 1;}
61  void reset();
62 
63  static
64  size_t footprint(size_t, uint32_t);
65 private:
66  std::ptrdiff_t impl_;
67  bool allocateFromHeap_;
68 };
69 }}
Definition: MonoLockFreeBuffer.hpp:14
Definition: LockFreeBufferMisc.hpp:25
Definition: Base.hpp:12
void wasteAfterPeek(iterator, size_t, bool=false)
if size not matching - please refer to the impl for details
Definition: LockFreeBufferMisc.hpp:73