/*************************************************************************
 *                                                                       *
 * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
 * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
 *                                                                       *
 * This library is free software; you can redistribute it and/or         *
 * modify it under the terms of EITHER:                                  *
 *   (1) The GNU Lesser General Public License as published by the Free  *
 *       Software Foundation; either version 2.1 of the License, or (at  *
 *       your option) any later version. The text of the GNU Lesser      *
 *       General Public License is included with this library in the     *
 *       file LICENSE.TXT.                                               *
 *   (2) The BSD-style license that is included with this library in     *
 *       the file LICENSE-BSD.TXT.                                       *
 *                                                                       *
 * This library is distributed in the hope that it will be useful,       *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
 * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
 *                                                                       *
 *************************************************************************/

/* per-machine configuration */

#ifndef _ODE_CONFIG_H_
#define _ODE_CONFIG_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <stdarg.h>
#include <malloc.h>		// for alloca under windows
#include <string.h>
#include <math.h>

#if defined(WIN32) && (defined(MSVC) || defined(MINGW))
static union { unsigned char __c[4]; float __f; } __ode_huge_valf =
  {{0,0,0x80,0x7f}};
#define _INFINITY4 (__ode_huge_valf.__f)
static union { unsigned char __c[8]; double __d; } __ode_huge_val =
  {{0,0,0,0,0,0,0xf0,0x7f }};
#define _INFINITY8 (__ode_huge_val.__d)
#else
#define _INFINITY8 HUGE_VAL
#define _INFINITY4 HUGE_VALF
#endif

#if defined(dSINGLE)
#define dInfinity _INFINITY4
#else
#define dInfinity _INFINITY8
#endif

#define SHAREDLIBIMPORT __declspec (dllimport)
#define SHAREDLIBEXPORT __declspec (dllexport)

/* some types. assume `int' >= 32 bits */
typedef unsigned int    uint;
typedef int             int32;
typedef unsigned int    uint32;
typedef short           int16;
typedef unsigned short  uint16;
typedef char            int8;
typedef unsigned char   uint8;


/* an integer type that we can safely cast a pointer to and from without
 * loss of bits.
 */
typedef uint32 intP;


/* if we're compiling on a pentium, we may need to know the clock rate so
 * that the timing function can report accurate times. this number only needs
 * to be set accurately if we're doing performance tests - otherwise just
 * ignore this. i have not worked out how to determine this number
 * automatically yet.
 */

#ifdef PENTIUM
#ifndef PENTIUM_HZ
#define PENTIUM_HZ (496.318983e6)
#endif
#endif


/* the efficient alignment. most platforms align data structures to some
 * number of bytes, but this is not always the most efficient alignment.
 * for example, many x86 compilers align to 4 bytes, but on a pentium it is
 * important to align doubles to 8 byte boundaries (for speed), and the 4
 * floats in a SIMD register to 16 byte boundaries. many other platforms have
 * similar behavior. setting a larger alignment can waste a (very) small
 * amount of memory. NOTE: this number must be a power of two.
 */

#define EFFICIENT_ALIGNMENT 16


/* for unix, define this if your system supports anonymous memory maps
 * (linux does).
 */

#define MMAP_ANONYMOUS


#ifdef __cplusplus
}
#endif

#endif
