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" 24 _capacity(_initial_capacity),
35 : _initial_capacity(other._initial_capacity),
36 _capacity(other._capacity),
37 _storage(std::move(other._storage)),
39 _reader_pos(other._reader_pos),
40 _writer_pos(other._writer_pos),
41 _shrink_requested(other._shrink_requested)
45 other._reader_pos = 0;
46 other._writer_pos = 0;
47 other._shrink_requested =
false;
55 _initial_capacity = other._initial_capacity;
56 _capacity = other._capacity;
57 _storage = std::move(other._storage);
59 _reader_pos = other._reader_pos;
60 _writer_pos = other._writer_pos;
61 _shrink_requested = other._shrink_requested;
65 other._reader_pos = 0;
66 other._writer_pos = 0;
67 other._shrink_requested =
false;
72 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
TransitEvent* front() noexcept
74 if (_reader_pos == _writer_pos)
78 return &_storage[_reader_pos & _mask];
81 QUILL_ATTRIBUTE_HOT
void pop_front() noexcept { ++_reader_pos; }
83 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
TransitEvent* back() noexcept
85 if (_capacity == size())
90 return &_storage[_writer_pos & _mask];
93 QUILL_ATTRIBUTE_HOT
void push_back() noexcept { ++_writer_pos; }
95 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
size_t size()
const noexcept
97 return _writer_pos - _reader_pos;
100 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
size_t capacity()
const noexcept {
return _capacity; }
102 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
bool empty()
const noexcept
104 return _reader_pos == _writer_pos;
107 void request_shrink() noexcept { _shrink_requested =
true; }
112 if (_shrink_requested && empty())
114 if (_capacity > _initial_capacity)
116 _storage = std::make_unique<TransitEvent[]>(_initial_capacity);
117 _capacity = _initial_capacity;
118 _mask = _capacity - 1;
123 _shrink_requested =
false;
130 size_t const new_capacity = _capacity * 2;
132 auto new_storage = std::make_unique<TransitEvent[]>(new_capacity);
137 size_t const current_size = size();
138 for (
size_t i = 0; i < current_size; ++i)
140 new_storage[i] = std::move(_storage[(_reader_pos + i) & _mask]);
143 _storage = std::move(new_storage);
144 _capacity = new_capacity;
145 _mask = _capacity - 1;
146 _writer_pos = current_size;
150 size_t _initial_capacity;
152 std::unique_ptr<TransitEvent[]> _storage;
154 size_t _reader_pos{0};
155 size_t _writer_pos{0};
156 bool _shrink_requested{
false};
QUILL_NODISCARD T next_power_of_two(T n) noexcept
Round up to the next power of 2.
Definition: MathUtilities.h:45
Definition: TransitEvent.h:32
Definition: TransitEventBuffer.h:19
Setups a signal handler to handle fatal signals.
Definition: BackendManager.h:24