[Bf-blender-cvs] [f4e7621ee7c] functions: don't construct unneeded objects in SmallVector

Jacques Lucke noreply at git.blender.org
Sun Feb 10 20:25:32 CET 2019


Commit: f4e7621ee7c574b4064d948466a3cdbc77779e33
Author: Jacques Lucke
Date:   Sun Jan 27 10:59:55 2019 +0100
Branches: functions
https://developer.blender.org/rBf4e7621ee7c574b4064d948466a3cdbc77779e33

don't construct unneeded objects in SmallVector

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

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 28d9af735e0..222c8e0ca2f 100644
--- a/source/blender/blenlib/BLI_small_vector.hpp
+++ b/source/blender/blenlib/BLI_small_vector.hpp
@@ -10,7 +10,7 @@ namespace BLI {
 	template<typename T, uint N = 4>
 	class SmallVector {
 	private:
-		T m_small_buffer[N];
+		char m_small_buffer[sizeof(T) * N];
 		T *m_elements;
 		uint m_size = 0;
 		uint m_capacity = N;
@@ -18,7 +18,7 @@ namespace BLI {
 	public:
 		SmallVector()
 		{
-			this->m_elements = this->m_small_buffer;
+			this->m_elements = this->small_buffer();
 			this->m_capacity = N;
 			this->m_size = 0;
 		}
@@ -62,6 +62,7 @@ namespace BLI {
 				return *this;
 			}
 
+			this->destruct_elements();
 			this->free_own_buffer();
 			this->copy_from_other(other);
 
@@ -70,6 +71,7 @@ namespace BLI {
 
 		SmallVector &operator=(SmallVector &&other)
 		{
+			this->destruct_elements();
 			this->free_own_buffer();
 			this->steal_from_other(std::forward<SmallVector>(other));
 
@@ -87,7 +89,7 @@ namespace BLI {
 				this->grow(std::max(this->m_capacity * 2, (uint)1));
 			}
 
-			this->m_elements[this->m_size] = value;
+			std::uninitialized_copy(&value, &value + 1, this->end());
 			this->m_size++;
 		}
 
@@ -126,9 +128,14 @@ namespace BLI {
 		{ return this->end(); }
 
 	private:
+		T *small_buffer() const
+		{
+			return (T *)this->m_small_buffer;
+		}
+
 		bool is_small() const
 		{
-			return this->m_elements == this->m_small_buffer;
+			return this->m_elements == this->small_buffer();
 		}
 
 		void grow(uint min_capacity)
@@ -145,9 +152,7 @@ namespace BLI {
 				std::make_move_iterator(this->end()),
 				new_array);
 
-			for (uint i = 0; i < this->m_size; i++) {
-				(this->m_elements + i)->~T();
-			}
+			this->destruct_elements();
 
 			if (!this->is_small()) {
 				std::free(this->m_elements);
@@ -169,14 +174,13 @@ namespace BLI {
 		void copy_from_other(const SmallVector &other)
 		{
 			if (other.is_small()) {
-				this->m_elements = this->m_small_buffer;
-				std::copy(other.begin(), other.end(), this->m_elements);
+				this->m_elements = this->small_buffer();
 			}
 			else {
 				this->m_elements = (T *)std::malloc(sizeof(T) * other.m_capacity);
-				std::uninitialized_copy(other.begin(), other.end(), this->m_elements);
 			}
 
+			std::uninitialized_copy(other.begin(), other.end(), this->m_elements);
 			this->m_capacity = other.m_capacity;
 			this->m_size = other.m_size;
 		}
@@ -184,11 +188,11 @@ namespace BLI {
 		void steal_from_other(SmallVector &&other)
 		{
 			if (other.is_small()) {
-				std::copy(
+				std::uninitialized_copy(
 					std::make_move_iterator(other.begin()),
 					std::make_move_iterator(other.end()),
-					this->m_small_buffer);
-				this->m_elements = this->m_small_buffer;
+					this->small_buffer());
+				this->m_elements = this->small_buffer();
 			}
 			else {
 				this->m_elements = other.m_elements;
@@ -199,6 +203,13 @@ namespace BLI {
 
 			other.m_elements = nullptr;
 		}
+
+		void destruct_elements()
+		{
+			for (uint i = 0; i < this->m_size; i++) {
+				(this->m_elements + i)->~T();
+			}
+		}
 	};
 
 } /* namespace BLI */
\ No newline at end of file



More information about the Bf-blender-cvs mailing list