summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorljfa-ag <ljfa-ag@web.de>2015-07-03 19:38:52 +0200
committerljfa-ag <ljfa-ag@web.de>2015-07-03 19:38:52 +0200
commit36c1393a5682a7cab500d3f0ca2cb45ddb0a844f (patch)
tree7a4135915ed3e9ec283b8f806010be44dd260f0e
parent09dca802bdfc076ac8457df0b8f657fdce915a75 (diff)
downloadProject-Tick-36c1393a5682a7cab500d3f0ca2cb45ddb0a844f.tar.gz
Project-Tick-36c1393a5682a7cab500d3f0ca2cb45ddb0a844f.zip
Create value_initializer
-rw-r--r--include/tag_compound.h4
-rw-r--r--include/value_initializer.h58
-rw-r--r--src/tag_compound.cpp6
-rw-r--r--test/nbttest.cpp10
4 files changed, 71 insertions, 7 deletions
diff --git a/include/tag_compound.h b/include/tag_compound.h
index 526e57d559..3c68fc1b12 100644
--- a/include/tag_compound.h
+++ b/include/tag_compound.h
@@ -22,6 +22,7 @@
#include "crtp_tag.h"
#include "value.h"
+#include "value_initializer.h"
#include <map>
#include <string>
@@ -42,8 +43,7 @@ public:
///Constructs an empty compound
tag_compound() {}
- //TODO: Make a separate class similar to and convertible to value for initializing tag values
- //tag_compound(std::initializer_list<std::pair<std::string, value&&>> init);
+ tag_compound(std::initializer_list<std::pair<std::string, value_initializer&&>> init);
/**
* @brief Accesses a tag by key with bounds checking
diff --git a/include/value_initializer.h b/include/value_initializer.h
new file mode 100644
index 0000000000..86fdd2d1e1
--- /dev/null
+++ b/include/value_initializer.h
@@ -0,0 +1,58 @@
+/*
+ * libnbt++ - A library for the Minecraft Named Binary Tag format.
+ * Copyright (C) 2013, 2015 ljfa-ag
+ *
+ * This file is part of libnbt++.
+ *
+ * libnbt++ is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * libnbt++ is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libnbt++. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef VALUE_INITIALIZER_H_INCLUDED
+#define VALUE_INITIALIZER_H_INCLUDED
+
+#include "value.h"
+#include <memory>
+#include <string>
+
+namespace nbt
+{
+
+/**
+ * @brief Helper class for implicitly constructing value objects
+ */
+class value_initializer
+{
+public:
+ value_initializer(std::unique_ptr<tag>&& t);
+ value_initializer(value&& val);
+ value_initializer(tag&& t);
+
+ value_initializer(int8_t val);
+ value_initializer(int16_t val);
+ value_initializer(int32_t val);
+ value_initializer(int64_t val);
+ value_initializer(float val);
+ value_initializer(double val);
+ value_initializer(const std::string& str);
+ value_initializer(std::string&& str);
+ value_initializer(const char* str);
+
+ operator value&&();
+
+private:
+ value val;
+};
+
+}
+
+#endif // VALUE_INITIALIZER_H_INCLUDED
diff --git a/src/tag_compound.cpp b/src/tag_compound.cpp
index 94dc2dd6f1..f26044ce20 100644
--- a/src/tag_compound.cpp
+++ b/src/tag_compound.cpp
@@ -22,6 +22,12 @@
namespace nbt
{
+tag_compound::tag_compound(std::initializer_list<std::pair<std::string, value_initializer&&>> init)
+{
+ for(auto& pair: init)
+ tags.emplace(pair);
+}
+
value& tag_compound::at(const std::string& key)
{
return tags.at(key);
diff --git a/test/nbttest.cpp b/test/nbttest.cpp
index 4f05d30068..859b41f7a8 100644
--- a/test/nbttest.cpp
+++ b/test/nbttest.cpp
@@ -77,11 +77,11 @@ void test_tag_string()
void test_tag_compound()
{
- tag_compound comp/*{
+ tag_compound comp{
{"foo", int16_t(12)},
{"bar", "baz"},
{"baz", -2.0}
- }*/;
+ };
ASSERT(comp["foo"].get_type() == tag_type::Short);
ASSERT(int32_t(comp["foo"]) == 12);
@@ -111,12 +111,12 @@ void test_tag_compound()
EXPECT_EXCEPTION(comp.at("nothing"), std::out_of_range);
- tag_compound comp2/*{
+ tag_compound comp2{
{"foo", int16_t(32)},
{"bar", "barbaz"},
{"baz", -2.0},
{"quux", tag_compound{{"Hello", "World"}, {"zero", 0}}}
- }*/;
+ };
ASSERT(comp == comp2);
ASSERT(comp != (const tag_compound&)comp2["quux"]);
ASSERT(comp != comp2["quux"]);
@@ -144,7 +144,7 @@ void test_tag_compound()
ASSERT(comp.put("abc", std::unique_ptr<tag>(new tag_long(-28))) == false);
ASSERT(comp.emplace<tag_string>("def", "ghi") == true);
ASSERT(comp.emplace<tag_byte>("def", 4) == false);
- ASSERT((comp == tag_compound{/*{"abc", tag_long(-28)}, {"def", tag_byte(4)}*/}));
+ ASSERT((comp == tag_compound{{"abc", tag_long(-28)}, {"def", tag_byte(4)}}));
}
int main()