@@ -501,40 +501,42 @@ function Array{T,N}(B::BitArray{N}) where {T,N}
501501end
502502
503503BitArray (A:: AbstractArray{<:Any,N} ) where {N} = BitArray {N} (A)
504+
504505function BitArray {N} (A:: AbstractArray{T,N} ) where N where T
505506 B = BitArray (undef, convert (Dims{N}, size (A):: Dims{N} ))
506- Bc = B. chunks
507- l = length (B)
507+ _checkaxs (axes (B), axes (A))
508+ _copyto_bitarray! (B, A)
509+ return B:: BitArray{N}
510+ end
511+
512+ function _copyto_bitarray! (B:: BitArray , A:: AbstractArray )
513+ l = length (A)
508514 l == 0 && return B
509- ind = 1
515+ l > length (B) && throw (BoundsError (B, length (B)+ 1 ))
516+ Bc = B. chunks
517+ nc = num_bit_chunks (l)
518+ Ai = first (eachindex (A))
510519 @inbounds begin
511- for i = 1 : length (Bc) - 1
520+ for i = 1 : nc - 1
512521 c = UInt64 (0 )
513522 for j = 0 : 63
514- c |= (UInt64 (convert (Bool, A[ind ]):: Bool ) << j)
515- ind += 1
523+ c |= (UInt64 (convert (Bool, A[Ai ]):: Bool ) << j)
524+ Ai = nextind (A, Ai)
516525 end
517526 Bc[i] = c
518527 end
519528 c = UInt64 (0 )
520- for j = 0 : _mod64 (l- 1 )
521- c |= (UInt64 (convert (Bool, A[ind]):: Bool ) << j)
522- ind += 1
529+ tail = _mod64 (l - 1 ) + 1
530+ for j = 0 : tail- 1
531+ c |= (UInt64 (convert (Bool, A[Ai]):: Bool ) << j)
532+ Ai = nextind (A, Ai)
523533 end
524- Bc[end ] = c
534+ msk = _msk_end (tail)
535+ Bc[nc] = (c & msk) | (Bc[nc] & ~ msk)
525536 end
526537 return B
527538end
528539
529- function BitArray {N} (A:: Array{Bool,N} ) where N
530- B = BitArray (undef, size (A))
531- Bc = B. chunks
532- l = length (B)
533- l == 0 && return B
534- copy_to_bitarray_chunks! (Bc, 1 , A, 1 , l)
535- return B:: BitArray{N}
536- end
537-
538540reinterpret (:: Type{Bool} , B:: BitArray , dims:: NTuple{N,Int} ) where {N} = reinterpret (B, dims)
539541reinterpret (B:: BitArray , dims:: NTuple{N,Int} ) where {N} = reshape (B, dims)
540542
@@ -721,24 +723,25 @@ function _unsafe_setindex!(B::BitArray, X::AbstractArray, I::BitArray)
721723 lx = length (X)
722724 last_chunk_len = _mod64 (length (B)- 1 )+ 1
723725
724- c = 1
726+ Xi = first (eachindex (X))
727+ lastXi = last (eachindex (X))
725728 for i = 1 : lc
726729 @inbounds Imsk = Ic[i]
727730 @inbounds C = Bc[i]
728731 u = UInt64 (1 )
729732 for j = 1 : (i < lc ? 64 : last_chunk_len)
730733 if Imsk & u != 0
731- lx < c && throw_setindex_mismatch (X, c )
732- @inbounds x = convert (Bool, X[c ])
734+ Xi > lastXi && throw_setindex_mismatch (X, count (I) )
735+ @inbounds x = convert (Bool, X[Xi ])
733736 C = ifelse (x, C | u, C & ~ u)
734- c += 1
737+ Xi = nextind (X, Xi)
735738 end
736739 u <<= 1
737740 end
738741 @inbounds Bc[i] = C
739742 end
740- if length (X) != c - 1
741- throw_setindex_mismatch (X, c - 1 )
743+ if Xi != nextind (X, lastXi)
744+ throw_setindex_mismatch (X, count (I) )
742745 end
743746 return B
744747end
0 commit comments