fixed minor bugs which were triggering warnings at compilation (different signedness...
[openjpeg.git] / libopenjpeg / int.h
1 /*
2  * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
3  * Copyright (c) 2002-2007, Professor Benoit Macq
4  * Copyright (c) 2001-2003, David Janssens
5  * Copyright (c) 2002-2003, Yannick Verschueren
6  * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7  * Copyright (c) 2005, Herve Drolon, FreeImage Team
8  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 #ifndef __INT_H
33 #define __INT_H
34 /**
35 @file int.h
36 @brief Implementation of operations on integers (INT)
37
38 The functions in INT.H have for goal to realize operations on integers.
39 */
40 #include "openjpeg.h"
41 #include "opj_includes.h"
42 /** @defgroup INT INT - Implementation of operations on integers */
43 /*@{*/
44
45 /** @name Exported functions (see also openjpeg.h) */
46 /*@{*/
47 /* ----------------------------------------------------------------------- */
48 /**
49 Get the minimum of two integers
50 @return Returns a if a < b else b
51 */
52 static INLINE OPJ_INT32 int_min(OPJ_INT32 a, OPJ_INT32 b) {
53         return a < b ? a : b;
54 }
55
56 /**
57 Get the minimum of two integers
58 @return Returns a if a < b else b
59 */
60 static INLINE OPJ_UINT32 uint_min(OPJ_UINT32 a, OPJ_UINT32 b) {
61         return a < b ? a : b;
62 }
63
64 /**
65 Get the maximum of two integers
66 @return Returns a if a > b else b
67 */
68 static INLINE OPJ_INT32 int_max(OPJ_INT32  a, OPJ_INT32  b) {
69         return (a > b) ? a : b;
70 }
71
72 /**
73 Get the maximum of two integers
74 @return Returns a if a > b else b
75 */
76 static INLINE OPJ_UINT32 uint_max(OPJ_UINT32  a, OPJ_UINT32  b) {
77         return (a > b) ? a : b;
78 }
79 /**
80 Clamp an integer inside an interval
81 @return
82 <ul>
83 <li>Returns a if (min < a < max)
84 <li>Returns max if (a > max)
85 <li>Returns min if (a < min) 
86 </ul>
87 */
88 static INLINE OPJ_INT32  int_clamp(OPJ_INT32  a, OPJ_INT32  min, OPJ_INT32  max) {
89         if (a < min)
90                 return min;
91         if (a > max)
92                 return max;
93         return a;
94 }
95 /**
96 @return Get absolute value of integer
97 */
98 static INLINE OPJ_INT32  int_abs(OPJ_INT32  a) {
99         return a < 0 ? -a : a;
100 }
101 /**
102 Divide an integer and round upwards
103 @return Returns a divided by b
104 */
105 static INLINE OPJ_INT32  int_ceildiv(OPJ_INT32  a, OPJ_INT32  b) {
106         return (a + b - 1) / b;
107 }
108
109 /**
110 Divide an integer and round upwards
111 @return Returns a divided by b
112 */
113 static INLINE OPJ_UINT32  uint_ceildiv(OPJ_UINT32  a, OPJ_UINT32  b) {
114         return (a + b - 1) / b;
115 }
116 /**
117 Divide an integer by a power of 2 and round upwards
118 @return Returns a divided by 2^b
119 */
120 static INLINE OPJ_INT32  int_ceildivpow2(OPJ_INT32  a, OPJ_INT32  b) {
121         return (a + (1 << b) - 1) >> b;
122 }
123 /**
124 Divide an integer by a power of 2 and round downwards
125 @return Returns a divided by 2^b
126 */
127 static INLINE OPJ_INT32  int_floordivpow2(OPJ_INT32  a, OPJ_INT32  b) {
128         return a >> b;
129 }
130 /**
131 Get logarithm of an integer and round downwards
132 @return Returns log2(a)
133 */
134 static INLINE OPJ_INT32  int_floorlog2(OPJ_INT32  a) {
135         OPJ_INT32  l;
136         for (l = 0; a > 1; l++) {
137                 a >>= 1;
138         }
139         return l;
140 }
141
142 /**
143 Get logarithm of an integer and round downwards
144 @return Returns log2(a)
145 */
146 static INLINE OPJ_UINT32  uint_floorlog2(OPJ_UINT32  a) {
147         OPJ_UINT32  l;
148         for (l = 0; a > 1; ++l) 
149         {
150                 a >>= 1;
151         }
152         return l;
153 }
154 /* ----------------------------------------------------------------------- */
155 /*@}*/
156
157 /*@}*/
158
159 #endif