diff --git a/Juliet/Juliet.vcxproj b/Juliet/Juliet.vcxproj
index 3ee2bbb..1a25475 100644
--- a/Juliet/Juliet.vcxproj
+++ b/Juliet/Juliet.vcxproj
@@ -220,6 +220,7 @@
+
{ab9c7e88-6c94-4f93-bc2a-7f5284b7d434}
diff --git a/Juliet/include/Core/Common/CoreTypes.h b/Juliet/include/Core/Common/CoreTypes.h
index 7aeccc0..b93bb99 100644
--- a/Juliet/include/Core/Common/CoreTypes.h
+++ b/Juliet/include/Core/Common/CoreTypes.h
@@ -16,7 +16,8 @@ using int64 = int64_t;
using Byte = std::byte;
-using size_t = std::size_t;
+using size_t = std::size_t;
+using index_t = size_t;
struct ByteBuffer
{
diff --git a/Juliet/include/Core/Common/CoreUtils.h b/Juliet/include/Core/Common/CoreUtils.h
index caefd05..58edf80 100644
--- a/Juliet/include/Core/Common/CoreUtils.h
+++ b/Juliet/include/Core/Common/CoreUtils.h
@@ -69,6 +69,8 @@ namespace Juliet
}
}
+#define Restrict __restrict
+
template
class DeferredFunction
{
@@ -115,6 +117,13 @@ namespace Juliet
return (x + alignment - 1) & ~(alignment - 1);
}
+ inline void Swap(auto* Restrict& a, auto* Restrict& b)
+ {
+ auto* temp = a;
+ a = b;
+ b = temp;
+ }
+
// Move to another file dedicated to those
#if defined(__clang__)
#define COMPILER_CLANG 1
diff --git a/Juliet/include/Core/Common/NonNullPtr.h b/Juliet/include/Core/Common/NonNullPtr.h
index bc6a7b6..36bdc31 100644
--- a/Juliet/include/Core/Common/NonNullPtr.h
+++ b/Juliet/include/Core/Common/NonNullPtr.h
@@ -107,5 +107,5 @@ namespace Juliet
};
template
- NonNullPtr(T) -> NonNullPtr;
+ NonNullPtr(T*) -> NonNullPtr;
} // namespace Juliet
diff --git a/Juliet/include/Core/Container/Vector.h b/Juliet/include/Core/Container/Vector.h
index de44b51..f542b5d 100644
--- a/Juliet/include/Core/Container/Vector.h
+++ b/Juliet/include/Core/Container/Vector.h
@@ -1,9 +1,78 @@
#pragma once
+#include
+#include
#include
+#include
namespace Juliet
{
+ template
+ struct VectorArena
+ {
+ VectorArena()
+ : First(nullptr)
+ , Count(0)
+ , Stride(sizeof(Type))
+ {
+ Arena = ArenaAllocate();
+ }
+
+ ~VectorArena() { ArenaRelease(Arena); }
+
+ void PushBack(Type&& value)
+ {
+ Type* entry = ArenaPushStruct(Arena);
+ *entry = std::move(value);
+
+ if (Count == 0)
+ {
+ First = entry;
+ }
+ Last = entry;
+
+ ++Count;
+ }
+
+ void RemoveAtFast(index_t index)
+ {
+ Assert(index < Count);
+ Assert(Count > 0);
+
+ Type* baseAdr = First;
+ Type* elementAdr = First + index;
+
+ // Swap Last and element
+ Swap(Last, elementAdr);
+ --Count;
+ }
+
+ void Clear()
+ {
+ ArenaClear(Arena);
+ Count = 0;
+ }
+
+ // C++ Accessors for loop supports and Index based access
+ Type& operator[](size_t index) { return First[index]; }
+ const Type& operator[](size_t index) const { return First[index]; }
+
+ Type* begin() { return First; }
+ Type* end() { return First + Count; }
+
+ const Type* begin() const { return First; }
+ const Type* end() const { return First + Count; }
+
+ size_t Size() const { return Count; }
+
+ private:
+ Arena* Arena;
+ Type* First;
+ Type* Last;
+ size_t Count;
+ size_t Stride;
+ };
+
// TODO : Create my own Vector class based on https://github.com/niklas-ourmachinery/bitsquid-foundation/blob/master/collection_types.h
template
class Vector : public std::vector
diff --git a/Juliet/include/Core/Memory/MemoryArena.h b/Juliet/include/Core/Memory/MemoryArena.h
index 4d5dd4d..7f29ed1 100644
--- a/Juliet/include/Core/Memory/MemoryArena.h
+++ b/Juliet/include/Core/Memory/MemoryArena.h
@@ -21,7 +21,6 @@ namespace Juliet
uint64 BasePosition;
uint64 Position;
- uint64 Capacity;
uint64 Alignment;
uint64 CommitSize;
diff --git a/Juliet/src/Core/Container/Vector.cpp b/Juliet/src/Core/Container/Vector.cpp
new file mode 100644
index 0000000..fd6b3a7
--- /dev/null
+++ b/Juliet/src/Core/Container/Vector.cpp
@@ -0,0 +1,5 @@
+#include
+
+namespace Juliet
+{
+}