1 /* 2 * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org 3 * 4 * This software is provided 'as-is', without any express or implied 5 * warranty. In no event will the authors be held liable for any damages 6 * arising from the use of this software. 7 * Permission is granted to anyone to use this software for any purpose, 8 * including commercial applications, and to alter it and redistribute it 9 * freely, subject to the following restrictions: 10 * 1. The origin of this software must not be misrepresented; you must not 11 * claim that you wrote the original software. If you use this software 12 * in a product, an acknowledgment in the product documentation would be 13 * appreciated but is not required. 14 * 2. Altered source versions must be plainly marked as such, and must not be 15 * misrepresented as being the original software. 16 * 3. This notice may not be removed or altered from any source distribution. 17 */ 18 19 #include <Box2D/Common/b2StackAllocator.h> 20 #include <Box2D/Common/b2Math.h> 21 b2StackAllocator()22b2StackAllocator::b2StackAllocator() 23 { 24 m_index = 0; 25 m_allocation = 0; 26 m_maxAllocation = 0; 27 m_entryCount = 0; 28 } 29 ~b2StackAllocator()30b2StackAllocator::~b2StackAllocator() 31 { 32 b2Assert(m_index == 0); 33 b2Assert(m_entryCount == 0); 34 } 35 Allocate(int32 size)36void* b2StackAllocator::Allocate(int32 size) 37 { 38 b2Assert(m_entryCount < b2_maxStackEntries); 39 40 b2StackEntry* entry = m_entries + m_entryCount; 41 entry->size = size; 42 if (m_index + size > b2_stackSize) 43 { 44 entry->data = (char*)b2Alloc(size); 45 entry->usedMalloc = true; 46 } 47 else 48 { 49 entry->data = m_data + m_index; 50 entry->usedMalloc = false; 51 m_index += size; 52 } 53 54 m_allocation += size; 55 m_maxAllocation = b2Max(m_maxAllocation, m_allocation); 56 ++m_entryCount; 57 58 return entry->data; 59 } 60 Free(void * p)61void b2StackAllocator::Free(void* p) 62 { 63 b2Assert(m_entryCount > 0); 64 b2StackEntry* entry = m_entries + m_entryCount - 1; 65 b2Assert(p == entry->data); 66 if (entry->usedMalloc) 67 { 68 b2Free(p); 69 } 70 else 71 { 72 m_index -= entry->size; 73 } 74 m_allocation -= entry->size; 75 --m_entryCount; 76 77 p = NULL; 78 } 79 GetMaxAllocation() const80int32 b2StackAllocator::GetMaxAllocation() const 81 { 82 return m_maxAllocation; 83 } 84