diff options
| author | YongDo-Hyun <froster12@naver.com> | 2025-12-27 01:06:26 +0300 |
|---|---|---|
| committer | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-03-27 19:57:09 +0300 |
| commit | df0519bea5390ac8f3d9a0e168e2f799bd068985 (patch) | |
| tree | e05da30517566a26ae3380c26bb38a88c9c92f24 /src/value.cpp | |
| parent | a89a6eac665c1b53d2c511d2e8ccb40e3a6949c4 (diff) | |
| download | Project-Tick-df0519bea5390ac8f3d9a0e168e2f799bd068985.tar.gz Project-Tick-df0519bea5390ac8f3d9a0e168e2f799bd068985.zip | |
feat: enhance error handling in ozlibstream and improve JSON escaping in json_formatter; add make_numeric_tag for cleaner tag creation
Signed-off-by: YongDo-Hyun <froster12@naver.com>
Diffstat (limited to 'src/value.cpp')
| -rw-r--r-- | src/value.cpp | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/src/value.cpp b/src/value.cpp index 8c16da6e23..273049baf9 100644 --- a/src/value.cpp +++ b/src/value.cpp @@ -67,22 +67,30 @@ 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) { - switch(default_type) - { - case tag_type::Byte: tag_ptr.reset(new tag_byte(static_cast<int8_t>(val))); break; - case tag_type::Short: tag_ptr.reset(new tag_short(static_cast<int16_t>(val))); break; - case tag_type::Int: tag_ptr.reset(new tag_int(static_cast<int32_t>(val))); break; - case tag_type::Long: tag_ptr.reset(new tag_long(static_cast<int64_t>(val))); break; - case tag_type::Float: tag_ptr.reset(new tag_float(static_cast<float>(val))); break; - case tag_type::Double: tag_ptr.reset(new tag_double(static_cast<double>(val))); break; - default: throw std::invalid_argument("Invalid default_type"); - } + tag_ptr = make_numeric_tag(default_type, val); + if(!tag_ptr) + throw std::invalid_argument("Invalid default_type"); return; } @@ -97,16 +105,9 @@ namespace // helper functions local to this translation unit if(static_cast<int>(existing_type) < static_cast<int>(incoming_type)) { // replace with a new, wider tag that preserves the value - switch(incoming_type) - { - case tag_type::Byte: tag_ptr.reset(new tag_byte(static_cast<int8_t>(val))); break; - case tag_type::Short: tag_ptr.reset(new tag_short(static_cast<int16_t>(val))); break; - case tag_type::Int: tag_ptr.reset(new tag_int(static_cast<int32_t>(val))); break; - case tag_type::Long: tag_ptr.reset(new tag_long(static_cast<int64_t>(val))); break; - case tag_type::Float: tag_ptr.reset(new tag_float(static_cast<float>(val))); break; - case tag_type::Double: tag_ptr.reset(new tag_double(static_cast<double>(val))); break; - default: throw std::bad_cast(); - } + tag_ptr = make_numeric_tag(incoming_type, val); + if(!tag_ptr) + throw std::bad_cast(); return; } |
