Mercurial > hg > audiodb
view dbaccumulator.h @ 473:b2fd8113d8bc api-inversion
const declarations for some API arguments.
This should make it slightly clearer whose responsibility (the user's)
it is to manage the memory pointed to by the corresponding arguments.
Suggested by Chris Cannam.
author | mas01cr |
---|---|
date | Tue, 06 Jan 2009 16:27:01 +0000 |
parents | 580f696c817c |
children | e21a3db643af |
line wrap: on
line source
template <class T> class DBAccumulator : public Accumulator { public: DBAccumulator(unsigned int pointNN); ~DBAccumulator(); void add_point(adb_result_t *r); adb_query_results_t *get_points(); private: unsigned int pointNN; std::priority_queue< adb_result_t, std::vector<adb_result_t>, T > *queue; std::set< adb_result_t, adb_result_triple_lt > *set; }; template <class T> DBAccumulator<T>::DBAccumulator(unsigned int pointNN) : pointNN(pointNN), queue(0), set(0) { queue = new std::priority_queue< adb_result_t, std::vector<adb_result_t>, T>; set = new std::set<adb_result_t, adb_result_triple_lt>; } template <class T> DBAccumulator<T>::~DBAccumulator() { if(queue) { delete queue; } if(set) { delete set; } } template <class T> void DBAccumulator<T>::add_point(adb_result_t *r) { if(!isnan(r->dist)) { if(set->find(*r) == set->end()) { set->insert(*r); queue->push(*r); if(queue->size() > pointNN) { queue->pop(); } } } } template <class T> adb_query_results_t *DBAccumulator<T>::get_points() { unsigned int size = queue->size(); adb_query_results_t *r = (adb_query_results_t *) malloc(sizeof(adb_query_results_t)); adb_result_t *rs = (adb_result_t *) calloc(size, sizeof(adb_result_t)); r->nresults = size; r->results = rs; for(unsigned int k = 0; k < size; k++) { rs[k] = queue->top(); queue->pop(); } return r; }