From baad5d789fde546ed5e3fccd865e49ba15b98145 Mon Sep 17 00:00:00 2001 From: Brent Stapleton Date: Thu, 29 Mar 2018 18:54:37 -0700 Subject: lib: adding == and != for uhd::dict --- host/include/uhd/types/dict.hpp | 14 ++++++++++++++ host/include/uhd/types/dict.ipp | 18 ++++++++++++++++++ host/tests/dict_test.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) (limited to 'host') diff --git a/host/include/uhd/types/dict.hpp b/host/include/uhd/types/dict.hpp index b8537a3c2..51594e17b 100644 --- a/host/include/uhd/types/dict.hpp +++ b/host/include/uhd/types/dict.hpp @@ -99,6 +99,20 @@ namespace uhd{ */ Val &operator[](const Key &key); + /*! + * Equals operator for the dict type + * \param other the dict being compared to this + * \return whether or not the two dict's are equal + */ + bool operator==(const dict &other) const; + + /*! + * Not equal operator for the dict type + * \param other the dict being compared to this + * \return whether or not the two dict's are not equal + */ + bool operator!=(const dict &other) const; + /*! * Pop an item out of the dictionary. * \param key the item key diff --git a/host/include/uhd/types/dict.ipp b/host/include/uhd/types/dict.ipp index 26de1f08e..9ff64ee2b 100644 --- a/host/include/uhd/types/dict.ipp +++ b/host/include/uhd/types/dict.ipp @@ -112,6 +112,24 @@ namespace uhd{ return _map.back().second; } + template + bool dict::operator==(const dict &other) const{ + if (this->size() != other.size()){ + return false; + } + for(auto &p : _map){ + if (not (other.has_key(p.first) and other.get(p.first) == p.second)){ + return false; + } + } + return true; + } + + template + bool dict::operator!=(const dict &other) const{ + return not (*this == other); + } + template Val dict::pop(const Key &key){ typename std::list::iterator it; diff --git a/host/tests/dict_test.cpp b/host/tests/dict_test.cpp index 6b0285b8a..53432d533 100644 --- a/host/tests/dict_test.cpp +++ b/host/tests/dict_test.cpp @@ -84,4 +84,43 @@ BOOST_AUTO_TEST_CASE(test_dict_update) BOOST_CHECK_THROW(d3.update(d2), uhd::value_error); } +BOOST_AUTO_TEST_CASE(test_dict_equals) +{ + typedef uhd::dict dict_ss; + // Original dict + dict_ss d0; + d0["key1"] = "val1"; + d0["key2"] = "val2"; + // Same keys and vals as d1, but different order + dict_ss d1; + d1["key2"] = "val2"; + d1["key1"] = "val1"; + // Same vals, different keys + dict_ss d2; + d2["key1"] = "val1"; + d2["key3"] = "val2"; + // Same keys, different vals + dict_ss d3; + d3["key1"] = "val1"; + d3["key2"] = "val3"; + // Superset of d0 + dict_ss d4; + d4["key1"] = "val1"; + d4["key2"] = "val2"; + d4["key4"] = "val3"; + // Subset of d0 + dict_ss d5; + d5["key1"] = "val1"; + // Check that d0 and d1 are equal + BOOST_CHECK(d0 == d1); + BOOST_CHECK(d1 == d0); + // Check that all other dictionaries are not equal to d0 + BOOST_CHECK(d0 != d2); + BOOST_CHECK(d0 != d3); + BOOST_CHECK(d0 != d4); + BOOST_CHECK(d0 != d5); + // Redundant, but just to be sure + BOOST_CHECK(not (d0 == d2)); + BOOST_CHECK(not (d0 == d3)); +} -- cgit v1.2.3