2019-05-04 23:21:11 -07:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <glog/logging.h>
|
|
|
|
|
#include <memory>
|
|
|
|
|
#include <string_view>
|
|
|
|
|
|
|
|
|
|
namespace firebuf {
|
|
|
|
|
|
|
|
|
|
class ConstBuffer {
|
2019-05-18 12:11:20 -07:00
|
|
|
public:
|
|
|
|
|
ConstBuffer(const char *buf, size_t len);
|
2019-05-04 23:21:11 -07:00
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
[[nodiscard]] size_t ReadMaxLen() const;
|
|
|
|
|
[[nodiscard]] virtual const char *Read(size_t len);
|
|
|
|
|
template <class T>
|
|
|
|
|
[[nodiscard]] const T *ReadObj();
|
2019-05-04 23:21:11 -07:00
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
bool Discard(size_t len); // like Read() but don't use the result
|
|
|
|
|
void ResetRead(); // next read from last commit
|
|
|
|
|
void Commit(); // commit read position
|
2019-05-04 23:21:11 -07:00
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
virtual void Reset(); // full reset
|
2019-05-07 22:54:50 -07:00
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
protected:
|
|
|
|
|
const char *const_buf_;
|
|
|
|
|
size_t len_;
|
|
|
|
|
size_t start_ = 0;
|
|
|
|
|
size_t commit_ = 0;
|
2019-05-04 23:21:11 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class Buffer : public ConstBuffer {
|
2019-05-18 12:11:20 -07:00
|
|
|
public:
|
|
|
|
|
Buffer(char *buf, size_t size, size_t len);
|
|
|
|
|
Buffer(size_t size);
|
2019-05-04 23:21:11 -07:00
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
[[nodiscard]] char *WritePtr();
|
|
|
|
|
[[nodiscard]] size_t WriteMaxLen() const;
|
|
|
|
|
bool Write(const std::string_view &str);
|
|
|
|
|
void Wrote(ssize_t len);
|
2019-05-04 23:21:11 -07:00
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
void Consume(); // discard up to last commit
|
2019-05-04 23:21:11 -07:00
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
void Reset() override; // full reset
|
2019-05-07 22:54:50 -07:00
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
protected:
|
|
|
|
|
std::unique_ptr<char[]> own_buf_;
|
|
|
|
|
char *buf_;
|
|
|
|
|
const size_t size_;
|
2019-05-04 23:21:11 -07:00
|
|
|
};
|
|
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
template <class T>
|
|
|
|
|
const T *ConstBuffer::ReadObj() {
|
|
|
|
|
if (ReadMaxLen() < sizeof(T)) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
return reinterpret_cast<const T *>(Read(sizeof(T)));
|
2019-05-04 23:21:11 -07:00
|
|
|
}
|
|
|
|
|
|
2019-05-18 12:11:20 -07:00
|
|
|
} // namespace firebuf
|