// 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 array

import (
	
	
	

	
	
	
	
)

// A type which represents an immutable sequence of boolean values.
type Boolean struct {
	array
	values []byte
}

// NewBoolean creates a boolean array from the data memory.Buffer and contains length elements.
// The nullBitmap buffer can be nil of there are no null values.
// If nulls is not known, use UnknownNullCount to calculate the value of NullN at runtime from the nullBitmap buffer.
func ( int,  *memory.Buffer,  *memory.Buffer,  int) *Boolean {
	 := NewData(arrow.FixedWidthTypes.Boolean, , []*memory.Buffer{, }, nil, , 0)
	defer .Release()
	return NewBooleanData()
}

func ( arrow.ArrayData) *Boolean {
	 := &Boolean{}
	.refCount.Add(1)
	.setData(.(*Data))
	return 
}

func ( *Boolean) ( int) bool {
	if  < 0 ||  >= .data.length {
		panic("arrow/array: index out of range")
	}
	return bitutil.BitIsSet(.values, .data.offset+)
}

func ( *Boolean) ( int) string {
	if .IsNull() {
		return NullValueStr
	} else {
		return strconv.FormatBool(.Value())
	}
}

func ( *Boolean) () string {
	 := new(strings.Builder)
	.WriteString("[")
	for  := 0;  < .Len(); ++ {
		if  > 0 {
			fmt.Fprintf(, " ")
		}
		switch {
		case .IsNull():
			.WriteString(NullValueStr)
		default:
			fmt.Fprintf(, "%v", .Value())
		}
	}
	.WriteString("]")
	return .String()
}

func ( *Boolean) ( *Data) {
	.array.setData()
	 := .buffers[1]
	if  != nil {
		.values = .Bytes()
	}
}

func ( *Boolean) ( int) interface{} {
	if .IsValid() {
		return .Value()
	}
	return nil
}

func ( *Boolean) () ([]byte, error) {
	 := make([]interface{}, .Len())
	for  := 0;  < .Len(); ++ {
		if .IsValid() {
			[] = .Value()
		} else {
			[] = nil
		}
	}
	return json.Marshal()
}

func arrayEqualBoolean(,  *Boolean) bool {
	for  := 0;  < .Len(); ++ {
		if .IsNull() {
			continue
		}
		if .Value() != .Value() {
			return false
		}
	}
	return true
}

var (
	_ arrow.Array            = (*Boolean)(nil)
	_ arrow.TypedArray[bool] = (*Boolean)(nil)
)