[Bf-blender-cvs] [f8909cfab72] functions: only wrap intrusive listbases for now

Jacques Lucke noreply at git.blender.org
Wed Aug 7 12:00:30 CEST 2019


Commit: f8909cfab72c5fc84b876c6d0f9e6c6c3fdb9070
Author: Jacques Lucke
Date:   Wed Aug 7 11:40:16 2019 +0200
Branches: functions
https://developer.blender.org/rBf8909cfab72c5fc84b876c6d0f9e6c6c3fdb9070

only wrap intrusive listbases for now

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

M	source/blender/blenkernel/BKE_node_tree.hpp
M	source/blender/blenkernel/intern/node_tree.cpp
M	source/blender/blenlib/BLI_listbase_wrapper.hpp
M	source/blender/blenlib/BLI_vector.hpp
M	tests/gtests/blenlib/BLI_vector_test.cc

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

diff --git a/source/blender/blenkernel/BKE_node_tree.hpp b/source/blender/blenkernel/BKE_node_tree.hpp
index 031816da400..3892d31e480 100644
--- a/source/blender/blenkernel/BKE_node_tree.hpp
+++ b/source/blender/blenkernel/BKE_node_tree.hpp
@@ -15,7 +15,7 @@
 namespace BKE {
 
 using BLI::ArrayRef;
-using BLI::ListBaseWrapper;
+using BLI::IntrusiveListBaseWrapper;
 using BLI::Map;
 using BLI::MonotonicAllocator;
 using BLI::MultiMap;
@@ -23,9 +23,9 @@ using BLI::StringRef;
 using BLI::StringRefNull;
 using BLI::Vector;
 
-using bNodeList = ListBaseWrapper<struct bNode *, true>;
-using bLinkList = ListBaseWrapper<struct bNodeLink *, true>;
-using bSocketList = ListBaseWrapper<struct bNodeSocket *, true>;
+using bNodeList = IntrusiveListBaseWrapper<struct bNode>;
+using bLinkList = IntrusiveListBaseWrapper<struct bNodeLink>;
+using bSocketList = IntrusiveListBaseWrapper<struct bNodeSocket>;
 
 class VirtualNode;
 class VirtualSocket;
diff --git a/source/blender/blenkernel/intern/node_tree.cpp b/source/blender/blenkernel/intern/node_tree.cpp
index 7802a1c12db..f8ba5649dce 100644
--- a/source/blender/blenkernel/intern/node_tree.cpp
+++ b/source/blender/blenkernel/intern/node_tree.cpp
@@ -6,11 +6,11 @@ namespace BKE {
 void VirtualNodeTree::add_all_of_tree(bNodeTree *btree)
 {
   Map<bNode *, VirtualNode *> node_mapping;
-  for (bNode *bnode : BKE::bNodeList(btree->nodes)) {
+  for (bNode *bnode : bNodeList(btree->nodes)) {
     VirtualNode *vnode = this->add_bnode(btree, bnode);
     node_mapping.add_new(bnode, vnode);
   }
-  for (bNodeLink *blink : BKE::bLinkList(btree->links)) {
+  for (bNodeLink *blink : bLinkList(btree->links)) {
     VirtualNode *from_vnode = node_mapping.lookup(blink->fromnode);
     VirtualNode *to_vnode = node_mapping.lookup(blink->tonode);
     VirtualSocket *from_vsocket = nullptr;
diff --git a/source/blender/blenlib/BLI_listbase_wrapper.hpp b/source/blender/blenlib/BLI_listbase_wrapper.hpp
index 650cb4246ac..bd3e5478cab 100644
--- a/source/blender/blenlib/BLI_listbase_wrapper.hpp
+++ b/source/blender/blenlib/BLI_listbase_wrapper.hpp
@@ -10,27 +10,27 @@
 
 namespace BLI {
 
-template<typename T, bool intrusive> class ListBaseWrapper {
+template<typename T> class IntrusiveListBaseWrapper {
  private:
   ListBase *m_listbase;
 
  public:
-  ListBaseWrapper(ListBase *listbase) : m_listbase(listbase)
+  IntrusiveListBaseWrapper(ListBase *listbase) : m_listbase(listbase)
   {
     BLI_assert(listbase);
   }
 
-  ListBaseWrapper(ListBase &listbase) : m_listbase(&listbase)
+  IntrusiveListBaseWrapper(ListBase &listbase) : IntrusiveListBaseWrapper(&listbase)
   {
   }
 
   class Iterator {
    private:
     ListBase *m_listbase;
-    Link *m_current;
+    T *m_current;
 
    public:
-    Iterator(ListBase *listbase, Link *current) : m_listbase(listbase), m_current(current)
+    Iterator(ListBase *listbase, T *current) : m_listbase(listbase), m_current(current)
     {
     }
 
@@ -52,20 +52,15 @@ template<typename T, bool intrusive> class ListBaseWrapper {
       return m_current != iterator.m_current;
     }
 
-    T operator*() const
+    T *operator*() const
     {
-      if (intrusive) {
-        return (T)m_current;
-      }
-      else {
-        return (T)((LinkData *)m_current)->data;
-      }
+      return m_current;
     }
   };
 
   Iterator begin() const
   {
-    return Iterator(m_listbase, (Link *)m_listbase->first);
+    return Iterator(m_listbase, (T *)m_listbase->first);
   }
 
   Iterator end() const
@@ -77,13 +72,7 @@ template<typename T, bool intrusive> class ListBaseWrapper {
   {
     void *ptr = BLI_findlink(m_listbase, index);
     BLI_assert(ptr);
-
-    if (intrusive) {
-      return (T)ptr;
-    }
-    else {
-      return (T)((LinkData *)ptr)->data;
-    }
+    return (T *)ptr;
   }
 };
 
diff --git a/source/blender/blenlib/BLI_vector.hpp b/source/blender/blenlib/BLI_vector.hpp
index dcd5a407a92..45d01fe28ff 100644
--- a/source/blender/blenlib/BLI_vector.hpp
+++ b/source/blender/blenlib/BLI_vector.hpp
@@ -140,13 +140,9 @@ template<typename T, uint N = 4> class Vector {
    */
   Vector(ListBase &values, bool intrusive_next_and_prev_pointers) : Vector()
   {
+    BLI_assert(intrusive_next_and_prev_pointers);
     if (intrusive_next_and_prev_pointers) {
-      for (T value : ListBaseWrapper<T, true>(values)) {
-        this->append(value);
-      }
-    }
-    else {
-      for (T value : ListBaseWrapper<T, false>(values)) {
+      for (T value : IntrusiveListBaseWrapper<typename std::remove_pointer<T>::type>(values)) {
         this->append(value);
       }
     }
diff --git a/tests/gtests/blenlib/BLI_vector_test.cc b/tests/gtests/blenlib/BLI_vector_test.cc
index ce2aaeff54b..109c9c78e82 100644
--- a/tests/gtests/blenlib/BLI_vector_test.cc
+++ b/tests/gtests/blenlib/BLI_vector_test.cc
@@ -63,40 +63,31 @@ TEST(vector, MappedArrayRefConstructor)
   EXPECT_TRUE(values.contains(6));
 }
 
-TEST(vector, NonIntrusiveListBaseConstructor)
-{
-  ListBase list = {0};
-  BLI_addtail(&list, BLI_genericNodeN(POINTER_FROM_INT(42)));
-  BLI_addtail(&list, BLI_genericNodeN(POINTER_FROM_INT(60)));
-  BLI_addtail(&list, BLI_genericNodeN(POINTER_FROM_INT(90)));
-  BLI::Vector<void *> vec(list, false);
-  EXPECT_EQ(vec.size(), 3);
-  EXPECT_EQ(POINTER_AS_INT(vec[0]), 42);
-  EXPECT_EQ(POINTER_AS_INT(vec[1]), 60);
-  EXPECT_EQ(POINTER_AS_INT(vec[2]), 90);
-  BLI_freelistN(&list);
-}
-
 struct TestListValue {
-  TestListValue *prev, *next;
+  TestListValue *next, *prev;
   int value;
 };
 
 TEST(vector, IntrusiveListBaseConstructor)
 {
+  TestListValue *value1 = new TestListValue{0, 0, 4};
+  TestListValue *value2 = new TestListValue{0, 0, 5};
+  TestListValue *value3 = new TestListValue{0, 0, 6};
+
   ListBase list = {0};
-  BLI_addtail(&list, new TestListValue{0, 0, 4});
-  BLI_addtail(&list, new TestListValue{0, 0, 6});
-  BLI_addtail(&list, new TestListValue{0, 0, 7});
+  BLI_addtail(&list, value1);
+  BLI_addtail(&list, value2);
+  BLI_addtail(&list, value3);
   Vector<TestListValue *> vec(list, true);
+
   EXPECT_EQ(vec.size(), 3);
   EXPECT_EQ(vec[0]->value, 4);
-  EXPECT_EQ(vec[1]->value, 6);
-  EXPECT_EQ(vec[2]->value, 7);
+  EXPECT_EQ(vec[1]->value, 5);
+  EXPECT_EQ(vec[2]->value, 6);
 
-  delete vec[0];
-  delete vec[1];
-  delete vec[2];
+  delete value1;
+  delete value2;
+  delete value3;
 }
 
 TEST(vector, ContainerConstructor)



More information about the Bf-blender-cvs mailing list