Report patch name instead of index in debug
[foam-extend-3.2.git] / src / foam / containers / Lists / PriorityList / PriorityList.H
blob98010378f78c9b4a0039c63b637610c60b1acb15
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend 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 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     PriorityList
27 Description
28     Priority list with changing priorities for inserted elements.
29     List is sorted on access to produce element index with highest weight
31 Author
32     Hrvoje Jasak, Wikki Ltd.  All rights reserved
34 References:
35     R. Sedgewick, "Algorithms", Addison-Wesley, Reading, MA, 2nd edition, 1988.
37 SourceFiles
38     PriorityList.C
40 \*---------------------------------------------------------------------------*/
42 #ifndef PriorityList_H
43 #define PriorityList_H
45 #include "label.H"
47 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
49 namespace Foam
52 /*---------------------------------------------------------------------------*\
53                       Class PriorityList Declaration
54 \*---------------------------------------------------------------------------*/
56 template<class Type>
57 class PriorityList
59     // Private data
61         //- Indices into weights
62         labelList indices_;
64         //- Weights
65         List<Type> weights_;
67         //- Sorted indices
68         labelList sortedIndices_;
70         //- Active size
71         label size_;
73         //- Is the list sorted?
74         mutable bool listSorted_;
77     // Private static functions
79         //- Greater element comparison
80         inline static bool greater(const Type& a, const Type& b)
81         {
82             return a > b;
83         }
86     // Private Member Functions
88         //- Disallow default bitwise copy construct
89         PriorityList(const PriorityList<Type>&);
91         //- Disallow default bitwise assignment
92         void operator=(const PriorityList<Type>&);
95         //- Sort list
96         void sortList();
98         //- Bisection sort
99         void bisectionSort(const label startIndex);
101         //- Sort upwards using bisection with root i
102         void sortUpwards(const label startIndex);
105 public:
107     // Constructors
109         //- Construct given capacity
110         PriorityList(const label capacity);
113     // Destructor - default
116     // Member Functions
118         //- Return size
119         label size() const
120         {
121             return size_;
122         }
124         //- Is the list empty?
125         bool empty() const
126         {
127             return size_ <= 0;
128         }
130         //- Return indices
131         const labelList& indices() const
132         {
133             return indices_;
134         }
136         //- Return weights
137         const List<Type>& weights() const
138         {
139             return weights_;
140         }
143         //- Return index with highest weight and remove
144         label removeHead();
146         //- Set element with weight
147         void set(const label i, const Type& value);
149         //- Update weight
150         void updateWeight(const label i, const Type& newWeight);
154 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
156 } // End namespace Foam
158 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
160 #ifdef NoRepository
161 #   include "PriorityList.C"
162 #endif
164 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
166 #endif
168 // ************************************************************************* //