Skip to content

Commit dde7da6

Browse files
committed
Add allocator template param
1 parent bc210b7 commit dde7da6

3 files changed

Lines changed: 35 additions & 24 deletions

File tree

Code/max/Containers/SlotMap.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <algorithm>
99
#include <concepts>
10+
#include <memory>
1011
#include <utility>
1112
#include <vector>
1213

@@ -27,7 +28,7 @@ namespace Containers
2728
// Access: O(1)
2829
// Removal: O(1)
2930
// *Unless the BackingType requires reallocation. Then it is O(1) amortized.
30-
template<typename T, std::integral HandleType = size_t, template <typename T2> typename BackingType = std::vector>
31+
template<typename T, std::integral HandleType = size_t, template <typename T2, typename Allocator = std::allocator<T2>> typename BackingType = std::vector>
3132
class SlotMap {
3233
public:
3334

@@ -87,11 +88,11 @@ namespace Containers
8788

8889
void remove_by_index(size_t index) noexcept;
8990

90-
template<typename T3, std::integral HandleType2, template <typename T4> typename BackingType2>
91+
template<typename T3, std::integral HandleType2, template <typename T4, typename Allocator> typename BackingType2>
9192
friend bool operator ==(const SlotMap<T3, HandleType2, BackingType2>& lhs, const SlotMap<T3, HandleType2, BackingType2>& rhs) noexcept;
92-
template<typename T3, std::integral HandleType2, template <typename T4> typename BackingType2>
93+
template<typename T3, std::integral HandleType2, template <typename T4, typename Allocator> typename BackingType2>
9394
friend bool operator !=(const SlotMap<T3, HandleType2, BackingType2>& lhs, const SlotMap<T3, HandleType2, BackingType2>& rhs) noexcept;
94-
template<typename T3, std::integral HandleType2, template <typename T4> typename BackingType2>
95+
template<typename T3, std::integral HandleType2, template <typename T4, typename Allocator> typename BackingType2>
9596
friend void swap(SlotMap<T3, HandleType2, BackingType2>& lhs, SlotMap<T3, HandleType2, BackingType2>& rhs) noexcept;
9697

9798
};

Code/max/Containers/SlotMap.inl

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace v0
1414
namespace Containers
1515
{
1616

17-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
17+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
1818
HandleType SlotMap<T, HandleType, BackingType>::push_back(T element) noexcept {
1919
const auto data_size = data_.size();
2020
data_.push_back(std::move(element));
@@ -36,84 +36,84 @@ namespace Containers
3636
}
3737
}
3838

39-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
39+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
4040
template<class ...Args>
4141
HandleType SlotMap<T, HandleType, BackingType>::emplace_back(Args&&... args) noexcept {
4242
// TODO: constructing the element then moving it to push_back() really defeats the purpose of an emplace_back.
4343
// Do this correctly.
4444
return push_back(T{ std::forward<Args>(args)... });
4545
}
4646

47-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
47+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
4848
typename SlotMap<T, HandleType, BackingType>::reference SlotMap<T, HandleType, BackingType>::operator[](HandleType handle) noexcept {
4949
// Assumes |handle| is within range.
5050

5151
const auto index = indices_[handle];
5252
return data_[index];
5353
}
5454

55-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
55+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
5656
typename SlotMap<T, HandleType, BackingType>::const_reference SlotMap<T, HandleType, BackingType>::operator[](HandleType handle) const noexcept {
5757
// Assumes |handle| is within range.
5858

5959
const auto index = indices_[handle];
6060
return data_[index];
6161
}
6262

63-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
63+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
6464
void SlotMap<T, HandleType, BackingType>::remove(HandleType handle) noexcept {
6565
remove_by_index(indices_[handle]);
6666
}
6767

68-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
68+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
6969
void SlotMap<T, HandleType, BackingType>::pop_back() noexcept {
7070
remove_by_index(data_.size() - 1);
7171
}
7272

7373

7474

7575
// Required to satisfy the C++ "Container" requirements
76-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
76+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
7777
typename SlotMap<T, HandleType, BackingType>::iterator SlotMap<T, HandleType, BackingType>::begin() noexcept {
7878
return data_.begin();
7979
}
8080

81-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
81+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
8282
typename SlotMap<T, HandleType, BackingType>::const_iterator SlotMap<T, HandleType, BackingType>::begin() const noexcept {
8383
return data_.begin();
8484
}
8585

86-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
86+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
8787
typename SlotMap<T, HandleType, BackingType>::const_iterator SlotMap<T, HandleType, BackingType>::cbegin() const noexcept {
8888
return data_.begin();
8989
}
9090

91-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
91+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
9292
typename SlotMap<T, HandleType, BackingType>::iterator SlotMap<T, HandleType, BackingType>::end() noexcept {
9393
return data_.end();
9494
}
9595

96-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
96+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
9797
typename SlotMap<T, HandleType, BackingType>::const_iterator SlotMap<T, HandleType, BackingType>::end() const noexcept {
9898
return data_.end();
9999
}
100100

101-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
101+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
102102
typename SlotMap<T, HandleType, BackingType>::const_iterator SlotMap<T, HandleType, BackingType>::cend() noexcept {
103103
return data_.end();
104104
}
105105

106-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
106+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
107107
typename SlotMap<T, HandleType, BackingType>::size_type SlotMap<T, HandleType, BackingType>::size() const noexcept {
108108
return data_.size();
109109
}
110110

111-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
111+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
112112
constexpr typename SlotMap<T, HandleType, BackingType>::size_type SlotMap<T, HandleType, BackingType>::max_size() const noexcept {
113113
return data_.max_size();
114114
}
115115

116-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
116+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
117117
void SlotMap<T, HandleType, BackingType>::remove_by_index(size_t index) noexcept {
118118
// Removing an element in the middle of a vector will cause all elements after it to shift over.
119119
// Removing the final element does not have this effect.
@@ -143,19 +143,19 @@ namespace Containers
143143
indices_[reverse_index] = index;
144144
}
145145

146-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
146+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
147147
bool operator ==(const SlotMap<T, HandleType, BackingType>& lhs, const SlotMap<T, HandleType, BackingType>& rhs) noexcept {
148148
return lhs.indices_ == rhs.indices_ &&
149149
lhs.data_ == rhs.data_ &&
150150
lhs.reverse_indices_ == rhs.reverse_indices_;
151151
}
152152

153-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
153+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
154154
bool operator !=(const SlotMap<T, HandleType, BackingType>& lhs, const SlotMap<T, HandleType, BackingType>& rhs) noexcept {
155155
return !(lhs == rhs);
156156
}
157157

158-
template<typename T, std::integral HandleType, template <typename T2> typename BackingType>
158+
template<typename T, std::integral HandleType, template <typename T2, typename Allocator> typename BackingType>
159159
void swap(SlotMap<T, HandleType, BackingType>& lhs, SlotMap<T, HandleType, BackingType>& rhs) noexcept {
160160
using std::swap;
161161

Projects/VisualStudio/max/max.vcxproj

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,12 @@
149149
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
150150
</ClInclude>
151151
<ClInclude Include="..\..\..\Code\max\Containers\SlotMap.hpp" />
152-
<ClInclude Include="..\..\..\Code\max\Containers\SlotMapTest.hpp" />
152+
<ClInclude Include="..\..\..\Code\max\Containers\SlotMapTest.hpp">
153+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
154+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
155+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
156+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
157+
</ClInclude>
153158
<ClInclude Include="..\..\..\Code\max\Containers\StateMachine\AnythingMatcher.hpp" />
154159
<ClInclude Include="..\..\..\Code\max\Containers\StateMachine\AnythingMatcherTest.hpp">
155160
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
@@ -321,7 +326,12 @@
321326
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
322327
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
323328
</ClCompile>
324-
<ClCompile Include="..\..\..\Code\max\Containers\SlotMapTest.cpp" />
329+
<ClCompile Include="..\..\..\Code\max\Containers\SlotMapTest.cpp">
330+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
331+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
332+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
333+
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
334+
</ClCompile>
325335
<ClCompile Include="..\..\..\Code\max\Containers\StateMachine\AnythingMatcherTest.cpp">
326336
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
327337
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>

0 commit comments

Comments
 (0)