116 lines
1.6 KiB
C++
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;
|
|
};
|
|
|
|
|
|
} |