avoid new <tab>s fropm emacsens
[olsrd.git] / src / fpm.h
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2008, Sven-Ola Tuecke (sven-ola@gmx.de)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in
14  *   the documentation and/or other materials provided with the
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its
17  *   contributors may be used to endorse or promote products derived
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40
41 #ifndef _FPM_H
42 #define _FPM_H
43
44 #ifdef USE_FPM
45
46 #if 0
47
48 /*
49  * Use this to find implicit number conversions when compiling
50  * Note: comparing pointers is unsigned, so do not use to run.
51  */
52 typedef void *fpm;
53 typedef signed long sfpm;
54 typedef unsigned long ufpm;
55 #define FPM_BIT 12
56
57 #elif 0
58
59 /*
60  * Use this for extra long 64 bit calculations
61  */
62 typedef long long fpm;
63 typedef signed long long sfpm;
64 typedef unsigned long long ufpm;
65 #define FPM_BIT 24
66
67 #else
68
69 /*
70  * The standard math should function with only 32 bits
71  */
72 typedef long fpm;
73 typedef signed long sfpm;
74 typedef unsigned long ufpm;
75 #define FPM_BIT 10
76
77 #endif
78
79 #define FPM_NUM (1 << FPM_BIT)
80 #define FPM_MSK (FPM_NUM - 1)
81 #define FPM_MAX ((sfpm)(~(ufpm)0 >> 1) >> FPM_BIT)
82 #define FPM_MIN ((sfpm)-1 - FPM_MAX)
83 #define FPM_INT_MAX ((sfpm)(~(ufpm)0 >> 1))
84 #define FPM_INT_MIN ((sfpm)-1 - FPM_INT_MAX)
85
86 #define itofpm_def(a) (fpm)((sfpm)((a) << FPM_BIT))
87 #define ftofpm_def(a) (fpm)((sfpm)((a) * FPM_NUM))
88 #define fpmtoi_def(a) (int)((sfpm)(a) >> FPM_BIT)
89 #define fpmtof_def(a) ((float)(sfpm)(a) / FPM_NUM)
90
91 #define fpmadd_def(a, b) (fpm)((sfpm)(a) + (sfpm)(b))
92 #define fpmsub_def(a, b) (fpm)((sfpm)(a) - (sfpm)(b))
93 #define fpmmul_def(a, b) (fpm)(((sfpm)(a) * (sfpm)(b)) >> FPM_BIT)
94 #define fpmdiv_def(a, b) (fpm)(((sfpm)(a) << FPM_BIT) / (sfpm)(b))
95
96 /*
97  * Special: first or second factor is an integer
98  */
99 #define fpmimul_def(a, b) (fpm)((int)(a) * (sfpm)(b))
100 #define fpmmuli_def(a, b) (fpm)((sfpm)(a) * (int)(b))
101
102 /*
103  * Special: divisor is an integer
104  */
105 #define fpmidiv_def(a, b) (fpm)((sfpm)(a) / (int)(b))
106
107 #if 0
108 /*
109  * Special: uses long long for larger numbers, currently unused
110  */
111 #define fpmlmul_def(a, b) (sfpm)(((long long)(a) * (b)) >> FPM_BIT)
112 #define fpmldiv_def(a, b) (sfpm)(((long long)(a) << FPM_BIT) / (b))
113 #endif
114
115 #ifdef NDEBUG
116
117 #define itofpm itofpm_def
118 #define ftofpm ftofpm_def
119 #define fpmtoi fpmtoi_def
120 #define fpmtof fpmtof_def
121
122 #define fpmadd fpmadd_def
123 #define fpmsub fpmsub_def
124 #define fpmmul fpmmul_def
125 #define fpmdiv fpmdiv_def
126 #define fpmimul fpmimul_def
127 #define fpmmuli fpmmuli_def
128 #define fpmidiv fpmidiv_def
129
130 #if 0
131 #define fpmlmul fpmlmul_def
132 #define fpmldiv fpmldiv_def
133 #endif
134
135 #else /* NDEBUG */
136
137 fpm itofpm (int i);
138 fpm ftofpm (float f);
139 int fpmtoi (fpm a);
140 float fpmtof (fpm a);
141
142 fpm fpmadd (fpm a, fpm b);
143 fpm fpmsub (fpm a, fpm b);
144 fpm fpmmul (fpm a, fpm b);
145 fpm fpmdiv (fpm a, fpm b);
146 fpm fpmimul (int a, fpm b);
147 fpm fpmmuli (fpm a, int b);
148 fpm fpmidiv (fpm a, int b);
149
150 #if 0
151 fpm fpmlmul (fpm a, fpm b);
152 fpm fpmldiv (fpm a, fpm b);
153 #endif
154
155 #endif /* NDEBUG */
156
157 #define INFINITE_ETX itofpm(FPM_MAX)
158 #define MIN_LINK_QUALITY ftofpm(0.01)
159 #define ZERO_ETX itofpm(0)
160 #define CEIL_LQDIFF ftofpm(1.1)
161 #define FLOOR_LQDIFF ftofpm(0.9)
162
163 fpm atofpm (const char *);
164 const char *fpmtoa (fpm);
165 const char *etxtoa (fpm);
166
167 #else /* USE_FPM */
168
169 #define INFINITE_ETX ((float)(1 << 30))
170 #define ZERO_ETX 0.0
171 #define MIN_LINK_QUALITY 0.01
172 #define CEIL_LQDIFF 1.1
173 #define FLOOR_LQDIFF 0.9
174
175 float atofpm (const char *);
176 const char *fpmtoa (float);
177 const char *etxtoa (float);
178
179 #endif /* USE_FPM */
180
181 #endif
182
183 /*
184  * Local Variables:
185  * c-basic-offset: 2
186  * indent-tabs-mode: nil
187  * End:
188  */