Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2016-05-20 11:56:10 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2016-05-20 11:58:11 +0300
commit9d1953311774673453da4a8f33ff37c771762c49 (patch)
tree56a6f0ba14ffc30b2fcfdd53dfa136742f3640fc /intern/cycles/util/util_vector.h
parent6e416b6bdf283f2337b962c05f93781eac00ff18 (diff)
Fix T48472: issue in array refactor, causing performance regression in BVH build.
Diffstat (limited to 'intern/cycles/util/util_vector.h')
-rw-r--r--intern/cycles/util/util_vector.h55
1 files changed, 19 insertions, 36 deletions
diff --git a/intern/cycles/util/util_vector.h b/intern/cycles/util/util_vector.h
index a8a1c4cf59d..8f833af1844 100644
--- a/intern/cycles/util/util_vector.h
+++ b/intern/cycles/util/util_vector.h
@@ -130,14 +130,8 @@ public:
array& operator=(const array& from)
{
if(this != &from) {
- clear();
-
- if(from.datasize_ > 0) {
- data_ = mem_allocate(from.datasize_);
- memcpy(data_, from.data_, from.datasize_*sizeof(T));
- datasize_ = from.datasize_;
- capacity_ = datasize_;
- }
+ resize(from.size());
+ memcpy(data_, from.data_, datasize_*sizeof(T));
}
return *this;
@@ -145,12 +139,9 @@ public:
array& operator=(const vector<T>& from)
{
- clear();
+ resize(from.size());
if(from.size() > 0) {
- datasize_ = from.size();
- capacity_ = datasize_;
- data_ = mem_allocate(datasize_);
memcpy(data_, &from[0], datasize_*sizeof(T));
}
@@ -164,42 +155,34 @@ public:
bool operator==(const vector<T>& other)
{
- if(datasize_ != other.datasize_)
+ if(datasize_ != other.datasize_) {
return false;
+ }
return memcmp(data_, other.data_, datasize_*sizeof(T)) == 0;
}
- void steal_data(array& from)
- {
- if(this != &from)
- {
- clear();
-
- data_ = from.data_;
- datasize_ = from.datasize_;
- capacity_ = from.capacity_;
-
- from.data_ = NULL;
- from.datasize_ = 0;
- from.capacity_ = 0;
- }
- }
-
T* resize(size_t newsize)
{
if(newsize == 0) {
clear();
}
- else if(newsize != capacity_) {
- T *newdata = mem_allocate(newsize);
- if(data_ != NULL) {
- memcpy(newdata, data_, ((datasize_ < newsize)? datasize_: newsize)*sizeof(T));
- mem_free(data_, capacity_);
+ else if(newsize != datasize_) {
+ if(newsize > capacity_) {
+ T *newdata = mem_allocate(newsize);
+ if(newdata == NULL) {
+ /* Allocation failed, likely out of memory. */
+ clear();
+ return NULL;
+ }
+ else if(data_ != NULL) {
+ memcpy(newdata, data_, ((datasize_ < newsize)? datasize_: newsize)*sizeof(T));
+ mem_free(data_, capacity_);
+ }
+ data_ = newdata;
+ capacity_ = newsize;
}
- data_ = newdata;
datasize_ = newsize;
- capacity_ = newsize;
}
return data_;
}