22 #ifndef StreamImpl_hxx
23 #define StreamImpl_hxx
43 template<
typename Token,
template <
class>
class DataStructure >
56 Token&
Read(
int physicalIndex,
int size);
62 void RegionHasAdvanced(
Region& region );
64 DataStructure<Token> mDataImpl;
69 template<
typename Token,
template <
class>
class DataStructure >
72 if ( writer.
Size() <= LogicalSize() )
return;
73 int newTokens = writer.
Size() - LogicalSize();
74 for(
int i=0; i<newTokens; i++)
75 mDataImpl.push_back(Token());
78 template<
typename Token,
template <
class>
class DataStructure >
87 template<
typename Token,
template <
class>
class DataStructure >
92 template<
typename Token,
template <
class>
class DataStructure >
95 for(
int i=0; i<writer.
Hop(); i++)
96 mDataImpl.push_back(Token());
98 RegionHasAdvanced( writer );
101 template<
typename Token,
template <
class>
class DataStructure >
105 RegionHasAdvanced( reader);
108 template<
typename Token,
template <
class>
class DataStructure >
111 return operator[](physicalIndex);
114 template<
typename Token,
template <
class>
class DataStructure >
117 CLAM_DEBUG_ASSERT( physicalIndex <
int(mDataImpl.size()),
"StreamImpl operator[] - Index out of bounds" );
118 typename DataStructure<Token>::iterator it;
120 for(i=0, it = mDataImpl.begin(); i<physicalIndex; it++, i++);
124 template<
typename Token,
template <
class>
class DataStructure >
127 return int(mDataImpl.size());
130 template<
typename Token,
template <
class>
class DataStructure >
138 template<
typename Token >
149 Token&
Read(
int physicalIndex,
int size);
159 int ExponentOfClosestGreaterPowerOfTwo(
int newSize);
160 void CommonNewRegionSize(
Region& anyRegion );
161 bool ReaderAffectedByInsertion(
Region & reader,
Region & writer )
const;
162 void UpdateBeginDistanceOfReadingRegions(
Region & writer,
int tokensInserted );
163 void RegionHasAdvanced(
Region& region );
170 template<
typename Token >
173 CLAM_DEBUG_ASSERT( writer.
Size()>0,
"StreamImpl::newWritingRegionSize() - size must be greater than 0" );
175 CommonNewRegionSize( writer );
178 template<
typename Token >
182 CommonNewRegionSize(reader);
185 template<
typename Token >
191 if(anyRegion.
Size()==1)
193 newLogicalSize = anyRegion.
Size();
198 int logicalSizeCandidate = anyRegion.
Size()*2;
199 newLogicalSize = 1 << ExponentOfClosestGreaterPowerOfTwo(logicalSizeCandidate);
200 newPhantomSize = anyRegion.
Size()-1;
207 "must be greater than the older logical size" );
212 int tokensToInsert = newLogicalSize -
LogicalSize();
216 std::max(newPhantomSize,PhantomSize()),
219 UpdateBeginDistanceOfReadingRegions( producer, tokensToInsert );
222 template<
typename Token >
223 bool StreamImpl<Token, PhantomBuffer>::ReaderAffectedByInsertion( Region & reader, Region & writer )
const
228 if (reader.BeginDistance() > writer.BeginDistance())
234 if( reader.BeginDistance()==writer.BeginDistance() && reader.Pos() < writer.Pos() )
239 template<
typename Token >
240 void StreamImpl<Token, PhantomBuffer>::UpdateBeginDistanceOfReadingRegions( Region & writer,
int tokensInserted )
246 for ( actualReader=writer.BeginReaders(); actualReader!=writer.EndReaders(); actualReader++)
247 if( ReaderAffectedByInsertion(**actualReader, writer) )
248 (*actualReader)->BeginDistance( (*actualReader)->BeginDistance() + tokensInserted );
251 template<
typename Token >
252 void StreamImpl<Token, PhantomBuffer>::RegionHasAdvanced( Region& region )
254 region.BeginDistance( region.BeginDistance() + region.Hop());
256 region.BeginDistance( region.BeginDistance() -
LogicalSize());
259 template<
typename Token >
263 RegionHasAdvanced( writer );
266 template<
typename Token >
269 RegionHasAdvanced( reader );
272 template<
typename Token >
275 return *mDataImpl.Read( physicalIndex, size );
278 template<
typename Token >
282 return Read( physicalIndex, 1);
285 template<
typename Token >
288 return mDataImpl.LogicalSize();
291 template<
typename Token >
294 return mDataImpl.PhantomSize();
297 template<
typename Token >
303 template<
typename Token >
306 int newLogicalSize = 1;
308 while( newLogicalSize < newSize )
310 newLogicalSize <<= 1;
318 #endif // StreamImpl_hxx