[Bf-blender-cvs] [eada8320406] functions-experimental-refactor: make AttributesInfo non copy and non movable

Jacques Lucke noreply at git.blender.org
Thu Nov 7 15:06:25 CET 2019


Commit: eada8320406ab2a9923bef10f2af85a7e237ceba
Author: Jacques Lucke
Date:   Thu Nov 7 13:59:47 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBeada8320406ab2a9923bef10f2af85a7e237ceba

make AttributesInfo non copy and non movable

===================================================================

M	source/blender/functions/FN_attributes_block_container.h
M	source/blender/functions/FN_attributes_ref.h
M	source/blender/functions/intern/attributes_block_container.cc
M	source/blender/simulations/bparticles/integrator.cpp
M	source/blender/simulations/bparticles/integrator.hpp
M	source/blender/simulations/bparticles/integrator_interface.hpp
M	source/blender/simulations/bparticles/node_frontend.cpp
M	source/blender/simulations/bparticles/simulate.cpp

===================================================================

diff --git a/source/blender/functions/FN_attributes_block_container.h b/source/blender/functions/FN_attributes_block_container.h
index 81cf57517a5..4ed699c1609 100644
--- a/source/blender/functions/FN_attributes_block_container.h
+++ b/source/blender/functions/FN_attributes_block_container.h
@@ -11,18 +11,18 @@ class AttributesBlock;
 
 class AttributesBlockContainer : BLI::NonCopyable, BLI::NonMovable {
  private:
-  AttributesInfo m_info;
+  std::unique_ptr<AttributesInfo> m_info;
   uint m_block_size;
   VectorSet<AttributesBlock *> m_active_blocks;
   std::mutex m_blocks_mutex;
 
  public:
-  AttributesBlockContainer(AttributesInfo info, uint block_size);
+  AttributesBlockContainer(std::unique_ptr<AttributesInfo> info, uint block_size);
   ~AttributesBlockContainer();
 
   const AttributesInfo &info() const
   {
-    return m_info;
+    return *m_info;
   }
 
   uint block_size() const
@@ -40,7 +40,8 @@ class AttributesBlockContainer : BLI::NonCopyable, BLI::NonMovable {
   template<typename T> Vector<T> flatten_attribute(StringRef name) const;
   void flatten_attribute(StringRef name, GenericMutableArrayRef dst) const;
 
-  void update_attributes(AttributesInfo new_info, const AttributesDefaults &defaults);
+  void update_attributes(std::unique_ptr<AttributesInfo> new_info,
+                         const AttributesDefaults &defaults);
 
   AttributesBlock &new_block();
   void release_block(AttributesBlock &block);
diff --git a/source/blender/functions/FN_attributes_ref.h b/source/blender/functions/FN_attributes_ref.h
index 4a3530badd2..9ae1b077eea 100644
--- a/source/blender/functions/FN_attributes_ref.h
+++ b/source/blender/functions/FN_attributes_ref.h
@@ -67,7 +67,7 @@ class AttributesInfoBuilder {
   void add(const AttributesInfo &other);
 };
 
-class AttributesInfo {
+class AttributesInfo : BLI::NonCopyable, BLI::NonMovable {
  private:
   StringMap<int> m_index_by_name;
   Vector<std::string> m_name_by_index;
diff --git a/source/blender/functions/intern/attributes_block_container.cc b/source/blender/functions/intern/attributes_block_container.cc
index dd4b7bc3bba..d1524f9b1df 100644
--- a/source/blender/functions/intern/attributes_block_container.cc
+++ b/source/blender/functions/intern/attributes_block_container.cc
@@ -2,7 +2,8 @@
 
 namespace FN {
 
-AttributesBlockContainer::AttributesBlockContainer(AttributesInfo info, uint block_size)
+AttributesBlockContainer::AttributesBlockContainer(std::unique_ptr<AttributesInfo> info,
+                                                   uint block_size)
     : m_info(std::move(info)), m_block_size(block_size)
 {
 }
@@ -26,7 +27,7 @@ uint AttributesBlockContainer::count_active() const
 void AttributesBlockContainer::flatten_attribute(StringRef name, GenericMutableArrayRef dst) const
 {
   BLI_assert(dst.size() == this->count_active());
-  BLI_assert(dst.type() == m_info.type_of(name));
+  BLI_assert(dst.type() == m_info->type_of(name));
 
   uint offset = 0;
   for (AttributesBlock *block : m_active_blocks) {
@@ -40,10 +41,10 @@ void AttributesBlockContainer::flatten_attribute(StringRef name, GenericMutableA
   }
 }
 
-void AttributesBlockContainer::update_attributes(AttributesInfo new_info,
+void AttributesBlockContainer::update_attributes(std::unique_ptr<AttributesInfo> new_info,
                                                  const AttributesDefaults &defaults)
 {
-  AttributesInfoDiff diff{m_info, new_info, defaults};
+  AttributesInfoDiff diff{*m_info, *new_info, defaults};
   for (AttributesBlock *block : m_active_blocks) {
     Vector<void *> new_buffers{diff.new_buffer_amount()};
     diff.update(m_block_size, block->m_used_size, block->m_buffers, new_buffers);
diff --git a/source/blender/simulations/bparticles/integrator.cpp b/source/blender/simulations/bparticles/integrator.cpp
index f2278ad48ab..125d44bb0be 100644
--- a/source/blender/simulations/bparticles/integrator.cpp
+++ b/source/blender/simulations/bparticles/integrator.cpp
@@ -8,12 +8,12 @@ ConstantVelocityIntegrator::ConstantVelocityIntegrator()
 {
   FN::AttributesInfoBuilder builder;
   builder.add<float3>("Position");
-  m_offset_attributes_info = AttributesInfo(builder);
+  m_offset_attributes_info = BLI::make_unique<AttributesInfo>(builder);
 }
 
-AttributesInfo &ConstantVelocityIntegrator::offset_attributes_info()
+const AttributesInfo &ConstantVelocityIntegrator::offset_attributes_info()
 {
-  return m_offset_attributes_info;
+  return *m_offset_attributes_info;
 }
 
 void ConstantVelocityIntegrator::integrate(IntegratorInterface &interface)
@@ -32,7 +32,7 @@ EulerIntegrator::EulerIntegrator(ArrayRef<Force *> forces) : m_forces(forces)
   FN::AttributesInfoBuilder builder;
   builder.add<float3>("Position");
   builder.add<float3>("Velocity");
-  m_offset_attributes_info = AttributesInfo(builder);
+  m_offset_attributes_info = BLI::make_unique<AttributesInfo>(builder);
 }
 
 EulerIntegrator::~EulerIntegrator()
@@ -42,9 +42,9 @@ EulerIntegrator::~EulerIntegrator()
   }
 }
 
-AttributesInfo &EulerIntegrator::offset_attributes_info()
+const AttributesInfo &EulerIntegrator::offset_attributes_info()
 {
-  return m_offset_attributes_info;
+  return *m_offset_attributes_info;
 }
 
 void EulerIntegrator::integrate(IntegratorInterface &interface)
diff --git a/source/blender/simulations/bparticles/integrator.hpp b/source/blender/simulations/bparticles/integrator.hpp
index 339eb38fcb7..2b297c8589c 100644
--- a/source/blender/simulations/bparticles/integrator.hpp
+++ b/source/blender/simulations/bparticles/integrator.hpp
@@ -6,25 +6,25 @@
 namespace BParticles {
 
 class ConstantVelocityIntegrator : public Integrator {
-  AttributesInfo m_offset_attributes_info;
+  std::unique_ptr<AttributesInfo> m_offset_attributes_info;
 
  public:
   ConstantVelocityIntegrator();
 
-  AttributesInfo &offset_attributes_info() override;
+  const AttributesInfo &offset_attributes_info() override;
   void integrate(IntegratorInterface &interface) override;
 };
 
 class EulerIntegrator : public Integrator {
  private:
-  AttributesInfo m_offset_attributes_info;
+  std::unique_ptr<AttributesInfo> m_offset_attributes_info;
   Vector<Force *> m_forces;
 
  public:
   EulerIntegrator(ArrayRef<Force *> forces);
   ~EulerIntegrator();
 
-  AttributesInfo &offset_attributes_info() override;
+  const AttributesInfo &offset_attributes_info() override;
   void integrate(IntegratorInterface &interface) override;
 
  private:
diff --git a/source/blender/simulations/bparticles/integrator_interface.hpp b/source/blender/simulations/bparticles/integrator_interface.hpp
index 3cbcb24295f..bd5cb635924 100644
--- a/source/blender/simulations/bparticles/integrator_interface.hpp
+++ b/source/blender/simulations/bparticles/integrator_interface.hpp
@@ -36,7 +36,7 @@ class Integrator {
   /**
    * Specify which attributes are integrated (usually Position and Velocity).
    */
-  virtual AttributesInfo &offset_attributes_info() = 0;
+  virtual const AttributesInfo &offset_attributes_info() = 0;
 
   /**
    * Compute the offsets for all integrated attributes. Those are not applied immediately, because
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 48e56960a14..b35ffe20a28 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -937,7 +937,7 @@ class NodeTreeStepSimulator : public StepSimulator {
       }
 
       this->ensure_particle_container_exist_and_has_attributes(
-          particles_state, name, AttributesInfo(system_attributes), defaults);
+          particles_state, name, system_attributes, defaults);
 
       ParticleSystemInfo type_info = {
           &defaults,
@@ -966,9 +966,11 @@ class NodeTreeStepSimulator : public StepSimulator {
   void ensure_particle_container_exist_and_has_attributes(
       ParticlesState &particles_state,
       StringRef name,
-      AttributesInfo attributes_info,
+      AttributesInfoBuilder &attributes_info_builder,
       const AttributesDefaults &attributes_defaults)
   {
+    auto attributes_info = BLI::make_unique<AttributesInfo>(attributes_info_builder);
+
     auto &containers = particles_state.particle_containers();
     AttributesBlockContainer *container = containers.lookup_default(name, nullptr);
     if (container == nullptr) {
diff --git a/source/blender/simulations/bparticles/simulate.cpp b/source/blender/simulations/bparticles/simulate.cpp
index 08cc7f3b4ba..8c313f642a5 100644
--- a/source/blender/simulations/bparticles/simulate.cpp
+++ b/source/blender/simulations/bparticles/simulate.cpp
@@ -319,7 +319,7 @@ BLI_NOINLINE static void simulate_block(SimulationState &simulation_state,
   BLI_assert(amount == remaining_durations.size());
 
   Integrator &integrator = *system_info.integrator;
-  AttributesInfo &offsets_info = integrator.offset_attributes_info();
+  const AttributesInfo &offsets_info = integrator.offset_attributes_info();
   Vector<void *> offset_buffers;
   for (const CPPType *type : offsets_info.types()) {
     void *ptr = BLI_temporary_allocate(type->size() * amount);



More information about the Bf-blender-cvs mailing list