Commit: 75ecfd03ab164e6047cda6cc7a3bd93a683d4320
Author: Jacques Lucke
Date:   Fri Mar 8 14:31:50 2019 +0100
Branches: functions
https://developer.blender.org/rB75ecfd03ab164e6047cda6cc7a3bd93a683d4320

more generic CPP and LLVM type info for lists

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

M       source/blender/functions/types/numeric_lists.cpp

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

diff --git a/source/blender/functions/types/numeric_lists.cpp 
b/source/blender/functions/types/numeric_lists.cpp
index eab4dd72d55..336afd4a1c9 100644
--- a/source/blender/functions/types/numeric_lists.cpp
+++ b/source/blender/functions/types/numeric_lists.cpp
@@ -7,20 +7,30 @@
 
 namespace FN { namespace Types {
 
-       class FloatListType : public CPPTypeInfo {
+       template<typename T>
+       class ListCPPTypeInfo : public CPPTypeInfo {
+       private:
+               static List<T> *list_from_ptr(void *ptr)
+               {
+                       return ((SharedList<T> *)ptr)->ptr();
+               }
+
+       public:
                uint size_of_type() const override
                {
-                       return sizeof(FloatList *);
+                       return sizeof(SharedList<T>);
                }
 
                void construct_default(void *ptr) const override
                {
-                       *(FloatList **)ptr = new FloatList();
+                       List<T> *list = new List<T>();
+                       *(SharedList<T> *)ptr = 
SharedList<T>::FromPointer(list);
                }
 
                void destruct_type(void *ptr) const override
                {
-                       (*(FloatList **)ptr)->remove_user();
+                       List<T> *list = this->list_from_ptr(ptr);
+                       list->remove_user();
                }
 
                void copy_to_initialized(void *src, void *dst) const override
@@ -31,37 +41,48 @@ namespace FN { namespace Types {
 
                void copy_to_uninitialized(void *src, void *dst) const override
                {
-                       FloatList *list = (FloatList *)src;
+                       List<T> *list = this->list_from_ptr(src);
                        list->new_user();
-                       (*(FloatList **)dst) = list;
+                       *(SharedList<T> *)dst = 
SharedList<T>::FromPointer(list);
                }
        };
 
-       static void *copy_func(void *value)
-       {
-               FloatList *list = (FloatList *)value;
-               list->new_user();
-               return list;
-       }
+       template<typename T>
+       class ListLLVMTypeInfo : public LLVMTypeInfo {
+       private:
+               static void *copy_func(void *value)
+               {
+                       List<T> *list = (List<T> *)value;
+                       list->new_user();
+                       return list;
+               }
 
-       static void free_func(void *value)
-       {
-               FloatList *list = (FloatList *)value;
-               list->remove_user();
-       }
+               static void free_func(void *value)
+               {
+                       List<T> *list = (List<T> *)value;
+                       list->remove_user();
+               }
 
-       static void *default_func()
-       {
-               return new FloatList();
-       }
+               static void *default_func()
+               {
+                       return new List<T>();
+               }
 
+       public:
+               static LLVMTypeInfo *Create()
+               {
+                       static_assert(sizeof(SharedList<T>) == sizeof(List<T> 
*),
+                               "Currently it is assumed that only a pointer to 
the list is stored");
+                       return new PointerLLVMTypeInfo(
+                               copy_func, free_func, default_func);
+               }
+       };
 
        LAZY_INIT_REF__NO_ARG(SharedType, get_float_list_type)
        {
                SharedType type = SharedType::New("Float List");
-               type->extend(new FloatListType());
-               type->extend(new PointerLLVMTypeInfo(
-                       copy_func, free_func, default_func));
+               type->extend(new ListCPPTypeInfo<float>());
+               type->extend(ListLLVMTypeInfo<float>::Create());
                return type;
        }

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

Reply via email to