28 if( (i < 0) || (i >=
rows_.size()) )
32 "void Foam::VRWGraph<T,width>::"
33 "checkIndex(const label i, const label j) const"
34 ) <<
"Row index " << i
35 <<
" is not in range " << 0
42 "void Foam::VRWGraph<T,width>::"
43 "checkIndex(label const, const label) const"
44 ) <<
"Column index " << j
45 <<
" is not in range " << 0
67 for(
label rowI=0;rowI<size;++rowI)
69 rows_[rowI].start() = INVALIDROW;
70 rows_[rowI].size() = NONE;
77 const label nColumnsInRow
80 data_(nRows * nColumnsInRow),
83 for(
label rowI=0;rowI<nRows;++rowI)
85 rows_[rowI].start() = rowI * nColumnsInRow;
86 rows_[rowI].size() = nColumnsInRow;
93 const label nColumnsInRow,
97 data_(nRows * nColumnsInRow, t),
100 for(
label rowI=0;rowI<nRows;++rowI)
102 rows_[rowI].start() = rowI * nColumnsInRow;
103 rows_[rowI].size() = nColumnsInRow;
129 return rows_[rowI].size();
134 if( size > rows_.size() )
138 for(
label i=rows_.size();i<size;++i)
139 rows_.append(rowInfo);
149 const label newNumRows,
153 if( rows_.size() != 0 )
156 "void Foam::VRWGraph::setSizeAndColumnWidth"
157 "(const label size, const label rcWidth)"
158 ) <<
"This function should be used for empty graphs, only!"
161 data_.setSize(newNumRows * rcWidth);
164 rows_.setSize(newNumRows);
167 for(
label i=0;i<newNumRows;++i)
169 rows_[i].start() = start;
171 data_[start] = FREESTART;
177 template<
class ListType>
181 const label nRows = l.size();
182 rows_.setSize(nRows);
185 for(
label rowI=0;rowI<nRows;++rowI)
187 rows_[rowI].size() = l[rowI];
189 if( rows_[rowI].size() != NONE )
191 rows_[rowI].start() = start;
195 rows_[rowI].start() = INVALIDROW;
198 start += rows_[rowI].size();
201 data_.setSize(start);
207 if( (rowI < 0) || (rowI >= rows_.size()) )
210 "void Foam::VRWGraph<T,width>::"
211 "checkIndex(const label rowI, const label size) const"
217 const label start = rows_[rowI].start();
218 if( start == INVALIDROW )
222 rows_[rowI].start() = data_.size();
223 for(
label i=0;i<newSize;++i)
225 rows_[rowI].size() = newSize;
228 else if( newSize > rows_[rowI].size() )
231 bool foundUnused(
true);
233 for(
label i=rows_[rowI].size();i<newSize;++i)
235 const label j = start + i;
237 (j >= data_.size()) ||
238 (data_[j] != FREEENTRY) ||
239 (data_[j] == FREESTART)
250 for(
label i=rows_[rowI].size();i<newSize;++i)
251 data_[start+i] = NONE;
256 rows_[rowI].start() = data_.size();
257 for(
label i=0;i<rows_[rowI].size();++i)
259 data_.append(data_[start+i]);
260 data_[start+i] = FREEENTRY;
262 for(
label i=rows_[rowI].size();i<newSize;++i)
266 rows_[rowI].size() = newSize;
268 else if( newSize < rows_[rowI].size() )
270 for(
label i=newSize;i<rows_[rowI].size();++i)
271 data_[start+i] = FREEENTRY;
272 rows_[rowI].size() = newSize;
274 rows_[rowI].start() = INVALIDROW;
284 template<
class ListType>
297 const label size = l.size();
298 for(
label elI=0;elI<size;++elI)
299 data_.append(l[elI]);
300 rows_.append(rowInfo);
307 if(
re.start() == INVALIDROW )
309 re.start() = data_.size();
315 const label oldStart =
re.start();
316 const label oldSize =
re.size();
319 if( oldStart + oldSize < data_.size() )
322 (data_[oldStart+oldSize] == FREEENTRY) ||
323 (data_[oldStart+oldSize] == FREESTART)
326 data_[oldStart + oldSize] = el;
330 re.start() = data_.size();
331 for(
label i=0;i<oldSize;++i)
333 data_.append(data_[oldStart+i]);
334 data_[oldStart+i] = FREEENTRY;
348 if( !contains(rowI, el) )
352 template<
class ListType>
359 this->setRowSize(rowI, l.size());
360 const label start = rows_[rowI].start();
361 const label size = l.size();
362 for(
label elI=0;elI<size;++elI)
363 data_[start+elI] = l[elI];
369 const label nRows = graphParts[0].
size();
372 if( nRows != graphParts[i].size() )
375 "inline void Foam::VRWGraph::mergeGraphs(const List<VRWGraph>&)"
381 for(
label rowI=0;rowI<nRows;++rowI)
384 for(
label i=0;i<nGraphs;++i)
385 sum += graphParts[i].sizeOfRow(rowI);
387 nElmtsInRow[rowI] =
sum;
390 setSizeAndRowSize(nElmtsInRow);
393 for(
label rowI=0;rowI<nRows;++rowI)
399 this->
operator()(rowI, --nElmtsInRow[rowI]) = gp(rowI, j);
404 template<
class GraphType>
408 const GraphType& origGraph
411 const label origSize = origGraph.size();
414 for(
label rowI=0;rowI<nRows;++rowI)
415 nElmtsInRow[rowI] = 0;
417 for(
label rowI=0;rowI<origSize;++rowI)
419 const label rowSize = origGraph[rowI].
size();
421 for(
label i=0;i<rowSize;++i)
422 ++nElmtsInRow[origGraph[rowI][i]];
425 setSizeAndRowSize(nElmtsInRow);
429 for(
label rowI=0;rowI<origSize;++rowI)
431 const label rowSize = origGraph[rowI].
size();
433 for(
label i=0;i<rowSize;++i)
435 const label el = origGraph[rowI][i];
436 this->operator()(el, nElmtsInRow[el]++) = rowI;
441 template<
class GraphType>
444 const label size = origGraph.size();
447 for(
label rowI=0;rowI<size;++rowI)
449 const label rowSize = origGraph[rowI].size();
450 for(
label i=0;i<rowSize;++i)
455 reverseAddressing(
maxValue, origGraph);
467 for(
label rowI=0;rowI<nRows;++rowI)
468 nElmtsInRow[rowI] = 0;
470 for(
label rowI=0;rowI<origSize;++rowI)
474 for(
label i=0;i<rowSize;++i)
475 ++nElmtsInRow[origGraph(rowI, i)];
478 setSizeAndRowSize(nElmtsInRow);
482 for(
label rowI=0;rowI<origSize;++rowI)
486 for(
label i=0;i<rowSize;++i)
488 const label el = origGraph(rowI, i);
489 this->operator()(el, nElmtsInRow[el]++) = rowI;
499 for(
label rowI=0;rowI<size;++rowI)
502 for(
label i=0;i<rowSize;++i)
507 reverseAddressing(
maxValue, origGraph);
516 const label start = rows_[rowI].start();
517 if( start == INVALIDROW )
519 const label size = rows_[rowI].size();
521 for(
label i=0;i<size;++i)
522 if( data_[start+i] ==
e )
534 const label start = rows_[rowI].start();
535 if( start == INVALIDROW )
538 const label size = rows_[rowI].size();
540 for(
label i=0;i<size;++i)
541 if( data_[start+i] ==
e )
559 return data_[rows_[i].start() + j];
572 return data_[rows_[i].start() + j];
582 return row(*
this, i);
585 inline void Foam::VRWGraph::operator=