Mercurial > hg > audiodb
view dbaccumulator.h @ 459:fcc6f7c4856b api-inversion
No more global shingle vector of vectors.
Convert audioDB::index_initialize_shingles and
audioDB::index_norm_shingles to plain old functions. In doing so, the
latter in particular acquires a silly argument list; we need that
complexity for now because it's called both from audioDB::query (which
we're currently inverting) and from audioDB::index (which is out of
scope for now).
The loss of the global vv thing made me check up on memory discipline
[hence the new API function audiodb_query_free_results() as well as the
internal audiodb_index_delete_shingles()]. It's not too bad, but there
are plenty of leaks for those with time to do
AUDIODB="valgrind --leak-check=full ../../audioDB" sh ./run-test.sh
on their favourite test case. For example, the Radius reporters leak
one triple per hit.
(Honestly, C++ memory management is teh suck.)
author | mas01cr |
---|---|
date | Sun, 28 Dec 2008 22:43:50 +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; }