rlm@0: // Sets up common environment for Shay Green's libraries. rlm@0: // To change configuration options, modify blargg_config.h, not this file. rlm@0: rlm@0: // snes_spc 0.9.0 rlm@0: #ifndef BLARGG_COMMON_H rlm@0: #define BLARGG_COMMON_H rlm@0: rlm@0: #include rlm@0: #include rlm@0: #include rlm@0: #include rlm@0: rlm@0: #undef BLARGG_COMMON_H rlm@0: // allow blargg_config.h to #include blargg_common.h rlm@0: #include "blargg_config.h" rlm@0: #ifndef BLARGG_COMMON_H rlm@0: #define BLARGG_COMMON_H rlm@0: rlm@0: // BLARGG_RESTRICT: equivalent to restrict, where supported rlm@0: #if defined (__GNUC__) || _MSC_VER >= 1100 rlm@0: #define BLARGG_RESTRICT __restrict rlm@0: #else rlm@0: #define BLARGG_RESTRICT rlm@0: #endif rlm@0: rlm@0: // STATIC_CAST(T,expr): Used in place of static_cast (expr) rlm@0: #ifndef STATIC_CAST rlm@0: #define STATIC_CAST(T,expr) ((T) (expr)) rlm@0: #endif rlm@0: rlm@0: // blargg_err_t (0 on success, otherwise error string) rlm@0: #ifndef blargg_err_t rlm@0: typedef const char* blargg_err_t; rlm@0: #endif rlm@0: rlm@0: // blargg_vector - very lightweight vector of POD types (no constructor/destructor) rlm@0: template rlm@0: class blargg_vector { rlm@0: T* begin_; rlm@0: size_t size_; rlm@0: public: rlm@0: blargg_vector() : begin_( 0 ), size_( 0 ) { } rlm@0: ~blargg_vector() { free( begin_ ); } rlm@0: size_t size() const { return size_; } rlm@0: T* begin() const { return begin_; } rlm@0: T* end() const { return begin_ + size_; } rlm@0: blargg_err_t resize( size_t n ) rlm@0: { rlm@0: // TODO: blargg_common.cpp to hold this as an outline function, ugh rlm@0: void* p = realloc( begin_, n * sizeof (T) ); rlm@0: if ( p ) rlm@0: begin_ = (T*) p; rlm@0: else if ( n > size_ ) // realloc failure only a problem if expanding rlm@0: return "Out of memory"; rlm@0: size_ = n; rlm@0: return 0; rlm@0: } rlm@0: void clear() { void* p = begin_; begin_ = 0; size_ = 0; free( p ); } rlm@0: T& operator [] ( size_t n ) const rlm@0: { rlm@0: assert( n <= size_ ); // <= to allow past-the-end value rlm@0: return begin_ [n]; rlm@0: } rlm@0: }; rlm@0: rlm@0: #ifndef BLARGG_DISABLE_NOTHROW rlm@0: // throw spec mandatory in ISO C++ if operator new can return NULL rlm@0: #if __cplusplus >= 199711 || defined (__GNUC__) rlm@0: #define BLARGG_THROWS( spec ) throw spec rlm@0: #else rlm@0: #define BLARGG_THROWS( spec ) rlm@0: #endif rlm@0: #define BLARGG_DISABLE_NOTHROW \ rlm@0: void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\ rlm@0: void operator delete ( void* p ) { free( p ); } rlm@0: #define BLARGG_NEW new rlm@0: #else rlm@0: #include rlm@0: #define BLARGG_NEW new (std::nothrow) rlm@0: #endif rlm@0: rlm@0: // BLARGG_4CHAR('a','b','c','d') = 'abcd' (four character integer constant) rlm@0: #define BLARGG_4CHAR( a, b, c, d ) \ rlm@0: ((a&0xFF)*0x1000000L + (b&0xFF)*0x10000L + (c&0xFF)*0x100L + (d&0xFF)) rlm@0: rlm@0: // BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0. rlm@0: #ifndef BOOST_STATIC_ASSERT rlm@0: #ifdef _MSC_VER rlm@0: // MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified rlm@0: #define BOOST_STATIC_ASSERT( expr ) \ rlm@0: void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] ) rlm@0: #else rlm@0: // Some other compilers fail when declaring same function multiple times in class, rlm@0: // so differentiate them by line rlm@0: #define BOOST_STATIC_ASSERT( expr ) \ rlm@0: void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] ) rlm@0: #endif rlm@0: #endif rlm@0: rlm@0: // BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1, rlm@0: // compiler is assumed to support bool. If undefined, availability is determined. rlm@0: #ifndef BLARGG_COMPILER_HAS_BOOL rlm@0: #if defined (__MWERKS__) rlm@0: #if !__option(bool) rlm@0: #define BLARGG_COMPILER_HAS_BOOL 0 rlm@0: #endif rlm@0: #elif defined (_MSC_VER) rlm@0: #if _MSC_VER < 1100 rlm@0: #define BLARGG_COMPILER_HAS_BOOL 0 rlm@0: #endif rlm@0: #elif defined (__GNUC__) rlm@0: // supports bool rlm@0: #elif __cplusplus < 199711 rlm@0: #define BLARGG_COMPILER_HAS_BOOL 0 rlm@0: #endif rlm@0: #endif rlm@0: #if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL rlm@0: // If you get errors here, modify your blargg_config.h file rlm@0: typedef int bool; rlm@0: const bool true = 1; rlm@0: const bool false = 0; rlm@0: #endif rlm@0: rlm@0: // blargg_long/blargg_ulong = at least 32 bits, int if it's big enough rlm@0: rlm@0: #if INT_MAX < 0x7FFFFFFF || LONG_MAX == 0x7FFFFFFF rlm@0: typedef long blargg_long; rlm@0: #else rlm@0: typedef int blargg_long; rlm@0: #endif rlm@0: rlm@0: #if UINT_MAX < 0xFFFFFFFF || ULONG_MAX == 0xFFFFFFFF rlm@0: typedef unsigned long blargg_ulong; rlm@0: #else rlm@0: typedef unsigned blargg_ulong; rlm@0: #endif rlm@0: rlm@0: // BOOST::int8_t etc. rlm@0: rlm@0: // HAVE_STDINT_H: If defined, use for int8_t etc. rlm@0: #if defined (HAVE_STDINT_H) rlm@0: #include rlm@0: #define BOOST rlm@0: rlm@0: // HAVE_INTTYPES_H: If defined, use for int8_t etc. rlm@0: #elif defined (HAVE_INTTYPES_H) rlm@0: #include rlm@0: #define BOOST rlm@0: rlm@0: #else rlm@0: struct BOOST rlm@0: { rlm@0: #if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F rlm@0: typedef signed char int8_t; rlm@0: typedef unsigned char uint8_t; rlm@0: #else rlm@0: // No suitable 8-bit type available rlm@0: typedef struct see_blargg_common_h int8_t; rlm@0: typedef struct see_blargg_common_h uint8_t; rlm@0: #endif rlm@0: rlm@0: #if USHRT_MAX == 0xFFFF rlm@0: typedef short int16_t; rlm@0: typedef unsigned short uint16_t; rlm@0: #else rlm@0: // No suitable 16-bit type available rlm@0: typedef struct see_blargg_common_h int16_t; rlm@0: typedef struct see_blargg_common_h uint16_t; rlm@0: #endif rlm@0: rlm@0: #if ULONG_MAX == 0xFFFFFFFF rlm@0: typedef long int32_t; rlm@0: typedef unsigned long uint32_t; rlm@0: #elif UINT_MAX == 0xFFFFFFFF rlm@0: typedef int int32_t; rlm@0: typedef unsigned int uint32_t; rlm@0: #else rlm@0: // No suitable 32-bit type available rlm@0: typedef struct see_blargg_common_h int32_t; rlm@0: typedef struct see_blargg_common_h uint32_t; rlm@0: #endif rlm@0: }; rlm@0: #endif rlm@0: rlm@0: #endif rlm@0: #endif