#pragma once
#include "GdCPP_Exports.h"

template<typename T>
class CStack
{
public:
    /// 构造函数指定预先分配的空间，和实际使用的数量
    CStack(uint32_t maxnum = 0, uint32_t num = 0)
        : _Num(num)
        , _MaxNum(maxnum)
        , _Data(nullptr)
    {
        ASSERT(_MaxNum >= _Num);
        if (_MaxNum) {
            _Data = new T[_MaxNum];
        }
    }


    ~CStack()
    {
        clearArray();
    }

    /// 调整实际使用的数量
    bool resizeCnt(uint32_t num)
    {
        ASSERT(_MaxNum >= num);
        if (_Num != num && num <= _MaxNum) {
            _Num = num;
            return true;
        }
        else {
            return false;
        }
    }

    // 调整预留空间
    bool reserveCnt(uint32_t maxnum, bool useall = false)
    {
        if (maxnum > _MaxNum) {
            clearArray();
            _MaxNum = maxnum;
            _Data = new T[_MaxNum];
            if (_Data == nullptr) return false;
            if (useall) {
                _Num = _MaxNum;
            }
        }
        return true;
    }

    /// 重载[]操作符简化图像的引用，调用必须保证camid在[0, camNum-1]范围内
    inline T& operator [](size_t  id)
    {
        return _Data[id];
    }

    inline const T& operator [](size_t  id) const
    {
        return _Data[id];
    }

    inline T& at(size_t  id)
    {
        return _Data[id];
    }

    inline const T& at(size_t  id) const
    {
        return _Data[id];
    }

    inline uint32_t Num() const { return _Num; }
    inline uint32_t MaxNum() const { return _MaxNum; }

    void clearArray() {
        delete[] _Data;
        _Data = nullptr;
        _MaxNum = 0;
        _Num = 0;
    }

private:
    /// 禁用复制构造函数
    CStack(const CStack& r);

protected:
    /// 图形数组长度
    uint32_t _Num;
    uint32_t _MaxNum;



    /// 动态分配的CImageBuf数组。数量没有使用宏CAM_MAX_NUM，因为CAM_MAX_NUM在不同应用可能发生变化。
    /// 为了通用性不在构造时动态分配，camNum指定数量；
    /// 或者默认构造空数组，使用resize函数分配。
    T* _Data=nullptr;
};

