annotate nearestaccumulator.h @ 601:82d23418d867

Fix some fd leaks in the command-line binary Strictly speaking, they're not really leaks, because the only codepath that suffers from these leaks exits immediately afterwards. On the other hand, this fix makes valgrind on e.g. tests/0025 happier, going from 5 errors to none.
author mas01cr
date Fri, 14 Aug 2009 16:39:32 +0000
parents 342822c2d49a
children e21a3db643af
rev   line source
mas01cr@498 1 template <class T> class NearestAccumulator : public Accumulator {
mas01cr@498 2 public:
mas01cr@498 3 NearestAccumulator();
mas01cr@498 4 ~NearestAccumulator();
mas01cr@498 5 void add_point(adb_result_t *r);
mas01cr@498 6 adb_query_results_t *get_points();
mas01cr@498 7 private:
mas01cr@498 8 std::set< adb_result_t, adb_result_triple_lt > *set;
mas01cr@498 9 std::set< adb_result_t, adb_result_qpos_lt > *points;
mas01cr@498 10 };
mas01cr@498 11
mas01cr@498 12 template <class T> NearestAccumulator<T>::NearestAccumulator()
mas01cr@498 13 : set(0), points(0) {
mas01cr@498 14 set = new std::set< adb_result_t, adb_result_triple_lt >;
mas01cr@498 15 points = new std::set< adb_result_t, adb_result_qpos_lt >;
mas01cr@498 16 }
mas01cr@498 17
mas01cr@498 18 template <class T> NearestAccumulator<T>::~NearestAccumulator() {
mas01cr@498 19 if(set) {
mas01cr@498 20 delete set;
mas01cr@498 21 }
mas01cr@498 22 if(points) {
mas01cr@498 23 delete points;
mas01cr@498 24 }
mas01cr@498 25 }
mas01cr@498 26
mas01cr@498 27 template <class T> void NearestAccumulator<T>::add_point(adb_result_t *r) {
mas01cr@498 28 if(!isnan(r->dist)) {
mas01cr@498 29 if(set->find(*r) == set->end()) {
mas01cr@498 30 set->insert(*r);
mas01cr@498 31
mas01cr@498 32 std::set< adb_result_t, adb_result_qpos_lt >::iterator it;
mas01cr@498 33 it = points->find(*r);
mas01cr@498 34 if(it == points->end()) {
mas01cr@498 35 points->insert(*r);
mas01cr@498 36 } else if(T()(*(const adb_result_t *)r,(*it))) {
mas01cr@498 37 points->erase(it);
mas01cr@498 38 points->insert(*r);
mas01cr@498 39 }
mas01cr@498 40 }
mas01cr@498 41 }
mas01cr@498 42 }
mas01cr@498 43
mas01cr@498 44 template <class T> adb_query_results_t *NearestAccumulator<T>::get_points() {
mas01cr@498 45 unsigned int nresults = points->size();
mas01cr@498 46 adb_query_results_t *r = (adb_query_results_t *) malloc(sizeof(adb_query_results_t));
mas01cr@498 47 adb_result_t *rs = (adb_result_t *) calloc(nresults, sizeof(adb_result_t));
mas01cr@498 48 r->nresults = nresults;
mas01cr@498 49 r->results = rs;
mas01cr@498 50 std::set< adb_result_t, adb_result_qpos_lt >::iterator it;
mas01cr@498 51 unsigned int k = 0;
mas01cr@498 52 for(it = points->begin(); it != points->end(); it++) {
mas01cr@498 53 rs[k++] = *it;
mas01cr@498 54 }
mas01cr@498 55 return r;
mas01cr@498 56 }
mas01cr@498 57