5 * Copyright (C) 2008-2009 Pawel Dziepak
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
29 void *memcpy(void *,const void*,int);
30 void *operator new[](unsigned int, int);
38 static const buffer empty
;
40 buffer() : address((char*)0), size(0) { }
42 buffer(unsigned int bytes
) : address(new char[bytes
]), size(bytes
) { }
44 buffer(void *addr
, unsigned int siz
) : address((char*)addr
), size(siz
) { }
46 buffer(const buffer
&x
) : address(x
.address
), size(x
.size
) { }
48 buffer
&operator=(const buffer
&x
) {
59 char &operator[](int i
) {
60 if (i
>= 0 && i
< size
)
64 const char &operator[](int i
) const {
65 if (i
>= 0 && i
< size
)
69 buffer
&operator+=(const buffer
&x
) {
78 char *buf
= new char[x
.size
+ size
];
79 memcpy(buf
, address
, size
);
80 memcpy((void*)((unsigned int)buf
+ size
), x
.address
, x
.size
);
91 if (size
>= sizeof(T
))
92 return p
<T
>(reinterpret_cast<T
*>(address
));
95 int get_size() const {
99 void *get_address() const {
103 buffer
cut_first(unsigned int cut_size
) const {
104 if (cut_size
>= size
)
107 return buffer(address
+ cut_size
, size
- cut_size
);
111 void *naddr
= (void*)new (al
) char[size
];
112 memcpy(naddr
, (void*)address
, size
);
113 address
= (char*)naddr
;
116 buffer
get_next(unsigned int bytes
) const {
117 bytes
= math::min(bytes
, size
);
122 return buffer(address
, bytes
);
125 buffer
copy() const {
126 buffer
buf(new char[size
], size
);
127 memcpy(buf
.address
, address
, size
);
131 buffer
copy_data(const buffer
&buf
) {
132 memcpy(address
, buf
.address
, math::min(size
, buf
.size
));
136 static buffer
to_mem(p
<T
> addr
) {
137 return buffer((void*)addr
, sizeof(T
));
141 static buffer
to_mem(T
&addr
) {
142 return buffer((void*)&addr
, sizeof(T
));