From 8d957b7bd53fb0428e579e9b51c22a1df7361e91 Mon Sep 17 00:00:00 2001
From: Cyrille Berger <cyrille.berger@liu.se>
Date: Wed, 29 May 2024 18:20:37 +0200
Subject: [PATCH] add convenient function to convert ValueHash/ValueList to
 VariantHash/Map/VariantList

---
 src/knowCore/ValueHash.cpp | 27 +++++++++++++++++++++++++++
 src/knowCore/ValueHash.h   | 15 ++++++++++++---
 src/knowCore/ValueList.cpp | 13 +++++++++++++
 src/knowCore/ValueList.h   |  8 ++++++++
 4 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/src/knowCore/ValueHash.cpp b/src/knowCore/ValueHash.cpp
index 34a6bd9b..6d31a133 100644
--- a/src/knowCore/ValueHash.cpp
+++ b/src/knowCore/ValueHash.cpp
@@ -197,6 +197,33 @@ ReturnValue<QString> ValueHash::printable() const
   return kCrvSuccess(clog_qt::qformat("[{}]", strings));
 }
 
+QVariantHash ValueHash::toVariantHash() const
+{
+  QVariantHash values;
+  QHash<QString, Value> values_ = hash();
+  for(auto it = values_.begin(); it != values_.end(); ++it)
+  {
+    values[it.key()] = it.value().toVariant();
+  }
+  return values;
+}
+
+QVariantMap ValueHash::toVariantMap() const
+{
+  QVariantMap values;
+  QHash<QString, Value> values_ = hash();
+  for(auto it = values_.begin(); it != values_.end(); ++it)
+  {
+    values[it.key()] = it.value().toVariant();
+  }
+  return values;
+}
+
+QVariant ValueHash::toVariant() const
+{
+  return toVariantHash();
+}
+
 QHash<QString, Value> ValueHash::hash() const
 {
   return d->values;
diff --git a/src/knowCore/ValueHash.h b/src/knowCore/ValueHash.h
index 5a35fbec..e8f7ef64 100644
--- a/src/knowCore/ValueHash.h
+++ b/src/knowCore/ValueHash.h
@@ -110,6 +110,15 @@ namespace knowCore
     ReturnValue<QCborValue> toCborValue(const SerialisationContexts& _contexts) const;
     static ReturnValue<ValueHash> fromCborValue(const QCborValue& _value, const DeserialisationContexts& _contexts);
     ReturnValue<QString> printable() const;
+    /**
+     * @return a variant hash representation
+     */
+    QVariantHash toVariantHash() const;
+    /**
+     * @return a variant map representation
+     */
+    QVariantMap toVariantMap() const;
+    QVariant toVariant() const;
     /**
      * Check that the list only contains value of type \ref _uri.
      * It returns success if that is true.
@@ -228,7 +237,7 @@ namespace knowCore
   inline ReturnValue<QHash<QString, _T_>> ValueHash::hash() const
   {
     QHash<QString, _T_> values;
-    QHash<QString, Value> values_;
+    QHash<QString, Value> values_ = hash();
     for(auto it = values_.begin(); it != values_.end(); ++it)
     {
       KNOWCORE_RETURN_VALUE_TRY(value, it.value().value<_T_>());
@@ -240,7 +249,7 @@ namespace knowCore
   inline ReturnValue<QMap<QString, _T_>> ValueHash::map() const
   {
     QMap<QString, _T_> values;
-    QHash<QString, Value> values_;
+    QHash<QString, Value> values_ = hash();
     for(auto it = values_.begin(); it != values_.end(); ++it)
     {
       KNOWCORE_RETURN_VALUE_TRY(value, it.value().value<_T_>());
@@ -251,7 +260,7 @@ namespace knowCore
   inline QMap<QString, Value> ValueHash::map() const
   {
     QMap<QString, Value> values;
-    QHash<QString, Value> values_;
+    QHash<QString, Value> values_ = hash();
     for(auto it = values_.begin(); it != values_.end(); ++it)
     {
       values[it.key()] = it.value();
diff --git a/src/knowCore/ValueList.cpp b/src/knowCore/ValueList.cpp
index c65c0cd5..cdc487d4 100644
--- a/src/knowCore/ValueList.cpp
+++ b/src/knowCore/ValueList.cpp
@@ -208,6 +208,19 @@ ReturnValue<ValueList> ValueList::fromVariants(const QVariantList& _t)
   return kCrvSuccess(ValueList(values));
 }
 
+QVariantList ValueList::toVariantList() const
+{
+  QVariantList l;
+  std::transform(d->values.begin(), d->values.end(), std::back_inserter(l), [](const Value& v) { return v.toVariant(); });
+  return l;
+}
+
+QVariant ValueList::toVariant() const
+{
+  return toVariantList();
+}
+
+
 
 #include <knowCore/Uris/askcore_types.h>
 #include "MetaTypeImplementation.h"
diff --git a/src/knowCore/ValueList.h b/src/knowCore/ValueList.h
index 551af43e..1da7b3ef 100644
--- a/src/knowCore/ValueList.h
+++ b/src/knowCore/ValueList.h
@@ -70,6 +70,14 @@ namespace knowCore
     template<typename _T_>
     inline static const ValueList fromValues(const QList<_T_>& _t);
     static ReturnValue<ValueList> fromVariants(const QVariantList& _t);
+    /**
+     * @return a list of variant
+     */
+    QVariantList toVariantList() const;
+    /**
+     * @return a variant
+     */
+    QVariant toVariant() const;
   private:
     struct Private;
     QSharedDataPointer<Private> d;
-- 
GitLab