1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// Common/MyBuffer.h 2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef __COMMON_MY_BUFFER_H 4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#define __COMMON_MY_BUFFER_H 5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "Defs.h" 7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytemplate <class T> class CBuffer 9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky T *_items; 11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky size_t _size; 12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void CopyToEmpty(const CBuffer &buffer) 14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (buffer._size > 0) 16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = new T[buffer._size]; 18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky memcpy(_items, buffer._items, buffer._size * sizeof(T)); 19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = buffer._size; 20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic: 23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void Free() 24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (_items) 26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky delete []_items; 28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = 0; 29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = 0; 31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CBuffer(): _items(0), _size(0) {}; 34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CBuffer(size_t size): _items(0), _size(0) { _items = new T[size]; _size = size; } 35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CBuffer(const CBuffer &buffer): _items(0), _size(0) { CopyToEmpty(buffer); } 36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ~CBuffer() { delete []_items; } 37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky operator T *() { return _items; }; 39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky operator const T *() const { return _items; }; 40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky size_t Size() const { return _size; } 41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void Alloc(size_t size) 43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (size != _size) 45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky Free(); 47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (size != 0) 48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = new T[size]; 50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = size; 51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void AllocAtLeast(size_t size) 56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (size > _size) 58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky Free(); 60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = new T[size]; 61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = size; 62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void CopyFrom(const T *data, size_t size) 66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky Alloc(size); 68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky memcpy(_items, data, size * sizeof(T)); 69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void ChangeSize_KeepData(size_t newSize, size_t keepSize) 72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (newSize == _size) 74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return; 75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky T *newBuffer = NULL; 76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (newSize > 0) 77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky newBuffer = new T[newSize]; 79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (_size > 0) 80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky memcpy(newBuffer, _items, MyMin(MyMin(_size, keepSize), newSize) * sizeof(T)); 81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky delete []_items; 83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = newBuffer; 84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = newSize; 85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CBuffer& operator=(const CBuffer &buffer) 88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky Free(); 90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CopyToEmpty(buffer); 91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return *this; 92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}; 94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytemplate <class T> 96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2) 97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky size_t size1 = b1.Size(); 99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (size1 != b2.Size()) 100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return memcmp(b1, b2, size1 * sizeof(T)) == 0; 102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytemplate <class T> 105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckybool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2) 106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky size_t size1 = b1.Size(); 108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (size1 == b2.Size()) 109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return false; 110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return memcmp(b1, b2, size1 * sizeof(T)) != 0; 111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 112cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CBuffer<char> CCharBuffer; 115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CBuffer<wchar_t> CWCharBuffer; 116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CBuffer<unsigned char> CByteBuffer; 117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytemplate <class T> class CObjArray 120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyprotected: 122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky T *_items; 123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyprivate: 124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // we disable constructors 125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CObjArray(const CObjArray &buffer); 126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void operator=(const CObjArray &buffer); 127cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic: 128cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void Free() 129cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky delete []_items; 131cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = 0; 132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CObjArray(size_t size): _items(0) { if (size != 0) _items = new T[size]; } 134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CObjArray(): _items(0) {}; 135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ~CObjArray() { delete []_items; } 136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky operator T *() { return _items; }; 138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky operator const T *() const { return _items; }; 139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void Alloc(size_t newSize) 141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky delete []_items; 143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = 0; 144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = new T[newSize]; 145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}; 147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 148cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CObjArray<unsigned char> CByteArr; 149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CObjArray<bool> CBoolArr; 150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef CObjArray<int> CIntArr; 151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// #define CRecArray CObjArray 153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytemplate <class T> class CObjArray2 155cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 156cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// protected: 157cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky T *_items; 158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned _size; 159cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 160cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CObjArray2(const CObjArray2 &buffer); 161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void operator=(const CObjArray2 &buffer); 162cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckypublic: 163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 164cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void Free() 165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 166cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky delete []_items; 167cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = 0; 168cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = 0; 169cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CObjArray2(): _items(0), _size(0) {}; 171cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky /* 172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CObjArray2(const CObjArray2 &buffer): _items(0), _size(0) 173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky size_t newSize = buffer._size; 175cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (newSize > 0) 176cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 177cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky T *newBuffer = new T[newSize];; 178cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = newBuffer; 179cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = newSize; 180cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky const T *src = buffer; 181cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (size_t i = 0; i < newSize; i++) 182cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky newBuffer[i] = src[i]; 183cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky */ 186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky /* 187cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CObjArray2(size_t size): _items(0), _size(0) 188cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 189cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (size != 0) 190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = new T[size]; 192cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = size; 193cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 195cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky */ 196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ~CObjArray2() { delete []_items; } 198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 199cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky operator T *() { return _items; }; 200cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky operator const T *() const { return _items; }; 201cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 202cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned Size() const { return (unsigned)_size; } 203cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky bool IsEmpty() const { return _size == 0; } 204cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 205cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // SetSize doesn't keep old items. It allocates new array if size is not equal 206cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky void SetSize(unsigned size) 207cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 208cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (size == _size) 209cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return; 210cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky T *newBuffer = NULL; 211cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (size > 0) 212cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky newBuffer = new T[size]; 213cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky delete []_items; 214cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = newBuffer; 215cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = size; 216cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 217cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 218cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky /* 219cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CObjArray2& operator=(const CObjArray2 &buffer) 220cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 221cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky Free(); 222cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky size_t newSize = buffer._size; 223cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (newSize > 0) 224cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 225cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky T *newBuffer = new T[newSize];; 226cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _items = newBuffer; 227cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _size = newSize; 228cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky const T *src = buffer; 229cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (size_t i = 0; i < newSize; i++) 230cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky newBuffer[i] = src[i]; 231cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 232cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return *this; 233cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 234cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky */ 235cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}; 236cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 237cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 238