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)
44 other._reader_pos = 0;
45 other._writer_pos = 0;
53 _initial_capacity = other._initial_capacity;
54 _capacity = other._capacity;
55 _storage = std::move(other._storage);
57 _reader_pos = other._reader_pos;
58 _writer_pos = other._writer_pos;
62 other._reader_pos = 0;
63 other._writer_pos = 0;
68 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
TransitEvent* front() noexcept
70 if (_reader_pos == _writer_pos)
74 return &_storage[_reader_pos & _mask];
77 QUILL_ATTRIBUTE_HOT
void pop_front() noexcept { ++_reader_pos; }
79 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
TransitEvent* back() noexcept
81 if (_capacity == size())
86 return &_storage[_writer_pos & _mask];
89 QUILL_ATTRIBUTE_HOT
void push_back() noexcept { ++_writer_pos; }
91 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
size_t size()
const noexcept
93 return _writer_pos - _reader_pos;
96 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
size_t capacity()
const noexcept {
return _capacity; }
98 QUILL_NODISCARD QUILL_ATTRIBUTE_HOT
bool empty()
const noexcept
100 return _reader_pos == _writer_pos;
103 void request_shrink() noexcept { _shrink_requested =
true; }
108 if (_shrink_requested && empty())
110 if (_capacity > _initial_capacity)
112 _storage = std::make_unique<TransitEvent[]>(_initial_capacity);
113 _capacity = _initial_capacity;
114 _mask = _capacity - 1;
119 _shrink_requested =
false;
126 size_t const new_capacity = _capacity * 2;
128 auto new_storage = std::make_unique<TransitEvent[]>(new_capacity);
133 size_t const current_size = size();
134 for (
size_t i = 0; i < current_size; ++i)
136 new_storage[i] = std::move(_storage[(_reader_pos + i) & _mask]);
139 _storage = std::move(new_storage);
140 _capacity = new_capacity;
141 _mask = _capacity - 1;
142 _writer_pos = current_size;
146 size_t _initial_capacity;
148 std::unique_ptr<TransitEvent[]> _storage;
150 size_t _reader_pos{0};
151 size_t _writer_pos{0};
152 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:46
Definition: TransitEvent.h:32
Definition: TransitEventBuffer.h:19
Setups a signal handler to handle fatal signals.
Definition: BackendManager.h:24