From 6929ba75c06a6b8ff6911c660f2d4e5a9e4f5170 Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Sun, 18 May 2014 13:33:10 +0200 Subject: [PATCH] cppbind: convert maps from nasal. --- simgear/nasal/cppbind/NasalHash.cxx | 8 ++++++++ simgear/nasal/cppbind/NasalHash.hxx | 24 ++++++++++++++++++++++++ simgear/nasal/cppbind/cppbind_test.cxx | 5 +++++ 3 files changed, 37 insertions(+) diff --git a/simgear/nasal/cppbind/NasalHash.cxx b/simgear/nasal/cppbind/NasalHash.cxx index d1dd3be3..7cd99468 100644 --- a/simgear/nasal/cppbind/NasalHash.cxx +++ b/simgear/nasal/cppbind/NasalHash.cxx @@ -54,6 +54,14 @@ namespace nasal : naNil(); } + //---------------------------------------------------------------------------- + std::vector Hash::keys() const + { + naRef keys = naNewVector(_context); + naHash_keys(keys, _hash); + return from_nasal >(_context, keys); + } + //---------------------------------------------------------------------------- Hash Hash::createHash(const std::string& name) { diff --git a/simgear/nasal/cppbind/NasalHash.hxx b/simgear/nasal/cppbind/NasalHash.hxx index e1de133d..e330428e 100644 --- a/simgear/nasal/cppbind/NasalHash.hxx +++ b/simgear/nasal/cppbind/NasalHash.hxx @@ -22,6 +22,8 @@ #include "from_nasal.hxx" #include "to_nasal.hxx" +#include + namespace nasal { @@ -101,6 +103,11 @@ namespace nasal return from_nasal_helper(_context, get(name), static_cast(0)); } + /** + * Get a list of all keys + */ + std::vector keys() const; + /** * Create a new child hash (module) * @@ -129,4 +136,21 @@ namespace nasal } // namespace nasal +template +simgear::Map +from_nasal_helper( naContext c, + naRef ref, + const simgear::Map* ) +{ + + nasal::Hash hash = from_nasal_helper(c, ref, static_cast(0)); + std::vector const& keys = hash.keys(); + + simgear::Map map; + for(size_t i = 0; i < keys.size(); ++i) + map[ keys[i] ] = hash.get(keys[i]); + + return map; +} + #endif /* SG_NASAL_HASH_HXX_ */ diff --git a/simgear/nasal/cppbind/cppbind_test.cxx b/simgear/nasal/cppbind/cppbind_test.cxx index 098b21af..9dce3e1e 100644 --- a/simgear/nasal/cppbind/cppbind_test.cxx +++ b/simgear/nasal/cppbind/cppbind_test.cxx @@ -168,6 +168,11 @@ int main(int argc, char* argv[]) r = to_nasal(c, hash); VERIFY( naIsHash(r) ); + simgear::StringMap string_map = from_nasal(c, r); + VERIFY( string_map.at("vec") == "string" ) + VERIFY( string_map.at("name") == "my-name" ) + VERIFY( string_map.at("string") == "blub" ) + VERIFY( hash.get("name") == "my-name" ); VERIFY( naIsString(hash.get("name")) ); -- 2.39.5