My Project  debian-1:4.1.1-p2+ds-4
imm.h
Go to the documentation of this file.
1 /* emacs edit mode for this file is -*- C++ -*- */
2 
3 /**
4  * @file imm.h
5  *
6  * operations on immediates, that is elements of F_p, GF, Z, Q
7  * that fit into intrinsic int, long
8 **/
9 
10 #ifndef INCL_IMM_H
11 #define INCL_IMM_H
12 
13 #include <stdint.h>
14 
15 // #include "config.h"
16 
17 #ifndef NOSTREAMIO
18 #ifdef HAVE_IOSTREAM
19 #include <iostream>
20 #define OSTREAM std::ostream
21 #elif defined(HAVE_IOSTREAM_H)
22 #include <iostream.h>
23 #define OSTREAM ostream
24 #endif
25 #endif /* NOSTREAMIO */
26 
27 #include "cf_assert.h"
28 
29 #include "cf_defs.h"
30 #include "cf_globals.h"
31 #include "ffops.h"
32 #include "gfops.h"
33 #include "cf_factory.h"
34 #include "canonicalform.h"
35 #include "int_cf.h"
36 
37 const long INTMARK = 1;
38 const long FFMARK = 2;
39 const long GFMARK = 3;
40 
41 /* define type of your compilers 64 bit integer type */
42 #ifndef FACTORY_INT64
43 #if SIZEOF_LONG == 8
44 #define FACTORY_INT64 long int
45 #else
46 #define FACTORY_INT64 long long int
47 #endif
48 #endif
49 
50 #if SIZEOF_LONG == 4
51 const long MINIMMEDIATE = -268435454; // -2^28+2
52 const long MAXIMMEDIATE = 268435454; // 2^28-2
53 #else
54 const long MINIMMEDIATE = -(1L<<60)+2L; // -2^60+2
55 const long MAXIMMEDIATE = (1L<<60)-2L; // 2^60-2
56 #endif
57 
58 #if defined(WINNT) && ! defined(__GNUC__)
59 const FACTORY_INT64 MINIMMEDIATELL = -268435454i64;
60 const FACTORY_INT64 MAXIMMEDIATELL = 268435454i64;
61 #else
62 const FACTORY_INT64 MINIMMEDIATELL = -268435454LL;
63 const FACTORY_INT64 MAXIMMEDIATELL = 268435454LL;
64 #endif
65 
66 //{{{ conversion functions
67 //#ifdef HAS_ARITHMETIC_SHIFT
68 #if 1
69 
70 static inline long imm2int ( const InternalCF * const imm )
71 {
72  return ((intptr_t)imm) >> 2;
73 }
74 
75 static inline InternalCF * int2imm ( long i )
76 {
77  return (InternalCF*)((i << 2) | INTMARK );
78 }
79 
80 #else
81 
82 static inline long imm2int ( const InternalCF * const imm )
83 {
84  // this could be better done by masking the sign bit
85  if ( ((long)(intptr_t)imm)) < 0 )
86  return -((-(long)(intptr_t)imm) >> 2);
87  else
88  return (long)(intptr_t)imm >> 2;
89 }
90 
91 static inline InternalCF * int2imm ( long i )
92 {
93  if ( i < 0 )
94  return (InternalCF*)(-(((-i) << 2) | INTMARK));
95  else
96  return (InternalCF*)((i << 2) | INTMARK );
97 }
98 
99 #endif
100 
101 inline InternalCF * int2imm_p ( long i )
102 {
103  return (InternalCF*)((i << 2) | FFMARK );
104 }
105 
106 inline InternalCF * int2imm_gf ( long i )
107 {
108  return (InternalCF*)((i << 2) | GFMARK );
109 }
110 //}}}
111 
112 // predicates
113 #if 0
114 inline int is_imm ( const InternalCF * const ptr )
115 {
116  // returns 0 if ptr is not immediate
117  return ( (intptr_t)ptr & 3 );
118 }
119 #endif
120 
121 //{{{ inline int imm_isone, imm_isone_p, imm_isone_gf ( const InternalCF * const ptr )
122 // docu: see CanonicalForm::isOne()
123 inline int
124 imm_isone ( const InternalCF * const ptr )
125 {
126  return imm2int( ptr ) == 1;
127 }
128 
129 inline int
130 imm_isone_p ( const InternalCF * const ptr )
131 {
132  return imm2int( ptr ) == 1;
133 }
134 
135 inline int
136 imm_isone_gf ( const InternalCF * const ptr )
137 {
138  return gf_isone( imm2int( ptr ) );
139 }
140 //}}}
141 
142 //{{{ inline int imm_iszero, imm_iszero_p, imm_iszero_gf ( const InternalCF * const ptr )
143 // docu: see CanonicalForm::isZero()
144 inline int
145 imm_iszero ( const InternalCF * const ptr )
146 {
147  return imm2int( ptr ) == 0;
148 }
149 
150 inline int
151 imm_iszero_p ( const InternalCF * const ptr )
152 {
153  return imm2int( ptr ) == 0;
154 }
155 
156 inline int
157 imm_iszero_gf ( const InternalCF * const ptr )
158 {
159  return gf_iszero( imm2int( ptr ) );
160 }
161 //}}}
162 
163 //{{{ conversion functions
164 inline long imm_intval ( const InternalCF* const op )
165 {
166  if ( is_imm( op ) == FFMARK )
168  return ff_symmetric( imm2int( op ) );
169  else
170  return imm2int( op );
171  else if ( is_imm( op ) == GFMARK ) {
172  ASSERT( gf_isff( imm2int( op ) ), "invalid conversion" );
174  return ff_symmetric( gf_gf2ff( imm2int( op ) ) );
175  else
176  return gf_gf2ff( imm2int( op ) );
177  }
178  else
179  return imm2int( op );
180 }
181 //}}}
182 
183 /**
184  *
185  * imm_sign() - return sign of immediate object.
186  *
187  * If CO is an immediate integer, the sign is defined as usual.
188  * If CO is an element of FF(p) and SW_SYMMETRIC_FF is on the
189  * sign of CO is the sign of the symmetric representation of CO.
190  * If CO is in GF(q) or in FF(p) and SW_SYMMETRIC_FF is off, the
191  * sign of CO is zero iff CO is zero, otherwise the sign is one.
192  *
193  * @sa CanonicalForm::sign(), gf_sign()
194  *
195 **/
196 inline int
197 imm_sign ( const InternalCF * const op )
198 {
199  if ( is_imm( op ) == FFMARK )
200  if ( imm2int( op ) == 0 )
201  return 0;
202  else if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
203  if ( ff_symmetric( imm2int( op ) ) > 0 )
204  return 1;
205  else
206  return -1;
207  else
208  return 1;
209  else if ( is_imm( op ) == GFMARK )
210  return gf_sign( imm2int( op ) );
211  else if ( imm2int( op ) == 0 )
212  return 0;
213  else if ( imm2int( op ) > 0 )
214  return 1;
215  else
216  return -1;
217 }
218 
219 /**
220  *
221  * imm_cmp(), imm_cmp_p(), imm_cmp_gf() - compare immediate objects.
222  *
223  * For immediate integers, it is clear how this should be done.
224  * For objects from finite fields, it is not clear since they
225  * are not ordered fields. However, since we want to have a
226  * total well order on polynomials we have to define a total well
227  * order on all coefficients, too. We decided to use simply the
228  * order on the representation as `int's of such objects.
229  *
230  * @sa CanonicalForm::operator <(), CanonicalForm::operator ==()
231  *
232 **/
233 inline int
234 imm_cmp ( const InternalCF * const lhs, const InternalCF * const rhs )
235 {
236  if ( imm2int( lhs ) == imm2int( rhs ) )
237  return 0;
238  else if ( imm2int( lhs ) > imm2int( rhs ) )
239  return 1;
240  else
241  return -1;
242 }
243 
244 inline int
245 imm_cmp_p ( const InternalCF * const lhs, const InternalCF * const rhs )
246 {
247  if ( imm2int( lhs ) == imm2int( rhs ) )
248  return 0;
249  else if ( imm2int( lhs ) > imm2int( rhs ) )
250  return 1;
251  else
252  return -1;
253 }
254 
255 inline int
256 imm_cmp_gf ( const InternalCF * const lhs, const InternalCF * const rhs )
257 {
258  if ( imm2int( lhs ) == imm2int( rhs ) )
259  return 0;
260  // check is done in this way because zero should be minimal
261  else if ( imm2int( lhs ) > imm2int( rhs ) )
262  return -1;
263  else
264  return 1;
265 }
266 //}}}
267 
268 //{{{ arithmetic operators
269 inline InternalCF * imm_add ( const InternalCF * const lhs, const InternalCF * const rhs )
270 {
271  long result = imm2int( lhs ) + imm2int( rhs );
272  if ( ( result > MAXIMMEDIATE ) || ( result < MINIMMEDIATE ) )
273  return CFFactory::basic( result );
274  else
275  return int2imm( result );
276 }
277 
278 inline InternalCF * imm_add_p ( const InternalCF * const lhs, const InternalCF * const rhs )
279 {
280  return int2imm_p( ff_add( imm2int( lhs ), imm2int( rhs ) ) );
281 }
282 
283 inline InternalCF * imm_add_gf ( const InternalCF * const lhs, const InternalCF * const rhs )
284 {
285  return int2imm_gf( gf_add( imm2int( lhs ), imm2int( rhs ) ) );
286 }
287 
288 inline InternalCF * imm_sub ( const InternalCF * const lhs, const InternalCF * const rhs )
289 {
290  long result = imm2int( lhs ) - imm2int( rhs );
291  if ( ( result > MAXIMMEDIATE ) || ( result < MINIMMEDIATE ) )
292  return CFFactory::basic( result );
293  else
294  return int2imm( result );
295 }
296 
297 inline InternalCF * imm_sub_p ( const InternalCF * const lhs, const InternalCF * const rhs )
298 {
299  return int2imm_p( ff_sub( imm2int( lhs ), imm2int( rhs ) ) );
300 }
301 
302 inline InternalCF * imm_sub_gf ( const InternalCF * const lhs, const InternalCF * const rhs )
303 {
304  return int2imm_gf( gf_sub( imm2int( lhs ), imm2int( rhs ) ) );
305 }
306 
307 inline InternalCF *
308 imm_mul ( InternalCF * lhs, InternalCF * rhs )
309 {
310  long a = imm2int( lhs );
311  long b = imm2int( rhs );
312  int sa= 1;
313  unsigned FACTORY_INT64 aa, bb;
314  if (a < 0)
315  {
316  sa= -1;
317  aa= (unsigned FACTORY_INT64) (-a);
318  }
319  else
320  aa= (unsigned FACTORY_INT64) a;
321  if (b < 0)
322  {
323  sa= -sa;
324  bb= (unsigned FACTORY_INT64) (-b);
325  }
326  else
327  bb= (unsigned FACTORY_INT64) b;
328  unsigned FACTORY_INT64 result = aa*bb;
329  #if SIZEOF_LONG == 4
330  if (result>(unsigned FACTORY_INT64)MAXIMMEDIATE)
331  {
333  return res->mulcoeff( rhs );
334  }
335  #else
336  if ( ( a!=0L ) && ((result/aa!=bb) || (result>(unsigned FACTORY_INT64) MAXIMMEDIATE) ))
337  {
339  return res->mulcoeff( rhs );
340  }
341  #endif
342  else
343  return int2imm( sa*result );
344 }
345 
346 inline InternalCF * imm_mul_p ( const InternalCF * const lhs, const InternalCF * const rhs )
347 {
348  return int2imm_p( ff_mul( imm2int( lhs ), imm2int( rhs ) ) );
349 }
350 
351 inline InternalCF * imm_mul_gf ( const InternalCF * const lhs, const InternalCF * const rhs )
352 {
353  return int2imm_gf( gf_mul( imm2int( lhs ), imm2int( rhs ) ) );
354 }
355 
356 inline InternalCF * imm_div ( const InternalCF * const lhs, const InternalCF * const rhs )
357 {
358  long a = imm2int( lhs );
359  long b = imm2int( rhs );
360  if ( a > 0 )
361  return int2imm( a / b );
362  else if ( b > 0 )
363  return int2imm( -((b-a-1)/b) );
364  else
365  return int2imm( (-a-b-1)/(-b) );
366 }
367 
368 inline InternalCF * imm_divrat ( const InternalCF * const lhs, const InternalCF * const rhs )
369 {
371  return CFFactory::rational( imm2int( lhs ), imm2int( rhs ) );
372  else {
373  long a = imm2int( lhs );
374  long b = imm2int( rhs );
375  if ( a > 0 )
376  return int2imm( a / b );
377  else if ( b > 0 )
378  return int2imm( -((b-a-1)/b) );
379  else
380  return int2imm( (-a-b-1)/(-b) );
381  }
382 }
383 
384 inline InternalCF * imm_div_p ( const InternalCF * const lhs, const InternalCF * const rhs )
385 {
386  return int2imm_p( ff_div( imm2int( lhs ), imm2int( rhs ) ) );
387 }
388 
389 inline InternalCF * imm_div_gf ( const InternalCF * const lhs, const InternalCF * const rhs )
390 {
391  return int2imm_gf( gf_div( imm2int( lhs ), imm2int( rhs ) ) );
392 }
393 
394 inline InternalCF * imm_mod ( const InternalCF * const lhs, const InternalCF * const rhs )
395 {
397  return int2imm( 0 );
398  else {
399  long a = imm2int( lhs );
400  long b = imm2int( rhs );
401  if ( a > 0 )
402  if ( b > 0 )
403  return int2imm( a % b );
404  else
405  return int2imm( a % (-b) );
406  else
407  if ( b > 0 ) {
408  long r = (-a) % b;
409  return int2imm( (r==0) ? r : b-r );
410  }
411  else {
412  long r = (-a) % (-b);
413  return int2imm( (r==0) ? r : -b-r );
414  }
415  }
416 }
417 
418 inline InternalCF * imm_mod_p ( const InternalCF * const, const InternalCF * const )
419 {
420  return int2imm_p( 0 );
421 }
422 
423 inline InternalCF * imm_mod_gf ( const InternalCF * const, const InternalCF * const )
424 {
425  return int2imm_gf( gf_q );
426 }
427 
428 inline void imm_divrem ( const InternalCF * const lhs, const InternalCF * const rhs, InternalCF * & q, InternalCF * & r )
429 {
430  if ( cf_glob_switches.isOn( SW_RATIONAL ) ) {
431  q = imm_divrat( lhs, rhs );
432  r = CFFactory::basic( 0L );
433  }
434  else {
435  q = imm_div( lhs, rhs );
436  r = imm_mod( lhs, rhs );
437  }
438 }
439 
440 inline void imm_divrem_p ( const InternalCF * const lhs, const InternalCF * const rhs, InternalCF * & q, InternalCF * & r )
441 {
442  q = int2imm_p( ff_div( imm2int( lhs ), imm2int( rhs ) ) );
443  r = int2imm_p( 0 );
444 }
445 
446 inline void imm_divrem_gf ( const InternalCF * const lhs, const InternalCF * const rhs, InternalCF * & q, InternalCF * & r )
447 {
448  q = int2imm_gf( gf_div( imm2int( lhs ), imm2int( rhs ) ) );
449  r = int2imm_gf( gf_q );
450 }
451 
452 //{{{ inline InternalCF * imm_neg, imm_neg_p, imm_neg_gf ( const InternalCF * const op )
453 // docu: see CanonicalForm::operator -()
454 inline InternalCF *
455 imm_neg ( const InternalCF * const op )
456 {
457  return int2imm( -imm2int( op ) );
458 }
459 
460 inline InternalCF *
461 imm_neg_p ( const InternalCF * const op )
462 {
463  return int2imm_p( ff_neg( imm2int( op ) ) );
464 }
465 
466 inline InternalCF *
467 imm_neg_gf ( const InternalCF * const op )
468 {
469  return int2imm_gf( gf_neg( imm2int( op ) ) );
470 }
471 //}}}
472 //}}}
473 
474 //{{{ input/output
475 #ifndef NOSTREAMIO
476 inline void imm_print ( OSTREAM & os, const InternalCF * const op, const char * const str )
477 {
478  if ( is_imm( op ) == FFMARK )
480  os << ff_symmetric( imm2int( op ) ) << str;
481  else
482  os << imm2int( op ) << str;
483  else if ( is_imm( op ) == GFMARK ) {
484  gf_print( os, imm2int( op ) );
485  os << str;
486  }
487  else
488  os << imm2int( op ) << str;
489 }
490 #endif /* NOSTREAMIO */
491 //}}}
492 
493 #endif /* ! INCL_IMM_H */
ff_add
int ff_add(const int a, const int b)
Definition: ffops.h:107
MINIMMEDIATE
const long MINIMMEDIATE
Definition: imm.h:54
GFMARK
const long GFMARK
Definition: imm.h:39
imm_add_p
InternalCF * imm_add_p(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:278
gf_div
int gf_div(int a, int b)
Definition: gfops.h:185
gf_neg
int gf_neg(int a)
Definition: gfops.h:123
SW_RATIONAL
static const int SW_RATIONAL
set to 1 for computations over Q
Definition: cf_defs.h:28
gf_isone
bool gf_isone(int a)
Definition: gfops.h:53
imm_mod
InternalCF * imm_mod(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:394
OSTREAM
#define OSTREAM
Definition: imm.h:20
imm_mul
InternalCF * imm_mul(InternalCF *lhs, InternalCF *rhs)
Definition: imm.h:308
imm_print
void imm_print(OSTREAM &os, const InternalCF *const op, const char *const str)
Definition: imm.h:476
canonicalform.h
result
return result
Definition: facAbsBiFact.cc:76
imm_mul_gf
InternalCF * imm_mul_gf(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:351
imm_divrem_gf
void imm_divrem_gf(const InternalCF *const lhs, const InternalCF *const rhs, InternalCF *&q, InternalCF *&r)
Definition: imm.h:446
MAXIMMEDIATE
const long MAXIMMEDIATE
Definition: imm.h:55
InternalCF
virtual class for internal CanonicalForm's
Definition: int_cf.h:41
imm_neg_gf
InternalCF * imm_neg_gf(const InternalCF *const op)
Definition: imm.h:467
b
CanonicalForm b
Definition: cfModGcd.cc:4044
imm_neg_p
InternalCF * imm_neg_p(const InternalCF *const op)
Definition: imm.h:461
ff_symmetric
int ff_symmetric(const int a)
Definition: ffops.h:67
gf_sign
int gf_sign(int a)
Definition: gfops.h:113
cf_globals.h
gf_add
int gf_add(int a, int b)
Definition: gfops.h:133
gf_gf2ff
long gf_gf2ff(long a)
Definition: gfops.cc:226
i
int i
Definition: cfEzgcd.cc:125
imm_div_p
InternalCF * imm_div_p(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:384
res
CanonicalForm res
Definition: facAbsFact.cc:64
ASSERT
#define ASSERT(expression, message)
Definition: cf_assert.h:99
INTMARK
const long INTMARK
Definition: imm.h:37
FFMARK
const long FFMARK
Definition: imm.h:38
int2imm
static InternalCF * int2imm(long i)
Definition: imm.h:75
imm_sign
int imm_sign(const InternalCF *const op)
imm_sign() - return sign of immediate object.
Definition: imm.h:197
imm_divrem
void imm_divrem(const InternalCF *const lhs, const InternalCF *const rhs, InternalCF *&q, InternalCF *&r)
Definition: imm.h:428
cf_defs.h
int_cf.h
gf_isff
bool gf_isff(long a)
Definition: gfops.cc:270
imm_cmp_gf
int imm_cmp_gf(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:256
CFFactory::basic
static InternalCF * basic(long value)
Definition: cf_factory.cc:30
gfops.h
imm_isone
int imm_isone(const InternalCF *const ptr)
Definition: imm.h:124
imm_sub_p
InternalCF * imm_sub_p(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:297
imm_add
InternalCF * imm_add(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:269
gf_q
int gf_q
Definition: gfops.cc:47
imm_cmp
int imm_cmp(const InternalCF *const lhs, const InternalCF *const rhs)
imm_cmp(), imm_cmp_p(), imm_cmp_gf() - compare immediate objects.
Definition: imm.h:234
imm_mod_gf
InternalCF * imm_mod_gf(const InternalCF *const, const InternalCF *const)
Definition: imm.h:423
CFFactory::rational
static InternalCF * rational(long num, long den)
Definition: cf_factory.cc:222
imm_iszero_p
int imm_iszero_p(const InternalCF *const ptr)
Definition: imm.h:151
imm_divrem_p
void imm_divrem_p(const InternalCF *const lhs, const InternalCF *const rhs, InternalCF *&q, InternalCF *&r)
Definition: imm.h:440
imm_sub_gf
InternalCF * imm_sub_gf(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:302
gf_iszero
bool gf_iszero(int a)
Definition: gfops.h:43
gf_sub
int gf_sub(int a, int b)
Definition: gfops.h:158
ff_mul
int ff_mul(const int a, const int b)
Definition: ffops.h:149
imm_iszero_gf
int imm_iszero_gf(const InternalCF *const ptr)
Definition: imm.h:157
FACTORY_INT64
#define FACTORY_INT64
Definition: ffops.h:24
imm_mul_p
InternalCF * imm_mul_p(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:346
cf_factory.h
imm_cmp_p
int imm_cmp_p(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:245
MAXIMMEDIATELL
const FACTORY_INT64 MAXIMMEDIATELL
Definition: imm.h:63
imm_divrat
InternalCF * imm_divrat(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:368
MINIMMEDIATELL
const FACTORY_INT64 MINIMMEDIATELL
Definition: imm.h:62
imm2int
static long imm2int(const InternalCF *const imm)
Definition: imm.h:70
imm_iszero
int imm_iszero(const InternalCF *const ptr)
Definition: imm.h:145
is_imm
int is_imm(const InternalCF *const ptr)
Definition: canonicalform.h:62
cf_glob_switches
CFSwitches cf_glob_switches
CFSwitches cf_glob_switches;.
Definition: cf_switches.cc:41
int2imm_p
InternalCF * int2imm_p(long i)
Definition: imm.h:101
imm_add_gf
InternalCF * imm_add_gf(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:283
imm_div
InternalCF * imm_div(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:356
imm_isone_gf
int imm_isone_gf(const InternalCF *const ptr)
Definition: imm.h:136
gf_print
void gf_print(OSTREAM &os, int a)
Definition: gfops.h:207
SW_SYMMETRIC_FF
static const int SW_SYMMETRIC_FF
set to 1 for symmetric representation over F_q
Definition: cf_defs.h:30
gf_mul
int gf_mul(int a, int b)
Definition: gfops.h:163
imm_isone_p
int imm_isone_p(const InternalCF *const ptr)
Definition: imm.h:130
ff_sub
int ff_sub(const int a, const int b)
Definition: ffops.h:122
cf_assert.h
imm_neg
InternalCF * imm_neg(const InternalCF *const op)
Definition: imm.h:455
ff_neg
int ff_neg(const int a)
Definition: ffops.h:136
ff_div
int ff_div(const int a, const int b)
Definition: ffops.h:171
int2imm_gf
InternalCF * int2imm_gf(long i)
Definition: imm.h:106
imm_div_gf
InternalCF * imm_div_gf(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:389
imm_sub
InternalCF * imm_sub(const InternalCF *const lhs, const InternalCF *const rhs)
Definition: imm.h:288
IntegerDomain
#define IntegerDomain
Definition: cf_defs.h:25
imm_mod_p
InternalCF * imm_mod_p(const InternalCF *const, const InternalCF *const)
Definition: imm.h:418
ffops.h
imm_intval
long imm_intval(const InternalCF *const op)
Definition: imm.h:164
CFSwitches::isOn
bool isOn(int s) const
check if 's' is on
Definition: cf_switches.h:55