22 #ifndef _PHANTOM_BUFFER_H
23 #define _PHANTOM_BUFFER_H
37 T*
Read(
unsigned int pos,
unsigned int size);
44 void Touch(
unsigned int pos,
unsigned int size);
51 void Write(
unsigned int pos,
unsigned int size,
const T* data);
55 unsigned int PhantomSize()
const {
return mBuffer.size() - mLogicalSize; }
57 void Resize(
unsigned int size,
59 unsigned int insert_pos);
74 void UpdatePhantom(
unsigned int pos,
unsigned int size);
79 void UpdateBeginning(
unsigned int pos,
unsigned int size);
81 unsigned int AllocatedSize()
const
83 return mBuffer.size();
88 std::vector<T> mBuffer;
89 unsigned mLogicalSize;
103 "PhantomBuffer::UpdatePhantom():"
104 "Requested region falls outside phantom zone");
106 for (s=pos, d=mLogicalSize+pos; s<pos+size; s++, d++)
107 mBuffer[d] = mBuffer[s];
111 void PhantomBuffer<T>::UpdateBeginning(
unsigned int pos,
unsigned int size)
114 "PhantomBuffer::UpdateBeginning():"
115 "Requested region falls outside beginning zone");
117 for (d=pos, s=mLogicalSize+pos; d<size; d++, s++)
118 mBuffer[d] = mBuffer[s];
126 "PhantomBuffer::Resize(): "
127 "Insertion position can not be greater than previous size.");
129 "PhantomBuffer::Resize(): Phantom Size can not be greater than size.");
131 if ( newLogicalSize <= LogicalSize() )
135 "PhantomBuffer::Resize(): PhantomSize can not be decreased.");
137 unsigned int logicalElementsToInsert = newLogicalSize - LogicalSize();
138 unsigned int phantomElementsToInsert = newPhantomSize - PhantomSize();
140 typename std::vector<T>::iterator it = mBuffer.begin();
142 mBuffer.insert(it, logicalElementsToInsert, T());
144 mBuffer.insert( mBuffer.end(), phantomElementsToInsert, T());
147 mLogicalSize = newLogicalSize;
155 "PhantomBuffer::Read(): Position outside bounds");
156 return &mBuffer[pos];
164 "PhantomBuffer::Write(): Position outside bounds");
165 unsigned int writen_area_end = pos+size;
167 if (writen_area_end > mLogicalSize)
169 unsigned int update_start;
170 if (mLogicalSize > pos)
173 update_start = pos-mLogicalSize;
174 UpdateBeginning(update_start, writen_area_end - mLogicalSize - update_start);
176 else if ( pos < PhantomSize() )
179 if (PhantomSize() < writen_area_end )
180 update_end = PhantomSize();
182 update_end = writen_area_end;
183 UpdatePhantom(pos,update_end-pos);
192 "PhantomBuffer::Write(): Position outside bounds");
195 for (s=0, d=pos; s<size; s++, d++)
196 mBuffer[d] = data[s];
205 "PhantomBuffer<T>::FulfilsInvariant(): "
206 "internal vector size unconsistency");
208 "PhantomBuffer<T>::FulfilsInvariant(): "
209 "Phantom size biger than logical size");
211 for (i=0; i<PhantomSize(); i++)
213 "PhantomBuffer<T>::FulfilsInvariant(): "
214 "Phantom data is unconsistent!");