Add missing Stream.hpp
This commit is contained in:
parent
936afd3be0
commit
a7fdc59440
1 changed files with 76 additions and 0 deletions
76
include/bolt/Stream.hpp
Normal file
76
include/bolt/Stream.hpp
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
|
namespace bolt {
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class Stream {
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual T get() = 0;
|
||||||
|
virtual T peek(std::size_t Offset = 0) = 0;
|
||||||
|
|
||||||
|
virtual ~Stream() {}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename ContainerT, typename T = typename ContainerT::value_type>
|
||||||
|
class VectorStream : public Stream<T> {
|
||||||
|
public:
|
||||||
|
|
||||||
|
using value_type = T;
|
||||||
|
|
||||||
|
ContainerT& Data;
|
||||||
|
value_type Sentry;
|
||||||
|
std::size_t Offset;
|
||||||
|
|
||||||
|
VectorStream(ContainerT& Data, value_type Sentry, std::size_t Offset = 0):
|
||||||
|
Data(Data), Sentry(Sentry), Offset(Offset) {}
|
||||||
|
|
||||||
|
value_type get() override {
|
||||||
|
return Offset < Data.size() ? Data[Offset++] : Sentry;
|
||||||
|
}
|
||||||
|
|
||||||
|
value_type peek(std::size_t Offset2) override {
|
||||||
|
auto I = Offset + Offset2;
|
||||||
|
return I < Data.size() ? Data[I] : Sentry;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class BufferedStream : public Stream<T> {
|
||||||
|
|
||||||
|
std::deque<T> Buffer;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual T read() = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
using value_type = T;
|
||||||
|
|
||||||
|
value_type get() override {
|
||||||
|
if (Buffer.empty()) {
|
||||||
|
return read();
|
||||||
|
} else {
|
||||||
|
auto Keep = Buffer.front();
|
||||||
|
Buffer.pop_front();
|
||||||
|
return Keep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
value_type peek(std::size_t Offset = 0) override {
|
||||||
|
while (Buffer.size() <= Offset) {
|
||||||
|
Buffer.push_back(read());
|
||||||
|
}
|
||||||
|
return Buffer[Offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue