package pgtype

import (
	
	
	

	
)

type Varbit struct {
	Bytes  []byte
	Len    int32 // Number of bits
	Status Status
}

func ( *Varbit) ( interface{}) error {
	return fmt.Errorf("cannot convert %v to Varbit", )
}

func ( Varbit) () interface{} {
	switch .Status {
	case Present:
		return 
	case Null:
		return nil
	default:
		return .Status
	}
}

func ( *Varbit) ( interface{}) error {
	return fmt.Errorf("cannot assign %v to %T", , )
}

func ( *Varbit) ( *ConnInfo,  []byte) error {
	if  == nil {
		* = Varbit{Status: Null}
		return nil
	}

	 := len()
	 :=  / 8
	if %8 > 0 {
		++
	}
	 := make([]byte, )

	for ,  := range  {
		if  == '1' {
			 :=  / 8
			 := uint( % 8)
			[] = [] | (128 >> )
		}
	}

	* = Varbit{Bytes: , Len: int32(), Status: Present}
	return nil
}

func ( *Varbit) ( *ConnInfo,  []byte) error {
	if  == nil {
		* = Varbit{Status: Null}
		return nil
	}

	if len() < 4 {
		return fmt.Errorf("invalid length for varbit: %v", len())
	}

	 := int32(binary.BigEndian.Uint32())
	 := 4

	* = Varbit{Bytes: [:], Len: , Status: Present}
	return nil
}

func ( Varbit) ( *ConnInfo,  []byte) ([]byte, error) {
	switch .Status {
	case Null:
		return nil, nil
	case Undefined:
		return nil, errUndefined
	}

	for  := int32(0);  < .Len; ++ {
		 :=  / 8
		 := byte(128 >> byte(%8))
		 := byte('0')
		if .Bytes[]& > 0 {
			 = '1'
		}
		 = append(, )
	}

	return , nil
}

func ( Varbit) ( *ConnInfo,  []byte) ([]byte, error) {
	switch .Status {
	case Null:
		return nil, nil
	case Undefined:
		return nil, errUndefined
	}

	 = pgio.AppendInt32(, .Len)
	return append(, .Bytes...), nil
}
Scan implements the database/sql Scanner interface.
func ( *Varbit) ( interface{}) error {
	if  == nil {
		* = Varbit{Status: Null}
		return nil
	}

	switch src := .(type) {
	case string:
		return .DecodeText(nil, []byte())
	case []byte:
		 := make([]byte, len())
		copy(, )
		return .DecodeText(nil, )
	}

	return fmt.Errorf("cannot scan %T", )
}
Value implements the database/sql/driver Valuer interface.
func ( Varbit) () (driver.Value, error) {
	return EncodeValueText()