ChunkFile: treat vectors/strings as sized arrays
This commit is contained in:
parent
a129d60a57
commit
04a92482bf
|
@ -116,7 +116,7 @@ public:
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void Do(std::vector<T>& x)
|
void Do(std::vector<T>& x)
|
||||||
{
|
{
|
||||||
DoContainer(x);
|
DoContiguousContainer(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -134,7 +134,7 @@ public:
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void Do(std::basic_string<T>& x)
|
void Do(std::basic_string<T>& x)
|
||||||
{
|
{
|
||||||
DoContainer(x);
|
DoContiguousContainer(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, typename U>
|
template <typename T, typename U>
|
||||||
|
@ -147,16 +147,22 @@ public:
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
void DoArray(std::array<T, N>& x)
|
void DoArray(std::array<T, N>& x)
|
||||||
{
|
{
|
||||||
DoArray(x.data(), (u32)x.size());
|
DoArray(x.data(), static_cast<u32>(x.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T, typename std::enable_if_t<IsTriviallyCopyable<T>, int> = 0>
|
||||||
void DoArray(T* x, u32 count)
|
void DoArray(T* x, u32 count)
|
||||||
{
|
{
|
||||||
static_assert(IsTriviallyCopyable<T>, "Only sane for trivially copyable types");
|
|
||||||
DoVoid(x, count * sizeof(T));
|
DoVoid(x, count * sizeof(T));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, typename std::enable_if_t<!IsTriviallyCopyable<T>, int> = 0>
|
||||||
|
void DoArray(T* x, u32 count)
|
||||||
|
{
|
||||||
|
for (u32 i = 0; i < count; ++i)
|
||||||
|
Do(x[i]);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
void DoArray(T (&arr)[N])
|
void DoArray(T (&arr)[N])
|
||||||
{
|
{
|
||||||
|
@ -249,6 +255,16 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
template <typename T>
|
||||||
|
void DoContiguousContainer(T& container)
|
||||||
|
{
|
||||||
|
u32 size = static_cast<u32>(container.size());
|
||||||
|
Do(size);
|
||||||
|
container.resize(size);
|
||||||
|
|
||||||
|
DoArray(&container[0], size);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void DoContainer(T& x)
|
void DoContainer(T& x)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue