// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package bitutils

import 

// GenerateBits writes sequential bits to a bitmap. Bits preceding the
// initial start offset are preserved, bits following the bitmap may
// get clobbered.
func ( []byte, ,  int64,  func() bool) {
	if  == 0 {
		return
	}

	 := [/8:]
	 := bitutil.BitMask[%8]
	 := [0] & bitutil.PrecedingBitmask[%8]

	for  := int64(0);  < ; ++ {
		 := ()
		if  {
			 =  | 
		}
		 <<= 1
		if  == 0 {
			 = 1
			[0] = 
			 = [1:]
			 = 0
		}
	}

	if  != 1 {
		[0] = 
	}
}

// GenerateBitsUnrolled is like GenerateBits but unrolls its main loop for
// higher performance.
//
// See the benchmarks for evidence.
func ( []byte, ,  int64,  func() bool) {
	if  == 0 {
		return
	}

	var (
		        byte
		            = [/8:]
		 = uint64( % 8)
		           = bitutil.BitMask[]
		      = 
	)

	if  != 0x01 {
		 = [0] & bitutil.PrecedingBitmask[]
		for  != 0 &&  > 0 {
			if () {
				 |= 
			}
			 <<= 1
			--
		}
		[0] = 
		 = [1:]
	}

	var  [8]byte
	for  :=  / 8;  > 0; -- {
		for  := 0;  < 8; ++ {
			if () {
				[] = 1
			} else {
				[] = 0
			}
		}
		[0] = ([0] | [1]<<1 | [2]<<2 |
			[3]<<3 | [4]<<4 | [5]<<5 |
			[6]<<6 | [7]<<7)
		 = [1:]
	}

	 :=  % 8
	if  > 0 {
		 = 0
		 = 0x01
		for ;  > 0; -- {
			if () {
				 |= 
			}
			 <<= 1
		}
		[0] = 
	}
}