00001 #ifndef PHX_BUFFER_H
00002 #define PHX_BUFFER_H
00003
00004 #include <vector>
00005 #include <Phx/Util/PhxPtr.h>
00006 #include <Phx/Util/PhxPtrInterface.h>
00007
00015 namespace Phx {
00016
00024 template <typename T>
00025 class Buffer : public LockedPtrInterface<Buffer<T> > {
00026 public:
00027
00031 Buffer(const T* data, uint32_t size) : mBuffer(0), mSize(0) {
00032 buffer(data, size);
00033 }
00034
00038 Buffer(const std::vector<T>& array) : mBuffer(0), mSize(0) {
00039 buffer(0, array.size());
00040 uint32_t i = 0;
00041 for (typename std::vector<T>::const_iterator itr = array.begin();
00042 itr != array.end(); ++itr) {
00043 mBuffer[i++] = *itr;
00044 }
00045 }
00046
00057 Buffer(uint32_t size = 0) : mBuffer(0), mSize(0) {
00058 buffer(0, size);
00059 }
00060
00061 uint32_t size() const { return mSize; }
00062
00073 void size(uint32_t len) { resize(len, true); }
00074
00075 T* buffer() { return mBuffer; }
00076 const T* buffer() const { return mBuffer; }
00077
00092 void buffer(const T* buffer, uint32_t len) {
00093 resize(len, false);
00094 if (buffer) {
00095 for (uint32_t i = 0; i < len; i++) {
00096 mBuffer[i] = buffer[i];
00097 }
00098 }
00099 }
00100
00101 private:
00102 void resize(uint32_t size, bool copyOld) {
00103 if (size == 0) {
00104 delete[] mBuffer;
00105 mBuffer = 0;
00106 mSize = 0;
00107 } else if (size != mSize) {
00108
00109 T* newBuffer = new T[size];
00110
00111 if (copyOld && mBuffer) {
00112 try {
00113 for (uint32_t i = 0; i < size && i < mSize; i++) {
00114 newBuffer[i] = mBuffer[i];
00115 }
00116 } catch(...) {
00117 delete[] newBuffer;
00118 throw ;
00119 }
00120 }
00121
00122
00123 delete[] mBuffer;
00124 mBuffer = newBuffer;
00125 mSize = size;
00126 }
00127 }
00128
00129
00130
00131 T* mBuffer;
00132 uint32_t mSize;
00133 };
00134
00135 };
00136
00137 #endif