Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
Span.hpp
1#pragma once
2
3#include <type_traits>
4
5#include <Common/Assert.hpp>
6#include <Common/IntTypes.hpp>
7
8#include "Iterators.hpp"
9
10namespace Grindstone::Containers {
11 template<typename T>
12 class Span {
13 public:
14 using Iterator = ArrayIterator<T>;
15 using ConstIterator = ConstArrayIterator<T>;
16 using ReverseIterator = ReverseArrayIterator<T>;
17 using ConstReverseIterator = ConstArrayIterator<T>;
18
19 Span() = default;
20
21 Span(T* ptr, size_t size) :
22 contents(ptr),
23 size(size) {}
24
25 Span(const Span& other) : size(other.size), contents(other.contents) {}
26
27 Span(Span&& other) noexcept : size(other.size), contents(other.contents) {
28 other.size = 0;
29 other.contents = nullptr;
30 }
31
32 Span& operator=(const Span& other) {
33 size = other.size;
34 contents = other.contents;
35 }
36
37 Span& operator=(Span&& other) noexcept {
38 size = other.size;
39 contents = other.contents;
40
41 other.size = 0;
42 other.contents = nullptr;
43
44 return *this;
45 }
46
47 ~Span() {
48 contents = nullptr;
49 size = 0;
50 }
51
52 [[nodiscard]] const T& GetBegin() const {
53 return contents[0];
54 }
55
56 [[nodiscard]] T& GetBegin() {
57 return contents[0];
58 }
59
60 [[nodiscard]] const T& GetEnd() const {
61 return contents[size];
62 }
63
64 [[nodiscard]] T& GetEnd() {
65 return contents[size];
66 }
67
68 bool TryGet(T& outValue, size_t index) {
69 if (index < size) {
70 contents[index];
71 return true;
72 }
73
74 return false;
75 }
76
77 size_t GetSize() const {
78 return size;
79 }
80
81 Span<T> GetSubspan(size_t firstIndex, size_t count) {
82 GS_ASSERT_ENGINE_WITH_MESSAGE(count == 0 || firstIndex + count <= size, "Array index is invalid.");
83 return Span<T>{ &contents[firstIndex], count };
84 }
85
86 T& operator[](size_t index) {
87 GS_ASSERT_ENGINE_WITH_MESSAGE(index < size, "Array index is invalid.");
88 return contents[index];
89 }
90
91 const T& operator[](size_t index) const {
92 GS_ASSERT_ENGINE_WITH_MESSAGE(index < size, "Array index is invalid.");
93 return contents[index];
94 }
95
96 [[nodiscard]] constexpr Iterator begin() noexcept {
97 return Iterator(contents);
98 }
99
100 [[nodiscard]] constexpr ConstIterator begin() const noexcept {
101 return ConstIterator(contents);
102 }
103
104 [[nodiscard]] constexpr Iterator end() noexcept {
105 return Iterator(&contents[size]);
106 }
107
108 [[nodiscard]] constexpr ConstIterator end() const noexcept {
109 return ConstIterator(&contents[size - 1]);
110 }
111
112 [[nodiscard]] constexpr ReverseIterator rbegin() noexcept {
113 return ReverseIterator(&contents[size - 1]);
114 }
115
116 [[nodiscard]] constexpr ConstReverseIterator rbegin() const noexcept {
117 return ConstReverseIterator(&contents[size - 1]);
118 }
119
120 [[nodiscard]] constexpr ReverseIterator rend() noexcept {
121 return ReverseIterator(contents - 1);
122 }
123
124 [[nodiscard]] constexpr ConstReverseIterator rend() const noexcept {
125 return ConstReverseIterator(contents - 1);
126 }
127
128 [[nodiscard]] constexpr ConstIterator cbegin() const noexcept {
129 return ConstIterator(contents);
130 }
131
132 [[nodiscard]] constexpr ConstIterator cend() const noexcept {
133 return ConstIterator(&contents[size]);
134 }
135
136 [[nodiscard]] constexpr ConstReverseIterator crbegin() const noexcept {
137 return ConstReverseIterator(&contents[size - 1]);
138 }
139
140 [[nodiscard]] constexpr ConstReverseIterator crend() const noexcept {
141 return ConstReverseIterator(contents - 1);
142 }
143 protected:
144 size_t size = 0;
145 T* contents = nullptr;
146 };
147
148 using BufferSpan = Span<Grindstone::Byte>;
149
150 template<typename T>
151 class ReverseRange {
152 public:
153 explicit ReverseRange(T& iterable) : iterable{ iterable } {}
154 auto begin() const { return std::rbegin(iterable); }
155 auto end() const { return std::rend(iterable); }
156 private:
157 T& iterable;
158 };
159
160 template<typename T>
161 class ReverseRangeTemp {
162 public:
163 explicit ReverseRangeTemp(T&& iterable) : iterable{ std::move(iterable) } {}
164 auto begin() const { return std::rbegin(iterable); }
165 auto end() const { return std::rend(iterable); }
166 private:
167 T iterable;
168 };
169}
Definition Span.hpp:12
Definition Iterators.hpp:29