57 lines
823 B
C++
57 lines
823 B
C++
/**
|
|
* @file dl_array_enum.h
|
|
* @brief array使用枚举类作为索引的封装
|
|
*
|
|
*
|
|
* @version 1.0
|
|
* @author lveyou
|
|
* @date 22-06-27
|
|
*
|
|
* @note malloc不会调用构造函数
|
|
* @note 访问尾后指针是合法的
|
|
*/
|
|
#pragma once
|
|
|
|
#include <cassert>
|
|
|
|
namespace dl
|
|
{
|
|
//! 枚举类数组
|
|
template<typename V, auto N>
|
|
class ArrayEnum
|
|
{
|
|
public:
|
|
using E = decltype(N);
|
|
/**
|
|
* @brief 返回位置元素,debug版本检查越界
|
|
*/
|
|
V& operator[](E e)
|
|
{
|
|
#ifndef NDEBUG
|
|
assert(CheckRange(e));
|
|
#endif
|
|
return _data[(size_t)e];
|
|
}
|
|
|
|
V& operator[](size_t index)
|
|
{
|
|
return operator[](E(index));
|
|
}
|
|
|
|
//! 越界检查
|
|
bool CheckRange(E e)
|
|
{
|
|
return (size_t)e < (size_t)N;
|
|
}
|
|
|
|
size_t size() { return (size_t)N; }
|
|
|
|
V* begin() { return _data; }
|
|
V* end() { return _data + (size_t)N; }
|
|
|
|
private:
|
|
V _data[(size_t)N];
|
|
};
|
|
|
|
}
|