diff options
author | frosch <frosch@openttd.org> | 2012-07-29 20:02:25 +0000 |
---|---|---|
committer | frosch <frosch@openttd.org> | 2012-07-29 20:02:25 +0000 |
commit | f9819c66459e9aededd805c075f1b37da73bac6f (patch) | |
tree | a020c1f8b3f70bd13937462415794f77fdf8e262 | |
parent | 9f6ab0541ecda51be09437050bbb7ea488018f01 (diff) | |
download | openttd-f9819c66459e9aededd805c075f1b37da73bac6f.tar.xz |
(svn r24448) -Fix [FS#5255]: Copy constructor and assignment operator cannot be implicit template specialisations. (adf88)
-rw-r--r-- | src/core/smallvec_type.hpp | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/src/core/smallvec_type.hpp b/src/core/smallvec_type.hpp index d70505e8c..ccf8dbaec 100644 --- a/src/core/smallvec_type.hpp +++ b/src/core/smallvec_type.hpp @@ -39,21 +39,39 @@ public: * Copy constructor. * @param other The other vector to copy. */ + SmallVector(const SmallVector &other) : data(NULL), items(0), capacity(0) + { + this->Assign(other); + } + + /** + * Generic copy constructor. + * @param other The other vector to copy. + */ template <uint X> SmallVector(const SmallVector<T, X> &other) : data(NULL), items(0), capacity(0) { - MemCpyT<T>(this->Append(other.Length()), other.Begin(), other.Length()); + this->Assign(other); } /** * Assignment. - * @param other The new vector that. + * @param other The other vector to assign. + */ + SmallVector &operator=(const SmallVector &other) + { + this->Assign(other); + return *this; + } + + /** + * Generic assignment. + * @param other The other vector to assign. */ template <uint X> SmallVector &operator=(const SmallVector<T, X> &other) { - this->Reset(); - MemCpyT<T>(this->Append(other.Length()), other.Begin(), other.Length()); + this->Assign(other); return *this; } @@ -63,6 +81,18 @@ public: } /** + * Assign items from other vector. + */ + template <uint X> + inline void Assign(const SmallVector<T, X> &other) + { + if ((const void *)&other == (void *)this) return; + + this->Clear(); + if (other.Length() > 0) MemCpyT<T>(this->Append(other.Length()), other.Begin(), other.Length()); + } + + /** * Remove all items from the list. */ inline void Clear() |