Functions: add move operations to CPPType

Those are sometimes needed when dealing with c++ types in a generic way.
This commit is contained in:
Jacques Lucke 2020-10-22 15:00:07 +02:00
parent 85f9d319a4
commit c7f518fe35
1 changed files with 136 additions and 0 deletions

View File

@ -91,6 +91,14 @@ class CPPType : NonCopyable, NonMovable {
using CopyToUninitializedNF = void (*)(const void *src, void *dst, int64_t n);
using CopyToUninitializedIndicesF = void (*)(const void *src, void *dst, IndexMask mask);
using MoveToInitializedF = void (*)(void *src, void *dst);
using MoveToInitializedNF = void (*)(void *src, void *dst, int64_t n);
using MoveToInitializedIndicesF = void (*)(void *src, void *dst, IndexMask mask);
using MoveToUninitializedF = void (*)(void *src, void *dst);
using MoveToUninitializedNF = void (*)(void *src, void *dst, int64_t n);
using MoveToUninitializedIndicesF = void (*)(void *src, void *dst, IndexMask mask);
using RelocateToInitializedF = void (*)(void *src, void *dst);
using RelocateToInitializedNF = void (*)(void *src, void *dst, int64_t n);
using RelocateToInitializedIndicesF = void (*)(void *src, void *dst, IndexMask mask);
@ -131,6 +139,14 @@ class CPPType : NonCopyable, NonMovable {
CopyToUninitializedNF copy_to_uninitialized_n_;
CopyToUninitializedIndicesF copy_to_uninitialized_indices_;
MoveToInitializedF move_to_initialized_;
MoveToInitializedNF move_to_initialized_n_;
MoveToInitializedIndicesF move_to_initialized_indices_;
MoveToUninitializedF move_to_uninitialized_;
MoveToUninitializedNF move_to_uninitialized_n_;
MoveToUninitializedIndicesF move_to_uninitialized_indices_;
RelocateToInitializedF relocate_to_initialized_;
RelocateToInitializedNF relocate_to_initialized_n_;
RelocateToInitializedIndicesF relocate_to_initialized_indices_;
@ -169,6 +185,12 @@ class CPPType : NonCopyable, NonMovable {
CopyToUninitializedF copy_to_uninitialized,
CopyToUninitializedNF copy_to_uninitialized_n,
CopyToUninitializedIndicesF copy_to_uninitialized_indices,
MoveToInitializedF move_to_initialized,
MoveToInitializedNF move_to_initialized_n,
MoveToInitializedIndicesF move_to_initialized_indices,
MoveToUninitializedF move_to_uninitialized,
MoveToUninitializedNF move_to_uninitialized_n,
MoveToUninitializedIndicesF move_to_uninitialized_indices,
RelocateToInitializedF relocate_to_initialized,
RelocateToInitializedNF relocate_to_initialized_n,
RelocateToInitializedIndicesF relocate_to_initialized_indices,
@ -198,6 +220,12 @@ class CPPType : NonCopyable, NonMovable {
copy_to_uninitialized_(copy_to_uninitialized),
copy_to_uninitialized_n_(copy_to_uninitialized_n),
copy_to_uninitialized_indices_(copy_to_uninitialized_indices),
move_to_initialized_(move_to_initialized),
move_to_initialized_n_(move_to_initialized_n),
move_to_initialized_indices_(move_to_initialized_indices),
move_to_uninitialized_(move_to_uninitialized),
move_to_uninitialized_n_(move_to_uninitialized_n),
move_to_uninitialized_indices_(move_to_uninitialized_indices),
relocate_to_initialized_(relocate_to_initialized),
relocate_to_initialized_n_(relocate_to_initialized_n),
relocate_to_initialized_indices_(relocate_to_initialized_indices),
@ -421,6 +449,76 @@ class CPPType : NonCopyable, NonMovable {
copy_to_uninitialized_indices_(src, dst, mask);
}
/**
* Move an instance of this type from src to dst.
*
* The memory pointed to by dst should be initialized.
*
* C++ equivalent:
* dst = std::move(src);
*/
void move_to_initialized(void *src, void *dst) const
{
BLI_assert(src != dst);
BLI_assert(this->pointer_can_point_to_instance(src));
BLI_assert(this->pointer_can_point_to_instance(dst));
move_to_initialized_(src, dst);
}
void move_to_initialized_n(void *src, void *dst, int64_t n) const
{
BLI_assert(n == 0 || src != dst);
BLI_assert(n == 0 || this->pointer_can_point_to_instance(src));
BLI_assert(n == 0 || this->pointer_can_point_to_instance(dst));
move_to_initialized_n_(src, dst, n);
}
void move_to_initialized_indices(void *src, void *dst, IndexMask mask) const
{
BLI_assert(mask.size() == 0 || src != dst);
BLI_assert(mask.size() == 0 || this->pointer_can_point_to_instance(src));
BLI_assert(mask.size() == 0 || this->pointer_can_point_to_instance(dst));
move_to_initialized_indices_(src, dst, mask);
}
/**
* Move an instance of this type from src to dst.
*
* The memory pointed to by dst should be uninitialized.
*
* C++ equivalent:
* new (dst) T(std::move(src));
*/
void move_to_uninitialized(void *src, void *dst) const
{
BLI_assert(src != dst);
BLI_assert(this->pointer_can_point_to_instance(src));
BLI_assert(this->pointer_can_point_to_instance(dst));
move_to_uninitialized_(src, dst);
}
void move_to_uninitialized_n(void *src, void *dst, int64_t n) const
{
BLI_assert(n == 0 || src != dst);
BLI_assert(n == 0 || this->pointer_can_point_to_instance(src));
BLI_assert(n == 0 || this->pointer_can_point_to_instance(dst));
move_to_uninitialized_n_(src, dst, n);
}
void move_to_uninitialized_indices(void *src, void *dst, IndexMask mask) const
{
BLI_assert(mask.size() == 0 || src != dst);
BLI_assert(mask.size() == 0 || this->pointer_can_point_to_instance(src));
BLI_assert(mask.size() == 0 || this->pointer_can_point_to_instance(dst));
move_to_uninitialized_indices_(src, dst, mask);
}
/**
* Relocates an instance of this type from src to dst. src will point to uninitialized memory
* afterwards.
@ -644,6 +742,38 @@ void copy_to_uninitialized_indices_cb(const void *src, void *dst, IndexMask mask
mask.foreach_index([&](int64_t i) { new (dst_ + i) T(src_[i]); });
}
template<typename T> void move_to_initialized_cb(void *src, void *dst)
{
blender::initialized_move_n(static_cast<T *>(src), 1, static_cast<T *>(dst));
}
template<typename T> void move_to_initialized_n_cb(void *src, void *dst, int64_t n)
{
blender::initialized_move_n(static_cast<T *>(src), n, static_cast<T *>(dst));
}
template<typename T> void move_to_initialized_indices_cb(void *src, void *dst, IndexMask mask)
{
T *src_ = static_cast<T *>(src);
T *dst_ = static_cast<T *>(dst);
mask.foreach_index([&](int64_t i) { dst_[i] = std::move(src_[i]); });
}
template<typename T> void move_to_uninitialized_cb(void *src, void *dst)
{
blender::uninitialized_move_n(static_cast<T *>(src), 1, static_cast<T *>(dst));
}
template<typename T> void move_to_uninitialized_n_cb(void *src, void *dst, int64_t n)
{
blender::uninitialized_move_n(static_cast<T *>(src), n, static_cast<T *>(dst));
}
template<typename T> void move_to_uninitialized_indices_cb(void *src, void *dst, IndexMask mask)
{
T *src_ = static_cast<T *>(src);
T *dst_ = static_cast<T *>(dst);
mask.foreach_index([&](int64_t i) { new (dst_ + i) T(std::move(src_[i])); });
}
template<typename T> void relocate_to_initialized_cb(void *src, void *dst)
{
T *src_ = static_cast<T *>(src);
@ -767,6 +897,12 @@ inline std::unique_ptr<const CPPType> create_cpp_type(StringRef name, const T &d
copy_to_uninitialized_cb<T>,
copy_to_uninitialized_n_cb<T>,
copy_to_uninitialized_indices_cb<T>,
move_to_initialized_cb<T>,
move_to_initialized_n_cb<T>,
move_to_initialized_indices_cb<T>,
move_to_uninitialized_cb<T>,
move_to_uninitialized_n_cb<T>,
move_to_uninitialized_indices_cb<T>,
relocate_to_initialized_cb<T>,
relocate_to_initialized_n_cb<T>,
relocate_to_initialized_indices_cb<T>,