22 #ifndef __WritingRegion_hxx__
23 #define __WritingRegion_hxx__
33 template<
typename Token,
template <
class>
class DataStructure = PhantomBuffer>
89 void SizeChanged(
const int & newSize);
90 int GetGreatestReaderRegionSize();
95 void CheckRegionsAreEven();
96 void CenterReadingRegions(
int centralIndex );
101 void SyncFollowerRegion();
110 template<
typename Token,
template <
class>
class DataStructure>
113 SizeChanged( Size() );
116 template<
typename Token,
template <
class>
class DataStructure>
120 for(it=BeginReaders(); it!=EndReaders(); it++)
121 (*it)->RemoveProducer();
122 mReadingRegions.clear();
125 template<
typename Token,
template <
class>
class DataStructure>
128 return mReadingRegions.begin();
131 template<
typename Token,
template <
class>
class DataStructure>
134 return mReadingRegions.end();
137 template<
typename Token,
template <
class>
class DataStructure>
140 mReadingRegions.push_back(&reader);
145 template<
typename Token,
template <
class>
class DataStructure>
150 ReadingRegionsIterator it;
151 for(it=BeginReaders(); it!=EndReaders(); it++)
153 if(((*it)->Size())>maxSize)
154 maxSize = (*it)->Size();
160 template<
typename Token,
template <
class>
class DataStructure>
161 void WritingRegion<Token, DataStructure >::CheckRegionsAreEven()
164 CLAM_ASSERT( Size()%2==0,
"WritingRegion::CheckRegionsAreEven - Writer's size must be even for centering." );
166 ReadingRegionsIterator it;
167 for(it=BeginReaders(); it!=EndReaders(); it++)
169 CLAM_ASSERT( (*it)->Size()%2==0,
"WritingRegion::CheckRegionsAreEven - Reader's size must be even for centering.");
174 template<
typename Token,
template <
class>
class DataStructure>
177 for(
int i=0; i<Size(); i++ )
178 operator[](i) = Token();
181 template<
typename Token,
template <
class>
class DataStructure>
184 ReadingRegionsIterator it;
185 for(it=BeginReaders(); it!=EndReaders(); it++)
187 int hopToMove = centralIndex - (*it)->Size()/2;
188 (*it)->Pos( hopToMove );
189 (*it)->BeginDistance( hopToMove );
193 template<
typename Token,
template <
class>
class DataStructure>
196 CheckRegionsAreEven();
197 int centralIndex = GetGreatestReaderRegionSize()/2;
202 int currentHop = Hop();
203 int currentSize = Size();
211 CenterReadingRegions( centralIndex );
221 template<
typename Token,
template <
class>
class DataStructure>
226 mReadingRegions.remove( ®ion );
230 template<
typename Token,
template <
class>
class DataStructure>
236 template<
typename Token,
template <
class>
class DataStructure>
241 for(it=mReadingRegions.begin(); it!=mReadingRegions.end(); it++)
242 if( (*it)->Pos() < result) result = (*it)->Pos();
247 template<
typename Token,
template <
class>
class DataStructure>
250 CLAM_DEBUG_ASSERT( FulfilsInvariant(),
"WritingRegion::canProduce() - fulfils invariant checking failed" );
251 return !mStream.ExistsCircularOverlap( RearmostReadingPos(), Pos()+Size() );
254 template<
typename Token,
template <
class>
class DataStructure>
257 CLAM_DEBUG_ASSERT( CanProduce(),
"WritingRegion::produce() - WritingRegion can't produce" );
260 mStream.WriterHasAdvanced( *
this );
263 template<
typename Token,
template <
class>
class DataStructure>
267 CLAM_DEBUG_ASSERT(0 <= offset && offset < Size(),
"WritingRegion::operator [] - Index out of bounds" );
268 int physicalIndex = BeginDistance() + offset;
271 return mStream.Read(physicalIndex, Size());
272 return mStream[physicalIndex];
275 template<
typename Token,
template <
class>
class DataStructure>
279 for(it=mReadingRegions.begin(); it!=mReadingRegions.end(); it++)
280 if( (*it)->Pos() >= Pos()+Size() )
285 template<
typename Token,
template <
class>
class DataStructure>
288 return mStream.LogicalSize();
291 template<
typename Token,
template <
class>
class DataStructure>
297 template<
typename Token,
template <
class>
class DataStructure>
300 mStream.NewWritingRegionSize( *
this );
303 template<
typename Token,
template <
class>
class DataStructure>
304 void WritingRegion< Token, DataStructure >::SyncFollowerRegion()
306 mFollowerRegion.LinkProducerRegion(*
this);
307 mFollowerRegion.
Size( Size() );
308 mFollowerRegion.Hop( Hop() );
309 mFollowerRegion.LinkAndNotifySizeToStream( Stream() );
311 mFollowerRegion.Pos( Pos() - Hop() );
312 mFollowerRegion.BeginDistance( BeginDistance() - Hop() );
313 if(mFollowerRegion.BeginDistance() < 0 )
314 mFollowerRegion.BeginDistance( mFollowerRegion.BeginDistance() + mStream.LogicalSize() );
317 template<
typename Token,
template <
class>
class DataStructure>
320 SyncFollowerRegion();
321 int physicalIndex = mFollowerRegion.BeginDistance() + offset;
323 return mStream.operator[]( physicalIndex );
328 #endif // __WritingRegion_hxx__