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;
148 std::pair<std::size_t, bool>
extract(std::size_t number, Type_* output) {
149 std::size_t original = number;
153 auto start =
ptr + my_current;
156 if (leftover > number) {
157 my_current += number;
159 std::copy(start,
ptr + my_current, output);
171 if (number == 0 || !okay) {
178 return std::make_pair(original - number, okay);
194template<
typename Type_,
class Po
inter_ = std::unique_ptr<Reader> >
209 skip_zero_buffers(*my_reader, this->available);
210 this->
ptr =
reinterpret_cast<const Type_*
>(my_reader->buffer());
225template<
typename Type_,
class Po
inter_ = std::unique_ptr<Reader> >
232 my_ready_input =
false;
233 my_thread = std::thread([&]() { thread_loop(); });
235 skip_zero_buffers(*my_reader, my_next_available);
236 my_ready_output =
true;
245 std::unique_lock lck(my_mut);
247 my_ready_input =
true;
259 std::vector<Type_> my_buffer;
260 std::size_t my_next_available = 0;
261 bool my_finished =
false;
264 std::thread my_thread;
265 std::exception_ptr my_thread_err =
nullptr;
267 std::condition_variable my_cv;
268 bool my_ready_input, my_ready_output;
271 while (!my_finished) {
272 std::unique_lock lck(my_mut);
273 my_cv.wait(lck, [&]() {
return my_ready_input; });
274 my_ready_input =
false;
281 skip_zero_buffers(*my_reader, my_next_available);
282 my_finished = my_next_available == 0;
284 my_thread_err = std::current_exception();
288 my_ready_output =
true;
302 std::unique_lock lck(my_mut);
303 my_cv.wait(lck, [&]() {
return my_ready_output; });
304 my_ready_output =
false;
306 std::rethrow_exception(my_thread_err);
309 auto rptr =
reinterpret_cast<const Type_*
>(my_reader->buffer());
310 this->available = my_next_available;
311 my_buffer.resize(this->available);
312 std::copy_n(rptr, this->available, my_buffer.data());
313 this->
ptr = my_buffer.data();
315 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:148
std::size_t available
Definition PerByte.hpp:76
Parallelized byte-by-byte extraction from a Reader source.
Definition PerByte.hpp:226
void refill()
Definition PerByte.hpp:295
PerByteParallel(Pointer_ reader)
Definition PerByte.hpp:231
Serial byte-by-byte extraction from a Reader source.
Definition PerByte.hpp:195
PerByteSerial(Pointer_ reader)
Definition PerByte.hpp:200
void refill()
Definition PerByte.hpp:208
Simple byte readers and writers.