88 void add(Index_ i, Distance_ d) {
90 my_nearest.emplace(d, i);
91 if (my_nearest.size() == my_neighbors) {
95 my_nearest.emplace(d, i);
114 void report(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances, Index_ self) {
117 assert(!my_nearest.empty());
118 auto num_expected = my_nearest.size() - 1;
120 if (output_indices) {
121 output_indices->clear();
122 output_indices->reserve(num_expected);
124 if (output_distances) {
125 output_distances->clear();
126 output_distances->reserve(num_expected);
129 bool found_self =
false;
130 while (!my_nearest.empty()) {
131 const auto& top = my_nearest.top();
132 if (!found_self && top.second == self) {
135 if (output_indices) {
136 output_indices->push_back(top.second);
138 if (output_distances) {
139 output_distances->push_back(top.first);
147 if (output_indices) {
148 std::reverse(output_indices->begin(), output_indices->end());
150 if (output_distances) {
151 std::reverse(output_distances->begin(), output_distances->end());
157 if (output_indices) {
158 output_indices->pop_back();
160 if (output_distances) {
161 output_distances->pop_back();
202 void report(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances) {
203 if (output_indices && output_distances) {
204 report_internal<true, true>(output_indices, output_distances);
205 }
else if (output_indices) {
206 report_internal<true, false>(output_indices, NULL);
207 }
else if (output_distances) {
208 report_internal<false, true>(NULL, output_distances);