World of Rigid Bodies (WoRB)
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Platform.cpp
Go to the documentation of this file.
00001 /**
00002  *  @file      Platform.cpp
00003  *  @brief     Implementation of platform dependent functions (like Pause()).
00004  *  @author    Mikica Kocic
00005  *  @version   0.2
00006  *  @date      2012-04-29
00007  *  @copyright GNU Public License.
00008  */
00009 
00010 #ifdef MATLAB_MEX_FILE
00011     #include "mex.h"
00012 #endif
00013 
00014 #ifdef _WIN32
00015     #include <Windows.h>
00016     #pragma warning(disable:4996) // vsprintf warning
00017 #else
00018     #include <unistd.h>
00019 #endif
00020 
00021 #include <cstdarg>    // va_list
00022 #include <cstdio>     // vsprintf
00023 #include <cstdlib>    // exit
00024 
00025 namespace WoRB
00026 {
00027     void Pause( unsigned long ms )
00028     {
00029         #ifdef _WIN32
00030             Sleep( ms );
00031         #else
00032             usleep( ms * 1000ul );
00033         #endif
00034     }
00035 
00036     void Printf( const char* format, ... )
00037     {
00038         va_list args;
00039         va_start( args, format );
00040 
00041         char buffer[ 2048 ];
00042         vsprintf( buffer, format, args );
00043 
00044         va_end( args );
00045 
00046         #ifdef MATLAB_MEX_FILE
00047             mexPrintf( "%s", buffer );
00048             // mexEvalString( "drawnow;" ); // = flush
00049         #else
00050             fputs( buffer, stdout );
00051             fflush( stdout );
00052         #endif
00053     }
00054 
00055     void glutForegroundWindow ()
00056     {
00057         #ifdef _WIN32
00058 
00059         HWND hWnd = FindWindow( TEXT("FREEGLUT"), NULL );
00060         if ( hWnd ) {
00061             SetForegroundWindow( hWnd );
00062         }
00063 
00064         #endif
00065     }
00066 
00067     // Handles glut errors.
00068     //
00069     void OnGlutError( const char* format, va_list args )
00070     {
00071         char buffer[ 2048 ];
00072         vsprintf( buffer, format, args );
00073 
00074         Printf( "WoRB: %s\n", buffer );
00075     }
00076 
00077     // Handles glut warnings.
00078     //
00079     void OnGlutWarning( const char* format, va_list args )
00080     {
00081         char buffer[ 2048 ];
00082         vsprintf( buffer, format, args );
00083 
00084         Printf( "WoRB: %s\n", buffer );
00085     }
00086 
00087     // Reports a severe error and quits.
00088     //
00089     void SevereError( const char* errorId, const char* errorMsg, ... )
00090     {
00091         va_list args;
00092         va_start( args, errorMsg );
00093         char buffer[ 1024 ];
00094         vsprintf( buffer, errorMsg, args );
00095         va_end( args );
00096 
00097         #if MATLAB_MEX_FILE
00098             mexErrMsgIdAndTxt( errorId, "%s", buffer );
00099         #else
00100             fputs( errorId, stderr );
00101             fputs( "\n", stderr );
00102             fputs( buffer, stderr );
00103             fflush( stderr );
00104             exit(0);
00105         #endif
00106     }
00107 }
00108 
00109 /////////////////////////////////////////////////////////////////////////////////////////
00110 // Redefinitions of new/delete C++ operators to use MATLAB's mxMalloc/mxFree.
00111 
00112 #ifdef MATLAB_MEX_FILE
00113 
00114     #include <new>
00115 
00116     void* operator new ( size_t size);
00117     void* operator new ( size_t size, const std::nothrow_t& ) throw();
00118     void* operator new[] ( size_t size );
00119     void* operator new[] ( size_t size, const std::nothrow_t& ) throw();
00120     void operator delete ( void* p );
00121     void operator delete[] ( void* p );
00122 
00123     void* operator new( size_t size )
00124     {
00125         void* ptr = mxMalloc( size );
00126         if ( ! ptr ) {
00127             throw std::bad_alloc ();
00128         }
00129         mexMakeMemoryPersistent( ptr );
00130 
00131         #ifdef DEBUG
00132         WoRB::Printf( "WoRB: Alloc %p, new %u octets\n", ptr, size );
00133         #endif
00134 
00135         return ptr;
00136     }
00137 
00138     void* operator new( size_t size, const std::nothrow_t& ) throw()
00139     {
00140         void* ptr = mxMalloc( size );
00141         mexMakeMemoryPersistent( ptr );
00142     
00143         #ifdef DEBUG
00144         WoRB::Printf( "WoRB: Alloc %p, new %u octets (nothrow)\n", ptr, size );
00145         #endif
00146 
00147         return ptr;
00148     }
00149 
00150     void* operator new[] ( size_t size )
00151     {
00152         void* ptr = mxMalloc( size );
00153         if ( ! ptr ) {
00154             throw std::bad_alloc ();
00155         }
00156 
00157         mexMakeMemoryPersistent( ptr );
00158 
00159         #ifdef DEBUG
00160         WoRB::Printf( "WoRB: Alloc %p, new[] %u octets\n", ptr, size );
00161         #endif
00162 
00163         return ptr;
00164     }
00165 
00166     void* operator new[] ( size_t size, const std::nothrow_t& ) throw()
00167     {
00168         void* ptr = mxMalloc( size );
00169 
00170         #ifdef DEBUG
00171         WoRB::Printf( "WoRB: Alloc %p, new[] %u octets (nothrow)\n", ptr, size );
00172         #endif
00173 
00174         return ptr;
00175     }
00176 
00177     void operator delete( void* ptr )
00178     {
00179         if ( ptr )
00180         {
00181             #ifdef DEBUG
00182             WoRB::Printf( "WoRB: Free %p, delete\n", ptr );
00183             #endif
00184 
00185             mxFree( ptr );
00186         }
00187     }
00188     void operator delete[] ( void* ptr )
00189     {
00190         if ( ptr )
00191         {
00192             #ifdef DEBUG
00193             WoRB::Printf( "WoRB: Free %p, delete[]\n", ptr );
00194             #endif
00195 
00196             mxFree( ptr );
00197         }
00198     }
00199 
00200 #endif // MATLAB_MEX_FILE