summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/tag.h8
-rw-r--r--include/tag_compound.h2
-rw-r--r--include/tag_primitive.h8
-rw-r--r--include/tag_string.h2
4 files changed, 20 insertions, 0 deletions
diff --git a/include/tag.h b/include/tag.h
index acc537500f..a9cbc0019f 100644
--- a/include/tag.h
+++ b/include/tag.h
@@ -64,6 +64,14 @@ private:
* @param rhs an instance of the same class as @c *this
*/
virtual bool equals(const tag& rhs) const = 0;
+
+ /**
+ * @brief Assigns the given tag if the class is the same
+ * @throw std::bad_cast if @c rhs is not the same type as @c *this
+ */
+ virtual tag& assign(tag&& rhs) = 0;
+
+ friend class value;
};
}
diff --git a/include/tag_compound.h b/include/tag_compound.h
index fb2d27123a..32380a0c6c 100644
--- a/include/tag_compound.h
+++ b/include/tag_compound.h
@@ -116,6 +116,8 @@ private:
bool equals(const tag& rhs) const override;
+ tag_compound& assign(tag&& rhs) override;
+
friend bool operator==(const tag_compound& lhs, const tag_compound& rhs);
friend bool operator!=(const tag_compound& lhs, const tag_compound& rhs);
};
diff --git a/include/tag_primitive.h b/include/tag_primitive.h
index 73c7b1e727..9c4cd3b2b9 100644
--- a/include/tag_primitive.h
+++ b/include/tag_primitive.h
@@ -59,6 +59,8 @@ private:
T value;
bool equals(const tag& rhs) const override;
+
+ tag_primitive<T>& assign(tag&& rhs) override;
};
template<class T> bool operator==(const tag_primitive<T>& lhs, const tag_primitive<T>& rhs);
@@ -127,6 +129,12 @@ bool tag_primitive<T>::equals(const tag& rhs) const
}
template<class T>
+tag_primitive<T>& tag_primitive<T>::assign(tag&& rhs)
+{
+ return *this = dynamic_cast<tag_primitive<T>&&>(rhs);
+}
+
+template<class T>
bool operator==(const tag_primitive<T>& lhs, const tag_primitive<T>& rhs)
{
return lhs.get() == rhs.get();
diff --git a/include/tag_string.h b/include/tag_string.h
index f1b622eee9..7b71e9122a 100644
--- a/include/tag_string.h
+++ b/include/tag_string.h
@@ -53,6 +53,8 @@ private:
std::string value;
bool equals(const tag& rhs) const override;
+
+ tag_string& assign(tag&& rhs) override;
};
bool operator==(const tag_string& lhs, const tag_string& rhs);