Commit: 9b3a4c1697994128139bcfe0b2e594012ab4c5c4
Author: Jacques Lucke
Date:   Tue Jan 22 15:00:17 2019 +0100
Branches: functions
https://developer.blender.org/rB9b3a4c1697994128139bcfe0b2e594012ab4c5c4

real SmallVector implementation + make types const

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

M       source/blender/blenlib/BLI_small_vector.hpp
M       source/blender/functions/FN_functions.hpp
M       source/blender/functions/intern/function.cpp
M       source/blender/functions/types/numeric.hpp

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

diff --git a/source/blender/blenlib/BLI_small_vector.hpp 
b/source/blender/blenlib/BLI_small_vector.hpp
index 28fb0b4c27a..68153dba55a 100644
--- a/source/blender/blenlib/BLI_small_vector.hpp
+++ b/source/blender/blenlib/BLI_small_vector.hpp
@@ -1,23 +1,28 @@
 #pragma once
 
 #include "BLI_utildefines.h"
-#include <vector>
+#include <cstdlib>
 
 namespace BLI {
 
        template<typename T, uint N = 4>
        class SmallVector {
        private:
-               using elements_t = std::vector<T>;
-               elements_t elements;
+               T m_small_buffer[N];
+               T *m_elements;
+               uint m_size = 0;
+               uint m_capacity = N;
 
        public:
-               using iterator = typename elements_t::iterator;
-               using const_iterator = typename elements_t::const_iterator;
-
-               SmallVector() {}
+               SmallVector()
+               {
+                       this->m_elements = this->m_small_buffer;
+                       this->m_capacity = N;
+                       this->m_size = 0;
+               }
 
                SmallVector(std::initializer_list<T> values)
+                       : SmallVector()
                {
                        for (T value : values) {
                                this->append(value);
@@ -26,35 +31,47 @@ namespace BLI {
 
                void append(T value)
                {
-                       this->elements.push_back(value);
+                       if (this->m_size >= this->m_capacity) {
+                               this->m_capacity *= 2;
+                               uint new_byte_size = sizeof(T) * 
this->m_capacity;
+                               if (this->m_elements == this->m_small_buffer) {
+                                       this->m_elements = (T 
*)std::malloc(new_byte_size);
+                               }
+                               else {
+                                       this->m_elements = (T 
*)std::realloc(this->m_elements, new_byte_size);
+                               }
+                       }
+
+                       this->m_elements[this->m_size] = value;
+                       this->m_size++;
                }
 
                uint size() const
                {
-                       return this->elements.size();
+                       return this->m_size;
                }
 
                T &operator[](const int index)
                {
                        BLI_assert(index >= 0 && index < this->size());
-                       return this->elements[index];
+                       return this->m_elements[index];
                }
 
                T operator[](const int index) const
                {
                        BLI_assert(index >= 0 && index < this->size());
-                       return this->elements[index];
+                       return this->m_elements[index];
                }
 
-               const_iterator begin() const
-               { return this->elements.begin(); }
-               const_iterator end() const
-               { return this->elements.end(); }
+               T *begin() const
+               { return this->m_elements; }
+               T *end() const
+               { return this->begin() + this->size(); }
 
-               const_iterator cbegin() const
-               { return this->elements.cbegin(); }
-               const_iterator cend() const
-               { return this->elements.cend(); }
+               const T *cbegin() const
+               { return this->begin(); }
+               const T *cend() const
+               { return this->end(); }
        };
 
 } /* namespace BLI */
\ No newline at end of file
diff --git a/source/blender/functions/FN_functions.hpp 
b/source/blender/functions/FN_functions.hpp
index b3481502ce8..0f11e920578 100644
--- a/source/blender/functions/FN_functions.hpp
+++ b/source/blender/functions/FN_functions.hpp
@@ -15,7 +15,7 @@ namespace FN {
        class Signature;
        class Function;
 
-       using SmallTypeVector = SmallVector<Type *>;
+       using SmallTypeVector = SmallVector<const Type *>;
 
        class Type {
        public:
diff --git a/source/blender/functions/intern/function.cpp 
b/source/blender/functions/intern/function.cpp
index 28cbd0c1e10..84c186bd0e9 100644
--- a/source/blender/functions/intern/function.cpp
+++ b/source/blender/functions/intern/function.cpp
@@ -25,7 +25,7 @@ ValueArray::ValueArray(SmallTypeVector types)
        : types(types)
 {
        int total_size = 0;
-       for (Type *type : types) {
+       for (const Type *type : types) {
                this->offsets.append(total_size);
                total_size += type->size();
        }
diff --git a/source/blender/functions/types/numeric.hpp 
b/source/blender/functions/types/numeric.hpp
index 57f6be2b07e..1757fccf148 100644
--- a/source/blender/functions/types/numeric.hpp
+++ b/source/blender/functions/types/numeric.hpp
@@ -32,8 +32,8 @@ namespace FN::Types {
                }
        };
 
-       static FloatType *float_ty = new FloatType();
-       static Int32Type *int32_ty = new Int32Type();
-       static FloatVectorType<3> *floatvec3d_ty = new FloatVectorType<3>();
+       static const FloatType *float_ty = new FloatType();
+       static const Int32Type *int32_ty = new Int32Type();
+       static const FloatVectorType<3> *floatvec3d_ty = new 
FloatVectorType<3>();
 
 } /* namespace FN::Types */
\ No newline at end of file

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

Reply via email to