cocos2d-x节点(b2GrowableStack.h)API

时间:2022-03-02 00:07:36

本文来自http://blog.csdn.net/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