ListOps.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
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
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
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.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "ListOps.H"
27 
28 
29 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
30 
31 const Foam::labelList Foam::emptyLabelList = Foam::labelList(0);
32 
33 
34 // * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
35 
37 (
38  const label len,
39  const labelUList& map
40 )
41 {
42  labelList inverse(len, -1);
43 
44  forAll(map, i)
45  {
46  label newPos = map[i];
47 
48  if (newPos >= 0)
49  {
50  if (inverse[newPos] >= 0)
51  {
52  FatalErrorIn("invert(const label, const labelUList&)")
53  << "Map is not one-to-one. At index " << i
54  << " element " << newPos << " has already occurred before"
55  << nl << "Please use invertOneToMany instead"
56  << abort(FatalError);
57  }
58 
59  inverse[newPos] = i;
60  }
61  }
62  return inverse;
63 }
64 
65 
67 (
68  const label len,
69  const labelUList& map
70 )
71 {
72  labelList nElems(len, 0);
73 
74  forAll(map, i)
75  {
76  if (map[i] >= 0)
77  {
78  nElems[map[i]]++;
79  }
80  }
81 
82  labelListList inverse(len);
83 
84  forAll(nElems, i)
85  {
86  inverse[i].setSize(nElems[i]);
87  nElems[i] = 0;
88  }
89 
90  forAll(map, i)
91  {
92  label newI = map[i];
93 
94  if (newI >= 0)
95  {
96  inverse[newI][nElems[newI]++] = i;
97  }
98  }
99 
100  return inverse;
101 }
102 
103 
105 {
106  labelList map(len);
107 
108  forAll(map, i)
109  {
110  map[i] = i;
111  }
112  return map;
113 }
114 
115 
116 // ************************************************************************* //
labelListList invertOneToMany(const label len, const labelUList &)
Invert one-to-many map. Unmapped elements will be size 0.
Definition: ListOps.C:67
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
Various functions to operate on Lists.
static const char nl
Definition: Ostream.H:260
void setSize(const label)
Reset size of List.
Definition: List.C:318
#define forAll(list, i)
Definition: UList.H:421
labelList identity(const label len)
Create identity map (map[i] == i) of given length.
Definition: ListOps.C:104
errorManip< error > abort(error &err)
Definition: errorManip.H:131
#define FatalErrorIn(functionName)
Report an error message using Foam::FatalError.
Definition: error.H:314
labelList invert(const label len, const labelUList &)
Invert one-to-one map. Unmapped elements will be -1.
Definition: ListOps.C:37
error FatalError
List< label > labelList
A List of labels.
Definition: labelList.H:56
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
Definition: HashTable.H:60