package jsoniter

import (
	
	
	
	
)

type Number string

// String returns the literal text of the number.
func ( Number) () string { return string() }

// Float64 returns the number as a float64.
func ( Number) () (float64, error) {
	return strconv.ParseFloat(string(), 64)
}

// Int64 returns the number as an int64.
func ( Number) () (int64, error) {
	return strconv.ParseInt(string(), 10, 64)
}

func ( interface{}) (string, bool) {
	switch typedVal := .(type) {
	case json.Number:
		return string(), true
	case Number:
		return string(), true
	}
	return "", false
}

var jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem()
var jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem()

func createDecoderOfJsonNumber( *ctx,  reflect2.Type) ValDecoder {
	if .AssignableTo(jsonNumberType) {
		return &jsonNumberCodec{}
	}
	if .AssignableTo(jsoniterNumberType) {
		return &jsoniterNumberCodec{}
	}
	return nil
}

func createEncoderOfJsonNumber( *ctx,  reflect2.Type) ValEncoder {
	if .AssignableTo(jsonNumberType) {
		return &jsonNumberCodec{}
	}
	if .AssignableTo(jsoniterNumberType) {
		return &jsoniterNumberCodec{}
	}
	return nil
}

type jsonNumberCodec struct {
}

func ( *jsonNumberCodec) ( unsafe.Pointer,  *Iterator) {
	switch .WhatIsNext() {
	case StringValue:
		*((*json.Number)()) = json.Number(.ReadString())
	case NilValue:
		.skipFourBytes('n', 'u', 'l', 'l')
		*((*json.Number)()) = ""
	default:
		*((*json.Number)()) = json.Number([]byte(.readNumberAsString()))
	}
}

func ( *jsonNumberCodec) ( unsafe.Pointer,  *Stream) {
	 := *((*json.Number)())
	if len() == 0 {
		.writeByte('0')
	} else {
		.WriteRaw(string())
	}
}

func ( *jsonNumberCodec) ( unsafe.Pointer) bool {
	return len(*((*json.Number)())) == 0
}

type jsoniterNumberCodec struct {
}

func ( *jsoniterNumberCodec) ( unsafe.Pointer,  *Iterator) {
	switch .WhatIsNext() {
	case StringValue:
		*((*Number)()) = Number(.ReadString())
	case NilValue:
		.skipFourBytes('n', 'u', 'l', 'l')
		*((*Number)()) = ""
	default:
		*((*Number)()) = Number([]byte(.readNumberAsString()))
	}
}

func ( *jsoniterNumberCodec) ( unsafe.Pointer,  *Stream) {
	 := *((*Number)())
	if len() == 0 {
		.writeByte('0')
	} else {
		.WriteRaw(string())
	}
}

func ( *jsoniterNumberCodec) ( unsafe.Pointer) bool {
	return len(*((*Number)())) == 0
}