diff options
| author | YongDo-Hyun <froster12@naver.com> | 2025-12-27 13:05:30 +0300 |
|---|---|---|
| committer | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-03-27 19:57:09 +0300 |
| commit | b6d496b1e83853cd272a8ffdea273c59bbf4b87c (patch) | |
| tree | 249509918badba23d7d45af345ef7c2a06212b44 /src | |
| parent | 37a3f01be6fb37d6cb04ae12216b5d74cef2aca9 (diff) | |
| download | Project-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.cpp | 48 | ||||
| -rw-r--r-- | src/value.cpp | 19 |
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; } |
