summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYongDo-Hyun <froster12@naver.com>2025-12-27 13:05:30 +0300
committerMehmet Samet Duman <yongdohyun@projecttick.org>2026-03-27 19:57:09 +0300
commitb6d496b1e83853cd272a8ffdea273c59bbf4b87c (patch)
tree249509918badba23d7d45af345ef7c2a06212b44 /src
parent37a3f01be6fb37d6cb04ae12216b5d74cef2aca9 (diff)
downloadProject-Tick-b6d496b1e83853cd272a8ffdea273c59bbf4b87c.tar.gz
Project-Tick-b6d496b1e83853cd272a8ffdea273c59bbf4b87c.zip
feat: add numeric tag creation methods and corresponding tests for value assignments
Signed-off-by: YongDo-Hyun <froster12@naver.com>
Diffstat (limited to 'src')
-rw-r--r--src/tag.cpp48
-rw-r--r--src/value.cpp19
2 files changed, 49 insertions, 18 deletions
diff --git a/src/tag.cpp b/src/tag.cpp
index 0bff2c6440..6175a36293 100644
--- a/src/tag.cpp
+++ b/src/tag.cpp
@@ -45,6 +45,24 @@ std::unique_ptr<tag> tag::clone() &&
return std::move(*this).move_clone();
}
+namespace
+{
+ template<typename T>
+ std::unique_ptr<tag> create_numeric_tag(tag_type type, T val)
+ {
+ switch(type)
+ {
+ case tag_type::Byte: return make_unique<tag_byte>(static_cast<int8_t>(val));
+ case tag_type::Short: return make_unique<tag_short>(static_cast<int16_t>(val));
+ case tag_type::Int: return make_unique<tag_int>(static_cast<int32_t>(val));
+ case tag_type::Long: return make_unique<tag_long>(static_cast<int64_t>(val));
+ case tag_type::Float: return make_unique<tag_float>(static_cast<float>(val));
+ case tag_type::Double: return make_unique<tag_double>(static_cast<double>(val));
+ default: throw std::invalid_argument("Invalid numeric tag type");
+ }
+ }
+}
+
std::unique_ptr<tag> tag::create(tag_type type)
{
switch(type)
@@ -66,6 +84,36 @@ std::unique_ptr<tag> tag::create(tag_type type)
}
}
+std::unique_ptr<tag> tag::create(tag_type type, int8_t val)
+{
+ return create_numeric_tag(type, val);
+}
+
+std::unique_ptr<tag> tag::create(tag_type type, int16_t val)
+{
+ return create_numeric_tag(type, val);
+}
+
+std::unique_ptr<tag> tag::create(tag_type type, int32_t val)
+{
+ return create_numeric_tag(type, val);
+}
+
+std::unique_ptr<tag> tag::create(tag_type type, int64_t val)
+{
+ return create_numeric_tag(type, val);
+}
+
+std::unique_ptr<tag> tag::create(tag_type type, float val)
+{
+ return create_numeric_tag(type, val);
+}
+
+std::unique_ptr<tag> tag::create(tag_type type, double val)
+{
+ return create_numeric_tag(type, val);
+}
+
bool operator==(const tag& lhs, const tag& rhs)
{
if(typeid(lhs) != typeid(rhs))
diff --git a/src/value.cpp b/src/value.cpp
index f07e28d82c..bf0ffcad78 100644
--- a/src/value.cpp
+++ b/src/value.cpp
@@ -67,30 +67,13 @@ void value::set(tag&& t)
namespace // helper functions local to this translation unit
{
template<typename T>
- std::unique_ptr<tag> make_numeric_tag(tag_type type, T val)
- {
- switch(type)
- {
- case tag_type::Byte: return std::unique_ptr<tag>(new tag_byte(val));
- case tag_type::Short: return std::unique_ptr<tag>(new tag_short(val));
- case tag_type::Int: return std::unique_ptr<tag>(new tag_int(val));
- case tag_type::Long: return std::unique_ptr<tag>(new tag_long(val));
- case tag_type::Float: return std::unique_ptr<tag>(new tag_float(val));
- case tag_type::Double: return std::unique_ptr<tag>(new tag_double(val));
- default: return nullptr;
- }
- }
-
- template<typename T>
void assign_numeric_impl(std::unique_ptr<tag>& tag_ptr, T val,
tag_type default_type)
{
using nbt::tag_type;
if(!tag_ptr)
{
- tag_ptr = make_numeric_tag(default_type, val);
- if(!tag_ptr)
- throw std::invalid_argument("Invalid default_type");
+ tag_ptr = tag::create(default_type, val);
return;
}