Skip to content

Commit a81e606

Browse files
committed
added initializer list and some tests for arrayview
1 parent 9482295 commit a81e606

File tree

5 files changed

+177
-2
lines changed

5 files changed

+177
-2
lines changed

ZEngine/ZEngine/Core/Containers/Array.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
#include <Allocator.h>
33
#include <type_traits>
44

5-
// using span ?
6-
75
using namespace ZEngine::Core::Memory;
86

97
namespace ZEngine::Core::Containers
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#pragma once
2+
#include <Allocator.h>
3+
4+
using namespace ZEngine::Core::Memory;
5+
6+
namespace ZEngine::Core::Containers
7+
{
8+
9+
template <typename T>
10+
struct InitializerList
11+
{
12+
using value_type = T;
13+
using size_type = size_t;
14+
using reference = T&;
15+
using const_reference = const T&;
16+
using iterator = T*;
17+
using const_iterator = const T*;
18+
using pointer = T*;
19+
using const_pointer = const T*;
20+
21+
InitializerList(pointer data, size_type size) : m_data(data), m_size(size) {}
22+
23+
iterator begin()
24+
{
25+
return m_data;
26+
}
27+
28+
const_iterator begin() const
29+
{
30+
return m_data;
31+
}
32+
33+
iterator end()
34+
{
35+
return m_data + m_size;
36+
}
37+
38+
const_iterator end() const
39+
{
40+
return m_data + m_size;
41+
}
42+
43+
pointer data()
44+
{
45+
return m_data;
46+
}
47+
48+
const_pointer data() const
49+
{
50+
return m_data;
51+
}
52+
53+
bool empty() const
54+
{
55+
return m_size == 0;
56+
}
57+
58+
size_type size() const
59+
{
60+
return m_size;
61+
}
62+
63+
size_type m_size;
64+
pointer m_data;
65+
};
66+
67+
template <typename T, size_t N>
68+
InitializerList<T> make_initializer_list(T (&arr)[N])
69+
{
70+
return InitializerList<T>(arr, N);
71+
}
72+
73+
} // namespace ZEngine::Core::Containers

ZEngine/tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ set (TEST_SOURCES
99
array_test.cpp
1010
string_test.cpp
1111
hashmap_test.cpp
12+
initializerlist_test.cpp
1213
)
1314

1415
add_executable(ZEngineTests ${TEST_SOURCES})

ZEngine/tests/array_test.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,23 @@ TEST_F(ArrayTest, FrontAndBack)
130130

131131
EXPECT_EQ(array.front(), 10);
132132
EXPECT_EQ(array.back(), 30);
133+
}
134+
135+
TEST_F(ArrayTest, ArrayViewWrap)
136+
{
137+
Array<int> array;
138+
array.init(&allocator, 4);
139+
array.push(10);
140+
array.push(20);
141+
array.push(30);
142+
143+
ArrayView<int> view(array);
144+
145+
EXPECT_EQ(view.size(), array.size());
146+
EXPECT_EQ(view[0], 10);
147+
EXPECT_EQ(view[1], 20);
148+
EXPECT_EQ(view[2], 30);
149+
150+
view[1] = 99;
151+
EXPECT_EQ(array[1], 99);
133152
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include <Core/Containers/Array.h>
2+
#include <Core/Containers/InitializerList.h>
3+
#include <Core/Containers/Strings.h>
4+
#include <gtest/gtest.h>
5+
6+
using namespace ZEngine::Core::Containers;
7+
using namespace ZEngine::Core::Memory;
8+
9+
class InitializerListTest : public ::testing::Test
10+
{
11+
protected:
12+
void SetUp() override
13+
{
14+
arena.Initialize(512);
15+
}
16+
17+
void TearDown() override
18+
{
19+
arena.Shutdown();
20+
}
21+
22+
ArenaAllocator arena;
23+
};
24+
25+
TEST_F(InitializerListTest, WithArray)
26+
{
27+
Array<int> array;
28+
array.init(&arena, 4);
29+
array.push(1);
30+
array.push(2);
31+
array.push(3);
32+
array.push(4);
33+
34+
InitializerList<int> list(array.data(), array.size());
35+
36+
EXPECT_EQ(list.size(), 4);
37+
EXPECT_EQ(list.data()[0], 1);
38+
EXPECT_EQ(*(list.begin() + 2), 3);
39+
40+
int total = 0;
41+
for (int val : list)
42+
{
43+
total += val;
44+
}
45+
46+
EXPECT_EQ(total, 10);
47+
}
48+
49+
TEST_F(InitializerListTest, WithStrings)
50+
{
51+
Array<String> str_array;
52+
str_array.init(&arena, 3);
53+
str_array.push(String());
54+
str_array.push(String());
55+
str_array.push(String());
56+
57+
str_array[0].init(&arena, "Alpha");
58+
str_array[1].init(&arena, "Beta");
59+
str_array[2].init(&arena, "Gamma");
60+
61+
InitializerList<String> list(str_array.data(), str_array.size());
62+
63+
EXPECT_EQ(list.size(), 3);
64+
EXPECT_STREQ(list.data()[0].c_str(), "Alpha");
65+
EXPECT_STREQ(list.data()[2].c_str(), "Gamma");
66+
67+
std::string result;
68+
for (const auto& str : list)
69+
result += str.c_str();
70+
71+
EXPECT_EQ(result, "AlphaBetaGamma");
72+
}
73+
74+
TEST_F(InitializerListTest, EmptyFromArray)
75+
{
76+
Array<int> empty_array;
77+
empty_array.init(&arena, 0);
78+
79+
InitializerList<int> list(empty_array.data(), empty_array.size());
80+
81+
EXPECT_EQ(list.size(), 0);
82+
EXPECT_TRUE(list.empty());
83+
EXPECT_EQ(list.begin(), list.end());
84+
}

0 commit comments

Comments
 (0)