duncan
Mom and Dad were wrong!
|
00001 #ifndef SERVER_CHARLIST_H_ 00002 #define SERVER_CHARLIST_H_ 00003 00004 #include <vector> 00005 #include <functional> 00006 #include <utility> 00007 #include "character.h" 00008 #include "kdtree++/kdtree.hpp" 00009 00010 namespace server { 00011 00021 template <typename T> class CharList { 00022 public: 00023 typedef std::pair<T*,std::pair<double,double> > node_t; 00024 private: 00025 // typedef std::pair<T*,std::pair<double,double> > node_t; 00026 typedef KDTree::KDTree<2,node_t,std::pointer_to_binary_function<node_t,size_t,double> > tree_t; 00027 tree_t tree_; 00028 //mutable T* dummy_; 00029 00030 inline node_t make_node(T* c) const { 00031 return std::make_pair(c,std::make_pair(c->row(),c->col())); 00032 } 00033 inline node_t make_node(double r, double c) const { 00034 return std::make_pair((T*)0,std::make_pair(r,c)); 00035 } 00036 public: 00037 typedef typename tree_t::const_iterator const_iterator; 00038 00042 CharList() : tree_(std::ptr_fun(acc)) { 00043 // dummy_=new T(); 00044 // dummy_->set_name("Dummy (tc)"); 00045 } 00046 00051 void insert(T* c) {tree_.insert(make_node(c));} 00052 00057 void erase(T* c) {tree_.erase_exact(make_node(c));} 00058 00062 void optimise() {tree_.optimise();} 00063 00068 const_iterator begin() {return tree_.begin();} 00069 00074 const_iterator end() {return tree_.end();} 00075 00083 void square(double rc,double cc,double r,std::vector<node_t>& v) const { 00084 // dummy_->set_pos(rc,cc); 00085 tree_.find_within_range(make_node(rc,cc),r,std::back_inserter(v)); 00086 } 00087 00094 void square(T* c,double r,std::vector<node_t>& v) const { 00095 tree_.find_within_range(make_node(c),r,std::back_inserter(v)); 00096 } 00097 00104 T* nearest(double r, double c) { 00105 //dummy_->set_pos(r,c); 00106 typename tree_t::iterator iter=tree_.find_nearest(make_node(r,c)).first; 00107 return (iter==tree_.end()?0:(*iter).first); 00108 } 00109 00116 void move(T* e, double r, double c) { 00117 erase(e); 00118 e->set_pos(r,c); 00119 insert(e); 00120 } 00121 00128 static inline double acc(node_t c,size_t k) {return (k?c.second.second:c.second.first);} 00129 }; 00130 00131 } 00132 00133 #endif