| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef ARRAY_INCLUDED |
| | #define ARRAY_INCLUDED |
| |
|
| | #include <vector> |
| |
|
| | #define ARRAY_DEBUG 0 |
| | #ifdef _WIN64 |
| | #define ASSERT( x ) { if( !( x ) ) __debugbreak(); } |
| | #else |
| | #ifdef _WIN32 |
| | #define ASSERT( x ) { if( !( x ) ) _asm{ int 0x03 } } |
| | #else |
| | #define ASSERT( x ) { if( !( x ) ) exit(0); } |
| | #endif |
| | #endif |
| |
|
| | |
| | void* aligned_malloc( size_t size , size_t align ) |
| | { |
| | |
| | void* mem = malloc( size + align + sizeof( void* ) ); |
| | |
| | char* amem = ( (char*)mem ) + sizeof( void* ); |
| | |
| | amem = ( char* )( ( (size_t)( ( (char*)amem ) + (align-1) ) ) & ~( align-1 ) ); |
| | |
| | ( ( void** ) amem )[-1] = mem; |
| | return amem; |
| | } |
| | void aligned_free( void* mem ) { free( ( ( void** )mem )[-1] ); } |
| |
|
| | #if ARRAY_DEBUG |
| | #pragma message ( "[WARNING] Array debugging is enabled" ) |
| | #include "Array.inl" |
| | #define Pointer( ... ) Array< __VA_ARGS__ > |
| | #define ConstPointer( ... ) ConstArray< __VA_ARGS__ > |
| | #define NullPointer( ... ) Array< __VA_ARGS__ >() |
| | template< class C > void FreePointer( Array< C >& a ){ a.Free( ); } |
| | template< class C > void AlignedFreePointer( Array< C >& a ){ a.Free( ); } |
| | template< class C > void VFreePointer( Array< C >& a ){ a.Free( ); } |
| | template< class C > void DeletePointer( Array< C >& a ){ a.Delete( ); } |
| |
|
| | template< class C > Array< C > NewPointer( size_t size , const char* name=NULL ){ return Array< C >::New ( size , name ); } |
| | template< class C > Array< C > AllocPointer( size_t size , const char* name=NULL ){ return Array< C >::Alloc ( size , false , name ); } |
| | template< class C > Array< C > AlignedAllocPointer( size_t size , size_t alignment , const char* name=NULL ){ return Array< C >::AlignedAlloc( size , alignment , false , name ); } |
| | template< class C > Array< C > ReAllocPointer( Array< C >& a , size_t size , const char* name=NULL ){ return Array< C >::ReAlloc ( a , size , false , name ); } |
| |
|
| | template< class C > C* PointerAddress( Array< C >& a ) { return a.pointer(); } |
| | template< class C > const C* PointerAddress( ConstArray< C >& a ) { return a.pointer(); } |
| | template< class C > Array< C > GetPointer( C& c ) { return Array< C >::FromPointer( &c , 1 ); } |
| | template< class C > ConstArray< C > GetPointer( const C& c ) { return ConstArray< C >::FromPointer( &c , 1 ); } |
| | template< class C > Array< C > GetPointer( std::vector< C >& v ){ return Array< C >::FromPointer( &v[0] , v.size() ); } |
| | template< class C > ConstArray< C > GetPointer( const std::vector< C >& v ){ return ConstArray< C >::FromPointer( &v[0] , v.size() ); } |
| |
|
| | #else |
| | #define Pointer( ... ) __VA_ARGS__* |
| | #define ConstPointer( ... ) const __VA_ARGS__* |
| | #define NullPointer( ... ) NULL |
| |
|
| | #define FreePointer( ... ) { if( __VA_ARGS__ ) free( __VA_ARGS__ ) , __VA_ARGS__ = NULL; } |
| | #define AlignedFreePointer( ... ) { if( __VA_ARGS__ ) aligned_free( __VA_ARGS__ ) , __VA_ARGS__ = NULL; } |
| | #define DeletePointer( ... ) { if( __VA_ARGS__ ) delete[] __VA_ARGS__ , __VA_ARGS__ = NULL; } |
| |
|
| | template< class C > C* NewPointer( size_t size , const char* name=NULL ){ return new C[size]; } |
| | template< class C > C* AllocPointer( size_t size , const char* name=NULL ){ return (C*) malloc( sizeof(C) * size ); } |
| | template< class C > C* AlignedAllocPointer( size_t size , size_t alignment , const char* name=NULL ){ return (C*)aligned_malloc( sizeof(C) * size , alignment ); } |
| | template< class C > C* ReAllocPointer( C* c , size_t size , const char* name=NULL ){ return (C*) realloc( c , sizeof(C) * size ); } |
| |
|
| | |
| |
|
| | template< class C > C* PointerAddress( C* c ){ return c; } |
| | template< class C > const C* PointerAddress( const C* c ){ return c; } |
| | template< class C > C* GetPointer( C& c ){ return &c; } |
| | template< class C > const C* GetPointer( const C& c ){ return &c; } |
| | template< class C > C* GetPointer( std::vector< C >& v ){ return &v[0]; } |
| | template< class C > const C* GetPointer( const std::vector< C >& v ){ return &v[0]; } |
| | #endif |
| | #endif |
| |
|