mas01cr@420: template class NearestAccumulator : public Accumulator { mas01cr@420: public: mas01cr@420: NearestAccumulator(); mas01cr@420: ~NearestAccumulator(); mas01cr@420: void add_point(adb_result_t *r); mas01cr@420: adb_query_results_t *get_points(); mas01cr@420: private: mas01cr@420: std::set< adb_result_t, adb_result_triple_lt > *set; mas01cr@420: std::set< adb_result_t, adb_result_qpos_lt > *points; mas01cr@420: }; mas01cr@420: mas01cr@420: template NearestAccumulator::NearestAccumulator() mas01cr@420: : set(0), points(0) { mas01cr@420: set = new std::set< adb_result_t, adb_result_triple_lt >; mas01cr@420: points = new std::set< adb_result_t, adb_result_qpos_lt >; mas01cr@420: } mas01cr@420: mas01cr@420: template NearestAccumulator::~NearestAccumulator() { mas01cr@420: if(set) { mas01cr@420: delete set; mas01cr@420: } mas01cr@420: if(points) { mas01cr@420: delete points; mas01cr@420: } mas01cr@420: } mas01cr@420: mas01cr@420: template void NearestAccumulator::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: mas01cr@420: std::set< adb_result_t, adb_result_qpos_lt >::iterator it; mas01cr@420: it = points->find(*r); mas01cr@420: if(it == points->end()) { mas01cr@420: points->insert(*r); mas01cr@420: } else if(T()(*(const adb_result_t *)r,(*it))) { mas01cr@420: points->erase(it); mas01cr@420: points->insert(*r); mas01cr@420: } mas01cr@420: } mas01cr@420: } mas01cr@420: } mas01cr@420: mas01cr@420: template adb_query_results_t *NearestAccumulator::get_points() { mas01cr@420: unsigned int nresults = points->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(nresults, sizeof(adb_result_t)); mas01cr@420: r->nresults = nresults; mas01cr@420: r->results = rs; mas01cr@420: std::set< adb_result_t, adb_result_qpos_lt >::iterator it; mas01cr@420: unsigned int k = 0; mas01cr@420: for(it = points->begin(); it != points->end(); it++) { mas01cr@420: rs[k++] = *it; mas01cr@420: } mas01cr@420: return r; mas01cr@420: } mas01cr@420: