9 #include "quill/backend/TransitEvent.h" 10 #include "quill/bundled/fmt/format.h" 11 #include "quill/core/Attributes.h" 12 #include "quill/core/MathUtilities.h" 27 _capacity(_initial_capacity),
38 : _initial_capacity(other._initial_capacity),
39 _capacity(other._capacity),
40 _storage(std::move(other._storage)),
42 _reader_pos(other._reader_pos),
43 _writer_pos(other._writer_pos),
44 _shrink_requested(other._shrink_requested)
48 other._reader_pos = 0;
49 other._writer_pos = 0;
50 other._shrink_requested =
false;
58 _initial_capacity = other._initial_capacity;
59 _capacity = other._capacity;
60 _storage = std::move(other._storage);
62 _reader_pos = other._reader_pos;
63 _writer_pos = other._writer_pos;
64 _shrink_requested = other._shrink_requested;
68 other._reader_pos = 0;
69 other._writer_pos = 0;
70 other._shrink_requested =
false;
75 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
TransitEvent* front() noexcept
77 if (_reader_pos == _writer_pos)
81 return &_storage[_reader_pos & _mask];
84 QUILL_ATTRIBUTE_HOT
void pop_front() noexcept { ++_reader_pos; }
91 if (_capacity == size())
96 return &_storage[_writer_pos & _mask];
99 QUILL_ATTRIBUTE_HOT
void push_back() noexcept { ++_writer_pos; }
101 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
size_t size()
const noexcept
103 return _writer_pos - _reader_pos;
106 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
size_t capacity()
const noexcept {
return _capacity; }
108 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
bool empty()
const noexcept
110 return _reader_pos == _writer_pos;
113 void request_shrink() noexcept { _shrink_requested =
true; }
118 if (_shrink_requested && empty())
120 if (_capacity > _initial_capacity)
122 _storage = std::make_unique<TransitEvent[]>(_initial_capacity);
123 _capacity = _initial_capacity;
124 _mask = _capacity - 1;
129 _shrink_requested =
false;
136 size_t const new_capacity = _capacity * 2;
138 auto new_storage = std::make_unique<TransitEvent[]>(new_capacity);
143 size_t const current_size = size();
144 for (
size_t i = 0; i < current_size; ++i)
146 new_storage[i] = std::move(_storage[(_reader_pos + i) & _mask]);
149 _storage = std::move(new_storage);
150 _capacity = new_capacity;
151 _mask = _capacity - 1;
152 _writer_pos = current_size;
156 size_t _initial_capacity;
158 std::unique_ptr<TransitEvent[]> _storage;
160 size_t _reader_pos{0};
161 size_t _writer_pos{0};
162 bool _shrink_requested{
false};
Definition: TransitEvent.h:33
Definition: TransitEventBuffer.h:22
QUILL_NODISCARD size_t next_power_of_two(size_t n) noexcept
Round up to the next power of 2.
Definition: MathUtilities.h:35
QUILL_NODISCARD QUILL_ATTRIBUTE_HOT TransitEvent * back()
Expands the buffer when full, so it can throw on allocation failure.
Definition: TransitEventBuffer.h:89
Setups a signal handler to handle fatal signals.
Definition: BackendManager.h:28