Files
firebuf/buffer.h

60 lines
1.3 KiB
C
Raw Permalink Normal View History

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-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-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