00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022
00023 #ifndef H_SPK_ARRAYBUFFER
00024 #define H_SPK_ARRAYBUFFER
00025
00026 #include "Core/SPK_Buffer.h"
00027
00028 namespace SPK
00029 {
00030 class Group;
00031 template<class T> class ArrayBufferCreator;
00032
00037 template<class T>
00038 class ArrayBuffer : public Buffer
00039 {
00040 friend class ArrayBufferCreator<T>;
00041
00042 public :
00043
00048 T* getData() const;
00049
00054 const size_t getParticleSize() const;
00055
00061 size_t getDataSize() const;
00062
00063 private :
00064
00065 T* data;
00066
00067 size_t particleSize;
00068 size_t dataSize;
00069
00070 ArrayBuffer<T>(size_t nbParticles,size_t particleSize);
00071 ArrayBuffer<T>(const ArrayBuffer<T>& buffer);
00072 virtual ~ArrayBuffer<T>();
00073
00074 virtual void swap(size_t index0,size_t index1);
00075 };
00076
00081 template<class T>
00082 class ArrayBufferCreator : public BufferCreator
00083 {
00084 public :
00085
00090 ArrayBufferCreator<T>(size_t particleSize);
00091
00092 private :
00093
00094 size_t particleSize;
00095
00096 virtual ArrayBuffer<T>* createBuffer(size_t nbParticles,const Group& group) const;
00097 };
00098
00099
00101 typedef ArrayBuffer<float> FloatBuffer;
00103 typedef ArrayBufferCreator<float> FloatBufferCreator;
00104
00105
00106 template<class T>
00107 ArrayBuffer<T>::ArrayBuffer(size_t nbParticles,size_t particleSize) :
00108 Buffer(),
00109 dataSize(nbParticles * particleSize),
00110 particleSize(particleSize)
00111 {
00112 data = new T[dataSize];
00113 }
00114
00115 template<class T>
00116 ArrayBuffer<T>::ArrayBuffer(const ArrayBuffer<T>& buffer) :
00117 Buffer(buffer),
00118 dataSize(buffer.dataSize),
00119 particleSize(buffer.particleSize)
00120 {
00121 data = new T[dataSize];
00122 std::memcpy(data,buffer.data,dataSize * sizeof(T));
00123 }
00124
00125 template<class T>
00126 ArrayBuffer<T>::~ArrayBuffer()
00127 {
00128 delete[] data;
00129 }
00130
00131 template<class T>
00132 inline T* ArrayBuffer<T>::getData() const
00133 {
00134 return data;
00135 }
00136
00137 template<class T>
00138 inline const size_t ArrayBuffer<T>::getParticleSize() const
00139 {
00140 return particleSize;
00141 }
00142
00143 template<class T>
00144 inline size_t ArrayBuffer<T>::getDataSize() const
00145 {
00146 return dataSize;
00147 }
00148
00149 template<class T>
00150 void ArrayBuffer<T>::swap(size_t index0,size_t index1)
00151 {
00152 T* address0 = data + index0 * particleSize;
00153 T* address1 = data + index1 * particleSize;
00154 for (size_t i = 0; i < particleSize; ++i)
00155 std::swap(address0[i],address1[i]);
00156 }
00157
00158 template<class T>
00159 ArrayBufferCreator<T>::ArrayBufferCreator(size_t particleSize) :
00160 BufferCreator(),
00161 particleSize(particleSize)
00162 {}
00163
00164 template<class T>
00165 ArrayBuffer<T>* ArrayBufferCreator<T>::createBuffer(size_t nbParticles,const Group& group) const
00166 {
00167 return new ArrayBuffer<T>(nbParticles,particleSize);
00168 }
00169 }
00170
00171 #endif