- 论坛徽章:
- 1
|
- #ifndef FIXEDBUFFER_H
- #define FIXEDBUFFER_H
- #define FIXEDBUFFER_LENGTH_TYPE uint16_t
- class FixedBuffer
- {
- private:
- unsigned char* _buffer;
- size_t _rpos;
- size_t _wpos;
- size_t _capacity;
- bool _readonly;
-
- public:
- FixedBuffer(size_t capacity, bool readonly = false)
- : _rpos(0)
- , _wpos(0)
- , _readonly(readonly)
- {
- _buffer = new unsigned char[capacity];
- _capacity = capacity;
- }
- FixedBuffer(unsigned char* buffer, size_t capacity, bool readonly = true)
- : _buffer(buffer)
- , _rpos(0)
- , _wpos(capacity)
- , _capacity(capacity)
- , _readonly(readonly)
- {
- }
- ~FixedBuffer()
- {
- if (!_readonly)
- delete[] _buffer;
- }
- inline size_t rpos() const { return _rpos; }
- inline size_t wpos() const { return _wpos; }
- inline const unsigned char* c_arr() { return _buffer; }
- template<class T>
- FixedBuffer& operator<<(const T t)
- {
- if (_wpos + sizeof(t) >= _capacity)
- throw std::exception();
- memcpy(_buffer + _wpos, (unsigned char*)&t, sizeof(t));
- _wpos += sizeof t;
- return *this;
- }
- FixedBuffer& operator<<(const std::string& t)
- {
- if (_wpos + sizeof(FIXEDBUFFER_LENGTH_TYPE) + t.size() >= _capacity)
- throw std::exception();
- size_t size = t.size();
- memcpy(_buffer + _wpos, (unsigned char*)&size, sizeof(FIXEDBUFFER_LENGTH_TYPE));
- memcpy(_buffer + _wpos + sizeof(FIXEDBUFFER_LENGTH_TYPE), (unsigned char*)t.c_str(), t.size());
- _wpos += sizeof(FIXEDBUFFER_LENGTH_TYPE) + t.size();
- return *this;
- }
- template<class T>
- FixedBuffer& operator>>(T& t)
- {
- if (_rpos + sizeof(t) > _wpos)
- throw std::exception();
- memcpy((void*)&t, _buffer + _rpos, sizeof(t));
- _rpos += sizeof t;
- return *this;
- }
- FixedBuffer& operator>>(std::string& t)
- {
- if (_rpos + sizeof(FIXEDBUFFER_LENGTH_TYPE) > _wpos)
- throw std::exception();
- size_t size;
- memcpy((void*)&size, _buffer + _rpos, sizeof(FIXEDBUFFER_LENGTH_TYPE));
- if (_rpos + sizeof(FIXEDBUFFER_LENGTH_TYPE) + size > _wpos)
- throw std::exception();
- t.resize(size);
- memcpy((void*)&t[0], _buffer + _rpos + sizeof(FIXEDBUFFER_LENGTH_TYPE), size);
-
- _rpos += sizeof(FIXEDBUFFER_LENGTH_TYPE) + size;
- return *this;
- }
- };
- #endif
复制代码 |
|