aboutsummaryrefslogtreecommitdiffstats
path: root/host/include
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2015-01-24 01:46:22 +0100
committerMartin Braun <martin.braun@ettus.com>2015-01-27 09:58:02 +0100
commitbefbaf97d09f1c36437bb285d7a1dc70a34ef6ab (patch)
treeffa325e837c6ecbf7664c4747cce8903c824050a /host/include
parentec957da3209bb8291446c17b77dde8dd7ad67ab6 (diff)
downloaduhd-befbaf97d09f1c36437bb285d7a1dc70a34ef6ab.tar.gz
uhd-befbaf97d09f1c36437bb285d7a1dc70a34ef6ab.tar.bz2
uhd-befbaf97d09f1c36437bb285d7a1dc70a34ef6ab.zip
uhd: Added an update() method for dicts
Very similar to Python's dict.update().
Diffstat (limited to 'host/include')
-rw-r--r--host/include/uhd/types/dict.hpp19
-rw-r--r--host/include/uhd/types/dict.ipp14
2 files changed, 32 insertions, 1 deletions
diff --git a/host/include/uhd/types/dict.hpp b/host/include/uhd/types/dict.hpp
index 97fa8f09c..51e3e1814 100644
--- a/host/include/uhd/types/dict.hpp
+++ b/host/include/uhd/types/dict.hpp
@@ -1,5 +1,5 @@
//
-// Copyright 2010-2011 Ettus Research LLC
+// Copyright 2010-2011,2015 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -117,6 +117,23 @@ namespace uhd{
*/
Val pop(const Key &key);
+ /*! Update this dictionary with values from another.
+ *
+ * Basically, this copies all the key/value pairs from \p new_dict
+ * into this dict. When the key is already present in the current
+ * dict, it either overwrites the current value (if \p fail_on_conflict
+ * is false) or it throws (if \p fail_on_conflict is true *and* the
+ * values differ).
+ *
+ * With the exception of \p fail_on_conflict, this behaves analogously
+ * to Python's dict.update() method.
+ *
+ * \param new_args The arguments to copy.
+ * \param fail_on_conflict If true, throws.
+ * \throws uhd::value_error
+ */
+ void update(const dict<Key, Val> &new_dict, bool fail_on_conflict=true);
+
private:
typedef std::pair<Key, Val> pair_t;
std::list<pair_t> _map; //private container
diff --git a/host/include/uhd/types/dict.ipp b/host/include/uhd/types/dict.ipp
index 5e9cf97ad..5fd4b536e 100644
--- a/host/include/uhd/types/dict.ipp
+++ b/host/include/uhd/types/dict.ipp
@@ -135,6 +135,20 @@ namespace uhd{
throw key_not_found<Key, Val>(key);
}
+ template <typename Key, typename Val>
+ void dict<Key, Val>::update(const dict<Key, Val> &new_dict, bool fail_on_conflict)
+ {
+ BOOST_FOREACH(const Key &key, new_dict.keys()) {
+ if (fail_on_conflict and has_key(key) and get(key) != new_dict[key]) {
+ throw uhd::value_error(str(
+ boost::format("Option merge conflict: %s:%s != %s:%s")
+ % key % get(key) % key % new_dict[key]
+ ));
+ }
+ set(key, new_dict[key]);
+ }
+ }
+
} //namespace uhd
#endif /* INCLUDED_UHD_TYPES_DICT_IPP */