Changeset View
Changeset View
Standalone View
Standalone View
extern/bullet2/src/LinearMath/btStackAlloc.h
| Show All 14 Lines | |||||
| /* | /* | ||||
| StackAlloc extracted from GJK-EPA collision solver by Nathanael Presson | StackAlloc extracted from GJK-EPA collision solver by Nathanael Presson | ||||
| Nov.2006 | Nov.2006 | ||||
| */ | */ | ||||
| #ifndef BT_STACK_ALLOC | #ifndef BT_STACK_ALLOC | ||||
| #define BT_STACK_ALLOC | #define BT_STACK_ALLOC | ||||
| #include "btScalar.h" //for btAssert | #include "btScalar.h" //for btAssert | ||||
| #include "btAlignedAllocator.h" | #include "btAlignedAllocator.h" | ||||
| ///The btBlock class is an internal structure for the btStackAlloc memory allocator. | ///The btBlock class is an internal structure for the btStackAlloc memory allocator. | ||||
| struct btBlock | struct btBlock | ||||
| { | { | ||||
| btBlock* previous; | btBlock* previous; | ||||
| unsigned char* address; | unsigned char* address; | ||||
| }; | }; | ||||
| ///The StackAlloc class provides some fast stack-based memory allocator (LIFO last-in first-out) | ///The StackAlloc class provides some fast stack-based memory allocator (LIFO last-in first-out) | ||||
| class btStackAlloc | class btStackAlloc | ||||
| { | { | ||||
| public: | public: | ||||
| btStackAlloc(unsigned int size) | |||||
| btStackAlloc(unsigned int size) { ctor();create(size); } | { | ||||
| ctor(); | |||||
| create(size); | |||||
| } | |||||
| ~btStackAlloc() { destroy(); } | ~btStackAlloc() { destroy(); } | ||||
| inline void create(unsigned int size) | inline void create(unsigned int size) | ||||
| { | { | ||||
| destroy(); | destroy(); | ||||
| data = (unsigned char*) btAlignedAlloc(size,16); | data = (unsigned char*)btAlignedAlloc(size, 16); | ||||
| totalsize = size; | totalsize = size; | ||||
| } | } | ||||
| inline void destroy() | inline void destroy() | ||||
| { | { | ||||
| btAssert(usedsize==0); | btAssert(usedsize == 0); | ||||
| //Raise(L"StackAlloc is still in use"); | //Raise(L"StackAlloc is still in use"); | ||||
| if(usedsize==0) | if (usedsize == 0) | ||||
| { | { | ||||
| if(!ischild && data) | if (!ischild && data) | ||||
| btAlignedFree(data); | btAlignedFree(data); | ||||
| data = 0; | data = 0; | ||||
| usedsize = 0; | usedsize = 0; | ||||
| } | } | ||||
| } | } | ||||
| int getAvailableMemory() const | int getAvailableMemory() const | ||||
| { | { | ||||
| return static_cast<int>(totalsize - usedsize); | return static_cast<int>(totalsize - usedsize); | ||||
| } | } | ||||
| unsigned char* allocate(unsigned int size) | unsigned char* allocate(unsigned int size) | ||||
| { | { | ||||
| const unsigned int nus(usedsize+size); | const unsigned int nus(usedsize + size); | ||||
| if(nus<totalsize) | if (nus < totalsize) | ||||
| { | { | ||||
| usedsize=nus; | usedsize = nus; | ||||
| return(data+(usedsize-size)); | return (data + (usedsize - size)); | ||||
| } | } | ||||
| btAssert(0); | btAssert(0); | ||||
| //&& (L"Not enough memory")); | //&& (L"Not enough memory")); | ||||
| return(0); | return (0); | ||||
| } | } | ||||
| SIMD_FORCE_INLINE btBlock* beginBlock() | SIMD_FORCE_INLINE btBlock* beginBlock() | ||||
| { | { | ||||
| btBlock* pb = (btBlock*)allocate(sizeof(btBlock)); | btBlock* pb = (btBlock*)allocate(sizeof(btBlock)); | ||||
| pb->previous = current; | pb->previous = current; | ||||
| pb->address = data+usedsize; | pb->address = data + usedsize; | ||||
| current = pb; | current = pb; | ||||
| return(pb); | return (pb); | ||||
| } | } | ||||
| SIMD_FORCE_INLINE void endBlock(btBlock* block) | SIMD_FORCE_INLINE void endBlock(btBlock* block) | ||||
| { | { | ||||
| btAssert(block==current); | btAssert(block == current); | ||||
| //Raise(L"Unmatched blocks"); | //Raise(L"Unmatched blocks"); | ||||
| if(block==current) | if (block == current) | ||||
| { | { | ||||
| current = block->previous; | current = block->previous; | ||||
| usedsize = (unsigned int)((block->address-data)-sizeof(btBlock)); | usedsize = (unsigned int)((block->address - data) - sizeof(btBlock)); | ||||
| } | } | ||||
| } | } | ||||
| private: | private: | ||||
| void ctor() | void ctor() | ||||
| { | { | ||||
| data = 0; | data = 0; | ||||
| totalsize = 0; | totalsize = 0; | ||||
| usedsize = 0; | usedsize = 0; | ||||
| current = 0; | current = 0; | ||||
| ischild = false; | ischild = false; | ||||
| } | } | ||||
| unsigned char* data; | unsigned char* data; | ||||
| unsigned int totalsize; | unsigned int totalsize; | ||||
| unsigned int usedsize; | unsigned int usedsize; | ||||
| btBlock* current; | btBlock* current; | ||||
| bool ischild; | bool ischild; | ||||
| }; | }; | ||||
| #endif //BT_STACK_ALLOC | #endif //BT_STACK_ALLOC | ||||