diff --git a/applications/test/List/ListTest.C b/applications/test/List/ListTest.C index 3f6fcc734c..bc8901b03b 100644 --- a/applications/test/List/ListTest.C +++ b/applications/test/List/ListTest.C @@ -46,7 +46,7 @@ int main(int argc, char *argv[]) List list(IStringStream("1 ((0 1 2))")()); Info<< list << endl; - List list2(IStringStream("((0 1 2) (3 4 5) (3 4 5))")()); + List list2(IStringStream("((0 1 2) (3 4 5) (6 7 8))")()); Info<< list2 << endl; Info<< findIndex(list2, vector(3, 4, 5)) << endl; @@ -59,6 +59,13 @@ int main(int argc, char *argv[]) Info<< list2 << nl << list3 << endl; + + // Subset + const labelList map(IStringStream("2 (0 2)")()); + List subList3(list3, map); + Info<< "Elements " << map << " out of " << list3 + << " : " << subList3 << endl; + return 0; } diff --git a/src/OpenFOAM/containers/Lists/List/List.C b/src/OpenFOAM/containers/Lists/List/List.C index 542f945184..8d694c2fb3 100644 --- a/src/OpenFOAM/containers/Lists/List/List.C +++ b/src/OpenFOAM/containers/Lists/List/List.C @@ -171,6 +171,29 @@ Foam::List::List(List& a, bool reUse) } +// Construct as subset +template +Foam::List::List(const UList& a, const unallocLabelList& map) +: + UList(NULL, map.size()) +{ + if (this->size_) + { + this->v_ = new T[this->size_]; + + List_ACCESS(T, (*this), vp); + List_CONST_ACCESS(T, a, ap); + List_FOR_ALL(map, i) + List_ELEM((*this), vp, i) = List_ELEM(a, ap, (map[i])); + List_END_FOR_ALL + } + else + { + this->v_ = 0; + } +} + + // Construct given start and end iterators. template template diff --git a/src/OpenFOAM/containers/Lists/List/List.H b/src/OpenFOAM/containers/Lists/List/List.H index 0c08eed8fe..cc1aae2796 100644 --- a/src/OpenFOAM/containers/Lists/List/List.H +++ b/src/OpenFOAM/containers/Lists/List/List.H @@ -68,6 +68,7 @@ template class SortableList; template class IndirectList; template class BiIndirectList; +typedef UList