source: trunk/VUT/GtpVisibilityPreprocessor/src/common.h @ 582

Revision 582, 9.4 KB checked in by mattausch, 18 years ago (diff)

fixed bug in mergueue to find root of merge and sort out doube view cells

Line 
1// ================================================================
2// $Id: common.h,v 1.1 2004/02/16 14:46:00 bittner Exp $
3// ****************************************************************
4//
5/** \file common.h
6Common defines for the ERS system.
7
8This file contains various macros, templates and constants for the ERS system.
9
10@author Jiri Bittner
11*/
12
13#ifndef __COMMON_H
14#define __COMMON_H
15
16
17#include <math.h>
18#include <stdlib.h>
19#include <iostream>
20#include <fstream>
21using namespace std;
22
23#include <limits.h>
24
25
26// This constant should be used for the length of the array char for filenames
27// etc., for example: char filename[MaxStringLength]
28const int MaxStringLength = 256;
29
30#if defined(_MSC_VER)
31#pragma warning(disable:4018)
32#pragma warning(disable:4800)
33//#pragma warning(disable:4244)
34
35typedef unsigned int uint;
36typedef unsigned short ushort;
37typedef unsigned char uchar;
38typedef unsigned long ulong;
39#endif
40
41#if defined(__GNUC__) || defined(_MSC_VER)
42#define DIRCAT '.'
43#endif
44
45#if !defined(__WATCOMC__) && !defined(__CYGWIN32__) && !defined(_MSC_VER)
46#include <values.h>
47#else // __WATCOMC__
48#define M_PI        3.14159265358979323846
49#define MAXFLOAT    3.40282347e+38F
50#endif // __WATCOMC__
51
52// some compilers do not define the bool yet, but it was declared by ANSI
53#if !defined(__WATCOMC__) && !defined(_MSC_VER)
54#if defined (__GNUC__) || (_BOOL)
55//#error "HAS BOOL defined"
56#define HAS_BOOL
57#endif
58#else // __WATCOMC__
59#if  (__WATCOMC__ > 1060)
60//#error "Watcom HAS BOOL defined"
61#define HAS_BOOL
62#endif
63#endif // __WATCOMC__
64
65
66#if defined(__WATCOMC__) || defined(_MSC_VER)
67#define strcasecmp stricmp
68#define strncasecmp strnicmp
69#endif // __WATCOMC__
70
71#ifdef sgi
72#define OUT_BIN_MODE ios::out
73#define IN_BIN_MODE ios::in
74#else // sgi
75#if defined(__WATCOMC__) || defined(_MSC_VER)
76#define OUT_BIN_MODE ios::out | ios::binary
77#define IN_BIN_MODE ios::in | ios::binary
78#else
79#define OUT_BIN_MODE ios::out | ios::bin
80#define IN_BIN_MODE ios::in | ios::bin
81#endif // __WATCOMC_
82#endif // sgi
83
84
85//  #ifndef HAS_BOOL
86//  //enum bool {
87//  //  false = 0,
88//  //  true
89//  //};
90//  #define bool int
91//  #define false 0
92//  #define true  1
93//  #endif // HAS_BOOL
94
95typedef unsigned long dword;
96
97#ifndef NULL
98#define NULL (void *)0
99#endif // NULL
100
101//ostream& operator<<(ostream &s,const BaseC &c);
102
103typedef float Real;
104typedef unsigned char byte;
105
106//#ifndef FALSE
107//#define FALSE 0
108//#define TRUE !0
109//#endif
110
111#ifndef __GNUG__
112// typedef int bool;
113#endif
114
115#ifndef getch
116#define getch() getchar()
117#endif
118
119
120#define TRASH 1.0e-5
121
122#ifndef PI
123#define PI    3.14159265358979323846f
124#endif
125
126#define MIN_FLOAT -1e30f
127#define MAX_FLOAT  1e30f
128
129
130// tolerance value for polygon area
131#define AREA_LIMIT 0.0001f
132
133#ifndef DEL_PTR
134#define DEL_PTR(ptr) do {if (ptr) {        \
135                           delete (ptr);   \
136                                                   (ptr) = 0;}}    \
137                     while (0)
138#endif
139// Clears a container (i.e., a vector of pointers) and deletes the pointers
140#if 0
141#ifndef CLEAR_CONTAINER
142#define CLEAR_CONTAINER(co) do { while (!(co).empty()) {   \
143                                                           DEL_PTR((co).back());     \
144                                                                   (co).pop_back();}}      \
145                                                        while (0)
146#endif
147
148#else
149
150#ifndef CLEAR_CONTAINER
151#define CLEAR_CONTAINER(co) do { for (int _i = 0; _i < (int)(co).size(); ++ _i) { \
152        DEL_PTR((co)[_i]);} \
153        (co).clear(); } \
154while (0)
155#endif
156
157#endif
158
159
160inline
161int signum(const Real a, const Real thresh = TRASH)
162{
163  if (a>thresh)
164    return 1;
165  else
166    if (a<-thresh)
167      return -1;
168  return 0;
169}
170
171inline double Absd(const double a)
172{
173  return (a >= 0.0) ? a : -a;
174}
175
176inline float Abs(const float a)
177{
178  return (a >= 0.0f) ? a : -a;
179}
180
181// =======================================================
182// Comparing things
183//struct Limits {
184//  const Real thresh=TRASH;
185//  const Real small=0.1;
186//};
187
188template <class T>
189bool
190ClipValue(T &v, const T m, const T M)
191{
192  if (v<m) {
193    v = m;
194    return true;
195  }
196  if (v>M) {
197    v = M;
198    return true;
199  }
200
201  return false;
202}
203
204
205inline int eq(Real a, Real b, Real t=TRASH)
206{
207  return Abs(a-b)<t;
208}
209
210inline int leq(Real a,Real b,Real t=TRASH)
211{
212  return a - b < t;
213}
214
215inline int geq(Real a,Real b,Real t=TRASH)
216{
217  return t > b - a;
218}
219
220inline int le(Real a,Real b,Real t=TRASH)
221{
222  return !geq(a,b,t);
223}
224
225inline int ge(Real a,Real b,Real t=TRASH)
226{
227  return !leq(a,b,t);
228}
229
230// ========================================================
231
232// -------------------------------------------------------------------
233// Indents to a given stream by the number of spaces specified.
234// This routine is located in main.cpp, for lack of a better place.
235// -------------------------------------------------------------------
236void indent(ostream &app, int ind);
237
238// ---------------------------------------------------------
239// RandomValue
240//      Returns a random Realing-point value between the two
241//      values.  Range is inclusive; the function should
242//      occasionally return exactly a or b.
243// ---------------------------------------------------------
244inline Real
245RandomValue(Real a, Real b)
246{
247  Real range = (Real) Abs(a - b);
248  return ((Real)rand() / RAND_MAX) * range + ((a < b) ? a : b);
249}
250
251
252
253
254inline Real sqr(Real a)
255{
256  return a*a;
257}
258
259template <class T>
260void Swap(T &a,T &b)
261{
262  T c;                 
263  c = b;
264  b = a;
265  a = c;
266}
267
268template <class T>
269int eq(T &a, T &b, T &c, T &d) {
270  return a == b && c==d && b==c;
271}
272
273template <class T>
274T Min(T a,T b)
275{
276  return a<b ? a : b;
277}
278
279template <class T>
280T Max(T a,T b)
281{
282  return a>b ? a : b;
283}
284
285
286Real Random(Real max);
287int  Random(int max);
288void Randomize();
289void
290Randomize(const unsigned int seed);
291
292
293void GetKey(char *s=NULL);
294
295inline Real Deg2Rad(const Real a)
296{
297   return a*(PI/180.0f);
298}
299
300inline Real Rad2Deg(const Real a) {
301  return a*(180.0f/PI);
302}
303 
304void InitTiming();
305long GetTime();
306long GetRealTime();
307Real TimeDiff(long t1,long t2);
308char *TimeString();
309
310
311// manipulator
312inline ostream &DEBUGINFO( ostream &s ) {
313  return s<<"FILE "<<__FILE__<<",LINE "<<__LINE__<<endl;
314}
315
316#define DINFO __FILE__<<":"<<__LINE__
317
318
319class CGlobals {
320public:
321
322  static int Special;
323
324};
325
326// -------------------------------------------------------------------
327// Limits.
328//  This class encapsulates all the concessions to Realing-point
329//  error made by ray tracers.
330// -------------------------------------------------------------------
331
332class Limits {
333public:
334  // This is the number used to reject too-close intersections.
335  // The default value is 1.0.
336  static Real Threshold;
337
338  // This is a "small" number.  Less than this number is assumed to
339  // be 0, when such things matter.
340  // The default value is 0.1.
341  static Real Small;
342
343  // This is an impractically "large" number, used for intersection
344  // parameters out to infinity (e.g. the span resulting from an
345  // FindAllIntersections operation on a plane).
346  // The default value is 100000.
347  static Real Infinity;
348};
349
350// ---------------------------------------------------------
351// EpsilonEqual(x,y)
352//   Returns if two values are equal or not (by epsilon)
353// ---------------------------------------------------------
354inline int
355EpsilonEqual(const Real &x, const Real &y)
356{
357  return fabs(x-y) < Limits::Small;
358}
359
360// ---------------------------------------------------------
361// EpsilonEqual(x)
362//   Returns if a value is zero (+/- epsilon)
363// ---------------------------------------------------------
364inline int
365EpsilonEqual(const Real &x)
366{
367  return fabs(x) < Limits::Small;
368}
369
370// ---------------------------------------------------------
371// EpsilonEqual(x,y,epsilon)
372//   Returns if two values are equal or not by a given epsilon
373// ---------------------------------------------------------
374inline int
375EpsilonEqual(const Real &x, const Real &y, const Real &epsilon)
376{
377  return fabs(x-y) < epsilon;
378}
379
380// ---------------------------------------------------------
381// InRange
382//      Returns nonzero if min <= candidate <= max.
383// ---------------------------------------------------------
384template<class T>
385inline int
386InRange(T min, T max, T candidate)
387{
388  return (candidate >= min) && (candidate <= max);
389}
390
391// --------------------------------------------------------------
392// string function with new operator
393
394inline char*
395StrDup(char *src) {
396  char *p;
397  for (p = src; *p++; );
398  char *dest = new char[p-src];
399  for ( p = dest;(*p++ = *src++) != 0; );
400  return dest;
401}
402
403
404inline char *
405StrToLower(char *src) {
406  char *p;
407  for (p = src; *p; p++)
408    *p = tolower(*p);
409  return src;
410}
411
412// return l = log2(a) if a is a power of two else -ceillog2(a)
413inline int
414GetLog2(int a)
415{
416  int i, x;
417  i = 0;
418  x = 1;
419
420  while (x < a) {
421    i++;
422    x <<= 1;
423  }
424
425  return (x==a) ? i: -i;
426}
427
428
429// return ceil(log2(a)) even if a is not a power of two
430// Example:
431// GetCeilLog2(15) = 4
432// GetCeilLog2(16) = 4
433// GetCeilLog2(17) = 5
434inline int
435GetCeilLog2(int a)
436{
437  int i, x;
438  if (a < 0)
439    return -1;
440
441  i = 0;
442  x = 1;
443
444  while (x < a) {
445    i++;
446    x <<= 1;
447  }
448
449  return i;
450}
451
452
453char *
454GetAbsPath(char *path);
455
456char *
457strdup(char *a);
458
459bool
460FileExists(char *filename);
461
462#define DEBUG_LEVEL 5
463//#define DEBUG_LEVEL 1000
464//#define DEBUG_LEVEL 50000
465 
466// debug stream
467extern ofstream Debug;
468
469
470bool
471CreateDir(char *dir);
472
473char *
474GetPath(const char *s);
475
476#endif
477
478
479
480
481
482
483
484
485
486
487
Note: See TracBrowser for help on using the repository browser.