summaryrefslogtreecommitdiff
path: root/src/core/smallvec_type.hpp
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2012-07-29 20:02:25 +0000
committerfrosch <frosch@openttd.org>2012-07-29 20:02:25 +0000
commitf9819c66459e9aededd805c075f1b37da73bac6f (patch)
treea020c1f8b3f70bd13937462415794f77fdf8e262 /src/core/smallvec_type.hpp
parent9f6ab0541ecda51be09437050bbb7ea488018f01 (diff)
downloadopenttd-f9819c66459e9aededd805c075f1b37da73bac6f.tar.xz
(svn r24448) -Fix [FS#5255]: Copy constructor and assignment operator cannot be implicit template specialisations. (adf88)
Diffstat (limited to 'src/core/smallvec_type.hpp')
-rw-r--r--src/core/smallvec_type.hpp38
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()