package decoder

import (
	
	
	

	
)

type numberDecoder struct {
	stringDecoder *stringDecoder
	op            func(unsafe.Pointer, json.Number)
	structName    string
	fieldName     string
}

func newNumberDecoder(,  string,  func(unsafe.Pointer, json.Number)) *numberDecoder {
	return &numberDecoder{
		stringDecoder: newStringDecoder(, ),
		op:            ,
		structName:    ,
		fieldName:     ,
	}
}

func ( *numberDecoder) ( *Stream,  int64,  unsafe.Pointer) error {
	,  := .decodeStreamByte()
	if  != nil {
		return 
	}
	if ,  := strconv.ParseFloat(*(*string)(unsafe.Pointer(&)), 64);  != nil {
		return errors.ErrSyntax(.Error(), .totalOffset())
	}
	.op(, json.Number(string()))
	.reset()
	return nil
}

func ( *numberDecoder) ( *RuntimeContext, ,  int64,  unsafe.Pointer) (int64, error) {
	, ,  := .decodeByte(.Buf, )
	if  != nil {
		return 0, 
	}
	if ,  := strconv.ParseFloat(*(*string)(unsafe.Pointer(&)), 64);  != nil {
		return 0, errors.ErrSyntax(.Error(), )
	}
	 = 
	 := *(*string)(unsafe.Pointer(&))
	.op(, json.Number())
	return , nil
}

func ( *numberDecoder) ( *RuntimeContext, ,  int64) ([][]byte, int64, error) {
	, ,  := .decodeByte(.Buf, )
	if  != nil {
		return nil, 0, 
	}
	if  == nil {
		return [][]byte{nullbytes}, , nil
	}
	return [][]byte{}, , nil
}

func ( *numberDecoder) ( *Stream) ([]byte, error) {
	 := .cursor
	for {
		switch .char() {
		case ' ', '\n', '\t', '\r':
			.cursor++
			continue
		case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
			return floatBytes(), nil
		case 'n':
			if  := nullBytes();  != nil {
				return nil, 
			}
			return nil, nil
		case '"':
			return .stringDecoder.decodeStreamByte()
		case nul:
			if .read() {
				continue
			}
			goto 
		default:
			goto 
		}
	}
:
	if .cursor ==  {
		return nil, errors.ErrInvalidBeginningOfValue(.char(), .totalOffset())
	}
	return nil, errors.ErrUnexpectedEndOfJSON("json.Number", .totalOffset())
}

func ( *numberDecoder) ( []byte,  int64) ([]byte, int64, error) {
	for {
		switch [] {
		case ' ', '\n', '\t', '\r':
			++
			continue
		case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
			 := 
			++
			for floatTable[[]] {
				++
			}
			 := [:]
			return , , nil
		case 'n':
			if  := validateNull(, );  != nil {
				return nil, 0, 
			}
			 += 4
			return nil, , nil
		case '"':
			return .stringDecoder.decodeByte(, )
		default:
			return nil, 0, errors.ErrUnexpectedEndOfJSON("json.Number", )
		}
	}
}