summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorljfa-ag <ljfa-ag@web.de>2015-08-06 10:49:08 +0200
committerljfa-ag <ljfa-ag@web.de>2015-08-06 10:49:08 +0200
commit7e3bd6ce1cc07dab0b5f7aaf30d213af802dbd0a (patch)
tree43353981315184b1e96949c82594d0ef7dcf3bc9
parent9993ebf57fa5822d4d573b359220610962b4a78b (diff)
downloadProject-Tick-7e3bd6ce1cc07dab0b5f7aaf30d213af802dbd0a.tar.gz
Project-Tick-7e3bd6ce1cc07dab0b5f7aaf30d213af802dbd0a.zip
Add stream_reader::read_tag method
-rw-r--r--include/io/stream_reader.h7
-rw-r--r--src/io/stream_reader.cpp8
-rw-r--r--test/io/read_test.cpp9
3 files changed, 19 insertions, 5 deletions
diff --git a/include/io/stream_reader.h b/include/io/stream_reader.h
index 7d97824927..75dba6dddb 100644
--- a/include/io/stream_reader.h
+++ b/include/io/stream_reader.h
@@ -25,6 +25,7 @@
#include <iosfwd>
#include <memory>
#include <stdexcept>
+#include <utility>
namespace nbt
{
@@ -56,6 +57,12 @@ public:
endian::endian get_endian() const;
/**
+ * @brief Reads a named tag from the stream
+ * @throw input_error on failure
+ */
+ std::pair<std::string, std::unique_ptr<tag>> read_tag();
+
+ /**
* @brief Reads a tag of the given type without name from the stream
* @throw input_error on failure
*/
diff --git a/src/io/stream_reader.cpp b/src/io/stream_reader.cpp
index ff0fe183ea..541a416d83 100644
--- a/src/io/stream_reader.cpp
+++ b/src/io/stream_reader.cpp
@@ -39,6 +39,14 @@ endian::endian stream_reader::get_endian() const
return endian;
}
+std::pair<std::string, std::unique_ptr<tag>> stream_reader::read_tag()
+{
+ tag_type type = read_type();
+ std::string key = read_string();
+ std::unique_ptr<tag> t = read_payload(type);
+ return {std::move(key), std::move(t)};
+}
+
std::unique_ptr<tag> stream_reader::read_payload(tag_type type)
{
std::unique_ptr<tag> t = tag::create(type);
diff --git a/test/io/read_test.cpp b/test/io/read_test.cpp
index a6de378e1d..0b29483f1e 100644
--- a/test/io/read_test.cpp
+++ b/test/io/read_test.cpp
@@ -104,12 +104,11 @@ void test_read_bigtest()
ASSERT(file);
nbt::io::stream_reader reader(file);
- ASSERT(reader.read_type() == tag_type::Compound);
- ASSERT(reader.read_string() == "Level");
- auto tagptr = reader.read_payload(tag_type::Compound);
+ auto pair = reader.read_tag();
+ ASSERT(pair.first == "Level");
- ASSERT(tagptr->get_type() == tag_type::Compound);
- const tag_compound& comp = tagptr->as<tag_compound>();
+ ASSERT(pair.second->get_type() == tag_type::Compound);
+ const tag_compound& comp = pair.second->as<tag_compound>();
ASSERT(comp.size() == 13);