mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: support UList[labelRange] and SubList construction with labelRange
This uses a concept similar to what std::valarray and std::slice do.
A labelRange provides a convenient container for holding start/size
and lends itself to addressing 'sliced' views of lists.
For safety, the operations and constructors restricts the given input range
to a valid addressible region of the underlying list, while the labelRange
itself precludes negative sizes.
The SubList version is useful for patches or other things that have a
SubList as its parameter. Otherwise the UList [] operator will be the
more natural solution. The slices can be done with a labelRange, or
a {start,size} pair.
Examples,
labelList list1 = identity(20);
list1[labelRange(18,10)] = -1;
list1[{-20,25}] = -2;
list1[{1000,5}] = -3;
const labelList list2 = identity(20);
list2[{5,10}] = -3; // ERROR: cannot assign to const!
This commit is contained in:
@ -76,7 +76,6 @@ int main(int argc, char *argv[])
|
||||
Info<<"is >>: " << intlist << endl;
|
||||
}
|
||||
|
||||
|
||||
List<vector> list1(IStringStream("1 ((0 1 2))")());
|
||||
Info<< "list1: " << list1 << endl;
|
||||
|
||||
@ -150,7 +149,6 @@ int main(int argc, char *argv[])
|
||||
Info<< "normal: " << longLabelList << nl;
|
||||
Info<< "flatOutput: " << flatOutput(longLabelList) << nl;
|
||||
// Info<< "flatOutput(14): " << flatOutput(longLabelList, 14) << nl;
|
||||
// Info<< "flatOutput(15): " << flatOutput(longLabelList, 15) << nl;
|
||||
|
||||
stringList longStringList(12);
|
||||
forAll(longStringList, i)
|
||||
@ -165,6 +163,66 @@ int main(int argc, char *argv[])
|
||||
// contiguous longStringList[i].resize(3, 'a' + i);
|
||||
}
|
||||
|
||||
// test SubList and labelRange
|
||||
{
|
||||
Info<< nl;
|
||||
labelList longLabelList = identity(25);
|
||||
reverse(longLabelList);
|
||||
|
||||
FixedList<label, 6> fixedLabelList{0,1,2,3,4,5};
|
||||
const labelList constLabelList = identity(25);
|
||||
|
||||
Info<< "full-list: " << flatOutput(longLabelList) << nl;
|
||||
|
||||
labelRange range1(-15, 25);
|
||||
Info<<"sub range:" << range1 << "=";
|
||||
Info<< SubList<label>(longLabelList, range1) << nl;
|
||||
|
||||
labelRange range2(7, 8);
|
||||
Info<<"sub range:" << range2 << "=";
|
||||
Info<< SubList<label>(longLabelList, range2) << nl;
|
||||
|
||||
// labelRange range2(7, 8);
|
||||
Info<<"use range " << range2 << " to set value";
|
||||
SubList<label>(longLabelList, range2) = -15;
|
||||
Info<< "=> " << flatOutput(longLabelList) << nl;
|
||||
|
||||
// This syntax looks even nicer:
|
||||
|
||||
// GOOD: does not compile
|
||||
// > constLabelList[labelRange(23,5)] = 5;
|
||||
|
||||
// Check correct overlaps
|
||||
longLabelList[labelRange(-10, 12)] = 200;
|
||||
longLabelList[{18,3}] = 100;
|
||||
longLabelList[{23,3}] = 400;
|
||||
// and complete misses
|
||||
longLabelList[{500,50}] = 100;
|
||||
|
||||
// labelRange automatically suppresses -ve size -> nop
|
||||
longLabelList[{5,-5}] = 42;
|
||||
longLabelList[{21,100}] = 42;
|
||||
|
||||
//Good: does not compile
|
||||
//> longLabelList[labelRange(20,50)] = constLabelList;
|
||||
|
||||
//Good: does not compile
|
||||
// longLabelList[labelRange(20,50)] = fixedLabelList;
|
||||
|
||||
Info<< "updated: " << constLabelList[labelRange(23,5)] << nl;
|
||||
Info<< "updated: " << flatOutput(longLabelList) << nl;
|
||||
|
||||
//Nope: sort(longLabelList[labelRange(18,5)]);
|
||||
{
|
||||
// Instead
|
||||
UList<label> sub = longLabelList[labelRange(0, 8)];
|
||||
sort(sub);
|
||||
}
|
||||
Info<< "sub-sorted: " << flatOutput(longLabelList) << nl;
|
||||
|
||||
// Info<<"Slice=" << longLabelList[labelRange(23,5)] << nl;
|
||||
}
|
||||
|
||||
wordReList reLst;
|
||||
wordList wLst;
|
||||
stringList sLst;
|
||||
|
||||
Reference in New Issue
Block a user