summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2018-04-21 22:21:05 +0200
committerPetr Mrázek <peterix@gmail.com>2020-06-07 21:23:04 +0200
commitd7deea6dac9ca210a4dec273a7e10453492e04b5 (patch)
treecd64d0170695fe72509641045c866330946f05d1 /src
parent92f8d57227feb94643378ecf595626c60c0f59b8 (diff)
downloadProject-Tick-d7deea6dac9ca210a4dec273a7e10453492e04b5.tar.gz
Project-Tick-d7deea6dac9ca210a4dec273a7e10453492e04b5.zip
Implement tag 12 (array of 64bit long) and fix tests
Diffstat (limited to 'src')
-rw-r--r--src/tag.cpp4
-rw-r--r--src/tag_array.cpp49
-rw-r--r--src/tag_list.cpp1
-rw-r--r--src/text/json_formatter.cpp12
4 files changed, 58 insertions, 8 deletions
diff --git a/src/tag.cpp b/src/tag.cpp
index df4d8cb555..7e3be3911c 100644
--- a/src/tag.cpp
+++ b/src/tag.cpp
@@ -33,7 +33,7 @@ static_assert(std::numeric_limits<float>::is_iec559 && std::numeric_limits<doubl
bool is_valid_type(int type, bool allow_end)
{
- return (allow_end ? 0 : 1) <= type && type <= 11;
+ return (allow_end ? 0 : 1) <= type && type <= 12;
}
std::unique_ptr<tag> tag::clone() &&
@@ -56,6 +56,7 @@ std::unique_ptr<tag> tag::create(tag_type type)
case tag_type::List: return make_unique<tag_list>();
case tag_type::Compound: return make_unique<tag_compound>();
case tag_type::Int_Array: return make_unique<tag_int_array>();
+ case tag_type::Long_Array: return make_unique<tag_long_array>();
default: throw std::invalid_argument("Invalid tag type");
}
@@ -89,6 +90,7 @@ std::ostream& operator<<(std::ostream& os, tag_type tt)
case tag_type::List: return os << "list";
case tag_type::Compound: return os << "compound";
case tag_type::Int_Array: return os << "int_array";
+ case tag_type::Long_Array: return os << "long_array";
case tag_type::Null: return os << "null";
default: return os << "invalid";
diff --git a/src/tag_array.cpp b/src/tag_array.cpp
index 6173dbb1dd..4a1668ad1e 100644
--- a/src/tag_array.cpp
+++ b/src/tag_array.cpp
@@ -43,26 +43,48 @@ void tag_array<int8_t>::read_payload(io::stream_reader& reader)
throw io::input_error("Error reading contents of tag_byte_array");
}
+template<typename T>
+void tag_array<T>::read_payload(io::stream_reader& reader)
+{
+ int32_t length;
+ reader.read_num(length);
+ if(length < 0)
+ reader.get_istr().setstate(std::ios::failbit);
+ if(!reader.get_istr())
+ throw io::input_error("Error reading length of generic array tag");
+
+ data.clear();
+ data.reserve(length);
+ for(T i = 0; i < length; ++i)
+ {
+ T val;
+ reader.read_num(val);
+ data.push_back(val);
+ }
+ if(!reader.get_istr())
+ throw io::input_error("Error reading contents of generic array tag");
+}
+
template<>
-void tag_array<int32_t>::read_payload(io::stream_reader& reader)
+void tag_array<int64_t>::read_payload(io::stream_reader& reader)
{
int32_t length;
reader.read_num(length);
if(length < 0)
reader.get_istr().setstate(std::ios::failbit);
if(!reader.get_istr())
- throw io::input_error("Error reading length of tag_int_array");
+ throw io::input_error("Error reading length of tag_long_array");
data.clear();
data.reserve(length);
for(int32_t i = 0; i < length; ++i)
{
- int32_t val;
+ int64_t val;
reader.read_num(val);
data.push_back(val);
}
if(!reader.get_istr())
- throw io::input_error("Error reading contents of tag_int_array");
+ throw io::input_error("Error reading contents of tag_long_array");
}
//Writing
@@ -78,16 +100,29 @@ void tag_array<int8_t>::write_payload(io::stream_writer& writer) const
writer.get_ostr().write(reinterpret_cast<const char*>(data.data()), data.size());
}
+template<typename T>
+void tag_array<T>::write_payload(io::stream_writer& writer) const
+{
+ if(size() > io::stream_writer::max_array_len)
+ {
+ writer.get_ostr().setstate(std::ios::failbit);
+ throw std::length_error("Generic array is too large for NBT");
+ }
+ writer.write_num(static_cast<int32_t>(size()));
+ for(T i: data)
+ writer.write_num(i);
+}
+
template<>
-void tag_array<int32_t>::write_payload(io::stream_writer& writer) const
+void tag_array<int64_t>::write_payload(io::stream_writer& writer) const
{
if(size() > io::stream_writer::max_array_len)
{
writer.get_ostr().setstate(std::ios::failbit);
- throw std::length_error("Int array is too large for NBT");
+ throw std::length_error("Long array is too large for NBT");
}
writer.write_num(static_cast<int32_t>(size()));
- for(int32_t i: data)
+ for(int64_t i: data)
writer.write_num(i);
}
diff --git a/src/tag_list.cpp b/src/tag_list.cpp
index 67a3d4c15f..1650e602e3 100644
--- a/src/tag_list.cpp
+++ b/src/tag_list.cpp
@@ -37,6 +37,7 @@ tag_list::tag_list(std::initializer_list<tag_byte_array> il) { init<tag_byte_arr
tag_list::tag_list(std::initializer_list<tag_list> il) { init<tag_list>(il); }
tag_list::tag_list(std::initializer_list<tag_compound> il) { init<tag_compound>(il); }
tag_list::tag_list(std::initializer_list<tag_int_array> il) { init<tag_int_array>(il); }
+tag_list::tag_list(std::initializer_list<tag_long_array> il) { init<tag_long_array>(il); }
tag_list::tag_list(std::initializer_list<value> init)
{
diff --git a/src/text/json_formatter.cpp b/src/text/json_formatter.cpp
index 9b47210c6a..3001ff0958 100644
--- a/src/text/json_formatter.cpp
+++ b/src/text/json_formatter.cpp
@@ -151,6 +151,18 @@ namespace //anonymous
os << "]";
}
+ void visit(const tag_long_array& la) override
+ {
+ os << "[";
+ for(unsigned int i = 0; i < la.size(); ++i)
+ {
+ os << la[i];
+ if(i != la.size()-1)
+ os << ", ";
+ }
+ os << "]";
+ }
+
private:
const std::string indent_str = " ";