[Bf-blender-cvs] [5ab8cc2eafd] functions-experimental-refactor: add generic mutable array ref
Jacques Lucke
noreply at git.blender.org
Tue Oct 15 15:56:28 CEST 2019
Commit: 5ab8cc2eafdf5590f88ecac6c59a3a7e4b13a4ed
Author: Jacques Lucke
Date: Tue Oct 8 11:03:56 2019 +0200
Branches: functions-experimental-refactor
https://developer.blender.org/rB5ab8cc2eafdf5590f88ecac6c59a3a7e4b13a4ed
add generic mutable array ref
===================================================================
M source/blender/blenkernel/BKE_generic_array_ref.h
M source/blender/blenkernel/intern/cpp_types.cc
M source/blender/blenkernel/intern/generic_array_ref.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_generic_array_ref.h b/source/blender/blenkernel/BKE_generic_array_ref.h
index 4c9fe1359c2..274fca77a95 100644
--- a/source/blender/blenkernel/BKE_generic_array_ref.h
+++ b/source/blender/blenkernel/BKE_generic_array_ref.h
@@ -9,6 +9,7 @@
namespace BKE {
using BLI::ArrayRef;
+using BLI::MutableArrayRef;
class GenericArrayRef {
private:
@@ -41,7 +42,38 @@ class GenericArrayRef {
}
};
-class ArrayRefCPPType : public CPPType {
+class GenericMutableArrayRef {
+ private:
+ const CPPType *m_type;
+ void *m_buffer;
+ uint m_size;
+
+ public:
+ GenericMutableArrayRef(const CPPType *type) : GenericMutableArrayRef(type, nullptr, 0)
+ {
+ }
+
+ GenericMutableArrayRef(const CPPType *type, void *buffer, uint size)
+ : m_type(type), m_buffer(buffer), m_size(size)
+ {
+ BLI_assert(type != nullptr);
+ BLI_assert(buffer != nullptr || size == 0);
+ BLI_assert(type->pointer_has_valid_alignment(buffer));
+ }
+
+ uint size() const
+ {
+ return m_size;
+ }
+
+ template<typename T> MutableArrayRef<T> get_ref()
+ {
+ BLI_assert(get_cpp_type<T>().is_same_or_generalization(m_type));
+ return ArrayRef<T>((const T *)m_buffer, m_size);
+ }
+};
+
+class ArrayRefCPPType final : public CPPType {
private:
CPPType &m_base_type;
@@ -55,7 +87,22 @@ class ArrayRefCPPType : public CPPType {
}
};
+class MutableArrayRefCPPType final : public CPPType {
+ private:
+ CPPType &m_base_type;
+
+ public:
+ MutableArrayRefCPPType(CPPType &base_type);
+
+ static void ConstructDefaultCB(const CPPType *self, void *ptr)
+ {
+ const MutableArrayRefCPPType *self_ = dynamic_cast<const MutableArrayRefCPPType *>(self);
+ new (ptr) GenericMutableArrayRef(&self_->m_base_type);
+ }
+};
+
ArrayRefCPPType &get_generic_array_ref_cpp_type(CPPType &base);
+MutableArrayRefCPPType &get_generic_mutable_array_ref_cpp_type(CPPType &base);
} // namespace BKE
diff --git a/source/blender/blenkernel/intern/cpp_types.cc b/source/blender/blenkernel/intern/cpp_types.cc
index 3f64d62d065..2baf92410ee 100644
--- a/source/blender/blenkernel/intern/cpp_types.cc
+++ b/source/blender/blenkernel/intern/cpp_types.cc
@@ -68,6 +68,7 @@ CPP_TYPE_DECLARE(int32);
CPP_TYPE_DECLARE(rgba_f);
CPP_TYPE_DECLARE(string);
CPP_TYPE_DECLARE(GenericArrayRef);
+CPP_TYPE_DECLARE(GenericMutableArrayRef);
#undef CPP_TYPE_DECLARE
@@ -97,6 +98,7 @@ void init_data_types()
CPP_TYPE_CONSTRUCTION(rgba_f, BLI::rgba_f);
CPP_TYPE_CONSTRUCTION(string, std::string);
CPP_TYPE_CONSTRUCTION(GenericArrayRef, GenericArrayRef);
+ CPP_TYPE_CONSTRUCTION(GenericMutableArrayRef, GenericMutableArrayRef);
#undef CPP_TYPE_CONSTRUCTION
}
@@ -114,6 +116,7 @@ CPP_TYPE_GETTER(int32, int32_t)
CPP_TYPE_GETTER(rgba_f, BLI::rgba_f)
CPP_TYPE_GETTER(string, std::string)
CPP_TYPE_GETTER(GenericArrayRef, GenericArrayRef);
+CPP_TYPE_GETTER(GenericMutableArrayRef, GenericMutableArrayRef);
#undef CPP_TYPE_GETTER
diff --git a/source/blender/blenkernel/intern/generic_array_ref.cc b/source/blender/blenkernel/intern/generic_array_ref.cc
index 6f9072acf68..65e47b0a6e7 100644
--- a/source/blender/blenkernel/intern/generic_array_ref.cc
+++ b/source/blender/blenkernel/intern/generic_array_ref.cc
@@ -9,20 +9,28 @@ namespace BKE {
using BLI::Map;
-using TypeMapping = Map<const CPPType *, std::unique_ptr<ArrayRefCPPType>>;
+using ArrayRefTypeMapping = Map<const CPPType *, std::unique_ptr<ArrayRefCPPType>>;
+using MutableArrayRefTypeMapping = Map<const CPPType *, std::unique_ptr<MutableArrayRefCPPType>>;
-BLI_LAZY_INIT_STATIC(TypeMapping, get_mapping)
+BLI_LAZY_INIT_STATIC(ArrayRefTypeMapping, get_type_mapping)
{
- return TypeMapping{};
+ return ArrayRefTypeMapping{};
}
-static std::mutex mapping_mutex;
+BLI_LAZY_INIT_STATIC(MutableArrayRefTypeMapping, get_mutable_type_mapping)
+{
+ return MutableArrayRefTypeMapping{};
+}
+
+static std::mutex map_mutex__immutable;
+static std::mutex map_mutex__mutable;
ArrayRefCPPType &get_generic_array_ref_cpp_type(CPPType &base)
{
- std::lock_guard<std::mutex> lock(mapping_mutex);
+ std::lock_guard<std::mutex> lock(map_mutex__immutable);
+
+ ArrayRefTypeMapping &mapping = get_type_mapping();
- TypeMapping &mapping = get_mapping();
auto &type = mapping.lookup_or_add(&base, [&]() {
ArrayRefCPPType *new_type = new ArrayRefCPPType(base);
return std::unique_ptr<ArrayRefCPPType>(new_type);
@@ -30,6 +38,20 @@ ArrayRefCPPType &get_generic_array_ref_cpp_type(CPPType &base)
return *type;
}
+MutableArrayRefCPPType &get_generic_mutable_array_ref_cpp_type(CPPType &base)
+{
+ std::lock_guard<std::mutex> lock(map_mutex__mutable);
+
+ MutableArrayRefTypeMapping &mapping = get_mutable_type_mapping();
+
+ auto &type = mapping.lookup_or_add(&base, [&]() {
+ MutableArrayRefCPPType *new_type = new MutableArrayRefCPPType(base);
+ return std::unique_ptr<MutableArrayRefCPPType>(new_type);
+ });
+
+ return *type;
+}
+
ArrayRefCPPType::ArrayRefCPPType(CPPType &base_type)
: CPPType("GenericArrayRef for " + base_type.name(),
get_cpp_type<GenericArrayRef>(),
@@ -38,4 +60,12 @@ ArrayRefCPPType::ArrayRefCPPType(CPPType &base_type)
{
}
+MutableArrayRefCPPType::MutableArrayRefCPPType(CPPType &base_type)
+ : CPPType("GenericMutableArrayRef for " + base_type.name(),
+ get_cpp_type<GenericMutableArrayRef>(),
+ MutableArrayRefCPPType::ConstructDefaultCB),
+ m_base_type(base_type)
+{
+}
+
} // namespace BKE
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list