Commit: 9697e81dab3fb7721f2425f318a0dda6708e4ea2
Author: Jacques Lucke
Date:   Fri Mar 8 13:42:55 2019 +0100
Branches: functions
https://developer.blender.org/rB9697e81dab3fb7721f2425f318a0dda6708e4ea2

use intrusive refcounter because it simplifies things quite a bit

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

M       source/blender/blenlib/BLI_shared.hpp
M       source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M       source/blender/functions/backends/tuple_call/tuple.hpp
M       source/blender/functions/c_wrapper.cpp
M       source/blender/functions/core/data_flow_graph.hpp
M       source/blender/functions/core/function.hpp
M       source/blender/functions/core/type.hpp
M       tests/gtests/blenlib/BLI_shared_test.cc

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

diff --git a/source/blender/blenlib/BLI_shared.hpp 
b/source/blender/blenlib/BLI_shared.hpp
index ba86319f41a..f9e9aa64f53 100644
--- a/source/blender/blenlib/BLI_shared.hpp
+++ b/source/blender/blenlib/BLI_shared.hpp
@@ -37,87 +37,66 @@ namespace BLI {
                }
        };
 
-       template<typename T>
-       class RefCountedPtr : public RefCountedBase {
-       private:
-               T *m_ptr;
-
-               ~RefCountedPtr()
-               {
-                       delete m_ptr;
-               }
-
-       public:
-               RefCountedPtr(T *object)
-                       : RefCountedBase(), m_ptr(object) {}
-
-               T *ptr() const
-               {
-                       return m_ptr;
-               }
-       };
-
        template<typename T>
        class Shared {
        private:
-               RefCountedPtr<T> *m_refcounter;
+               T *m_object;
 
                Shared() = delete;
-               Shared(RefCountedPtr<T> *object)
-                       : m_refcounter(object) {}
+               Shared(T *object)
+                       : m_object(object) {}
 
                inline void incref()
                {
-                       m_refcounter->incref();
+                       m_object->incref();
                }
 
                inline void decref()
                {
-                       m_refcounter->decref();
+                       m_object->decref();
                }
 
        public:
                template<typename ...Args>
                static Shared<T> New(Args&&... args)
                {
-                       T *actual_value = new T(std::forward<Args>(args)...);
-                       return Shared<T>::FromPointer(actual_value);
+                       T *object = new T(std::forward<Args>(args)...);
+                       return Shared<T>(object);
                }
 
-               static Shared<T> FromPointer(T *ptr)
+               static Shared<T> FromPointer(T *object)
                {
-                       RefCountedPtr<T> *refcounter = new 
RefCountedPtr<T>(ptr);
-                       return Shared<T>(refcounter);
+                       return Shared<T>(object);
                }
 
                Shared(const Shared &other)
                {
-                       m_refcounter = other.m_refcounter;
+                       m_object = other.m_object;
                        this->incref();
                }
 
                Shared(Shared &&other)
                {
-                       m_refcounter = other.m_refcounter;
-                       other.m_refcounter = nullptr;
+                       m_object = other.m_object;
+                       other.m_object = nullptr;
                }
 
                ~Shared()
                {
                        /* Can be nullptr when previously moved. */
-                       if (m_refcounter != nullptr) {
+                       if (m_object != nullptr) {
                                this->decref();
                        }
                }
 
                Shared &operator=(const Shared &other)
                {
-                       if (m_refcounter == other.m_refcounter) {
+                       if (m_object == other.m_object) {
                                return *this;
                        }
 
                        this->decref();
-                       m_refcounter = other.m_refcounter;
+                       m_object = other.m_object;
                        this->incref();
                        return *this;
                }
@@ -125,24 +104,24 @@ namespace BLI {
                Shared &operator=(Shared &&other)
                {
                        this->decref();
-                       m_refcounter = other.m_refcounter;
-                       other.m_refcounter = nullptr;
+                       m_object = other.m_object;
+                       other.m_object = nullptr;
                        return *this;
                }
 
-               T *operator->() const
+               T *ptr() const
                {
-                       return m_refcounter->ptr();
+                       return m_object;
                }
 
-               RefCountedPtr<T> *refcounter() const
+               T *operator->() const
                {
-                       return m_refcounter;
+                       return this->ptr();
                }
 
                friend bool operator==(const Shared &a, const Shared &b)
                {
-                       return a.refcounter()->ptr() == b.refcounter()->ptr();
+                       return a.m_object == b.m_object;
                }
 
                friend bool operator!=(const Shared &a, const Shared &b)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc 
b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index a393747f757..86dbf281597 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1562,10 +1562,10 @@ void 
DepsgraphRelationBuilder::build_driver_variables(ID *id, FCurve *fcu)
                        build_id(dtar->id);
 
                        if (dvar->type == DVAR_TYPE_FUNCTION) {
-                               auto fn = (BLI::RefCountedPtr<FN::Function> 
*)get_driver_variable_function(dvar);
+                               auto fn = (FN::Function 
*)get_driver_variable_function(dvar);
                                if (fn != NULL) {
                                        FN::Dependencies dependencies;
-                                       
fn->ptr()->body<FN::DependenciesBody>()->dependencies(dependencies);
+                                       
fn->body<FN::DependenciesBody>()->dependencies(dependencies);
                                        dependencies.add_relations(
                                                (struct 
DepsgraphRelationBuilderRef *)this,
                                                (struct OperationKeyRef 
*)&driver_key);
diff --git a/source/blender/functions/backends/tuple_call/tuple.hpp 
b/source/blender/functions/backends/tuple_call/tuple.hpp
index 1fc026c7bba..98df36ffb43 100644
--- a/source/blender/functions/backends/tuple_call/tuple.hpp
+++ b/source/blender/functions/backends/tuple_call/tuple.hpp
@@ -4,7 +4,7 @@
 
 namespace FN {
 
-       class TupleMeta {
+       class TupleMeta : public RefCountedBase {
        private:
                SmallTypeVector m_types;
                SmallVector<CPPTypeInfo *> m_type_info;
diff --git a/source/blender/functions/c_wrapper.cpp 
b/source/blender/functions/c_wrapper.cpp
index 057904d050d..a253ae1e2d0 100644
--- a/source/blender/functions/c_wrapper.cpp
+++ b/source/blender/functions/c_wrapper.cpp
@@ -16,8 +16,8 @@ using namespace FN::DataFlowNodes;
        inline T2 wrap(T1 value) { return (T2)value; }
 
 
-WRAPPERS(RefCountedPtr<Function> *, FnFunction);
-WRAPPERS(RefCountedPtr<Type> *, FnType);
+WRAPPERS(Function *, FnFunction);
+WRAPPERS(Type *, FnType);
 WRAPPERS(Tuple *, FnTuple);
 WRAPPERS(const TupleCallBody *, FnTupleCallBody);
 
@@ -59,7 +59,7 @@ void FN_function_call(FnTupleCallBody fn_call, FnTuple fn_in, 
FnTuple fn_out)
 
 FnTupleCallBody FN_function_get_callable(FnFunction fn)
 {
-       return wrap(unwrap(fn)->ptr()->body<TupleCallBody>());
+       return wrap(unwrap(fn)->body<TupleCallBody>());
 }
 
 void FN_function_free(FnFunction fn)
@@ -89,44 +89,44 @@ bool FN_function_has_signature(FnFunction fn, FnType 
*inputs, FnType *outputs)
 
 uint FN_input_amount(FnFunction fn)
 {
-       return unwrap(fn)->ptr()->signature().inputs().size();
+       return unwrap(fn)->signature().inputs().size();
 }
 
 uint FN_output_amount(FnFunction fn)
 {
-       return unwrap(fn)->ptr()->signature().outputs().size();
+       return unwrap(fn)->signature().outputs().size();
 }
 
 bool FN_input_has_type(FnFunction fn, uint index, FnType type)
 {
-       Type *type1 = 
unwrap(fn)->ptr()->signature().inputs()[index].type().refcounter()->ptr();
-       Type *type2 = unwrap(type)->ptr();
+       Type *type1 = unwrap(fn)->signature().inputs()[index].type().ptr();
+       Type *type2 = unwrap(type);
        return type1 == type2;
 }
 
 bool FN_output_has_type(FnFunction fn, uint index, FnType type)
 {
-       Type *type1 = 
unwrap(fn)->ptr()->signature().outputs()[index].type().refcounter()->ptr();
-       Type *type2 = unwrap(type)->ptr();
+       Type *type1 = unwrap(fn)->signature().outputs()[index].type().ptr();
+       Type *type2 = unwrap(type);
        return type1 == type2;
 }
 
 void FN_function_print(FnFunction fn)
 {
-       Function *function = unwrap(fn)->ptr();
+       Function *function = unwrap(fn);
        function->print();
 }
 
 
 FnTuple FN_tuple_for_input(FnFunction fn)
 {
-       auto tuple = new Tuple(unwrap(fn)->ptr()->signature().input_types());
+       auto tuple = new Tuple(unwrap(fn)->signature().input_types());
        return wrap(tuple);
 }
 
 FnTuple FN_tuple_for_output(FnFunction fn)
 {
-       auto tuple = new Tuple(unwrap(fn)->ptr()->signature().output_types());
+       auto tuple = new Tuple(unwrap(fn)->signature().output_types());
        return wrap(tuple);
 }
 
@@ -169,7 +169,7 @@ void FN_tuple_get_float_vector_3(FnTuple tuple, uint index, 
float dst[3])
 
 const char *FN_type_name(FnType type)
 {
-       return unwrap(type)->ptr()->name().c_str();
+       return unwrap(type)->name().c_str();
 }
 
 void FN_type_free(FnType type)
@@ -179,7 +179,7 @@ void FN_type_free(FnType type)
 
 static FnType get_type_with_increased_refcount(const SharedType &type)
 {
-       RefCountedPtr<Type> *typeref = type.refcounter();
+       Type *typeref = type.ptr();
        typeref->incref();
        return wrap(typeref);
 }
@@ -188,7 +188,7 @@ static FnType get_type_with_increased_refcount(const 
SharedType &type)
        FnType FN_type_get_##name() \
        { return get_type_with_increased_refcount(Types::get_##name##_type()); 
} \
        FnType FN_type_borrow_##name() \
-       { return wrap(Types::get_##name##_type().refcounter()); }
+       { return wrap(Types::get_##name##_type().ptr()); }
 
 SIMPLE_TYPE_GETTER(float);
 SIMPLE_TYPE_GETTER(int32);
@@ -198,14 +198,14 @@ FnFunction FN_tree_to_function(bNodeTree *btree)
 {
        TIMEIT("Tree to function");
        BLI_assert(btree);
-       auto fn_ = DataFlowNodes::generate_function(btree);
-       if (!fn_.has_value()) {
+       auto fn_opt = DataFlowNodes::generate_function(btree);
+       if (!fn_opt.has_value()) {
                return nullptr;
        }
 
-       RefCountedPtr<Function> *fn_ref = fn_.value().refcounter();
-       fn_ref->incref();
-       return wrap(fn_ref);
+       Function *fn_ptr = fn_opt.value().ptr();
+       fn_ptr->incref();
+       return wrap(fn_ptr);
 }
 
 FnFunction FN_function_get_with_signature(
@@ -232,8 +232,8 @@ void FN_function_update_dependencies(
        FnFunction fn,
        struct DepsNodeHandle *deps_node)
 {
-       RefCountedPtr<Function> *fn_ref = unwrap(fn);
-       const DependenciesBody *body = fn_ref->ptr()->body<DependenciesBody>();
+       Function *fn_ = unwrap(fn);
+       const DependenciesBody *body = fn_->body<DependenciesBody>();
        if (body) {
                Dependencies dependencies;
                body->dependencies(dependencies);
diff --git a/source/blender/functions/core/data_flow_graph.hpp 
b/source/blender/functions/core/data_flow_graph.hpp
index 3aae24e3c62..8d7a0fb72f5 100644
--- a/source/blender/functions/core/data_flow_graph.hpp
+++ b/source/blender/functions/core/data_flow_graph.hpp
@@ -226,7 +226,7 @@ namespace FN {
                SmallVector<Link> m_all_links;
        };
 
-       class DataFlowGraph {
+       class DataFlowGraph : public RefCountedBase {
        public:
                DataFlowGraph();
 
diff --git a/source/blender/functions/core/function.hpp 
b/source/blender/functions/core/function.hpp
index 3c57f4f6055..dda39182143 100644
--- a/source/blender/functions/core/function.hpp
+++ b/source/blender/functions/core/function.hpp
@@ -29,7 +29,7 @@ namespace FN {
                }
        };
 
-       class Function final {
+       class Function final : public RefCountedBase {
        public:
                Function(const std::string &name, const Signature &signature)
                        : m_name(name), m_signature(signature) {}
diff --git a/source/blender/functions/core/type.hpp 
b/source/blender/functions/core/type.hpp
index 7f880ee49b8..ca9c04c72de 100644
--- a/source/blender/functions/core/type.hpp
+++ b/source/blender/functions/core/type.hpp
@@ -8,7 +8,7 @@ namespace FN {
 
        using namespace BLI;
 
-       class Type final {
+       class Type final : public RefCountedBase {
        public:
                Type() = delete;
                Type(const std::string &name)
diff --git a/tests/gtests/blenlib/BLI_shared_test.cc 
b/tests/gtests/blenlib/BLI_shared_test.cc
index a59f9439760..282b5

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to