[Bf-blender-cvs] [bd44822f892] functions: implement other small vector constructors

Jacques Lucke noreply at git.blender.org
Sun Feb 10 20:24:54 CET 2019


Commit: bd44822f8924ca2d0bd93651fe887f84715509be
Author: Jacques Lucke
Date:   Tue Jan 22 16:44:44 2019 +0100
Branches: functions
https://developer.blender.org/rBbd44822f8924ca2d0bd93651fe887f84715509be

implement other small vector constructors

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

M	source/blender/blenlib/BLI_small_vector.hpp

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

diff --git a/source/blender/blenlib/BLI_small_vector.hpp b/source/blender/blenlib/BLI_small_vector.hpp
index 4cfd888b07d..f2b62c73d50 100644
--- a/source/blender/blenlib/BLI_small_vector.hpp
+++ b/source/blender/blenlib/BLI_small_vector.hpp
@@ -2,6 +2,7 @@
 
 #include "BLI_utildefines.h"
 #include <cstdlib>
+#include <cstring>
 
 namespace BLI {
 
@@ -29,6 +30,33 @@ namespace BLI {
 			}
 		}
 
+		SmallVector(const SmallVector &other)
+		{
+			if (other.is_small()) {
+				this->m_elements = this->m_small_buffer;
+				std::memcpy(this->m_small_buffer, other.m_small_buffer, sizeof(T) * other.m_size);
+			}
+			else {
+				this->m_elements = (T *)std::malloc(sizeof(T) * other.m_capacity);
+				std::memcpy(this->m_elements, other.m_elements, other.m_size);
+			}
+			this->m_capacity = other.m_capacity;
+			this->m_size = other.m_size;
+		}
+
+		SmallVector(SmallVector &&other)
+		{
+			if (other.is_small()) {
+				this->m_elements = this->m_small_buffer;
+				std::memcpy(this->m_small_buffer, other.m_small_buffer, sizeof(T) * other.m_size);
+			}
+			else {
+				this->m_elements = other.m_elements;
+			}
+			this->m_capacity = other.m_capacity;
+			this->m_size = other.m_size;
+		}
+
 		~SmallVector()
 		{
 			if (!this->is_small()) {
@@ -36,6 +64,30 @@ namespace BLI {
 			}
 		}
 
+		SmallVector &operator=(SmallVector &&other)
+		{
+			if (this == &other) {
+				return *this;
+			}
+
+			if (!this->is_small()) {
+				std::free(this->m_elements);
+			}
+
+			if (other.is_small()) {
+				this->m_elements = this->m_small_buffer;
+				std::memcpy(this->m_small_buffer, other.m_small_buffer, sizeof(T) * other.m_size);
+			}
+			else {
+				this->m_elements = other.m_elements;
+			}
+
+			this->m_capacity = other.m_capacity;
+			this->m_size = other.m_size;
+
+			return *this;
+		}
+
 		void append(T value)
 		{
 			if (this->m_size >= this->m_capacity) {



More information about the Bf-blender-cvs mailing list