diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-05-20 11:56:10 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2016-06-08 22:45:40 +0300 |
commit | a84bc16220dfd662ceeb4f2f1419b1b38fc95e50 (patch) | |
tree | 22907e883bc94fab881c721d8e2c20341552dac4 /intern | |
parent | 5c04e182f2c6c34056e583a54e729123402a42a6 (diff) |
Fix T48472: issue in array refactor, causing performance regression in BVH build.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/util/util_vector.h | 55 |
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_; } |