diff options
author | Jacques Lucke <jacques@blender.org> | 2022-03-19 10:26:29 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2022-03-19 10:26:29 +0300 |
commit | 3e16f3b3ef4b8f385b30fe4a1e00860620f610ee (patch) | |
tree | cea8e2a3ea8a8a7dbce98263d166b4782d83721b /source/blender/functions/FN_generic_value_map.hh | |
parent | c655146b87fe20853e52b87991b46732a04d749e (diff) |
BLI: move generic data structures to blenlib
This is a follow up to rB2252bc6a5527cd7360d1ccfe7a2d1bc640a8dfa6.
Diffstat (limited to 'source/blender/functions/FN_generic_value_map.hh')
-rw-r--r-- | source/blender/functions/FN_generic_value_map.hh | 112 |
1 files changed, 0 insertions, 112 deletions
diff --git a/source/blender/functions/FN_generic_value_map.hh b/source/blender/functions/FN_generic_value_map.hh deleted file mode 100644 index 3807ada1c3c..00000000000 --- a/source/blender/functions/FN_generic_value_map.hh +++ /dev/null @@ -1,112 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "BLI_linear_allocator.hh" -#include "BLI_map.hh" - -#include "FN_generic_pointer.hh" - -namespace blender::fn { - -/** - * This is a map that stores key-value-pairs. What makes it special is that the type of values does - * not have to be known at compile time. There just has to be a corresponding CPPType. - */ -template<typename Key> class GValueMap { - private: - /* Used to allocate values owned by this container. */ - LinearAllocator<> &allocator_; - Map<Key, GMutablePointer> values_; - - public: - GValueMap(LinearAllocator<> &allocator) : allocator_(allocator) - { - } - - ~GValueMap() - { - /* Destruct all values that are still in the map. */ - for (GMutablePointer value : values_.values()) { - value.destruct(); - } - } - - /* Add a value to the container. The container becomes responsible for destructing the value that - * is passed in. The caller remains responsible for freeing the value after it has been - * destructed. */ - template<typename ForwardKey> void add_new_direct(ForwardKey &&key, GMutablePointer value) - { - values_.add_new_as(std::forward<ForwardKey>(key), value); - } - - /* Add a value to the container that is move constructed from the given value. The caller remains - * responsible for destructing and freeing the given value. */ - template<typename ForwardKey> void add_new_by_move(ForwardKey &&key, GMutablePointer value) - { - const CPPType &type = *value.type(); - void *buffer = allocator_.allocate(type.size(), type.alignment()); - type.move_construct(value.get(), buffer); - values_.add_new_as(std::forward<ForwardKey>(key), GMutablePointer{type, buffer}); - } - - /* Add a value to the container that is copy constructed from the given value. The caller remains - * responsible for destructing and freeing the given value. */ - template<typename ForwardKey> void add_new_by_copy(ForwardKey &&key, GPointer value) - { - const CPPType &type = *value.type(); - void *buffer = allocator_.allocate(type.size(), type.alignment()); - type.copy_construct(value.get(), buffer); - values_.add_new_as(std::forward<ForwardKey>(key), GMutablePointer{type, buffer}); - } - - /* Add a value to the container. */ - template<typename ForwardKey, typename T> void add_new(ForwardKey &&key, T &&value) - { - if constexpr (std::is_rvalue_reference_v<T>) { - this->add_new_by_move(std::forward<ForwardKey>(key), &value); - } - else { - this->add_new_by_copy(std::forward<ForwardKey>(key), &value); - } - } - - /* Remove the value for the given name from the container and remove it. The caller is - * responsible for freeing it. The lifetime of the referenced memory might be bound to lifetime - * of the container. */ - template<typename ForwardKey> GMutablePointer extract(const ForwardKey &key) - { - return values_.pop_as(key); - } - - template<typename ForwardKey> GPointer lookup(const ForwardKey &key) const - { - return values_.lookup_as(key); - } - - /* Remove the value for the given name from the container and remove it. */ - template<typename T, typename ForwardKey> T extract(const ForwardKey &key) - { - GMutablePointer value = values_.pop_as(key); - const CPPType &type = *value.type(); - BLI_assert(type.is<T>()); - T return_value; - type.relocate_assign(value.get(), &return_value); - return return_value; - } - - template<typename T, typename ForwardKey> const T &lookup(const ForwardKey &key) const - { - GMutablePointer value = values_.lookup_as(key); - BLI_assert(value.is_type<T>()); - BLI_assert(value.get() != nullptr); - return *(const T *)value.get(); - } - - template<typename ForwardKey> bool contains(const ForwardKey &key) const - { - return values_.contains_as(key); - } -}; - -} // namespace blender::fn |