MCPcopy Create free account
hub / github.com/ValveSoftware/steam-audio / Array

Class Array

core/src/core/array.h:32–161  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

30// a 2D array as a T**, etc.
31template <typename T, size_t N = 1>
32class Array
33{
34public:
35 size_t mSize; // Size of the last dimension of this array. For an m x n array, this is n.
36 unique_ptr<T[]> mElements; // Contiguous buffer containing all elements of this array, in row-major order.
37 Array<T*, N - 1> mPointers; // Array of rank N-1, containing pointers to "columns" of this array. For an
38 // m x n x k array, this is an m x n array of pointers, each pointing to k
39 // elements. Recursively, this will expand to a buffer of m * n elements,
40 // and an array of m pointers to n elements.
41 size_t mSizes[N];
42
43 // Default constructor creates an array of size 0.
44 Array()
45 : mSize(0)
46 , mElements(nullptr)
47 , mPointers()
48 {}
49
50 // Creates an array with the given dimensions.
51 template <typename S, typename... Sizes>
52 Array(S size, Sizes... sizes)
53 {
54 resize(size, sizes...);
55 }
56
57 ~Array()
58 {}
59
60 // Resizes this array to have the given dimensions.
61 template <typename S, typename... Sizes>
62 void resize(S size, Sizes... sizes)
63 {
64 auto sizeList = {sizes...};
65 auto sizeArray = sizeList.begin();
66
67 mSizes[0] = size;
68 for (auto i = 1; i < N; ++i)
69 {
70 mSizes[i] = sizeArray[i - 1];
71 }
72
73 mSize = sizeArray[N - 2];
74
75 auto numElements = size;
76 for (auto i = 0; i < N - 1; ++i)
77 {
78 numElements *= sizeArray[i];
79 }
80
81 mElements = ipl::make_unique<T[]>(numElements);
82
83 mPointers.resize(size, sizes...);
84
85 auto stride = mSize;
86 for (auto i = 0u; mSize > 0 && i < numElements / mSize; ++i)
87 {
88 mPointers.mElements[i] = &mElements[i * stride];
89 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected