// 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 Float16 values.
type Float16 struct {
	array
	values []float16.Num
}

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

func ( *Float16) ( int) float16.Num { return .values[] }
func ( *Float16) ( int) string {
	if .IsNull() {
		return NullValueStr
	}
	return .Value().String()
}

func ( *Float16) () []float16.Num { return .values }

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

func ( *Float16) ( *Data) {
	.array.setData()
	 := .buffers[1]
	if  != nil {
		.values = arrow.Float16Traits.CastFromBytes(.Bytes())
		 := .data.offset
		 :=  + .data.length
		.values = .values[:]
	}
}

func ( *Float16) ( int) interface{} {
	if .IsValid() {
		return .values[].Float32()
	}
	return nil
}

func ( *Float16) () ([]byte, error) {
	 := make([]interface{}, .Len())
	for ,  := range .values {
		if !.IsValid() {
			[] = nil
			continue
		}

		switch {
		case .IsNaN():
			[] = "NaN"
		case .IsInf() && !.Signbit():
			[] = "+Inf"
		case .IsInf() && .Signbit():
			[] = "-Inf"
		default:
			[] = .Float32()
		}
	}
	return json.Marshal()
}

var (
	_ arrow.Array                   = (*Float16)(nil)
	_ arrow.TypedArray[float16.Num] = (*Float16)(nil)
)