Cleanup unused spell in HandleProcTriggerSpell
[getmangos.git] / src / shared / ByteBuffer.h
blobeff26bfa85f3624c1308667057fbace3b8c46f50
1 /*
2 * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #ifndef _BYTEBUFFER_H
20 #define _BYTEBUFFER_H
22 #include "Common.h"
23 #include "Errors.h"
24 #include "Log.h"
25 #include "Utilities/ByteConverter.h"
27 class ByteBuffer
29 public:
30 const static size_t DEFAULT_SIZE = 0x1000;
32 // constructor
33 ByteBuffer(): _rpos(0), _wpos(0)
35 _storage.reserve(DEFAULT_SIZE);
37 // constructor
38 ByteBuffer(size_t res): _rpos(0), _wpos(0)
40 _storage.reserve(res);
42 // copy constructor
43 ByteBuffer(const ByteBuffer &buf): _rpos(buf._rpos), _wpos(buf._wpos), _storage(buf._storage) { }
45 void clear()
47 _storage.clear();
48 _rpos = _wpos = 0;
51 template <typename T> void append(T value)
53 EndianConvert(value);
54 append((uint8 *)&value, sizeof(value));
57 template <typename T> void put(size_t pos,T value)
59 EndianConvert(value);
60 put(pos,(uint8 *)&value,sizeof(value));
63 ByteBuffer &operator<<(uint8 value)
65 append<uint8>(value);
66 return *this;
68 ByteBuffer &operator<<(uint16 value)
70 append<uint16>(value);
71 return *this;
73 ByteBuffer &operator<<(uint32 value)
75 append<uint32>(value);
76 return *this;
78 ByteBuffer &operator<<(uint64 value)
80 append<uint64>(value);
81 return *this;
84 // signed as in 2e complement
85 ByteBuffer &operator<<(int8 value)
87 append<int8>(value);
88 return *this;
90 ByteBuffer &operator<<(int16 value)
92 append<int16>(value);
93 return *this;
95 ByteBuffer &operator<<(int32 value)
97 append<int32>(value);
98 return *this;
100 ByteBuffer &operator<<(int64 value)
102 append<int64>(value);
103 return *this;
106 // floating points
107 ByteBuffer &operator<<(float value)
109 append<float>(value);
110 return *this;
112 ByteBuffer &operator<<(double value)
114 append<double>(value);
115 return *this;
117 ByteBuffer &operator<<(const std::string &value)
119 append((uint8 const *)value.c_str(), value.length());
120 append((uint8)0);
121 return *this;
123 ByteBuffer &operator<<(const char *str)
125 append((uint8 const *)str, str ? strlen(str) : 0);
126 append((uint8)0);
127 return *this;
130 ByteBuffer &operator>>(bool &value)
132 value = read<char>() > 0 ? true : false;
133 return *this;
136 ByteBuffer &operator>>(uint8 &value)
138 value = read<uint8>();
139 return *this;
141 ByteBuffer &operator>>(uint16 &value)
143 value = read<uint16>();
144 return *this;
146 ByteBuffer &operator>>(uint32 &value)
148 value = read<uint32>();
149 return *this;
151 ByteBuffer &operator>>(uint64 &value)
153 value = read<uint64>();
154 return *this;
157 //signed as in 2e complement
158 ByteBuffer &operator>>(int8 &value)
160 value = read<int8>();
161 return *this;
163 ByteBuffer &operator>>(int16 &value)
165 value = read<int16>();
166 return *this;
168 ByteBuffer &operator>>(int32 &value)
170 value = read<int32>();
171 return *this;
173 ByteBuffer &operator>>(int64 &value)
175 value = read<int64>();
176 return *this;
179 ByteBuffer &operator>>(float &value)
181 value = read<float>();
182 return *this;
184 ByteBuffer &operator>>(double &value)
186 value = read<double>();
187 return *this;
189 ByteBuffer &operator>>(std::string& value)
191 value.clear();
192 while (rpos() < size()) // prevent crash at wrong string format in packet
194 char c=read<char>();
195 if (c==0)
196 break;
197 value+=c;
199 return *this;
202 uint8 operator[](size_t pos) const
204 return read<uint8>(pos);
207 size_t rpos() const { return _rpos; }
209 size_t rpos(size_t rpos_)
211 _rpos = rpos_;
212 return _rpos;
215 size_t wpos() const { return _wpos; }
217 size_t wpos(size_t wpos_)
219 _wpos = wpos_;
220 return _wpos;
223 template <typename T> T read()
225 T r=read<T>(_rpos);
226 _rpos += sizeof(T);
227 return r;
229 template <typename T> T read(size_t pos) const
231 ASSERT(pos + sizeof(T) <= size() || PrintPosError(false,pos,sizeof(T)));
232 T val = *((T const*)&_storage[pos]);
233 EndianConvert(val);
234 return val;
237 void read(uint8 *dest, size_t len)
239 ASSERT(_rpos + len <= size() || PrintPosError(false,_rpos,len));
240 memcpy(dest, &_storage[_rpos], len);
241 _rpos += len;
244 const uint8 *contents() const { return &_storage[0]; }
246 size_t size() const { return _storage.size(); }
247 bool empty() const { return _storage.empty(); }
249 void resize(size_t newsize)
251 _storage.resize(newsize);
252 _rpos = 0;
253 _wpos = size();
255 void reserve(size_t ressize)
257 if (ressize > size()) _storage.reserve(ressize);
260 void append(const std::string& str)
262 append((uint8 const*)str.c_str(),str.size() + 1);
264 void append(const char *src, size_t cnt)
266 return append((const uint8 *)src, cnt);
268 template<class T>
269 void append(const T *src, size_t cnt)
271 return append((const uint8 *)src, cnt*sizeof(T));
273 void append(const uint8 *src, size_t cnt)
275 if (!cnt) return;
277 ASSERT(size() < 10000000);
279 if (_storage.size() < _wpos + cnt)
280 _storage.resize(_wpos + cnt);
281 memcpy(&_storage[_wpos], src, cnt);
282 _wpos += cnt;
284 void append(const ByteBuffer& buffer)
286 if(buffer.size()) append(buffer.contents(),buffer.size());
289 void appendPackGUID(uint64 guid)
291 size_t mask_position = wpos();
292 *this << uint8(0);
293 for(uint8 i = 0; i < 8; i++)
295 if(guid & 0xFF)
297 _storage[mask_position] |= uint8(1<<i);
298 *this << uint8(guid & 0xFF);
301 guid >>= 8;
305 void put(size_t pos, const uint8 *src, size_t cnt)
307 ASSERT(pos + cnt <= size() || PrintPosError(true,pos,cnt));
308 memcpy(&_storage[pos], src, cnt);
310 void print_storage() const
312 if(!sLog.IsOutDebug()) // optimize disabled debug output
313 return;
315 sLog.outDebug("STORAGE_SIZE: %u", size() );
316 for(uint32 i = 0; i < size(); i++)
317 sLog.outDebugInLine("%u - ", read<uint8>(i) );
318 sLog.outDebug(" ");
321 void textlike() const
323 if(!sLog.IsOutDebug()) // optimize disabled debug output
324 return;
326 sLog.outDebug("STORAGE_SIZE: %u", size() );
327 for(uint32 i = 0; i < size(); i++)
328 sLog.outDebugInLine("%c", read<uint8>(i) );
329 sLog.outDebug(" ");
332 void hexlike() const
334 if(!sLog.IsOutDebug()) // optimize disabled debug output
335 return;
337 uint32 j = 1, k = 1;
338 sLog.outDebug("STORAGE_SIZE: %u", size() );
340 if(sLog.IsIncludeTime())
341 sLog.outDebugInLine(" ");
343 for(uint32 i = 0; i < size(); i++)
345 if ((i == (j*8)) && ((i != (k*16))))
347 if (read<uint8>(i) < 0x0F)
349 sLog.outDebugInLine("| 0%X ", read<uint8>(i) );
351 else
353 sLog.outDebugInLine("| %X ", read<uint8>(i) );
355 ++j;
357 else if (i == (k*16))
359 if (read<uint8>(i) < 0x0F)
361 sLog.outDebugInLine("\n");
362 if(sLog.IsIncludeTime())
363 sLog.outDebugInLine(" ");
365 sLog.outDebugInLine("0%X ", read<uint8>(i) );
367 else
369 sLog.outDebugInLine("\n");
370 if(sLog.IsIncludeTime())
371 sLog.outDebugInLine(" ");
373 sLog.outDebugInLine("%X ", read<uint8>(i) );
376 ++k;
377 ++j;
379 else
381 if (read<uint8>(i) < 0x0F)
383 sLog.outDebugInLine("0%X ", read<uint8>(i) );
385 else
387 sLog.outDebugInLine("%X ", read<uint8>(i) );
391 sLog.outDebugInLine("\n");
394 protected:
395 bool PrintPosError(bool add, size_t pos, size_t esize) const
397 sLog.outError("ERROR: Attempt %s in ByteBuffer (pos: %u size: %u) value with size: %u",(add ? "put" : "get"),pos, size(), esize);
399 // assert must fail after function call
400 return false;
403 size_t _rpos, _wpos;
404 std::vector<uint8> _storage;
407 template <typename T> ByteBuffer &operator<<(ByteBuffer &b, std::vector<T> v)
409 b << (uint32)v.size();
410 for (typename std::vector<T>::iterator i = v.begin(); i != v.end(); i++)
412 b << *i;
414 return b;
417 template <typename T> ByteBuffer &operator>>(ByteBuffer &b, std::vector<T> &v)
419 uint32 vsize;
420 b >> vsize;
421 v.clear();
422 while(vsize--)
424 T t;
425 b >> t;
426 v.push_back(t);
428 return b;
431 template <typename T> ByteBuffer &operator<<(ByteBuffer &b, std::list<T> v)
433 b << (uint32)v.size();
434 for (typename std::list<T>::iterator i = v.begin(); i != v.end(); i++)
436 b << *i;
438 return b;
441 template <typename T> ByteBuffer &operator>>(ByteBuffer &b, std::list<T> &v)
443 uint32 vsize;
444 b >> vsize;
445 v.clear();
446 while(vsize--)
448 T t;
449 b >> t;
450 v.push_back(t);
452 return b;
455 template <typename K, typename V> ByteBuffer &operator<<(ByteBuffer &b, std::map<K, V> &m)
457 b << (uint32)m.size();
458 for (typename std::map<K, V>::iterator i = m.begin(); i != m.end(); i++)
460 b << i->first << i->second;
462 return b;
465 template <typename K, typename V> ByteBuffer &operator>>(ByteBuffer &b, std::map<K, V> &m)
467 uint32 msize;
468 b >> msize;
469 m.clear();
470 while(msize--)
472 K k;
473 V v;
474 b >> k >> v;
475 m.insert(make_pair(k, v));
477 return b;
479 #endif