Commit: 9a9b1e15959162cf77ed14d7e953b80d5e65ceee Author: Jacques Lucke Date: Tue Jul 2 17:11:20 2019 +0200 Branches: functions https://developer.blender.org/rB9a9b1e15959162cf77ed14d7e953b80d5e65ceee
separate declaration from implementation for Function type =================================================================== M source/blender/functions/core/function.cpp M source/blender/functions/core/function.hpp M source/blender/functions/functions/lists.cpp M source/blender/functions/functions/switch.cpp =================================================================== diff --git a/source/blender/functions/core/function.cpp b/source/blender/functions/core/function.cpp index e2d63c85619..3e80662728e 100644 --- a/source/blender/functions/core/function.cpp +++ b/source/blender/functions/core/function.cpp @@ -2,6 +2,26 @@ namespace FN { +/* Function + **********************************************/ + +Function::Function(ChainedStringRef name, + ArrayRef<ChainedStringRef> input_names, + ArrayRef<SharedType> input_types, + ArrayRef<ChainedStringRef> output_names, + ArrayRef<SharedType> output_types, + const char *strings) + : m_name(name), + m_input_names(input_names), + m_input_types(input_types), + m_output_names(output_names), + m_output_types(output_types), + m_strings(strings) +{ + BLI_assert(m_input_names.size() == m_input_types.size()); + BLI_assert(m_output_names.size() == m_output_types.size()); +} + Function::~Function() { MEM_freeN((void *)m_strings); @@ -22,6 +42,17 @@ void Function::print() } } +/* Function Body + ***********************************************/ + +void FunctionBody::owner_init_post() +{ +} + +FunctionBody::~FunctionBody() +{ +} + /* Function builder ************************************/ diff --git a/source/blender/functions/core/function.hpp b/source/blender/functions/core/function.hpp index fc72ffc764e..dd238b1abfc 100644 --- a/source/blender/functions/core/function.hpp +++ b/source/blender/functions/core/function.hpp @@ -11,28 +11,17 @@ class FunctionBody { private: Function *m_owner = nullptr; - void set_owner(Function *fn) - { - m_owner = fn; - this->owner_init_post(); - } + void set_owner(Function *fn); friend class Function; protected: - virtual void owner_init_post() - { - } + virtual void owner_init_post(); public: - virtual ~FunctionBody() - { - } + virtual ~FunctionBody(); - Function *owner() const - { - return m_owner; - } + Function *owner() const; }; class Function final : public RefCountedBase { @@ -44,124 +33,28 @@ class Function final : public RefCountedBase { ArrayRef<SharedType> input_types, ArrayRef<ChainedStringRef> output_names, ArrayRef<SharedType> output_types, - const char *strings) - : m_name(name), - m_input_names(input_names), - m_input_types(input_types), - m_output_names(output_names), - m_output_types(output_types), - m_strings(strings) - { - BLI_assert(m_input_names.size() == m_input_types.size()); - BLI_assert(m_output_names.size() == m_output_types.size()); - } + const char *strings); ~Function(); - const StringRefNull name() const - { - return m_name.to_string_ref(m_strings); - } - - template<typename T> inline bool has_body() const - { - std::lock_guard<std::mutex> lock(m_body_mutex); - static_assert(std::is_base_of<FunctionBody, T>::value, ""); - return this->m_bodies.has<T>(); - } + const StringRefNull name() const; - template<typename T> inline T *body() const - { - std::lock_guard<std::mutex> lock(m_body_mutex); - static_assert(std::is_base_of<FunctionBody, T>::value, ""); - return m_bodies.get<T>(); - } - - template<typename T, typename... Args> bool add_body(Args &&... args) - { - std::lock_guard<std::mutex> lock(m_body_mutex); - static_assert(std::is_base_of<FunctionBody, T>::value, ""); - - if (m_bodies.has<T>()) { - return false; - } - else { - T *new_body = new T(std::forward<Args>(args)...); - new_body->set_owner(this); - m_bodies.add(new_body); - return true; - } - } - - friend bool operator==(const Function &a, const Function &b) - { - return &a == &b; - } + template<typename T> inline bool has_body() const; + template<typename T> inline T *body() const; + template<typename T, typename... Args> bool add_body(Args &&... args); void print(); - /* Utility accessors */ - uint input_amount() const - { - return m_input_names.size(); - } - - uint output_amount() const - { - return m_output_names.size(); - } - - SharedType &input_type(uint index) - { - return m_input_types[index]; - } - - SharedType &output_type(uint index) - { - return m_output_types[index]; - } - - StringRefNull input_name(uint index) - { - return m_input_names[index].to_string_ref(m_strings); - } - - StringRefNull output_name(uint index) - { - return m_output_names[index].to_string_ref(m_strings); - } - - template<typename T> SmallVector<T *> input_extensions() const - { - SmallVector<T *> extensions; - for (auto &type : m_input_types) { - T *ext = type->extension<T>(); - BLI_assert(ext); - extensions.append(ext); - } - return extensions; - } - - template<typename T> SmallVector<T *> output_extensions() const - { - SmallVector<T *> extensions; - for (auto &type : m_output_types) { - T *ext = type->extension<T>(); - BLI_assert(ext); - extensions.append(ext); - } - return extensions; - } - - ArrayRef<SharedType> input_types() const - { - return m_input_types; - } - - ArrayRef<SharedType> output_types() const - { - return m_output_types; - } + uint input_amount() const; + uint output_amount() const; + SharedType &input_type(uint index); + SharedType &output_type(uint index); + StringRefNull input_name(uint index); + StringRefNull output_name(uint index); + template<typename T> SmallVector<T *> input_extensions() const; + template<typename T> SmallVector<T *> output_extensions() const; + ArrayRef<SharedType> input_types() const; + ArrayRef<SharedType> output_types() const; private: ChainedStringRef m_name; @@ -177,7 +70,6 @@ class Function final : public RefCountedBase { }; using SharedFunction = AutoRefCount<Function>; -using FunctionPerType = SmallMap<SharedType, SharedFunction>; class FunctionBuilder { private: @@ -195,4 +87,123 @@ class FunctionBuilder { SharedFunction build(StringRef function_name); }; +/* Function inline functions + ***********************************************/ + +inline const StringRefNull Function::name() const +{ + return m_name.to_string_ref(m_strings); +} + +template<typename T> inline bool Function::has_body() const +{ + std::lock_guard<std::mutex> lock(m_body_mutex); + static_assert(std::is_base_of<FunctionBody, T>::value, ""); + return this->m_bodies.has<T>(); +} + +template<typename T> inline T *Function::body() const +{ + std::lock_guard<std::mutex> lock(m_body_mutex); + static_assert(std::is_base_of<FunctionBody, T>::value, ""); + return m_bodies.get<T>(); +} + +template<typename T, typename... Args> inline bool Function::add_body(Args &&... args) +{ + std::lock_guard<std::mutex> lock(m_body_mutex); + static_assert(std::is_base_of<FunctionBody, T>::value, ""); + + if (m_bodies.has<T>()) { + return false; + } + else { + T *new_body = new T(std::forward<Args>(args)...); + new_body->set_owner(this); + m_bodies.add(new_body); + return true; + } +} + +inline bool operator==(const Function &a, const Function &b) +{ + return &a == &b; +} + +inline uint Function::input_amount() const +{ + return m_input_names.size(); +} + +inline uint Function::output_amount() const +{ + return m_output_names.size(); +} + +inline SharedType &Function::input_type(uint index) +{ + return m_input_types[index]; +} + +inline SharedType &Function::output_type(uint index) +{ + return m_output_types[index]; +} + +inline StringRefNull Function::input_name(uint index) +{ + return m_input_names[index].to_string_ref(m_strings); +} + +inline StringRefNull Function::output_name(uint index) +{ + return m_output_names[index].to_string_ref(m_strings); +} + +template<typename T> inline SmallVector<T *> Function::input_extensions() const +{ + SmallVector<T *> extensions; + for (auto &type : m_input_types) { + T *ext = type->extension<T>(); + BLI_assert(ext); + extensions.append(ext); + } + return extensions; +} + +template<typename T> inline SmallVector<T *> Function::output_extensions() const +{ + SmallVector<T *> extensions; + for (auto &type : m_output_types) { + T *ext = type->extension<T>(); + BLI_assert(ext); + extensions.append(ext); + } + return extensions; +} + +inline ArrayRef<SharedType> Function::input_types() const +{ + return m_input_types; +} + +inline ArrayRef<SharedType> Function::output_types() const +{ + return m_output_types; +} + +/* Function Body inline functions + ********************************************/ + +inline void FunctionBody::set_owner(Function *fn) +{ + m_owner = fn; + this->owner_init_post(); +} + +inline Function *FunctionBody::owner() const +{ + return m_owner; +} + } /* namespace FN */ diff --git a/source/blender/functions/functions/lists.cpp b/source/blender/functions/functions/lists.cpp index 9141be32ae8..682ec2c752c 100644 --- a/source/blender/functions/functions/lists.cpp +++ b/source/blender/functions/functions/lists.cpp @@ -186,6 +186,8 @@ template<typename T> void *new_list_with_prepared_memory(uint length) /* Build List Functions *************************************/ +using FunctionPerType = SmallMap<SharedType, SharedFunction>; + struct ListFunctions { FunctionPerType m_create_empty; FunctionPerType m_from_element; diff --git a/source/blender/functions/functions/switch.cpp b/source/blender/functions/functions/switch.cpp index 0a96ec0c5a5..81b81bdf826 100644 --- a/source/blender/functions/functions/switch.cpp +++ b/source/blender/functions/functions/switch.cpp @@ -72,7 +72,7 @@ static SharedFunction build_bool_switch_function(SharedType &data_type) SharedFunction &GET_FN_bool_switch(SharedType &data_type) { - static FunctionPerType functions; + static SmallMap<SharedType, SharedFunction> functions; if (!functions.contains(data_type)) { SharedFunction fn = build_bool_switch_function(data_type); functions.add(data_type, fn); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs