summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-10-07 11:42:34 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2023-10-07 11:42:34 +0100
commit56adcef8081285993b345906ff04f7de29fc41f0 (patch)
tree3c335d50e668e2d82d645180e3837bd541bb2a34
parentUse ice_id() whenever possible (diff)
parentPartially revert changes to IceMetaData constructor (diff)
downloadslicer-1.12.0.tar.bz2
slicer-1.12.0.tar.xz
slicer-1.12.0.zip
Merge branch 'dict-name-fix'slicer-1.12.0
-rw-r--r--slicer/slicer/metadata-test.cpp7
-rw-r--r--slicer/test/collections.ice2
-rw-r--r--slicer/test/initial/dictNamed.xml17
-rw-r--r--slicer/test/preprocessor.cpp4
-rw-r--r--slicer/test/serializers.cpp7
-rw-r--r--slicer/tool/icemetadata.cpp5
6 files changed, 36 insertions, 6 deletions
diff --git a/slicer/slicer/metadata-test.cpp b/slicer/slicer/metadata-test.cpp
index a72b844..cc981e3 100644
--- a/slicer/slicer/metadata-test.cpp
+++ b/slicer/slicer/metadata-test.cpp
@@ -21,11 +21,12 @@ namespace test {
static_assert(!Slicer::MetaData<>::in_scope("scope:sub2:subsub", "scope:sub"));
static_assert(!Slicer::MetaData<>::in_scope("scope:sub:subsub", "scope:sub2"));
- constexpr Slicer::MetaDataImpl<4> md {{{
+ constexpr Slicer::MetaDataImpl<5> md {{{
"slicer:yes",
"slicer:no",
"slicer:sub:scope",
"notslicer:dontcare",
+ "slicer:key:id",
}}};
static_assert(md.arr[0].first == "slicer:yes");
@@ -45,4 +46,8 @@ namespace test {
static_assert(md.value("slicer:sub").has_value());
static_assert(md.value("slicer:sub").value() == "scope");
static_assert(!md.value("nope:").has_value());
+ static_assert(md.value("slicer:key:").has_value());
+ static_assert(md.value("slicer:key:").value() == "id");
+ static_assert(md.value("slicer:key").has_value());
+ static_assert(md.value("slicer:key").value() == "id");
}
diff --git a/slicer/test/collections.ice b/slicer/test/collections.ice
index 60798cd..f2ccc74 100644
--- a/slicer/test/collections.ice
+++ b/slicer/test/collections.ice
@@ -10,6 +10,8 @@ module TestModule {
local sequence<StructType> Structs;
dictionary<int, ClassType> ClassMap;
local dictionary<int, StructType> StructMap;
+ ["slicer:value:res","slicer:key:id","slicer:item:thing"]
+ local dictionary<long, StructType> StructMapNamed;
};
#endif
diff --git a/slicer/test/initial/dictNamed.xml b/slicer/test/initial/dictNamed.xml
new file mode 100644
index 0000000..2e1fe7e
--- /dev/null
+++ b/slicer/test/initial/dictNamed.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<StructMapNamed>
+ <thing>
+ <id>1</id>
+ <res>
+ <a>1</a>
+ <b>2</b>
+ </res>
+ </thing>
+ <thing>
+ <id>2</id>
+ <res>
+ <a>3</a>
+ <b>4</b>
+ </res>
+ </thing>
+</StructMapNamed>
diff --git a/slicer/test/preprocessor.cpp b/slicer/test/preprocessor.cpp
index fea951b..ee94fea 100644
--- a/slicer/test/preprocessor.cpp
+++ b/slicer/test/preprocessor.cpp
@@ -12,7 +12,7 @@
#include <vector>
constexpr std::array<std::pair<std::string_view, size_t>, 12> COMPONENTS_IN_TEST_ICE_ARRAY {
- {{"classtype.ice", 2}, {"classes.ice", 3}, {"collections.ice", 5}, {"enums.ice", 2}, {"inheritance.ice", 12},
+ {{"classtype.ice", 2}, {"classes.ice", 3}, {"collections.ice", 6}, {"enums.ice", 2}, {"inheritance.ice", 12},
{"interfaces.ice", 0}, {"json.ice", 2}, {"locals.ice", 7}, {"optionals.ice", 2}, {"structs.ice", 5},
{"types.ice", 4}, {"xml.ice", 5}}};
using ComponentsCount = decltype(COMPONENTS_IN_TEST_ICE_ARRAY);
@@ -21,7 +21,7 @@ constexpr auto COMPONENTS_IN_TEST_ICE_COUNT = std::accumulate(
COMPONENTS_IN_TEST_ICE.begin(), COMPONENTS_IN_TEST_ICE.end(), 0U, [](const auto & t, const auto & c) {
return t + c.second;
});
-static_assert(COMPONENTS_IN_TEST_ICE_COUNT == 49);
+static_assert(COMPONENTS_IN_TEST_ICE_COUNT == 50);
void
process(Slicer::Slicer & s, const ComponentsCount::value_type & c)
diff --git a/slicer/test/serializers.cpp b/slicer/test/serializers.cpp
index 1780237..525d68d 100644
--- a/slicer/test/serializers.cpp
+++ b/slicer/test/serializers.cpp
@@ -710,3 +710,10 @@ BOOST_DATA_TEST_CASE(typeid_specifies_no_such_type,
BOOST_CHECK_THROW(std::ignore = (Slicer::DeserializeAny<Slicer::XmlStreamDeserializer, TestModule::D12Ptr>(in)),
Slicer::UnknownType);
}
+
+BOOST_AUTO_TEST_CASE(dict_with_name_overrides)
+{
+ auto res = Slicer::DeserializeAny<Slicer::XmlFileDeserializer, TestModule::StructMapNamed>(
+ rootDir / "initial/dictNamed.xml");
+ BOOST_REQUIRE_EQUAL(res.size(), 2);
+}
diff --git a/slicer/tool/icemetadata.cpp b/slicer/tool/icemetadata.cpp
index 3dfbee9..3cbde8c 100644
--- a/slicer/tool/icemetadata.cpp
+++ b/slicer/tool/icemetadata.cpp
@@ -8,10 +8,9 @@ namespace Slicer {
IceMetaData::IceMetaData(Slice::StringList as)
{
arr.reserve(as.size());
- std::transform(as.begin(), as.end(), std::back_inserter(arr), [](auto && a) {
- decltype(arr)::value_type md {std::forward<decltype(a)>(a), std::string_view {}};
+ std::for_each(as.begin(), as.end(), [this](auto a) {
+ auto & md = arr.emplace_back(std::move(a), std::string_view {});
md.second = std::string_view(md.first).substr(0, md.first.rfind(':'));
- return md;
});
_begin = arr.begin();
_end = arr.end();