view nearestaccumulator.h @ 632:41ef9e165c38

removed the raised warning as its behavior doesn't actually seem appropriate. switched the default value of strictConfig so data doesn't accidentally get deleted.
author map01bf
date Wed, 23 Sep 2009 17:54:37 +0000
parents e21a3db643af
children
line wrap: on
line source
template <class T> class NearestAccumulator : public Accumulator {
public:
  NearestAccumulator();
  ~NearestAccumulator();
  void add_point(adb_result_t *r);
  adb_query_results_t *get_points();
private:
  std::set< adb_result_t, adb_result_qpos_lt > *points;
};

template <class T> NearestAccumulator<T>::NearestAccumulator()
  : points(0) {
  points = new std::set< adb_result_t, adb_result_qpos_lt >;
}

template <class T> NearestAccumulator<T>::~NearestAccumulator() {
  if(points) {
    delete points;
  }
}

template <class T> void NearestAccumulator<T>::add_point(adb_result_t *r) {
  if(!isnan(r->dist)) {
    std::set< adb_result_t, adb_result_qpos_lt >::iterator it;
    it = points->find(*r);
    if(it == points->end()) {
      points->insert(*r);
    } else if(T()(*(const adb_result_t *)r,(*it))) {
      points->erase(it);
      points->insert(*r);
    }
  }
}

template <class T> adb_query_results_t *NearestAccumulator<T>::get_points() {
  unsigned int nresults = points->size();
  adb_query_results_t *r = (adb_query_results_t *) malloc(sizeof(adb_query_results_t));
  adb_result_t *rs = (adb_result_t *) calloc(nresults, sizeof(adb_result_t));
  r->nresults = nresults;
  r->results = rs;
  std::set< adb_result_t, adb_result_qpos_lt >::iterator it;
  unsigned int k = 0;
  for(it = points->begin(); it != points->end(); it++) {
    rs[k++] = *it;
  }
  return r;
}