Skip to content

Commit 5132d25

Browse files
committed
Add tests to cover odd sizes
1 parent 04f386d commit 5132d25

File tree

4 files changed

+6
-241
lines changed

4 files changed

+6
-241
lines changed

libcxx/include/__bit_reference

Lines changed: 0 additions & 236 deletions
Original file line numberDiff line numberDiff line change
@@ -186,240 +186,6 @@ private:
186186
__mask_(__m) {}
187187
};
188188

189-
<<<<<<< HEAD
190-
// copy_backward
191-
192-
template <class _Cp, bool _IsConst>
193-
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_backward_aligned(
194-
=======
195-
// copy
196-
197-
template <class _Cp, bool _IsConst>
198-
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_aligned(
199-
>>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool>::iterator)
200-
__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
201-
using _In = __bit_iterator<_Cp, _IsConst>;
202-
using difference_type = typename _In::difference_type;
203-
using __storage_type = typename _In::__storage_type;
204-
205-
const int __bits_per_word = _In::__bits_per_word;
206-
difference_type __n = __last - __first;
207-
if (__n > 0) {
208-
// do first word
209-
<<<<<<< HEAD
210-
if (__last.__ctz_ != 0) {
211-
difference_type __dn = std::min(static_cast<difference_type>(__last.__ctz_), __n);
212-
__n -= __dn;
213-
unsigned __clz = __bits_per_word - __last.__ctz_;
214-
__storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz);
215-
__storage_type __b = *__last.__seg_ & __m;
216-
*__result.__seg_ &= ~__m;
217-
*__result.__seg_ |= __b;
218-
__result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) + __result.__ctz_) % __bits_per_word);
219-
// __last.__ctz_ = 0
220-
}
221-
// __last.__ctz_ == 0 || __n == 0
222-
// __result.__ctz_ == 0 || __n == 0
223-
// do middle words
224-
__storage_type __nw = __n / __bits_per_word;
225-
__result.__seg_ -= __nw;
226-
__last.__seg_ -= __nw;
227-
std::copy_n(std::__to_address(__last.__seg_), __nw, std::__to_address(__result.__seg_));
228-
__n -= __nw * __bits_per_word;
229-
// do last word
230-
if (__n > 0) {
231-
__storage_type __m = ~__storage_type(0) << (__bits_per_word - __n);
232-
__storage_type __b = *--__last.__seg_ & __m;
233-
*--__result.__seg_ &= ~__m;
234-
*__result.__seg_ |= __b;
235-
__result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
236-
=======
237-
if (__first.__ctz_ != 0) {
238-
unsigned __clz = __bits_per_word - __first.__ctz_;
239-
difference_type __dn = std::min(static_cast<difference_type>(__clz), __n);
240-
__n -= __dn;
241-
__storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
242-
__storage_type __b = *__first.__seg_ & __m;
243-
*__result.__seg_ &= ~__m;
244-
*__result.__seg_ |= __b;
245-
__result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
246-
__result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
247-
++__first.__seg_;
248-
// __first.__ctz_ = 0;
249-
}
250-
// __first.__ctz_ == 0;
251-
// do middle words
252-
__storage_type __nw = __n / __bits_per_word;
253-
std::copy_n(std::__to_address(__first.__seg_), __nw, std::__to_address(__result.__seg_));
254-
__n -= __nw * __bits_per_word;
255-
__result.__seg_ += __nw;
256-
// do last word
257-
if (__n > 0) {
258-
__first.__seg_ += __nw;
259-
__storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
260-
__storage_type __b = *__first.__seg_ & __m;
261-
*__result.__seg_ &= ~__m;
262-
*__result.__seg_ |= __b;
263-
__result.__ctz_ = static_cast<unsigned>(__n);
264-
>>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool>::iterator)
265-
}
266-
}
267-
return __result;
268-
}
269-
270-
template <class _Cp, bool _IsConst>
271-
<<<<<<< HEAD
272-
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_backward_unaligned(
273-
=======
274-
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> __copy_unaligned(
275-
>>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool>::iterator)
276-
__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
277-
using _In = __bit_iterator<_Cp, _IsConst>;
278-
using difference_type = typename _In::difference_type;
279-
using __storage_type = typename _In::__storage_type;
280-
281-
const int __bits_per_word = _In::__bits_per_word;
282-
difference_type __n = __last - __first;
283-
if (__n > 0) {
284-
// do first word
285-
<<<<<<< HEAD
286-
if (__last.__ctz_ != 0) {
287-
difference_type __dn = std::min(static_cast<difference_type>(__last.__ctz_), __n);
288-
__n -= __dn;
289-
unsigned __clz_l = __bits_per_word - __last.__ctz_;
290-
__storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l);
291-
__storage_type __b = *__last.__seg_ & __m;
292-
unsigned __clz_r = __bits_per_word - __result.__ctz_;
293-
__storage_type __ddn = std::min(__dn, static_cast<difference_type>(__result.__ctz_));
294-
if (__ddn > 0) {
295-
__m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r);
296-
*__result.__seg_ &= ~__m;
297-
if (__result.__ctz_ > __last.__ctz_)
298-
*__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
299-
else
300-
*__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_);
301-
__result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) + __result.__ctz_) % __bits_per_word);
302-
__dn -= __ddn;
303-
}
304-
if (__dn > 0) {
305-
// __result.__ctz_ == 0
306-
--__result.__seg_;
307-
__result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1));
308-
__m = ~__storage_type(0) << __result.__ctz_;
309-
*__result.__seg_ &= ~__m;
310-
__last.__ctz_ -= __dn + __ddn;
311-
*__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
312-
}
313-
// __last.__ctz_ = 0
314-
}
315-
// __last.__ctz_ == 0 || __n == 0
316-
// __result.__ctz_ != 0 || __n == 0
317-
// do middle words
318-
unsigned __clz_r = __bits_per_word - __result.__ctz_;
319-
__storage_type __m = ~__storage_type(0) >> __clz_r;
320-
for (; __n >= __bits_per_word; __n -= __bits_per_word) {
321-
__storage_type __b = *--__last.__seg_;
322-
*__result.__seg_ &= ~__m;
323-
*__result.__seg_ |= __b >> __clz_r;
324-
*--__result.__seg_ &= __m;
325-
*__result.__seg_ |= __b << __result.__ctz_;
326-
}
327-
// do last word
328-
if (__n > 0) {
329-
__m = ~__storage_type(0) << (__bits_per_word - __n);
330-
__storage_type __b = *--__last.__seg_ & __m;
331-
__clz_r = __bits_per_word - __result.__ctz_;
332-
__storage_type __dn = std::min(__n, static_cast<difference_type>(__result.__ctz_));
333-
__m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r);
334-
*__result.__seg_ &= ~__m;
335-
*__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_);
336-
__result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) + __result.__ctz_) % __bits_per_word);
337-
__n -= __dn;
338-
if (__n > 0) {
339-
// __result.__ctz_ == 0
340-
--__result.__seg_;
341-
__result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
342-
__m = ~__storage_type(0) << __result.__ctz_;
343-
*__result.__seg_ &= ~__m;
344-
*__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
345-
=======
346-
if (__first.__ctz_ != 0) {
347-
unsigned __clz_f = __bits_per_word - __first.__ctz_;
348-
difference_type __dn = std::min(static_cast<difference_type>(__clz_f), __n);
349-
__n -= __dn;
350-
__storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
351-
__storage_type __b = *__first.__seg_ & __m;
352-
unsigned __clz_r = __bits_per_word - __result.__ctz_;
353-
__storage_type __ddn = std::min<__storage_type>(__dn, __clz_r);
354-
__m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
355-
*__result.__seg_ &= ~__m;
356-
if (__result.__ctz_ > __first.__ctz_)
357-
*__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_);
358-
else
359-
*__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_);
360-
__result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
361-
__result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word);
362-
__dn -= __ddn;
363-
if (__dn > 0) {
364-
__m = ~__storage_type(0) >> (__bits_per_word - __dn);
365-
*__result.__seg_ &= ~__m;
366-
*__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
367-
__result.__ctz_ = static_cast<unsigned>(__dn);
368-
}
369-
++__first.__seg_;
370-
// __first.__ctz_ = 0;
371-
}
372-
// __first.__ctz_ == 0;
373-
// do middle words
374-
unsigned __clz_r = __bits_per_word - __result.__ctz_;
375-
__storage_type __m = ~__storage_type(0) << __result.__ctz_;
376-
for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) {
377-
__storage_type __b = *__first.__seg_;
378-
*__result.__seg_ &= ~__m;
379-
*__result.__seg_ |= __b << __result.__ctz_;
380-
++__result.__seg_;
381-
*__result.__seg_ &= __m;
382-
*__result.__seg_ |= __b >> __clz_r;
383-
}
384-
// do last word
385-
if (__n > 0) {
386-
__m = ~__storage_type(0) >> (__bits_per_word - __n);
387-
__storage_type __b = *__first.__seg_ & __m;
388-
__storage_type __dn = std::min(__n, static_cast<difference_type>(__clz_r));
389-
__m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
390-
*__result.__seg_ &= ~__m;
391-
*__result.__seg_ |= __b << __result.__ctz_;
392-
__result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
393-
__result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
394-
__n -= __dn;
395-
if (__n > 0) {
396-
__m = ~__storage_type(0) >> (__bits_per_word - __n);
397-
*__result.__seg_ &= ~__m;
398-
*__result.__seg_ |= __b >> __dn;
399-
__result.__ctz_ = static_cast<unsigned>(__n);
400-
>>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool>::iterator)
401-
}
402-
}
403-
}
404-
return __result;
405-
}
406-
407-
template <class _Cp, bool _IsConst>
408-
<<<<<<< HEAD
409-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false> copy_backward(
410-
__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
411-
if (__last.__ctz_ == __result.__ctz_)
412-
return std::__copy_backward_aligned(__first, __last, __result);
413-
return std::__copy_backward_unaligned(__first, __last, __result);
414-
=======
415-
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false>
416-
copy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
417-
if (__first.__ctz_ == __result.__ctz_)
418-
return std::__copy_aligned(__first, __last, __result);
419-
return std::__copy_unaligned(__first, __last, __result);
420-
>>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool>::iterator)
421-
}
422-
423189
// move
424190

425191
template <class _Cp, bool _IsConst>
@@ -983,8 +749,6 @@ private:
983749
template <class _Dp, bool _IC>
984750
_LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false> __copy_backward_unaligned(
985751
__bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false> __result);
986-
// Note: dependent nested name specifier __copy_backward_impl<_AlgPolicy>::operator() for friend declaration
987-
// is not supported in clang. Thus, we use a friend declaration for the entire class.
988752
template <class _AlgPolicy>
989753
friend struct __copy_backward_impl;
990754
template <class _Cl, class _Cr>

libcxx/include/bitset

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,7 @@ template <size_t N> struct hash<std::bitset<N>>;
130130
# include <__cxx03/bitset>
131131
#else
132132
# include <__algorithm/copy.h>
133-
<<<<<<< HEAD
134-
=======
135133
# include <__algorithm/copy_backward.h>
136-
>>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool>::iterator)
137134
# include <__algorithm/count.h>
138135
# include <__algorithm/fill.h>
139136
# include <__algorithm/fill_n.h>

libcxx/test/std/algorithms/alg.modifying.operations/alg.copy/copy_backward.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,11 @@ TEST_CONSTEXPR_CXX20 bool test() {
115115

116116
{ // Test vector<bool>::iterator optimization
117117
assert(test_vector_bool(8));
118-
assert(test_vector_bool(16));
118+
assert(test_vector_bool(19));
119119
assert(test_vector_bool(32));
120+
assert(test_vector_bool(49));
120121
assert(test_vector_bool(64));
122+
assert(test_vector_bool(199));
121123
assert(test_vector_bool(256));
122124
}
123125

libcxx/test/std/algorithms/alg.modifying.operations/alg.copy/ranges.copy_backward.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,9 +348,11 @@ constexpr bool test() {
348348
#if TEST_STD_VER >= 23
349349
{ // Test vector<bool>::iterator optimization
350350
assert(test_vector_bool(8));
351-
assert(test_vector_bool(16));
351+
assert(test_vector_bool(19));
352352
assert(test_vector_bool(32));
353+
assert(test_vector_bool(49));
353354
assert(test_vector_bool(64));
355+
assert(test_vector_bool(199));
354356
assert(test_vector_bool(256));
355357
}
356358
#endif

0 commit comments

Comments
 (0)