[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