1#ifndef BYTEME_PERBYTE_HPP
2#define BYTEME_PERBYTE_HPP
10#include <condition_variable>
26template<
class Reader_>
27void skip_zero_buffers(Reader_& reader, std::size_t& available) {
29 while (reader.load()) {
30 available = reader.available();
51template<
typename Type_>
71 const Type_*
ptr =
nullptr;
84 std::size_t my_current = 0;
88 unsigned long long my_overall = 0;
115 return ptr[my_current];
122 return my_overall + my_current;
147 std::pair<std::size_t, bool>
extract(std::size_t number, Type_* output) {
148 std::size_t original = number;
152 auto start =
ptr + my_current;
155 if (leftover > number) {
156 my_current += number;
158 std::copy(start,
ptr + my_current, output);
170 if (number == 0 || !okay) {
177 return std::make_pair(original - number, okay);
193template<
typename Type_,
class Po
inter_ = std::unique_ptr<Reader> >
208 skip_zero_buffers(*my_reader, this->available);
209 this->
ptr =
reinterpret_cast<const Type_*
>(my_reader->buffer());
224template<
typename Type_,
class Po
inter_ = std::unique_ptr<Reader> >
231 my_ready_input =
false;
232 my_thread = std::thread([&]() { thread_loop(); });
234 skip_zero_buffers(*my_reader, my_next_available);
235 my_ready_output =
true;
244 std::unique_lock lck(my_mut);
246 my_ready_input =
true;
258 std::vector<Type_> my_buffer;
259 std::size_t my_next_available = 0;
260 bool my_finished =
false;
263 std::thread my_thread;
264 std::exception_ptr my_thread_err =
nullptr;
266 std::condition_variable my_cv;
267 bool my_ready_input, my_ready_output;
270 while (!my_finished) {
271 std::unique_lock lck(my_mut);
272 my_cv.wait(lck, [&]() {
return my_ready_input; });
273 my_ready_input =
false;
280 skip_zero_buffers(*my_reader, my_next_available);
281 my_finished = my_next_available == 0;
283 my_thread_err = std::current_exception();
287 my_ready_output =
true;
301 std::unique_lock lck(my_mut);
302 my_cv.wait(lck, [&]() {
return my_ready_output; });
303 my_ready_output =
false;
305 std::rethrow_exception(my_thread_err);
308 auto rptr =
reinterpret_cast<const Type_*
>(my_reader->buffer());
309 this->available = my_next_available;
310 my_buffer.resize(this->available);
311 std::copy_n(rptr, this->available, my_buffer.data());
312 this->
ptr = my_buffer.data();
314 my_ready_input =
true;
Interface for byte-by-byte extraction from a Reader source.
Definition PerByte.hpp:52
unsigned long long position() const
Definition PerByte.hpp:121
const Type_ * ptr
Definition PerByte.hpp:71
bool valid() const
Definition PerByte.hpp:128
Type_ get() const
Definition PerByte.hpp:114
bool advance()
Definition PerByte.hpp:97
std::pair< std::size_t, bool > extract(std::size_t number, Type_ *output)
Definition PerByte.hpp:147
std::size_t available
Definition PerByte.hpp:76
Parallelized byte-by-byte extraction from a Reader source.
Definition PerByte.hpp:225
void refill()
Definition PerByte.hpp:294
PerByteParallel(Pointer_ reader)
Definition PerByte.hpp:230
Serial byte-by-byte extraction from a Reader source.
Definition PerByte.hpp:194
PerByteSerial(Pointer_ reader)
Definition PerByte.hpp:199
void refill()
Definition PerByte.hpp:207
Simple byte readers and writers.