annotate dbaccumulator.h @ 497:9d8aee621afb api-inversion

More libtests fixups. Include audiodb_close() calls everywhere (whoops). Add the facility to run tests under valgrind. Unfortunately the error-exitcode flag doesn't actually cause an error exit if the only thing wrong is memory leaks, but it will if there are actual memory errors, which is a start.
author mas01cr
date Sat, 10 Jan 2009 16:07:43 +0000
parents 580f696c817c
children e21a3db643af
rev   line source
mas01cr@420 1 template <class T> class DBAccumulator : public Accumulator {
mas01cr@420 2 public:
mas01cr@420 3 DBAccumulator(unsigned int pointNN);
mas01cr@420 4 ~DBAccumulator();
mas01cr@420 5 void add_point(adb_result_t *r);
mas01cr@420 6 adb_query_results_t *get_points();
mas01cr@420 7 private:
mas01cr@420 8 unsigned int pointNN;
mas01cr@420 9 std::priority_queue< adb_result_t, std::vector<adb_result_t>, T > *queue;
mas01cr@420 10 std::set< adb_result_t, adb_result_triple_lt > *set;
mas01cr@420 11 };
mas01cr@420 12
mas01cr@420 13 template <class T> DBAccumulator<T>::DBAccumulator(unsigned int pointNN)
mas01cr@420 14 : pointNN(pointNN), queue(0), set(0) {
mas01cr@420 15 queue = new std::priority_queue< adb_result_t, std::vector<adb_result_t>, T>;
mas01cr@420 16 set = new std::set<adb_result_t, adb_result_triple_lt>;
mas01cr@420 17 }
mas01cr@420 18
mas01cr@420 19 template <class T> DBAccumulator<T>::~DBAccumulator() {
mas01cr@420 20 if(queue) {
mas01cr@420 21 delete queue;
mas01cr@420 22 }
mas01cr@420 23 if(set) {
mas01cr@420 24 delete set;
mas01cr@420 25 }
mas01cr@420 26 }
mas01cr@420 27
mas01cr@420 28 template <class T> void DBAccumulator<T>::add_point(adb_result_t *r) {
mas01cr@420 29 if(!isnan(r->dist)) {
mas01cr@420 30 if(set->find(*r) == set->end()) {
mas01cr@420 31 set->insert(*r);
mas01cr@420 32 queue->push(*r);
mas01cr@420 33 if(queue->size() > pointNN) {
mas01cr@420 34 queue->pop();
mas01cr@420 35 }
mas01cr@420 36 }
mas01cr@420 37 }
mas01cr@420 38 }
mas01cr@420 39
mas01cr@420 40 template <class T> adb_query_results_t *DBAccumulator<T>::get_points() {
mas01cr@420 41 unsigned int size = queue->size();
mas01cr@420 42 adb_query_results_t *r = (adb_query_results_t *) malloc(sizeof(adb_query_results_t));
mas01cr@420 43 adb_result_t *rs = (adb_result_t *) calloc(size, sizeof(adb_result_t));
mas01cr@420 44 r->nresults = size;
mas01cr@420 45 r->results = rs;
mas01cr@420 46
mas01cr@420 47 for(unsigned int k = 0; k < size; k++) {
mas01cr@420 48 rs[k] = queue->top();
mas01cr@420 49 queue->pop();
mas01cr@420 50 }
mas01cr@420 51 return r;
mas01cr@420 52 }