From 093c0e6bd2434297a06138bdc565a911311dfb23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Mon, 5 Nov 2018 21:57:05 +0200 Subject: [PATCH] libcore|Info: Converting an Info block to a Record --- doomsday/sdk/libcore/include/de/data/info.h | 9 +++++- doomsday/sdk/libcore/src/data/info.cpp | 31 +++++++++++++++++++++ doomsday/sdk/libcore/src/data/record.cpp | 2 +- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/doomsday/sdk/libcore/include/de/data/info.h b/doomsday/sdk/libcore/include/de/data/info.h index 65f8f8b54b..ce375e101b 100644 --- a/doomsday/sdk/libcore/include/de/data/info.h +++ b/doomsday/sdk/libcore/include/de/data/info.h @@ -20,9 +20,10 @@ #ifndef LIBDENG2_INFO_H #define LIBDENG2_INFO_H -#include "../String" #include "../NativePath" +#include "../Record" #include "../SourceLineTable" +#include "../String" #include #include @@ -246,6 +247,12 @@ class DENG2_PUBLIC Info */ void moveContents(BlockElement &destination); + /** + * Converts the contents of the block into a Record. + * @return Record with block elements. + */ + Record asRecord() const; + private: Info &_info; String _blockType; diff --git a/doomsday/sdk/libcore/src/data/info.cpp b/doomsday/sdk/libcore/src/data/info.cpp index ba5c650ff5..c2c8d71cbb 100644 --- a/doomsday/sdk/libcore/src/data/info.cpp +++ b/doomsday/sdk/libcore/src/data/info.cpp @@ -22,8 +22,10 @@ #include "de/Folder" #include "de/Log" #include "de/LogBuffer" +#include "de/RecordValue" #include "de/ScriptLex" #include "de/SourceLineTable" +#include #include @@ -806,6 +808,35 @@ void Info::BlockElement::moveContents(BlockElement &destination) _contents.clear(); } +Record Info::BlockElement::asRecord() const +{ + Record rec; + for (auto i = _contents.begin(); i != _contents.end(); ++i) + { + std::unique_ptr var(new Variable(i.key())); + const Element *elem = i.value(); + if (elem->isBlock()) + { + var->set(RecordValue::takeRecord(elem->as().asRecord())); + } + else if (elem->isList()) + { + std::unique_ptr array(new ArrayValue); + for (const auto &value : elem->values()) + { + array->add(new TextValue(value.text)); + } + var->set(array.release()); + } + else + { + var->set(new TextValue(elem->as().value().text)); + } + rec.add(var.release()); + } + return rec; +} + //--------------------------------------------------------------------------------------- Info::Info() : d(new Impl(this)) diff --git a/doomsday/sdk/libcore/src/data/record.cpp b/doomsday/sdk/libcore/src/data/record.cpp index 40111d4e80..adda5c7f6a 100644 --- a/doomsday/sdk/libcore/src/data/record.cpp +++ b/doomsday/sdk/libcore/src/data/record.cpp @@ -1155,7 +1155,7 @@ String Record::asInfo() const os.setCodec("UTF-8"); for (auto i = d->members.constBegin(); i != d->members.constEnd(); ++i) { - Variable const &var = *i.value(); + const Variable &var = *i.value(); String src = i.key(); if (is(var.value()))