annotate dbaccumulator.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 DBAccumulator : public Accumulator {
mas01cr@498 2 public:
mas01cr@498 3 DBAccumulator(unsigned int pointNN);
mas01cr@498 4 ~DBAccumulator();
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 unsigned int pointNN;
mas01cr@498 9 std::priority_queue< adb_result_t, std::vector<adb_result_t>, T > *queue;
mas01cr@498 10 std::set< adb_result_t, adb_result_triple_lt > *set;
mas01cr@498 11 };
mas01cr@498 12
mas01cr@498 13 template <class T> DBAccumulator<T>::DBAccumulator(unsigned int pointNN)
mas01cr@498 14 : pointNN(pointNN), queue(0), set(0) {
mas01cr@498 15 queue = new std::priority_queue< adb_result_t, std::vector<adb_result_t>, T>;
mas01cr@498 16 set = new std::set<adb_result_t, adb_result_triple_lt>;
mas01cr@498 17 }
mas01cr@498 18
mas01cr@498 19 template <class T> DBAccumulator<T>::~DBAccumulator() {
mas01cr@498 20 if(queue) {
mas01cr@498 21 delete queue;
mas01cr@498 22 }
mas01cr@498 23 if(set) {
mas01cr@498 24 delete set;
mas01cr@498 25 }
mas01cr@498 26 }
mas01cr@498 27
mas01cr@498 28 template <class T> void DBAccumulator<T>::add_point(adb_result_t *r) {
mas01cr@498 29 if(!isnan(r->dist)) {
mas01cr@498 30 if(set->find(*r) == set->end()) {
mas01cr@498 31 set->insert(*r);
mas01cr@498 32 queue->push(*r);
mas01cr@498 33 if(queue->size() > pointNN) {
mas01cr@498 34 queue->pop();
mas01cr@498 35 }
mas01cr@498 36 }
mas01cr@498 37 }
mas01cr@498 38 }
mas01cr@498 39
mas01cr@498 40 template <class T> adb_query_results_t *DBAccumulator<T>::get_points() {
mas01cr@498 41 unsigned int size = queue->size();
mas01cr@498 42 adb_query_results_t *r = (adb_query_results_t *) malloc(sizeof(adb_query_results_t));
mas01cr@498 43 adb_result_t *rs = (adb_result_t *) calloc(size, sizeof(adb_result_t));
mas01cr@498 44 r->nresults = size;
mas01cr@498 45 r->results = rs;
mas01cr@498 46
mas01cr@498 47 for(unsigned int k = 0; k < size; k++) {
mas01cr@498 48 rs[k] = queue->top();
mas01cr@498 49 queue->pop();
mas01cr@498 50 }
mas01cr@498 51 return r;
mas01cr@498 52 }