Files
2026-03-09 12:24:40 +08:00

116 lines
1.6 KiB
C++

/**
* @file dl_array2.h
* @brief 2维array
*
*
* @version 1.0
* @author lveyou
* @date 23-07-09
*
* @note 提供行指针,避免乘法计算
* @note 设计为深拷贝,与std::array一致
* @note std::array<std::array<T, W>, H>这种写法,下标访问时会使用imul,所以使用行指针
* @note 以上废弃,实际测试,原生写法速度最快
*/
#pragma once
namespace dl
{
//! 二维array
template<typename T, size_t W, size_t H>
class Array2
{
public:
/**
* @brief 返回第j行
*/
T* operator[](std::size_t j)
{
assert(j < H);
return &_data[j * W];
}
/**
* @brief 返回第j行
*/
const T* operator[](std::size_t j) const
{
assert(j < H);
return &_data[j * W];
}
const T& Get(size_t j, size_t i) const
{
assert(j < H);
assert(i < W);
return _data[j * W + i];
}
T& GetRef(size_t j, size_t i)
{
assert(j < H);
assert(i < W);
return _data[j * W + i];
}
bool CheckRange(size_t j, size_t i) const
{
return j < H && i < W;
}
bool CheckRange(const SizeT& xy) const
{
return CheckRange(xy.y, xy.x);
}
/**
* @brief 填充值
*/
void Fill(const T& v)
{
for (auto& iter : _data)
iter = v;
}
std::byte* GetBuffer()
{
return (std::byte*)_data.data();
}
T* GetData()
{
return _data.data();
}
unsigned GetWidth()
{
return (unsigned)W;
}
unsigned GetHeight()
{
return (unsigned)H;
}
Size GetSize()
{
return { (unsigned)W, (unsigned)H };
}
size_t GetSizeByte()
{
return _data.size() * sizeof(T);
}
auto begin()
{
return _data.begin();
}
auto end()
{
return _data.end();
}
private:
std::array<T, W * H> _data;
};
}