-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPArray.h
More file actions
95 lines (81 loc) · 1.59 KB
/
Copy pathPArray.h
File metadata and controls
95 lines (81 loc) · 1.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#pragma once
#include <vector>
#include <string_view>
#include <Windows.h>
#ifndef PARRAY_DEFINITION
#define PARRAY_DEFINITION
inline void* GlobalHeapAllocateMemory(size_t Size)
{
return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size);
}
inline void GlobalHeapFreeMemory(const void* Ptr)
{
HeapFree(GetProcessHeap(), 0, const_cast<void*>(Ptr));
}
template<typename T>
struct PArray
{
size_t N;
const T* Data;
PArray() :N(0), Data(nullptr) {}
PArray(const std::vector<T>& p) :N(p.size()), Data(p.data()) {}
template<size_t _N>
PArray(const T p[_N]) : N(_N), Data(p) {}
PArray(size_t _N, const T* p) : N(_N), Data(p) {}
void Delete()
{
if (Data != nullptr)
{
GlobalHeapFreeMemory(Data);
Data = nullptr;
N = 0;
}
}
void Alloc(size_t Size)
{
Delete();
if (Size > 0)
{
Data = reinterpret_cast<decltype(Data)>(GlobalHeapAllocateMemory(sizeof(T) * Size));
for (size_t i = 0; i < Size; i++)
{
new ((T*)Data + i) T();
}
N = Size;
}
}
std::string_view AsStringView() const
{
return std::string_view((const char*)Data, N * sizeof(T));
}
T* begin()
{
return (T*)Data;
}
T* end()
{
return (T*)Data + N;
}
const T* begin() const
{
return Data;
}
const T* end() const
{
return Data + N;
}
T& operator[](size_t idx)
{
return ((T*)Data)[idx];
}
const T& operator[](size_t idx) const
{
return Data[idx];
}
};
template<typename T>
PArray<T> GetNullPArray()
{
return PArray<T>();
}
#endif