@@ -113,6 +113,7 @@ class WideRankSelect : public WideRank<optimized_for> {
113113 [[nodiscard(" select0 computed but not used" )]] size_t
114114 select0 (size_t rank) const {
115115 size_t const l1_end = l1_.size ();
116+ size_t const l2_end = l2_.size ();
116117
117118 size_t l2_pos = ((rank - 1 ) / WideRankSelectConfig::SELECT_SAMPLE_RATE);
118119 size_t l1_pos = l2_pos / 128 ;
@@ -132,13 +133,12 @@ class WideRankSelect : public WideRank<optimized_for> {
132133 rank -= l1_[l1_pos];
133134 }
134135
135- l2_pos = l1_pos * 128 ;
136+ l2_pos = std::max ( l1_pos * 128 , l2_pos) ;
136137
137138 if constexpr (use_linear_search (find_with)) {
138- size_t const local_l2_end = l2_pos + 128 ;
139139 if constexpr (optimize_one_or_dont_care (optimized_for)) {
140140 size_t added = 0 ;
141- while (l2_pos + 1 < local_l2_end &&
141+ while (l2_pos + 1 < l2_end &&
142142 ((added + 1 ) * WideRankSelectConfig::L2_BIT_SIZE) -
143143 l2_[l2_pos + 1 ] <
144144 rank) {
@@ -147,13 +147,12 @@ class WideRankSelect : public WideRank<optimized_for> {
147147 }
148148 rank -= (added * WideRankSelectConfig::L2_BIT_SIZE) - l2_[l2_pos];
149149 } else {
150- while (l2_pos + 1 < local_l2_end && l2_[l2_pos + 1 ] < rank) {
150+ while (l2_pos + 1 < l2_end && l2_[l2_pos + 1 ] < rank) {
151151 ++l2_pos;
152152 }
153153 rank -= l2_[l2_pos];
154154 }
155155 } else if constexpr (use_binary_search (find_with)) {
156- size_t const l2_end = l2_.size ();
157156 size_t const end = std::min ((l1_pos + 1 ) * 128 , l2_end);
158157 size_t const iterations = tlx::integer_log2_ceil (end - l2_pos + 1 );
159158 size_t size = 1ULL << (iterations - 1 );
@@ -233,6 +232,7 @@ class WideRankSelect : public WideRank<optimized_for> {
233232 [[nodiscard(" select1 computed but not used" )]] size_t
234233 select1 (size_t rank) const {
235234 size_t const l1_end = l1_.size ();
235+ size_t const l2_end = l2_.size ();
236236
237237 size_t l2_pos = ((rank - 1 ) / WideRankSelectConfig::SELECT_SAMPLE_RATE);
238238 size_t l1_pos = l2_pos / 128 ;
@@ -252,17 +252,17 @@ class WideRankSelect : public WideRank<optimized_for> {
252252 rank -= (l1_pos * WideRankSelectConfig::L1_BIT_SIZE) - l1_[l1_pos];
253253 }
254254
255- l2_pos = l1_pos * 128 ;
255+ l2_pos = std::max (l1_pos * 128 , l2_pos);
256+
256257 if constexpr (use_linear_search (find_with)) {
257- size_t const local_l2_end = std::min (l2_.size (), l2_pos + 128 );
258258 if constexpr (optimize_one_or_dont_care (optimized_for)) {
259- while (l2_pos + 1 < local_l2_end && l2_[l2_pos + 1 ] < rank) {
259+ while (l2_pos + 1 < l2_end && l2_[l2_pos + 1 ] < rank) {
260260 ++l2_pos;
261261 }
262262 rank -= l2_[l2_pos];
263263 } else {
264264 size_t added = 0 ;
265- while (l2_pos + 1 < local_l2_end &&
265+ while (l2_pos + 1 < l2_end &&
266266 ((added + 1 ) * WideRankSelectConfig::L2_BIT_SIZE) -
267267 l2_[l2_pos + 1 ] <
268268 rank) {
@@ -272,7 +272,6 @@ class WideRankSelect : public WideRank<optimized_for> {
272272 rank -= (added * WideRankSelectConfig::L2_BIT_SIZE) - l2_[l2_pos];
273273 }
274274 } else if constexpr (use_binary_search (find_with)) {
275- size_t const l2_end = l2_.size ();
276275 size_t const end = std::min ((l1_pos + 1 ) * 128 , l2_end);
277276 size_t const iterations = tlx::integer_log2_ceil (end - l2_pos + 1 );
278277 size_t size = 1ULL << (iterations - 1 );
0 commit comments