27 #ifndef SHORE_ALGO_D2TREE_HPP__
28 #define SHORE_ALGO_D2TREE_HPP__
40 template<
typename XCompare,
typename YCompare=XCompare,
typename XYCompare=XCompare>
51 template<
typename Iterator>
52 void build_recursive(
const Iterator i,
const Iterator j,
const bool d2)
54 const size_t size=j-i;
59 const Iterator med=i+(size>>1);
62 std::nth_element(i,med,j,m_ycmp);
64 std::nth_element(i,med,j,m_xcmp);
66 build_recursive(i,med,!d2);
67 build_recursive(med+1,j,!d2);
71 template<
typename Iterator,
typename Key_t>
72 void search_including_recursive(std::vector<Iterator>& ret,
74 const Iterator i,
const Iterator j,
77 const size_t size=j-i;
82 const Iterator med_it=i+(size>>1);
83 const typename std::iterator_traits<Iterator>::value_type& med_elem=*med_it;
87 if(!m_xcmp(key,med_elem))
89 if(!m_ycmp(med_elem,key))
90 ret.push_back(med_it);
92 search_including_recursive(ret,key,med_it+1,j,!d2);
94 search_including_recursive(ret,key,i,med_it,!d2);
98 if(!m_ycmp(med_elem,key))
100 if(!m_xcmp(key,med_elem))
101 ret.push_back(med_it);
103 search_including_recursive(ret,key,i,med_it,!d2);
105 search_including_recursive(ret,key,med_it+1,j,!d2);
110 template<
typename Iterator,
typename Key_t>
111 void search_included_recursive(std::vector<Iterator>& ret,
113 const Iterator i,
const Iterator j,
116 const size_t size=j-i;
121 const Iterator med_it=i+(size>>1);
122 const typename std::iterator_traits<Iterator>::value_type& med_elem=*med_it;
126 if(!m_xcmp(med_elem,key))
128 if(!m_ycmp(key,med_elem))
129 ret.push_back(med_it);
131 search_included_recursive(ret,key,i,med_it,!d2);
133 search_included_recursive(ret,key,med_it+1,j,!d2);
137 if(!m_ycmp(key,med_elem))
139 if(!m_xcmp(med_elem,key))
140 ret.push_back(med_it);
142 search_included_recursive(ret,key,med_it+1,j,!d2);
144 search_included_recursive(ret,key,i,med_it,!d2);
149 template<
typename Iterator,
typename Key_t>
150 void search_overlapping_recursive(std::vector<Iterator>& ret,
152 const Iterator i,
const Iterator j,
155 const size_t size=j-i;
160 const Iterator med_it=i+(size>>1);
161 const typename std::iterator_traits<Iterator>::value_type& med_elem=*med_it;
165 if(m_xycmp(med_elem,key))
167 if(m_xycmp(key,med_elem))
168 ret.push_back(med_it);
172 search_overlapping_recursive(ret,key,med_it+1,j,!d2);
175 search_overlapping_recursive(ret,key,i,med_it,!d2);
179 if(m_xycmp(key,med_elem))
181 if(m_xycmp(med_elem,key))
182 ret.push_back(med_it);
184 search_overlapping_recursive(ret,key,i,med_it,!d2);
187 search_overlapping_recursive(ret,key,med_it+1,j,!d2);
193 template<
typename Iterator,
typename Key_t>
194 void search_nearest_downstream_recursive(std::vector<Iterator>& ret,
196 const Iterator i,
const Iterator j,
199 const size_t size=j-i;
204 const Iterator med_it=i+(size>>1);
206 const typename std::iterator_traits<Iterator>::value_type& med_elem=*med_it;
209 if(!m_xycmp(med_elem,key))
215 ret.push_back(med_it);
217 search_nearest_downstream_recursive(ret,key,i,med_it,!d2);
218 search_nearest_downstream_recursive(ret,key,med_it+1,j,!d2);
224 if(m_xcmp(med_elem,*ret.front()))
227 ret.push_back(med_it);
229 search_nearest_downstream_recursive(ret,key,i,med_it,!d2);
230 search_nearest_downstream_recursive(ret,key,med_it+1,j,!d2);
233 else if(m_xcmp(*ret.front(),med_elem))
235 search_nearest_downstream_recursive(ret,key,i,med_it,!d2);
239 search_nearest_downstream_recursive(ret,key,med_it+1,j,!d2);
244 ret.push_back(med_it);
246 search_nearest_downstream_recursive(ret,key,i,med_it,!d2);
247 search_nearest_downstream_recursive(ret,key,med_it+1,j,!d2);
257 search_nearest_downstream_recursive(ret,key,i,med_it,!d2);
258 search_nearest_downstream_recursive(ret,key,med_it+1,j,!d2);
264 template<
typename Iterator,
typename Key_t>
265 void search_nearest_upstream_recursive(std::vector<Iterator>& ret,
267 const Iterator i,
const Iterator j,
270 const size_t size=j-i;
275 const Iterator med_it=i+(size>>1);
276 const typename std::iterator_traits<Iterator>::value_type& med_elem=*med_it;
278 if(m_xycmp(key,med_elem))
280 search_nearest_upstream_recursive(ret,key,i,med_it,!d2);
282 search_nearest_upstream_recursive(ret,key,med_it+1,j,!d2);
288 ret.push_back(med_it);
290 search_nearest_upstream_recursive(ret,key,i,med_it,!d2);
291 search_nearest_upstream_recursive(ret,key,med_it+1,j,!d2);
295 if(m_ycmp(*ret.front(),med_elem))
298 ret.push_back(med_it);
300 search_nearest_upstream_recursive(ret,key,i,med_it,!d2);
301 search_nearest_upstream_recursive(ret,key,med_it+1,j,!d2);
303 else if(m_ycmp(med_elem,*ret.front()))
306 search_nearest_upstream_recursive(ret,key,i,med_it,!d2);
307 search_nearest_upstream_recursive(ret,key,med_it+1,j,!d2);
311 ret.push_back(med_it);
313 search_nearest_upstream_recursive(ret,key,i,med_it,!d2);
314 search_nearest_upstream_recursive(ret,key,med_it+1,j,!d2);
323 d2tree(XCompare cx,YCompare cy,XYCompare cxy)
324 :m_xcmp(cx),m_ycmp(cy),m_xycmp(cxy),m_hasxy(true)
332 :m_xcmp(cx),m_ycmp(cy),m_xycmp(cx),m_hasxy(false)
338 template<
typename Iterator>
341 build_recursive(beg,end,
false);
353 template<
typename Iterator,
typename Key_t>
355 Iterator beg,Iterator
end,
const Key_t& key)
const
357 std::vector<Iterator> ret;
359 search_including_recursive(ret,key,beg,end,
false);
368 template<
typename Iterator,
typename Key_t>
370 Iterator beg,Iterator
end,
const Key_t& key)
const
372 std::vector<Iterator> ret;
374 search_included_recursive(ret,key,beg,end,
false);
383 template<
typename Iterator,
typename Key_t>
385 Iterator beg,Iterator
end,
const Key_t& key)
const
388 throw_exception(std::logic_error(
"d2tree: no xy comparator provided"));
390 std::vector<Iterator> ret;
392 search_overlapping_recursive(ret,key,beg,end,
false);
401 template<
typename Iterator,
typename Key_t>
403 Iterator beg,Iterator
end,
const Key_t& key)
const
406 throw_exception(std::logic_error(
"d2tree: no xy comparator provided"));
408 std::vector<Iterator> ret;
410 search_nearest_upstream_recursive(ret,key,beg,end,
false);
419 template<
typename Iterator,
typename Key_t>
421 Iterator beg,Iterator
end,
const Key_t& key)
const
424 throw_exception(std::logic_error(
"d2tree: no xy comparator provided"));
426 std::vector<Iterator> ret;
428 search_nearest_downstream_recursive(ret,key,beg,end,
false);
437 template<
typename first_t,
typename second_t>
438 bool paircmpx(
const std::pair<first_t,second_t>& p1,
439 const std::pair<first_t,second_t>& p2)
441 return p1.first<p2.first;
445 template<
typename first_t,
typename second_t>
446 bool paircmpy(
const std::pair<first_t,second_t>& p1,
447 const std::pair<first_t,second_t>& p2)
449 return p1.second<p2.second;
453 template<
typename first_t,
typename second_t>
455 const std::pair<first_t,second_t>& p2)
457 return p1.first<p2.second;
462 #endif // SHORE_ALGO_D2TREE_HPP__