diff options
author | Martin Braun <martin.braun@ettus.com> | 2015-01-24 01:46:22 +0100 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2015-01-27 09:58:02 +0100 |
commit | befbaf97d09f1c36437bb285d7a1dc70a34ef6ab (patch) | |
tree | ffa325e837c6ecbf7664c4747cce8903c824050a /host/include | |
parent | ec957da3209bb8291446c17b77dde8dd7ad67ab6 (diff) | |
download | uhd-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.hpp | 19 | ||||
-rw-r--r-- | host/include/uhd/types/dict.ipp | 14 |
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 */ |