duncan
Mom and Dad were wrong!
/home/malcolm/tmp/duncan/prototype/0/server/charlist.h
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
 All Classes Namespaces Functions Variables Typedefs Enumerations