本文来自http://blog.youkuaiyun.com/runaying ,引用必须注明出处!
cocos2d-x节点(b2GrowableStack.h)API
温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记
//可增长的协议栈,和出栈入栈操作
///cocos2d-x-3.0alpha0/external/Box2D/Common
//可增长的协议栈,和出栈入栈操作
#ifndef B2_GROWABLE_STACK_H
#define B2_GROWABLE_STACK_H
#include <Box2D/Common/b2Settings.h>
#include <cstring>
/// 这是一个可增长的后进先出栈它的初始容量为 N.
/// 如果栈大小超过初始容量,则在堆中增加堆栈的大小。
template <typename T, int32 N>
class b2GrowableStack
{
public:
// 栈构造函数,初始化相关数据
b2GrowableStack()
{
m_stack = m_array;
m_count = 0;
m_capacity = N;
}
//栈析构函数,释放相关内存
~b2GrowableStack()
{
if (m_stack != m_array)
{
b2Free(m_stack);
m_stack = NULL;
}
}
// 进栈操作
// * 参数说明:element :进栈元素
void Push(const T& element)
{
//栈已满
if (m_count == m_capacity)
{
//获取栈头指针并保存到old中
T* old = m_stack;
//将栈的容量扩充到原来的2倍
m_capacity *= 2;
//申请内存,并保存到m_stack中
m_stack = (T*)b2Alloc(m_capacity * sizeof(T));
//将原来的内容整体拷贝到m_stack中去
std::memcpy(m_stack, old, m_count * sizeof(T));
if (old != m_array)
{
//释放old指向的内存
b2Free(old);
}
}
//进栈,并将元素个数自加
m_stack[m_count] = element;
++m_count;
}
// 出栈操作
// * 参数说明:(void)
// * 返 回 值:返回最近进入栈的值
T Pop()
{
//验证元素个数的有效性
b2Assert(m_count > 0);
//元素个数自减,并出栈
--m_count;
return m_stack[m_count];
}
//获取栈中元素的个数
int32 GetCount()
{
return m_count;
}
private:
T* m_stack; //栈头指针
T m_array[N]; //辅助数组
int32 m_count; //元素的数量
int32 m_capacity; //栈的容量
};
#endif