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