| 117 | |
| 118 | template <class _Cp, bool _IsConst1, bool _IsConst2> |
| 119 | [[__nodiscard__]] _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool |
| 120 | __equal_aligned(__bit_iterator<_Cp, _IsConst1> __first1, |
| 121 | __bit_iterator<_Cp, _IsConst1> __last1, |
| 122 | __bit_iterator<_Cp, _IsConst2> __first2) { |
| 123 | using _It = __bit_iterator<_Cp, _IsConst1>; |
| 124 | using difference_type = typename _It::difference_type; |
| 125 | using __storage_type = typename _It::__storage_type; |
| 126 | |
| 127 | const int __bits_per_word = _It::__bits_per_word; |
| 128 | difference_type __n = __last1 - __first1; |
| 129 | if (__n > 0) { |
| 130 | // do first word |
| 131 | if (__first1.__ctz_ != 0) { |
| 132 | unsigned __clz = __bits_per_word - __first1.__ctz_; |
| 133 | difference_type __dn = std::min(static_cast<difference_type>(__clz), __n); |
| 134 | __n -= __dn; |
| 135 | __storage_type __m = std::__middle_mask<__storage_type>(__clz - __dn, __first1.__ctz_); |
| 136 | if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) |
| 137 | return false; |
| 138 | ++__first2.__seg_; |
| 139 | ++__first1.__seg_; |
| 140 | // __first1.__ctz_ = 0; |
| 141 | // __first2.__ctz_ = 0; |
| 142 | } |
| 143 | // __first1.__ctz_ == 0; |
| 144 | // __first2.__ctz_ == 0; |
| 145 | // do middle words |
| 146 | for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_) |
| 147 | if (*__first2.__seg_ != *__first1.__seg_) |
| 148 | return false; |
| 149 | // do last word |
| 150 | if (__n > 0) { |
| 151 | __storage_type __m = std::__trailing_mask<__storage_type>(__bits_per_word - __n); |
| 152 | if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) |
| 153 | return false; |
| 154 | } |
| 155 | } |
| 156 | return true; |
| 157 | } |
| 158 | |
| 159 | template <class _Cp, |
| 160 | bool _IsConst1, |
no test coverage detected