Foundation
Loading...
Searching...
No Matches
Container.hpp
Go to the documentation of this file.
1#pragma once
2#include <array>
3#include <bitset>
4#include <list>
5#include <map>
6#include <numeric>
7#include <optional>
8#include <queue>
9#include <set>
10#include <span>
11#include <string>
12#include <string_view>
13#include <vector>
14
15#include "Allocator.hpp"
16namespace Foundation::Core {
17
18 /* -- STL Value types -- */
19
23 template<typename T>
24 using Optional = std::optional<T>;
25
29 template <typename First, typename Second>
30 using Pair = std::pair<First, Second>;
31
35 template<typename ...Args>
36 using Tuple = std::tuple<Args...>;
37
41 template<typename T, size_t Size>
42 using Array = std::array<T, Size>;
43
47 template<size_t Size>
48 using Bitset = std::bitset<Size>;
49
53 using StringView = std::basic_string_view<char>;
54
58 template<typename T>
59 class Span : public std::span<T> {
60 public:
61 using std::span<T>::span;
62 Span() = default;
66 template<typename U> requires
67 (sizeof(std::remove_reference<T>) == sizeof(std::remove_reference<U>) &&
68 std::is_convertible_v<U*, T*>)
69 Span(U* data, size_t size) : std::span<T>(static_cast<T*>(data), size) {}
70
74
78 template<typename U, size_t Size>
79 Span(U(&array)[Size]) : Span(array, Size) {}
80
84 template<typename U>
85 requires requires (U a) { a.data(); a.size(); }
86 Span(U& array) : Span(array.data(), array.size())
87 {}
88
92 template<typename U> requires std::is_convertible_v<U*, T*>
93 Span(U& item) : Span(&item, 1) {}
94
99 return Span<const char>{ reinterpret_cast<const char*>(this->data()), this->size_bytes() };
100 }
101 };
109 template <typename T, typename ...Args>
110 Span<T> ConstructSpan(Allocator* resource, size_t size, Args&& ...args) {
111 T* data = static_cast<T*>(resource->Allocate(size * sizeof(T), alignof(T)));
112 if constexpr (!std::is_trivially_constructible_v<T> || sizeof...(Args) > 0)
113 {
114 for (size_t i = 0; i < size; i++)
115 std::construct_at(&data[i], std::forward<Args>(args)...);
116 }
117 return Span<T>(data, size);
118 }
123 template<typename T>
124 void DestructSpan(Allocator* resource, Span<T> span) {
125 if constexpr (!std::is_trivially_destructible_v<T>)
126 {
127 for (T& item : span)
128 std::destroy_at(&item);
129 }
130 resource->Deallocate(span.data(), span.size() * sizeof(T));
131 }
132 /* -- STL Containers -- */
133
141 using String = std::basic_string<char>;
149 using StringAlloc = std::basic_string<char, std::char_traits<char>, StlAllocator<char>>;
150
158 template<typename T>
159 using Vector = std::vector<T, StlAllocator<T>>;
160
168 template<typename T, typename Predicate = std::less<T>>
169 using Set = std::set<T, Predicate, StlAllocator<T>>;
177 template<typename K, typename V, typename Predicate = std::less<K>>
178 using Map = std::map<K, V, Predicate, StlAllocator<Pair<const K, V>>>;
186 template<typename T>
187 using Deque = std::deque<T, StlAllocator<T>>;
195 template<typename T>
196 using List = std::list<T, StlAllocator<T>>;
204 template<typename T, typename Container = Deque<T>>
205 using Queue = std::queue<T, Container>;
213 template<typename T, typename Predicate = std::less<T>, typename Container = Vector<T>>
214 using PriorityQueue = std::priority_queue<T, Container, Predicate>;
215}
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
virtual void Deallocate(pointer ptr, size_type size)=0
virtual pointer Allocate(size_type size, size_t alignment=alignof(std::max_align_t))=0
std::span with relaxed constructors for pointer-aliasing types and common containers.
Definition Container.hpp:59
Span(U(&array)[Size])
Relaxed ctor for C-style arrays.
Definition Container.hpp:79
Span(U &item)
Shorthand for single l-value item.
Definition Container.hpp:93
Span< const char > AsBytes() const
Provides casting to a byte-level view of the underlying data.
Definition Container.hpp:98
Span(U *data, size_t size)
Relaxed ctor for pointer-aliasing types.
Definition Container.hpp:69
Span(U &array)
Relaxed ctor for contiguous STL containers.
Definition Container.hpp:86
Allocators, Data Structures and introspection implementations.
Definition Allocator.hpp:5
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:159
std::basic_string< char > String
Alias for std::basic_string<char>, without an explicit allocator constructor.
Definition Container.hpp:141
std::tuple< Args... > Tuple
Alias for std::tuple
Definition Container.hpp:36
std::queue< T, Container > Queue
std::queue with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:205
std::basic_string< char, std::char_traits< char >, StlAllocator< char > > StringAlloc
std::basic_string<char> with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
void DestructSpan(Allocator *resource, Span< T > span)
Convenience function for destructing a Span allocated with ConstructSpan. Calls destructors in-place ...
Definition Container.hpp:124
std::pair< First, Second > Pair
Alias for std::pair
Definition Container.hpp:30
std::set< T, Predicate, StlAllocator< T > > Set
std::set with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:169
std::map< K, V, Predicate, StlAllocator< Pair< const K, V > > > Map
std::map with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:178
std::list< T, StlAllocator< T > > List
std::list with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:196
std::bitset< Size > Bitset
Alias for std::bitset
Definition Container.hpp:48
Span< T > ConstructSpan(Allocator *resource, size_t size, Args &&...args)
Convenience function for constructing a Span with memory allocated from a Foundation::Core::Allocator...
Definition Container.hpp:110
std::priority_queue< T, Container, Predicate > PriorityQueue
std::priority_queue with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:214
std::array< T, Size > Array
Alias for std::array
Definition Container.hpp:42
std::basic_string_view< char > StringView
Alias for std::basic_string_view<char>
Definition Container.hpp:53
std::optional< T > Optional
Alias for std::optional
Definition Container.hpp:24
std::deque< T, StlAllocator< T > > Deque
std::deque with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:187
std::unique_ptr< T, StlDeleter< T > > UniquePtr
std::unique_ptr with custom deleter that uses a Foundation::Core::Allocator to deallocate memory.
Definition Allocator.hpp:161