forked from Tencent/mars
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathautobuffer.h
120 lines (86 loc) · 3.28 KB
/
autobuffer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* Copyright (c) 2013-2015 Tencent. All rights reserved. */
#ifndef COMM_AUTOBUFFER_H_
#define COMM_AUTOBUFFER_H_
#include <sys/types.h>
#include <string.h>
class AutoBuffer {
public:
enum TSeek {
ESeekStart,
ESeekCur,
ESeekEnd,
};
public:
explicit AutoBuffer(size_t _size = 128);
explicit AutoBuffer(void* _pbuffer, size_t _len, size_t _size = 128);
explicit AutoBuffer(const void* _pbuffer, size_t _len, size_t _size = 128);
~AutoBuffer();
void AllocWrite(size_t _readytowrite, bool _changelength = true);
void AddCapacity(size_t _len);
template<class T> void Write(const T& _val)
{ Write(&_val, sizeof(_val));}
template<class T> void Write(off_t& _pos, const T& _val)
{ Write(_pos, &_val, sizeof(_val));}
template<class T> void Write(const off_t& _pos, const T& _val)
{ Write(_pos, &_val, sizeof(_val));}
void Write(const char* const _val)
{ Write(_val, strlen(_val));}
void Write(off_t& _pos, const char* const _val)
{ Write(_pos, _val, strlen(_val));}
void Write(const off_t& _pos, const char* const _val)
{ Write(_pos, _val, strlen(_val));}
void Write(const void* _pbuffer, size_t _len);
void Write(off_t& _pos, const void* _pbuffer, size_t _len);
void Write(const off_t& _pos, const void* _pbuffer, size_t _len);
void Write(TSeek _seek, const void* _pbuffer, size_t _len);
template<class T> size_t Read(T& _val)
{ return Read(&_val, sizeof(_val)); }
template<class T> size_t Read(off_t& _pos, T& _val) const
{ return Read(_pos, &_val, sizeof(_val)); }
template<class T> size_t Read(const off_t& _pos, T& _val) const
{ return Read(_pos, &_val, sizeof(_val)); }
size_t Read(void* _pbuffer, size_t _len);
size_t Read(AutoBuffer& _rhs , size_t _len);
size_t Read(off_t& _pos, void* _pbuffer, size_t _len) const;
size_t Read(off_t& _pos, AutoBuffer& _rhs, size_t _len) const;
size_t Read(const off_t& _pos, void* _pbuffer, size_t _len) const;
size_t Read(const off_t& _pos, AutoBuffer& _rhs, size_t _len) const;
off_t Move(off_t _move_len);
void Seek(off_t _offset, TSeek _eorigin);
void Length(off_t _pos, size_t _lenght);
void* Ptr(off_t _offset=0);
void* PosPtr();
const void* Ptr(off_t _offset=0) const;
const void* PosPtr() const;
off_t Pos() const;
size_t PosLength() const;
size_t Length() const;
size_t Capacity() const;
void Attach(void* _pbuffer, size_t _len);
void Attach(AutoBuffer& _rhs);
void* Detach(size_t* _plen = NULL);
void Reset();
private:
void __FitSize(size_t _len);
private:
AutoBuffer(const AutoBuffer& _rhs);
AutoBuffer& operator = (const AutoBuffer& _rhs);
private:
unsigned char* parray_;
off_t pos_;
size_t length_;
size_t capacity_;
size_t malloc_unitsize_;
};
extern const AutoBuffer KNullAtuoBuffer;
template <class S> class copy_wrapper_helper;
template <>
class copy_wrapper_helper<AutoBuffer> {
public:
static void copy_constructor(AutoBuffer& _lhs, AutoBuffer& _rhs)
{ _lhs.Attach(_rhs); }
static void copy_constructor(AutoBuffer& _lhs, const AutoBuffer& _rhs)
{ _lhs.Attach(const_cast<AutoBuffer&>(_rhs)); }
static void destructor(AutoBuffer& _delobj) {}
};
#endif //COMM_AUTOBUFFER_H_