162 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
/*
 | 
						|
 * SymbolMap.h
 | 
						|
 *
 | 
						|
 *  Created on: Jan 20, 2010
 | 
						|
 *      Author: richard
 | 
						|
 */
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
//#define GTSAM_SYMBOL_HASH
 | 
						|
#define GTSAM_SYMBOL_BINARY
 | 
						|
#define GTSAM_SYMBOL_SPECIAL
 | 
						|
 | 
						|
#include <gtsam/inference/Key.h>
 | 
						|
 | 
						|
#include <map>
 | 
						|
#include <boost/unordered_map.hpp>
 | 
						|
 | 
						|
 | 
						|
namespace gtsam {
 | 
						|
 | 
						|
#ifdef GTSAM_SYMBOL_BINARY
 | 
						|
	template<class T>
 | 
						|
	class SymbolMap : public std::map<Symbol, T> {
 | 
						|
	private:
 | 
						|
		typedef std::map<Symbol, T> Base;
 | 
						|
	public:
 | 
						|
		SymbolMap() : std::map<Symbol, T>() {}
 | 
						|
 | 
						|
		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<Symbol, std::size_t> {
 | 
						|
		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 T>
 | 
						|
	class SymbolMap : public boost::unordered_map<Symbol, T, SymbolHash> {
 | 
						|
	public:
 | 
						|
		SymbolMap() : boost::unordered_map<Symbol, T, SymbolHash>() {}
 | 
						|
	};
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#ifdef GTSAM_SYMBOL_SPECIAL
 | 
						|
	template<class T>
 | 
						|
	class FastSymbolMap {
 | 
						|
	private:
 | 
						|
		typedef std::vector<std::vector<T> > Map;
 | 
						|
		typedef std::vector<T> Vec;
 | 
						|
 | 
						|
		Map values_;
 | 
						|
 | 
						|
	public:
 | 
						|
		typedef std::pair<Symbol, T> 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<Symbol, T> 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<Symbol, T>& 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
 | 
						|
}
 |