forked from KolibriOS/kolibrios
59 lines
2.2 KiB
C
59 lines
2.2 KiB
C
|
#ifndef __yacasbase_h__
|
||
|
#define __yacasbase_h__
|
||
|
#include "yacasprivate.h"
|
||
|
|
||
|
/* /class YacasBase. All other objects should derive from YacasBase so that they use the correct
|
||
|
* operators new and delete. This ensures a Yacas-specific memory manager is used.
|
||
|
*/
|
||
|
|
||
|
class YacasBase
|
||
|
{
|
||
|
public:
|
||
|
inline YacasBase() {};
|
||
|
#ifdef YACAS_DEBUG
|
||
|
// New operators with additional debug arguments need to be handled differently
|
||
|
static inline void* operator new(size_t size, char* aFile, int aLine)
|
||
|
{ return YacasMallocPrivate(size,aFile,aLine); }
|
||
|
static inline void* operator new[](size_t size, char* aFile, int aLine)
|
||
|
{ return YacasMallocPrivate(size,aFile,aLine); }
|
||
|
#else
|
||
|
// Normal versions of operator new
|
||
|
static inline void* operator new(size_t size)
|
||
|
{ return PlatAlloc(size); }
|
||
|
static inline void* operator new[](size_t size)
|
||
|
{ return PlatAlloc(size); }
|
||
|
#endif
|
||
|
/* Operators delete are shared, they behave the same whether in debug or release (as
|
||
|
PlatFree is mapped to the debug version of freeing memory any way)
|
||
|
*/
|
||
|
static inline void operator delete(void* object)
|
||
|
{ PlatFree(object); }
|
||
|
static inline void operator delete[](void* object)
|
||
|
{ PlatFree(object); }
|
||
|
// Placement form of new and delete.
|
||
|
static inline void* operator new(size_t, void* where) { return where; }
|
||
|
static inline void operator delete(void*, void*) {}
|
||
|
|
||
|
/** If we don't want to force vtables, we can make the destructor inline and protected.
|
||
|
* The following might cause a little bit of overhead but has the advantage that even
|
||
|
* the compiler can see that this is safe (thus no unnecessary warnings). Preferrably
|
||
|
* though this class has a protected inline destructor.
|
||
|
*
|
||
|
* When I use Xcode on the MacOSX, I would prefer to not see the warnings that the
|
||
|
* destructor of this class is not virtual, and speed is not the primary concern in
|
||
|
* that build (as that build is used mostly for debugging).
|
||
|
*
|
||
|
* HIDE_UNIMPORTANT_COMPILER_WARNINGS can be defined in case one wants to get rid of
|
||
|
* compiler warnings, as opposed to having maximum running speed.
|
||
|
*/
|
||
|
protected:
|
||
|
#ifdef HIDE_UNIMPORTANT_COMPILER_WARNINGS
|
||
|
virtual
|
||
|
#else // HIDE_UNIMPORTANT_COMPILER_WARNINGS
|
||
|
inline
|
||
|
#endif // HIDE_UNIMPORTANT_COMPILER_WARNINGS
|
||
|
~YacasBase() {};
|
||
|
};
|
||
|
|
||
|
#endif
|