]> git.mxchange.org Git - simgear.git/commitdiff
cppbind: convert maps from nasal.
authorThomas Geymayer <tomgey@gmail.com>
Sun, 18 May 2014 11:33:10 +0000 (13:33 +0200)
committerThomas Geymayer <tomgey@gmail.com>
Sun, 18 May 2014 11:34:06 +0000 (13:34 +0200)
simgear/nasal/cppbind/NasalHash.cxx
simgear/nasal/cppbind/NasalHash.hxx
simgear/nasal/cppbind/cppbind_test.cxx

index d1dd3be32460b02c70ad4403f64a52b2928d4ea9..7cd99468ca283fcf94f8f95e68de5484bdb564a4 100644 (file)
@@ -54,6 +54,14 @@ namespace nasal
                                                                 : naNil();
   }
 
+  //----------------------------------------------------------------------------
+  std::vector<std::string> Hash::keys() const
+  {
+    naRef keys = naNewVector(_context);
+    naHash_keys(keys, _hash);
+    return from_nasal<std::vector<std::string> >(_context, keys);
+  }
+
   //----------------------------------------------------------------------------
   Hash Hash::createHash(const std::string& name)
   {
index e1de133df85e55fae09b1535060d52c083b60399..e330428eb96fbcd7449014985821d8874719d8f8 100644 (file)
@@ -22,6 +22,8 @@
 #include "from_nasal.hxx"
 #include "to_nasal.hxx"
 
+#include <simgear/structure/map.hxx>
+
 namespace nasal
 {
 
@@ -101,6 +103,11 @@ namespace nasal
         return from_nasal_helper(_context, get(name), static_cast<Sig*>(0));
       }
 
+      /**
+       * Get a list of all keys
+       */
+      std::vector<std::string> keys() const;
+
       /**
        * Create a new child hash (module)
        *
@@ -129,4 +136,21 @@ namespace nasal
 
 } // namespace nasal
 
+template<class Value>
+simgear::Map<std::string, Value>
+from_nasal_helper( naContext c,
+                   naRef ref,
+                   const simgear::Map<std::string, Value>* )
+{
+
+  nasal::Hash hash = from_nasal_helper(c, ref, static_cast<nasal::Hash*>(0));
+  std::vector<std::string> const& keys = hash.keys();
+
+  simgear::Map<std::string, Value> map;
+  for(size_t i = 0; i < keys.size(); ++i)
+    map[ keys[i] ] = hash.get<Value>(keys[i]);
+
+  return map;
+}
+
 #endif /* SG_NASAL_HASH_HXX_ */
index 098b21afe988817996b5478445481db6654ac9da..9dce3e1ee528ae36089df2382fc662dbf54c33c0 100644 (file)
@@ -168,6 +168,11 @@ int main(int argc, char* argv[])
   r = to_nasal(c, hash);
   VERIFY( naIsHash(r) );
 
+  simgear::StringMap string_map = from_nasal<simgear::StringMap>(c, r);
+  VERIFY( string_map.at("vec") == "string" )
+  VERIFY( string_map.at("name") == "my-name" )
+  VERIFY( string_map.at("string") == "blub" )
+
   VERIFY( hash.get<std::string>("name") == "my-name" );
   VERIFY( naIsString(hash.get("name")) );