[Bf-blender-cvs] [c2122c39ae7] temp-geometry-nodes-fields--fields: Remove GArray, futher improvement

Hans Goudey noreply at git.blender.org
Wed Aug 25 23:23:54 CEST 2021


Commit: c2122c39ae7060470253ce3514b280ecdf2329c1
Author: Hans Goudey
Date:   Wed Aug 25 09:55:34 2021 -0500
Branches: temp-geometry-nodes-fields--fields
https://developer.blender.org/rBc2122c39ae7060470253ce3514b280ecdf2329c1

Remove GArray, futher improvement

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

M	source/blender/functions/CMakeLists.txt
M	source/blender/functions/FN_field.hh
D	source/blender/functions/FN_generic_array.hh
D	source/blender/functions/tests/FN_generic_array_test.cc

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index a67667ba46e..a4ba9a61a85 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -40,7 +40,6 @@ set(SRC
   FN_cpp_type.hh
   FN_cpp_type_make.hh
   FN_field.hh
-  FN_generic_array.hh
   FN_generic_pointer.hh
   FN_generic_span.hh
   FN_generic_value_map.hh
@@ -69,7 +68,6 @@ if(WITH_GTESTS)
   set(TEST_SRC
     tests/FN_cpp_type_test.cc
     tests/FN_field_test.cc
-    tests/FN_generic_array_test.cc
     tests/FN_generic_span_test.cc
     tests/FN_generic_vector_array_test.cc
     tests/FN_multi_function_procedure_test.cc
diff --git a/source/blender/functions/FN_field.hh b/source/blender/functions/FN_field.hh
index 2f701c7ec52..208f3ce2d76 100644
--- a/source/blender/functions/FN_field.hh
+++ b/source/blender/functions/FN_field.hh
@@ -111,7 +111,8 @@ void evaluate_fields(const Span<std::shared_ptr<Field>> fields,
   MFProcedure procedure;
   MFProcedureBuilder builder{procedure};
 
-  Map<const InputField *, MFVariable *> fields_to_variables;
+  Map<const Field *, MFVariable *> fields_to_variables;
+  Map<const GMutableSpan, MFVariable *> outputs_to_variables;
 
   /* Add the unique inputs. */
   for (blender::Map<const InputField *, GVArrayPtr>::Item item : computed_inputs.items()) {
@@ -120,7 +121,11 @@ void evaluate_fields(const Span<std::shared_ptr<Field>> fields,
   }
 
   /* Add the inputs recursively for the entire group of nodes. */
-  // builder.add_return();
+  builder.add_return();
+  for (const int i : outputs.index_range()) {
+    BLI_assert(fields_to_variables.contains(fields[i].get()));
+    builder.add_output_parameter(*fields_to_variables.lookup(fields[i].get()));
+  }
   // builder.add_output_parameter(*var4);
 
   BLI_assert(procedure.validate());
@@ -137,6 +142,7 @@ void evaluate_fields(const Span<std::shared_ptr<Field>> fields,
 
   /* Add the output arrays. */
   for (const int i : fields.index_range()) {
+    BLI_assert(outputs[i].type() == fields[i]->type());
     params.add_uninitialized_single_output(outputs[i]);
   }
 
diff --git a/source/blender/functions/FN_generic_array.hh b/source/blender/functions/FN_generic_array.hh
deleted file mode 100644
index 523df5e9566..00000000000
--- a/source/blender/functions/FN_generic_array.hh
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-/** \file
- * \ingroup fn
- *
- * This is a generic counterpart to `blender::Array`, used when the type is not known at runtime.
- *
- * `GArray` should generally only be used for passing data around in dynamic contexts.
- * It does not support a few things that `blender::Array` supports:
- *  - Small object optimization / inline buffer.
- *  - Exception safety and various more specific constructors.
- *
- * Note that a generic vector is purposefully not added to Blender, since it would encourage use of
- * the `append` function, which would be inefficient for dynamic types. Dynamic types should
- * usually be processed in batches.
- */
-
-#include "BLI_allocator.hh"
-
-#include "FN_cpp_type.hh"
-#include "FN_generic_span.hh"
-
-namespace blender::fn {
-
-template<
-    /**
-     * The allocator used by this array. Should rarely be changed, except when you don't want that
-     * MEM_* functions are used internally.
-     */
-    typename Allocator = GuardedAllocator>
-class GArray {
- protected:
-  /** The type of the data in the array, will be null after the array is default constructed,
-   * but a value should be assigned before any other interaction with the array. */
-  const CPPType *type_;
-  void *data_;
-  int64_t size_;
-
-  Allocator allocator_;
-
- public:
-  /**
-   * The default constructor creates an empty array, the only situation in which the type is
-   * allowed to be null. This default constructor exists so `GArray` can be used in containers,
-   * but the type should be supplied before doing anything else to the array.
-   */
-  GArray(Allocator allocator = {}) noexcept : allocator_(allocator)
-  {
-    type_ = nullptr;
-    data_ = nullptr;
-    size_ = 0;
-  }
-
-  /**
-   * Create and allocate a new array, with elements default constructed
-   * (which does not do anything for trivial types).
-   */
-  GArray(const CPPType &type, int64_t size, Allocator allocator = {}) : GArray(type, allocator)
-  {
-    BLI_assert(size >= 0);
-    size_ = size;
-    data_ = this->allocate(size_);
-    type_->default_construct_n(data_, size_);
-  }
-
-  /**
-   * Create an empty array with just a type.
-   */
-  GArray(const CPPType &type, Allocator allocator = {}) : GArray(allocator)
-  {
-    type_ = &type;
-    data_ = nullptr;
-    size_ = 0;
-  }
-
-  /**
-   * Take ownership of a buffer with a provided size. The buffer should be
-   * allocated with the same allocator provided to the constructor.
-   */
-  GArray(const CPPType &type, void *buffer, int64_t size, Allocator allocator = {})
-      : GArray(type, allocator)
-  {
-    BLI_assert(size >= 0);
-    BLI_assert(buffer != nullptr || size == 0);
-    BLI_assert(type_->pointer_has_valid_alignment(buffer));
-
-    data_ = buffer;
-    size_ = size;
-  }
-
-  /**
-   * Create an array by copying values from a generic span.
-   */
-  GArray(const GSpan span, Allocator allocator = {}) : GArray(span.type(), span.size(), allocator)
-  {
-    if (span.data() != nullptr) {
-      BLI_assert(span.size() != 0);
-      type_->copy_construct_n(span.data(), data_, size_);
-    }
-  }
-
-  /**
-   * Create an array by copying values from another generic array.
-   */
-  GArray(const GArray &other) : GArray(other.as_span(), other.allocator())
-  {
-  }
-
-  /**
-   * Create an array by taking ownership of another array's data and destructing it.
-   */
-  GArray(GArray &&other) : GArray(other.type(), other.data(), other.size(), other.allocator())
-  {
-    other.data_ = nullptr;
-    other.size_ = 0;
-  }
-
-  ~GArray()
-  {
-    if (data_ != nullptr) {
-      type_->destruct_n(data_, size_);
-      this->deallocate(data_);
-    }
-  }
-
-  GArray &operator=(const GArray &other)
-  {
-    return copy_assign_container(*this, other);
-  }
-
-  GArray &operator=(GArray &&other)
-  {
-    return move_assign_container(*this, std::move(other));
-  }
-
-  const CPPType &type() const
-  {
-    BLI_assert(type_ != nullptr);
-    return *type_;
-  }
-
-  bool is_empty() const
-  {
-    return size_ == 0;
-  }
-
-  /**
-   * Return the number of elements in the array (not the size in bytes).
-   */
-  int64_t size() const
-  {
-    return size_;
-  }
-
-  /**
-   * Get a pointer to the beginning of the array.
-   */
-  const void *data() const
-  {
-    return data_;
-  }
-  void *data()
-  {
-    return data_;
-  }
-
-  const void *operator[](int64_t index) const
-  {
-    BLI_assert(index < size_);
-    return POINTER_OFFSET(data_, type_->size() * index);
-  }
-
-  void *operator[](int64_t index)
-  {
-    BLI_assert(index < size_);
-    return POINTER_OFFSET(data_, type_->size() * index);
-  }
-
-  operator GSpan() const
-  {
-    BLI_assert(type_ != nullptr);
-    return GSpan(*type_, data_, size_);
-  }
-
-  operator GMutableSpan()
-  {
-    BLI_assert(type_ != nullptr);
-    return GMutableSpan(*type_, data_, size_);
-  }
-
-  GSpan as_span() const
-  {
-    return *this;
-  }
-
-  GMutableSpan as_mutable_span()
-  {
-    return *this;
-  }
-
-  /**
-   * Access the allocator used by this array.
-   */
-  Allocator &allocator()
-  {
-    return allocator_;
-  }
-  const Allocator &allocator() const
-  {
-    return allocator_;
-  }
-
-  /**
-   * Destruct values and create a new array of the given size. The values in the new array are
-   * default constructed.
-   */
-  void reinitialize(const int64_t new_size)
-  {
-    BLI_assert(new_size >= 0);
-    int64_t old_size = size_;
-
-    type_->destruct_n(data_, size_);
-    size_ = 0;
-
-    if (new_size <= old_size) {
-      type_->default_construct_n(data_, new_size);
-    }
-    else {
-      void *new_data = this->allocate(new_size);
-      try {
-        type_->default_construct_n(new_data, new_size);
-      }
-      catch (...) {
-        this->deallocate(new_data);
-        throw;
-      }
-      this->deallocate(data_);
-      data_ = new_data;
-    }
-
-    size_ = new_size;
-  }
-
- private:
-  void *allocate(int64_t size)
-  {
-    const int64_t item_size = type_->size();
-    const int64_t alignment = type_->alignment();
-    return allocator_.allocate(static_cast<size_t>(size) * item_size, alignment, AT);
-  }
-
-  void deallocate(void *ptr)
-  {
-    allocator_.deallocate(ptr);
-  }
-};
-
-}  // namespace blender::fn
diff --git a/source/blender/functions/tests/FN_generic_array_test.cc b/source/blender/functions/tests/FN_generic_array_test.cc
deleted file mode 100644
index e06013b4cf7..00000000000
--- a/source/blender/functions/tests/FN_generic_array_test.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Apache License, Version 2.0 */
-
-#include "testing/testing.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_array.hh"
-
-#include "FN_generic_array.hh"
-
-namespace blender::fn::tests {
-
-TEST(generic_array, TypeConstructor)
-{
-  GArray array(CPPType::get<float>());
-  EXPECT_TRUE(array.data() == nullptr);
-  EXPECT_EQ(array.size(), 0);
-  EXPECT_EQ(array.as_span().typed<float>().size(), 0);
-  EXPECT_TRUE(array.is_empty());
-}
-
-TEST(generic_array, MoveConstructor)
-{
-  GArray array_a(CPPType::get<int32_t>(), (int64_t)10);
-  GMutableSpan span_a = array_a.as_mutable_sp

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list