aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/property_tree.cpp
diff options
context:
space:
mode:
authorAaron Rossetto <aaron.rossetto@ni.com>2019-08-28 08:32:00 -0500
committerMartin Braun <martin.braun@ettus.com>2019-11-26 12:21:31 -0800
commitcb9329a681552e6ac6277d16e1627afcbb23e637 (patch)
treebb87fc4362cb0d683ed41259498888fa71f15d36 /host/lib/property_tree.cpp
parent4f130e3c129111cb8fb044a5cbc007df3628978c (diff)
downloaduhd-cb9329a681552e6ac6277d16e1627afcbb23e637.tar.gz
uhd-cb9329a681552e6ac6277d16e1627afcbb23e637.tar.bz2
uhd-cb9329a681552e6ac6277d16e1627afcbb23e637.zip
uhd: Check property type at access; error if mismatch
Diffstat (limited to 'host/lib/property_tree.cpp')
-rw-r--r--host/lib/property_tree.cpp25
1 files changed, 24 insertions, 1 deletions
diff --git a/host/lib/property_tree.cpp b/host/lib/property_tree.cpp
index 85868b27c..6f797bc2e 100644
--- a/host/lib/property_tree.cpp
+++ b/host/lib/property_tree.cpp
@@ -11,6 +11,7 @@
#include <boost/make_shared.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>
+#include <typeindex>
using namespace uhd;
@@ -156,7 +157,8 @@ public:
return prop;
}
- void _create(const fs_path& path_, const boost::shared_ptr<void>& prop)
+ void _create(const fs_path& path_, const boost::shared_ptr<void>& prop,
+ std::type_index prop_type)
{
const fs_path path = _root / path_;
boost::mutex::scoped_lock lock(_guts->mutex);
@@ -171,6 +173,7 @@ public:
throw uhd::runtime_error(
"Cannot create! Property already exists at: " + path);
node->prop = prop;
+ node->prop_type_hash = prop_type.hash_code();
}
boost::shared_ptr<void>& _access(const fs_path& path_) const
@@ -189,6 +192,25 @@ public:
return node->prop;
}
+ boost::shared_ptr<void>& _access_with_type_check(
+ const fs_path& path_, std::type_index expected_prop_type) const
+ {
+ const fs_path path = _root / path_;
+ boost::mutex::scoped_lock lock(_guts->mutex);
+
+ node_type* node = &_guts->root;
+ for (const std::string& name : path_tokenizer(path)) {
+ if (not node->has_key(name))
+ throw_path_not_found(path);
+ node = &(*node)[name];
+ }
+ if (node->prop.get() == NULL)
+ throw uhd::runtime_error("Cannot access! Property uninitialized at: " + path);
+ if (node->prop_type_hash != expected_prop_type.hash_code())
+ throw uhd::runtime_error("Cannot access! Property types do not match at: " + path);
+ return node->prop;
+ }
+
private:
void throw_path_not_found(const fs_path& path) const
{
@@ -199,6 +221,7 @@ private:
struct node_type : uhd::dict<std::string, node_type>
{
boost::shared_ptr<void> prop;
+ std::size_t prop_type_hash;
};
// tree guts which may be referenced in a subtree