[Bf-blender-cvs] [bd56ee7a789] functions: cleanup cpp type extension
Jacques Lucke
noreply at git.blender.org
Mon Aug 5 16:35:33 CEST 2019
Commit: bd56ee7a78931a4c46727d39d1483e3dc36b5472
Author: Jacques Lucke
Date: Mon Aug 5 15:51:05 2019 +0200
Branches: functions
https://developer.blender.org/rBbd56ee7a78931a4c46727d39d1483e3dc36b5472
cleanup cpp type extension
===================================================================
M source/blender/functions/backends/tuple/cpp_types.hpp
M source/blender/functions/backends/tuple/tuple.hpp
M source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
===================================================================
diff --git a/source/blender/functions/backends/tuple/cpp_types.hpp b/source/blender/functions/backends/tuple/cpp_types.hpp
index 511aa8708c8..b5c2decfefc 100644
--- a/source/blender/functions/backends/tuple/cpp_types.hpp
+++ b/source/blender/functions/backends/tuple/cpp_types.hpp
@@ -13,9 +13,21 @@
namespace FN {
class CPPTypeInfo : public TypeExtension {
+ private:
+ uint m_size;
+ uint m_alignment;
+ bool m_is_trivially_destructible;
+
public:
static const uint TYPE_EXTENSION_ID = 0;
+ CPPTypeInfo(uint size, uint alignment, bool is_trivially_destructible)
+ : m_size(size),
+ m_alignment(alignment),
+ m_is_trivially_destructible(is_trivially_destructible)
+ {
+ }
+
virtual ~CPPTypeInfo()
{
}
@@ -23,110 +35,165 @@ class CPPTypeInfo : public TypeExtension {
/**
* Get the size of the type in bytes.
*/
- virtual uint size() const = 0;
+ uint size() const
+ {
+ return m_size;
+ }
/**
* Get the alignment requirements for this type.
*/
- virtual uint alignment() const = 0;
+ uint alignment() const
+ {
+ return m_alignment;
+ }
+
+ /**
+ * Return true when the type can be destructed without doing anything. Otherwise false.
+ * This is just a hint to improve performance in some cases.
+ */
+ bool trivially_destructible() const
+ {
+ return m_is_trivially_destructible;
+ }
/**
* Construct a default version of that type at the given pointer.
*/
virtual void construct_default(void *ptr) const = 0;
+ virtual void construct_default_n(void *ptr, uint n) const = 0;
/**
* Destruct the value at the given pointer.
*/
- virtual void destruct_type(void *ptr) const = 0;
+ virtual void destruct(void *ptr) const = 0;
+ virtual void destruct_n(void *ptr, uint n) const = 0;
/**
* Copy the value from src to dst. The destination buffer already contains another instance of
* the same type which should be overriden.
*/
virtual void copy_to_initialized(void *src, void *dst) const = 0;
+ virtual void copy_to_initialized_n(void *src, void *dst, uint n) const = 0;
/**
* Copy the value from src to dst. The destination buffer contains uninitialized memory.
*/
virtual void copy_to_uninitialized(void *src, void *dst) const = 0;
+ virtual void copy_to_uninitialized_n(void *src, void *dst, uint n) const = 0;
/**
* Copy the value from src to dst and destroy the original value in src. The destination buffer
* already contains another instance of the same type which should be overriden.
*/
virtual void relocate_to_initialized(void *src, void *dst) const = 0;
+ virtual void relocate_to_initialized_n(void *src, void *dst, uint n) const = 0;
/**
* Copy the value from src to dst and destroy the original value in src. The destination buffer
* contains uninitialized memory.
*/
virtual void relocate_to_uninitialized(void *src, void *dst) const = 0;
-
- /**
- * Return true when the type can be destructed without doing anything. Otherwise false.
- * This is just a hint to improve performance in some cases.
- */
- virtual bool trivially_destructible() const = 0;
+ virtual void relocate_to_uninitialized_n(void *src, void *dst, uint n) const = 0;
};
-template<typename T> class CPPTypeInfoForType : public CPPTypeInfo {
+template<typename T> class CPPTypeInfoForType final : public CPPTypeInfo {
public:
- uint size() const override
+ CPPTypeInfoForType()
+ : CPPTypeInfo(
+ sizeof(T), std::alignment_of<T>::value, std::is_trivially_destructible<T>::value)
{
- return sizeof(T);
}
- uint alignment() const override
+ void construct_default(void *ptr) const override
{
- return std::alignment_of<T>::value;
+ new (ptr) T();
}
- void construct_default(void *ptr) const override
+ void construct_default_n(void *ptr, uint n) const override
{
- new (ptr) T();
+ T *ptr_ = (T *)ptr;
+ for (uint i = 0; i < n; i++) {
+ new (ptr_ + i) T();
+ }
}
- void destruct_type(void *ptr) const override
+ void destruct(void *ptr) const override
{
T *ptr_ = (T *)ptr;
ptr_->~T();
}
+ void destruct_n(void *ptr, uint n) const override
+ {
+ T *ptr_ = (T *)ptr;
+ for (uint i = 0; i < n; i++) {
+ ptr_[i].~T();
+ }
+ }
+
void copy_to_initialized(void *src, void *dst) const override
{
+ T *src_ = (T *)src;
T *dst_ = (T *)dst;
+ std::copy_n(src_, 1, dst_);
+ }
+
+ void copy_to_initialized_n(void *src, void *dst, uint n) const override
+ {
T *src_ = (T *)src;
- std::copy(src_, src_ + 1, dst_);
+ T *dst_ = (T *)dst;
+ std::copy_n(src_, n, dst_);
}
void copy_to_uninitialized(void *src, void *dst) const override
{
+ T *src_ = (T *)src;
T *dst_ = (T *)dst;
+ std::uninitialized_copy_n(src_, 1, dst_);
+ }
+
+ void copy_to_uninitialized_n(void *src, void *dst, uint n) const override
+ {
T *src_ = (T *)src;
- std::uninitialized_copy(src_, src_ + 1, dst_);
+ T *dst_ = (T *)dst;
+ std::uninitialized_copy_n(src_, n, dst_);
}
void relocate_to_initialized(void *src, void *dst) const override
{
- T *dst_ = (T *)dst;
T *src_ = (T *)src;
+ T *dst_ = (T *)dst;
*dst_ = std::move(*src_);
src_->~T();
}
- void relocate_to_uninitialized(void *src, void *dst) const override
+ void relocate_to_initialized_n(void *src, void *dst, uint n) const override
{
+ T *src_ = (T *)src;
T *dst_ = (T *)dst;
+ std::copy_n(std::make_move_iterator(src_), n, dst_);
+ for (uint i = 0; i < n; i++) {
+ src_[i].~T();
+ }
+ }
+
+ void relocate_to_uninitialized(void *src, void *dst) const override
+ {
T *src_ = (T *)src;
- std::uninitialized_copy(
- std::make_move_iterator(src_), std::make_move_iterator(src_ + 1), dst_);
+ T *dst_ = (T *)dst;
+ std::uninitialized_copy_n(std::make_move_iterator(src_), 1, dst_);
src_->~T();
}
- bool trivially_destructible() const override
+ virtual void relocate_to_uninitialized_n(void *src, void *dst, uint n) const override
{
- return std::is_trivially_destructible<T>::value;
+ T *src_ = (T *)src;
+ T *dst_ = (T *)dst;
+ std::uninitialized_copy_n(std::make_move_iterator(src_), n, dst_);
+ for (uint i = 0; i < n; i++) {
+ src_[i].~T();
+ }
}
};
diff --git a/source/blender/functions/backends/tuple/tuple.hpp b/source/blender/functions/backends/tuple/tuple.hpp
index e042b9194af..f372c8f41f5 100644
--- a/source/blender/functions/backends/tuple/tuple.hpp
+++ b/source/blender/functions/backends/tuple/tuple.hpp
@@ -51,7 +51,7 @@ class TupleMeta : public RefCountedBase {
/**
* Get an array containing the types of tuples using the meta object.
*/
- const ArrayRef<SharedType> types() const
+ ArrayRef<SharedType> types() const
{
return m_types;
}
@@ -59,15 +59,20 @@ class TupleMeta : public RefCountedBase {
/**
* Get an array containing the CPPTypeInfo instances of all types.
*/
- const ArrayRef<CPPTypeInfo *> type_infos() const
+ ArrayRef<CPPTypeInfo *> type_infos() const
{
return m_type_info;
}
+ CPPTypeInfo &type_info(uint index) const
+ {
+ return *m_type_info[index];
+ }
+
/**
* Get an array containing the byte offsets of every element in the array.
*/
- const ArrayRef<uint> offsets() const
+ ArrayRef<uint> offsets() const
{
return m_offsets;
}
@@ -228,13 +233,13 @@ class Tuple {
BLI_assert(src != nullptr);
void *dst = this->element_ptr(index);
- auto *type_info = m_meta->type_infos()[index];
+ auto &type_info = m_meta->type_info(index);
if (m_initialized[index]) {
- type_info->copy_to_initialized(src, dst);
+ type_info.copy_to_initialized(src, dst);
}
else {
- type_info->copy_to_uninitialized(src, dst);
+ type_info.copy_to_uninitialized(src, dst);
m_initialized[index] = true;
}
}
@@ -269,13 +274,13 @@ class Tuple {
BLI_assert(src != nullptr);
void *dst = this->element_ptr(index);
- auto *type_info = m_meta->type_infos()[index];
+ auto &type_info = m_meta->type_info(index);
if (m_initialized[index]) {
- type_info->relocate_to_initialized(src, dst);
+ type_info.relocate_to_initialized(src, dst);
}
else {
- type_info->relocate_to_uninitialized(src, dst);
+ type_info.relocate_to_uninitialized(src, dst);
m_initialized[index] = true;
}
}
@@ -335,9 +340,9 @@ class Tuple {
BLI_assert(dst != nullptr);
void *src = this->element_ptr(index);
- auto *type_info = m_meta->type_infos()[index];
+ auto &type_info = m_meta->type_info(index);
- type_info->relocate_to_uninitialized(src, dst);
+ type_info.relocate_to_uninitialized(src, dst);
m_initialized[index] = false;
}
@@ -385,13 +390,13 @@ class Tuple {
void *src = from.element_ptr(from_index);
void *dst = to.element_ptr(to_index);
- CPPTypeInfo *type_info = from.m_meta->type_infos()[from_index];
+ CPPTypeInfo &type_info = from.m_meta->type_info(from_index);
if (to.m_initialized[to_index]) {
- type_info->copy_to_initialized(src, dst);
+ type_info.copy_to_initialized(src, dst);
}
else {
- type_info->copy_to_uninitialized(src, dst);
+ type_info.copy_to_uninitialized(src, dst);
to.m_initialized[to_index] = true;
}
}
@@ -408,13 +413,13 @@ class Tuple {
void *src = from.element_ptr(from_index);
void *dst = to.element_ptr(to_index);
- CPPTypeInfo *type_info = from.m_meta->type_infos()[from_index];
+ CPPTypeInfo &type_info = from.m_meta->type_info(from_index);
if (to.m_initialized[to_index]) {
- type_info->relocate_to_initialized(src, dst);
+ type_info.relocate_to_initialized(src, dst);
}
else {
- type_info->relocate_to_uninitialized(src, dst);
+ type_info.relocate_to_uninitialized(src, dst);
to.m_initialized[to_index] = true;
}
@@ -426,14 +431,14 @@ class Tuple {
*/
inline void init_default(uint index) const
{
- CPPTypeInfo *type_info = m_meta->type_infos()[index];
+ CPPTypeInfo &type_info = m_meta->typ
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list