@@ -77,8 +77,10 @@ auto list_list_to_arrays(vec<vec<T>> out_ll)
77
77
}
78
78
vec<T> out;
79
79
out.reserve (sum);
80
- for (const auto &v : out_ll)
81
- out.insert (out.end (), v.begin (), v.end ());
80
+ for (auto &v : out_ll)
81
+ out.insert (out.end (),
82
+ std::make_move_iterator (v.begin ()),
83
+ std::make_move_iterator (v.end ()));
82
84
83
85
return make_tuple (
84
86
std::move (as_pyarray (out_s)),
@@ -104,14 +106,14 @@ static const float REBUILD_THRE = 1.25;
104
106
#define unlikely (x ) (x)
105
107
#endif
106
108
107
- std::string compress (std::string &data)
109
+ inline std::string compress (const std::string &data)
108
110
{
109
111
std::string output;
110
112
snappy::Compress (data.data (), data.size (), &output);
111
113
return output;
112
114
}
113
115
114
- std::string decompress (std::string &data)
116
+ inline std::string decompress (const std::string &data)
115
117
{
116
118
std::string output;
117
119
snappy::Uncompress (data.data (), data.size (), &output);
@@ -702,25 +704,22 @@ class PRTreeElement
702
704
template <class T , int B = 6 , int D = 2 >
703
705
void bfs (const std::function<void (std::unique_ptr<PRTreeLeaf<T, B, D>> &)> &func, vec<PRTreeElement<T, B, D>> &flat_tree, const BB<D> target)
704
706
{
705
- queue<size_t > que;
706
- auto qpush_if_intersect = [&](const size_t &i)
707
+ vec<size_t > que;
708
+ que.reserve (flat_tree.size ());
709
+ auto qpush_if_intersect = [&](size_t i)
707
710
{
708
711
PRTreeElement<T, B, D> &r = flat_tree[i];
709
- // std::cout << "i " << (long int) i << " : " << (bool) r.leaf << std::endl;
710
712
if (r (target))
711
713
{
712
- // std::cout << " is pushed" << std::endl;
713
- que.emplace (i);
714
+ que.push_back (i);
714
715
}
715
716
};
716
717
717
- // std::cout << "size: " << flat_tree.size() << std::endl;
718
718
qpush_if_intersect (0 );
719
- while (!que.empty ())
719
+ size_t qhead = 0 ;
720
+ while (qhead < que.size ())
720
721
{
721
- size_t idx = que.front ();
722
- // std::cout << "idx: " << (long int) idx << std::endl;
723
- que.pop ();
722
+ size_t idx = que[qhead++];
724
723
PRTreeElement<T, B, D> &elem = flat_tree[idx];
725
724
726
725
if (elem.leaf )
@@ -733,7 +732,8 @@ void bfs(const std::function<void(std::unique_ptr<PRTreeLeaf<T, B, D>> &)> &func
733
732
for (size_t offset = 0 ; offset < B; offset++)
734
733
{
735
734
size_t jdx = idx * B + offset + 1 ;
736
- qpush_if_intersect (jdx);
735
+ if (jdx < flat_tree.size ())
736
+ qpush_if_intersect (jdx);
737
737
}
738
738
}
739
739
}
0 commit comments