ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/include/dynbuf.h
(Generate patch)

Comparing deliantra/server/include/dynbuf.h (file contents):
Revision 1.25 by root, Thu Oct 15 23:02:28 2009 UTC vs.
Revision 1.28 by root, Mon Nov 9 03:08:24 2009 UTC

26#define DYNBUF_H__ 26#define DYNBUF_H__
27 27
28#include <cstring> 28#include <cstring>
29#include <cassert> 29#include <cassert>
30 30
31#include "compiler.h"
31#include "util.h" 32#include "util.h"
32#include "shstr.h" 33#include "shstr.h"
33 34
34// this is a "buffer" that can grow fast 35// this is a "buffer" that can grow fast
35// and is still somewhat space-efficient. 36// and is still somewhat space-efficient.
55 chunk *first, *last; 56 chunk *first, *last;
56 57
57 void reserve (int size); 58 void reserve (int size);
58 void init (int initial); // allocate sinitial chunk 59 void init (int initial); // allocate sinitial chunk
59 void free (chunk *&chain); // free chain of chunks 60 void free (chunk *&chain); // free chain of chunks
60 char *_linearise (); 61 char *_linearise (int extra = 0);
61 void finalise (); 62 void finalise ();
62 63
63public: 64public:
64 65
65 // initial - the size of the initial chunk to be allocated 66 // initial - the size of the initial chunk to be allocated
89 return first->next ? _linearise () : first->data; 90 return first->next ? _linearise () : first->data;
90 } 91 }
91 92
92 int room () const { return end - ptr; } 93 int room () const { return end - ptr; }
93 94
95 // make sure we have "size" extra room
94 char *force (int size) 96 char *force (int size)
95 { 97 {
96 if (expect_false (ptr + size >= end)) 98 if (expect_false (ptr + size > end))
97 reserve (size); 99 reserve (size);
98 100
101 assume (ptr + size <= end);
102
99 return ptr; 103 return ptr;
100 } 104 }
101 105
106 // allocate size bytes and return pointer to them (caller must force())
102 char *falloc (int size) 107 char *falloc (int size)
103 { 108 {
104 char *res = ptr; 109 char *res = ptr;
105 ptr += size; 110 ptr += size;
106 return res; 111 return res;
107 } 112 }
108 113
114 // allocate size bytes and return pointer to them
109 char *alloc (int size) 115 char *alloc (int size)
110 { 116 {
111 force (size); 117 force (size);
112 return falloc (size); 118 return falloc (size);
113 } 119 }
137 143
138 void add (shstr_tmp s) 144 void add (shstr_tmp s)
139 { 145 {
140 add (s.s, s.length ()); 146 add (s.s, s.length ());
141 } 147 }
148
149 // rather inefficient
150 void splice (int offset, int olen, const char *s, int slen);
151 void splice (int offset, int olen) { splice (offset, olen, "", 0); }
142 152
143 //TODO 153 //TODO
144 //void add_destructive (dynbuf &buf); 154 //void add_destructive (dynbuf &buf);
145 155
146 dynbuf &operator << (char c) { add (c); return *this; } 156 dynbuf &operator << (char c) { add (c); return *this; }
174 dynbuf_text &operator << (sint32 i) { add (sint32 (i)); return *this; } 184 dynbuf_text &operator << (sint32 i) { add (sint32 (i)); return *this; }
175 dynbuf_text &operator << (sint64 i) { add (sint64 (i)); return *this; } 185 dynbuf_text &operator << (sint64 i) { add (sint64 (i)); return *this; }
176 dynbuf_text &operator << (uint32 i) { add (sint64 (i)); return *this; } 186 dynbuf_text &operator << (uint32 i) { add (sint64 (i)); return *this; }
177 dynbuf_text &operator << (uint64 i) { add (sint64 (i)); return *this; } 187 dynbuf_text &operator << (uint64 i) { add (sint64 (i)); return *this; }
178 188
179 void printf (const char *format, ...); 189 void printf (const char *format, ...) attribute ((format (printf, 2, 3)));
180 void vprintf (const char *format, va_list ap); 190 void vprintf (const char *format, va_list ap);
181 191
182 void add_abilities (const char *name, uint32 abilities); 192 void add_abilities (const char *name, uint32 abilities);
183 void add_paths (const char *name, uint32 paths); 193 void add_paths (const char *name, uint32 paths);
194
195 // we need to redefine, to keep the API :/
196 using dynbuf::splice;
197 void splice (int offset, int olen, const char *s)
198 {
199 dynbuf::splice (offset, olen, s, strlen (s));
200 }
184 201
185 // returns the string, linearised and with trailing \0 202 // returns the string, linearised and with trailing \0
186 operator char *(); 203 operator char *();
187}; 204};
188 205

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines