Files
GdCpp12/include/Mem/CStack.h

102 lines
2.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
};