aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-03-16 15:52:56 -0700
committerJosh Blum <josh@joshknows.com>2010-03-16 15:52:56 -0700
commit52dc73891474827a9c686f73cbfe70618a2dd6e4 (patch)
tree1f29f82ef467da7ef011ca147279b48e471bf0ce
parent8be3b883f5b1a889f4f07611e8954449cc07c2b3 (diff)
downloaduhd-52dc73891474827a9c686f73cbfe70618a2dd6e4.tar.gz
uhd-52dc73891474827a9c686f73cbfe70618a2dd6e4.tar.bz2
uhd-52dc73891474827a9c686f73cbfe70618a2dd6e4.zip
reimplemented dict to preserve order of insertion
-rw-r--r--host/include/uhd/dict.hpp43
-rw-r--r--host/lib/usrp/dboard/basic.cpp4
2 files changed, 20 insertions, 27 deletions
diff --git a/host/include/uhd/dict.hpp b/host/include/uhd/dict.hpp
index 2224a0063..8f7cd5a0f 100644
--- a/host/include/uhd/dict.hpp
+++ b/host/include/uhd/dict.hpp
@@ -18,7 +18,7 @@
#ifndef INCLUDED_UHD_DICT_HPP
#define INCLUDED_UHD_DICT_HPP
-#include <map>
+#include <list>
#include <vector>
#include <stdexcept>
#include <boost/foreach.hpp>
@@ -27,11 +27,9 @@ namespace uhd{
/*!
* A templated dictionary class with a python-like interface.
- * Its wraps around a std::map internally.
*/
template <class Key, class Val> class dict{
public:
- typedef std::map<Key, Val> map_t;
typedef std::pair<Key, Val> pair_t;
/*!
@@ -42,14 +40,6 @@ namespace uhd{
}
/*!
- * Create a dictionary from a map.
- * \param map a map with key value pairs
- */
- dict(const map_t &map){
- _map = map;
- }
-
- /*!
* Destroy this dict.
*/
~dict(void){
@@ -66,11 +56,12 @@ namespace uhd{
/*!
* Get a list of the keys in this dict.
+ * Key order depends on insertion precedence.
* \return vector of keys
*/
std::vector<Key> get_keys(void) const{
std::vector<Key> keys;
- BOOST_FOREACH(pair_t p, _map){
+ BOOST_FOREACH(const pair_t &p, _map){
keys.push_back(p.first);
}
return keys;
@@ -78,11 +69,12 @@ namespace uhd{
/*!
* Get a list of the values in this dict.
+ * Value order depends on insertion precedence.
* \return vector of values
*/
std::vector<Val> get_vals(void) const{
std::vector<Val> vals;
- BOOST_FOREACH(pair_t p, _map){
+ BOOST_FOREACH(const pair_t &p, _map){
vals.push_back(p.second);
}
return vals;
@@ -94,7 +86,7 @@ namespace uhd{
* \return true if found
*/
bool has_key(const Key &key) const{
- BOOST_FOREACH(pair_t p, _map){
+ BOOST_FOREACH(const pair_t &p, _map){
if (p.first == key) return true;
}
return false;
@@ -108,8 +100,8 @@ namespace uhd{
* \throw an exception when not found
*/
const Val &operator[](const Key &key) const{
- if (has_key(key)){
- return _map.find(key)->second;
+ BOOST_FOREACH(const pair_t &p, _map){
+ if (p.first == key) return p.second;
}
throw std::invalid_argument("key not found in dict");
}
@@ -121,7 +113,11 @@ namespace uhd{
* \return a reference to the value
*/
Val &operator[](const Key &key){
- return _map[key];
+ BOOST_FOREACH(pair_t &p, _map){
+ if (p.first == key) return p.second;
+ }
+ _map.push_back(pair_t(key, Val()));
+ return _map.back().second;
}
/*!
@@ -130,17 +126,14 @@ namespace uhd{
* \return the value of the item
* \throw an exception when not found
*/
- Val pop_key(const Key &key){
- if (has_key(key)){
- Val val = _map.find(key)->second;
- _map.erase(key);
- return val;
- }
- throw std::invalid_argument("key not found in dict");
+ Val pop(const Key &key){
+ Val val = (*this)[key];
+ _map.remove(pair_t(key, val));
+ return val;
}
private:
- map_t _map; //private container
+ std::list<pair_t> _map; //private container
};
} //namespace uhd
diff --git a/host/lib/usrp/dboard/basic.cpp b/host/lib/usrp/dboard/basic.cpp
index 5a82bf145..f88faf6a0 100644
--- a/host/lib/usrp/dboard/basic.cpp
+++ b/host/lib/usrp/dboard/basic.cpp
@@ -75,9 +75,9 @@ static dboard_base::sptr make_lf_tx(dboard_base::ctor_args_t const& args){
STATIC_BLOCK(reg_dboards){
dboard_manager::register_dboard(0x0000, &make_basic_tx, "Basic TX", list_of(""));
- dboard_manager::register_dboard(0x0001, &make_basic_rx, "Basic RX", list_of("a")("b")("ab"));
+ dboard_manager::register_dboard(0x0001, &make_basic_rx, "Basic RX", list_of("ab")("a")("b"));
dboard_manager::register_dboard(0x000e, &make_lf_tx, "LF TX", list_of(""));
- dboard_manager::register_dboard(0x000f, &make_lf_rx, "LF RX", list_of("a")("b")("ab"));
+ dboard_manager::register_dboard(0x000f, &make_lf_rx, "LF RX", list_of("ab")("a")("b"));
}
/***********************************************************************