#pragma once // Keywords #define global static // Global variables #define internal static // Internal linkage #define local_persist static // Local Persisting variables #define api_c extern "C" // Casting #define ccast( type, value ) ( const_cast< type >( (value) ) ) #define pcast( type, value ) ( * reinterpret_cast< type* >( & ( value ) ) ) #define rcast( type, value ) reinterpret_cast< type >( value ) #define scast( type, value ) static_cast< type >( value ) #define do_once() \ do \ { \ local_persist \ bool done = false; \ if ( done ) \ return; \ done = true; \ } \ while(0) #define do_once_start \ do \ { \ local_persist \ bool done = false; \ if ( done ) \ break; \ done = true; #define do_once_end \ } \ while(0); #define array_count( array ) ( sizeof( array ) / sizeof( ( array )[0] ) ) // TODO(Ed) : Move to memory header eventually #define kilobytes( x ) ( ( x ) * ( s64 )( 1024 ) ) #define megabytes( x ) ( kilobytes( x ) * ( s64 )( 1024 ) ) #define gigabytes( x ) ( megabytes( x ) * ( s64 )( 1024 ) ) #define terabytes( x ) ( gigabytes( x ) * ( s64 )( 1024 ) ) // TODO(Ed) : Move to debug header eventually #if Build_Development # define assert( expression ) \ if ( !( expression ) ) \ { \ __debugbreak(); \ } // platform::assertion_failure( __FILE__, __LINE__, #expression ); #else # define assert( expression ) #endif #ifdef COMPILER_CLANG # define compiler_decorated_func_name __PRETTY_NAME__ #elif defined(COMPILER_MSVC) # define compiler_decorated_func_name __FUNCDNAME__ #endif #if Build_Development # define congrats( message ) platform::impl_congrats( message ) # define ensure( condition, message ) platform::impl_ensure( condition, message ) # define fatal( message ) platform::impl_fatal( message ) #else # define congrats( message ) # define ensure( condition, message ) # define fatal( message ) #endif