cgal/Core/include/CGAL/CORE/CoreAux.h

183 lines
4.8 KiB
C++

/****************************************************************************
* Core Library Version 1.7, August 2004
* Copyright (c) 1995-2004 Exact Computation Project
* All rights reserved.
*
* This file is part of CORE (http://cs.nyu.edu/exact/core/); you may
* redistribute it under the terms of the Q Public License version 1.0.
* See the file LICENSE.QPL distributed with CORE.
*
* Licensees holding a valid commercial license may use this file in
* accordance with the commercial license agreement provided with the
* software.
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
*
* File: CoreAux.h
* Synopsis:
* Auxilliary functions
*
* Written by
* Chee Yap <yap@cs.nyu.edu>
* Chen Li <chenli@cs.nyu.edu>
* Zilin Du <zilin@cs.nyu.edu>
*
* WWW URL: http://cs.nyu.edu/exact/
* Email: exact@cs.nyu.edu
*
* $URL$
* $Id$
***************************************************************************/
#ifndef _CORE_COREAUX_H_
#define _CORE_COREAUX_H_
#include <iostream>
#include <fstream>
#include "CGAL/CORE/Impl.h"
namespace CORE {
#ifndef LONG_BIT // such as in Linux
#define LONG_BIT (sizeof(long) * 8)
#endif
/// CORE_EPS is unit roundoff for IEEE standard double, i.e., 2^{-53}.
// NOTES:
// (1) CORE_EPS is used in our Floating Point Filter (Filter.h)
// (2) 2^{-53} is called "unit roundoff" and
// is the roundoff error for numbers in the range [1,2).
// "Machine epsilon" is 2*CORE_EPS = 2^{-52}. It is the
// smallest gap between two normal machine numbers --Chee 8/2003
//
// const double eps = (ldexp(1.0, -53)); // fails to link on SunPro
#define CORE_EPS ((1.0/(1<<30))/(1<<23))
//
#define CORE_MACHINE_EPS ((1.0/(1<<30))/(1<<22))
/// relEps is relative error for IEEE standard double, 1+2^{-52}.
const double relEps = (1.0 + std::ldexp(1.0, -52));
/// CORE_DIAGFILE is used for all warning and error messages
extern const char* CORE_DIAGFILE;
/// template function returns the maximum value of two
template <class T>
inline const T& core_max(const T& a, const T& b) {
return ((a > b) ? a : b);
}
/// template function returns the minimum value of two
template <class T>
inline const T& core_min(const T& a, const T& b) {
return ((a < b) ? a : b);
}
/// template function returns the maximum value of three
template <class T>
inline const T& core_max(const T& a, const T& b, const T& c) {
return ((a > b) ? core_max(a, c) : core_max(b, c));
}
/// template function swaps two values
template <class T>
inline void core_swap(T& a, T& b) {
T tmp;
tmp = a;
a = b;
b = tmp;
}
/// template function rotate three values
template <class T>
inline void core_rotate(T& a, T& b, T& c) {
T tmp;
tmp = a;
a = b;
b = c;
c = tmp;
}
/// template function returns the minimum value of three
template <class T>
inline const T& core_min(const T& a, const T& b, const T& c) {
return ((a < b) ? core_min(a, c) : core_min(b, c));
}
/// template function returns the absolute value
template <class T>
inline const T core_abs(const T& a) {
return ((a < T(0)) ? -a : a);
}
/// returns floor log base 2 of abs(x)
/** CONVENTION: lg(0) = -1 */
int flrLg(long x);
/// returns floor log base 2 of unsigned long x
/** CONVENTION: lg(0) = -1 */
int flrLg(unsigned long x);
/// returns ceiling log base 2 of abs(x)
/** CONVENTION: lg(0) = -1 */
int clLg(long x);
/// returns ceiling log base 2 of unsigned long x
/** CONVENTION: lg(0) = -1 */
int clLg(unsigned long x);
/// gcd for machine type long
long gcd(long m, long n);
/// abs for int type
inline int abs(int x) {
return (x>=0) ? x : (-x);
}
/// abs for long type
inline long abs(long x) {
return (x>=0) ? x : (-x);
}
/// sign for int type
inline int sign(int x) {
return (x==0) ? 0 : ((x>0) ? 1 : (-1));
}
/// sign for long type
inline long sign(long x) {
return (x==0) ? 0 : ((x>0) ? 1 : (-1));
}
/// overloaded << to print out std::string
inline std::ostream& operator<< (std::ostream& o, const std::string& s) {
o << s.c_str();
return o;
}
/// implements the "integer mantissa" function
// (See CORE_PATH/progs/ieee/frexp.cpp for details)
double IntMantissa(double d);
/// implements the "integer exponent" function
// (See CORE_PATH/progs/ieee/frexp.cpp for details)
int IntExponent(double d);
/// Writes out an error or warning message in the local file CORE_DIAGFILE
/** If last argument (err) is TRUE, then this is considered an error
* (not just warning). In this case, the message is also printed in
* std::cerr, using std::perror().
* */
void core_error(std::string msg, std::string file, int lineno, bool err);
/// This is for debugging messages
inline void core_debug(std::string msg){
std::cout << __FILE__ << "::" << __LINE__ << ": " << msg
<< std::endl;
}
} //namespace CORE
#endif // _CORE_COREAUX_H_