Looks like no polymorphic map yet
This commit is contained in:
@@ -401,7 +401,7 @@ namespace Seele
|
||||
}
|
||||
void pop()
|
||||
{
|
||||
arraySize--;
|
||||
_data[arraySize--].~T();
|
||||
markIteratorDirty();
|
||||
}
|
||||
constexpr inline reference operator[](size_type index)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
#include "MinimalEngine.h"
|
||||
#include <memory_resource>
|
||||
|
||||
namespace Seele
|
||||
@@ -247,6 +246,29 @@ public:
|
||||
_size++;
|
||||
return insertedElement;
|
||||
}
|
||||
template<typename... args>
|
||||
constexpr reference emplace(args... arguments)
|
||||
{
|
||||
if (root == nullptr)
|
||||
{
|
||||
root = allocateNode();
|
||||
tail = root;
|
||||
}
|
||||
std::allocator_traits<NodeAllocator>::construct(allocator,
|
||||
tail,
|
||||
tail->prev,
|
||||
tail->next,
|
||||
arguments...);
|
||||
Node *newTail = allocateNode();
|
||||
newTail->prev = tail;
|
||||
newTail->next = nullptr;
|
||||
tail->next = newTail;
|
||||
Iterator insertedElement(tail);
|
||||
tail = newTail;
|
||||
markIteratorDirty();
|
||||
_size++;
|
||||
return insertedElement;
|
||||
}
|
||||
// front + popFront
|
||||
value_type&& retrieve()
|
||||
{
|
||||
@@ -275,7 +297,7 @@ public:
|
||||
{
|
||||
next->prev = prev;
|
||||
}
|
||||
delete pos.node;
|
||||
deallocateNode(pos.node);
|
||||
markIteratorDirty();
|
||||
return Iterator(next);
|
||||
}
|
||||
@@ -384,7 +406,7 @@ private:
|
||||
Iterator endIt;
|
||||
ConstIterator cbeginIt;
|
||||
ConstIterator cendIt;
|
||||
uint32 _size;
|
||||
size_type _size;
|
||||
NodeAllocator allocator;
|
||||
};
|
||||
} // namespace Seele
|
||||
+23
-26
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
#include <utility>
|
||||
#include "Array.h"
|
||||
#include "List.h"
|
||||
|
||||
namespace Seele
|
||||
{
|
||||
@@ -73,7 +73,7 @@ public:
|
||||
: node(x)
|
||||
{
|
||||
}
|
||||
IteratorBase(Node *x, Array<Node *> &&beginIt)
|
||||
IteratorBase(Node *x, List<Node *> &&beginIt)
|
||||
: node(x), traversal(std::move(beginIt))
|
||||
{
|
||||
}
|
||||
@@ -164,7 +164,7 @@ public:
|
||||
|
||||
private:
|
||||
Node *node;
|
||||
Array<Node *> traversal;
|
||||
List<Node *> traversal;
|
||||
};
|
||||
using Iterator = IteratorBase<Pair<K,V>>;
|
||||
using ConstIterator = IteratorBase<const Pair<K,V>>;
|
||||
@@ -189,7 +189,7 @@ public:
|
||||
: root(nullptr)
|
||||
, beginIt(nullptr)
|
||||
, endIt(nullptr)
|
||||
, iteratorsDirty(false)
|
||||
, iteratorsDirty(true)
|
||||
, _size(0)
|
||||
, comp(Compare())
|
||||
{
|
||||
@@ -200,7 +200,7 @@ public:
|
||||
, root(nullptr)
|
||||
, beginIt(nullptr)
|
||||
, endIt(nullptr)
|
||||
, iteratorsDirty(false)
|
||||
, iteratorsDirty(true)
|
||||
, _size(0)
|
||||
, comp(comp)
|
||||
{
|
||||
@@ -210,7 +210,7 @@ public:
|
||||
, root(nullptr)
|
||||
, beginIt(nullptr)
|
||||
, endIt(nullptr)
|
||||
, iteratorsDirty(false)
|
||||
, iteratorsDirty(true)
|
||||
, _size(0)
|
||||
, comp(Compare())
|
||||
{
|
||||
@@ -221,7 +221,7 @@ public:
|
||||
, comp(other.comp)
|
||||
{
|
||||
root = &nodeContainer[nodeContainer.indexOf(other.root)];
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
}
|
||||
Map(Map&& other)
|
||||
: nodeContainer(other.nodeContainer)
|
||||
@@ -229,7 +229,7 @@ public:
|
||||
, comp(std::move(other.comp))
|
||||
{
|
||||
root = &nodeContainer[nodeContainer.indexOf(other.root)];
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
}
|
||||
~Map()
|
||||
{
|
||||
@@ -242,7 +242,7 @@ public:
|
||||
root = &nodeContainer[nodeContainer.indexOf(other.root)];
|
||||
_size = other._size;
|
||||
comp = other.comp;
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
@@ -254,14 +254,14 @@ public:
|
||||
root = &nodeContainer[nodeContainer.indexOf(other.root)];
|
||||
_size = std::move(other._size);
|
||||
comp = std::move(other.comp);
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
inline mapped_type& operator[](const key_type& key)
|
||||
{
|
||||
root = splay(root, key);
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
if (root == nullptr || comp(root->pair.key, key) || comp(key, root->pair.key))
|
||||
{
|
||||
root = insert(root, key);
|
||||
@@ -272,7 +272,7 @@ public:
|
||||
inline mapped_type& operator[](key_type&& key)
|
||||
{
|
||||
root = splay(root, std::move(key));
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
if (root == nullptr || comp(root->pair.key, key) || comp(key, root->pair.key))
|
||||
{
|
||||
root = insert(root, std::move(key));
|
||||
@@ -283,7 +283,7 @@ public:
|
||||
iterator find(const key_type& key)
|
||||
{
|
||||
root = splay(root, key);
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
if (root == nullptr || comp(root->pair.key, key) || comp(key, root->pair.key))
|
||||
{
|
||||
return endIt;
|
||||
@@ -293,7 +293,7 @@ public:
|
||||
iterator find(key_type&& key)
|
||||
{
|
||||
root = splay(root, std::move(key));
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
if (root == nullptr || comp(root->pair.key, key) || comp(key, root->pair.key))
|
||||
{
|
||||
return endIt;
|
||||
@@ -303,13 +303,13 @@ public:
|
||||
iterator erase(const key_type& key)
|
||||
{
|
||||
root = remove(root, key);
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
return iterator(root);
|
||||
}
|
||||
iterator erase(K&& key)
|
||||
{
|
||||
root = remove(root, std::move(key));
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
return iterator(root);
|
||||
}
|
||||
void clear()
|
||||
@@ -317,7 +317,7 @@ public:
|
||||
nodeContainer.clear();
|
||||
root = nullptr;
|
||||
_size = 0;
|
||||
refreshIterators();
|
||||
markIteratorDirty();
|
||||
}
|
||||
bool exists(key_type&& key)
|
||||
{
|
||||
@@ -384,14 +384,13 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
Array<Node *> beginTraversal;
|
||||
List<Node *> beginTraversal;
|
||||
while (beginNode != nullptr)
|
||||
{
|
||||
beginTraversal.add(beginNode);
|
||||
beginNode = beginNode->leftChild;
|
||||
}
|
||||
beginNode = beginTraversal.back();
|
||||
beginTraversal.pop();
|
||||
beginNode = beginTraversal.retrieve();
|
||||
return Iterator(beginNode, std::move(beginTraversal));
|
||||
}
|
||||
}
|
||||
@@ -404,7 +403,7 @@ private:
|
||||
}
|
||||
else
|
||||
{
|
||||
Array<Node *> endTraversal;
|
||||
List<Node *> endTraversal;
|
||||
while (endNode != nullptr)
|
||||
{
|
||||
endTraversal.add(endNode);
|
||||
@@ -413,12 +412,12 @@ private:
|
||||
return Iterator(endNode, std::move(endTraversal));
|
||||
}
|
||||
}
|
||||
Array<Node, NodeAlloc> nodeContainer;
|
||||
List<Node, NodeAlloc> nodeContainer;
|
||||
Node *root;
|
||||
Iterator beginIt;
|
||||
Iterator endIt;
|
||||
bool iteratorsDirty;
|
||||
uint32 _size;
|
||||
size_type _size;
|
||||
Compare comp;
|
||||
Node *rotateRight(Node *node)
|
||||
{
|
||||
@@ -486,10 +485,8 @@ private:
|
||||
r = splay(r->leftChild, key);
|
||||
r->rightChild = temp->rightChild;
|
||||
}
|
||||
temp->leftChild = nullptr;
|
||||
temp->rightChild = nullptr;
|
||||
nodeContainer.remove(nodeContainer.find(*temp));
|
||||
_size--;
|
||||
delete temp;
|
||||
return r;
|
||||
}
|
||||
template<class KeyType>
|
||||
|
||||
@@ -54,7 +54,8 @@ ShaderBuffer::ShaderBuffer(PGraphics graphics, uint32 size, VkBufferUsageFlags u
|
||||
vkCreateBuffer(graphics->getDevice(), &info, nullptr, &buffers[i].buffer);
|
||||
bufferReqInfo.buffer = buffers[i].buffer;
|
||||
vkGetBufferMemoryRequirements2(graphics->getDevice(), &bufferReqInfo, &memRequirements);
|
||||
buffers[i].allocation = graphics->getAllocator()->allocate(memRequirements, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, buffers[i].buffer);
|
||||
auto temp = graphics->getAllocator()->allocate(memRequirements, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, buffers[i].buffer);
|
||||
buffers[i].allocation = temp;
|
||||
vkBindBufferMemory(graphics->getDevice(), buffers[i].buffer, buffers[i].allocation->getHandle(), buffers[i].allocation->getOffset());
|
||||
}
|
||||
}
|
||||
|
||||
+25
-22
@@ -29,14 +29,16 @@ extern Seele::Map<void *, void *> registeredObjects;
|
||||
extern std::mutex registeredObjectsLock;
|
||||
namespace Seele
|
||||
{
|
||||
template <typename T>
|
||||
template <typename T, typename Deleter>
|
||||
class RefPtr;
|
||||
template <typename T>
|
||||
template <typename T, typename Deleter>
|
||||
class RefObject
|
||||
{
|
||||
public:
|
||||
RefObject(T *ptr)
|
||||
: handle(ptr), refCount(1)
|
||||
RefObject(T *ptr, Deleter&& deleter)
|
||||
: handle(ptr)
|
||||
, deleter(std::move(deleter))
|
||||
, refCount(1)
|
||||
{
|
||||
registeredObjects[ptr] = this;
|
||||
}
|
||||
@@ -55,7 +57,7 @@ public:
|
||||
registeredObjects.erase(handle);
|
||||
}
|
||||
// #pragma warning( disable: 4150)
|
||||
delete handle;
|
||||
//deleter(handle);
|
||||
// #pragma warning( default: 4150)
|
||||
}
|
||||
RefObject &operator=(const RefObject &rhs)
|
||||
@@ -108,11 +110,12 @@ public:
|
||||
}
|
||||
private:
|
||||
T *handle;
|
||||
Deleter deleter;
|
||||
std::atomic_uint64_t refCount;
|
||||
friend class RefPtr<T>;
|
||||
friend class RefPtr<T, Deleter>;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
template <typename T, typename Deleter = std::default_delete<T>>
|
||||
class RefPtr
|
||||
{
|
||||
public:
|
||||
@@ -124,7 +127,7 @@ public:
|
||||
{
|
||||
object = nullptr;
|
||||
}
|
||||
RefPtr(T *ptr)
|
||||
RefPtr(T *ptr, Deleter deleter = Deleter())
|
||||
{
|
||||
std::unique_lock l(registeredObjectsLock);
|
||||
auto registeredObj = registeredObjects.find(ptr);
|
||||
@@ -132,17 +135,17 @@ public:
|
||||
auto registeredEnd = registeredObjects.end();
|
||||
if (registeredObj == registeredEnd)
|
||||
{
|
||||
object = new RefObject<T>(ptr);
|
||||
object = new RefObject<T, Deleter>(ptr, std::move(deleter));
|
||||
l.unlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
l.unlock();
|
||||
object = (RefObject<T> *)registeredObj->value;
|
||||
object = (RefObject<T, Deleter> *)registeredObj->value;
|
||||
object->addRef();
|
||||
}
|
||||
}
|
||||
explicit RefPtr(RefObject<T> *other)
|
||||
explicit RefPtr(RefObject<T, Deleter> *other)
|
||||
: object(other)
|
||||
{
|
||||
object->addRef();
|
||||
@@ -166,12 +169,12 @@ public:
|
||||
{
|
||||
F *f = other.getObject()->getHandle();
|
||||
assert(static_cast<T *>(f));
|
||||
object = (RefObject<T> *)other.getObject();
|
||||
object = (RefObject<T, Deleter> *)other.getObject();
|
||||
object->addRef();
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
RefPtr<F> cast()
|
||||
template <typename F, typename DeleterF = std::default_delete<F>>
|
||||
RefPtr<F, DeleterF> cast()
|
||||
{
|
||||
T *t = object->getHandle();
|
||||
F *f = dynamic_cast<F *>(t);
|
||||
@@ -179,12 +182,12 @@ public:
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
RefObject<F> *newObject = (RefObject<F> *)object;
|
||||
return RefPtr<F>(newObject);
|
||||
RefObject<F, DeleterF> *newObject = (RefObject<F, DeleterF> *)object;
|
||||
return RefPtr<F, DeleterF>(newObject);
|
||||
}
|
||||
|
||||
template <typename F>
|
||||
const RefPtr<F> cast() const
|
||||
template <typename F, typename DeleterF = std::default_delete<F>>
|
||||
const RefPtr<F, DeleterF> cast() const
|
||||
{
|
||||
T *t = object->getHandle();
|
||||
F *f = dynamic_cast<F *>(t);
|
||||
@@ -192,8 +195,8 @@ public:
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
RefObject<F> *newObject = (RefObject<F> *)object;
|
||||
return RefPtr<F>(newObject);
|
||||
RefObject<F, DeleterF> *newObject = (RefObject<F, DeleterF> *)object;
|
||||
return RefPtr<F, DeleterF>(newObject);
|
||||
}
|
||||
|
||||
RefPtr &operator=(const RefPtr &other)
|
||||
@@ -254,7 +257,7 @@ public:
|
||||
assert(object != nullptr);
|
||||
return object->handle;
|
||||
}
|
||||
RefObject<T> *getObject() const
|
||||
RefObject<T, Deleter> *getObject() const
|
||||
{
|
||||
return object;
|
||||
}
|
||||
@@ -268,7 +271,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
RefObject<T> *object;
|
||||
RefObject<T, Deleter> *object;
|
||||
friend class boost::serialization::access;
|
||||
template<class Archive>
|
||||
void serialize(Archive& ar, const unsigned int)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
#include <thread>
|
||||
#include "MinimalEngine.h"
|
||||
#include "Containers/List.h"
|
||||
|
||||
namespace Seele
|
||||
|
||||
Reference in New Issue
Block a user