DGtal 1.3.0
Loading...
Searching...
No Matches
ModuloComputer.ih
1/**
2 * This program is free software: you can redistribute it and/or modify
3 * it under the terms of the GNU Lesser General Public License as
4 * published by the Free Software Foundation, either version 3 of the
5 * License, or (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *
15 **/
16
17/**
18 * @file ModuloComputer.ih
19 * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr )
20 * Laboratoire d'InfoRmatique en Image et Systèmes d'information - LIRIS (CNRS, UMR 5205), CNRS, France
21 *
22 * @date 2010/07/02
23 *
24 * Implementation of inline methods defined in ModuloComputer.h
25 *
26 * This file is part of the DGtal library.
27 */
28
29
30//////////////////////////////////////////////////////////////////////////////
31#include <cstdlib>
32//////////////////////////////////////////////////////////////////////////////
33
34///////////////////////////////////////////////////////////////////////////////
35// IMPLEMENTATION of inline methods.
36///////////////////////////////////////////////////////////////////////////////
37
38///////////////////////////////////////////////////////////////////////////////
39// ----------------------- Standard services ------------------------------
40
41
42/**
43 * Initializes the modulo computer with the value [m].
44 * @param m any non-zero integer.
45 */
46template <typename T>
47inline
48DGtal::ModuloComputer<T>::ModuloComputer( UnsignedIntegerParamType m )
49 : k( m )
50{
51}
52
53///////////////////////////////////////////////////////////////////////////////
54// Interface - public :
55
56
57
58/**
59 * Increment the value [i] modulo.
60 * @param i any value between 0 and [k] (excluded).
61 */
62template <typename T>
63inline
64void
65DGtal::ModuloComputer<T>::increment( UnsignedInteger & i ) const
66{
67 if ( ++i == k ) i = 0;
68}
69
70
71/**
72 * Decrement the value [i] modulo.
73 * @param i any value between 0 and [k] (excluded).
74 */
75template <typename T>
76inline
77void
78DGtal::ModuloComputer<T>::decrement( UnsignedInteger & i ) const
79{
80 if ( i == 0 ) i = k;
81 --i;
82}
83
84
85/**
86 * @param i any value between 0 and [k] (excluded).
87 * @return the incremented value of [i] modulo [k].
88 */
89template <typename T>
90inline
91typename DGtal::ModuloComputer<T>::UnsignedInteger
92DGtal::ModuloComputer<T>::next( UnsignedIntegerParamType i ) const
93{
94
95 return ( (i+1) == k ) ? 0 : (i+1);
96}
97
98
99/**
100 * @param i any value between 0 and [k] (excluded).
101 * @return the decremented value of [i] modulo [k].
102 */
103template <typename T>
104inline
105typename DGtal::ModuloComputer<T>::UnsignedInteger
106DGtal::ModuloComputer<T>::previous( UnsignedIntegerParamType i ) const
107{
108 return ( i == 0 ) ? k - 1 : i - 1;
109}
110
111
112/**
113 * @param i any integer value.
114 * @return the value of [i] modulo [k].
115 */
116template <typename T>
117inline
118typename DGtal::ModuloComputer<T>::UnsignedInteger
119DGtal::ModuloComputer<T>::cast( IntegerParamType i ) const
120{
121 Integer tmp = i;
122 while ( tmp < 0 ) tmp += k;
123 UnsignedInteger ip = (Integer) tmp;
124 while ( ip >= k ) ip -= k;
125 return ip;
126}
127
128
129/**
130 * Less comparator modulo. Be careful, modulo comparisons have no
131 * sense when the absolute difference of the values are around k / 2.
132 *
133 * @param i any value between 0 and [k] (excluded). @param j any
134 * value between 0 and [k] (excluded). @return 'true' if [i] strictly
135 * precedes [j] in a window 'floor([k]/2)'. @see k
136 */
137template <typename T>
138inline
139bool
140DGtal::ModuloComputer<T>::less( UnsignedIntegerParamType i, UnsignedIntegerParamType j ) const
141{
142 Integer d = ( (T) j ) - ( (T) i );
143 if ( d > 0 )
144 return d < (T) ( k / 2 );
145 else
146 return (-d) >= (T) ( k / 2 );
147}
148
149
150/**
151 * Performs j - i modulo, assuming less(i,j) is true.
152 *
153 * @param j any value between 0 and [k] (excluded).
154 * @param i any value between 0 and [k] (excluded).
155 * @return the value j - i, always positive.
156 */
157template <typename T>
158inline
159typename DGtal::ModuloComputer<T>::UnsignedInteger
160DGtal::ModuloComputer<T>::posDiff( UnsignedIntegerParamType j, UnsignedIntegerParamType i ) const
161{
162 return ( i <= j ) ? j - i : j + k - i;
163}
164
165
166
167/**
168 * Writes/Displays the object on an output stream.
169 * @param out the output stream where the object is written.
170 */
171template <typename T>
172inline
173void
174DGtal::ModuloComputer<T>::selfDisplay ( std::ostream & out ) const
175{
176 out << "[ModuloComputer]";
177}
178
179/**
180 * Checks the validity/consistency of the object.
181 * @return 'true' if the object is valid, 'false' otherwise.
182 */
183template <typename T>
184inline
185bool
186DGtal::ModuloComputer<T>::isValid() const
187{
188 return true;
189}
190
191
192