initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / src / OpenFOAM / containers / Lists / ListListOps / ListListOps.C
blob3ff3c4f145392e939c75111b233d9caed5711bed
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software; you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation; either version 2 of the License, or (at your
14     option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
29 namespace Foam
32 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
34 template <class AccessType, class T, class AccessOp>
35 AccessType ListListOps::combine(const List<T>& lst, AccessOp aop)
37     label sum = 0;
39     forAll(lst, lstI)
40     {
41         sum += aop(lst[lstI]).size();
42     }
44     AccessType result(sum);
46     label globalElemI = 0;
48     forAll(lst, lstI)
49     {
50         const T& sub = lst[lstI];
52         forAll(aop(sub), elemI)
53         {
54             result[globalElemI++] = aop(sub)[elemI];
55         }
56     }
57     return result;
61 template <class T, class AccessOp>
62 labelList ListListOps::subSizes(const List<T>& lst, AccessOp aop)
64     labelList sizes(lst.size());
66     forAll(lst, lstI)
67     {
68         sizes[lstI] = aop(lst[lstI]).size();
69     }
70     return sizes;
74 template <class AccessType, class T, class AccessOp, class OffsetOp>
75 AccessType ListListOps::combineOffset
77     const List<T>& lst,
78     const labelList& sizes,
79     AccessOp aop,
80     OffsetOp oop
83     label sum = 0;
85     forAll(lst, lstI)
86     {
87         sum += aop(lst[lstI]).size();
88     }
90     AccessType result(sum);
92     label globalElemI = 0;
94     label offset = 0;
96     forAll(lst, lstI)
97     {
98         const T& sub = lst[lstI];
100         forAll(aop(sub), elemI)
101         {
102             result[globalElemI++] = oop(aop(sub)[elemI], offset);
103         }
105         offset += sizes[lstI];
106     }
107     return result;
110 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
112 } // End namespace Foam
115 // ************************************************************************* //