Version

menu_open

include/AK/Tools/Common/AkObject.h

Go to the documentation of this file.
00001 /*******************************************************************************
00002 The content of this file includes portions of the AUDIOKINETIC Wwise Technology
00003 released in source code form as part of the SDK installer package.
00004 
00005 Commercial License Usage
00006 
00007 Licensees holding valid commercial licenses to the AUDIOKINETIC Wwise Technology
00008 may use this file in accordance with the end user license agreement provided 
00009 with the software or, alternatively, in accordance with the terms contained in a
00010 written agreement between you and Audiokinetic Inc.
00011 
00012 Apache License Usage
00013 
00014 Alternatively, this file may be used under the Apache License, Version 2.0 (the 
00015 "Apache License"); you may not use this file except in compliance with the 
00016 Apache License. You may obtain a copy of the Apache License at 
00017 http://www.apache.org/licenses/LICENSE-2.0.
00018 
00019 Unless required by applicable law or agreed to in writing, software distributed
00020 under the Apache License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
00021 OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License for
00022 the specific language governing permissions and limitations under the License.
00023 
00024   Version: <VERSION>  Build: <BUILDNUMBER>
00025   Copyright (c) <COPYRIGHTYEAR> Audiokinetic Inc.
00026 *******************************************************************************/
00027 
00028 #ifndef _AK_OBJECT_H_
00029 #define _AK_OBJECT_H_
00030 
00031 #include <AK/SoundEngine/Common/AkMemoryMgr.h>
00032 
00033 extern AKSOUNDENGINE_API AkMemPoolId g_DefaultPoolId;
00034 extern AKSOUNDENGINE_API AkMemPoolId g_LEngineDefaultPoolId;
00035 
00036 //-----------------------------------------------------------------------------
00037 // Placement New definition. Use like this:
00038 // AkPlacementNew( memorybuffer ) T(); // where T is your type constructor
00039 //-----------------------------------------------------------------------------
00040 
00042 struct AkPlacementNewKey 
00043 { 
00045     AkForceInline AkPlacementNewKey(){} 
00046 };
00047 
00048 AkForceInline void * operator new( size_t /*size*/, void * memory, const AkPlacementNewKey & /*key*/ ) throw()
00049 {
00050       return memory;
00051 }
00052 
00053 #define AkPlacementNew(_memory) ::new( _memory, AkPlacementNewKey() )
00054 
00055 // Matching operator delete for AK placement new. This needs to be defined to avoid compiler warnings
00056 // with projects built with exceptions enabled.
00057 #ifndef AK_3DS
00058 AkForceInline void operator delete( void *, void *, const AkPlacementNewKey & ) throw() {}
00059 #endif
00060 
00061 //-----------------------------------------------------------------------------
00062 // Macros
00063 //-----------------------------------------------------------------------------
00064 
00066 struct AkPoolNewKey 
00067 { 
00069     AkForceInline AkPoolNewKey(){} 
00070 };
00071 
00072 // Important: Use these macros with appropriate delete.
00073 #if defined (AK_MEMDEBUG)
00074     #define AkNew(_pool,_what)              new((_pool),AkPoolNewKey(),__FILE__,__LINE__) _what
00075     #define AkAlloc(_pool,_size)            (AK::MemoryMgr::dMalloc((_pool),_size,__FILE__,__LINE__))
00076     #define AkNew2(_ptr,_pool,_type,_what)  { _ptr = (_type *) AK::MemoryMgr::dMalloc((_pool),sizeof(_type),__FILE__,__LINE__); if ( _ptr ) AkPlacementNew( _ptr ) _what; }
00077     #define AkMalign(_pool,_size,_align)    (AK::MemoryMgr::dMalign((_pool),_size,_align, __FILE__,__LINE__))
00078     #define AkNewAligned(_pool,_what,_align)    new((_pool),AkPoolNewKey(),(_align),__FILE__,__LINE__) _what
00079 #else
00080     #define AkNew(_pool,_what)              new((_pool),AkPoolNewKey()) _what
00081     #define AkAlloc(_pool,_size)            (AK::MemoryMgr::Malloc((_pool),_size))
00082     #define AkNew2(_ptr,_pool,_type,_what)  { _ptr = (_type *) AK::MemoryMgr::Malloc((_pool),sizeof(_type)); if ( _ptr ) AkPlacementNew( _ptr ) _what; }
00083     #define AkMalign(_pool,_size,_align)    (AK::MemoryMgr::Malign((_pool),_size,_align))
00084     #define AkNewAligned(_pool,_what,_align)    new((_pool),AkPoolNewKey(),(_align)) _what
00085 #endif
00086 
00087 #define AkFree(_pool,_pvmem)                (AK::MemoryMgr::Free((_pool),(_pvmem)))
00088 #define AkFalign(_pool,_pvmem)              (AK::MemoryMgr::Falign((_pool),(_pvmem)))
00089 
00090 #if defined (AK_MEMDEBUG)
00091 
00092     AkForceInline void * operator new(size_t size,AkMemPoolId in_PoolId,const AkPoolNewKey &,const char* szFile,AkUInt32 ulLine) throw()
00093     {
00094         return AK::MemoryMgr::dMalloc( in_PoolId, size, szFile, ulLine );
00095     }
00096 
00097     AkForceInline void * operator new(size_t size,AkMemPoolId in_PoolId,const AkPoolNewKey &,AkUInt32 in_align,const char* szFile,AkUInt32 ulLine) throw()
00098     {
00099         return AK::MemoryMgr::dMalign( in_PoolId, size, in_align, szFile, ulLine );
00100     }
00101     
00102     #ifndef AK_3DS
00103     AkForceInline void operator delete(void *,AkMemPoolId,const AkPoolNewKey &,const char*,AkUInt32) throw() {}
00104     AkForceInline void operator delete(void *,AkMemPoolId,const AkPoolNewKey &,AkUInt32,const char*,AkUInt32) throw() {}
00105     #endif
00106     
00107 #else
00108 
00109     AkForceInline void * operator new(size_t size,AkMemPoolId in_PoolId,const AkPoolNewKey &) throw()
00110     {
00111         return AK::MemoryMgr::Malloc( in_PoolId, size );
00112     }
00113 
00114     AkForceInline void * operator new(size_t size,AkMemPoolId in_PoolId,const AkPoolNewKey &,AkUInt32 in_align) throw()
00115     {
00116         return AK::MemoryMgr::Malign( in_PoolId, size, in_align );
00117     }
00118     
00119     #ifndef AK_3DS
00120     AkForceInline void operator delete(void *,AkMemPoolId,const AkPoolNewKey &) throw() {}
00121     AkForceInline void operator delete(void *,AkMemPoolId,const AkPoolNewKey &,AkUInt32) throw() {}
00122     #endif
00123 
00124 #endif
00125 
00126 //-----------------------------------------------------------------------------
00127 // Name: Class CAkObject
00128 // Desc: Base allocator object: DEPRECATED.
00129 //-----------------------------------------------------------------------------
00130 
00131 class CAkObject
00132 {
00133 public:
00135     virtual ~CAkObject( ) { }
00136 };
00137 
00138 template <class T>
00139 AkForceInline void AkDelete( AkMemPoolId in_PoolId, T * in_pObject )
00140 {
00141     if ( in_pObject )
00142     {
00143         in_pObject->~T();
00144         AK::MemoryMgr::Free( in_PoolId, in_pObject );
00145     }
00146 }
00147 
00148 template <class T>
00149 AkForceInline void AkDeleteAligned( AkMemPoolId in_PoolId, T * in_pObject )
00150 {
00151     if ( in_pObject )
00152     {
00153         in_pObject->~T();
00154         AK::MemoryMgr::Falign( in_PoolId, in_pObject );
00155     }
00156 }
00157 
00158 #endif // _AK_OBJECT_H_

Was this page helpful?

Need Support?

Questions? Problems? Need more info? Contact us, and we can help!

Visit our Support page

Tell us about your project. We're here to help.

Register your project and we'll help you get started with no strings attached!

Get started with Wwise