Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / primitives / ints / label / label.H
blobdcc3e8147ead201e53fea0c92c791dd982cfacd7
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 Typedef
25     Foam::label
27 Description
28     A label is an int/long/long long depending on the range desired.
30     A readLabel function is defined so that label can be constructed from
31     Istream.
33 \*---------------------------------------------------------------------------*/
35 #ifndef label_H
36 #define label_H
38 #include <climits>
39 #include <cstdlib>
41 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
44 #if FOAM_LABEL64
45 #    define FOAM_LABEL_MAX 9000000000000000000
46 #else
47 #    define FOAM_LABEL_MAX 2000000000
48 #endif
51 #if INT_MAX > FOAM_LABEL_MAX
53 // Define label as an int
55 # undef  FOAM_LABEL_MAX
56 # define FOAM_LABEL_MAX INT_MAX
58 # include "int.H"
59 # include "long.H"
60 # include "longLong.H"
62 namespace Foam
64     typedef int label;
66     static const label labelMin = INT_MIN;
67     static const label labelMax = INT_MAX;
69     inline label readLabel(Istream& is)
70     {
71         return readInt(is);
72     }
74 } // End namespace Foam
77 #elif LONG_MAX > FOAM_LABEL_MAX
78 // Define label as a long
80 # undef  FOAM_LABEL_MAX
81 # define FOAM_LABEL_MAX LONG_MAX
83 # include "int.H"
84 # include "long.H"
86 namespace Foam
88     typedef long label;
90     static const label labelMin = LONG_MIN;
91     static const label labelMax = LONG_MAX;
93     inline label readLabel(Istream& is)
94     {
95         return readLong(is);
96     }
98 } // End namespace Foam
101 #elif LLONG_MAX > FOAM_LABEL_MAX
103 // Define label as a long long
105 # undef  FOAM_LABEL_MAX
106 # define FOAM_LABEL_MAX LLONG_MAX
108 # include "int.H"
109 # include "long.H"
110 # include "longLong.H"
112 namespace Foam
114     typedef long long label;
116     static const label labelMin = LLONG_MIN;
117     static const label labelMax = LLONG_MAX;
119     inline label readLabel(Istream& is)
120     {
121         return readLongLong(is);
122     }
124 } // End namespace Foam
126 #else
128 #error "Undefined size for label in label.H"
130 #endif
134 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
136 #include "pTraits.H"
137 #include "direction.H"
139 namespace Foam
142 //- template specialization for pTraits<label>
143 template<>
144 class pTraits<label>
146     label p_;
148 public:
150     //- Component type
151     typedef label cmptType;
153     // Member constants
155         enum
156         {
157             dim = 3,         // Dimensionality of space
158             rank = 0,        // Rank of label is 0
159             nComponents = 1  // Number of components in label is 1
160         };
163     // Static data members
165         static const char* const typeName;
166         static const char* componentNames[];
167         static const label zero;
168         static const label one;
169         static const label min;
170         static const label max;
173     // Constructors
175         //- Construct from label
176         pTraits(const label l)
177         {
178             p_ = l;
179         }
181         //- Construct from Istream
182         pTraits(Istream&);
185     // Member Functions
187         operator label() const
188         {
189             return p_;
190         }
192         operator label&()
193         {
194             return p_;
195         }
199 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
201 //- Raise one label to the power of another
202 label pow(label a, label b);
204 //- Evaluate n! : n <= 12
205 label factorial(label n);
208 #define MAXMIN(retType, type1, type2)              \
209                                                    \
210 inline retType max(const type1 s1, const type2 s2) \
211 {                                                  \
212     return (s1 > s2)? s1: s2;                      \
213 }                                                  \
214                                                    \
215 inline retType min(const type1 s1, const type2 s2) \
216 {                                                  \
217     return (s1 < s2)? s1: s2;                      \
221 MAXMIN(char, char, char)
222 MAXMIN(short, short, short)
223 MAXMIN(int, int, int)
224 MAXMIN(long, long, long)
225 MAXMIN(long long, long long, long long)
227 MAXMIN(unsigned char, unsigned char, unsigned char)
228 MAXMIN(unsigned short, unsigned short, unsigned short)
229 MAXMIN(unsigned int, unsigned int, unsigned int)
230 MAXMIN(unsigned long, unsigned long, unsigned long)
231 MAXMIN(unsigned long long, unsigned long long, unsigned long long)
233 MAXMIN(long, int, long)
234 MAXMIN(long long, int, long long)
235 MAXMIN(long long, long long, int)
237 inline label& setComponent(label& l, const direction)
239     return l;
242 inline label component(const label l, const direction)
244     return l;
247 inline label mag(const label l)
249     return ::abs(l);
252 inline label sign(const label s)
254     return (s >= 0)? 1: -1;
257 inline label pos(const label s)
259     return (s >= 0)? 1: 0;
262 inline label neg(const label s)
264     return (s < 0)? 1: 0;
268 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
270 } // End namespace Foam
272 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
274 #endif
276 // ************************************************************************* //