/* * SymbolMap.h * * Created on: Jan 20, 2010 * Author: richard */ #pragma once //#define GTSAM_SYMBOL_HASH #define GTSAM_SYMBOL_BINARY #define GTSAM_SYMBOL_SPECIAL #include "Key.h" #include #include namespace gtsam { #ifdef GTSAM_SYMBOL_BINARY template class SymbolMap : public std::map { private: typedef std::map Base; public: SymbolMap() : std::map() {} const T& at(const Symbol& key) const { typename Base::const_iterator it = Base::find(key); if (it == Base::end()) throw(std::invalid_argument("SymbolMap::[] invalid key: " + (std::string)key)); return it->second; } T& at(const Symbol& key) { typename Base::iterator it = Base::find(key); if (it == Base::end()) throw(std::invalid_argument("SymbolMap::[] invalid key: " + (std::string)key)); return it->second; } //void find(void); //void clear() { throw std::runtime_error("Clear should not be used!"); } }; #endif #ifdef GTSAM_SYMBOL_HASH struct SymbolHash : public std::unary_function { std::size_t operator()(Symbol const& x) const { std::size_t seed = 0; boost::hash_combine(seed, x.chr()); boost::hash_combine(seed, x.index()); return ((size_t(x.chr()) << 24) & x.index()); } }; template class SymbolMap : public boost::unordered_map { public: SymbolMap() : boost::unordered_map() {} }; #endif #ifdef GTSAM_SYMBOL_SPECIAL template class FastSymbolMap { private: typedef std::vector > Map; typedef std::vector Vec; Map values_; public: typedef std::pair value_type; FastSymbolMap() { values_.resize(256); values_[size_t('x')].reserve(10000); values_[size_t('l')].reserve(1000); } const T& at(const Symbol& key) const { // typename Map::const_iterator it = values_.find(key.chr()); // if(it != values_.end()) // return it->second.at(key.index()); // else // throw std::invalid_argument("Key " + (std::string)key + " not present"); return values_.at(size_t(key.chr())).at(key.index()); } void insert(const value_type& val) { Vec& vec(values_[size_t(val.first.chr())]); if(val.first.index() >= vec.size()) { vec.reserve(val.first.index()+1); vec.resize(val.first.index()); vec.push_back(val.second); } else vec[val.first.index()] = val.second; } bool empty() const { return false; } void erase(const Symbol& key) { } void clear() { throw std::runtime_error("Can't clear a FastSymbolMap"); } // typedef std::pair value_type; // // class iterator { // typename Map::iterator map_it_; // typename Map::iterator map_end_; // typename Vec::iterator vec_it_; // public: // iterator() {} // iterator(const iterator& it) : map_it_(it.map_it_), vec_it_(it.vec_it_) {} // bool operator==(const iterator& it);// { return map_it_==it.map_it_ && vec_it_==it.vec_it_; } // bool operator!=(const iterator& it);// { return map_it_!=it.map_it_ || vec_it_!=it.vec_it_; } // bool operator*();// { return *it.vec_it_; } // iterator& operator++(); /* { // if(map_it_ != map_end_ && vec_it_ == map_it_->second.end()) // do // vec_it_ = (map_it_++)->second.begin(); // while(map_it_ != map_end_ && vec_it_ == map_it_->second.end()); // else // vec_it_++; // return *this; // }*/ // iterator operator++(int); /* { // iterator tmp(*this); // ++(*this); // return tmp; // }*/ // }; // class const_iterator {}; // std::size_t size() const; // T& at(const Symbol& key); // const_iterator find(const Symbol& key); // void insert(const std::pair& p); // void clear() { throw std::runtime_error("Clear should not be used!"); } // std::size_t count() const; // // const_iterator begin() const; // const_iterator end() const; }; #endif }