mas01cr@420: template class DBAccumulator : public Accumulator { mas01cr@420: public: mas01cr@420: DBAccumulator(unsigned int pointNN); mas01cr@420: ~DBAccumulator(); mas01cr@420: void add_point(adb_result_t *r); mas01cr@420: adb_query_results_t *get_points(); mas01cr@420: private: mas01cr@420: unsigned int pointNN; mas01cr@420: std::priority_queue< adb_result_t, std::vector, T > *queue; mas01cr@420: std::set< adb_result_t, adb_result_triple_lt > *set; mas01cr@420: }; mas01cr@420: mas01cr@420: template DBAccumulator::DBAccumulator(unsigned int pointNN) mas01cr@420: : pointNN(pointNN), queue(0), set(0) { mas01cr@420: queue = new std::priority_queue< adb_result_t, std::vector, T>; mas01cr@420: set = new std::set; mas01cr@420: } mas01cr@420: mas01cr@420: template DBAccumulator::~DBAccumulator() { mas01cr@420: if(queue) { mas01cr@420: delete queue; mas01cr@420: } mas01cr@420: if(set) { mas01cr@420: delete set; mas01cr@420: } mas01cr@420: } mas01cr@420: mas01cr@420: template void DBAccumulator::add_point(adb_result_t *r) { mas01cr@420: if(!isnan(r->dist)) { mas01cr@420: if(set->find(*r) == set->end()) { mas01cr@420: set->insert(*r); mas01cr@420: queue->push(*r); mas01cr@420: if(queue->size() > pointNN) { mas01cr@420: queue->pop(); mas01cr@420: } mas01cr@420: } mas01cr@420: } mas01cr@420: } mas01cr@420: mas01cr@420: template adb_query_results_t *DBAccumulator::get_points() { mas01cr@420: unsigned int size = queue->size(); mas01cr@420: adb_query_results_t *r = (adb_query_results_t *) malloc(sizeof(adb_query_results_t)); mas01cr@420: adb_result_t *rs = (adb_result_t *) calloc(size, sizeof(adb_result_t)); mas01cr@420: r->nresults = size; mas01cr@420: r->results = rs; mas01cr@420: mas01cr@420: for(unsigned int k = 0; k < size; k++) { mas01cr@420: rs[k] = queue->top(); mas01cr@420: queue->pop(); mas01cr@420: } mas01cr@420: return r; mas01cr@420: }