Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

PhxBuffer.h

Go to the documentation of this file.
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         // Allocate new buffer and copy old data
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         // reallocation successful -- throw away old buffer and set params.
00123         delete[] mBuffer; // should not throw (destructors).
00124         mBuffer = newBuffer; // doesn't throw.
00125         mSize = size;
00126       }
00127     }
00128 
00129 
00130     // --- private data ---
00131     T* mBuffer;
00132     uint32_t mSize;
00133   };
00134   
00135 }; // namespace Phx
00136 
00137 #endif /* PHX_BUFFER_H */

Generated on Mon Jul 10 19:45:28 2006 for Phoenix OSFS by  doxygen 1.4.2