[
  {
    "path": ".codecov.yml",
    "content": "ignore:\n    - \"output_tests/.*\"\n\n"
  },
  {
    "path": ".gitignore",
    "content": "/vendor\n/bug_test.go\n/coverage.txt\n/.idea\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: go\n\ngo:\n  - 1.8.x\n  - 1.x\n\nbefore_install:\n  - go get -t -v ./...\n\nscript:\n  - ./test.sh\n\nafter_success:\n  - bash <(curl -s https://codecov.io/bash)\n"
  },
  {
    "path": "Gopkg.toml",
    "content": "# Gopkg.toml example\n#\n# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md\n# for detailed Gopkg.toml documentation.\n#\n# required = [\"github.com/user/thing/cmd/thing\"]\n# ignored = [\"github.com/user/project/pkgX\", \"bitbucket.org/user/project/pkgA/pkgY\"]\n#\n# [[constraint]]\n#   name = \"github.com/user/project\"\n#   version = \"1.0.0\"\n#\n# [[constraint]]\n#   name = \"github.com/user/project2\"\n#   branch = \"dev\"\n#   source = \"github.com/myfork/project2\"\n#\n# [[override]]\n#  name = \"github.com/x/y\"\n#  version = \"2.4.0\"\n\nignored = [\"github.com/davecgh/go-spew*\",\"github.com/google/gofuzz*\",\"github.com/stretchr/testify*\"]\n\n[[constraint]]\n  name = \"github.com/modern-go/reflect2\"\n  version = \"1.0.1\"\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2016 json-iterator\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "[![Sourcegraph](https://sourcegraph.com/github.com/json-iterator/go/-/badge.svg)](https://sourcegraph.com/github.com/json-iterator/go?badge)\n[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://pkg.go.dev/github.com/json-iterator/go)\n[![Build Status](https://travis-ci.org/json-iterator/go.svg?branch=master)](https://travis-ci.org/json-iterator/go)\n[![codecov](https://codecov.io/gh/json-iterator/go/branch/master/graph/badge.svg)](https://codecov.io/gh/json-iterator/go)\n[![rcard](https://goreportcard.com/badge/github.com/json-iterator/go)](https://goreportcard.com/report/github.com/json-iterator/go)\n[![License](http://img.shields.io/badge/license-mit-blue.svg?style=flat-square)](https://raw.githubusercontent.com/json-iterator/go/master/LICENSE)\n[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby)\n\nA high-performance 100% compatible drop-in replacement of \"encoding/json\"\n\n# Benchmark\n\n![benchmark](http://jsoniter.com/benchmarks/go-benchmark.png)\n\nSource code: https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go\n\nRaw Result (easyjson requires static code generation)\n\n|                 | ns/op       | allocation bytes | allocation times |\n| --------------- | ----------- | ---------------- | ---------------- |\n| std decode      | 35510 ns/op | 1960 B/op        | 99 allocs/op     |\n| easyjson decode | 8499 ns/op  | 160 B/op         | 4 allocs/op      |\n| jsoniter decode | 5623 ns/op  | 160 B/op         | 3 allocs/op      |\n| std encode      | 2213 ns/op  | 712 B/op         | 5 allocs/op      |\n| easyjson encode | 883 ns/op   | 576 B/op         | 3 allocs/op      |\n| jsoniter encode | 837 ns/op   | 384 B/op         | 4 allocs/op      |\n\nAlways benchmark with your own workload.\nThe result depends heavily on the data input.\n\n# Usage\n\n100% compatibility with standard lib\n\nReplace\n\n```go\nimport \"encoding/json\"\njson.Marshal(&data)\n```\n\nwith\n\n```go\nimport jsoniter \"github.com/json-iterator/go\"\n\nvar json = jsoniter.ConfigCompatibleWithStandardLibrary\njson.Marshal(&data)\n```\n\nReplace\n\n```go\nimport \"encoding/json\"\njson.Unmarshal(input, &data)\n```\n\nwith\n\n```go\nimport jsoniter \"github.com/json-iterator/go\"\n\nvar json = jsoniter.ConfigCompatibleWithStandardLibrary\njson.Unmarshal(input, &data)\n```\n\n[More documentation](http://jsoniter.com/migrate-from-go-std.html)\n\n# How to get\n\n```\ngo get github.com/json-iterator/go\n```\n\n# Contribution Welcomed !\n\nContributors\n\n- [thockin](https://github.com/thockin)\n- [mattn](https://github.com/mattn)\n- [cch123](https://github.com/cch123)\n- [Oleg Shaldybin](https://github.com/olegshaldybin)\n- [Jason Toffaletti](https://github.com/toffaletti)\n\nReport issue or pull request, or email taowen@gmail.com, or [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby)\n"
  },
  {
    "path": "adapter.go",
    "content": "package jsoniter\n\nimport (\n\t\"bytes\"\n\t\"io\"\n)\n\n// RawMessage to make replace json with jsoniter\ntype RawMessage []byte\n\n// Unmarshal adapts to json/encoding Unmarshal API\n//\n// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v.\n// Refer to https://godoc.org/encoding/json#Unmarshal for more information\nfunc Unmarshal(data []byte, v interface{}) error {\n\treturn ConfigDefault.Unmarshal(data, v)\n}\n\n// UnmarshalFromString is a convenient method to read from string instead of []byte\nfunc UnmarshalFromString(str string, v interface{}) error {\n\treturn ConfigDefault.UnmarshalFromString(str, v)\n}\n\n// Get quick method to get value from deeply nested JSON structure\nfunc Get(data []byte, path ...interface{}) Any {\n\treturn ConfigDefault.Get(data, path...)\n}\n\n// Marshal adapts to json/encoding Marshal API\n//\n// Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API\n// Refer to https://godoc.org/encoding/json#Marshal for more information\nfunc Marshal(v interface{}) ([]byte, error) {\n\treturn ConfigDefault.Marshal(v)\n}\n\n// MarshalIndent same as json.MarshalIndent. Prefix is not supported.\nfunc MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {\n\treturn ConfigDefault.MarshalIndent(v, prefix, indent)\n}\n\n// MarshalToString convenient method to write as string instead of []byte\nfunc MarshalToString(v interface{}) (string, error) {\n\treturn ConfigDefault.MarshalToString(v)\n}\n\n// NewDecoder adapts to json/stream NewDecoder API.\n//\n// NewDecoder returns a new decoder that reads from r.\n//\n// Instead of a json/encoding Decoder, an Decoder is returned\n// Refer to https://godoc.org/encoding/json#NewDecoder for more information\nfunc NewDecoder(reader io.Reader) *Decoder {\n\treturn ConfigDefault.NewDecoder(reader)\n}\n\n// Decoder reads and decodes JSON values from an input stream.\n// Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress)\ntype Decoder struct {\n\titer *Iterator\n}\n\n// Decode decode JSON into interface{}\nfunc (adapter *Decoder) Decode(obj interface{}) error {\n\tif adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil {\n\t\tif !adapter.iter.loadMore() {\n\t\t\treturn io.EOF\n\t\t}\n\t}\n\tadapter.iter.ReadVal(obj)\n\terr := adapter.iter.Error\n\tif err == io.EOF {\n\t\treturn nil\n\t}\n\treturn adapter.iter.Error\n}\n\n// More is there more?\nfunc (adapter *Decoder) More() bool {\n\titer := adapter.iter\n\tif iter.Error != nil {\n\t\treturn false\n\t}\n\tc := iter.nextToken()\n\tif c == 0 {\n\t\treturn false\n\t}\n\titer.unreadByte()\n\treturn c != ']' && c != '}'\n}\n\n// Buffered remaining buffer\nfunc (adapter *Decoder) Buffered() io.Reader {\n\tremaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail]\n\treturn bytes.NewReader(remaining)\n}\n\n// UseNumber causes the Decoder to unmarshal a number into an interface{} as a\n// Number instead of as a float64.\nfunc (adapter *Decoder) UseNumber() {\n\tcfg := adapter.iter.cfg.configBeforeFrozen\n\tcfg.UseNumber = true\n\tadapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)\n}\n\n// DisallowUnknownFields causes the Decoder to return an error when the destination\n// is a struct and the input contains object keys which do not match any\n// non-ignored, exported fields in the destination.\nfunc (adapter *Decoder) DisallowUnknownFields() {\n\tcfg := adapter.iter.cfg.configBeforeFrozen\n\tcfg.DisallowUnknownFields = true\n\tadapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)\n}\n\n// NewEncoder same as json.NewEncoder\nfunc NewEncoder(writer io.Writer) *Encoder {\n\treturn ConfigDefault.NewEncoder(writer)\n}\n\n// Encoder same as json.Encoder\ntype Encoder struct {\n\tstream *Stream\n}\n\n// Encode encode interface{} as JSON to io.Writer\nfunc (adapter *Encoder) Encode(val interface{}) error {\n\tadapter.stream.WriteVal(val)\n\tadapter.stream.WriteRaw(\"\\n\")\n\tadapter.stream.Flush()\n\treturn adapter.stream.Error\n}\n\n// SetIndent set the indention. Prefix is not supported\nfunc (adapter *Encoder) SetIndent(prefix, indent string) {\n\tconfig := adapter.stream.cfg.configBeforeFrozen\n\tconfig.IndentionStep = len(indent)\n\tadapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)\n}\n\n// SetEscapeHTML escape html by default, set to false to disable\nfunc (adapter *Encoder) SetEscapeHTML(escapeHTML bool) {\n\tconfig := adapter.stream.cfg.configBeforeFrozen\n\tconfig.EscapeHTML = escapeHTML\n\tadapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)\n}\n\n// Valid reports whether data is a valid JSON encoding.\nfunc Valid(data []byte) bool {\n\treturn ConfigDefault.Valid(data)\n}\n"
  },
  {
    "path": "any.go",
    "content": "package jsoniter\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/modern-go/reflect2\"\n\t\"io\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"unsafe\"\n)\n\n// Any generic object representation.\n// The lazy json implementation holds []byte and parse lazily.\ntype Any interface {\n\tLastError() error\n\tValueType() ValueType\n\tMustBeValid() Any\n\tToBool() bool\n\tToInt() int\n\tToInt32() int32\n\tToInt64() int64\n\tToUint() uint\n\tToUint32() uint32\n\tToUint64() uint64\n\tToFloat32() float32\n\tToFloat64() float64\n\tToString() string\n\tToVal(val interface{})\n\tGet(path ...interface{}) Any\n\tSize() int\n\tKeys() []string\n\tGetInterface() interface{}\n\tWriteTo(stream *Stream)\n}\n\ntype baseAny struct{}\n\nfunc (any *baseAny) Get(path ...interface{}) Any {\n\treturn &invalidAny{baseAny{}, fmt.Errorf(\"GetIndex %v from simple value\", path)}\n}\n\nfunc (any *baseAny) Size() int {\n\treturn 0\n}\n\nfunc (any *baseAny) Keys() []string {\n\treturn []string{}\n}\n\nfunc (any *baseAny) ToVal(obj interface{}) {\n\tpanic(\"not implemented\")\n}\n\n// WrapInt32 turn int32 into Any interface\nfunc WrapInt32(val int32) Any {\n\treturn &int32Any{baseAny{}, val}\n}\n\n// WrapInt64 turn int64 into Any interface\nfunc WrapInt64(val int64) Any {\n\treturn &int64Any{baseAny{}, val}\n}\n\n// WrapUint32 turn uint32 into Any interface\nfunc WrapUint32(val uint32) Any {\n\treturn &uint32Any{baseAny{}, val}\n}\n\n// WrapUint64 turn uint64 into Any interface\nfunc WrapUint64(val uint64) Any {\n\treturn &uint64Any{baseAny{}, val}\n}\n\n// WrapFloat64 turn float64 into Any interface\nfunc WrapFloat64(val float64) Any {\n\treturn &floatAny{baseAny{}, val}\n}\n\n// WrapString turn string into Any interface\nfunc WrapString(val string) Any {\n\treturn &stringAny{baseAny{}, val}\n}\n\n// Wrap turn a go object into Any interface\nfunc Wrap(val interface{}) Any {\n\tif val == nil {\n\t\treturn &nilAny{}\n\t}\n\tasAny, isAny := val.(Any)\n\tif isAny {\n\t\treturn asAny\n\t}\n\ttyp := reflect2.TypeOf(val)\n\tswitch typ.Kind() {\n\tcase reflect.Slice:\n\t\treturn wrapArray(val)\n\tcase reflect.Struct:\n\t\treturn wrapStruct(val)\n\tcase reflect.Map:\n\t\treturn wrapMap(val)\n\tcase reflect.String:\n\t\treturn WrapString(val.(string))\n\tcase reflect.Int:\n\t\tif strconv.IntSize == 32 {\n\t\t\treturn WrapInt32(int32(val.(int)))\n\t\t}\n\t\treturn WrapInt64(int64(val.(int)))\n\tcase reflect.Int8:\n\t\treturn WrapInt32(int32(val.(int8)))\n\tcase reflect.Int16:\n\t\treturn WrapInt32(int32(val.(int16)))\n\tcase reflect.Int32:\n\t\treturn WrapInt32(val.(int32))\n\tcase reflect.Int64:\n\t\treturn WrapInt64(val.(int64))\n\tcase reflect.Uint:\n\t\tif strconv.IntSize == 32 {\n\t\t\treturn WrapUint32(uint32(val.(uint)))\n\t\t}\n\t\treturn WrapUint64(uint64(val.(uint)))\n\tcase reflect.Uintptr:\n\t\tif ptrSize == 32 {\n\t\t\treturn WrapUint32(uint32(val.(uintptr)))\n\t\t}\n\t\treturn WrapUint64(uint64(val.(uintptr)))\n\tcase reflect.Uint8:\n\t\treturn WrapUint32(uint32(val.(uint8)))\n\tcase reflect.Uint16:\n\t\treturn WrapUint32(uint32(val.(uint16)))\n\tcase reflect.Uint32:\n\t\treturn WrapUint32(uint32(val.(uint32)))\n\tcase reflect.Uint64:\n\t\treturn WrapUint64(val.(uint64))\n\tcase reflect.Float32:\n\t\treturn WrapFloat64(float64(val.(float32)))\n\tcase reflect.Float64:\n\t\treturn WrapFloat64(val.(float64))\n\tcase reflect.Bool:\n\t\tif val.(bool) == true {\n\t\t\treturn &trueAny{}\n\t\t}\n\t\treturn &falseAny{}\n\t}\n\treturn &invalidAny{baseAny{}, fmt.Errorf(\"unsupported type: %v\", typ)}\n}\n\n// ReadAny read next JSON element as an Any object. It is a better json.RawMessage.\nfunc (iter *Iterator) ReadAny() Any {\n\treturn iter.readAny()\n}\n\nfunc (iter *Iterator) readAny() Any {\n\tc := iter.nextToken()\n\tswitch c {\n\tcase '\"':\n\t\titer.unreadByte()\n\t\treturn &stringAny{baseAny{}, iter.ReadString()}\n\tcase 'n':\n\t\titer.skipThreeBytes('u', 'l', 'l') // null\n\t\treturn &nilAny{}\n\tcase 't':\n\t\titer.skipThreeBytes('r', 'u', 'e') // true\n\t\treturn &trueAny{}\n\tcase 'f':\n\t\titer.skipFourBytes('a', 'l', 's', 'e') // false\n\t\treturn &falseAny{}\n\tcase '{':\n\t\treturn iter.readObjectAny()\n\tcase '[':\n\t\treturn iter.readArrayAny()\n\tcase '-':\n\t\treturn iter.readNumberAny(false)\n\tcase 0:\n\t\treturn &invalidAny{baseAny{}, errors.New(\"input is empty\")}\n\tdefault:\n\t\treturn iter.readNumberAny(true)\n\t}\n}\n\nfunc (iter *Iterator) readNumberAny(positive bool) Any {\n\titer.startCapture(iter.head - 1)\n\titer.skipNumber()\n\tlazyBuf := iter.stopCapture()\n\treturn &numberLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}\n}\n\nfunc (iter *Iterator) readObjectAny() Any {\n\titer.startCapture(iter.head - 1)\n\titer.skipObject()\n\tlazyBuf := iter.stopCapture()\n\treturn &objectLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}\n}\n\nfunc (iter *Iterator) readArrayAny() Any {\n\titer.startCapture(iter.head - 1)\n\titer.skipArray()\n\tlazyBuf := iter.stopCapture()\n\treturn &arrayLazyAny{baseAny{}, iter.cfg, lazyBuf, nil}\n}\n\nfunc locateObjectField(iter *Iterator, target string) []byte {\n\tvar found []byte\n\titer.ReadObjectCB(func(iter *Iterator, field string) bool {\n\t\tif field == target {\n\t\t\tfound = iter.SkipAndReturnBytes()\n\t\t\treturn false\n\t\t}\n\t\titer.Skip()\n\t\treturn true\n\t})\n\treturn found\n}\n\nfunc locateArrayElement(iter *Iterator, target int) []byte {\n\tvar found []byte\n\tn := 0\n\titer.ReadArrayCB(func(iter *Iterator) bool {\n\t\tif n == target {\n\t\t\tfound = iter.SkipAndReturnBytes()\n\t\t\treturn false\n\t\t}\n\t\titer.Skip()\n\t\tn++\n\t\treturn true\n\t})\n\treturn found\n}\n\nfunc locatePath(iter *Iterator, path []interface{}) Any {\n\tfor i, pathKeyObj := range path {\n\t\tswitch pathKey := pathKeyObj.(type) {\n\t\tcase string:\n\t\t\tvalueBytes := locateObjectField(iter, pathKey)\n\t\t\tif valueBytes == nil {\n\t\t\t\treturn newInvalidAny(path[i:])\n\t\t\t}\n\t\t\titer.ResetBytes(valueBytes)\n\t\tcase int:\n\t\t\tvalueBytes := locateArrayElement(iter, pathKey)\n\t\t\tif valueBytes == nil {\n\t\t\t\treturn newInvalidAny(path[i:])\n\t\t\t}\n\t\t\titer.ResetBytes(valueBytes)\n\t\tcase int32:\n\t\t\tif '*' == pathKey {\n\t\t\t\treturn iter.readAny().Get(path[i:]...)\n\t\t\t}\n\t\t\treturn newInvalidAny(path[i:])\n\t\tdefault:\n\t\t\treturn newInvalidAny(path[i:])\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\treturn &invalidAny{baseAny{}, iter.Error}\n\t}\n\treturn iter.readAny()\n}\n\nvar anyType = reflect2.TypeOfPtr((*Any)(nil)).Elem()\n\nfunc createDecoderOfAny(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tif typ == anyType {\n\t\treturn &directAnyCodec{}\n\t}\n\tif typ.Implements(anyType) {\n\t\treturn &anyCodec{\n\t\t\tvalType: typ,\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc createEncoderOfAny(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tif typ == anyType {\n\t\treturn &directAnyCodec{}\n\t}\n\tif typ.Implements(anyType) {\n\t\treturn &anyCodec{\n\t\t\tvalType: typ,\n\t\t}\n\t}\n\treturn nil\n}\n\ntype anyCodec struct {\n\tvalType reflect2.Type\n}\n\nfunc (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tpanic(\"not implemented\")\n}\n\nfunc (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tobj := codec.valType.UnsafeIndirect(ptr)\n\tany := obj.(Any)\n\tany.WriteTo(stream)\n}\n\nfunc (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\tobj := codec.valType.UnsafeIndirect(ptr)\n\tany := obj.(Any)\n\treturn any.Size() == 0\n}\n\ntype directAnyCodec struct {\n}\n\nfunc (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\t*(*Any)(ptr) = iter.readAny()\n}\n\nfunc (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tany := *(*Any)(ptr)\n\tif any == nil {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tany.WriteTo(stream)\n}\n\nfunc (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\tany := *(*Any)(ptr)\n\treturn any.Size() == 0\n}\n"
  },
  {
    "path": "any_array.go",
    "content": "package jsoniter\n\nimport (\n\t\"reflect\"\n\t\"unsafe\"\n)\n\ntype arrayLazyAny struct {\n\tbaseAny\n\tcfg *frozenConfig\n\tbuf []byte\n\terr error\n}\n\nfunc (any *arrayLazyAny) ValueType() ValueType {\n\treturn ArrayValue\n}\n\nfunc (any *arrayLazyAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *arrayLazyAny) LastError() error {\n\treturn any.err\n}\n\nfunc (any *arrayLazyAny) ToBool() bool {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\treturn iter.ReadArray()\n}\n\nfunc (any *arrayLazyAny) ToInt() int {\n\tif any.ToBool() {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (any *arrayLazyAny) ToInt32() int32 {\n\tif any.ToBool() {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (any *arrayLazyAny) ToInt64() int64 {\n\tif any.ToBool() {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (any *arrayLazyAny) ToUint() uint {\n\tif any.ToBool() {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (any *arrayLazyAny) ToUint32() uint32 {\n\tif any.ToBool() {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (any *arrayLazyAny) ToUint64() uint64 {\n\tif any.ToBool() {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (any *arrayLazyAny) ToFloat32() float32 {\n\tif any.ToBool() {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (any *arrayLazyAny) ToFloat64() float64 {\n\tif any.ToBool() {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (any *arrayLazyAny) ToString() string {\n\treturn *(*string)(unsafe.Pointer(&any.buf))\n}\n\nfunc (any *arrayLazyAny) ToVal(val interface{}) {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\titer.ReadVal(val)\n}\n\nfunc (any *arrayLazyAny) Get(path ...interface{}) Any {\n\tif len(path) == 0 {\n\t\treturn any\n\t}\n\tswitch firstPath := path[0].(type) {\n\tcase int:\n\t\titer := any.cfg.BorrowIterator(any.buf)\n\t\tdefer any.cfg.ReturnIterator(iter)\n\t\tvalueBytes := locateArrayElement(iter, firstPath)\n\t\tif valueBytes == nil {\n\t\t\treturn newInvalidAny(path)\n\t\t}\n\t\titer.ResetBytes(valueBytes)\n\t\treturn locatePath(iter, path[1:])\n\tcase int32:\n\t\tif '*' == firstPath {\n\t\t\titer := any.cfg.BorrowIterator(any.buf)\n\t\t\tdefer any.cfg.ReturnIterator(iter)\n\t\t\tarr := make([]Any, 0)\n\t\t\titer.ReadArrayCB(func(iter *Iterator) bool {\n\t\t\t\tfound := iter.readAny().Get(path[1:]...)\n\t\t\t\tif found.ValueType() != InvalidValue {\n\t\t\t\t\tarr = append(arr, found)\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t\treturn wrapArray(arr)\n\t\t}\n\t\treturn newInvalidAny(path)\n\tdefault:\n\t\treturn newInvalidAny(path)\n\t}\n}\n\nfunc (any *arrayLazyAny) Size() int {\n\tsize := 0\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\titer.ReadArrayCB(func(iter *Iterator) bool {\n\t\tsize++\n\t\titer.Skip()\n\t\treturn true\n\t})\n\treturn size\n}\n\nfunc (any *arrayLazyAny) WriteTo(stream *Stream) {\n\tstream.Write(any.buf)\n}\n\nfunc (any *arrayLazyAny) GetInterface() interface{} {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\treturn iter.Read()\n}\n\ntype arrayAny struct {\n\tbaseAny\n\tval reflect.Value\n}\n\nfunc wrapArray(val interface{}) *arrayAny {\n\treturn &arrayAny{baseAny{}, reflect.ValueOf(val)}\n}\n\nfunc (any *arrayAny) ValueType() ValueType {\n\treturn ArrayValue\n}\n\nfunc (any *arrayAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *arrayAny) LastError() error {\n\treturn nil\n}\n\nfunc (any *arrayAny) ToBool() bool {\n\treturn any.val.Len() != 0\n}\n\nfunc (any *arrayAny) ToInt() int {\n\tif any.val.Len() == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (any *arrayAny) ToInt32() int32 {\n\tif any.val.Len() == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (any *arrayAny) ToInt64() int64 {\n\tif any.val.Len() == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (any *arrayAny) ToUint() uint {\n\tif any.val.Len() == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (any *arrayAny) ToUint32() uint32 {\n\tif any.val.Len() == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (any *arrayAny) ToUint64() uint64 {\n\tif any.val.Len() == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (any *arrayAny) ToFloat32() float32 {\n\tif any.val.Len() == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (any *arrayAny) ToFloat64() float64 {\n\tif any.val.Len() == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (any *arrayAny) ToString() string {\n\tstr, _ := MarshalToString(any.val.Interface())\n\treturn str\n}\n\nfunc (any *arrayAny) Get(path ...interface{}) Any {\n\tif len(path) == 0 {\n\t\treturn any\n\t}\n\tswitch firstPath := path[0].(type) {\n\tcase int:\n\t\tif firstPath < 0 || firstPath >= any.val.Len() {\n\t\t\treturn newInvalidAny(path)\n\t\t}\n\t\treturn Wrap(any.val.Index(firstPath).Interface())\n\tcase int32:\n\t\tif '*' == firstPath {\n\t\t\tmappedAll := make([]Any, 0)\n\t\t\tfor i := 0; i < any.val.Len(); i++ {\n\t\t\t\tmapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...)\n\t\t\t\tif mapped.ValueType() != InvalidValue {\n\t\t\t\t\tmappedAll = append(mappedAll, mapped)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn wrapArray(mappedAll)\n\t\t}\n\t\treturn newInvalidAny(path)\n\tdefault:\n\t\treturn newInvalidAny(path)\n\t}\n}\n\nfunc (any *arrayAny) Size() int {\n\treturn any.val.Len()\n}\n\nfunc (any *arrayAny) WriteTo(stream *Stream) {\n\tstream.WriteVal(any.val)\n}\n\nfunc (any *arrayAny) GetInterface() interface{} {\n\treturn any.val.Interface()\n}\n"
  },
  {
    "path": "any_bool.go",
    "content": "package jsoniter\n\ntype trueAny struct {\n\tbaseAny\n}\n\nfunc (any *trueAny) LastError() error {\n\treturn nil\n}\n\nfunc (any *trueAny) ToBool() bool {\n\treturn true\n}\n\nfunc (any *trueAny) ToInt() int {\n\treturn 1\n}\n\nfunc (any *trueAny) ToInt32() int32 {\n\treturn 1\n}\n\nfunc (any *trueAny) ToInt64() int64 {\n\treturn 1\n}\n\nfunc (any *trueAny) ToUint() uint {\n\treturn 1\n}\n\nfunc (any *trueAny) ToUint32() uint32 {\n\treturn 1\n}\n\nfunc (any *trueAny) ToUint64() uint64 {\n\treturn 1\n}\n\nfunc (any *trueAny) ToFloat32() float32 {\n\treturn 1\n}\n\nfunc (any *trueAny) ToFloat64() float64 {\n\treturn 1\n}\n\nfunc (any *trueAny) ToString() string {\n\treturn \"true\"\n}\n\nfunc (any *trueAny) WriteTo(stream *Stream) {\n\tstream.WriteTrue()\n}\n\nfunc (any *trueAny) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *trueAny) GetInterface() interface{} {\n\treturn true\n}\n\nfunc (any *trueAny) ValueType() ValueType {\n\treturn BoolValue\n}\n\nfunc (any *trueAny) MustBeValid() Any {\n\treturn any\n}\n\ntype falseAny struct {\n\tbaseAny\n}\n\nfunc (any *falseAny) LastError() error {\n\treturn nil\n}\n\nfunc (any *falseAny) ToBool() bool {\n\treturn false\n}\n\nfunc (any *falseAny) ToInt() int {\n\treturn 0\n}\n\nfunc (any *falseAny) ToInt32() int32 {\n\treturn 0\n}\n\nfunc (any *falseAny) ToInt64() int64 {\n\treturn 0\n}\n\nfunc (any *falseAny) ToUint() uint {\n\treturn 0\n}\n\nfunc (any *falseAny) ToUint32() uint32 {\n\treturn 0\n}\n\nfunc (any *falseAny) ToUint64() uint64 {\n\treturn 0\n}\n\nfunc (any *falseAny) ToFloat32() float32 {\n\treturn 0\n}\n\nfunc (any *falseAny) ToFloat64() float64 {\n\treturn 0\n}\n\nfunc (any *falseAny) ToString() string {\n\treturn \"false\"\n}\n\nfunc (any *falseAny) WriteTo(stream *Stream) {\n\tstream.WriteFalse()\n}\n\nfunc (any *falseAny) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *falseAny) GetInterface() interface{} {\n\treturn false\n}\n\nfunc (any *falseAny) ValueType() ValueType {\n\treturn BoolValue\n}\n\nfunc (any *falseAny) MustBeValid() Any {\n\treturn any\n}\n"
  },
  {
    "path": "any_float.go",
    "content": "package jsoniter\n\nimport (\n\t\"strconv\"\n)\n\ntype floatAny struct {\n\tbaseAny\n\tval float64\n}\n\nfunc (any *floatAny) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *floatAny) ValueType() ValueType {\n\treturn NumberValue\n}\n\nfunc (any *floatAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *floatAny) LastError() error {\n\treturn nil\n}\n\nfunc (any *floatAny) ToBool() bool {\n\treturn any.ToFloat64() != 0\n}\n\nfunc (any *floatAny) ToInt() int {\n\treturn int(any.val)\n}\n\nfunc (any *floatAny) ToInt32() int32 {\n\treturn int32(any.val)\n}\n\nfunc (any *floatAny) ToInt64() int64 {\n\treturn int64(any.val)\n}\n\nfunc (any *floatAny) ToUint() uint {\n\tif any.val > 0 {\n\t\treturn uint(any.val)\n\t}\n\treturn 0\n}\n\nfunc (any *floatAny) ToUint32() uint32 {\n\tif any.val > 0 {\n\t\treturn uint32(any.val)\n\t}\n\treturn 0\n}\n\nfunc (any *floatAny) ToUint64() uint64 {\n\tif any.val > 0 {\n\t\treturn uint64(any.val)\n\t}\n\treturn 0\n}\n\nfunc (any *floatAny) ToFloat32() float32 {\n\treturn float32(any.val)\n}\n\nfunc (any *floatAny) ToFloat64() float64 {\n\treturn any.val\n}\n\nfunc (any *floatAny) ToString() string {\n\treturn strconv.FormatFloat(any.val, 'E', -1, 64)\n}\n\nfunc (any *floatAny) WriteTo(stream *Stream) {\n\tstream.WriteFloat64(any.val)\n}\n\nfunc (any *floatAny) GetInterface() interface{} {\n\treturn any.val\n}\n"
  },
  {
    "path": "any_int32.go",
    "content": "package jsoniter\n\nimport (\n\t\"strconv\"\n)\n\ntype int32Any struct {\n\tbaseAny\n\tval int32\n}\n\nfunc (any *int32Any) LastError() error {\n\treturn nil\n}\n\nfunc (any *int32Any) ValueType() ValueType {\n\treturn NumberValue\n}\n\nfunc (any *int32Any) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *int32Any) ToBool() bool {\n\treturn any.val != 0\n}\n\nfunc (any *int32Any) ToInt() int {\n\treturn int(any.val)\n}\n\nfunc (any *int32Any) ToInt32() int32 {\n\treturn any.val\n}\n\nfunc (any *int32Any) ToInt64() int64 {\n\treturn int64(any.val)\n}\n\nfunc (any *int32Any) ToUint() uint {\n\treturn uint(any.val)\n}\n\nfunc (any *int32Any) ToUint32() uint32 {\n\treturn uint32(any.val)\n}\n\nfunc (any *int32Any) ToUint64() uint64 {\n\treturn uint64(any.val)\n}\n\nfunc (any *int32Any) ToFloat32() float32 {\n\treturn float32(any.val)\n}\n\nfunc (any *int32Any) ToFloat64() float64 {\n\treturn float64(any.val)\n}\n\nfunc (any *int32Any) ToString() string {\n\treturn strconv.FormatInt(int64(any.val), 10)\n}\n\nfunc (any *int32Any) WriteTo(stream *Stream) {\n\tstream.WriteInt32(any.val)\n}\n\nfunc (any *int32Any) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *int32Any) GetInterface() interface{} {\n\treturn any.val\n}\n"
  },
  {
    "path": "any_int64.go",
    "content": "package jsoniter\n\nimport (\n\t\"strconv\"\n)\n\ntype int64Any struct {\n\tbaseAny\n\tval int64\n}\n\nfunc (any *int64Any) LastError() error {\n\treturn nil\n}\n\nfunc (any *int64Any) ValueType() ValueType {\n\treturn NumberValue\n}\n\nfunc (any *int64Any) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *int64Any) ToBool() bool {\n\treturn any.val != 0\n}\n\nfunc (any *int64Any) ToInt() int {\n\treturn int(any.val)\n}\n\nfunc (any *int64Any) ToInt32() int32 {\n\treturn int32(any.val)\n}\n\nfunc (any *int64Any) ToInt64() int64 {\n\treturn any.val\n}\n\nfunc (any *int64Any) ToUint() uint {\n\treturn uint(any.val)\n}\n\nfunc (any *int64Any) ToUint32() uint32 {\n\treturn uint32(any.val)\n}\n\nfunc (any *int64Any) ToUint64() uint64 {\n\treturn uint64(any.val)\n}\n\nfunc (any *int64Any) ToFloat32() float32 {\n\treturn float32(any.val)\n}\n\nfunc (any *int64Any) ToFloat64() float64 {\n\treturn float64(any.val)\n}\n\nfunc (any *int64Any) ToString() string {\n\treturn strconv.FormatInt(any.val, 10)\n}\n\nfunc (any *int64Any) WriteTo(stream *Stream) {\n\tstream.WriteInt64(any.val)\n}\n\nfunc (any *int64Any) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *int64Any) GetInterface() interface{} {\n\treturn any.val\n}\n"
  },
  {
    "path": "any_invalid.go",
    "content": "package jsoniter\n\nimport \"fmt\"\n\ntype invalidAny struct {\n\tbaseAny\n\terr error\n}\n\nfunc newInvalidAny(path []interface{}) *invalidAny {\n\treturn &invalidAny{baseAny{}, fmt.Errorf(\"%v not found\", path)}\n}\n\nfunc (any *invalidAny) LastError() error {\n\treturn any.err\n}\n\nfunc (any *invalidAny) ValueType() ValueType {\n\treturn InvalidValue\n}\n\nfunc (any *invalidAny) MustBeValid() Any {\n\tpanic(any.err)\n}\n\nfunc (any *invalidAny) ToBool() bool {\n\treturn false\n}\n\nfunc (any *invalidAny) ToInt() int {\n\treturn 0\n}\n\nfunc (any *invalidAny) ToInt32() int32 {\n\treturn 0\n}\n\nfunc (any *invalidAny) ToInt64() int64 {\n\treturn 0\n}\n\nfunc (any *invalidAny) ToUint() uint {\n\treturn 0\n}\n\nfunc (any *invalidAny) ToUint32() uint32 {\n\treturn 0\n}\n\nfunc (any *invalidAny) ToUint64() uint64 {\n\treturn 0\n}\n\nfunc (any *invalidAny) ToFloat32() float32 {\n\treturn 0\n}\n\nfunc (any *invalidAny) ToFloat64() float64 {\n\treturn 0\n}\n\nfunc (any *invalidAny) ToString() string {\n\treturn \"\"\n}\n\nfunc (any *invalidAny) WriteTo(stream *Stream) {\n}\n\nfunc (any *invalidAny) Get(path ...interface{}) Any {\n\tif any.err == nil {\n\t\treturn &invalidAny{baseAny{}, fmt.Errorf(\"get %v from invalid\", path)}\n\t}\n\treturn &invalidAny{baseAny{}, fmt.Errorf(\"%v, get %v from invalid\", any.err, path)}\n}\n\nfunc (any *invalidAny) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *invalidAny) GetInterface() interface{} {\n\treturn nil\n}\n"
  },
  {
    "path": "any_nil.go",
    "content": "package jsoniter\n\ntype nilAny struct {\n\tbaseAny\n}\n\nfunc (any *nilAny) LastError() error {\n\treturn nil\n}\n\nfunc (any *nilAny) ValueType() ValueType {\n\treturn NilValue\n}\n\nfunc (any *nilAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *nilAny) ToBool() bool {\n\treturn false\n}\n\nfunc (any *nilAny) ToInt() int {\n\treturn 0\n}\n\nfunc (any *nilAny) ToInt32() int32 {\n\treturn 0\n}\n\nfunc (any *nilAny) ToInt64() int64 {\n\treturn 0\n}\n\nfunc (any *nilAny) ToUint() uint {\n\treturn 0\n}\n\nfunc (any *nilAny) ToUint32() uint32 {\n\treturn 0\n}\n\nfunc (any *nilAny) ToUint64() uint64 {\n\treturn 0\n}\n\nfunc (any *nilAny) ToFloat32() float32 {\n\treturn 0\n}\n\nfunc (any *nilAny) ToFloat64() float64 {\n\treturn 0\n}\n\nfunc (any *nilAny) ToString() string {\n\treturn \"\"\n}\n\nfunc (any *nilAny) WriteTo(stream *Stream) {\n\tstream.WriteNil()\n}\n\nfunc (any *nilAny) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *nilAny) GetInterface() interface{} {\n\treturn nil\n}\n"
  },
  {
    "path": "any_number.go",
    "content": "package jsoniter\n\nimport (\n\t\"io\"\n\t\"unsafe\"\n)\n\ntype numberLazyAny struct {\n\tbaseAny\n\tcfg *frozenConfig\n\tbuf []byte\n\terr error\n}\n\nfunc (any *numberLazyAny) ValueType() ValueType {\n\treturn NumberValue\n}\n\nfunc (any *numberLazyAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *numberLazyAny) LastError() error {\n\treturn any.err\n}\n\nfunc (any *numberLazyAny) ToBool() bool {\n\treturn any.ToFloat64() != 0\n}\n\nfunc (any *numberLazyAny) ToInt() int {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\tval := iter.ReadInt()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\tany.err = iter.Error\n\t}\n\treturn val\n}\n\nfunc (any *numberLazyAny) ToInt32() int32 {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\tval := iter.ReadInt32()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\tany.err = iter.Error\n\t}\n\treturn val\n}\n\nfunc (any *numberLazyAny) ToInt64() int64 {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\tval := iter.ReadInt64()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\tany.err = iter.Error\n\t}\n\treturn val\n}\n\nfunc (any *numberLazyAny) ToUint() uint {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\tval := iter.ReadUint()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\tany.err = iter.Error\n\t}\n\treturn val\n}\n\nfunc (any *numberLazyAny) ToUint32() uint32 {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\tval := iter.ReadUint32()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\tany.err = iter.Error\n\t}\n\treturn val\n}\n\nfunc (any *numberLazyAny) ToUint64() uint64 {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\tval := iter.ReadUint64()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\tany.err = iter.Error\n\t}\n\treturn val\n}\n\nfunc (any *numberLazyAny) ToFloat32() float32 {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\tval := iter.ReadFloat32()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\tany.err = iter.Error\n\t}\n\treturn val\n}\n\nfunc (any *numberLazyAny) ToFloat64() float64 {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\tval := iter.ReadFloat64()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\tany.err = iter.Error\n\t}\n\treturn val\n}\n\nfunc (any *numberLazyAny) ToString() string {\n\treturn *(*string)(unsafe.Pointer(&any.buf))\n}\n\nfunc (any *numberLazyAny) WriteTo(stream *Stream) {\n\tstream.Write(any.buf)\n}\n\nfunc (any *numberLazyAny) GetInterface() interface{} {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\treturn iter.Read()\n}\n"
  },
  {
    "path": "any_object.go",
    "content": "package jsoniter\n\nimport (\n\t\"reflect\"\n\t\"unsafe\"\n)\n\ntype objectLazyAny struct {\n\tbaseAny\n\tcfg *frozenConfig\n\tbuf []byte\n\terr error\n}\n\nfunc (any *objectLazyAny) ValueType() ValueType {\n\treturn ObjectValue\n}\n\nfunc (any *objectLazyAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *objectLazyAny) LastError() error {\n\treturn any.err\n}\n\nfunc (any *objectLazyAny) ToBool() bool {\n\treturn true\n}\n\nfunc (any *objectLazyAny) ToInt() int {\n\treturn 0\n}\n\nfunc (any *objectLazyAny) ToInt32() int32 {\n\treturn 0\n}\n\nfunc (any *objectLazyAny) ToInt64() int64 {\n\treturn 0\n}\n\nfunc (any *objectLazyAny) ToUint() uint {\n\treturn 0\n}\n\nfunc (any *objectLazyAny) ToUint32() uint32 {\n\treturn 0\n}\n\nfunc (any *objectLazyAny) ToUint64() uint64 {\n\treturn 0\n}\n\nfunc (any *objectLazyAny) ToFloat32() float32 {\n\treturn 0\n}\n\nfunc (any *objectLazyAny) ToFloat64() float64 {\n\treturn 0\n}\n\nfunc (any *objectLazyAny) ToString() string {\n\treturn *(*string)(unsafe.Pointer(&any.buf))\n}\n\nfunc (any *objectLazyAny) ToVal(obj interface{}) {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\titer.ReadVal(obj)\n}\n\nfunc (any *objectLazyAny) Get(path ...interface{}) Any {\n\tif len(path) == 0 {\n\t\treturn any\n\t}\n\tswitch firstPath := path[0].(type) {\n\tcase string:\n\t\titer := any.cfg.BorrowIterator(any.buf)\n\t\tdefer any.cfg.ReturnIterator(iter)\n\t\tvalueBytes := locateObjectField(iter, firstPath)\n\t\tif valueBytes == nil {\n\t\t\treturn newInvalidAny(path)\n\t\t}\n\t\titer.ResetBytes(valueBytes)\n\t\treturn locatePath(iter, path[1:])\n\tcase int32:\n\t\tif '*' == firstPath {\n\t\t\tmappedAll := map[string]Any{}\n\t\t\titer := any.cfg.BorrowIterator(any.buf)\n\t\t\tdefer any.cfg.ReturnIterator(iter)\n\t\t\titer.ReadMapCB(func(iter *Iterator, field string) bool {\n\t\t\t\tmapped := locatePath(iter, path[1:])\n\t\t\t\tif mapped.ValueType() != InvalidValue {\n\t\t\t\t\tmappedAll[field] = mapped\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t\treturn wrapMap(mappedAll)\n\t\t}\n\t\treturn newInvalidAny(path)\n\tdefault:\n\t\treturn newInvalidAny(path)\n\t}\n}\n\nfunc (any *objectLazyAny) Keys() []string {\n\tkeys := []string{}\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\titer.ReadMapCB(func(iter *Iterator, field string) bool {\n\t\titer.Skip()\n\t\tkeys = append(keys, field)\n\t\treturn true\n\t})\n\treturn keys\n}\n\nfunc (any *objectLazyAny) Size() int {\n\tsize := 0\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\titer.ReadObjectCB(func(iter *Iterator, field string) bool {\n\t\titer.Skip()\n\t\tsize++\n\t\treturn true\n\t})\n\treturn size\n}\n\nfunc (any *objectLazyAny) WriteTo(stream *Stream) {\n\tstream.Write(any.buf)\n}\n\nfunc (any *objectLazyAny) GetInterface() interface{} {\n\titer := any.cfg.BorrowIterator(any.buf)\n\tdefer any.cfg.ReturnIterator(iter)\n\treturn iter.Read()\n}\n\ntype objectAny struct {\n\tbaseAny\n\terr error\n\tval reflect.Value\n}\n\nfunc wrapStruct(val interface{}) *objectAny {\n\treturn &objectAny{baseAny{}, nil, reflect.ValueOf(val)}\n}\n\nfunc (any *objectAny) ValueType() ValueType {\n\treturn ObjectValue\n}\n\nfunc (any *objectAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *objectAny) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *objectAny) LastError() error {\n\treturn any.err\n}\n\nfunc (any *objectAny) ToBool() bool {\n\treturn any.val.NumField() != 0\n}\n\nfunc (any *objectAny) ToInt() int {\n\treturn 0\n}\n\nfunc (any *objectAny) ToInt32() int32 {\n\treturn 0\n}\n\nfunc (any *objectAny) ToInt64() int64 {\n\treturn 0\n}\n\nfunc (any *objectAny) ToUint() uint {\n\treturn 0\n}\n\nfunc (any *objectAny) ToUint32() uint32 {\n\treturn 0\n}\n\nfunc (any *objectAny) ToUint64() uint64 {\n\treturn 0\n}\n\nfunc (any *objectAny) ToFloat32() float32 {\n\treturn 0\n}\n\nfunc (any *objectAny) ToFloat64() float64 {\n\treturn 0\n}\n\nfunc (any *objectAny) ToString() string {\n\tstr, err := MarshalToString(any.val.Interface())\n\tany.err = err\n\treturn str\n}\n\nfunc (any *objectAny) Get(path ...interface{}) Any {\n\tif len(path) == 0 {\n\t\treturn any\n\t}\n\tswitch firstPath := path[0].(type) {\n\tcase string:\n\t\tfield := any.val.FieldByName(firstPath)\n\t\tif !field.IsValid() {\n\t\t\treturn newInvalidAny(path)\n\t\t}\n\t\treturn Wrap(field.Interface())\n\tcase int32:\n\t\tif '*' == firstPath {\n\t\t\tmappedAll := map[string]Any{}\n\t\t\tfor i := 0; i < any.val.NumField(); i++ {\n\t\t\t\tfield := any.val.Field(i)\n\t\t\t\tif field.CanInterface() {\n\t\t\t\t\tmapped := Wrap(field.Interface()).Get(path[1:]...)\n\t\t\t\t\tif mapped.ValueType() != InvalidValue {\n\t\t\t\t\t\tmappedAll[any.val.Type().Field(i).Name] = mapped\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn wrapMap(mappedAll)\n\t\t}\n\t\treturn newInvalidAny(path)\n\tdefault:\n\t\treturn newInvalidAny(path)\n\t}\n}\n\nfunc (any *objectAny) Keys() []string {\n\tkeys := make([]string, 0, any.val.NumField())\n\tfor i := 0; i < any.val.NumField(); i++ {\n\t\tkeys = append(keys, any.val.Type().Field(i).Name)\n\t}\n\treturn keys\n}\n\nfunc (any *objectAny) Size() int {\n\treturn any.val.NumField()\n}\n\nfunc (any *objectAny) WriteTo(stream *Stream) {\n\tstream.WriteVal(any.val)\n}\n\nfunc (any *objectAny) GetInterface() interface{} {\n\treturn any.val.Interface()\n}\n\ntype mapAny struct {\n\tbaseAny\n\terr error\n\tval reflect.Value\n}\n\nfunc wrapMap(val interface{}) *mapAny {\n\treturn &mapAny{baseAny{}, nil, reflect.ValueOf(val)}\n}\n\nfunc (any *mapAny) ValueType() ValueType {\n\treturn ObjectValue\n}\n\nfunc (any *mapAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *mapAny) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *mapAny) LastError() error {\n\treturn any.err\n}\n\nfunc (any *mapAny) ToBool() bool {\n\treturn true\n}\n\nfunc (any *mapAny) ToInt() int {\n\treturn 0\n}\n\nfunc (any *mapAny) ToInt32() int32 {\n\treturn 0\n}\n\nfunc (any *mapAny) ToInt64() int64 {\n\treturn 0\n}\n\nfunc (any *mapAny) ToUint() uint {\n\treturn 0\n}\n\nfunc (any *mapAny) ToUint32() uint32 {\n\treturn 0\n}\n\nfunc (any *mapAny) ToUint64() uint64 {\n\treturn 0\n}\n\nfunc (any *mapAny) ToFloat32() float32 {\n\treturn 0\n}\n\nfunc (any *mapAny) ToFloat64() float64 {\n\treturn 0\n}\n\nfunc (any *mapAny) ToString() string {\n\tstr, err := MarshalToString(any.val.Interface())\n\tany.err = err\n\treturn str\n}\n\nfunc (any *mapAny) Get(path ...interface{}) Any {\n\tif len(path) == 0 {\n\t\treturn any\n\t}\n\tswitch firstPath := path[0].(type) {\n\tcase int32:\n\t\tif '*' == firstPath {\n\t\t\tmappedAll := map[string]Any{}\n\t\t\tfor _, key := range any.val.MapKeys() {\n\t\t\t\tkeyAsStr := key.String()\n\t\t\t\telement := Wrap(any.val.MapIndex(key).Interface())\n\t\t\t\tmapped := element.Get(path[1:]...)\n\t\t\t\tif mapped.ValueType() != InvalidValue {\n\t\t\t\t\tmappedAll[keyAsStr] = mapped\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn wrapMap(mappedAll)\n\t\t}\n\t\treturn newInvalidAny(path)\n\tdefault:\n\t\tvalue := any.val.MapIndex(reflect.ValueOf(firstPath))\n\t\tif !value.IsValid() {\n\t\t\treturn newInvalidAny(path)\n\t\t}\n\t\treturn Wrap(value.Interface())\n\t}\n}\n\nfunc (any *mapAny) Keys() []string {\n\tkeys := make([]string, 0, any.val.Len())\n\tfor _, key := range any.val.MapKeys() {\n\t\tkeys = append(keys, key.String())\n\t}\n\treturn keys\n}\n\nfunc (any *mapAny) Size() int {\n\treturn any.val.Len()\n}\n\nfunc (any *mapAny) WriteTo(stream *Stream) {\n\tstream.WriteVal(any.val)\n}\n\nfunc (any *mapAny) GetInterface() interface{} {\n\treturn any.val.Interface()\n}\n"
  },
  {
    "path": "any_str.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\ntype stringAny struct {\n\tbaseAny\n\tval string\n}\n\nfunc (any *stringAny) Get(path ...interface{}) Any {\n\tif len(path) == 0 {\n\t\treturn any\n\t}\n\treturn &invalidAny{baseAny{}, fmt.Errorf(\"GetIndex %v from simple value\", path)}\n}\n\nfunc (any *stringAny) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *stringAny) ValueType() ValueType {\n\treturn StringValue\n}\n\nfunc (any *stringAny) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *stringAny) LastError() error {\n\treturn nil\n}\n\nfunc (any *stringAny) ToBool() bool {\n\tstr := any.ToString()\n\tif str == \"0\" {\n\t\treturn false\n\t}\n\tfor _, c := range str {\n\t\tswitch c {\n\t\tcase ' ', '\\n', '\\r', '\\t':\n\t\tdefault:\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (any *stringAny) ToInt() int {\n\treturn int(any.ToInt64())\n\n}\n\nfunc (any *stringAny) ToInt32() int32 {\n\treturn int32(any.ToInt64())\n}\n\nfunc (any *stringAny) ToInt64() int64 {\n\tif any.val == \"\" {\n\t\treturn 0\n\t}\n\n\tflag := 1\n\tstartPos := 0\n\tif any.val[0] == '+' || any.val[0] == '-' {\n\t\tstartPos = 1\n\t}\n\n\tif any.val[0] == '-' {\n\t\tflag = -1\n\t}\n\n\tendPos := startPos\n\tfor i := startPos; i < len(any.val); i++ {\n\t\tif any.val[i] >= '0' && any.val[i] <= '9' {\n\t\t\tendPos = i + 1\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\tparsed, _ := strconv.ParseInt(any.val[startPos:endPos], 10, 64)\n\treturn int64(flag) * parsed\n}\n\nfunc (any *stringAny) ToUint() uint {\n\treturn uint(any.ToUint64())\n}\n\nfunc (any *stringAny) ToUint32() uint32 {\n\treturn uint32(any.ToUint64())\n}\n\nfunc (any *stringAny) ToUint64() uint64 {\n\tif any.val == \"\" {\n\t\treturn 0\n\t}\n\n\tstartPos := 0\n\n\tif any.val[0] == '-' {\n\t\treturn 0\n\t}\n\tif any.val[0] == '+' {\n\t\tstartPos = 1\n\t}\n\n\tendPos := startPos\n\tfor i := startPos; i < len(any.val); i++ {\n\t\tif any.val[i] >= '0' && any.val[i] <= '9' {\n\t\t\tendPos = i + 1\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\tparsed, _ := strconv.ParseUint(any.val[startPos:endPos], 10, 64)\n\treturn parsed\n}\n\nfunc (any *stringAny) ToFloat32() float32 {\n\treturn float32(any.ToFloat64())\n}\n\nfunc (any *stringAny) ToFloat64() float64 {\n\tif len(any.val) == 0 {\n\t\treturn 0\n\t}\n\n\t// first char invalid\n\tif any.val[0] != '+' && any.val[0] != '-' && (any.val[0] > '9' || any.val[0] < '0') {\n\t\treturn 0\n\t}\n\n\t// extract valid num expression from string\n\t// eg 123true => 123, -12.12xxa => -12.12\n\tendPos := 1\n\tfor i := 1; i < len(any.val); i++ {\n\t\tif any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' || any.val[i] == '+' || any.val[i] == '-' {\n\t\t\tendPos = i + 1\n\t\t\tcontinue\n\t\t}\n\n\t\t// end position is the first char which is not digit\n\t\tif any.val[i] >= '0' && any.val[i] <= '9' {\n\t\t\tendPos = i + 1\n\t\t} else {\n\t\t\tendPos = i\n\t\t\tbreak\n\t\t}\n\t}\n\tparsed, _ := strconv.ParseFloat(any.val[:endPos], 64)\n\treturn parsed\n}\n\nfunc (any *stringAny) ToString() string {\n\treturn any.val\n}\n\nfunc (any *stringAny) WriteTo(stream *Stream) {\n\tstream.WriteString(any.val)\n}\n\nfunc (any *stringAny) GetInterface() interface{} {\n\treturn any.val\n}\n"
  },
  {
    "path": "any_tests/jsoniter_any_array_test.go",
    "content": "package any_tests\n\nimport (\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_read_empty_array_as_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"[]\"))\n\tshould.Equal(jsoniter.ArrayValue, any.Get().ValueType())\n\tshould.Equal(jsoniter.InvalidValue, any.Get(0.3).ValueType())\n\tshould.Equal(0, any.Size())\n\tshould.Equal(jsoniter.ArrayValue, any.ValueType())\n\tshould.Nil(any.LastError())\n\tshould.Equal(0, any.ToInt())\n\tshould.Equal(int32(0), any.ToInt32())\n\tshould.Equal(int64(0), any.ToInt64())\n\tshould.Equal(uint(0), any.ToUint())\n\tshould.Equal(uint32(0), any.ToUint32())\n\tshould.Equal(uint64(0), any.ToUint64())\n\tshould.Equal(float32(0), any.ToFloat32())\n\tshould.Equal(float64(0), any.ToFloat64())\n}\n\nfunc Test_read_one_element_array_as_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"[1]\"))\n\tshould.Equal(1, any.Size())\n}\n\nfunc Test_read_two_element_array_as_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"[1,2]\"))\n\tshould.Equal(1, any.Get(0).ToInt())\n\tshould.Equal(2, any.Size())\n\tshould.True(any.ToBool())\n\tshould.Equal(1, any.ToInt())\n\tshould.Equal([]interface{}{float64(1), float64(2)}, any.GetInterface())\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tany.WriteTo(stream)\n\tshould.Equal(\"[1,2]\", string(stream.Buffer()))\n\tarr := []int{}\n\tany.ToVal(&arr)\n\tshould.Equal([]int{1, 2}, arr)\n}\n\nfunc Test_wrap_array_and_convert_to_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Wrap([]int{1, 2, 3})\n\tany2 := jsoniter.Wrap([]int{})\n\n\tshould.Equal(\"[1,2,3]\", any.ToString())\n\tshould.True(any.ToBool())\n\tshould.False(any2.ToBool())\n\n\tshould.Equal(1, any.ToInt())\n\tshould.Equal(0, any2.ToInt())\n\tshould.Equal(int32(1), any.ToInt32())\n\tshould.Equal(int32(0), any2.ToInt32())\n\tshould.Equal(int64(1), any.ToInt64())\n\tshould.Equal(int64(0), any2.ToInt64())\n\tshould.Equal(uint(1), any.ToUint())\n\tshould.Equal(uint(0), any2.ToUint())\n\tshould.Equal(uint32(1), any.ToUint32())\n\tshould.Equal(uint32(0), any2.ToUint32())\n\tshould.Equal(uint64(1), any.ToUint64())\n\tshould.Equal(uint64(0), any2.ToUint64())\n\tshould.Equal(float32(1), any.ToFloat32())\n\tshould.Equal(float32(0), any2.ToFloat32())\n\tshould.Equal(float64(1), any.ToFloat64())\n\tshould.Equal(float64(0), any2.ToFloat64())\n\tshould.Equal(3, any.Size())\n\tshould.Equal(0, any2.Size())\n\n\tvar i interface{} = []int{1, 2, 3}\n\tshould.Equal(i, any.GetInterface())\n}\n\nfunc Test_array_lazy_any_get(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"[1,[2,3],4]\"))\n\tshould.Equal(3, any.Get(1, 1).ToInt())\n\tshould.Equal(\"[1,[2,3],4]\", any.ToString())\n}\n\nfunc Test_array_lazy_any_get_all(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"[[1],[2],[3,4]]\"))\n\tshould.Equal(\"[1,2,3]\", any.Get('*', 0).ToString())\n\tany = jsoniter.Get([]byte(\"[[[1],[2],[3,4]]]\"), 0, '*', 0)\n\tshould.Equal(\"[1,2,3]\", any.ToString())\n}\n\nfunc Test_array_wrapper_any_get_all(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Wrap([][]int{\n\t\t{1, 2},\n\t\t{3, 4},\n\t\t{5, 6},\n\t})\n\tshould.Equal(\"[1,3,5]\", any.Get('*', 0).ToString())\n\tshould.Equal(jsoniter.ArrayValue, any.ValueType())\n\tshould.True(any.ToBool())\n\tshould.Equal(1, any.Get(0, 0).ToInt())\n}\n\nfunc Test_array_lazy_any_get_invalid(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"[]\"))\n\tshould.Equal(jsoniter.InvalidValue, any.Get(1, 1).ValueType())\n\tshould.NotNil(any.Get(1, 1).LastError())\n\tshould.Equal(jsoniter.InvalidValue, any.Get(\"1\").ValueType())\n\tshould.NotNil(any.Get(\"1\").LastError())\n}\n\nfunc Test_invalid_array(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"[\"), 0)\n\tshould.Equal(jsoniter.InvalidValue, any.ValueType())\n}\n"
  },
  {
    "path": "any_tests/jsoniter_any_bool_test.go",
    "content": "package any_tests\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nvar boolConvertMap = map[string]bool{\n\t\"null\":  false,\n\t\"true\":  true,\n\t\"false\": false,\n\n\t`\"true\"`:  true,\n\t`\"false\"`: true,\n\n\t\"123\":   true,\n\t`\"123\"`: true,\n\t\"0\":     false,\n\t`\"0\"`:   false,\n\t\"-1\":    true,\n\t`\"-1\"`:  true,\n\n\t\"1.1\":       true,\n\t\"0.0\":       false,\n\t\"-1.1\":      true,\n\t`\"\"`:        false,\n\t\"[1,2]\":     true,\n\t\"[]\":        false,\n\t\"{}\":        true,\n\t`{\"abc\":1}`: true,\n}\n\nfunc Test_read_bool_as_any(t *testing.T) {\n\tshould := require.New(t)\n\n\tvar any jsoniter.Any\n\tfor k, v := range boolConvertMap {\n\t\tany = jsoniter.Get([]byte(k))\n\t\tif v {\n\t\t\tshould.True(any.ToBool(), fmt.Sprintf(\"origin val is %v\", k))\n\t\t} else {\n\t\t\tshould.False(any.ToBool(), fmt.Sprintf(\"origin val is %v\", k))\n\t\t}\n\t}\n\n}\n\nfunc Test_write_bool_to_stream(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"true\"))\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tany.WriteTo(stream)\n\tshould.Equal(\"true\", string(stream.Buffer()))\n\tshould.Equal(any.ValueType(), jsoniter.BoolValue)\n\n\tany = jsoniter.Get([]byte(\"false\"))\n\tstream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tany.WriteTo(stream)\n\tshould.Equal(\"false\", string(stream.Buffer()))\n\n\tshould.Equal(any.ValueType(), jsoniter.BoolValue)\n}\n"
  },
  {
    "path": "any_tests/jsoniter_any_float_test.go",
    "content": "package any_tests\n\nimport (\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nvar floatConvertMap = map[string]float64{\n\t\"null\":  0,\n\t\"true\":  1,\n\t\"false\": 0,\n\n\t`\"true\"`:  0,\n\t`\"false\"`: 0,\n\n\t\"1e1\":  10,\n\t\"1e+1\": 10,\n\t\"1e-1\": .1,\n\t\"1E1\":  10,\n\t\"1E+1\": 10,\n\t\"1E-1\": .1,\n\n\t\"-1e1\":  -10,\n\t\"-1e+1\": -10,\n\t\"-1e-1\": -.1,\n\t\"-1E1\":  -10,\n\t\"-1E+1\": -10,\n\t\"-1E-1\": -.1,\n\n\t`\"1e1\"`:  10,\n\t`\"1e+1\"`: 10,\n\t`\"1e-1\"`: .1,\n\t`\"1E1\"`:  10,\n\t`\"1E+1\"`: 10,\n\t`\"1E-1\"`: .1,\n\n\t`\"-1e1\"`:  -10,\n\t`\"-1e+1\"`: -10,\n\t`\"-1e-1\"`: -.1,\n\t`\"-1E1\"`:  -10,\n\t`\"-1E+1\"`: -10,\n\t`\"-1E-1\"`: -.1,\n\n\t\"123\":       123,\n\t`\"123true\"`: 123,\n\t`\"+\"`:       0,\n\t`\"-\"`:       0,\n\n\t`\"-123true\"`:  -123,\n\t`\"-99.9true\"`: -99.9,\n\t\"0\":           0,\n\t`\"0\"`:         0,\n\t\"-1\":          -1,\n\n\t\"1.1\":       1.1,\n\t\"0.0\":       0,\n\t\"-1.1\":      -1.1,\n\t`\"+1.1\"`:    1.1,\n\t`\"\"`:        0,\n\t\"[1,2]\":     1,\n\t\"[]\":        0,\n\t\"{}\":        0,\n\t`{\"abc\":1}`: 0,\n}\n\nfunc Test_read_any_to_float(t *testing.T) {\n\tshould := require.New(t)\n\tfor k, v := range floatConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(float64(v), any.ToFloat64(), \"the original val is \"+k)\n\t}\n\n\tfor k, v := range floatConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(float32(v), any.ToFloat32(), \"the original val is \"+k)\n\t}\n}\n\nfunc Test_read_float_to_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.WrapFloat64(12.3)\n\tanyFloat64 := float64(12.3)\n\tany2 := jsoniter.WrapFloat64(-1.1)\n\tshould.Equal(float64(12.3), any.ToFloat64())\n\tshould.True(any.ToBool())\n\tshould.Equal(float32(anyFloat64), any.ToFloat32())\n\tshould.Equal(int(anyFloat64), any.ToInt())\n\tshould.Equal(int32(anyFloat64), any.ToInt32())\n\tshould.Equal(int64(anyFloat64), any.ToInt64())\n\tshould.Equal(uint(anyFloat64), any.ToUint())\n\tshould.Equal(uint32(anyFloat64), any.ToUint32())\n\tshould.Equal(uint64(anyFloat64), any.ToUint64())\n\tshould.Equal(uint(0), any2.ToUint())\n\tshould.Equal(uint32(0), any2.ToUint32())\n\tshould.Equal(uint64(0), any2.ToUint64())\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\n\tshould.Equal(\"1.23E+01\", any.ToString())\n}\n"
  },
  {
    "path": "any_tests/jsoniter_any_int_test.go",
    "content": "package any_tests\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nvar intConvertMap = map[string]int{\n\t\"null\":       0,\n\t\"321.1\":      321,\n\t\"-321.1\":     -321,\n\t`\"1.1\"`:      1,\n\t`\"-321.1\"`:   -321,\n\t\"0.0\":        0,\n\t\"0\":          0,\n\t`\"0\"`:        0,\n\t`\"0.0\"`:      0,\n\t\"-1.1\":       -1,\n\t\"true\":       1,\n\t\"false\":      0,\n\t`\"true\"`:     0,\n\t`\"false\"`:    0,\n\t`\"true123\"`:  0,\n\t`\"123true\"`:  123,\n\t`\"-123true\"`: -123,\n\t`\"1.2332e6\"`: 1,\n\t`\"\"`:         0,\n\t\"+\":          0,\n\t\"-\":          0,\n\t\"[]\":         0,\n\t\"[1,2]\":      1,\n\t`[\"1\",\"2\"]`:  1,\n\t// object in php cannot convert to int\n\t\"{}\": 0,\n}\n\nfunc Test_read_any_to_int(t *testing.T) {\n\tshould := require.New(t)\n\n\t// int\n\tfor k, v := range intConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(v, any.ToInt(), fmt.Sprintf(\"origin val %v\", k))\n\t}\n\n\t// int32\n\tfor k, v := range intConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(int32(v), any.ToInt32(), fmt.Sprintf(\"original val is %v\", k))\n\t}\n\n\t// int64\n\tfor k, v := range intConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(int64(v), any.ToInt64(), fmt.Sprintf(\"original val is %v\", k))\n\t}\n\n}\n\nvar uintConvertMap = map[string]int{\n\t\"null\":       0,\n\t\"321.1\":      321,\n\t`\"1.1\"`:      1,\n\t`\"-123.1\"`:   0,\n\t\"0.0\":        0,\n\t\"0\":          0,\n\t`\"0\"`:        0,\n\t`\"0.0\"`:      0,\n\t`\"00.0\"`:     0,\n\t\"true\":       1,\n\t\"false\":      0,\n\t`\"true\"`:     0,\n\t`\"false\"`:    0,\n\t`\"true123\"`:  0,\n\t`\"+1\"`:       1,\n\t`\"123true\"`:  123,\n\t`\"-123true\"`: 0,\n\t`\"1.2332e6\"`: 1,\n\t`\"\"`:         0,\n\t\"+\":          0,\n\t\"-\":          0,\n\t\".\":          0,\n\t\"[]\":         0,\n\t\"[1,2]\":      1,\n\t\"{}\":         0,\n\t\"{1,2}\":      0,\n\t\"-1.1\":       0,\n\t\"-321.1\":     0,\n}\n\nfunc Test_read_any_to_uint(t *testing.T) {\n\tshould := require.New(t)\n\n\tfor k, v := range uintConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(uint64(v), any.ToUint64(), fmt.Sprintf(\"origin val %v\", k))\n\t}\n\n\tfor k, v := range uintConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(uint32(v), any.ToUint32(), fmt.Sprintf(\"origin val %v\", k))\n\t}\n\n\tfor k, v := range uintConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(uint(v), any.ToUint(), fmt.Sprintf(\"origin val %v\", k))\n\t}\n\n}\n\nfunc Test_read_int64_to_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.WrapInt64(12345)\n\tshould.Equal(12345, any.ToInt())\n\tshould.Equal(int32(12345), any.ToInt32())\n\tshould.Equal(int64(12345), any.ToInt64())\n\tshould.Equal(uint(12345), any.ToUint())\n\tshould.Equal(uint32(12345), any.ToUint32())\n\tshould.Equal(uint64(12345), any.ToUint64())\n\tshould.Equal(float32(12345), any.ToFloat32())\n\tshould.Equal(float64(12345), any.ToFloat64())\n\tshould.Equal(\"12345\", any.ToString())\n\tshould.Equal(true, any.ToBool())\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tany.WriteTo(stream)\n\tshould.Equal(\"12345\", string(stream.Buffer()))\n}\nfunc Test_read_int32_to_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.WrapInt32(12345)\n\tshould.Equal(12345, any.ToInt())\n\tshould.Equal(int32(12345), any.ToInt32())\n\tshould.Equal(int64(12345), any.ToInt64())\n\tshould.Equal(uint(12345), any.ToUint())\n\tshould.Equal(uint32(12345), any.ToUint32())\n\tshould.Equal(uint64(12345), any.ToUint64())\n\tshould.Equal(float32(12345), any.ToFloat32())\n\tshould.Equal(float64(12345), any.ToFloat64())\n\tshould.Equal(\"12345\", any.ToString())\n\tshould.Equal(true, any.ToBool())\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tany.WriteTo(stream)\n\tshould.Equal(\"12345\", string(stream.Buffer()))\n}\n\nfunc Test_read_uint32_to_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.WrapUint32(12345)\n\tshould.Equal(12345, any.ToInt())\n\tshould.Equal(int32(12345), any.ToInt32())\n\tshould.Equal(int64(12345), any.ToInt64())\n\tshould.Equal(uint(12345), any.ToUint())\n\tshould.Equal(uint32(12345), any.ToUint32())\n\tshould.Equal(uint64(12345), any.ToUint64())\n\tshould.Equal(float32(12345), any.ToFloat32())\n\tshould.Equal(float64(12345), any.ToFloat64())\n\tshould.Equal(\"12345\", any.ToString())\n\tshould.Equal(true, any.ToBool())\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tany.WriteTo(stream)\n\tshould.Equal(\"12345\", string(stream.Buffer()))\n}\n\nfunc Test_read_uint64_to_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.WrapUint64(12345)\n\tshould.Equal(12345, any.ToInt())\n\tshould.Equal(int32(12345), any.ToInt32())\n\tshould.Equal(int64(12345), any.ToInt64())\n\tshould.Equal(uint(12345), any.ToUint())\n\tshould.Equal(uint32(12345), any.ToUint32())\n\tshould.Equal(uint64(12345), any.ToUint64())\n\tshould.Equal(float32(12345), any.ToFloat32())\n\tshould.Equal(float64(12345), any.ToFloat64())\n\tshould.Equal(\"12345\", any.ToString())\n\tshould.Equal(true, any.ToBool())\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tany.WriteTo(stream)\n\tshould.Equal(\"12345\", string(stream.Buffer()))\n\tstream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tstream.WriteUint(uint(123))\n\tshould.Equal(\"123\", string(stream.Buffer()))\n}\n\nfunc Test_int_lazy_any_get(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"1234\"))\n\t// panic!!\n\t//should.Equal(any.LastError(), io.EOF)\n\tshould.Equal(jsoniter.InvalidValue, any.Get(1, \"2\").ValueType())\n}\n"
  },
  {
    "path": "any_tests/jsoniter_any_map_test.go",
    "content": "package any_tests\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\nfunc Test_wrap_map(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Wrap(map[string]string{\"Field1\": \"hello\"})\n\tshould.Equal(\"hello\", any.Get(\"Field1\").ToString())\n\tany = jsoniter.Wrap(map[string]string{\"Field1\": \"hello\"})\n\tshould.Equal(1, any.Size())\n}\n\nfunc Test_map_wrapper_any_get_all(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Wrap(map[string][]int{\"Field1\": {1, 2}})\n\tshould.Equal(`{\"Field1\":1}`, any.Get('*', 0).ToString())\n\tshould.Contains(any.Keys(), \"Field1\")\n\n\t// map write to\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 0)\n\tany.WriteTo(stream)\n\t// TODO cannot pass\n\t//should.Equal(string(stream.buf), \"\")\n}\n"
  },
  {
    "path": "any_tests/jsoniter_any_null_test.go",
    "content": "package any_tests\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\nfunc Test_read_null_as_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(`null`))\n\tshould.Equal(0, any.ToInt())\n\tshould.Equal(float64(0), any.ToFloat64())\n\tshould.Equal(\"\", any.ToString())\n\tshould.False(any.ToBool())\n}\n"
  },
  {
    "path": "any_tests/jsoniter_any_object_test.go",
    "content": "package any_tests\n\nimport (\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_read_object_as_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(`{\"a\":\"stream\",\"c\":\"d\"}`))\n\tshould.Equal(`{\"a\":\"stream\",\"c\":\"d\"}`, any.ToString())\n\t// partial parse\n\tshould.Equal(\"stream\", any.Get(\"a\").ToString())\n\tshould.Equal(\"d\", any.Get(\"c\").ToString())\n\tshould.Equal(2, len(any.Keys()))\n\tany = jsoniter.Get([]byte(`{\"a\":\"stream\",\"c\":\"d\"}`))\n\t// full parse\n\tshould.Equal(2, len(any.Keys()))\n\tshould.Equal(2, any.Size())\n\tshould.True(any.ToBool())\n\tshould.Equal(0, any.ToInt())\n\tshould.Equal(jsoniter.ObjectValue, any.ValueType())\n\tshould.Nil(any.LastError())\n\tobj := struct {\n\t\tA string\n\t}{}\n\tany.ToVal(&obj)\n\tshould.Equal(\"stream\", obj.A)\n}\n\nfunc Test_object_lazy_any_get(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(`{\"a\":{\"stream\":{\"c\":\"d\"}}}`))\n\tshould.Equal(\"d\", any.Get(\"a\", \"stream\", \"c\").ToString())\n}\n\nfunc Test_object_lazy_any_get_all(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(`{\"a\":[0],\"stream\":[1]}`))\n\tshould.Contains(any.Get('*', 0).ToString(), `\"a\":0`)\n}\n\nfunc Test_object_lazy_any_get_invalid(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(`{}`))\n\tshould.Equal(jsoniter.InvalidValue, any.Get(\"a\", \"stream\", \"c\").ValueType())\n\tshould.Equal(jsoniter.InvalidValue, any.Get(1).ValueType())\n}\n\nfunc Test_wrap_map_and_convert_to_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Wrap(map[string]interface{}{\"a\": 1})\n\tshould.True(any.ToBool())\n\tshould.Equal(0, any.ToInt())\n\tshould.Equal(int32(0), any.ToInt32())\n\tshould.Equal(int64(0), any.ToInt64())\n\tshould.Equal(float32(0), any.ToFloat32())\n\tshould.Equal(float64(0), any.ToFloat64())\n\tshould.Equal(uint(0), any.ToUint())\n\tshould.Equal(uint32(0), any.ToUint32())\n\tshould.Equal(uint64(0), any.ToUint64())\n}\n\nfunc Test_wrap_object_and_convert_to_any(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct {\n\t\tField1 string\n\t\tfield2 string\n\t}\n\tany := jsoniter.Wrap(TestObject{\"hello\", \"world\"})\n\tshould.Equal(\"hello\", any.Get(\"Field1\").ToString())\n\tany = jsoniter.Wrap(TestObject{\"hello\", \"world\"})\n\tshould.Equal(2, any.Size())\n\tshould.Equal(`{\"Field1\":\"hello\"}`, any.Get('*').ToString())\n\n\tshould.Equal(0, any.ToInt())\n\tshould.Equal(int32(0), any.ToInt32())\n\tshould.Equal(int64(0), any.ToInt64())\n\tshould.Equal(float32(0), any.ToFloat32())\n\tshould.Equal(float64(0), any.ToFloat64())\n\tshould.Equal(uint(0), any.ToUint())\n\tshould.Equal(uint32(0), any.ToUint32())\n\tshould.Equal(uint64(0), any.ToUint64())\n\tshould.True(any.ToBool())\n\tshould.Equal(`{\"Field1\":\"hello\"}`, any.ToString())\n\n\t// cannot pass!\n\t//stream := NewStream(ConfigDefault, nil, 32)\n\t//any.WriteTo(stream)\n\t//should.Equal(`{\"Field1\":\"hello\"}`, string(stream.Buffer()))\n\t// cannot pass!\n\n}\n\nfunc Test_any_within_struct(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct {\n\t\tField1 jsoniter.Any\n\t\tField2 jsoniter.Any\n\t}\n\tobj := TestObject{}\n\terr := jsoniter.UnmarshalFromString(`{\"Field1\": \"hello\", \"Field2\": [1,2,3]}`, &obj)\n\tshould.Nil(err)\n\tshould.Equal(\"hello\", obj.Field1.ToString())\n\tshould.Equal(\"[1,2,3]\", obj.Field2.ToString())\n}\n\nfunc Test_object_wrapper_any_get_all(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct {\n\t\tField1 []int\n\t\tField2 []int\n\t}\n\tany := jsoniter.Wrap(TestObject{[]int{1, 2}, []int{3, 4}})\n\tshould.Contains(any.Get('*', 0).ToString(), `\"Field2\":3`)\n\tshould.Contains(any.Keys(), \"Field1\")\n\tshould.Contains(any.Keys(), \"Field2\")\n\tshould.NotContains(any.Keys(), \"Field3\")\n}\n"
  },
  {
    "path": "any_tests/jsoniter_any_string_test.go",
    "content": "package any_tests\n\nimport (\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nvar stringConvertMap = map[string]string{\n\t\"null\":                   \"\",\n\t\"321.1\":                  \"321.1\",\n\t`\"1.1\"`:                  \"1.1\",\n\t`\"-123.1\"`:               \"-123.1\",\n\t\"0.0\":                    \"0.0\",\n\t\"0\":                      \"0\",\n\t`\"0\"`:                    \"0\",\n\t`\"0.0\"`:                  \"0.0\",\n\t`\"00.0\"`:                 \"00.0\",\n\t\"true\":                   \"true\",\n\t\"false\":                  \"false\",\n\t`\"true\"`:                 \"true\",\n\t`\"false\"`:                \"false\",\n\t`\"true123\"`:              \"true123\",\n\t`\"+1\"`:                   \"+1\",\n\t\"[]\":                     \"[]\",\n\t\"[1,2]\":                  \"[1,2]\",\n\t\"{}\":                     \"{}\",\n\t`{\"a\":1, \"stream\":true}`: `{\"a\":1, \"stream\":true}`,\n}\n\nfunc Test_read_any_to_string(t *testing.T) {\n\tshould := require.New(t)\n\tfor k, v := range stringConvertMap {\n\t\tany := jsoniter.Get([]byte(k))\n\t\tshould.Equal(v, any.ToString(), \"original val \"+k)\n\t}\n}\n\nfunc Test_read_string_as_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(`\"hello\"`))\n\tshould.Equal(\"hello\", any.ToString())\n\tshould.True(any.ToBool())\n\tany = jsoniter.Get([]byte(`\" \"`))\n\tshould.False(any.ToBool())\n\tany = jsoniter.Get([]byte(`\"false\"`))\n\tshould.True(any.ToBool())\n\tany = jsoniter.Get([]byte(`\"123\"`))\n\tshould.Equal(123, any.ToInt())\n}\n\nfunc Test_wrap_string(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"-32000\")).MustBeValid()\n\tshould.Equal(-32000, any.ToInt())\n\tshould.NoError(any.LastError())\n}\n"
  },
  {
    "path": "any_tests/jsoniter_must_be_valid_test.go",
    "content": "package any_tests\n\nimport (\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n// if must be valid is useless, just drop this test\nfunc Test_must_be_valid(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"123\"))\n\tshould.Equal(any.MustBeValid().ToInt(), 123)\n\n\tany = jsoniter.Wrap(int8(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(int16(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(int32(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(int64(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(uint(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(uint8(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(uint16(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(uint32(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(uint64(10))\n\tshould.Equal(any.MustBeValid().ToInt(), 10)\n\n\tany = jsoniter.Wrap(float32(10))\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(10))\n\n\tany = jsoniter.Wrap(float64(10))\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(10))\n\n\tany = jsoniter.Wrap(true)\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(1))\n\n\tany = jsoniter.Wrap(false)\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(0))\n\n\tany = jsoniter.Wrap(nil)\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(0))\n\n\tany = jsoniter.Wrap(struct{ age int }{age: 1})\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(0))\n\n\tany = jsoniter.Wrap(map[string]interface{}{\"abc\": 1})\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(0))\n\n\tany = jsoniter.Wrap(\"abc\")\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(0))\n\n\tany = jsoniter.Wrap([]int{})\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(0))\n\n\tany = jsoniter.Wrap([]int{1, 2})\n\tshould.Equal(any.MustBeValid().ToFloat64(), float64(1))\n}\n"
  },
  {
    "path": "any_tests/jsoniter_wrap_test.go",
    "content": "package any_tests\n\nimport (\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_wrap_and_valuetype_everything(t *testing.T) {\n\tshould := require.New(t)\n\tvar i interface{}\n\tany := jsoniter.Get([]byte(\"123\"))\n\t// default of number type is float64\n\ti = float64(123)\n\tshould.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(int8(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\t//  get interface is not int8 interface\n\t// i = int8(10)\n\t// should.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(int16(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\t//i = int16(10)\n\t//should.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(int32(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = int32(10)\n\tshould.Equal(i, any.GetInterface())\n\tany = jsoniter.Wrap(int64(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = int64(10)\n\tshould.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(uint(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\t// not equal\n\t//i = uint(10)\n\t//should.Equal(i, any.GetInterface())\n\tany = jsoniter.Wrap(uint8(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\t// not equal\n\t// i = uint8(10)\n\t// should.Equal(i, any.GetInterface())\n\tany = jsoniter.Wrap(uint16(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\tany = jsoniter.Wrap(uint32(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = uint32(10)\n\tshould.Equal(i, any.GetInterface())\n\tany = jsoniter.Wrap(uint64(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = uint64(10)\n\tshould.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(float32(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\t// not equal\n\t//i = float32(10)\n\t//should.Equal(i, any.GetInterface())\n\tany = jsoniter.Wrap(float64(10))\n\tshould.Equal(any.ValueType(), jsoniter.NumberValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = float64(10)\n\tshould.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(true)\n\tshould.Equal(any.ValueType(), jsoniter.BoolValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = true\n\tshould.Equal(i, any.GetInterface())\n\tany = jsoniter.Wrap(false)\n\tshould.Equal(any.ValueType(), jsoniter.BoolValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = false\n\tshould.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(nil)\n\tshould.Equal(any.ValueType(), jsoniter.NilValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = nil\n\tshould.Equal(i, any.GetInterface())\n\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 32)\n\tany.WriteTo(stream)\n\tshould.Equal(\"null\", string(stream.Buffer()))\n\tshould.Equal(any.LastError(), nil)\n\n\tany = jsoniter.Wrap(struct{ age int }{age: 1})\n\tshould.Equal(any.ValueType(), jsoniter.ObjectValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = struct{ age int }{age: 1}\n\tshould.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(map[string]interface{}{\"abc\": 1})\n\tshould.Equal(any.ValueType(), jsoniter.ObjectValue)\n\tshould.Equal(any.LastError(), nil)\n\ti = map[string]interface{}{\"abc\": 1}\n\tshould.Equal(i, any.GetInterface())\n\n\tany = jsoniter.Wrap(\"abc\")\n\ti = \"abc\"\n\tshould.Equal(i, any.GetInterface())\n\tshould.Equal(nil, any.LastError())\n\n}\n"
  },
  {
    "path": "any_uint32.go",
    "content": "package jsoniter\n\nimport (\n\t\"strconv\"\n)\n\ntype uint32Any struct {\n\tbaseAny\n\tval uint32\n}\n\nfunc (any *uint32Any) LastError() error {\n\treturn nil\n}\n\nfunc (any *uint32Any) ValueType() ValueType {\n\treturn NumberValue\n}\n\nfunc (any *uint32Any) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *uint32Any) ToBool() bool {\n\treturn any.val != 0\n}\n\nfunc (any *uint32Any) ToInt() int {\n\treturn int(any.val)\n}\n\nfunc (any *uint32Any) ToInt32() int32 {\n\treturn int32(any.val)\n}\n\nfunc (any *uint32Any) ToInt64() int64 {\n\treturn int64(any.val)\n}\n\nfunc (any *uint32Any) ToUint() uint {\n\treturn uint(any.val)\n}\n\nfunc (any *uint32Any) ToUint32() uint32 {\n\treturn any.val\n}\n\nfunc (any *uint32Any) ToUint64() uint64 {\n\treturn uint64(any.val)\n}\n\nfunc (any *uint32Any) ToFloat32() float32 {\n\treturn float32(any.val)\n}\n\nfunc (any *uint32Any) ToFloat64() float64 {\n\treturn float64(any.val)\n}\n\nfunc (any *uint32Any) ToString() string {\n\treturn strconv.FormatInt(int64(any.val), 10)\n}\n\nfunc (any *uint32Any) WriteTo(stream *Stream) {\n\tstream.WriteUint32(any.val)\n}\n\nfunc (any *uint32Any) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *uint32Any) GetInterface() interface{} {\n\treturn any.val\n}\n"
  },
  {
    "path": "any_uint64.go",
    "content": "package jsoniter\n\nimport (\n\t\"strconv\"\n)\n\ntype uint64Any struct {\n\tbaseAny\n\tval uint64\n}\n\nfunc (any *uint64Any) LastError() error {\n\treturn nil\n}\n\nfunc (any *uint64Any) ValueType() ValueType {\n\treturn NumberValue\n}\n\nfunc (any *uint64Any) MustBeValid() Any {\n\treturn any\n}\n\nfunc (any *uint64Any) ToBool() bool {\n\treturn any.val != 0\n}\n\nfunc (any *uint64Any) ToInt() int {\n\treturn int(any.val)\n}\n\nfunc (any *uint64Any) ToInt32() int32 {\n\treturn int32(any.val)\n}\n\nfunc (any *uint64Any) ToInt64() int64 {\n\treturn int64(any.val)\n}\n\nfunc (any *uint64Any) ToUint() uint {\n\treturn uint(any.val)\n}\n\nfunc (any *uint64Any) ToUint32() uint32 {\n\treturn uint32(any.val)\n}\n\nfunc (any *uint64Any) ToUint64() uint64 {\n\treturn any.val\n}\n\nfunc (any *uint64Any) ToFloat32() float32 {\n\treturn float32(any.val)\n}\n\nfunc (any *uint64Any) ToFloat64() float64 {\n\treturn float64(any.val)\n}\n\nfunc (any *uint64Any) ToString() string {\n\treturn strconv.FormatUint(any.val, 10)\n}\n\nfunc (any *uint64Any) WriteTo(stream *Stream) {\n\tstream.WriteUint64(any.val)\n}\n\nfunc (any *uint64Any) Parse() *Iterator {\n\treturn nil\n}\n\nfunc (any *uint64Any) GetInterface() interface{} {\n\treturn any.val\n}\n"
  },
  {
    "path": "api_tests/config_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_use_number_for_unmarshal(t *testing.T) {\n\tshould := require.New(t)\n\tapi := jsoniter.Config{UseNumber: true}.Froze()\n\tvar obj interface{}\n\tshould.Nil(api.UnmarshalFromString(\"123\", &obj))\n\tshould.Equal(json.Number(\"123\"), obj)\n}\n\nfunc Test_customize_float_marshal(t *testing.T) {\n\tshould := require.New(t)\n\tjson := jsoniter.Config{MarshalFloatWith6Digits: true}.Froze()\n\tstr, err := json.MarshalToString(float32(1.23456789))\n\tshould.Nil(err)\n\tshould.Equal(\"1.234568\", str)\n}\n\nfunc Test_customize_tag_key(t *testing.T) {\n\n\ttype TestObject struct {\n\t\tField string `orm:\"field\"`\n\t}\n\n\tshould := require.New(t)\n\tjson := jsoniter.Config{TagKey: \"orm\"}.Froze()\n\tstr, err := json.MarshalToString(TestObject{\"hello\"})\n\tshould.Nil(err)\n\tshould.Equal(`{\"field\":\"hello\"}`, str)\n}\n\nfunc Test_read_large_number_as_interface(t *testing.T) {\n\tshould := require.New(t)\n\tvar val interface{}\n\terr := jsoniter.Config{UseNumber: true}.Froze().UnmarshalFromString(`123456789123456789123456789`, &val)\n\tshould.Nil(err)\n\toutput, err := jsoniter.MarshalToString(val)\n\tshould.Nil(err)\n\tshould.Equal(`123456789123456789123456789`, output)\n}\n\ntype caseSensitiveStruct struct {\n\tA string `json:\"a\"`\n\tB string `json:\"b,omitempty\"`\n\tC *C     `json:\"C,omitempty\"`\n}\n\ntype C struct {\n\tD int64 `json:\"D,omitempty\"`\n\tE *E    `json:\"e,omitempty\"`\n}\n\ntype E struct {\n\tF string `json:\"F,omitempty\"`\n}\n\nfunc Test_CaseSensitive(t *testing.T) {\n\tshould := require.New(t)\n\n\ttestCases := []struct {\n\t\tinput          string\n\t\texpectedOutput string\n\t\tcaseSensitive  bool\n\t}{\n\t\t{\n\t\t\tinput:          `{\"A\":\"foo\",\"B\":\"bar\"}`,\n\t\t\texpectedOutput: `{\"a\":\"foo\",\"b\":\"bar\"}`,\n\t\t\tcaseSensitive:  false,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"a\":\"foo\",\"b\":\"bar\"}`,\n\t\t\texpectedOutput: `{\"a\":\"foo\",\"b\":\"bar\"}`,\n\t\t\tcaseSensitive:  true,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"a\":\"foo\",\"b\":\"bar\",\"C\":{\"D\":10}}`,\n\t\t\texpectedOutput: `{\"a\":\"foo\",\"b\":\"bar\",\"C\":{\"D\":10}}`,\n\t\t\tcaseSensitive:  true,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"a\":\"foo\",\"B\":\"bar\",\"c\":{\"d\":10}}`,\n\t\t\texpectedOutput: `{\"a\":\"foo\"}`,\n\t\t\tcaseSensitive:  true,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"a\":\"foo\",\"C\":{\"d\":10}}`,\n\t\t\texpectedOutput: `{\"a\":\"foo\",\"C\":{}}`,\n\t\t\tcaseSensitive:  true,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"a\":\"foo\",\"C\":{\"D\":10,\"e\":{\"f\":\"baz\"}}}`,\n\t\t\texpectedOutput: `{\"a\":\"foo\",\"C\":{\"D\":10,\"e\":{}}}`,\n\t\t\tcaseSensitive:  true,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"a\":\"foo\",\"C\":{\"D\":10,\"e\":{\"F\":\"baz\"}}}`,\n\t\t\texpectedOutput: `{\"a\":\"foo\",\"C\":{\"D\":10,\"e\":{\"F\":\"baz\"}}}`,\n\t\t\tcaseSensitive:  true,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"A\":\"foo\",\"c\":{\"d\":10,\"E\":{\"f\":\"baz\"}}}`,\n\t\t\texpectedOutput: `{\"a\":\"foo\",\"C\":{\"D\":10,\"e\":{\"F\":\"baz\"}}}`,\n\t\t\tcaseSensitive:  false,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tval := caseSensitiveStruct{}\n\t\terr := jsoniter.Config{CaseSensitive: tc.caseSensitive}.Froze().UnmarshalFromString(tc.input, &val)\n\t\tshould.Nil(err)\n\n\t\toutput, err := jsoniter.MarshalToString(val)\n\t\tshould.Nil(err)\n\t\tshould.Equal(tc.expectedOutput, output)\n\t}\n}\n\ntype structWithElevenFields struct {\n\tA string `json:\"A,omitempty\"`\n\tB string `json:\"B,omitempty\"`\n\tC string `json:\"C,omitempty\"`\n\tD string `json:\"d,omitempty\"`\n\tE string `json:\"e,omitempty\"`\n\tF string `json:\"f,omitempty\"`\n\tG string `json:\"g,omitempty\"`\n\tH string `json:\"h,omitempty\"`\n\tI string `json:\"i,omitempty\"`\n\tJ string `json:\"j,omitempty\"`\n\tK string `json:\"k,omitempty\"`\n}\n\nfunc Test_CaseSensitive_MoreThanTenFields(t *testing.T) {\n\tshould := require.New(t)\n\n\ttestCases := []struct {\n\t\tinput          string\n\t\texpectedOutput string\n\t\tcaseSensitive  bool\n\t}{\n\t\t{\n\t\t\tinput:          `{\"A\":\"1\",\"B\":\"2\",\"C\":\"3\",\"d\":\"4\",\"e\":\"5\",\"f\":\"6\",\"g\":\"7\",\"h\":\"8\",\"i\":\"9\",\"j\":\"10\",\"k\":\"11\"}`,\n\t\t\texpectedOutput: `{\"A\":\"1\",\"B\":\"2\",\"C\":\"3\",\"d\":\"4\",\"e\":\"5\",\"f\":\"6\",\"g\":\"7\",\"h\":\"8\",\"i\":\"9\",\"j\":\"10\",\"k\":\"11\"}`,\n\t\t\tcaseSensitive:  true,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"a\":\"1\",\"b\":\"2\",\"c\":\"3\",\"D\":\"4\",\"E\":\"5\",\"F\":\"6\"}`,\n\t\t\texpectedOutput: `{\"A\":\"1\",\"B\":\"2\",\"C\":\"3\",\"d\":\"4\",\"e\":\"5\",\"f\":\"6\"}`,\n\t\t\tcaseSensitive:  false,\n\t\t},\n\t\t{\n\t\t\tinput:          `{\"A\":\"1\",\"b\":\"2\",\"d\":\"4\",\"E\":\"5\"}`,\n\t\t\texpectedOutput: `{\"A\":\"1\",\"d\":\"4\"}`,\n\t\t\tcaseSensitive:  true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tval := structWithElevenFields{}\n\t\terr := jsoniter.Config{CaseSensitive: tc.caseSensitive}.Froze().UnmarshalFromString(tc.input, &val)\n\t\tshould.Nil(err)\n\n\t\toutput, err := jsoniter.MarshalToString(val)\n\t\tshould.Nil(err)\n\t\tshould.Equal(tc.expectedOutput, output)\n\t}\n}\n\ntype onlyTaggedFieldStruct struct {\n\tA      string `json:\"a\"`\n\tB      string\n\tFSimpl F `json:\"f_simpl\"`\n\tISimpl I\n\tFPtr   *F `json:\"f_ptr\"`\n\tIPtr   *I\n\tF\n\t*I\n}\n\ntype F struct {\n\tG string `json:\"g\"`\n\tH string\n}\n\ntype I struct {\n\tJ string `json:\"j\"`\n\tK string\n}\n\nfunc Test_OnlyTaggedField(t *testing.T) {\n\tshould := require.New(t)\n\n\tobj := onlyTaggedFieldStruct{\n\t\tA:      \"a\",\n\t\tB:      \"b\",\n\t\tFSimpl: F{G: \"g\", H: \"h\"},\n\t\tISimpl: I{J: \"j\", K: \"k\"},\n\t\tFPtr:   &F{G: \"g\", H: \"h\"},\n\t\tIPtr:   &I{J: \"j\", K: \"k\"},\n\t\tF:      F{G: \"g\", H: \"h\"},\n\t\tI:      &I{J: \"j\", K: \"k\"},\n\t}\n\n\toutput, err := jsoniter.Config{OnlyTaggedField: true}.Froze().Marshal(obj)\n\tshould.Nil(err)\n\n\tm := make(map[string]interface{})\n\terr = jsoniter.Unmarshal(output, &m)\n\tshould.Nil(err)\n\n\tshould.Equal(map[string]interface{}{\n\t\t\"a\": \"a\",\n\t\t\"f_simpl\": map[string]interface{}{\n\t\t\t\"g\": \"g\",\n\t\t},\n\t\t\"f_ptr\": map[string]interface{}{\n\t\t\t\"g\": \"g\",\n\t\t},\n\t\t\"g\": \"g\",\n\t\t\"j\": \"j\",\n\t}, m)\n}\n"
  },
  {
    "path": "api_tests/decoder_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"io/ioutil\"\n\t\"testing\"\n)\n\nfunc Test_disallowUnknownFields(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct{}\n\tvar obj TestObject\n\tdecoder := jsoniter.NewDecoder(bytes.NewBufferString(`{\"field1\":100}`))\n\tdecoder.DisallowUnknownFields()\n\tshould.Error(decoder.Decode(&obj))\n}\n\nfunc Test_new_decoder(t *testing.T) {\n\tshould := require.New(t)\n\tdecoder1 := json.NewDecoder(bytes.NewBufferString(`[1][2]`))\n\tdecoder2 := jsoniter.NewDecoder(bytes.NewBufferString(`[1][2]`))\n\tarr1 := []int{}\n\tshould.Nil(decoder1.Decode(&arr1))\n\tshould.Equal([]int{1}, arr1)\n\tarr2 := []int{}\n\tshould.True(decoder1.More())\n\tbuffered, _ := ioutil.ReadAll(decoder1.Buffered())\n\tshould.Equal(\"[2]\", string(buffered))\n\tshould.Nil(decoder2.Decode(&arr2))\n\tshould.Equal([]int{1}, arr2)\n\tshould.True(decoder2.More())\n\tbuffered, _ = ioutil.ReadAll(decoder2.Buffered())\n\tshould.Equal(\"[2]\", string(buffered))\n\n\tshould.Nil(decoder1.Decode(&arr1))\n\tshould.Equal([]int{2}, arr1)\n\tshould.False(decoder1.More())\n\tshould.Nil(decoder2.Decode(&arr2))\n\tshould.Equal([]int{2}, arr2)\n\tshould.False(decoder2.More())\n}\n\nfunc Test_use_number(t *testing.T) {\n\tshould := require.New(t)\n\tdecoder1 := json.NewDecoder(bytes.NewBufferString(`123`))\n\tdecoder1.UseNumber()\n\tdecoder2 := jsoniter.NewDecoder(bytes.NewBufferString(`123`))\n\tdecoder2.UseNumber()\n\tvar obj1 interface{}\n\tshould.Nil(decoder1.Decode(&obj1))\n\tshould.Equal(json.Number(\"123\"), obj1)\n\tvar obj2 interface{}\n\tshould.Nil(decoder2.Decode(&obj2))\n\tshould.Equal(json.Number(\"123\"), obj2)\n}\n\nfunc Test_decoder_more(t *testing.T) {\n\tshould := require.New(t)\n\tdecoder := jsoniter.NewDecoder(bytes.NewBufferString(\"abcde\"))\n\tshould.True(decoder.More())\n}\n"
  },
  {
    "path": "api_tests/encoder_18_test.go",
    "content": "//+build go1.8\n\npackage test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"testing\"\n\t\"unicode/utf8\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_new_encoder(t *testing.T) {\n\tshould := require.New(t)\n\tbuf1 := &bytes.Buffer{}\n\tencoder1 := json.NewEncoder(buf1)\n\tencoder1.SetEscapeHTML(false)\n\tencoder1.Encode([]int{1})\n\tshould.Equal(\"[1]\\n\", buf1.String())\n\tbuf2 := &bytes.Buffer{}\n\tencoder2 := jsoniter.NewEncoder(buf2)\n\tencoder2.SetEscapeHTML(false)\n\tencoder2.Encode([]int{1})\n\tshould.Equal(\"[1]\\n\", buf2.String())\n}\n\nfunc Test_string_encode_with_std_without_html_escape(t *testing.T) {\n\tapi := jsoniter.Config{EscapeHTML: false}.Froze()\n\tshould := require.New(t)\n\tfor i := 0; i < utf8.RuneSelf; i++ {\n\t\tinput := string([]byte{byte(i)})\n\t\tbuf := &bytes.Buffer{}\n\t\tencoder := json.NewEncoder(buf)\n\t\tencoder.SetEscapeHTML(false)\n\t\terr := encoder.Encode(input)\n\t\tshould.Nil(err)\n\t\tstdOutput := buf.String()\n\t\tstdOutput = stdOutput[:len(stdOutput)-1]\n\t\tjsoniterOutputBytes, err := api.Marshal(input)\n\t\tshould.Nil(err)\n\t\tjsoniterOutput := string(jsoniterOutputBytes)\n\t\tshould.Equal(stdOutput, jsoniterOutput)\n\t}\n}\n"
  },
  {
    "path": "api_tests/encoder_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\n// Standard Encoder has trailing newline.\nfunc TestEncoderHasTrailingNewline(t *testing.T) {\n\tshould := require.New(t)\n\tvar buf, stdbuf bytes.Buffer\n\tenc := jsoniter.ConfigCompatibleWithStandardLibrary.NewEncoder(&buf)\n\tenc.Encode(1)\n\tstdenc := json.NewEncoder(&stdbuf)\n\tstdenc.Encode(1)\n\tshould.Equal(stdbuf.Bytes(), buf.Bytes())\n}\n"
  },
  {
    "path": "api_tests/marshal_indent_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\nfunc Test_marshal_indent(t *testing.T) {\n\tshould := require.New(t)\n\tobj := struct {\n\t\tF1 int\n\t\tF2 []int\n\t}{1, []int{2, 3, 4}}\n\toutput, err := json.MarshalIndent(obj, \"\", \"  \")\n\tshould.Nil(err)\n\tshould.Equal(\"{\\n  \\\"F1\\\": 1,\\n  \\\"F2\\\": [\\n    2,\\n    3,\\n    4\\n  ]\\n}\", string(output))\n\toutput, err = jsoniter.MarshalIndent(obj, \"\", \"  \")\n\tshould.Nil(err)\n\tshould.Equal(\"{\\n  \\\"F1\\\": 1,\\n  \\\"F2\\\": [\\n    2,\\n    3,\\n    4\\n  ]\\n}\", string(output))\n}\n\nfunc Test_marshal_indent_map(t *testing.T) {\n\tshould := require.New(t)\n\tobj := map[int]int{1: 2}\n\toutput, err := json.MarshalIndent(obj, \"\", \"  \")\n\tshould.Nil(err)\n\tshould.Equal(\"{\\n  \\\"1\\\": 2\\n}\", string(output))\n\toutput, err = jsoniter.MarshalIndent(obj, \"\", \"  \")\n\tshould.Nil(err)\n\tshould.Equal(\"{\\n  \\\"1\\\": 2\\n}\", string(output))\n\toutput, err = jsoniter.ConfigCompatibleWithStandardLibrary.MarshalIndent(obj, \"\", \"  \")\n\tshould.Nil(err)\n\tshould.Equal(\"{\\n  \\\"1\\\": 2\\n}\", string(output))\n}\n"
  },
  {
    "path": "api_tests/marshal_json_escape_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"testing\"\n\n\tjsoniter \"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nvar marshalConfig = jsoniter.Config{\n\tEscapeHTML:             false,\n\tSortMapKeys:            true,\n\tValidateJsonRawMessage: true,\n}.Froze()\n\ntype Container struct {\n\tBar interface{}\n}\n\nfunc (c *Container) MarshalJSON() ([]byte, error) {\n\treturn marshalConfig.Marshal(&c.Bar)\n}\n\nfunc TestEncodeEscape(t *testing.T) {\n\tshould := require.New(t)\n\n\tcontainer := &Container{\n\t\tBar: []string{\"123<ab>\", \"ooo\"},\n\t}\n\tout, err := marshalConfig.Marshal(container)\n\tshould.Nil(err)\n\tbufout := string(out)\n\n\tvar stdbuf bytes.Buffer\n\tstdenc := json.NewEncoder(&stdbuf)\n\tstdenc.SetEscapeHTML(false)\n\terr = stdenc.Encode(container)\n\tshould.Nil(err)\n\tstdout := string(stdbuf.Bytes())\n\tif stdout[len(stdout)-1:] == \"\\n\" {\n\t\tstdout = stdout[:len(stdout)-1]\n\t}\n\n\tshould.Equal(stdout, bufout)\n}\n"
  },
  {
    "path": "api_tests/marshal_json_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"testing\"\n\t\"github.com/stretchr/testify/require\"\n)\n\n\ntype Foo struct {\n\tBar interface{}\n}\n\nfunc (f Foo) MarshalJSON() ([]byte, error) {\n\tvar buf bytes.Buffer\n\terr := json.NewEncoder(&buf).Encode(f.Bar)\n\treturn buf.Bytes(), err\n}\n\n\n// Standard Encoder has trailing newline.\nfunc TestEncodeMarshalJSON(t *testing.T) {\n\n\tfoo := Foo {\n\t\tBar: 123,\n\t}\n\tshould := require.New(t)\n\tvar buf, stdbuf bytes.Buffer\n\tenc := jsoniter.ConfigCompatibleWithStandardLibrary.NewEncoder(&buf)\n\tenc.Encode(foo)\n\tstdenc := json.NewEncoder(&stdbuf)\n\tstdenc.Encode(foo)\n\tshould.Equal(stdbuf.Bytes(), buf.Bytes())\n}\n"
  },
  {
    "path": "benchmarks/encode_string_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"github.com/json-iterator/go\"\n\t\"testing\"\n)\n\nfunc Benchmark_encode_string_with_SetEscapeHTML(b *testing.B) {\n\ttype V struct {\n\t\tS string\n\t\tB bool\n\t\tI int\n\t}\n\tvar json = jsoniter.ConfigCompatibleWithStandardLibrary\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tbuf := &bytes.Buffer{}\n\t\tenc := json.NewEncoder(buf)\n\t\tenc.SetEscapeHTML(true)\n\t\tif err := enc.Encode(V{S: \"s\", B: true, I: 233}); err != nil {\n\t\t\tb.Fatal(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "benchmarks/jsoniter_large_file_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"testing\"\n)\n\n//func Test_large_file(t *testing.T) {\n//\tfile, err := os.Open(\"/tmp/large-file.json\")\n//\tif err != nil {\n//\t\tt.Fatal(err)\n//\t}\n//\titer := Parse(file, 4096)\n//\tcount := 0\n//\tfor iter.ReadArray() {\n//\t\titer.Skip()\n//\t\tcount++\n//\t}\n//\tif count != 11351 {\n//\t\tt.Fatal(count)\n//\t}\n//}\n\nfunc init() {\n\tioutil.WriteFile(\"/tmp/large-file.json\", []byte(`[{\n  \"person\": {\n    \"id\": \"d50887ca-a6ce-4e59-b89f-14f0b5d03b03\",\n    \"name\": {\n      \"fullName\": \"Leonid Bugaev\",\n      \"givenName\": \"Leonid\",\n      \"familyName\": \"Bugaev\"\n    },\n    \"email\": \"leonsbox@gmail.com\",\n    \"gender\": \"male\",\n    \"location\": \"Saint Petersburg, Saint Petersburg, RU\",\n    \"geo\": {\n      \"city\": \"Saint Petersburg\",\n      \"state\": \"Saint Petersburg\",\n      \"country\": \"Russia\",\n      \"lat\": 59.9342802,\n      \"lng\": 30.3350986\n    },\n    \"bio\": \"Senior engineer at Granify.com\",\n    \"site\": \"http://flickfaver.com\",\n    \"avatar\": \"https://d1ts43dypk8bqh.cloudfront.net/v1/avatars/d50887ca-a6ce-4e59-b89f-14f0b5d03b03\",\n    \"employment\": {\n      \"name\": \"www.latera.ru\",\n      \"title\": \"Software Engineer\",\n      \"domain\": \"gmail.com\"\n    },\n    \"facebook\": {\n      \"handle\": \"leonid.bugaev\"\n    },\n    \"github\": {\n      \"handle\": \"buger\",\n      \"id\": 14009,\n      \"avatar\": \"https://avatars.githubusercontent.com/u/14009?v=3\",\n      \"company\": \"Granify\",\n      \"blog\": \"http://leonsbox.com\",\n      \"followers\": 95,\n      \"following\": 10\n    },\n    \"twitter\": {\n      \"handle\": \"flickfaver\",\n      \"id\": 77004410,\n      \"bio\": null,\n      \"followers\": 2,\n      \"following\": 1,\n      \"statuses\": 5,\n      \"favorites\": 0,\n      \"location\": \"\",\n      \"site\": \"http://flickfaver.com\",\n      \"avatar\": null\n    },\n    \"linkedin\": {\n      \"handle\": \"in/leonidbugaev\"\n    },\n    \"googleplus\": {\n      \"handle\": null\n    },\n    \"angellist\": {\n      \"handle\": \"leonid-bugaev\",\n      \"id\": 61541,\n      \"bio\": \"Senior engineer at Granify.com\",\n      \"blog\": \"http://buger.github.com\",\n      \"site\": \"http://buger.github.com\",\n      \"followers\": 41,\n      \"avatar\": \"https://d1qb2nb5cznatu.cloudfront.net/users/61541-medium_jpg?1405474390\"\n    },\n    \"klout\": {\n      \"handle\": null,\n      \"score\": null\n    },\n    \"foursquare\": {\n      \"handle\": null\n    },\n    \"aboutme\": {\n      \"handle\": \"leonid.bugaev\",\n      \"bio\": null,\n      \"avatar\": null\n    },\n    \"gravatar\": {\n      \"handle\": \"buger\",\n      \"urls\": [\n      ],\n      \"avatar\": \"http://1.gravatar.com/avatar/f7c8edd577d13b8930d5522f28123510\",\n      \"avatars\": [\n        {\n          \"url\": \"http://1.gravatar.com/avatar/f7c8edd577d13b8930d5522f28123510\",\n          \"type\": \"thumbnail\"\n        }\n      ]\n    },\n    \"fuzzy\": false\n  },\n  \"company\": \"hello\"\n}]`), 0666)\n}\n\n/*\n200000\t      8886 ns/op\t    4336 B/op\t       6 allocs/op\n50000\t     34244 ns/op\t    6744 B/op\t      14 allocs/op\n*/\nfunc Benchmark_jsoniter_large_file(b *testing.B) {\n\tb.ReportAllocs()\n\tfor n := 0; n < b.N; n++ {\n\t\tfile, _ := os.Open(\"/tmp/large-file.json\")\n\t\titer := jsoniter.Parse(jsoniter.ConfigDefault, file, 4096)\n\t\tcount := 0\n\t\titer.ReadArrayCB(func(iter *jsoniter.Iterator) bool {\n\t\t\t// Skip() is strict by default, use --tags jsoniter-sloppy to skip without validation\n\t\t\titer.Skip()\n\t\t\tcount++\n\t\t\treturn true\n\t\t})\n\t\tfile.Close()\n\t\tif iter.Error != nil {\n\t\t\tb.Error(iter.Error)\n\t\t}\n\t}\n}\n\nfunc Benchmark_json_large_file(b *testing.B) {\n\tb.ReportAllocs()\n\tfor n := 0; n < b.N; n++ {\n\t\tfile, _ := os.Open(\"/tmp/large-file.json\")\n\t\tbytes, _ := ioutil.ReadAll(file)\n\t\tfile.Close()\n\t\tresult := []struct{}{}\n\t\terr := json.Unmarshal(bytes, &result)\n\t\tif err != nil {\n\t\t\tb.Error(err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "benchmarks/stream_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"strconv\"\n\t\"testing\"\n\n\tjsoniter \"github.com/json-iterator/go\"\n)\n\nfunc Benchmark_stream_encode_big_object(b *testing.B) {\n\tvar buf bytes.Buffer\n\tvar stream = jsoniter.NewStream(jsoniter.ConfigDefault, &buf, 100)\n\tfor i := 0; i < b.N; i++ {\n\t\tbuf.Reset()\n\t\tstream.Reset(&buf)\n\t\tencodeObject(stream)\n\t\tif stream.Error != nil {\n\t\t\tb.Errorf(\"error: %+v\", stream.Error)\n\t\t}\n\t}\n}\n\nfunc TestEncodeObject(t *testing.T) {\n\tvar stream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 100)\n\tencodeObject(stream)\n\tif stream.Error != nil {\n\t\tt.Errorf(\"error encoding a test object: %+v\", stream.Error)\n\t\treturn\n\t}\n\tvar m = make(map[string]interface{})\n\tif err := jsoniter.Unmarshal(stream.Buffer(), &m); err != nil {\n\t\tt.Errorf(\"error unmarshaling a test object: %+v\", err)\n\t\treturn\n\t}\n}\n\nfunc encodeObject(stream *jsoniter.Stream) {\n\tstream.WriteObjectStart()\n\n\tstream.WriteObjectField(\"objectId\")\n\tstream.WriteUint64(8838243212)\n\n\tstream.WriteMore()\n\tstream.WriteObjectField(\"name\")\n\tstream.WriteString(\"Jane Doe\")\n\n\tstream.WriteMore()\n\tstream.WriteObjectField(\"address\")\n\tstream.WriteObjectStart()\n\tfor i, field := range addressFields {\n\t\tif i != 0 {\n\t\t\tstream.WriteMore()\n\t\t}\n\t\tstream.WriteObjectField(field.key)\n\t\tstream.WriteString(field.val)\n\t}\n\n\tstream.WriteMore()\n\tstream.WriteObjectField(\"geo\")\n\t{\n\t\tstream.WriteObjectStart()\n\t\tstream.WriteObjectField(\"latitude\")\n\t\tstream.WriteFloat64(-154.550817)\n\t\tstream.WriteMore()\n\t\tstream.WriteObjectField(\"longitude\")\n\t\tstream.WriteFloat64(-84.176159)\n\t\tstream.WriteObjectEnd()\n\n\t}\n\tstream.WriteObjectEnd()\n\n\tstream.WriteMore()\n\tstream.WriteObjectField(\"specialties\")\n\tstream.WriteArrayStart()\n\tfor i, s := range specialties {\n\t\tif i != 0 {\n\t\t\tstream.WriteMore()\n\t\t}\n\t\tstream.WriteString(s)\n\t}\n\tstream.WriteArrayEnd()\n\n\tstream.WriteMore()\n\tfor i, text := range longText {\n\t\tif i != 0 {\n\t\t\tstream.WriteMore()\n\t\t}\n\t\tstream.WriteObjectField(\"longText\" + strconv.Itoa(i))\n\t\tstream.WriteString(text)\n\t}\n\n\tfor i := 0; i < 25; i++ {\n\t\tnum := i * 18328\n\t\tstream.WriteMore()\n\t\tstream.WriteObjectField(\"integerField\" + strconv.Itoa(i))\n\t\tstream.WriteInt64(int64(num))\n\t}\n\n\tstream.WriteObjectEnd()\n}\n\ntype field struct{ key, val string }\n\nvar (\n\taddressFields = []field{\n\t\t{\"address1\", \"123 Example St\"},\n\t\t{\"address2\", \"Apartment 5D, Suite 3\"},\n\t\t{\"city\", \"Miami\"},\n\t\t{\"state\", \"FL\"},\n\t\t{\"postalCode\", \"33133\"},\n\t\t{\"country\", \"US\"},\n\t}\n\tspecialties = []string{\n\t\t\"Web Design\",\n\t\t\"Go Programming\",\n\t\t\"Tennis\",\n\t\t\"Cycling\",\n\t\t\"Mixed martial arts\",\n\t}\n\tlongText = []string{\n\t\t`Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`,\n\t\t`Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?`,\n\t\t`But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?`,\n\t\t`At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.`,\n\t\t`On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee the pain and trouble that are bound to ensue; and equal blame belongs to those who fail in their duty through weakness of will, which is the same as saying through shrinking from toil and pain. These cases are perfectly simple and easy to distinguish. In a free hour, when our power of choice is untrammelled and when nothing prevents our being able to do what we like best, every pleasure is to be welcomed and every pain avoided. But in certain circumstances and owing to the claims of duty or the obligations of business it will frequently occur that pleasures have to be repudiated and annoyances accepted. The wise man therefore always holds in these matters to this principle of selection: he rejects pleasures to secure other greater pleasures, or else he endures pains to avoid worse pains.`,\n\t}\n)\n"
  },
  {
    "path": "build.sh",
    "content": "#!/bin/bash\nset -e\nset -x\n\nif [ ! -d /tmp/build-golang/src/github.com/json-iterator ]; then\n    mkdir -p /tmp/build-golang/src/github.com/json-iterator\n    ln -s $PWD /tmp/build-golang/src/github.com/json-iterator/go\nfi\nexport GOPATH=/tmp/build-golang\ngo get -u github.com/golang/dep/cmd/dep\ncd /tmp/build-golang/src/github.com/json-iterator/go\nexec $GOPATH/bin/dep ensure -update\n"
  },
  {
    "path": "config.go",
    "content": "package jsoniter\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"reflect\"\n\t\"sync\"\n\t\"unsafe\"\n\n\t\"github.com/modern-go/concurrent\"\n\t\"github.com/modern-go/reflect2\"\n)\n\n// Config customize how the API should behave.\n// The API is created from Config by Froze.\ntype Config struct {\n\tIndentionStep                 int\n\tMarshalFloatWith6Digits       bool\n\tEscapeHTML                    bool\n\tSortMapKeys                   bool\n\tUseNumber                     bool\n\tDisallowUnknownFields         bool\n\tTagKey                        string\n\tOnlyTaggedField               bool\n\tValidateJsonRawMessage        bool\n\tObjectFieldMustBeSimpleString bool\n\tCaseSensitive                 bool\n}\n\n// API the public interface of this package.\n// Primary Marshal and Unmarshal.\ntype API interface {\n\tIteratorPool\n\tStreamPool\n\tMarshalToString(v interface{}) (string, error)\n\tMarshal(v interface{}) ([]byte, error)\n\tMarshalIndent(v interface{}, prefix, indent string) ([]byte, error)\n\tUnmarshalFromString(str string, v interface{}) error\n\tUnmarshal(data []byte, v interface{}) error\n\tGet(data []byte, path ...interface{}) Any\n\tNewEncoder(writer io.Writer) *Encoder\n\tNewDecoder(reader io.Reader) *Decoder\n\tValid(data []byte) bool\n\tRegisterExtension(extension Extension)\n\tDecoderOf(typ reflect2.Type) ValDecoder\n\tEncoderOf(typ reflect2.Type) ValEncoder\n}\n\n// ConfigDefault the default API\nvar ConfigDefault = Config{\n\tEscapeHTML: true,\n}.Froze()\n\n// ConfigCompatibleWithStandardLibrary tries to be 100% compatible with standard library behavior\nvar ConfigCompatibleWithStandardLibrary = Config{\n\tEscapeHTML:             true,\n\tSortMapKeys:            true,\n\tValidateJsonRawMessage: true,\n}.Froze()\n\n// ConfigFastest marshals float with only 6 digits precision\nvar ConfigFastest = Config{\n\tEscapeHTML:                    false,\n\tMarshalFloatWith6Digits:       true, // will lose precession\n\tObjectFieldMustBeSimpleString: true, // do not unescape object field\n}.Froze()\n\ntype frozenConfig struct {\n\tconfigBeforeFrozen            Config\n\tsortMapKeys                   bool\n\tindentionStep                 int\n\tobjectFieldMustBeSimpleString bool\n\tonlyTaggedField               bool\n\tdisallowUnknownFields         bool\n\tdecoderCache                  *concurrent.Map\n\tencoderCache                  *concurrent.Map\n\tencoderExtension              Extension\n\tdecoderExtension              Extension\n\textraExtensions               []Extension\n\tstreamPool                    *sync.Pool\n\titeratorPool                  *sync.Pool\n\tcaseSensitive                 bool\n}\n\nfunc (cfg *frozenConfig) initCache() {\n\tcfg.decoderCache = concurrent.NewMap()\n\tcfg.encoderCache = concurrent.NewMap()\n}\n\nfunc (cfg *frozenConfig) addDecoderToCache(cacheKey uintptr, decoder ValDecoder) {\n\tcfg.decoderCache.Store(cacheKey, decoder)\n}\n\nfunc (cfg *frozenConfig) addEncoderToCache(cacheKey uintptr, encoder ValEncoder) {\n\tcfg.encoderCache.Store(cacheKey, encoder)\n}\n\nfunc (cfg *frozenConfig) getDecoderFromCache(cacheKey uintptr) ValDecoder {\n\tdecoder, found := cfg.decoderCache.Load(cacheKey)\n\tif found {\n\t\treturn decoder.(ValDecoder)\n\t}\n\treturn nil\n}\n\nfunc (cfg *frozenConfig) getEncoderFromCache(cacheKey uintptr) ValEncoder {\n\tencoder, found := cfg.encoderCache.Load(cacheKey)\n\tif found {\n\t\treturn encoder.(ValEncoder)\n\t}\n\treturn nil\n}\n\nvar cfgCache = concurrent.NewMap()\n\nfunc getFrozenConfigFromCache(cfg Config) *frozenConfig {\n\tobj, found := cfgCache.Load(cfg)\n\tif found {\n\t\treturn obj.(*frozenConfig)\n\t}\n\treturn nil\n}\n\nfunc addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) {\n\tcfgCache.Store(cfg, frozenConfig)\n}\n\n// Froze forge API from config\nfunc (cfg Config) Froze() API {\n\tapi := &frozenConfig{\n\t\tsortMapKeys:                   cfg.SortMapKeys,\n\t\tindentionStep:                 cfg.IndentionStep,\n\t\tobjectFieldMustBeSimpleString: cfg.ObjectFieldMustBeSimpleString,\n\t\tonlyTaggedField:               cfg.OnlyTaggedField,\n\t\tdisallowUnknownFields:         cfg.DisallowUnknownFields,\n\t\tcaseSensitive:                 cfg.CaseSensitive,\n\t}\n\tapi.streamPool = &sync.Pool{\n\t\tNew: func() interface{} {\n\t\t\treturn NewStream(api, nil, 512)\n\t\t},\n\t}\n\tapi.iteratorPool = &sync.Pool{\n\t\tNew: func() interface{} {\n\t\t\treturn NewIterator(api)\n\t\t},\n\t}\n\tapi.initCache()\n\tencoderExtension := EncoderExtension{}\n\tdecoderExtension := DecoderExtension{}\n\tif cfg.MarshalFloatWith6Digits {\n\t\tapi.marshalFloatWith6Digits(encoderExtension)\n\t}\n\tif cfg.EscapeHTML {\n\t\tapi.escapeHTML(encoderExtension)\n\t}\n\tif cfg.UseNumber {\n\t\tapi.useNumber(decoderExtension)\n\t}\n\tif cfg.ValidateJsonRawMessage {\n\t\tapi.validateJsonRawMessage(encoderExtension)\n\t}\n\tapi.encoderExtension = encoderExtension\n\tapi.decoderExtension = decoderExtension\n\tapi.configBeforeFrozen = cfg\n\treturn api\n}\n\nfunc (cfg Config) frozeWithCacheReuse(extraExtensions []Extension) *frozenConfig {\n\tapi := getFrozenConfigFromCache(cfg)\n\tif api != nil {\n\t\treturn api\n\t}\n\tapi = cfg.Froze().(*frozenConfig)\n\tfor _, extension := range extraExtensions {\n\t\tapi.RegisterExtension(extension)\n\t}\n\taddFrozenConfigToCache(cfg, api)\n\treturn api\n}\n\nfunc (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) {\n\tencoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) {\n\t\trawMessage := *(*json.RawMessage)(ptr)\n\t\titer := cfg.BorrowIterator([]byte(rawMessage))\n\t\tdefer cfg.ReturnIterator(iter)\n\t\titer.Read()\n\t\tif iter.Error != nil && iter.Error != io.EOF {\n\t\t\tstream.WriteRaw(\"null\")\n\t\t} else {\n\t\t\tstream.WriteRaw(string(rawMessage))\n\t\t}\n\t}, func(ptr unsafe.Pointer) bool {\n\t\treturn len(*((*json.RawMessage)(ptr))) == 0\n\t}}\n\textension[reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()] = encoder\n\textension[reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()] = encoder\n}\n\nfunc (cfg *frozenConfig) useNumber(extension DecoderExtension) {\n\textension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) {\n\t\texitingValue := *((*interface{})(ptr))\n\t\tif exitingValue != nil && reflect.TypeOf(exitingValue).Kind() == reflect.Ptr {\n\t\t\titer.ReadVal(exitingValue)\n\t\t\treturn\n\t\t}\n\t\tif iter.WhatIsNext() == NumberValue {\n\t\t\t*((*interface{})(ptr)) = json.Number(iter.readNumberAsString())\n\t\t} else {\n\t\t\t*((*interface{})(ptr)) = iter.Read()\n\t\t}\n\t}}\n}\nfunc (cfg *frozenConfig) getTagKey() string {\n\ttagKey := cfg.configBeforeFrozen.TagKey\n\tif tagKey == \"\" {\n\t\treturn \"json\"\n\t}\n\treturn tagKey\n}\n\nfunc (cfg *frozenConfig) RegisterExtension(extension Extension) {\n\tcfg.extraExtensions = append(cfg.extraExtensions, extension)\n\tcopied := cfg.configBeforeFrozen\n\tcfg.configBeforeFrozen = copied\n}\n\ntype lossyFloat32Encoder struct {\n}\n\nfunc (encoder *lossyFloat32Encoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteFloat32Lossy(*((*float32)(ptr)))\n}\n\nfunc (encoder *lossyFloat32Encoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*float32)(ptr)) == 0\n}\n\ntype lossyFloat64Encoder struct {\n}\n\nfunc (encoder *lossyFloat64Encoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteFloat64Lossy(*((*float64)(ptr)))\n}\n\nfunc (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*float64)(ptr)) == 0\n}\n\n// EnableLossyFloatMarshalling keeps 10**(-6) precision\n// for float variables for better performance.\nfunc (cfg *frozenConfig) marshalFloatWith6Digits(extension EncoderExtension) {\n\t// for better performance\n\textension[reflect2.TypeOfPtr((*float32)(nil)).Elem()] = &lossyFloat32Encoder{}\n\textension[reflect2.TypeOfPtr((*float64)(nil)).Elem()] = &lossyFloat64Encoder{}\n}\n\ntype htmlEscapedStringEncoder struct {\n}\n\nfunc (encoder *htmlEscapedStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstr := *((*string)(ptr))\n\tstream.WriteStringWithHTMLEscaped(str)\n}\n\nfunc (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*string)(ptr)) == \"\"\n}\n\nfunc (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) {\n\tencoderExtension[reflect2.TypeOfPtr((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{}\n}\n\nfunc (cfg *frozenConfig) cleanDecoders() {\n\ttypeDecoders = map[string]ValDecoder{}\n\tfieldDecoders = map[string]ValDecoder{}\n\t*cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig))\n}\n\nfunc (cfg *frozenConfig) cleanEncoders() {\n\ttypeEncoders = map[string]ValEncoder{}\n\tfieldEncoders = map[string]ValEncoder{}\n\t*cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig))\n}\n\nfunc (cfg *frozenConfig) MarshalToString(v interface{}) (string, error) {\n\tstream := cfg.BorrowStream(nil)\n\tdefer cfg.ReturnStream(stream)\n\tstream.WriteVal(v)\n\tif stream.Error != nil {\n\t\treturn \"\", stream.Error\n\t}\n\treturn string(stream.Buffer()), nil\n}\n\nfunc (cfg *frozenConfig) Marshal(v interface{}) ([]byte, error) {\n\tstream := cfg.BorrowStream(nil)\n\tdefer cfg.ReturnStream(stream)\n\tstream.WriteVal(v)\n\tif stream.Error != nil {\n\t\treturn nil, stream.Error\n\t}\n\tresult := stream.Buffer()\n\tcopied := make([]byte, len(result))\n\tcopy(copied, result)\n\treturn copied, nil\n}\n\nfunc (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {\n\tif prefix != \"\" {\n\t\tpanic(\"prefix is not supported\")\n\t}\n\tfor _, r := range indent {\n\t\tif r != ' ' {\n\t\t\tpanic(\"indent can only be space\")\n\t\t}\n\t}\n\tnewCfg := cfg.configBeforeFrozen\n\tnewCfg.IndentionStep = len(indent)\n\treturn newCfg.frozeWithCacheReuse(cfg.extraExtensions).Marshal(v)\n}\n\nfunc (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error {\n\tdata := []byte(str)\n\titer := cfg.BorrowIterator(data)\n\tdefer cfg.ReturnIterator(iter)\n\titer.ReadVal(v)\n\tc := iter.nextToken()\n\tif c == 0 {\n\t\tif iter.Error == io.EOF {\n\t\t\treturn nil\n\t\t}\n\t\treturn iter.Error\n\t}\n\titer.ReportError(\"Unmarshal\", \"there are bytes left after unmarshal\")\n\treturn iter.Error\n}\n\nfunc (cfg *frozenConfig) Get(data []byte, path ...interface{}) Any {\n\titer := cfg.BorrowIterator(data)\n\tdefer cfg.ReturnIterator(iter)\n\treturn locatePath(iter, path)\n}\n\nfunc (cfg *frozenConfig) Unmarshal(data []byte, v interface{}) error {\n\titer := cfg.BorrowIterator(data)\n\tdefer cfg.ReturnIterator(iter)\n\titer.ReadVal(v)\n\tc := iter.nextToken()\n\tif c == 0 {\n\t\tif iter.Error == io.EOF {\n\t\t\treturn nil\n\t\t}\n\t\treturn iter.Error\n\t}\n\titer.ReportError(\"Unmarshal\", \"there are bytes left after unmarshal\")\n\treturn iter.Error\n}\n\nfunc (cfg *frozenConfig) NewEncoder(writer io.Writer) *Encoder {\n\tstream := NewStream(cfg, writer, 512)\n\treturn &Encoder{stream}\n}\n\nfunc (cfg *frozenConfig) NewDecoder(reader io.Reader) *Decoder {\n\titer := Parse(cfg, reader, 512)\n\treturn &Decoder{iter}\n}\n\nfunc (cfg *frozenConfig) Valid(data []byte) bool {\n\titer := cfg.BorrowIterator(data)\n\tdefer cfg.ReturnIterator(iter)\n\titer.Skip()\n\treturn iter.Error == nil\n}\n"
  },
  {
    "path": "example_test.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\nfunc ExampleMarshal() {\n\ttype ColorGroup struct {\n\t\tID     int\n\t\tName   string\n\t\tColors []string\n\t}\n\tgroup := ColorGroup{\n\t\tID:     1,\n\t\tName:   \"Reds\",\n\t\tColors: []string{\"Crimson\", \"Red\", \"Ruby\", \"Maroon\"},\n\t}\n\tb, err := Marshal(group)\n\tif err != nil {\n\t\tfmt.Println(\"error:\", err)\n\t}\n\tos.Stdout.Write(b)\n\t// Output:\n\t// {\"ID\":1,\"Name\":\"Reds\",\"Colors\":[\"Crimson\",\"Red\",\"Ruby\",\"Maroon\"]}\n}\n\nfunc ExampleUnmarshal() {\n\tvar jsonBlob = []byte(`[\n\t\t{\"Name\": \"Platypus\", \"Order\": \"Monotremata\"},\n\t\t{\"Name\": \"Quoll\",    \"Order\": \"Dasyuromorphia\"}\n\t]`)\n\ttype Animal struct {\n\t\tName  string\n\t\tOrder string\n\t}\n\tvar animals []Animal\n\terr := Unmarshal(jsonBlob, &animals)\n\tif err != nil {\n\t\tfmt.Println(\"error:\", err)\n\t}\n\tfmt.Printf(\"%+v\", animals)\n\t// Output:\n\t// [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]\n}\n\nfunc ExampleConfigFastest_Marshal() {\n\ttype ColorGroup struct {\n\t\tID     int\n\t\tName   string\n\t\tColors []string\n\t}\n\tgroup := ColorGroup{\n\t\tID:     1,\n\t\tName:   \"Reds\",\n\t\tColors: []string{\"Crimson\", \"Red\", \"Ruby\", \"Maroon\"},\n\t}\n\tstream := ConfigFastest.BorrowStream(nil)\n\tdefer ConfigFastest.ReturnStream(stream)\n\tstream.WriteVal(group)\n\tif stream.Error != nil {\n\t\tfmt.Println(\"error:\", stream.Error)\n\t}\n\tos.Stdout.Write(stream.Buffer())\n\t// Output:\n\t// {\"ID\":1,\"Name\":\"Reds\",\"Colors\":[\"Crimson\",\"Red\",\"Ruby\",\"Maroon\"]}\n}\n\nfunc ExampleConfigFastest_Unmarshal() {\n\tvar jsonBlob = []byte(`[\n\t\t{\"Name\": \"Platypus\", \"Order\": \"Monotremata\"},\n\t\t{\"Name\": \"Quoll\",    \"Order\": \"Dasyuromorphia\"}\n\t]`)\n\ttype Animal struct {\n\t\tName  string\n\t\tOrder string\n\t}\n\tvar animals []Animal\n\titer := ConfigFastest.BorrowIterator(jsonBlob)\n\tdefer ConfigFastest.ReturnIterator(iter)\n\titer.ReadVal(&animals)\n\tif iter.Error != nil {\n\t\tfmt.Println(\"error:\", iter.Error)\n\t}\n\tfmt.Printf(\"%+v\", animals)\n\t// Output:\n\t// [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]\n}\n\nfunc ExampleGet() {\n\tval := []byte(`{\"ID\":1,\"Name\":\"Reds\",\"Colors\":[\"Crimson\",\"Red\",\"Ruby\",\"Maroon\"]}`)\n\tfmt.Printf(Get(val, \"Colors\", 0).ToString())\n\t// Output:\n\t// Crimson\n}\n\nfunc ExampleMyKey() {\n\thello := MyKey(\"hello\")\n\toutput, _ := Marshal(map[*MyKey]string{&hello: \"world\"})\n\tfmt.Println(string(output))\n\tobj := map[*MyKey]string{}\n\tUnmarshal(output, &obj)\n\tfor k, v := range obj {\n\t\tfmt.Println(*k, v)\n\t}\n\t// Output:\n\t// {\"Hello\":\"world\"}\n\t// Hel world\n}\n\ntype MyKey string\n\nfunc (m *MyKey) MarshalText() ([]byte, error) {\n\treturn []byte(strings.Replace(string(*m), \"h\", \"H\", -1)), nil\n}\n\nfunc (m *MyKey) UnmarshalText(text []byte) error {\n\t*m = MyKey(text[:3])\n\treturn nil\n}\n"
  },
  {
    "path": "extension_tests/decoder_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"strconv\"\n\t\"testing\"\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc Test_customize_type_decoder(t *testing.T) {\n\tt.Skip()\n\tjsoniter.RegisterTypeDecoderFunc(\"time.Time\", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tt, err := time.ParseInLocation(\"2006-01-02 15:04:05\", iter.ReadString(), time.UTC)\n\t\tif err != nil {\n\t\t\titer.Error = err\n\t\t\treturn\n\t\t}\n\t\t*((*time.Time)(ptr)) = t\n\t})\n\t//defer jsoniter.ConfigDefault.(*frozenConfig).cleanDecoders()\n\tval := time.Time{}\n\terr := jsoniter.Unmarshal([]byte(`\"2016-12-05 08:43:28\"`), &val)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tyear, month, day := val.Date()\n\tif year != 2016 || month != 12 || day != 5 {\n\t\tt.Fatal(val)\n\t}\n}\n\nfunc Test_customize_byte_array_encoder(t *testing.T) {\n\tt.Skip()\n\t//jsoniter.ConfigDefault.(*frozenConfig).cleanEncoders()\n\tshould := require.New(t)\n\tjsoniter.RegisterTypeEncoderFunc(\"[]uint8\", func(ptr unsafe.Pointer, stream *jsoniter.Stream) {\n\t\tt := *((*[]byte)(ptr))\n\t\tstream.WriteString(string(t))\n\t}, nil)\n\t//defer jsoniter.ConfigDefault.(*frozenConfig).cleanEncoders()\n\tval := []byte(\"abc\")\n\tstr, err := jsoniter.MarshalToString(val)\n\tshould.Nil(err)\n\tshould.Equal(`\"abc\"`, str)\n}\n\ntype CustomEncoderAttachmentTestStruct struct {\n\tValue int32 `json:\"value\"`\n}\n\ntype CustomEncoderAttachmentTestStructEncoder struct {}\n\nfunc (c *CustomEncoderAttachmentTestStructEncoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) {\n\tattachVal, ok := stream.Attachment.(int)\n\tstream.WriteRaw(`\"`)\n\tstream.WriteRaw(fmt.Sprintf(\"%t %d\", ok, attachVal))\n\tstream.WriteRaw(`\"`)\n}\n\nfunc (c *CustomEncoderAttachmentTestStructEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn false\n}\n\nfunc Test_custom_encoder_attachment(t *testing.T) {\n\n\tjsoniter.RegisterTypeEncoder(\"test.CustomEncoderAttachmentTestStruct\", &CustomEncoderAttachmentTestStructEncoder{})\n\texpectedValue := 17\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.Config{SortMapKeys: true}.Froze(), buf, 4096)\n\tstream.Attachment = expectedValue\n\tval := map[string]CustomEncoderAttachmentTestStruct{\"a\": {}}\n\tstream.WriteVal(val)\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"{\\\"a\\\":\\\"true 17\\\"}\", buf.String())\n}\n\nfunc Test_customize_field_decoder(t *testing.T) {\n\ttype Tom struct {\n\t\tfield1 string\n\t}\n\tjsoniter.RegisterFieldDecoderFunc(\"jsoniter.Tom\", \"field1\", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\t*((*string)(ptr)) = strconv.Itoa(iter.ReadInt())\n\t})\n\t//defer jsoniter.ConfigDefault.(*frozenConfig).cleanDecoders()\n\ttom := Tom{}\n\terr := jsoniter.Unmarshal([]byte(`{\"field1\": 100}`), &tom)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n\nfunc Test_recursive_empty_interface_customization(t *testing.T) {\n\tt.Skip()\n\tvar obj interface{}\n\tjsoniter.RegisterTypeDecoderFunc(\"interface {}\", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tswitch iter.WhatIsNext() {\n\t\tcase jsoniter.NumberValue:\n\t\t\t*(*interface{})(ptr) = iter.ReadInt64()\n\t\tdefault:\n\t\t\t*(*interface{})(ptr) = iter.Read()\n\t\t}\n\t})\n\tshould := require.New(t)\n\tjsoniter.Unmarshal([]byte(\"[100]\"), &obj)\n\tshould.Equal([]interface{}{int64(100)}, obj)\n}\n\ntype MyInterface interface {\n\tHello() string\n}\n\ntype MyString string\n\nfunc (ms MyString) Hello() string {\n\treturn string(ms)\n}\n\nfunc Test_read_custom_interface(t *testing.T) {\n\tt.Skip()\n\tshould := require.New(t)\n\tvar val MyInterface\n\tjsoniter.RegisterTypeDecoderFunc(\"jsoniter.MyInterface\", func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\t*((*MyInterface)(ptr)) = MyString(iter.ReadString())\n\t})\n\terr := jsoniter.UnmarshalFromString(`\"hello\"`, &val)\n\tshould.Nil(err)\n\tshould.Equal(\"hello\", val.Hello())\n}\n\nconst flow1 = `\n{\"A\":\"hello\"}\n{\"A\":\"hello\"}\n{\"A\":\"hello\"}\n{\"A\":\"hello\"}\n{\"A\":\"hello\"}`\n\nconst flow2 = `\n{\"A\":\"hello\"}\n{\"A\":\"hello\"}\n{\"A\":\"hello\"}\n{\"A\":\"hello\"}\n{\"A\":\"hello\"}\n`\n\ntype (\n\tType1 struct {\n\t\tA string\n\t}\n\n\tType2 struct {\n\t\tA string\n\t}\n)\n\nfunc (t *Type2) UnmarshalJSON(data []byte) error {\n\treturn nil\n}\n\nfunc (t *Type2) MarshalJSON() ([]byte, error) {\n\treturn nil, nil\n}\n\nfunc TestType1NoFinalLF(t *testing.T) {\n\treader := bytes.NewReader([]byte(flow1))\n\tdec := jsoniter.NewDecoder(reader)\n\n\ti := 0\n\tfor dec.More() {\n\t\tdata := &Type1{}\n\t\tif err := dec.Decode(data); err != nil {\n\t\t\tt.Errorf(\"at %v got %v\", i, err)\n\t\t}\n\t\ti++\n\t}\n}\n\nfunc TestType1FinalLF(t *testing.T) {\n\treader := bytes.NewReader([]byte(flow2))\n\tdec := jsoniter.NewDecoder(reader)\n\n\ti := 0\n\tfor dec.More() {\n\t\tdata := &Type1{}\n\t\tif err := dec.Decode(data); err != nil {\n\t\t\tt.Errorf(\"at %v got %v\", i, err)\n\t\t}\n\t\ti++\n\t}\n}\n\nfunc TestType2NoFinalLF(t *testing.T) {\n\treader := bytes.NewReader([]byte(flow1))\n\tdec := jsoniter.NewDecoder(reader)\n\n\ti := 0\n\tfor dec.More() {\n\t\tdata := &Type2{}\n\t\tif err := dec.Decode(data); err != nil {\n\t\t\tt.Errorf(\"at %v got %v\", i, err)\n\t\t}\n\t\ti++\n\t}\n}\n\nfunc TestType2FinalLF(t *testing.T) {\n\treader := bytes.NewReader([]byte(flow2))\n\tdec := jsoniter.NewDecoder(reader)\n\n\ti := 0\n\tfor dec.More() {\n\t\tdata := &Type2{}\n\t\tif err := dec.Decode(data); err != nil {\n\t\t\tt.Errorf(\"at %v got %v\", i, err)\n\t\t}\n\t\ti++\n\t}\n}\n"
  },
  {
    "path": "extension_tests/extension_test.go",
    "content": "package test\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/modern-go/reflect2\"\n\t\"github.com/stretchr/testify/require\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"testing\"\n\t\"unsafe\"\n)\n\ntype TestObject1 struct {\n\tField1 string\n}\n\ntype testExtension struct {\n\tjsoniter.DummyExtension\n}\n\nfunc (extension *testExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {\n\tif structDescriptor.Type.String() != \"test.TestObject1\" {\n\t\treturn\n\t}\n\tbinding := structDescriptor.GetField(\"Field1\")\n\tbinding.Encoder = &funcEncoder{fun: func(ptr unsafe.Pointer, stream *jsoniter.Stream) {\n\t\tstr := *((*string)(ptr))\n\t\tval, _ := strconv.Atoi(str)\n\t\tstream.WriteInt(val)\n\t}}\n\tbinding.Decoder = &funcDecoder{func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\t*((*string)(ptr)) = strconv.Itoa(iter.ReadInt())\n\t}}\n\tbinding.ToNames = []string{\"field-1\"}\n\tbinding.FromNames = []string{\"field-1\"}\n}\n\nfunc Test_customize_field_by_extension(t *testing.T) {\n\tshould := require.New(t)\n\tcfg := jsoniter.Config{}.Froze()\n\tcfg.RegisterExtension(&testExtension{})\n\tobj := TestObject1{}\n\terr := cfg.UnmarshalFromString(`{\"field-1\": 100}`, &obj)\n\tshould.Nil(err)\n\tshould.Equal(\"100\", obj.Field1)\n\tstr, err := cfg.MarshalToString(obj)\n\tshould.Nil(err)\n\tshould.Equal(`{\"field-1\":100}`, str)\n}\n\nfunc Test_customize_map_key_encoder(t *testing.T) {\n\tshould := require.New(t)\n\tcfg := jsoniter.Config{}.Froze()\n\tcfg.RegisterExtension(&testMapKeyExtension{})\n\tm := map[int]int{1: 2}\n\toutput, err := cfg.MarshalToString(m)\n\tshould.NoError(err)\n\tshould.Equal(`{\"2\":2}`, output)\n\tm = map[int]int{}\n\tshould.NoError(cfg.UnmarshalFromString(output, &m))\n\tshould.Equal(map[int]int{1: 2}, m)\n}\n\ntype testMapKeyExtension struct {\n\tjsoniter.DummyExtension\n}\n\nfunc (extension *testMapKeyExtension) CreateMapKeyEncoder(typ reflect2.Type) jsoniter.ValEncoder {\n\tif typ.Kind() == reflect.Int {\n\t\treturn &funcEncoder{\n\t\t\tfun: func(ptr unsafe.Pointer, stream *jsoniter.Stream) {\n\t\t\t\tstream.WriteRaw(`\"`)\n\t\t\t\tstream.WriteInt(*(*int)(ptr) + 1)\n\t\t\t\tstream.WriteRaw(`\"`)\n\t\t\t},\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (extension *testMapKeyExtension) CreateMapKeyDecoder(typ reflect2.Type) jsoniter.ValDecoder {\n\tif typ.Kind() == reflect.Int {\n\t\treturn &funcDecoder{\n\t\t\tfun: func(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\t\t\ti, err := strconv.Atoi(iter.ReadString())\n\t\t\t\tif err != nil {\n\t\t\t\t\titer.ReportError(\"read map key\", err.Error())\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\ti--\n\t\t\t\t*(*int)(ptr) = i\n\t\t\t},\n\t\t}\n\t}\n\treturn nil\n}\n\ntype funcDecoder struct {\n\tfun jsoniter.DecoderFunc\n}\n\nfunc (decoder *funcDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\tdecoder.fun(ptr, iter)\n}\n\ntype funcEncoder struct {\n\tfun         jsoniter.EncoderFunc\n\tisEmptyFunc func(ptr unsafe.Pointer) bool\n}\n\nfunc (encoder *funcEncoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) {\n\tencoder.fun(ptr, stream)\n}\n\nfunc (encoder *funcEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\tif encoder.isEmptyFunc == nil {\n\t\treturn false\n\t}\n\treturn encoder.isEmptyFunc(ptr)\n}\n"
  },
  {
    "path": "extra/binary_as_string_codec.go",
    "content": "package extra\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/modern-go/reflect2\"\n\t\"unicode/utf8\"\n\t\"unsafe\"\n)\n\n// safeSet holds the value true if the ASCII character with the given array\n// position can be represented inside a JSON string without any further\n// escaping.\n//\n// All values are true except for the ASCII control characters (0-31), the\n// double quote (\"), and the backslash character (\"\\\").\nvar safeSet = [utf8.RuneSelf]bool{\n\t' ':      true,\n\t'!':      true,\n\t'\"':      false,\n\t'#':      true,\n\t'$':      true,\n\t'%':      true,\n\t'&':      true,\n\t'\\'':     true,\n\t'(':      true,\n\t')':      true,\n\t'*':      true,\n\t'+':      true,\n\t',':      true,\n\t'-':      true,\n\t'.':      true,\n\t'/':      true,\n\t'0':      true,\n\t'1':      true,\n\t'2':      true,\n\t'3':      true,\n\t'4':      true,\n\t'5':      true,\n\t'6':      true,\n\t'7':      true,\n\t'8':      true,\n\t'9':      true,\n\t':':      true,\n\t';':      true,\n\t'<':      true,\n\t'=':      true,\n\t'>':      true,\n\t'?':      true,\n\t'@':      true,\n\t'A':      true,\n\t'B':      true,\n\t'C':      true,\n\t'D':      true,\n\t'E':      true,\n\t'F':      true,\n\t'G':      true,\n\t'H':      true,\n\t'I':      true,\n\t'J':      true,\n\t'K':      true,\n\t'L':      true,\n\t'M':      true,\n\t'N':      true,\n\t'O':      true,\n\t'P':      true,\n\t'Q':      true,\n\t'R':      true,\n\t'S':      true,\n\t'T':      true,\n\t'U':      true,\n\t'V':      true,\n\t'W':      true,\n\t'X':      true,\n\t'Y':      true,\n\t'Z':      true,\n\t'[':      true,\n\t'\\\\':     false,\n\t']':      true,\n\t'^':      true,\n\t'_':      true,\n\t'`':      true,\n\t'a':      true,\n\t'b':      true,\n\t'c':      true,\n\t'd':      true,\n\t'e':      true,\n\t'f':      true,\n\t'g':      true,\n\t'h':      true,\n\t'i':      true,\n\t'j':      true,\n\t'k':      true,\n\t'l':      true,\n\t'm':      true,\n\t'n':      true,\n\t'o':      true,\n\t'p':      true,\n\t'q':      true,\n\t'r':      true,\n\t's':      true,\n\t't':      true,\n\t'u':      true,\n\t'v':      true,\n\t'w':      true,\n\t'x':      true,\n\t'y':      true,\n\t'z':      true,\n\t'{':      true,\n\t'|':      true,\n\t'}':      true,\n\t'~':      true,\n\t'\\u007f': true,\n}\n\nvar binaryType = reflect2.TypeOfPtr((*[]byte)(nil)).Elem()\n\ntype BinaryAsStringExtension struct {\n\tjsoniter.DummyExtension\n}\n\nfunc (extension *BinaryAsStringExtension) CreateEncoder(typ reflect2.Type) jsoniter.ValEncoder {\n\tif typ == binaryType {\n\t\treturn &binaryAsStringCodec{}\n\t}\n\treturn nil\n}\n\nfunc (extension *BinaryAsStringExtension) CreateDecoder(typ reflect2.Type) jsoniter.ValDecoder {\n\tif typ == binaryType {\n\t\treturn &binaryAsStringCodec{}\n\t}\n\treturn nil\n}\n\ntype binaryAsStringCodec struct {\n}\n\nfunc (codec *binaryAsStringCodec) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\trawBytes := iter.ReadStringAsSlice()\n\tbytes := make([]byte, 0, len(rawBytes))\n\tfor i := 0; i < len(rawBytes); i++ {\n\t\tb := rawBytes[i]\n\t\tif b == '\\\\' {\n\t\t\tb2 := rawBytes[i+1]\n\t\t\tif b2 != '\\\\' {\n\t\t\t\titer.ReportError(\"decode binary as string\", `\\\\x is only supported escape`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tb3 := rawBytes[i+2]\n\t\t\tif b3 != 'x' {\n\t\t\t\titer.ReportError(\"decode binary as string\", `\\\\x is only supported escape`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tb4 := rawBytes[i+3]\n\t\t\tb5 := rawBytes[i+4]\n\t\t\ti += 4\n\t\t\tb = readHex(iter, b4, b5)\n\t\t}\n\t\tbytes = append(bytes, b)\n\t}\n\t*(*[]byte)(ptr) = bytes\n}\nfunc (codec *binaryAsStringCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn len(*((*[]byte)(ptr))) == 0\n}\nfunc (codec *binaryAsStringCodec) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) {\n\tnewBuffer := writeBytes(stream.Buffer(), *(*[]byte)(ptr))\n\tstream.SetBuffer(newBuffer)\n}\n\nfunc readHex(iter *jsoniter.Iterator, b1, b2 byte) byte {\n\tvar ret byte\n\tif b1 >= '0' && b1 <= '9' {\n\t\tret = b1 - '0'\n\t} else if b1 >= 'a' && b1 <= 'f' {\n\t\tret = b1 - 'a' + 10\n\t} else {\n\t\titer.ReportError(\"read hex\", \"expects 0~9 or a~f, but found \"+string([]byte{b1}))\n\t\treturn 0\n\t}\n\tret *= 16\n\tif b2 >= '0' && b2 <= '9' {\n\t\tret += b2 - '0'\n\t} else if b2 >= 'a' && b2 <= 'f' {\n\t\tret += b2 - 'a' + 10\n\t} else {\n\t\titer.ReportError(\"read hex\", \"expects 0~9 or a~f, but found \"+string([]byte{b2}))\n\t\treturn 0\n\t}\n\treturn ret\n}\n\nvar hex = \"0123456789abcdef\"\n\nfunc writeBytes(space []byte, s []byte) []byte {\n\tspace = append(space, '\"')\n\t// write string, the fast path, without utf8 and escape support\n\tvar i int\n\tvar c byte\n\tfor i, c = range s {\n\t\tif c < utf8.RuneSelf && safeSet[c] {\n\t\t\tspace = append(space, c)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\tif i == len(s)-1 {\n\t\tspace = append(space, '\"')\n\t\treturn space\n\t}\n\treturn writeBytesSlowPath(space, s[i:])\n}\n\nfunc writeBytesSlowPath(space []byte, s []byte) []byte {\n\tstart := 0\n\t// for the remaining parts, we process them char by char\n\tvar i int\n\tvar b byte\n\tfor i, b = range s {\n\t\tif b >= utf8.RuneSelf {\n\t\t\tspace = append(space, '\\\\', '\\\\', 'x', hex[b>>4], hex[b&0xF])\n\t\t\tstart = i + 1\n\t\t\tcontinue\n\t\t}\n\t\tif safeSet[b] {\n\t\t\tcontinue\n\t\t}\n\t\tif start < i {\n\t\t\tspace = append(space, s[start:i]...)\n\t\t}\n\t\tspace = append(space, '\\\\', '\\\\', 'x', hex[b>>4], hex[b&0xF])\n\t\tstart = i + 1\n\t}\n\tif start < len(s) {\n\t\tspace = append(space, s[start:]...)\n\t}\n\treturn append(space, '\"')\n}\n"
  },
  {
    "path": "extra/binary_as_string_codec_test.go",
    "content": "package extra\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\nfunc init() {\n\tjsoniter.RegisterExtension(&BinaryAsStringExtension{})\n}\n\nfunc TestBinaryAsStringCodec(t *testing.T) {\n\tt.Run(\"safe set\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\toutput, err := jsoniter.Marshal([]byte(\"hello\"))\n\t\tshould.NoError(err)\n\t\tshould.Equal(`\"hello\"`, string(output))\n\t\tvar val []byte\n\t\tshould.NoError(jsoniter.Unmarshal(output, &val))\n\t\tshould.Equal(`hello`, string(val))\n\t})\n\tt.Run(\"non safe set\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\toutput, err := jsoniter.Marshal([]byte{1, 2, 3, 23})\n\t\tshould.NoError(err)\n\t\tshould.Equal(`\"\\\\x01\\\\x02\\\\x03\\\\x17\"`, string(output))\n\t\tvar val []byte\n\t\tshould.NoError(jsoniter.Unmarshal(output, &val))\n\t\tshould.Equal([]byte{1, 2, 3, 23}, val)\n\t})\n}\n"
  },
  {
    "path": "extra/fuzzy_decoder.go",
    "content": "package extra\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"math\"\n\t\"reflect\"\n\t\"strings\"\n\t\"unsafe\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/modern-go/reflect2\"\n)\n\nconst maxUint = ^uint(0)\nconst maxInt = int(maxUint >> 1)\nconst minInt = -maxInt - 1\n\n// RegisterFuzzyDecoders decode input from PHP with tolerance.\n// It will handle string/number auto conversation, and treat empty [] as empty struct.\nfunc RegisterFuzzyDecoders() {\n\tjsoniter.RegisterExtension(&tolerateEmptyArrayExtension{})\n\tjsoniter.RegisterTypeDecoder(\"string\", &fuzzyStringDecoder{})\n\tjsoniter.RegisterTypeDecoder(\"float32\", &fuzzyFloat32Decoder{})\n\tjsoniter.RegisterTypeDecoder(\"float64\", &fuzzyFloat64Decoder{})\n\tjsoniter.RegisterTypeDecoder(\"int\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(maxInt) || val < float64(minInt) {\n\t\t\t\titer.ReportError(\"fuzzy decode int\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*int)(ptr)) = int(val)\n\t\t} else {\n\t\t\t*((*int)(ptr)) = iter.ReadInt()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"uint\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(maxUint) || val < 0 {\n\t\t\t\titer.ReportError(\"fuzzy decode uint\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*uint)(ptr)) = uint(val)\n\t\t} else {\n\t\t\t*((*uint)(ptr)) = iter.ReadUint()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"int8\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(math.MaxInt8) || val < float64(math.MinInt8) {\n\t\t\t\titer.ReportError(\"fuzzy decode int8\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*int8)(ptr)) = int8(val)\n\t\t} else {\n\t\t\t*((*int8)(ptr)) = iter.ReadInt8()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"uint8\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(math.MaxUint8) || val < 0 {\n\t\t\t\titer.ReportError(\"fuzzy decode uint8\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*uint8)(ptr)) = uint8(val)\n\t\t} else {\n\t\t\t*((*uint8)(ptr)) = iter.ReadUint8()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"int16\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(math.MaxInt16) || val < float64(math.MinInt16) {\n\t\t\t\titer.ReportError(\"fuzzy decode int16\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*int16)(ptr)) = int16(val)\n\t\t} else {\n\t\t\t*((*int16)(ptr)) = iter.ReadInt16()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"uint16\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(math.MaxUint16) || val < 0 {\n\t\t\t\titer.ReportError(\"fuzzy decode uint16\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*uint16)(ptr)) = uint16(val)\n\t\t} else {\n\t\t\t*((*uint16)(ptr)) = iter.ReadUint16()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"int32\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(math.MaxInt32) || val < float64(math.MinInt32) {\n\t\t\t\titer.ReportError(\"fuzzy decode int32\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*int32)(ptr)) = int32(val)\n\t\t} else {\n\t\t\t*((*int32)(ptr)) = iter.ReadInt32()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"uint32\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(math.MaxUint32) || val < 0 {\n\t\t\t\titer.ReportError(\"fuzzy decode uint32\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*uint32)(ptr)) = uint32(val)\n\t\t} else {\n\t\t\t*((*uint32)(ptr)) = iter.ReadUint32()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"int64\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(math.MaxInt64) || val < float64(math.MinInt64) {\n\t\t\t\titer.ReportError(\"fuzzy decode int64\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*int64)(ptr)) = int64(val)\n\t\t} else {\n\t\t\t*((*int64)(ptr)) = iter.ReadInt64()\n\t\t}\n\t}})\n\tjsoniter.RegisterTypeDecoder(\"uint64\", &fuzzyIntegerDecoder{func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\t\tif isFloat {\n\t\t\tval := iter.ReadFloat64()\n\t\t\tif val > float64(math.MaxUint64) || val < 0 {\n\t\t\t\titer.ReportError(\"fuzzy decode uint64\", \"exceed range\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\t*((*uint64)(ptr)) = uint64(val)\n\t\t} else {\n\t\t\t*((*uint64)(ptr)) = iter.ReadUint64()\n\t\t}\n\t}})\n}\n\ntype tolerateEmptyArrayExtension struct {\n\tjsoniter.DummyExtension\n}\n\nfunc (extension *tolerateEmptyArrayExtension) DecorateDecoder(typ reflect2.Type, decoder jsoniter.ValDecoder) jsoniter.ValDecoder {\n\tif typ.Kind() == reflect.Struct || typ.Kind() == reflect.Map {\n\t\treturn &tolerateEmptyArrayDecoder{decoder}\n\t}\n\treturn decoder\n}\n\ntype tolerateEmptyArrayDecoder struct {\n\tvalDecoder jsoniter.ValDecoder\n}\n\nfunc (decoder *tolerateEmptyArrayDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\tif iter.WhatIsNext() == jsoniter.ArrayValue {\n\t\titer.Skip()\n\t\tnewIter := iter.Pool().BorrowIterator([]byte(\"{}\"))\n\t\tdefer iter.Pool().ReturnIterator(newIter)\n\t\tdecoder.valDecoder.Decode(ptr, newIter)\n\t} else {\n\t\tdecoder.valDecoder.Decode(ptr, iter)\n\t}\n}\n\ntype fuzzyStringDecoder struct {\n}\n\nfunc (decoder *fuzzyStringDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\tvalueType := iter.WhatIsNext()\n\tswitch valueType {\n\tcase jsoniter.NumberValue:\n\t\tvar number json.Number\n\t\titer.ReadVal(&number)\n\t\t*((*string)(ptr)) = string(number)\n\tcase jsoniter.StringValue:\n\t\t*((*string)(ptr)) = iter.ReadString()\n\tcase jsoniter.NilValue:\n\t\titer.Skip()\n\t\t*((*string)(ptr)) = \"\"\n\tdefault:\n\t\titer.ReportError(\"fuzzyStringDecoder\", \"not number or string\")\n\t}\n}\n\ntype fuzzyIntegerDecoder struct {\n\tfun func(isFloat bool, ptr unsafe.Pointer, iter *jsoniter.Iterator)\n}\n\nfunc (decoder *fuzzyIntegerDecoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\tvalueType := iter.WhatIsNext()\n\tvar str string\n\tswitch valueType {\n\tcase jsoniter.NumberValue:\n\t\tvar number json.Number\n\t\titer.ReadVal(&number)\n\t\tstr = string(number)\n\tcase jsoniter.StringValue:\n\t\tstr = iter.ReadString()\n\tcase jsoniter.BoolValue:\n\t\tif iter.ReadBool() {\n\t\t\tstr = \"1\"\n\t\t} else {\n\t\t\tstr = \"0\"\n\t\t}\n\tcase jsoniter.NilValue:\n\t\titer.Skip()\n\t\tstr = \"0\"\n\tdefault:\n\t\titer.ReportError(\"fuzzyIntegerDecoder\", \"not number or string\")\n\t}\n\tif len(str) == 0 {\n\t\tstr = \"0\"\n\t}\n\tnewIter := iter.Pool().BorrowIterator([]byte(str))\n\tdefer iter.Pool().ReturnIterator(newIter)\n\tisFloat := strings.IndexByte(str, '.') != -1\n\tdecoder.fun(isFloat, ptr, newIter)\n\tif newIter.Error != nil && newIter.Error != io.EOF {\n\t\titer.Error = newIter.Error\n\t}\n}\n\ntype fuzzyFloat32Decoder struct {\n}\n\nfunc (decoder *fuzzyFloat32Decoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\tvalueType := iter.WhatIsNext()\n\tvar str string\n\tswitch valueType {\n\tcase jsoniter.NumberValue:\n\t\t*((*float32)(ptr)) = iter.ReadFloat32()\n\tcase jsoniter.StringValue:\n\t\tstr = iter.ReadString()\n\t\tnewIter := iter.Pool().BorrowIterator([]byte(str))\n\t\tdefer iter.Pool().ReturnIterator(newIter)\n\t\t*((*float32)(ptr)) = newIter.ReadFloat32()\n\t\tif newIter.Error != nil && newIter.Error != io.EOF {\n\t\t\titer.Error = newIter.Error\n\t\t}\n\tcase jsoniter.BoolValue:\n\t\t// support bool to float32\n\t\tif iter.ReadBool() {\n\t\t\t*((*float32)(ptr)) = 1\n\t\t} else {\n\t\t\t*((*float32)(ptr)) = 0\n\t\t}\n\tcase jsoniter.NilValue:\n\t\titer.Skip()\n\t\t*((*float32)(ptr)) = 0\n\tdefault:\n\t\titer.ReportError(\"fuzzyFloat32Decoder\", \"not number or string\")\n\t}\n}\n\ntype fuzzyFloat64Decoder struct {\n}\n\nfunc (decoder *fuzzyFloat64Decoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\tvalueType := iter.WhatIsNext()\n\tvar str string\n\tswitch valueType {\n\tcase jsoniter.NumberValue:\n\t\t*((*float64)(ptr)) = iter.ReadFloat64()\n\tcase jsoniter.StringValue:\n\t\tstr = iter.ReadString()\n\t\tnewIter := iter.Pool().BorrowIterator([]byte(str))\n\t\tdefer iter.Pool().ReturnIterator(newIter)\n\t\t*((*float64)(ptr)) = newIter.ReadFloat64()\n\t\tif newIter.Error != nil && newIter.Error != io.EOF {\n\t\t\titer.Error = newIter.Error\n\t\t}\n\tcase jsoniter.BoolValue:\n\t\t// support bool to float64\n\t\tif iter.ReadBool() {\n\t\t\t*((*float64)(ptr)) = 1\n\t\t} else {\n\t\t\t*((*float64)(ptr)) = 0\n\t\t}\n\tcase jsoniter.NilValue:\n\t\titer.Skip()\n\t\t*((*float64)(ptr)) = 0\n\tdefault:\n\t\titer.ReportError(\"fuzzyFloat64Decoder\", \"not number or string\")\n\t}\n}\n"
  },
  {
    "path": "extra/fuzzy_decoder_test.go",
    "content": "package extra\n\nimport (\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc init() {\n\tRegisterFuzzyDecoders()\n}\n\nfunc Test_any_to_string(t *testing.T) {\n\tshould := require.New(t)\n\tvar val string\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(\"100\", val)\n\tshould.Nil(jsoniter.UnmarshalFromString(\"10\", &val))\n\tshould.Equal(\"10\", val)\n\tshould.Nil(jsoniter.UnmarshalFromString(\"10.1\", &val))\n\tshould.Equal(\"10.1\", val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(\"10.1\", val)\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n}\nfunc Test_any_to_int64(t *testing.T) {\n\tshould := require.New(t)\n\tvar val int64\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(int64(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(int64(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(int64(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(int64(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"\"`, &val))\n\tshould.Equal(int64(0), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(int64(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(int64(1), val)\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`-10`, &val))\n\tshould.Equal(int64(-10), val)\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\n\nfunc Test_any_to_int(t *testing.T) {\n\tshould := require.New(t)\n\tvar val int\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(100, val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(10, val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(10, val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(10, val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(0, val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(1, val)\n\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\n\nfunc Test_any_to_int16(t *testing.T) {\n\tshould := require.New(t)\n\tvar val int16\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(int16(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(int16(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(int16(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(int16(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(int16(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(int16(1), val)\n\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\n\nfunc Test_any_to_int32(t *testing.T) {\n\tshould := require.New(t)\n\tvar val int32\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(int32(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(int32(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(int32(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(int32(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(int32(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(int32(1), val)\n\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\n\nfunc Test_any_to_int8(t *testing.T) {\n\tshould := require.New(t)\n\tvar val int8\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(int8(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(int8(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(int8(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(int8(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(int8(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(int8(1), val)\n\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\n\nfunc Test_any_to_uint8(t *testing.T) {\n\tshould := require.New(t)\n\tvar val uint8\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(uint8(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(uint8(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(uint8(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(uint8(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(uint8(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(uint8(1), val)\n\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\n\nfunc Test_any_to_uint64(t *testing.T) {\n\tshould := require.New(t)\n\tvar val uint64\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(uint64(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(uint64(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(uint64(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(uint64(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(uint64(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(uint64(1), val)\n\n\t// TODO fix?\n\tshould.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))\n\tshould.Equal(uint64(0), val)\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\nfunc Test_any_to_uint32(t *testing.T) {\n\tshould := require.New(t)\n\tvar val uint32\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(uint32(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(uint32(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(uint32(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(uint32(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(uint32(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(uint32(1), val)\n\n\t// TODO fix?\n\tshould.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))\n\tshould.Equal(uint32(0), val)\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\nfunc Test_any_to_uint16(t *testing.T) {\n\tshould := require.New(t)\n\tvar val uint16\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(uint16(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(uint16(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(uint16(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(uint16(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(uint16(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(uint16(1), val)\n\n\t// TODO fix?\n\tshould.NotNil(jsoniter.UnmarshalFromString(`-10`, &val))\n\tshould.Equal(uint16(0), val)\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\nfunc Test_any_to_uint(t *testing.T) {\n\tshould := require.New(t)\n\tvar val uint\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(uint(100), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(uint(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(uint(10), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(uint(10), val)\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(uint(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(uint(1), val)\n\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n\t// large float to int\n\tshould.NotNil(jsoniter.UnmarshalFromString(`1234512345123451234512345.0`, &val))\n}\n\nfunc Test_any_to_float32(t *testing.T) {\n\tshould := require.New(t)\n\tvar val float32\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(float32(100), val)\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(float32(10.1), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(float32(10.1), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(float32(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(float32(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(float32(1), val)\n\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n}\n\nfunc Test_any_to_float64(t *testing.T) {\n\tshould := require.New(t)\n\tvar val float64\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"100\"`, &val))\n\tshould.Equal(float64(100), val)\n\n\tshould.Nil(jsoniter.UnmarshalFromString(`\"10.1\"`, &val))\n\tshould.Equal(float64(10.1), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10.1`, &val))\n\tshould.Equal(float64(10.1), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`10`, &val))\n\tshould.Equal(float64(10), val)\n\n\t// bool part\n\tshould.Nil(jsoniter.UnmarshalFromString(`false`, &val))\n\tshould.Equal(float64(0), val)\n\tshould.Nil(jsoniter.UnmarshalFromString(`true`, &val))\n\tshould.Equal(float64(1), val)\n\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"{}\", &val))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"[]\", &val))\n}\n\nfunc Test_empty_array_as_map(t *testing.T) {\n\tshould := require.New(t)\n\tvar val map[string]interface{}\n\tshould.Nil(jsoniter.UnmarshalFromString(`[]`, &val))\n\tshould.Equal(map[string]interface{}{}, val)\n}\n\nfunc Test_empty_array_as_object(t *testing.T) {\n\tshould := require.New(t)\n\tvar val struct{}\n\tshould.Nil(jsoniter.UnmarshalFromString(`[]`, &val))\n\tshould.Equal(struct{}{}, val)\n}\n\nfunc Test_bad_case(t *testing.T) {\n\tvar jsonstr = `\n{\n    \"extra_type\": 181760,\n    \"combo_type\": 0,\n    \"trigger_time_ms\": 1498800398000,\n    \"_create_time\": \"2017-06-16 11:21:39\",\n    \"_msg_type\": 41000\n}\n`\n\n\ttype OrderEventRequestParams struct {\n\t\tExtraType uint64 `json:\"extra_type\"`\n\t}\n\n\tvar a OrderEventRequestParams\n\terr := jsoniter.UnmarshalFromString(jsonstr, &a)\n\tshould := require.New(t)\n\tshould.Nil(err)\n}\n\nfunc Test_null_to_string(t *testing.T) {\n\tshould := require.New(t)\n\tbody := []byte(`null`)\n\tvar message string\n\terr := jsoniter.Unmarshal(body, &message)\n\tshould.NoError(err)\n}\n\nfunc Test_null_to_int(t *testing.T) {\n\tshould := require.New(t)\n\tbody := []byte(`null`)\n\tvar message int\n\terr := jsoniter.Unmarshal(body, &message)\n\tshould.NoError(err)\n}\n\nfunc Test_null_to_float32(t *testing.T) {\n\tshould := require.New(t)\n\tbody := []byte(`null`)\n\tvar message float32\n\terr := jsoniter.Unmarshal(body, &message)\n\tshould.NoError(err)\n}\n\nfunc Test_null_to_float64(t *testing.T) {\n\tshould := require.New(t)\n\tbody := []byte(`null`)\n\tvar message float64\n\terr := jsoniter.Unmarshal(body, &message)\n\tshould.NoError(err)\n}\n"
  },
  {
    "path": "extra/naming_strategy.go",
    "content": "package extra\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"strings\"\n\t\"unicode\"\n)\n\n// SetNamingStrategy rename struct fields uniformly\nfunc SetNamingStrategy(translate func(string) string) {\n\tjsoniter.RegisterExtension(&namingStrategyExtension{jsoniter.DummyExtension{}, translate})\n}\n\ntype namingStrategyExtension struct {\n\tjsoniter.DummyExtension\n\ttranslate func(string) string\n}\n\nfunc (extension *namingStrategyExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {\n\tfor _, binding := range structDescriptor.Fields {\n\t\tif unicode.IsLower(rune(binding.Field.Name()[0])) || binding.Field.Name()[0] == '_'{\n\t\t\tcontinue\n\t\t}\n\t\ttag, hastag := binding.Field.Tag().Lookup(\"json\")\n\t\tif hastag {\n\t\t\ttagParts := strings.Split(tag, \",\")\n\t\t\tif tagParts[0] == \"-\" {\n\t\t\t\tcontinue // hidden field\n\t\t\t}\n\t\t\tif tagParts[0] != \"\" {\n\t\t\t\tcontinue // field explicitly named\n\t\t\t}\n\t\t}\n\t\tbinding.ToNames = []string{extension.translate(binding.Field.Name())}\n\t\tbinding.FromNames = []string{extension.translate(binding.Field.Name())}\n\t}\n}\n\n// LowerCaseWithUnderscores one strategy to SetNamingStrategy for. It will change HelloWorld to hello_world.\nfunc LowerCaseWithUnderscores(name string) string {\n\tnewName := []rune{}\n\tfor i, c := range name {\n\t\tif i == 0 {\n\t\t\tnewName = append(newName, unicode.ToLower(c))\n\t\t} else {\n\t\t\tif unicode.IsUpper(c) {\n\t\t\t\tnewName = append(newName, '_')\n\t\t\t\tnewName = append(newName, unicode.ToLower(c))\n\t\t\t} else {\n\t\t\t\tnewName = append(newName, c)\n\t\t\t}\n\t\t}\n\t}\n\treturn string(newName)\n}\n"
  },
  {
    "path": "extra/naming_strategy_test.go",
    "content": "package extra\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\nfunc Test_lower_case_with_underscores(t *testing.T) {\n\tshould := require.New(t)\n\tshould.Equal(\"hello_world\", LowerCaseWithUnderscores(\"helloWorld\"))\n\tshould.Equal(\"hello_world\", LowerCaseWithUnderscores(\"HelloWorld\"))\n\tSetNamingStrategy(LowerCaseWithUnderscores)\n\toutput, err := jsoniter.Marshal(struct {\n\t\tUserName      string\n\t\tFirstLanguage string\n\t}{\n\t\tUserName:      \"taowen\",\n\t\tFirstLanguage: \"Chinese\",\n\t})\n\tshould.Nil(err)\n\tshould.Equal(`{\"user_name\":\"taowen\",\"first_language\":\"Chinese\"}`, string(output))\n}\n\nfunc Test_set_naming_strategy_with_overrides(t *testing.T) {\n\tshould := require.New(t)\n\tSetNamingStrategy(LowerCaseWithUnderscores)\n\toutput, err := jsoniter.Marshal(struct {\n\t\tUserName      string `json:\"UserName\"`\n\t\tFirstLanguage string\n\t}{\n\t\tUserName:      \"taowen\",\n\t\tFirstLanguage: \"Chinese\",\n\t})\n\tshould.Nil(err)\n\tshould.Equal(`{\"UserName\":\"taowen\",\"first_language\":\"Chinese\"}`, string(output))\n}\n\nfunc Test_set_naming_strategy_with_omitempty(t *testing.T) {\n\tshould := require.New(t)\n\tSetNamingStrategy(LowerCaseWithUnderscores)\n\toutput, err := jsoniter.Marshal(struct {\n\t\tUserName      string\n\t\tFirstLanguage string `json:\",omitempty\"`\n\t}{\n\t\tUserName: \"taowen\",\n\t})\n\tshould.Nil(err)\n\tshould.Equal(`{\"user_name\":\"taowen\"}`, string(output))\n}\n\nfunc Test_set_naming_strategy_with_private_field(t *testing.T) {\n\tshould := require.New(t)\n\tSetNamingStrategy(LowerCaseWithUnderscores)\n\toutput, err := jsoniter.Marshal(struct {\n\t\tUserName string\n\t\tuserId   int\n\t\t_UserAge int\n\t}{\n\t\tUserName: \"allen\",\n\t\tuserId:   100,\n\t\t_UserAge: 30,\n\t})\n\tshould.Nil(err)\n\tshould.Equal(`{\"user_name\":\"allen\"}`, string(output))\n}\n"
  },
  {
    "path": "extra/privat_fields.go",
    "content": "package extra\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"strings\"\n\t\"unicode\"\n)\n\n// SupportPrivateFields include private fields when encoding/decoding\nfunc SupportPrivateFields() {\n\tjsoniter.RegisterExtension(&privateFieldsExtension{})\n}\n\ntype privateFieldsExtension struct {\n\tjsoniter.DummyExtension\n}\n\nfunc (extension *privateFieldsExtension) UpdateStructDescriptor(structDescriptor *jsoniter.StructDescriptor) {\n\tfor _, binding := range structDescriptor.Fields {\n\t\tisPrivate := unicode.IsLower(rune(binding.Field.Name()[0]))\n\t\tif isPrivate {\n\t\t\ttag, hastag := binding.Field.Tag().Lookup(\"json\")\n\t\t\tif !hastag {\n\t\t\t\tbinding.FromNames = []string{binding.Field.Name()}\n\t\t\t\tbinding.ToNames = []string{binding.Field.Name()}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttagParts := strings.Split(tag, \",\")\n\t\t\tnames := calcFieldNames(binding.Field.Name(), tagParts[0], tag)\n\t\t\tbinding.FromNames = names\n\t\t\tbinding.ToNames = names\n\t\t}\n\t}\n}\n\nfunc calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string {\n\t// ignore?\n\tif wholeTag == \"-\" {\n\t\treturn []string{}\n\t}\n\t// rename?\n\tvar fieldNames []string\n\tif tagProvidedFieldName == \"\" {\n\t\tfieldNames = []string{originalFieldName}\n\t} else {\n\t\tfieldNames = []string{tagProvidedFieldName}\n\t}\n\t// private?\n\tisNotExported := unicode.IsLower(rune(originalFieldName[0]))\n\tif isNotExported {\n\t\tfieldNames = []string{}\n\t}\n\treturn fieldNames\n}\n"
  },
  {
    "path": "extra/private_fields_test.go",
    "content": "package extra\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\nfunc Test_private_fields(t *testing.T) {\n\ttype TestObject struct {\n\t\tfield1 string\n\t}\n\tSupportPrivateFields()\n\tshould := require.New(t)\n\tobj := TestObject{}\n\tshould.Nil(jsoniter.UnmarshalFromString(`{\"field1\":\"Hello\"}`, &obj))\n\tshould.Equal(\"Hello\", obj.field1)\n}\n"
  },
  {
    "path": "extra/time_as_int64_codec.go",
    "content": "package extra\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"time\"\n\t\"unsafe\"\n)\n\n// RegisterTimeAsInt64Codec encode/decode time since number of unit since epoch. the precision is the unit.\nfunc RegisterTimeAsInt64Codec(precision time.Duration) {\n\tjsoniter.RegisterTypeEncoder(\"time.Time\", &timeAsInt64Codec{precision})\n\tjsoniter.RegisterTypeDecoder(\"time.Time\", &timeAsInt64Codec{precision})\n}\n\ntype timeAsInt64Codec struct {\n\tprecision time.Duration\n}\n\nfunc (codec *timeAsInt64Codec) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) {\n\tnanoseconds := iter.ReadInt64() * codec.precision.Nanoseconds()\n\t*((*time.Time)(ptr)) = time.Unix(0, nanoseconds)\n}\n\nfunc (codec *timeAsInt64Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\tts := *((*time.Time)(ptr))\n\treturn ts.UnixNano() == 0\n}\nfunc (codec *timeAsInt64Codec) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) {\n\tts := *((*time.Time)(ptr))\n\tstream.WriteInt64(ts.UnixNano() / codec.precision.Nanoseconds())\n}\n"
  },
  {
    "path": "extra/time_as_int64_codec_test.go",
    "content": "package extra\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n\t\"time\"\n)\n\nfunc Test_time_as_int64(t *testing.T) {\n\tshould := require.New(t)\n\tRegisterTimeAsInt64Codec(time.Nanosecond)\n\toutput, err := jsoniter.Marshal(time.Unix(1497952257, 1002))\n\tshould.Nil(err)\n\tshould.Equal(\"1497952257000001002\", string(output))\n\tvar val time.Time\n\tshould.Nil(jsoniter.Unmarshal(output, &val))\n\tshould.Equal(int64(1497952257000001002), val.UnixNano())\n}\n\nfunc Test_time_as_int64_keep_microsecond(t *testing.T) {\n\tt.Skip(\"conflict\")\n\tshould := require.New(t)\n\tRegisterTimeAsInt64Codec(time.Microsecond)\n\toutput, err := jsoniter.Marshal(time.Unix(1, 1002))\n\tshould.Nil(err)\n\tshould.Equal(\"1000001\", string(output))\n\tvar val time.Time\n\tshould.Nil(jsoniter.Unmarshal(output, &val))\n\tshould.Equal(int64(1000001000), val.UnixNano())\n}\n"
  },
  {
    "path": "fuzzy_mode_convert_table.md",
    "content": "| json type \\ dest type | bool | int | uint | float |string|\n| --- | --- | --- | --- |--|--|\n| number | positive => true <br/> negative => true <br/> zero => false| 23.2 => 23 <br/> -32.1 => -32| 12.1 => 12 <br/> -12.1 => 0|as normal|same as origin|\n| string | empty string => false <br/> string \"0\" => false <br/> other strings => true | \"123.32\" => 123 <br/> \"-123.4\" => -123 <br/> \"123.23xxxw\" => 123 <br/>  \"abcde12\" => 0 <br/> \"-32.1\" => -32| 13.2 => 13 <br/> -1.1 => 0 |12.1 => 12.1 <br/> -12.3 => -12.3<br/> 12.4xxa => 12.4 <br/> +1.1e2 =>110 |same as origin|\n| bool | true => true <br/> false => false| true => 1 <br/> false => 0 | true => 1 <br/> false => 0 |true => 1 <br/>false => 0|true => \"true\" <br/> false => \"false\"|\n| object | true | 0 | 0 |0|originnal json|\n| array | empty array => false <br/> nonempty array => true| [] => 0 <br/> [1,2] => 1 | [] => 0 <br/> [1,2] => 1 |[] => 0<br/>[1,2] => 1|original json|"
  },
  {
    "path": "go.mod",
    "content": "module github.com/json-iterator/go\n\ngo 1.12\n\nrequire (\n\tgithub.com/davecgh/go-spew v1.1.1\n\tgithub.com/google/gofuzz v1.0.0\n\tgithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421\n\tgithub.com/modern-go/reflect2 v1.0.2\n\tgithub.com/stretchr/testify v1.8.0\n)\n"
  },
  {
    "path": "go.sum",
    "content": "github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "iter.go",
    "content": "package jsoniter\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n)\n\n// ValueType the type for JSON element\ntype ValueType int\n\nconst (\n\t// InvalidValue invalid JSON element\n\tInvalidValue ValueType = iota\n\t// StringValue JSON element \"string\"\n\tStringValue\n\t// NumberValue JSON element 100 or 0.10\n\tNumberValue\n\t// NilValue JSON element null\n\tNilValue\n\t// BoolValue JSON element true or false\n\tBoolValue\n\t// ArrayValue JSON element []\n\tArrayValue\n\t// ObjectValue JSON element {}\n\tObjectValue\n)\n\nvar hexDigits []byte\nvar valueTypes []ValueType\n\nfunc init() {\n\thexDigits = make([]byte, 256)\n\tfor i := 0; i < len(hexDigits); i++ {\n\t\thexDigits[i] = 255\n\t}\n\tfor i := '0'; i <= '9'; i++ {\n\t\thexDigits[i] = byte(i - '0')\n\t}\n\tfor i := 'a'; i <= 'f'; i++ {\n\t\thexDigits[i] = byte((i - 'a') + 10)\n\t}\n\tfor i := 'A'; i <= 'F'; i++ {\n\t\thexDigits[i] = byte((i - 'A') + 10)\n\t}\n\tvalueTypes = make([]ValueType, 256)\n\tfor i := 0; i < len(valueTypes); i++ {\n\t\tvalueTypes[i] = InvalidValue\n\t}\n\tvalueTypes['\"'] = StringValue\n\tvalueTypes['-'] = NumberValue\n\tvalueTypes['0'] = NumberValue\n\tvalueTypes['1'] = NumberValue\n\tvalueTypes['2'] = NumberValue\n\tvalueTypes['3'] = NumberValue\n\tvalueTypes['4'] = NumberValue\n\tvalueTypes['5'] = NumberValue\n\tvalueTypes['6'] = NumberValue\n\tvalueTypes['7'] = NumberValue\n\tvalueTypes['8'] = NumberValue\n\tvalueTypes['9'] = NumberValue\n\tvalueTypes['t'] = BoolValue\n\tvalueTypes['f'] = BoolValue\n\tvalueTypes['n'] = NilValue\n\tvalueTypes['['] = ArrayValue\n\tvalueTypes['{'] = ObjectValue\n}\n\n// Iterator is a io.Reader like object, with JSON specific read functions.\n// Error is not returned as return value, but stored as Error member on this iterator instance.\ntype Iterator struct {\n\tcfg              *frozenConfig\n\treader           io.Reader\n\tbuf              []byte\n\thead             int\n\ttail             int\n\tdepth            int\n\tcaptureStartedAt int\n\tcaptured         []byte\n\tError            error\n\tAttachment       interface{} // open for customized decoder\n}\n\n// NewIterator creates an empty Iterator instance\nfunc NewIterator(cfg API) *Iterator {\n\treturn &Iterator{\n\t\tcfg:    cfg.(*frozenConfig),\n\t\treader: nil,\n\t\tbuf:    nil,\n\t\thead:   0,\n\t\ttail:   0,\n\t\tdepth:  0,\n\t}\n}\n\n// Parse creates an Iterator instance from io.Reader\nfunc Parse(cfg API, reader io.Reader, bufSize int) *Iterator {\n\treturn &Iterator{\n\t\tcfg:    cfg.(*frozenConfig),\n\t\treader: reader,\n\t\tbuf:    make([]byte, bufSize),\n\t\thead:   0,\n\t\ttail:   0,\n\t\tdepth:  0,\n\t}\n}\n\n// ParseBytes creates an Iterator instance from byte array\nfunc ParseBytes(cfg API, input []byte) *Iterator {\n\treturn &Iterator{\n\t\tcfg:    cfg.(*frozenConfig),\n\t\treader: nil,\n\t\tbuf:    input,\n\t\thead:   0,\n\t\ttail:   len(input),\n\t\tdepth:  0,\n\t}\n}\n\n// ParseString creates an Iterator instance from string\nfunc ParseString(cfg API, input string) *Iterator {\n\treturn ParseBytes(cfg, []byte(input))\n}\n\n// Pool returns a pool can provide more iterator with same configuration\nfunc (iter *Iterator) Pool() IteratorPool {\n\treturn iter.cfg\n}\n\n// Reset reuse iterator instance by specifying another reader\nfunc (iter *Iterator) Reset(reader io.Reader) *Iterator {\n\titer.reader = reader\n\titer.head = 0\n\titer.tail = 0\n\titer.depth = 0\n\treturn iter\n}\n\n// ResetBytes reuse iterator instance by specifying another byte array as input\nfunc (iter *Iterator) ResetBytes(input []byte) *Iterator {\n\titer.reader = nil\n\titer.buf = input\n\titer.head = 0\n\titer.tail = len(input)\n\titer.depth = 0\n\treturn iter\n}\n\n// WhatIsNext gets ValueType of relatively next json element\nfunc (iter *Iterator) WhatIsNext() ValueType {\n\tvalueType := valueTypes[iter.nextToken()]\n\titer.unreadByte()\n\treturn valueType\n}\n\nfunc (iter *Iterator) skipWhitespacesWithoutLoadMore() bool {\n\tfor i := iter.head; i < iter.tail; i++ {\n\t\tc := iter.buf[i]\n\t\tswitch c {\n\t\tcase ' ', '\\n', '\\t', '\\r':\n\t\t\tcontinue\n\t\t}\n\t\titer.head = i\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (iter *Iterator) isObjectEnd() bool {\n\tc := iter.nextToken()\n\tif c == ',' {\n\t\treturn false\n\t}\n\tif c == '}' {\n\t\treturn true\n\t}\n\titer.ReportError(\"isObjectEnd\", \"object ended prematurely, unexpected char \"+string([]byte{c}))\n\treturn true\n}\n\nfunc (iter *Iterator) nextToken() byte {\n\t// a variation of skip whitespaces, returning the next non-whitespace token\n\tfor {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\tc := iter.buf[i]\n\t\t\tswitch c {\n\t\t\tcase ' ', '\\n', '\\t', '\\r':\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\titer.head = i + 1\n\t\t\treturn c\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\treturn 0\n\t\t}\n\t}\n}\n\n// ReportError record a error in iterator instance with current position.\nfunc (iter *Iterator) ReportError(operation string, msg string) {\n\tif iter.Error != nil {\n\t\tif iter.Error != io.EOF {\n\t\t\treturn\n\t\t}\n\t}\n\tpeekStart := iter.head - 10\n\tif peekStart < 0 {\n\t\tpeekStart = 0\n\t}\n\tpeekEnd := iter.head + 10\n\tif peekEnd > iter.tail {\n\t\tpeekEnd = iter.tail\n\t}\n\tparsing := string(iter.buf[peekStart:peekEnd])\n\tcontextStart := iter.head - 50\n\tif contextStart < 0 {\n\t\tcontextStart = 0\n\t}\n\tcontextEnd := iter.head + 50\n\tif contextEnd > iter.tail {\n\t\tcontextEnd = iter.tail\n\t}\n\tcontext := string(iter.buf[contextStart:contextEnd])\n\titer.Error = fmt.Errorf(\"%s: %s, error found in #%v byte of ...|%s|..., bigger context ...|%s|...\",\n\t\toperation, msg, iter.head-peekStart, parsing, context)\n}\n\n// CurrentBuffer gets current buffer as string for debugging purpose\nfunc (iter *Iterator) CurrentBuffer() string {\n\tpeekStart := iter.head - 10\n\tif peekStart < 0 {\n\t\tpeekStart = 0\n\t}\n\treturn fmt.Sprintf(\"parsing #%v byte, around ...|%s|..., whole buffer ...|%s|...\", iter.head,\n\t\tstring(iter.buf[peekStart:iter.head]), string(iter.buf[0:iter.tail]))\n}\n\nfunc (iter *Iterator) readByte() (ret byte) {\n\tif iter.head == iter.tail {\n\t\tif iter.loadMore() {\n\t\t\tret = iter.buf[iter.head]\n\t\t\titer.head++\n\t\t\treturn ret\n\t\t}\n\t\treturn 0\n\t}\n\tret = iter.buf[iter.head]\n\titer.head++\n\treturn ret\n}\n\nfunc (iter *Iterator) loadMore() bool {\n\tif iter.reader == nil {\n\t\tif iter.Error == nil {\n\t\t\titer.head = iter.tail\n\t\t\titer.Error = io.EOF\n\t\t}\n\t\treturn false\n\t}\n\tif iter.captured != nil {\n\t\titer.captured = append(iter.captured,\n\t\t\titer.buf[iter.captureStartedAt:iter.tail]...)\n\t\titer.captureStartedAt = 0\n\t}\n\tfor {\n\t\tn, err := iter.reader.Read(iter.buf)\n\t\tif n == 0 {\n\t\t\tif err != nil {\n\t\t\t\tif iter.Error == nil {\n\t\t\t\t\titer.Error = err\n\t\t\t\t}\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\titer.head = 0\n\t\t\titer.tail = n\n\t\t\treturn true\n\t\t}\n\t}\n}\n\nfunc (iter *Iterator) unreadByte() {\n\tif iter.Error != nil {\n\t\treturn\n\t}\n\titer.head--\n\treturn\n}\n\n// Read read the next JSON element as generic interface{}.\nfunc (iter *Iterator) Read() interface{} {\n\tvalueType := iter.WhatIsNext()\n\tswitch valueType {\n\tcase StringValue:\n\t\treturn iter.ReadString()\n\tcase NumberValue:\n\t\tif iter.cfg.configBeforeFrozen.UseNumber {\n\t\t\treturn json.Number(iter.readNumberAsString())\n\t\t}\n\t\treturn iter.ReadFloat64()\n\tcase NilValue:\n\t\titer.skipFourBytes('n', 'u', 'l', 'l')\n\t\treturn nil\n\tcase BoolValue:\n\t\treturn iter.ReadBool()\n\tcase ArrayValue:\n\t\tarr := []interface{}{}\n\t\titer.ReadArrayCB(func(iter *Iterator) bool {\n\t\t\tvar elem interface{}\n\t\t\titer.ReadVal(&elem)\n\t\t\tarr = append(arr, elem)\n\t\t\treturn true\n\t\t})\n\t\treturn arr\n\tcase ObjectValue:\n\t\tobj := map[string]interface{}{}\n\t\titer.ReadMapCB(func(Iter *Iterator, field string) bool {\n\t\t\tvar elem interface{}\n\t\t\titer.ReadVal(&elem)\n\t\t\tobj[field] = elem\n\t\t\treturn true\n\t\t})\n\t\treturn obj\n\tdefault:\n\t\titer.ReportError(\"Read\", fmt.Sprintf(\"unexpected value type: %v\", valueType))\n\t\treturn nil\n\t}\n}\n\n// limit maximum depth of nesting, as allowed by https://tools.ietf.org/html/rfc7159#section-9\nconst maxDepth = 10000\n\nfunc (iter *Iterator) incrementDepth() (success bool) {\n\titer.depth++\n\tif iter.depth <= maxDepth {\n\t\treturn true\n\t}\n\titer.ReportError(\"incrementDepth\", \"exceeded max depth\")\n\treturn false\n}\n\nfunc (iter *Iterator) decrementDepth() (success bool) {\n\titer.depth--\n\tif iter.depth >= 0 {\n\t\treturn true\n\t}\n\titer.ReportError(\"decrementDepth\", \"unexpected negative nesting\")\n\treturn false\n}\n"
  },
  {
    "path": "iter_array.go",
    "content": "package jsoniter\n\n// ReadArray read array element, tells if the array has more element to read.\nfunc (iter *Iterator) ReadArray() (ret bool) {\n\tc := iter.nextToken()\n\tswitch c {\n\tcase 'n':\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\treturn false // null\n\tcase '[':\n\t\tc = iter.nextToken()\n\t\tif c != ']' {\n\t\t\titer.unreadByte()\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\tcase ']':\n\t\treturn false\n\tcase ',':\n\t\treturn true\n\tdefault:\n\t\titer.ReportError(\"ReadArray\", \"expect [ or , or ] or n, but found \"+string([]byte{c}))\n\t\treturn\n\t}\n}\n\n// ReadArrayCB read array with callback\nfunc (iter *Iterator) ReadArrayCB(callback func(*Iterator) bool) (ret bool) {\n\tc := iter.nextToken()\n\tif c == '[' {\n\t\tif !iter.incrementDepth() {\n\t\t\treturn false\n\t\t}\n\t\tc = iter.nextToken()\n\t\tif c != ']' {\n\t\t\titer.unreadByte()\n\t\t\tif !callback(iter) {\n\t\t\t\titer.decrementDepth()\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tc = iter.nextToken()\n\t\t\tfor c == ',' {\n\t\t\t\tif !callback(iter) {\n\t\t\t\t\titer.decrementDepth()\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tc = iter.nextToken()\n\t\t\t}\n\t\t\tif c != ']' {\n\t\t\t\titer.ReportError(\"ReadArrayCB\", \"expect ] in the end, but found \"+string([]byte{c}))\n\t\t\t\titer.decrementDepth()\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn iter.decrementDepth()\n\t\t}\n\t\treturn iter.decrementDepth()\n\t}\n\tif c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\treturn true // null\n\t}\n\titer.ReportError(\"ReadArrayCB\", \"expect [ or n, but found \"+string([]byte{c}))\n\treturn false\n}\n"
  },
  {
    "path": "iter_float.go",
    "content": "package jsoniter\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unsafe\"\n)\n\nvar floatDigits []int8\n\nconst invalidCharForNumber = int8(-1)\nconst endOfNumber = int8(-2)\nconst dotInNumber = int8(-3)\n\nfunc init() {\n\tfloatDigits = make([]int8, 256)\n\tfor i := 0; i < len(floatDigits); i++ {\n\t\tfloatDigits[i] = invalidCharForNumber\n\t}\n\tfor i := int8('0'); i <= int8('9'); i++ {\n\t\tfloatDigits[i] = i - int8('0')\n\t}\n\tfloatDigits[','] = endOfNumber\n\tfloatDigits[']'] = endOfNumber\n\tfloatDigits['}'] = endOfNumber\n\tfloatDigits[' '] = endOfNumber\n\tfloatDigits['\\t'] = endOfNumber\n\tfloatDigits['\\n'] = endOfNumber\n\tfloatDigits['.'] = dotInNumber\n}\n\n// ReadBigFloat read big.Float\nfunc (iter *Iterator) ReadBigFloat() (ret *big.Float) {\n\tstr := iter.readNumberAsString()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\treturn nil\n\t}\n\tprec := 64\n\tif len(str) > prec {\n\t\tprec = len(str)\n\t}\n\tval, _, err := big.ParseFloat(str, 10, uint(prec), big.ToZero)\n\tif err != nil {\n\t\titer.Error = err\n\t\treturn nil\n\t}\n\treturn val\n}\n\n// ReadBigInt read big.Int\nfunc (iter *Iterator) ReadBigInt() (ret *big.Int) {\n\tstr := iter.readNumberAsString()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\treturn nil\n\t}\n\tret = big.NewInt(0)\n\tvar success bool\n\tret, success = ret.SetString(str, 10)\n\tif !success {\n\t\titer.ReportError(\"ReadBigInt\", \"invalid big int\")\n\t\treturn nil\n\t}\n\treturn ret\n}\n\n//ReadFloat32 read float32\nfunc (iter *Iterator) ReadFloat32() (ret float32) {\n\tc := iter.nextToken()\n\tif c == '-' {\n\t\treturn -iter.readPositiveFloat32()\n\t}\n\titer.unreadByte()\n\treturn iter.readPositiveFloat32()\n}\n\nfunc (iter *Iterator) readPositiveFloat32() (ret float32) {\n\ti := iter.head\n\t// first char\n\tif i == iter.tail {\n\t\treturn iter.readFloat32SlowPath()\n\t}\n\tc := iter.buf[i]\n\ti++\n\tind := floatDigits[c]\n\tswitch ind {\n\tcase invalidCharForNumber:\n\t\treturn iter.readFloat32SlowPath()\n\tcase endOfNumber:\n\t\titer.ReportError(\"readFloat32\", \"empty number\")\n\t\treturn\n\tcase dotInNumber:\n\t\titer.ReportError(\"readFloat32\", \"leading dot is invalid\")\n\t\treturn\n\tcase 0:\n\t\tif i == iter.tail {\n\t\t\treturn iter.readFloat32SlowPath()\n\t\t}\n\t\tc = iter.buf[i]\n\t\tswitch c {\n\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\titer.ReportError(\"readFloat32\", \"leading zero is invalid\")\n\t\t\treturn\n\t\t}\n\t}\n\tvalue := uint64(ind)\n\t// chars before dot\nnon_decimal_loop:\n\tfor ; i < iter.tail; i++ {\n\t\tc = iter.buf[i]\n\t\tind := floatDigits[c]\n\t\tswitch ind {\n\t\tcase invalidCharForNumber:\n\t\t\treturn iter.readFloat32SlowPath()\n\t\tcase endOfNumber:\n\t\t\titer.head = i\n\t\t\treturn float32(value)\n\t\tcase dotInNumber:\n\t\t\tbreak non_decimal_loop\n\t\t}\n\t\tif value > uint64SafeToMultiple10 {\n\t\t\treturn iter.readFloat32SlowPath()\n\t\t}\n\t\tvalue = (value << 3) + (value << 1) + uint64(ind) // value = value * 10 + ind;\n\t}\n\t// chars after dot\n\tif c == '.' {\n\t\ti++\n\t\tdecimalPlaces := 0\n\t\tif i == iter.tail {\n\t\t\treturn iter.readFloat32SlowPath()\n\t\t}\n\t\tfor ; i < iter.tail; i++ {\n\t\t\tc = iter.buf[i]\n\t\t\tind := floatDigits[c]\n\t\t\tswitch ind {\n\t\t\tcase endOfNumber:\n\t\t\t\tif decimalPlaces > 0 && decimalPlaces < len(pow10) {\n\t\t\t\t\titer.head = i\n\t\t\t\t\treturn float32(float64(value) / float64(pow10[decimalPlaces]))\n\t\t\t\t}\n\t\t\t\t// too many decimal places\n\t\t\t\treturn iter.readFloat32SlowPath()\n\t\t\tcase invalidCharForNumber, dotInNumber:\n\t\t\t\treturn iter.readFloat32SlowPath()\n\t\t\t}\n\t\t\tdecimalPlaces++\n\t\t\tif value > uint64SafeToMultiple10 {\n\t\t\t\treturn iter.readFloat32SlowPath()\n\t\t\t}\n\t\t\tvalue = (value << 3) + (value << 1) + uint64(ind)\n\t\t}\n\t}\n\treturn iter.readFloat32SlowPath()\n}\n\nfunc (iter *Iterator) readNumberAsString() (ret string) {\n\tstrBuf := [16]byte{}\n\tstr := strBuf[0:0]\nload_loop:\n\tfor {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\tc := iter.buf[i]\n\t\t\tswitch c {\n\t\t\tcase '+', '-', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\t\tstr = append(str, c)\n\t\t\t\tcontinue\n\t\t\tdefault:\n\t\t\t\titer.head = i\n\t\t\t\tbreak load_loop\n\t\t\t}\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\treturn\n\t}\n\tif len(str) == 0 {\n\t\titer.ReportError(\"readNumberAsString\", \"invalid number\")\n\t}\n\treturn *(*string)(unsafe.Pointer(&str))\n}\n\nfunc (iter *Iterator) readFloat32SlowPath() (ret float32) {\n\tstr := iter.readNumberAsString()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\treturn\n\t}\n\terrMsg := validateFloat(str)\n\tif errMsg != \"\" {\n\t\titer.ReportError(\"readFloat32SlowPath\", errMsg)\n\t\treturn\n\t}\n\tval, err := strconv.ParseFloat(str, 32)\n\tif err != nil {\n\t\titer.Error = err\n\t\treturn\n\t}\n\treturn float32(val)\n}\n\n// ReadFloat64 read float64\nfunc (iter *Iterator) ReadFloat64() (ret float64) {\n\tc := iter.nextToken()\n\tif c == '-' {\n\t\treturn -iter.readPositiveFloat64()\n\t}\n\titer.unreadByte()\n\treturn iter.readPositiveFloat64()\n}\n\nfunc (iter *Iterator) readPositiveFloat64() (ret float64) {\n\ti := iter.head\n\t// first char\n\tif i == iter.tail {\n\t\treturn iter.readFloat64SlowPath()\n\t}\n\tc := iter.buf[i]\n\ti++\n\tind := floatDigits[c]\n\tswitch ind {\n\tcase invalidCharForNumber:\n\t\treturn iter.readFloat64SlowPath()\n\tcase endOfNumber:\n\t\titer.ReportError(\"readFloat64\", \"empty number\")\n\t\treturn\n\tcase dotInNumber:\n\t\titer.ReportError(\"readFloat64\", \"leading dot is invalid\")\n\t\treturn\n\tcase 0:\n\t\tif i == iter.tail {\n\t\t\treturn iter.readFloat64SlowPath()\n\t\t}\n\t\tc = iter.buf[i]\n\t\tswitch c {\n\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\titer.ReportError(\"readFloat64\", \"leading zero is invalid\")\n\t\t\treturn\n\t\t}\n\t}\n\tvalue := uint64(ind)\n\t// chars before dot\nnon_decimal_loop:\n\tfor ; i < iter.tail; i++ {\n\t\tc = iter.buf[i]\n\t\tind := floatDigits[c]\n\t\tswitch ind {\n\t\tcase invalidCharForNumber:\n\t\t\treturn iter.readFloat64SlowPath()\n\t\tcase endOfNumber:\n\t\t\titer.head = i\n\t\t\treturn float64(value)\n\t\tcase dotInNumber:\n\t\t\tbreak non_decimal_loop\n\t\t}\n\t\tif value > uint64SafeToMultiple10 {\n\t\t\treturn iter.readFloat64SlowPath()\n\t\t}\n\t\tvalue = (value << 3) + (value << 1) + uint64(ind) // value = value * 10 + ind;\n\t}\n\t// chars after dot\n\tif c == '.' {\n\t\ti++\n\t\tdecimalPlaces := 0\n\t\tif i == iter.tail {\n\t\t\treturn iter.readFloat64SlowPath()\n\t\t}\n\t\tfor ; i < iter.tail; i++ {\n\t\t\tc = iter.buf[i]\n\t\t\tind := floatDigits[c]\n\t\t\tswitch ind {\n\t\t\tcase endOfNumber:\n\t\t\t\tif decimalPlaces > 0 && decimalPlaces < len(pow10) {\n\t\t\t\t\titer.head = i\n\t\t\t\t\treturn float64(value) / float64(pow10[decimalPlaces])\n\t\t\t\t}\n\t\t\t\t// too many decimal places\n\t\t\t\treturn iter.readFloat64SlowPath()\n\t\t\tcase invalidCharForNumber, dotInNumber:\n\t\t\t\treturn iter.readFloat64SlowPath()\n\t\t\t}\n\t\t\tdecimalPlaces++\n\t\t\tif value > uint64SafeToMultiple10 {\n\t\t\t\treturn iter.readFloat64SlowPath()\n\t\t\t}\n\t\t\tvalue = (value << 3) + (value << 1) + uint64(ind)\n\t\t\tif value > maxFloat64 {\n\t\t\t\treturn iter.readFloat64SlowPath()\n\t\t\t}\n\t\t}\n\t}\n\treturn iter.readFloat64SlowPath()\n}\n\nfunc (iter *Iterator) readFloat64SlowPath() (ret float64) {\n\tstr := iter.readNumberAsString()\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\treturn\n\t}\n\terrMsg := validateFloat(str)\n\tif errMsg != \"\" {\n\t\titer.ReportError(\"readFloat64SlowPath\", errMsg)\n\t\treturn\n\t}\n\tval, err := strconv.ParseFloat(str, 64)\n\tif err != nil {\n\t\titer.Error = err\n\t\treturn\n\t}\n\treturn val\n}\n\nfunc validateFloat(str string) string {\n\t// strconv.ParseFloat is not validating `1.` or `1.e1`\n\tif len(str) == 0 {\n\t\treturn \"empty number\"\n\t}\n\tif str[0] == '-' {\n\t\treturn \"-- is not valid\"\n\t}\n\tdotPos := strings.IndexByte(str, '.')\n\tif dotPos != -1 {\n\t\tif dotPos == len(str)-1 {\n\t\t\treturn \"dot can not be last character\"\n\t\t}\n\t\tswitch str[dotPos+1] {\n\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\tdefault:\n\t\t\treturn \"missing digit after dot\"\n\t\t}\n\t}\n\treturn \"\"\n}\n\n// ReadNumber read json.Number\nfunc (iter *Iterator) ReadNumber() (ret json.Number) {\n\treturn json.Number(iter.readNumberAsString())\n}\n"
  },
  {
    "path": "iter_int.go",
    "content": "package jsoniter\n\nimport (\n\t\"math\"\n\t\"strconv\"\n)\n\nvar intDigits []int8\n\nconst uint32SafeToMultiply10 = uint32(0xffffffff)/10 - 1\nconst uint64SafeToMultiple10 = uint64(0xffffffffffffffff)/10 - 1\nconst maxFloat64 = 1<<53 - 1\n\nfunc init() {\n\tintDigits = make([]int8, 256)\n\tfor i := 0; i < len(intDigits); i++ {\n\t\tintDigits[i] = invalidCharForNumber\n\t}\n\tfor i := int8('0'); i <= int8('9'); i++ {\n\t\tintDigits[i] = i - int8('0')\n\t}\n}\n\n// ReadUint read uint\nfunc (iter *Iterator) ReadUint() uint {\n\tif strconv.IntSize == 32 {\n\t\treturn uint(iter.ReadUint32())\n\t}\n\treturn uint(iter.ReadUint64())\n}\n\n// ReadInt read int\nfunc (iter *Iterator) ReadInt() int {\n\tif strconv.IntSize == 32 {\n\t\treturn int(iter.ReadInt32())\n\t}\n\treturn int(iter.ReadInt64())\n}\n\n// ReadInt8 read int8\nfunc (iter *Iterator) ReadInt8() (ret int8) {\n\tc := iter.nextToken()\n\tif c == '-' {\n\t\tval := iter.readUint32(iter.readByte())\n\t\tif val > math.MaxInt8+1 {\n\t\t\titer.ReportError(\"ReadInt8\", \"overflow: \"+strconv.FormatInt(int64(val), 10))\n\t\t\treturn\n\t\t}\n\t\treturn -int8(val)\n\t}\n\tval := iter.readUint32(c)\n\tif val > math.MaxInt8 {\n\t\titer.ReportError(\"ReadInt8\", \"overflow: \"+strconv.FormatInt(int64(val), 10))\n\t\treturn\n\t}\n\treturn int8(val)\n}\n\n// ReadUint8 read uint8\nfunc (iter *Iterator) ReadUint8() (ret uint8) {\n\tval := iter.readUint32(iter.nextToken())\n\tif val > math.MaxUint8 {\n\t\titer.ReportError(\"ReadUint8\", \"overflow: \"+strconv.FormatInt(int64(val), 10))\n\t\treturn\n\t}\n\treturn uint8(val)\n}\n\n// ReadInt16 read int16\nfunc (iter *Iterator) ReadInt16() (ret int16) {\n\tc := iter.nextToken()\n\tif c == '-' {\n\t\tval := iter.readUint32(iter.readByte())\n\t\tif val > math.MaxInt16+1 {\n\t\t\titer.ReportError(\"ReadInt16\", \"overflow: \"+strconv.FormatInt(int64(val), 10))\n\t\t\treturn\n\t\t}\n\t\treturn -int16(val)\n\t}\n\tval := iter.readUint32(c)\n\tif val > math.MaxInt16 {\n\t\titer.ReportError(\"ReadInt16\", \"overflow: \"+strconv.FormatInt(int64(val), 10))\n\t\treturn\n\t}\n\treturn int16(val)\n}\n\n// ReadUint16 read uint16\nfunc (iter *Iterator) ReadUint16() (ret uint16) {\n\tval := iter.readUint32(iter.nextToken())\n\tif val > math.MaxUint16 {\n\t\titer.ReportError(\"ReadUint16\", \"overflow: \"+strconv.FormatInt(int64(val), 10))\n\t\treturn\n\t}\n\treturn uint16(val)\n}\n\n// ReadInt32 read int32\nfunc (iter *Iterator) ReadInt32() (ret int32) {\n\tc := iter.nextToken()\n\tif c == '-' {\n\t\tval := iter.readUint32(iter.readByte())\n\t\tif val > math.MaxInt32+1 {\n\t\t\titer.ReportError(\"ReadInt32\", \"overflow: \"+strconv.FormatInt(int64(val), 10))\n\t\t\treturn\n\t\t}\n\t\treturn -int32(val)\n\t}\n\tval := iter.readUint32(c)\n\tif val > math.MaxInt32 {\n\t\titer.ReportError(\"ReadInt32\", \"overflow: \"+strconv.FormatInt(int64(val), 10))\n\t\treturn\n\t}\n\treturn int32(val)\n}\n\n// ReadUint32 read uint32\nfunc (iter *Iterator) ReadUint32() (ret uint32) {\n\treturn iter.readUint32(iter.nextToken())\n}\n\nfunc (iter *Iterator) readUint32(c byte) (ret uint32) {\n\tind := intDigits[c]\n\tif ind == 0 {\n\t\titer.assertInteger()\n\t\treturn 0 // single zero\n\t}\n\tif ind == invalidCharForNumber {\n\t\titer.ReportError(\"readUint32\", \"unexpected character: \"+string([]byte{byte(ind)}))\n\t\treturn\n\t}\n\tvalue := uint32(ind)\n\tif iter.tail-iter.head > 10 {\n\t\ti := iter.head\n\t\tind2 := intDigits[iter.buf[i]]\n\t\tif ind2 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value\n\t\t}\n\t\ti++\n\t\tind3 := intDigits[iter.buf[i]]\n\t\tif ind3 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*10 + uint32(ind2)\n\t\t}\n\t\t//iter.head = i + 1\n\t\t//value = value * 100 + uint32(ind2) * 10 + uint32(ind3)\n\t\ti++\n\t\tind4 := intDigits[iter.buf[i]]\n\t\tif ind4 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*100 + uint32(ind2)*10 + uint32(ind3)\n\t\t}\n\t\ti++\n\t\tind5 := intDigits[iter.buf[i]]\n\t\tif ind5 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*1000 + uint32(ind2)*100 + uint32(ind3)*10 + uint32(ind4)\n\t\t}\n\t\ti++\n\t\tind6 := intDigits[iter.buf[i]]\n\t\tif ind6 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*10000 + uint32(ind2)*1000 + uint32(ind3)*100 + uint32(ind4)*10 + uint32(ind5)\n\t\t}\n\t\ti++\n\t\tind7 := intDigits[iter.buf[i]]\n\t\tif ind7 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*100000 + uint32(ind2)*10000 + uint32(ind3)*1000 + uint32(ind4)*100 + uint32(ind5)*10 + uint32(ind6)\n\t\t}\n\t\ti++\n\t\tind8 := intDigits[iter.buf[i]]\n\t\tif ind8 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*1000000 + uint32(ind2)*100000 + uint32(ind3)*10000 + uint32(ind4)*1000 + uint32(ind5)*100 + uint32(ind6)*10 + uint32(ind7)\n\t\t}\n\t\ti++\n\t\tind9 := intDigits[iter.buf[i]]\n\t\tvalue = value*10000000 + uint32(ind2)*1000000 + uint32(ind3)*100000 + uint32(ind4)*10000 + uint32(ind5)*1000 + uint32(ind6)*100 + uint32(ind7)*10 + uint32(ind8)\n\t\titer.head = i\n\t\tif ind9 == invalidCharForNumber {\n\t\t\titer.assertInteger()\n\t\t\treturn value\n\t\t}\n\t}\n\tfor {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\tind = intDigits[iter.buf[i]]\n\t\t\tif ind == invalidCharForNumber {\n\t\t\t\titer.head = i\n\t\t\t\titer.assertInteger()\n\t\t\t\treturn value\n\t\t\t}\n\t\t\tif value > uint32SafeToMultiply10 {\n\t\t\t\tvalue2 := (value << 3) + (value << 1) + uint32(ind)\n\t\t\t\tif value2 < value {\n\t\t\t\t\titer.ReportError(\"readUint32\", \"overflow\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvalue = value2\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvalue = (value << 3) + (value << 1) + uint32(ind)\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\titer.assertInteger()\n\t\t\treturn value\n\t\t}\n\t}\n}\n\n// ReadInt64 read int64\nfunc (iter *Iterator) ReadInt64() (ret int64) {\n\tc := iter.nextToken()\n\tif c == '-' {\n\t\tval := iter.readUint64(iter.readByte())\n\t\tif val > math.MaxInt64+1 {\n\t\t\titer.ReportError(\"ReadInt64\", \"overflow: \"+strconv.FormatUint(uint64(val), 10))\n\t\t\treturn\n\t\t}\n\t\treturn -int64(val)\n\t}\n\tval := iter.readUint64(c)\n\tif val > math.MaxInt64 {\n\t\titer.ReportError(\"ReadInt64\", \"overflow: \"+strconv.FormatUint(uint64(val), 10))\n\t\treturn\n\t}\n\treturn int64(val)\n}\n\n// ReadUint64 read uint64\nfunc (iter *Iterator) ReadUint64() uint64 {\n\treturn iter.readUint64(iter.nextToken())\n}\n\nfunc (iter *Iterator) readUint64(c byte) (ret uint64) {\n\tind := intDigits[c]\n\tif ind == 0 {\n\t\titer.assertInteger()\n\t\treturn 0 // single zero\n\t}\n\tif ind == invalidCharForNumber {\n\t\titer.ReportError(\"readUint64\", \"unexpected character: \"+string([]byte{byte(ind)}))\n\t\treturn\n\t}\n\tvalue := uint64(ind)\n\tif iter.tail-iter.head > 10 {\n\t\ti := iter.head\n\t\tind2 := intDigits[iter.buf[i]]\n\t\tif ind2 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value\n\t\t}\n\t\ti++\n\t\tind3 := intDigits[iter.buf[i]]\n\t\tif ind3 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*10 + uint64(ind2)\n\t\t}\n\t\t//iter.head = i + 1\n\t\t//value = value * 100 + uint32(ind2) * 10 + uint32(ind3)\n\t\ti++\n\t\tind4 := intDigits[iter.buf[i]]\n\t\tif ind4 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*100 + uint64(ind2)*10 + uint64(ind3)\n\t\t}\n\t\ti++\n\t\tind5 := intDigits[iter.buf[i]]\n\t\tif ind5 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*1000 + uint64(ind2)*100 + uint64(ind3)*10 + uint64(ind4)\n\t\t}\n\t\ti++\n\t\tind6 := intDigits[iter.buf[i]]\n\t\tif ind6 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*10000 + uint64(ind2)*1000 + uint64(ind3)*100 + uint64(ind4)*10 + uint64(ind5)\n\t\t}\n\t\ti++\n\t\tind7 := intDigits[iter.buf[i]]\n\t\tif ind7 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*100000 + uint64(ind2)*10000 + uint64(ind3)*1000 + uint64(ind4)*100 + uint64(ind5)*10 + uint64(ind6)\n\t\t}\n\t\ti++\n\t\tind8 := intDigits[iter.buf[i]]\n\t\tif ind8 == invalidCharForNumber {\n\t\t\titer.head = i\n\t\t\titer.assertInteger()\n\t\t\treturn value*1000000 + uint64(ind2)*100000 + uint64(ind3)*10000 + uint64(ind4)*1000 + uint64(ind5)*100 + uint64(ind6)*10 + uint64(ind7)\n\t\t}\n\t\ti++\n\t\tind9 := intDigits[iter.buf[i]]\n\t\tvalue = value*10000000 + uint64(ind2)*1000000 + uint64(ind3)*100000 + uint64(ind4)*10000 + uint64(ind5)*1000 + uint64(ind6)*100 + uint64(ind7)*10 + uint64(ind8)\n\t\titer.head = i\n\t\tif ind9 == invalidCharForNumber {\n\t\t\titer.assertInteger()\n\t\t\treturn value\n\t\t}\n\t}\n\tfor {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\tind = intDigits[iter.buf[i]]\n\t\t\tif ind == invalidCharForNumber {\n\t\t\t\titer.head = i\n\t\t\t\titer.assertInteger()\n\t\t\t\treturn value\n\t\t\t}\n\t\t\tif value > uint64SafeToMultiple10 {\n\t\t\t\tvalue2 := (value << 3) + (value << 1) + uint64(ind)\n\t\t\t\tif value2 < value {\n\t\t\t\t\titer.ReportError(\"readUint64\", \"overflow\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvalue = value2\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvalue = (value << 3) + (value << 1) + uint64(ind)\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\titer.assertInteger()\n\t\t\treturn value\n\t\t}\n\t}\n}\n\nfunc (iter *Iterator) assertInteger() {\n\tif iter.head < iter.tail && iter.buf[iter.head] == '.' {\n\t\titer.ReportError(\"assertInteger\", \"can not decode float as int\")\n\t}\n}\n"
  },
  {
    "path": "iter_object.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n// ReadObject read one field from object.\n// If object ended, returns empty string.\n// Otherwise, returns the field name.\nfunc (iter *Iterator) ReadObject() (ret string) {\n\tc := iter.nextToken()\n\tswitch c {\n\tcase 'n':\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\treturn \"\" // null\n\tcase '{':\n\t\tc = iter.nextToken()\n\t\tif c == '\"' {\n\t\t\titer.unreadByte()\n\t\t\tfield := iter.ReadString()\n\t\t\tc = iter.nextToken()\n\t\t\tif c != ':' {\n\t\t\t\titer.ReportError(\"ReadObject\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\t\t}\n\t\t\treturn field\n\t\t}\n\t\tif c == '}' {\n\t\t\treturn \"\" // end of object\n\t\t}\n\t\titer.ReportError(\"ReadObject\", `expect \" after {, but found `+string([]byte{c}))\n\t\treturn\n\tcase ',':\n\t\tfield := iter.ReadString()\n\t\tc = iter.nextToken()\n\t\tif c != ':' {\n\t\t\titer.ReportError(\"ReadObject\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\t}\n\t\treturn field\n\tcase '}':\n\t\treturn \"\" // end of object\n\tdefault:\n\t\titer.ReportError(\"ReadObject\", fmt.Sprintf(`expect { or , or } or n, but found %s`, string([]byte{c})))\n\t\treturn\n\t}\n}\n\n// CaseInsensitive\nfunc (iter *Iterator) readFieldHash() int64 {\n\thash := int64(0x811c9dc5)\n\tc := iter.nextToken()\n\tif c != '\"' {\n\t\titer.ReportError(\"readFieldHash\", `expect \", but found `+string([]byte{c}))\n\t\treturn 0\n\t}\n\tfor {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\t// require ascii string and no escape\n\t\t\tb := iter.buf[i]\n\t\t\tif b == '\\\\' {\n\t\t\t\titer.head = i\n\t\t\t\tfor _, b := range iter.readStringSlowPath() {\n\t\t\t\t\tif 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive {\n\t\t\t\t\t\tb += 'a' - 'A'\n\t\t\t\t\t}\n\t\t\t\t\thash ^= int64(b)\n\t\t\t\t\thash *= 0x1000193\n\t\t\t\t}\n\t\t\t\tc = iter.nextToken()\n\t\t\t\tif c != ':' {\n\t\t\t\t\titer.ReportError(\"readFieldHash\", `expect :, but found `+string([]byte{c}))\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t\treturn hash\n\t\t\t}\n\t\t\tif b == '\"' {\n\t\t\t\titer.head = i + 1\n\t\t\t\tc = iter.nextToken()\n\t\t\t\tif c != ':' {\n\t\t\t\t\titer.ReportError(\"readFieldHash\", `expect :, but found `+string([]byte{c}))\n\t\t\t\t\treturn 0\n\t\t\t\t}\n\t\t\t\treturn hash\n\t\t\t}\n\t\t\tif 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive {\n\t\t\t\tb += 'a' - 'A'\n\t\t\t}\n\t\t\thash ^= int64(b)\n\t\t\thash *= 0x1000193\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\titer.ReportError(\"readFieldHash\", `incomplete field name`)\n\t\t\treturn 0\n\t\t}\n\t}\n}\n\nfunc calcHash(str string, caseSensitive bool) int64 {\n\tif !caseSensitive {\n\t\tstr = strings.ToLower(str)\n\t}\n\thash := int64(0x811c9dc5)\n\tfor _, b := range []byte(str) {\n\t\thash ^= int64(b)\n\t\thash *= 0x1000193\n\t}\n\treturn int64(hash)\n}\n\n// ReadObjectCB read object with callback, the key is ascii only and field name not copied\nfunc (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool {\n\tc := iter.nextToken()\n\tvar field string\n\tif c == '{' {\n\t\tif !iter.incrementDepth() {\n\t\t\treturn false\n\t\t}\n\t\tc = iter.nextToken()\n\t\tif c == '\"' {\n\t\t\titer.unreadByte()\n\t\t\tfield = iter.ReadString()\n\t\t\tc = iter.nextToken()\n\t\t\tif c != ':' {\n\t\t\t\titer.ReportError(\"ReadObject\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\t\t}\n\t\t\tif !callback(iter, field) {\n\t\t\t\titer.decrementDepth()\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tc = iter.nextToken()\n\t\t\tfor c == ',' {\n\t\t\t\tfield = iter.ReadString()\n\t\t\t\tc = iter.nextToken()\n\t\t\t\tif c != ':' {\n\t\t\t\t\titer.ReportError(\"ReadObject\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\t\t\t}\n\t\t\t\tif !callback(iter, field) {\n\t\t\t\t\titer.decrementDepth()\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tc = iter.nextToken()\n\t\t\t}\n\t\t\tif c != '}' {\n\t\t\t\titer.ReportError(\"ReadObjectCB\", `object not ended with }`)\n\t\t\t\titer.decrementDepth()\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn iter.decrementDepth()\n\t\t}\n\t\tif c == '}' {\n\t\t\treturn iter.decrementDepth()\n\t\t}\n\t\titer.ReportError(\"ReadObjectCB\", `expect \" after {, but found `+string([]byte{c}))\n\t\titer.decrementDepth()\n\t\treturn false\n\t}\n\tif c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\treturn true // null\n\t}\n\titer.ReportError(\"ReadObjectCB\", `expect { or n, but found `+string([]byte{c}))\n\treturn false\n}\n\n// ReadMapCB read map with callback, the key can be any string\nfunc (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool {\n\tc := iter.nextToken()\n\tif c == '{' {\n\t\tif !iter.incrementDepth() {\n\t\t\treturn false\n\t\t}\n\t\tc = iter.nextToken()\n\t\tif c == '\"' {\n\t\t\titer.unreadByte()\n\t\t\tfield := iter.ReadString()\n\t\t\tif iter.nextToken() != ':' {\n\t\t\t\titer.ReportError(\"ReadMapCB\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\t\t\titer.decrementDepth()\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif !callback(iter, field) {\n\t\t\t\titer.decrementDepth()\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tc = iter.nextToken()\n\t\t\tfor c == ',' {\n\t\t\t\tfield = iter.ReadString()\n\t\t\t\tif iter.nextToken() != ':' {\n\t\t\t\t\titer.ReportError(\"ReadMapCB\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\t\t\t\titer.decrementDepth()\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif !callback(iter, field) {\n\t\t\t\t\titer.decrementDepth()\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tc = iter.nextToken()\n\t\t\t}\n\t\t\tif c != '}' {\n\t\t\t\titer.ReportError(\"ReadMapCB\", `object not ended with }`)\n\t\t\t\titer.decrementDepth()\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn iter.decrementDepth()\n\t\t}\n\t\tif c == '}' {\n\t\t\treturn iter.decrementDepth()\n\t\t}\n\t\titer.ReportError(\"ReadMapCB\", `expect \" after {, but found `+string([]byte{c}))\n\t\titer.decrementDepth()\n\t\treturn false\n\t}\n\tif c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\treturn true // null\n\t}\n\titer.ReportError(\"ReadMapCB\", `expect { or n, but found `+string([]byte{c}))\n\treturn false\n}\n\nfunc (iter *Iterator) readObjectStart() bool {\n\tc := iter.nextToken()\n\tif c == '{' {\n\t\tc = iter.nextToken()\n\t\tif c == '}' {\n\t\t\treturn false\n\t\t}\n\t\titer.unreadByte()\n\t\treturn true\n\t} else if c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\treturn false\n\t}\n\titer.ReportError(\"readObjectStart\", \"expect { or n, but found \"+string([]byte{c}))\n\treturn false\n}\n\nfunc (iter *Iterator) readObjectFieldAsBytes() (ret []byte) {\n\tstr := iter.ReadStringAsSlice()\n\tif iter.skipWhitespacesWithoutLoadMore() {\n\t\tif ret == nil {\n\t\t\tret = make([]byte, len(str))\n\t\t\tcopy(ret, str)\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\treturn\n\t\t}\n\t}\n\tif iter.buf[iter.head] != ':' {\n\t\titer.ReportError(\"readObjectFieldAsBytes\", \"expect : after object field, but found \"+string([]byte{iter.buf[iter.head]}))\n\t\treturn\n\t}\n\titer.head++\n\tif iter.skipWhitespacesWithoutLoadMore() {\n\t\tif ret == nil {\n\t\t\tret = make([]byte, len(str))\n\t\t\tcopy(ret, str)\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\treturn\n\t\t}\n\t}\n\tif ret == nil {\n\t\treturn str\n\t}\n\treturn ret\n}\n"
  },
  {
    "path": "iter_skip.go",
    "content": "package jsoniter\n\nimport \"fmt\"\n\n// ReadNil reads a json object as nil and\n// returns whether it's a nil or not\nfunc (iter *Iterator) ReadNil() (ret bool) {\n\tc := iter.nextToken()\n\tif c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l') // null\n\t\treturn true\n\t}\n\titer.unreadByte()\n\treturn false\n}\n\n// ReadBool reads a json object as BoolValue\nfunc (iter *Iterator) ReadBool() (ret bool) {\n\tc := iter.nextToken()\n\tif c == 't' {\n\t\titer.skipThreeBytes('r', 'u', 'e')\n\t\treturn true\n\t}\n\tif c == 'f' {\n\t\titer.skipFourBytes('a', 'l', 's', 'e')\n\t\treturn false\n\t}\n\titer.ReportError(\"ReadBool\", \"expect t or f, but found \"+string([]byte{c}))\n\treturn\n}\n\n// SkipAndReturnBytes skip next JSON element, and return its content as []byte.\n// The []byte can be kept, it is a copy of data.\nfunc (iter *Iterator) SkipAndReturnBytes() []byte {\n\titer.startCapture(iter.head)\n\titer.Skip()\n\treturn iter.stopCapture()\n}\n\n// SkipAndAppendBytes skips next JSON element and appends its content to\n// buffer, returning the result.\nfunc (iter *Iterator) SkipAndAppendBytes(buf []byte) []byte {\n\titer.startCaptureTo(buf, iter.head)\n\titer.Skip()\n\treturn iter.stopCapture()\n}\n\nfunc (iter *Iterator) startCaptureTo(buf []byte, captureStartedAt int) {\n\tif iter.captured != nil {\n\t\tpanic(\"already in capture mode\")\n\t}\n\titer.captureStartedAt = captureStartedAt\n\titer.captured = buf\n}\n\nfunc (iter *Iterator) startCapture(captureStartedAt int) {\n\titer.startCaptureTo(make([]byte, 0, 32), captureStartedAt)\n}\n\nfunc (iter *Iterator) stopCapture() []byte {\n\tif iter.captured == nil {\n\t\tpanic(\"not in capture mode\")\n\t}\n\tcaptured := iter.captured\n\tremaining := iter.buf[iter.captureStartedAt:iter.head]\n\titer.captureStartedAt = -1\n\titer.captured = nil\n\treturn append(captured, remaining...)\n}\n\n// Skip skips a json object and positions to relatively the next json object\nfunc (iter *Iterator) Skip() {\n\tc := iter.nextToken()\n\tswitch c {\n\tcase '\"':\n\t\titer.skipString()\n\tcase 'n':\n\t\titer.skipThreeBytes('u', 'l', 'l') // null\n\tcase 't':\n\t\titer.skipThreeBytes('r', 'u', 'e') // true\n\tcase 'f':\n\t\titer.skipFourBytes('a', 'l', 's', 'e') // false\n\tcase '0':\n\t\titer.unreadByte()\n\t\titer.ReadFloat32()\n\tcase '-', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\titer.skipNumber()\n\tcase '[':\n\t\titer.skipArray()\n\tcase '{':\n\t\titer.skipObject()\n\tdefault:\n\t\titer.ReportError(\"Skip\", fmt.Sprintf(\"do not know how to skip: %v\", c))\n\t\treturn\n\t}\n}\n\nfunc (iter *Iterator) skipFourBytes(b1, b2, b3, b4 byte) {\n\tif iter.readByte() != b1 {\n\t\titer.ReportError(\"skipFourBytes\", fmt.Sprintf(\"expect %s\", string([]byte{b1, b2, b3, b4})))\n\t\treturn\n\t}\n\tif iter.readByte() != b2 {\n\t\titer.ReportError(\"skipFourBytes\", fmt.Sprintf(\"expect %s\", string([]byte{b1, b2, b3, b4})))\n\t\treturn\n\t}\n\tif iter.readByte() != b3 {\n\t\titer.ReportError(\"skipFourBytes\", fmt.Sprintf(\"expect %s\", string([]byte{b1, b2, b3, b4})))\n\t\treturn\n\t}\n\tif iter.readByte() != b4 {\n\t\titer.ReportError(\"skipFourBytes\", fmt.Sprintf(\"expect %s\", string([]byte{b1, b2, b3, b4})))\n\t\treturn\n\t}\n}\n\nfunc (iter *Iterator) skipThreeBytes(b1, b2, b3 byte) {\n\tif iter.readByte() != b1 {\n\t\titer.ReportError(\"skipThreeBytes\", fmt.Sprintf(\"expect %s\", string([]byte{b1, b2, b3})))\n\t\treturn\n\t}\n\tif iter.readByte() != b2 {\n\t\titer.ReportError(\"skipThreeBytes\", fmt.Sprintf(\"expect %s\", string([]byte{b1, b2, b3})))\n\t\treturn\n\t}\n\tif iter.readByte() != b3 {\n\t\titer.ReportError(\"skipThreeBytes\", fmt.Sprintf(\"expect %s\", string([]byte{b1, b2, b3})))\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "iter_skip_sloppy.go",
    "content": "//+build jsoniter_sloppy\n\npackage jsoniter\n\n// sloppy but faster implementation, do not validate the input json\n\nfunc (iter *Iterator) skipNumber() {\n\tfor {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\tc := iter.buf[i]\n\t\t\tswitch c {\n\t\t\tcase ' ', '\\n', '\\r', '\\t', ',', '}', ']':\n\t\t\t\titer.head = i\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (iter *Iterator) skipArray() {\n\tlevel := 1\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\tswitch iter.buf[i] {\n\t\t\tcase '\"': // If inside string, skip it\n\t\t\t\titer.head = i + 1\n\t\t\t\titer.skipString()\n\t\t\t\ti = iter.head - 1 // it will be i++ soon\n\t\t\tcase '[': // If open symbol, increase level\n\t\t\t\tlevel++\n\t\t\t\tif !iter.incrementDepth() {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\tcase ']': // If close symbol, increase level\n\t\t\t\tlevel--\n\t\t\t\tif !iter.decrementDepth() {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// If we have returned to the original level, we're done\n\t\t\t\tif level == 0 {\n\t\t\t\t\titer.head = i + 1\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\titer.ReportError(\"skipObject\", \"incomplete array\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (iter *Iterator) skipObject() {\n\tlevel := 1\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\n\tfor {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\tswitch iter.buf[i] {\n\t\t\tcase '\"': // If inside string, skip it\n\t\t\t\titer.head = i + 1\n\t\t\t\titer.skipString()\n\t\t\t\ti = iter.head - 1 // it will be i++ soon\n\t\t\tcase '{': // If open symbol, increase level\n\t\t\t\tlevel++\n\t\t\t\tif !iter.incrementDepth() {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\tcase '}': // If close symbol, increase level\n\t\t\t\tlevel--\n\t\t\t\tif !iter.decrementDepth() {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// If we have returned to the original level, we're done\n\t\t\t\tif level == 0 {\n\t\t\t\t\titer.head = i + 1\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif !iter.loadMore() {\n\t\t\titer.ReportError(\"skipObject\", \"incomplete object\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (iter *Iterator) skipString() {\n\tfor {\n\t\tend, escaped := iter.findStringEnd()\n\t\tif end == -1 {\n\t\t\tif !iter.loadMore() {\n\t\t\t\titer.ReportError(\"skipString\", \"incomplete string\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif escaped {\n\t\t\t\titer.head = 1 // skip the first char as last char read is \\\n\t\t\t}\n\t\t} else {\n\t\t\titer.head = end\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// adapted from: https://github.com/buger/jsonparser/blob/master/parser.go\n// Tries to find the end of string\n// Support if string contains escaped quote symbols.\nfunc (iter *Iterator) findStringEnd() (int, bool) {\n\tescaped := false\n\tfor i := iter.head; i < iter.tail; i++ {\n\t\tc := iter.buf[i]\n\t\tif c == '\"' {\n\t\t\tif !escaped {\n\t\t\t\treturn i + 1, false\n\t\t\t}\n\t\t\tj := i - 1\n\t\t\tfor {\n\t\t\t\tif j < iter.head || iter.buf[j] != '\\\\' {\n\t\t\t\t\t// even number of backslashes\n\t\t\t\t\t// either end of buffer, or \" found\n\t\t\t\t\treturn i + 1, true\n\t\t\t\t}\n\t\t\t\tj--\n\t\t\t\tif j < iter.head || iter.buf[j] != '\\\\' {\n\t\t\t\t\t// odd number of backslashes\n\t\t\t\t\t// it is \\\" or \\\\\\\"\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tj--\n\t\t\t}\n\t\t} else if c == '\\\\' {\n\t\t\tescaped = true\n\t\t}\n\t}\n\tj := iter.tail - 1\n\tfor {\n\t\tif j < iter.head || iter.buf[j] != '\\\\' {\n\t\t\t// even number of backslashes\n\t\t\t// either end of buffer, or \" found\n\t\t\treturn -1, false // do not end with \\\n\t\t}\n\t\tj--\n\t\tif j < iter.head || iter.buf[j] != '\\\\' {\n\t\t\t// odd number of backslashes\n\t\t\t// it is \\\" or \\\\\\\"\n\t\t\tbreak\n\t\t}\n\t\tj--\n\n\t}\n\treturn -1, true // end with \\\n}\n"
  },
  {
    "path": "iter_skip_sloppy_test.go",
    "content": "//+build jsoniter_sloppy\n\npackage jsoniter\n\nimport (\n\t\"github.com/stretchr/testify/require\"\n\t\"io\"\n\t\"testing\"\n)\n\nfunc Test_string_end(t *testing.T) {\n\tend, escaped := ParseString(ConfigDefault, `abc\"`).findStringEnd()\n\tif end != 4 {\n\t\tt.Fatal(end)\n\t}\n\tif escaped != false {\n\t\tt.Fatal(escaped)\n\t}\n\tend, escaped = ParseString(ConfigDefault, `abc\\\\\"`).findStringEnd()\n\tif end != 6 {\n\t\tt.Fatal(end)\n\t}\n\tif escaped != true {\n\t\tt.Fatal(escaped)\n\t}\n\tend, escaped = ParseString(ConfigDefault, `abc\\\\\\\\\"`).findStringEnd()\n\tif end != 8 {\n\t\tt.Fatal(end)\n\t}\n\tif escaped != true {\n\t\tt.Fatal(escaped)\n\t}\n\tend, escaped = ParseString(ConfigDefault, `abc\\\"`).findStringEnd()\n\tif end != -1 {\n\t\tt.Fatal(end)\n\t}\n\tif escaped != false {\n\t\tt.Fatal(escaped)\n\t}\n\tend, escaped = ParseString(ConfigDefault, `abc\\`).findStringEnd()\n\tif end != -1 {\n\t\tt.Fatal(end)\n\t}\n\tif escaped != true {\n\t\tt.Fatal(escaped)\n\t}\n\tend, escaped = ParseString(ConfigDefault, `abc\\\\`).findStringEnd()\n\tif end != -1 {\n\t\tt.Fatal(end)\n\t}\n\tif escaped != false {\n\t\tt.Fatal(escaped)\n\t}\n\tend, escaped = ParseString(ConfigDefault, `\\\\`).findStringEnd()\n\tif end != -1 {\n\t\tt.Fatal(end)\n\t}\n\tif escaped != false {\n\t\tt.Fatal(escaped)\n\t}\n\tend, escaped = ParseString(ConfigDefault, `\\`).findStringEnd()\n\tif end != -1 {\n\t\tt.Fatal(end)\n\t}\n\tif escaped != true {\n\t\tt.Fatal(escaped)\n\t}\n}\n\ntype StagedReader struct {\n\tr1 string\n\tr2 string\n\tr3 string\n\tr  int\n}\n\nfunc (reader *StagedReader) Read(p []byte) (n int, err error) {\n\treader.r++\n\tswitch reader.r {\n\tcase 1:\n\t\tcopy(p, []byte(reader.r1))\n\t\treturn len(reader.r1), nil\n\tcase 2:\n\t\tcopy(p, []byte(reader.r2))\n\t\treturn len(reader.r2), nil\n\tcase 3:\n\t\tcopy(p, []byte(reader.r3))\n\t\treturn len(reader.r3), nil\n\tdefault:\n\t\treturn 0, io.EOF\n\t}\n}\n\nfunc Test_skip_string(t *testing.T) {\n\tshould := require.New(t)\n\titer := ParseString(ConfigDefault, `\"abc`)\n\titer.skipString()\n\tshould.Equal(1, iter.head)\n\titer = ParseString(ConfigDefault, `\\\"\"abc`)\n\titer.skipString()\n\tshould.Equal(3, iter.head)\n\treader := &StagedReader{\n\t\tr1: `abc`,\n\t\tr2: `\"`,\n\t}\n\titer = Parse(ConfigDefault, reader, 4096)\n\titer.skipString()\n\tshould.Equal(1, iter.head)\n\treader = &StagedReader{\n\t\tr1: `abc`,\n\t\tr2: `1\"`,\n\t}\n\titer = Parse(ConfigDefault, reader, 4096)\n\titer.skipString()\n\tshould.Equal(2, iter.head)\n\treader = &StagedReader{\n\t\tr1: `abc\\`,\n\t\tr2: `\"`,\n\t}\n\titer = Parse(ConfigDefault, reader, 4096)\n\titer.skipString()\n\tshould.NotNil(iter.Error)\n\treader = &StagedReader{\n\t\tr1: `abc\\`,\n\t\tr2: `\"\"`,\n\t}\n\titer = Parse(ConfigDefault, reader, 4096)\n\titer.skipString()\n\tshould.Equal(2, iter.head)\n}\n\nfunc Test_skip_object(t *testing.T) {\n\titer := ParseString(ConfigDefault, `}`)\n\titer.skipObject()\n\tif iter.head != 1 {\n\t\tt.Fatal(iter.head)\n\t}\n\titer = ParseString(ConfigDefault, `a}`)\n\titer.skipObject()\n\tif iter.head != 2 {\n\t\tt.Fatal(iter.head)\n\t}\n\titer = ParseString(ConfigDefault, `{}}a`)\n\titer.skipObject()\n\tif iter.head != 3 {\n\t\tt.Fatal(iter.head)\n\t}\n\treader := &StagedReader{\n\t\tr1: `{`,\n\t\tr2: `}}a`,\n\t}\n\titer = Parse(ConfigDefault, reader, 4096)\n\titer.skipObject()\n\tif iter.head != 2 {\n\t\tt.Fatal(iter.head)\n\t}\n\titer = ParseString(ConfigDefault, `\"}\"}a`)\n\titer.skipObject()\n\tif iter.head != 4 {\n\t\tt.Fatal(iter.head)\n\t}\n}\n"
  },
  {
    "path": "iter_skip_strict.go",
    "content": "//+build !jsoniter_sloppy\n\npackage jsoniter\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\nfunc (iter *Iterator) skipNumber() {\n\tif !iter.trySkipNumber() {\n\t\titer.unreadByte()\n\t\tif iter.Error != nil && iter.Error != io.EOF {\n\t\t\treturn\n\t\t}\n\t\titer.ReadFloat64()\n\t\tif iter.Error != nil && iter.Error != io.EOF {\n\t\t\titer.Error = nil\n\t\t\titer.ReadBigFloat()\n\t\t}\n\t}\n}\n\nfunc (iter *Iterator) trySkipNumber() bool {\n\tdotFound := false\n\tfor i := iter.head; i < iter.tail; i++ {\n\t\tc := iter.buf[i]\n\t\tswitch c {\n\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\tcase '.':\n\t\t\tif dotFound {\n\t\t\t\titer.ReportError(\"validateNumber\", `more than one dot found in number`)\n\t\t\t\treturn true // already failed\n\t\t\t}\n\t\t\tif i+1 == iter.tail {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tc = iter.buf[i+1]\n\t\t\tswitch c {\n\t\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\tdefault:\n\t\t\t\titer.ReportError(\"validateNumber\", `missing digit after dot`)\n\t\t\t\treturn true // already failed\n\t\t\t}\n\t\t\tdotFound = true\n\t\tdefault:\n\t\t\tswitch c {\n\t\t\tcase ',', ']', '}', ' ', '\\t', '\\n', '\\r':\n\t\t\t\tif iter.head == i {\n\t\t\t\t\treturn false // if - without following digits\n\t\t\t\t}\n\t\t\t\titer.head = i\n\t\t\t\treturn true // must be valid\n\t\t\t}\n\t\t\treturn false // may be invalid\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (iter *Iterator) skipString() {\n\tif !iter.trySkipString() {\n\t\titer.unreadByte()\n\t\titer.ReadString()\n\t}\n}\n\nfunc (iter *Iterator) trySkipString() bool {\n\tfor i := iter.head; i < iter.tail; i++ {\n\t\tc := iter.buf[i]\n\t\tif c == '\"' {\n\t\t\titer.head = i + 1\n\t\t\treturn true // valid\n\t\t} else if c == '\\\\' {\n\t\t\treturn false\n\t\t} else if c < ' ' {\n\t\t\titer.ReportError(\"trySkipString\",\n\t\t\t\tfmt.Sprintf(`invalid control character found: %d`, c))\n\t\t\treturn true // already failed\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (iter *Iterator) skipObject() {\n\titer.unreadByte()\n\titer.ReadObjectCB(func(iter *Iterator, field string) bool {\n\t\titer.Skip()\n\t\treturn true\n\t})\n}\n\nfunc (iter *Iterator) skipArray() {\n\titer.unreadByte()\n\titer.ReadArrayCB(func(iter *Iterator) bool {\n\t\titer.Skip()\n\t\treturn true\n\t})\n}\n"
  },
  {
    "path": "iter_str.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"unicode/utf16\"\n)\n\n// ReadString read string from iterator\nfunc (iter *Iterator) ReadString() (ret string) {\n\tc := iter.nextToken()\n\tif c == '\"' {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\tc := iter.buf[i]\n\t\t\tif c == '\"' {\n\t\t\t\tret = string(iter.buf[iter.head:i])\n\t\t\t\titer.head = i + 1\n\t\t\t\treturn ret\n\t\t\t} else if c == '\\\\' {\n\t\t\t\tbreak\n\t\t\t} else if c < ' ' {\n\t\t\t\titer.ReportError(\"ReadString\",\n\t\t\t\t\tfmt.Sprintf(`invalid control character found: %d`, c))\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\treturn iter.readStringSlowPath()\n\t} else if c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\treturn \"\"\n\t}\n\titer.ReportError(\"ReadString\", `expects \" or n, but found `+string([]byte{c}))\n\treturn\n}\n\nfunc (iter *Iterator) readStringSlowPath() (ret string) {\n\tvar str []byte\n\tvar c byte\n\tfor iter.Error == nil {\n\t\tc = iter.readByte()\n\t\tif c == '\"' {\n\t\t\treturn string(str)\n\t\t}\n\t\tif c == '\\\\' {\n\t\t\tc = iter.readByte()\n\t\t\tstr = iter.readEscapedChar(c, str)\n\t\t} else {\n\t\t\tstr = append(str, c)\n\t\t}\n\t}\n\titer.ReportError(\"readStringSlowPath\", \"unexpected end of input\")\n\treturn\n}\n\nfunc (iter *Iterator) readEscapedChar(c byte, str []byte) []byte {\n\tswitch c {\n\tcase 'u':\n\t\tr := iter.readU4()\n\t\tif utf16.IsSurrogate(r) {\n\t\t\tc = iter.readByte()\n\t\t\tif iter.Error != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif c != '\\\\' {\n\t\t\t\titer.unreadByte()\n\t\t\t\tstr = appendRune(str, r)\n\t\t\t\treturn str\n\t\t\t}\n\t\t\tc = iter.readByte()\n\t\t\tif iter.Error != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif c != 'u' {\n\t\t\t\tstr = appendRune(str, r)\n\t\t\t\treturn iter.readEscapedChar(c, str)\n\t\t\t}\n\t\t\tr2 := iter.readU4()\n\t\t\tif iter.Error != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tcombined := utf16.DecodeRune(r, r2)\n\t\t\tif combined == '\\uFFFD' {\n\t\t\t\tstr = appendRune(str, r)\n\t\t\t\tstr = appendRune(str, r2)\n\t\t\t} else {\n\t\t\t\tstr = appendRune(str, combined)\n\t\t\t}\n\t\t} else {\n\t\t\tstr = appendRune(str, r)\n\t\t}\n\tcase '\"':\n\t\tstr = append(str, '\"')\n\tcase '\\\\':\n\t\tstr = append(str, '\\\\')\n\tcase '/':\n\t\tstr = append(str, '/')\n\tcase 'b':\n\t\tstr = append(str, '\\b')\n\tcase 'f':\n\t\tstr = append(str, '\\f')\n\tcase 'n':\n\t\tstr = append(str, '\\n')\n\tcase 'r':\n\t\tstr = append(str, '\\r')\n\tcase 't':\n\t\tstr = append(str, '\\t')\n\tdefault:\n\t\titer.ReportError(\"readEscapedChar\",\n\t\t\t`invalid escape char after \\`)\n\t\treturn nil\n\t}\n\treturn str\n}\n\n// ReadStringAsSlice read string from iterator without copying into string form.\n// The []byte can not be kept, as it will change after next iterator call.\nfunc (iter *Iterator) ReadStringAsSlice() (ret []byte) {\n\tc := iter.nextToken()\n\tif c == '\"' {\n\t\tfor i := iter.head; i < iter.tail; i++ {\n\t\t\t// require ascii string and no escape\n\t\t\t// for: field name, base64, number\n\t\t\tif iter.buf[i] == '\"' {\n\t\t\t\t// fast path: reuse the underlying buffer\n\t\t\t\tret = iter.buf[iter.head:i]\n\t\t\t\titer.head = i + 1\n\t\t\t\treturn ret\n\t\t\t}\n\t\t}\n\t\treadLen := iter.tail - iter.head\n\t\tcopied := make([]byte, readLen, readLen*2)\n\t\tcopy(copied, iter.buf[iter.head:iter.tail])\n\t\titer.head = iter.tail\n\t\tfor iter.Error == nil {\n\t\t\tc := iter.readByte()\n\t\t\tif c == '\"' {\n\t\t\t\treturn copied\n\t\t\t}\n\t\t\tcopied = append(copied, c)\n\t\t}\n\t\treturn copied\n\t}\n\titer.ReportError(\"ReadStringAsSlice\", `expects \" or n, but found `+string([]byte{c}))\n\treturn\n}\n\nfunc (iter *Iterator) readU4() (ret rune) {\n\tfor i := 0; i < 4; i++ {\n\t\tc := iter.readByte()\n\t\tif iter.Error != nil {\n\t\t\treturn\n\t\t}\n\t\tif c >= '0' && c <= '9' {\n\t\t\tret = ret*16 + rune(c-'0')\n\t\t} else if c >= 'a' && c <= 'f' {\n\t\t\tret = ret*16 + rune(c-'a'+10)\n\t\t} else if c >= 'A' && c <= 'F' {\n\t\t\tret = ret*16 + rune(c-'A'+10)\n\t\t} else {\n\t\t\titer.ReportError(\"readU4\", \"expects 0~9 or a~f, but found \"+string([]byte{c}))\n\t\t\treturn\n\t\t}\n\t}\n\treturn ret\n}\n\nconst (\n\tt1 = 0x00 // 0000 0000\n\ttx = 0x80 // 1000 0000\n\tt2 = 0xC0 // 1100 0000\n\tt3 = 0xE0 // 1110 0000\n\tt4 = 0xF0 // 1111 0000\n\tt5 = 0xF8 // 1111 1000\n\n\tmaskx = 0x3F // 0011 1111\n\tmask2 = 0x1F // 0001 1111\n\tmask3 = 0x0F // 0000 1111\n\tmask4 = 0x07 // 0000 0111\n\n\trune1Max = 1<<7 - 1\n\trune2Max = 1<<11 - 1\n\trune3Max = 1<<16 - 1\n\n\tsurrogateMin = 0xD800\n\tsurrogateMax = 0xDFFF\n\n\tmaxRune   = '\\U0010FFFF' // Maximum valid Unicode code point.\n\truneError = '\\uFFFD'     // the \"error\" Rune or \"Unicode replacement character\"\n)\n\nfunc appendRune(p []byte, r rune) []byte {\n\t// Negative values are erroneous. Making it unsigned addresses the problem.\n\tswitch i := uint32(r); {\n\tcase i <= rune1Max:\n\t\tp = append(p, byte(r))\n\t\treturn p\n\tcase i <= rune2Max:\n\t\tp = append(p, t2|byte(r>>6))\n\t\tp = append(p, tx|byte(r)&maskx)\n\t\treturn p\n\tcase i > maxRune, surrogateMin <= i && i <= surrogateMax:\n\t\tr = runeError\n\t\tfallthrough\n\tcase i <= rune3Max:\n\t\tp = append(p, t3|byte(r>>12))\n\t\tp = append(p, tx|byte(r>>6)&maskx)\n\t\tp = append(p, tx|byte(r)&maskx)\n\t\treturn p\n\tdefault:\n\t\tp = append(p, t4|byte(r>>18))\n\t\tp = append(p, tx|byte(r>>12)&maskx)\n\t\tp = append(p, tx|byte(r>>6)&maskx)\n\t\tp = append(p, tx|byte(r)&maskx)\n\t\treturn p\n\t}\n}\n"
  },
  {
    "path": "jsoniter.go",
    "content": "// Package jsoniter implements encoding and decoding of JSON as defined in\n// RFC 4627 and provides interfaces with identical syntax of standard lib encoding/json.\n// Converting from encoding/json to jsoniter is no more than replacing the package with jsoniter\n// and variable type declarations (if any).\n// jsoniter interfaces gives 100% compatibility with code using standard lib.\n//\n// \"JSON and Go\"\n// (https://golang.org/doc/articles/json_and_go.html)\n// gives a description of how Marshal/Unmarshal operate\n// between arbitrary or predefined json objects and bytes,\n// and it applies to jsoniter.Marshal/Unmarshal as well.\n//\n// Besides, jsoniter.Iterator provides a different set of interfaces\n// iterating given bytes/string/reader\n// and yielding parsed elements one by one.\n// This set of interfaces reads input as required and gives\n// better performance.\npackage jsoniter\n"
  },
  {
    "path": "misc_tests/jsoniter_array_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_empty_array(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[]`)\n\tcont := iter.ReadArray()\n\tshould.False(cont)\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `[]`)\n\titer.ReadArrayCB(func(iter *jsoniter.Iterator) bool {\n\t\tshould.FailNow(\"should not call\")\n\t\treturn true\n\t})\n}\n\nfunc Test_one_element(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[1]`)\n\tshould.True(iter.ReadArray())\n\tshould.Equal(1, iter.ReadInt())\n\tshould.False(iter.ReadArray())\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `[1]`)\n\titer.ReadArrayCB(func(iter *jsoniter.Iterator) bool {\n\t\tshould.Equal(1, iter.ReadInt())\n\t\treturn true\n\t})\n}\n\nfunc Test_two_elements(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[1,2]`)\n\tshould.True(iter.ReadArray())\n\tshould.Equal(int64(1), iter.ReadInt64())\n\tshould.True(iter.ReadArray())\n\tshould.Equal(int64(2), iter.ReadInt64())\n\tshould.False(iter.ReadArray())\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `[1,2]`)\n\tshould.Equal([]interface{}{float64(1), float64(2)}, iter.Read())\n}\n\nfunc Test_whitespace_in_head(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, ` [1]`)\n\tcont := iter.ReadArray()\n\tif cont != true {\n\t\tt.FailNow()\n\t}\n\tif iter.ReadUint64() != 1 {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_whitespace_after_array_start(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[ 1]`)\n\tcont := iter.ReadArray()\n\tif cont != true {\n\t\tt.FailNow()\n\t}\n\tif iter.ReadUint64() != 1 {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_whitespace_before_array_end(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[1 ]`)\n\tcont := iter.ReadArray()\n\tif cont != true {\n\t\tt.FailNow()\n\t}\n\tif iter.ReadUint64() != 1 {\n\t\tt.FailNow()\n\t}\n\tcont = iter.ReadArray()\n\tif cont != false {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_whitespace_before_comma(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[1 ,2]`)\n\tcont := iter.ReadArray()\n\tif cont != true {\n\t\tt.FailNow()\n\t}\n\tif iter.ReadUint64() != 1 {\n\t\tt.FailNow()\n\t}\n\tcont = iter.ReadArray()\n\tif cont != true {\n\t\tt.FailNow()\n\t}\n\tif iter.ReadUint64() != 2 {\n\t\tt.FailNow()\n\t}\n\tcont = iter.ReadArray()\n\tif cont != false {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_write_array(t *testing.T) {\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.Config{IndentionStep: 2}.Froze(), buf, 4096)\n\tstream.WriteArrayStart()\n\tstream.WriteInt(1)\n\tstream.WriteMore()\n\tstream.WriteInt(2)\n\tstream.WriteArrayEnd()\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"[\\n  1,\\n  2\\n]\", buf.String())\n}\n\nfunc Test_write_val_array(t *testing.T) {\n\tshould := require.New(t)\n\tval := []int{1, 2, 3}\n\tstr, err := jsoniter.MarshalToString(&val)\n\tshould.Nil(err)\n\tshould.Equal(\"[1,2,3]\", str)\n}\n\nfunc Test_write_val_empty_array(t *testing.T) {\n\tshould := require.New(t)\n\tval := []int{}\n\tstr, err := jsoniter.MarshalToString(val)\n\tshould.Nil(err)\n\tshould.Equal(\"[]\", str)\n}\n\nfunc Test_write_array_of_interface_in_struct(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct {\n\t\tField  []interface{}\n\t\tField2 string\n\t}\n\tval := TestObject{[]interface{}{1, 2}, \"\"}\n\tstr, err := jsoniter.MarshalToString(val)\n\tshould.Nil(err)\n\tshould.Contains(str, `\"Field\":[1,2]`)\n\tshould.Contains(str, `\"Field2\":\"\"`)\n}\n\nfunc Test_encode_byte_array(t *testing.T) {\n\tshould := require.New(t)\n\tbytes, err := json.Marshal([]byte{1, 2, 3})\n\tshould.Nil(err)\n\tshould.Equal(`\"AQID\"`, string(bytes))\n\tbytes, err = jsoniter.Marshal([]byte{1, 2, 3})\n\tshould.Nil(err)\n\tshould.Equal(`\"AQID\"`, string(bytes))\n}\n\nfunc Test_encode_empty_byte_array(t *testing.T) {\n\tshould := require.New(t)\n\tbytes, err := json.Marshal([]byte{})\n\tshould.Nil(err)\n\tshould.Equal(`\"\"`, string(bytes))\n\tbytes, err = jsoniter.Marshal([]byte{})\n\tshould.Nil(err)\n\tshould.Equal(`\"\"`, string(bytes))\n}\n\nfunc Test_encode_nil_byte_array(t *testing.T) {\n\tshould := require.New(t)\n\tvar nilSlice []byte\n\tbytes, err := json.Marshal(nilSlice)\n\tshould.Nil(err)\n\tshould.Equal(`null`, string(bytes))\n\tbytes, err = jsoniter.Marshal(nilSlice)\n\tshould.Nil(err)\n\tshould.Equal(`null`, string(bytes))\n}\n\nfunc Test_decode_byte_array_from_base64(t *testing.T) {\n\tshould := require.New(t)\n\tdata := []byte{}\n\terr := json.Unmarshal([]byte(`\"AQID\"`), &data)\n\tshould.Nil(err)\n\tshould.Equal([]byte{1, 2, 3}, data)\n\terr = jsoniter.Unmarshal([]byte(`\"AQID\"`), &data)\n\tshould.Nil(err)\n\tshould.Equal([]byte{1, 2, 3}, data)\n}\n\nfunc Test_decode_byte_array_from_base64_with_newlines(t *testing.T) {\n\tshould := require.New(t)\n\tdata := []byte{}\n\terr := json.Unmarshal([]byte(`\"A\\rQ\\nID\"`), &data)\n\tshould.Nil(err)\n\tshould.Equal([]byte{1, 2, 3}, data)\n\terr = jsoniter.Unmarshal([]byte(`\"A\\rQ\\nID\"`), &data)\n\tshould.Nil(err)\n\tshould.Equal([]byte{1, 2, 3}, data)\n}\n\nfunc Test_decode_byte_array_from_array(t *testing.T) {\n\tshould := require.New(t)\n\tdata := []byte{}\n\terr := json.Unmarshal([]byte(`[1,2,3]`), &data)\n\tshould.Nil(err)\n\tshould.Equal([]byte{1, 2, 3}, data)\n\terr = jsoniter.Unmarshal([]byte(`[1,2,3]`), &data)\n\tshould.Nil(err)\n\tshould.Equal([]byte{1, 2, 3}, data)\n}\n\nfunc Test_decode_slice(t *testing.T) {\n\tshould := require.New(t)\n\tslice := make([]string, 0, 5)\n\tjsoniter.UnmarshalFromString(`[\"hello\", \"world\"]`, &slice)\n\tshould.Equal([]string{\"hello\", \"world\"}, slice)\n}\n\nfunc Test_decode_large_slice(t *testing.T) {\n\tshould := require.New(t)\n\tslice := make([]int, 0, 1)\n\tjsoniter.UnmarshalFromString(`[1,2,3,4,5,6,7,8,9]`, &slice)\n\tshould.Equal([]int{1, 2, 3, 4, 5, 6, 7, 8, 9}, slice)\n}\n\nfunc Benchmark_jsoniter_array(b *testing.B) {\n\tb.ReportAllocs()\n\tinput := []byte(`[1,2,3,4,5,6,7,8,9]`)\n\titer := jsoniter.ParseBytes(jsoniter.ConfigDefault, input)\n\tb.ResetTimer()\n\tfor n := 0; n < b.N; n++ {\n\t\titer.ResetBytes(input)\n\t\tfor iter.ReadArray() {\n\t\t\titer.ReadUint64()\n\t\t}\n\t}\n}\n\nfunc Benchmark_json_array(b *testing.B) {\n\tfor n := 0; n < b.N; n++ {\n\t\tresult := []interface{}{}\n\t\tjson.Unmarshal([]byte(`[1,2,3]`), &result)\n\t}\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_bool_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_true(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `true`)\n\tshould.True(iter.ReadBool())\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `true`)\n\tshould.Equal(true, iter.Read())\n}\n\nfunc Test_false(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `false`)\n\tshould.False(iter.ReadBool())\n}\n\nfunc Test_write_true_false(t *testing.T) {\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\tstream.WriteTrue()\n\tstream.WriteFalse()\n\tstream.WriteBool(false)\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"truefalsefalse\", buf.String())\n}\n\nfunc Test_write_val_bool(t *testing.T) {\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\tstream.WriteVal(true)\n\tshould.Equal(stream.Buffered(), 4)\n\tstream.Flush()\n\tshould.Equal(stream.Buffered(), 0)\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"true\", buf.String())\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_float_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"encoding/json\"\n\t\"math\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_read_big_float(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `12.3`)\n\tval := iter.ReadBigFloat()\n\tval64, _ := val.Float64()\n\tshould.Equal(12.3, val64)\n}\n\nfunc Test_read_big_int(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `92233720368547758079223372036854775807`)\n\tval := iter.ReadBigInt()\n\tshould.NotNil(val)\n\tshould.Equal(`92233720368547758079223372036854775807`, val.String())\n}\n\nfunc Test_read_float_as_interface(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `12.3`)\n\tshould.Equal(float64(12.3), iter.Read())\n}\n\nfunc Test_wrap_float(t *testing.T) {\n\tshould := require.New(t)\n\tstr, err := jsoniter.MarshalToString(jsoniter.WrapFloat64(12.3))\n\tshould.Nil(err)\n\tshould.Equal(\"12.3\", str)\n}\n\nfunc Test_read_float64_cursor(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, \"[1.23456789\\n,2,3]\")\n\tshould.True(iter.ReadArray())\n\tshould.Equal(1.23456789, iter.Read())\n\tshould.True(iter.ReadArray())\n\tshould.Equal(float64(2), iter.Read())\n}\n\nfunc Test_read_float_scientific(t *testing.T) {\n\tshould := require.New(t)\n\tvar obj interface{}\n\tshould.NoError(jsoniter.UnmarshalFromString(`1e1`, &obj))\n\tshould.Equal(float64(10), obj)\n\tshould.NoError(json.Unmarshal([]byte(`1e1`), &obj))\n\tshould.Equal(float64(10), obj)\n\tshould.NoError(jsoniter.UnmarshalFromString(`1.0e1`, &obj))\n\tshould.Equal(float64(10), obj)\n\tshould.NoError(json.Unmarshal([]byte(`1.0e1`), &obj))\n\tshould.Equal(float64(10), obj)\n}\n\nfunc Test_lossy_float_marshal(t *testing.T) {\n\tshould := require.New(t)\n\tapi := jsoniter.Config{MarshalFloatWith6Digits: true}.Froze()\n\toutput, err := api.MarshalToString(float64(0.1234567))\n\tshould.Nil(err)\n\tshould.Equal(\"0.123457\", output)\n\toutput, err = api.MarshalToString(float32(0.1234567))\n\tshould.Nil(err)\n\tshould.Equal(\"0.123457\", output)\n}\n\nfunc Test_read_number(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `92233720368547758079223372036854775807`)\n\tval := iter.ReadNumber()\n\tshould.Equal(`92233720368547758079223372036854775807`, string(val))\n}\n\nfunc Test_encode_inf(t *testing.T) {\n\tshould := require.New(t)\n\t_, err := json.Marshal(math.Inf(1))\n\tshould.Error(err)\n\t_, err = jsoniter.Marshal(float32(math.Inf(1)))\n\tshould.Error(err)\n\t_, err = jsoniter.Marshal(math.Inf(-1))\n\tshould.Error(err)\n}\n\nfunc Test_encode_nan(t *testing.T) {\n\tshould := require.New(t)\n\t_, err := json.Marshal(math.NaN())\n\tshould.Error(err)\n\t_, err = jsoniter.Marshal(float32(math.NaN()))\n\tshould.Error(err)\n\t_, err = jsoniter.Marshal(math.NaN())\n\tshould.Error(err)\n}\n\nfunc Benchmark_jsoniter_float(b *testing.B) {\n\tb.ReportAllocs()\n\tinput := []byte(`1.1123,`)\n\titer := jsoniter.NewIterator(jsoniter.ConfigDefault)\n\tfor n := 0; n < b.N; n++ {\n\t\titer.ResetBytes(input)\n\t\titer.ReadFloat64()\n\t}\n}\n\nfunc Benchmark_json_float(b *testing.B) {\n\tfor n := 0; n < b.N; n++ {\n\t\tresult := float64(0)\n\t\tjson.Unmarshal([]byte(`1.1`), &result)\n\t}\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_int_test.go",
    "content": "// +build go1.8\n\npackage misc_tests\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"math/rand\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_read_uint64_invalid(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, \",\")\n\titer.ReadUint64()\n\tshould.NotNil(iter.Error)\n}\n\nfunc Test_read_int32_array(t *testing.T) {\n\tshould := require.New(t)\n\tinput := `[123,456,789]`\n\tval := make([]int32, 0)\n\tjsoniter.UnmarshalFromString(input, &val)\n\tshould.Equal(3, len(val))\n}\n\nfunc Test_read_int64_array(t *testing.T) {\n\tshould := require.New(t)\n\tinput := `[123,456,789]`\n\tval := make([]int64, 0)\n\tjsoniter.UnmarshalFromString(input, &val)\n\tshould.Equal(3, len(val))\n}\n\nfunc Test_wrap_int(t *testing.T) {\n\tshould := require.New(t)\n\tstr, err := jsoniter.MarshalToString(jsoniter.WrapInt64(100))\n\tshould.Nil(err)\n\tshould.Equal(\"100\", str)\n}\n\nfunc Test_write_val_int(t *testing.T) {\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\tstream.WriteVal(1001)\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"1001\", buf.String())\n}\n\nfunc Test_write_val_int_ptr(t *testing.T) {\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\tval := 1001\n\tstream.WriteVal(&val)\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"1001\", buf.String())\n}\n\nfunc Test_float_as_int(t *testing.T) {\n\tshould := require.New(t)\n\tvar i int\n\tshould.NotNil(jsoniter.Unmarshal([]byte(`1.1`), &i))\n}\n\n// chunkedData is io.Reader which returns random amount of data in range [1, chunkedData.chunkSize].\n// It simulates chunked data on from HTTP server, which is commonly used by net/http package.\ntype chunkedData struct {\n\tchunkSize int\n\tdata      []byte\n\thead      int\n}\n\n// Read is implementation of the io.Reader which returns random amount of data in range [1, chunkedData.chunkSize].\nfunc (c *chunkedData) Read(p []byte) (n int, err error) {\n\tto := c.head + int(rand.Int31n(int32(c.chunkSize))+1)\n\n\t// copy does not copy more data then p can consume\n\tn = copy(p, c.data[c.head:to])\n\tc.head = c.head + n\n\tif c.head >= len(c.data) {\n\t\terr = io.EOF\n\t}\n\treturn n, err\n}\n\n// TestIterator_ReadInt_chunkedInput validates the behaviour of Iterator.ReadInt() method in where:\n// - it reads data from io.Reader,\n// - expected value is 0 (zero)\n// - Iterator.tail == Iterator.head\n// - Iterator.tail < len(Iterator.buf)\n// - value in buffer after Iterator.tail is presented from previous read and has '.' character.\nfunc TestIterator_ReadInt_chunkedInput(t *testing.T) {\n\tshould := require.New(t)\n\n\tdata := &chunkedData{\n\t\tdata: jsonFloatIntArray(t, 10),\n\t}\n\n\t// because this test is rely on randomness of chunkedData, we are doing multiple iterations to\n\t// be sure, that we can hit a required case.\n\tfor data.chunkSize = 3; data.chunkSize <= len(data.data); data.chunkSize++ {\n\t\tdata.head = 0\n\n\t\titer := jsoniter.Parse(jsoniter.ConfigDefault, data, data.chunkSize)\n\t\ti := 0\n\t\tfor iter.ReadArray() {\n\t\t\t// every even item is float, let's just skip it.\n\t\t\tif i%2 == 0 {\n\t\t\t\titer.Skip()\n\t\t\t\ti++\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tshould.Zero(iter.ReadInt())\n\t\t\tshould.NoError(iter.Error)\n\n\t\t\ti++\n\t\t}\n\t}\n}\n\n// jsonFloatIntArray generates JSON array where every\n//  - even item is float 0.1\n//  - odd item is integer 0\n//\n//  [0.1, 0, 0.1, 0]\nfunc jsonFloatIntArray(t *testing.T, numberOfItems int) []byte {\n\tt.Helper()\n\tnumbers := make([]jsoniter.Any, numberOfItems)\n\tfor i := range numbers {\n\t\tswitch i % 2 {\n\t\tcase 0:\n\t\t\tnumbers[i] = jsoniter.WrapFloat64(0.1)\n\t\tdefault:\n\t\t\tnumbers[i] = jsoniter.WrapInt64(0)\n\t\t}\n\t}\n\n\tfixture, err := jsoniter.ConfigFastest.Marshal(numbers)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tb := &bytes.Buffer{}\n\n\trequire.NoError(\n\t\tt,\n\t\tjson.Compact(b, fixture),\n\t\t\"json should be compactable\",\n\t)\n\treturn b.Bytes()\n}\n\nfunc Benchmark_jsoniter_encode_int(b *testing.B) {\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, ioutil.Discard, 64)\n\tfor n := 0; n < b.N; n++ {\n\t\tstream.Reset(nil)\n\t\tstream.WriteUint64(0xffffffff)\n\t}\n}\n\nfunc Benchmark_itoa(b *testing.B) {\n\tfor n := 0; n < b.N; n++ {\n\t\tstrconv.FormatInt(0xffffffff, 10)\n\t}\n}\n\nfunc Benchmark_jsoniter_int(b *testing.B) {\n\titer := jsoniter.NewIterator(jsoniter.ConfigDefault)\n\tinput := []byte(`100`)\n\tfor n := 0; n < b.N; n++ {\n\t\titer.ResetBytes(input)\n\t\titer.ReadInt64()\n\t}\n}\n\nfunc Benchmark_json_int(b *testing.B) {\n\tfor n := 0; n < b.N; n++ {\n\t\tresult := int64(0)\n\t\tjson.Unmarshal([]byte(`-100`), &result)\n\t}\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_interface_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"io\"\n\t\"testing\"\n)\n\nfunc Test_nil_non_empty_interface(t *testing.T) {\n\ttype TestObject struct {\n\t\tField []io.Closer\n\t}\n\tshould := require.New(t)\n\tobj := TestObject{}\n\tb := []byte(`{\"Field\":[\"AAA\"]}`)\n\tshould.NotNil(json.Unmarshal(b, &obj))\n\tshould.NotNil(jsoniter.Unmarshal(b, &obj))\n}\n\nfunc Test_nil_out_null_interface(t *testing.T) {\n\ttype TestData struct {\n\t\tField interface{} `json:\"field\"`\n\t}\n\tshould := require.New(t)\n\n\tvar boolVar bool\n\tobj := TestData{\n\t\tField: &boolVar,\n\t}\n\n\tdata1 := []byte(`{\"field\": true}`)\n\n\terr := jsoniter.Unmarshal(data1, &obj)\n\tshould.NoError(err)\n\tshould.Equal(true, *(obj.Field.(*bool)))\n\n\tdata2 := []byte(`{\"field\": null}`)\n\n\terr = jsoniter.Unmarshal(data2, &obj)\n\tshould.NoError(err)\n\tshould.Nil(obj.Field)\n\n\t// Checking stdlib behavior matches.\n\tobj2 := TestData{\n\t\tField: &boolVar,\n\t}\n\n\terr = json.Unmarshal(data1, &obj2)\n\tshould.NoError(err)\n\tshould.Equal(true, *(obj2.Field.(*bool)))\n\n\terr = json.Unmarshal(data2, &obj2)\n\tshould.NoError(err)\n\tshould.Equal(nil, obj2.Field)\n}\n\nfunc Test_overwrite_interface_ptr_value_with_nil(t *testing.T) {\n\ttype Wrapper struct {\n\t\tPayload interface{} `json:\"payload,omitempty\"`\n\t}\n\ttype Payload struct {\n\t\tValue int `json:\"val,omitempty\"`\n\t}\n\n\tshould := require.New(t)\n\n\tpayload := &Payload{}\n\twrapper := &Wrapper{\n\t\tPayload: &payload,\n\t}\n\n\terr := json.Unmarshal([]byte(`{\"payload\": {\"val\": 42}}`), &wrapper)\n\tshould.NoError(err)\n\tshould.Equal(&payload, wrapper.Payload)\n\tshould.Equal(42, (*(wrapper.Payload.(**Payload))).Value)\n\n\terr = json.Unmarshal([]byte(`{\"payload\": null}`), &wrapper)\n\tshould.NoError(err)\n\tshould.Equal(&payload, wrapper.Payload)\n\tshould.Equal((*Payload)(nil), payload)\n\n\tpayload = &Payload{}\n\twrapper = &Wrapper{\n\t\tPayload: &payload,\n\t}\n\n\terr = jsoniter.Unmarshal([]byte(`{\"payload\": {\"val\": 42}}`), &wrapper)\n\tshould.Equal(nil, err)\n\tshould.Equal(&payload, wrapper.Payload)\n\tshould.Equal(42, (*(wrapper.Payload.(**Payload))).Value)\n\n\terr = jsoniter.Unmarshal([]byte(`{\"payload\": null}`), &wrapper)\n\tshould.NoError(err)\n\tshould.Equal(&payload, wrapper.Payload)\n\tshould.Equal((*Payload)(nil), payload)\n}\n\nfunc Test_overwrite_interface_value_with_nil(t *testing.T) {\n\ttype Wrapper struct {\n\t\tPayload interface{} `json:\"payload,omitempty\"`\n\t}\n\ttype Payload struct {\n\t\tValue int `json:\"val,omitempty\"`\n\t}\n\n\tshould := require.New(t)\n\n\tpayload := &Payload{}\n\twrapper := &Wrapper{\n\t\tPayload: payload,\n\t}\n\n\terr := json.Unmarshal([]byte(`{\"payload\": {\"val\": 42}}`), &wrapper)\n\tshould.NoError(err)\n\tshould.Equal(42, wrapper.Payload.(*Payload).Value)\n\n\terr = json.Unmarshal([]byte(`{\"payload\": null}`), &wrapper)\n\tshould.NoError(err)\n\tshould.Equal(nil, wrapper.Payload)\n\tshould.Equal(42, payload.Value)\n\n\tpayload = &Payload{}\n\twrapper = &Wrapper{\n\t\tPayload: payload,\n\t}\n\n\terr = jsoniter.Unmarshal([]byte(`{\"payload\": {\"val\": 42}}`), &wrapper)\n\tshould.Equal(nil, err)\n\tshould.Equal(42, wrapper.Payload.(*Payload).Value)\n\n\terr = jsoniter.Unmarshal([]byte(`{\"payload\": null}`), &wrapper)\n\tshould.Equal(nil, err)\n\tshould.Equal(nil, wrapper.Payload)\n\tshould.Equal(42, payload.Value)\n}\n\nfunc Test_unmarshal_into_nil(t *testing.T) {\n\ttype Payload struct {\n\t\tValue int `json:\"val,omitempty\"`\n\t}\n\ttype Wrapper struct {\n\t\tPayload interface{} `json:\"payload,omitempty\"`\n\t}\n\n\tshould := require.New(t)\n\n\tvar payload *Payload\n\twrapper := &Wrapper{\n\t\tPayload: payload,\n\t}\n\n\terr := json.Unmarshal([]byte(`{\"payload\": {\"val\": 42}}`), &wrapper)\n\tshould.NoError(err)\n\tshould.NotNil(wrapper.Payload)\n\tshould.Nil(payload)\n\n\terr = json.Unmarshal([]byte(`{\"payload\": null}`), &wrapper)\n\tshould.NoError(err)\n\tshould.Nil(wrapper.Payload)\n\tshould.Nil(payload)\n\n\tpayload = nil\n\twrapper = &Wrapper{\n\t\tPayload: payload,\n\t}\n\n\terr = jsoniter.Unmarshal([]byte(`{\"payload\": {\"val\": 42}}`), &wrapper)\n\tshould.NoError(err)\n\tshould.NotNil(wrapper.Payload)\n\tshould.Nil(payload)\n\n\terr = jsoniter.Unmarshal([]byte(`{\"payload\": null}`), &wrapper)\n\tshould.NoError(err)\n\tshould.Nil(wrapper.Payload)\n\tshould.Nil(payload)\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_iterator_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_bad_case(t *testing.T) {\n\t// field := *(*string)(unsafe.Pointer(&str))\n\t// caused this issue\n\titer := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(`{\"Info\":{\"InfoHash\":\"4lzhP/fwlVLRgalC31YbfBSiqwo=\",\"InfoHashstr\":\"E25CE13FF7F09552D181A942DF561B7C14A2AB0A\",\"AnnounceList\":[\"http://tracker.nwps.ws:6969/announce\",\"http://tracker.nwps.ws:6969/announce\",\"http://tracker.winglai.com/announce\",\"http://fr33dom.h33t.com:3310/announce\",\"http://exodus.desync.com:6969/announce\",\"http://torrent.gresille.org/announce\",\"http://tracker.trackerfix.com/announce\",\"udp://tracker.btzoo.eu:80/announce\",\"http://tracker.windsormetalbattery.com/announce\",\"udp://10.rarbg.me:80/announce\",\"udp://ipv4.tracker.harry.lu:80/announce\",\"udp://tracker.ilibr.org:6969/announce\",\"udp://tracker.zond.org:80/announce\",\"http://torrent-tracker.ru/announce.php\",\"http://bigfoot1942.sektori.org:6969/announce\",\"http://tracker.best-torrents.net:6969/announce\",\"http://announce.torrentsmd.com:6969/announce\",\"udp://tracker.token.ro:80/announce\",\"udp://tracker.coppersurfer.tk:80\",\"http://tracker.thepiratebay.org/announce\",\"udp://9.rarbg.com:2710/announce\",\"udp://open.demonii.com:1337/announce\",\"udp://tracker.ccc.de:80/announce\",\"udp://tracker.istole.it:80/announce\",\"udp://tracker.publicbt.com:80/announce\",\"udp://tracker.openbittorrent.com:80/announce\",\"udp://tracker.istole.it:80/announce\",\"http://tracker.istole.it/announce\",\"udp://tracker.publicbt.com:80/announce\",\"http://tracker.publicbt.com/announce\",\"udp://open.demonii.com:1337/announce\"],\"Length\":2434793890,\"PieceSize\":524288,\"PieceNum\":4645},\"InfoHashstr\":\"E25CE13FF7F09552D181A942DF561B7C14A2AB0A\",\"SectionNum\":32,\"PieceNum\":4645,\"PieceSize\":16384,\"Finished\":false,\"SparseSize\":104857600,\"Bit\":[{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"},{\"Size\":4645,\"EndIndex\":580,\"EndMask\":248,\"Good\":0,\"Flush\":false,\"Bit\":\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}]}`), 4096)\n\tcount := 0\n\tfor field := iter.ReadObject(); field != \"\"; field = iter.ReadObject() {\n\t\tif field == \"Bit\" {\n\t\t\tfor iter.ReadArray() {\n\t\t\t\tfor field := iter.ReadObject(); field != \"\"; field = iter.ReadObject() {\n\t\t\t\t\tif field == \"Bit\" {\n\t\t\t\t\t\titer.ReadStringAsSlice()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif field != \"Size\" && field != \"EndIndex\" && field != \"EndMask\" && field != \"Good\" && field != \"Flush\" {\n\t\t\t\t\t\t\tt.Fatal(field)\n\t\t\t\t\t\t}\n\t\t\t\t\t\titer.Skip()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcount++\n\t\t\t}\n\t\t} else {\n\t\t\titer.Skip()\n\t\t}\n\t}\n\tif count != 32 {\n\t\tt.Fatal(count)\n\t}\n}\n\nfunc Test_iterator_use_number(t *testing.T) {\n\t// Test UseNumber with iterator Read()\n\tinputs := []string{`2147483647`, `-2147483648`}\n\tfor _, input := range inputs {\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.Config{UseNumber: true}.Froze(), input)\n\t\t\texpected := json.Number(input)\n\t\t\tshould.Equal(expected, iter.Read())\n\t\t})\n\t}\n}\n\nfunc Test_iterator_without_number(t *testing.T) {\n\tinputs := []string{`2147483647`, `-2147483648`}\n\tfor _, input := range inputs {\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input)\n\t\t\texpected, err := strconv.ParseInt(input, 10, 32)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(float64(expected), iter.Read())\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_map_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"encoding/json\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"strings\"\n)\n\nfunc Test_decode_TextMarshaler_key_map(t *testing.T) {\n\tshould := require.New(t)\n\tvar val map[*big.Float]string\n\tshould.Nil(jsoniter.UnmarshalFromString(`{\"1\":\"2\"}`, &val))\n\tstr, err := jsoniter.MarshalToString(val)\n\tshould.Nil(err)\n\tshould.Equal(`{\"1\":\"2\"}`, str)\n}\n\nfunc Test_read_map_with_reader(t *testing.T) {\n\tshould := require.New(t)\n\tinput := `{\"branch\":\"beta\",\"change_log\":\"add the rows{10}\",\"channel\":\"fros\",\"create_time\":\"2017-06-13 16:39:08\",\"firmware_list\":\"\",\"md5\":\"80dee2bf7305bcf179582088e29fd7b9\",\"note\":{\"CoreServices\":{\"md5\":\"d26975c0a8c7369f70ed699f2855cc2e\",\"package_name\":\"CoreServices\",\"version_code\":\"76\",\"version_name\":\"1.0.76\"},\"FrDaemon\":{\"md5\":\"6b1f0626673200bc2157422cd2103f5d\",\"package_name\":\"FrDaemon\",\"version_code\":\"390\",\"version_name\":\"1.0.390\"},\"FrGallery\":{\"md5\":\"90d767f0f31bcd3c1d27281ec979ba65\",\"package_name\":\"FrGallery\",\"version_code\":\"349\",\"version_name\":\"1.0.349\"},\"FrLocal\":{\"md5\":\"f15a215b2c070a80a01f07bde4f219eb\",\"package_name\":\"FrLocal\",\"version_code\":\"791\",\"version_name\":\"1.0.791\"}},\"pack_region_urls\":{\"CN\":\"https://s3.cn-north-1.amazonaws.com.cn/xxx-os/ttt_xxx_android_1.5.3.344.393.zip\",\"default\":\"http://192.168.8.78/ttt_xxx_android_1.5.3.344.393.zip\",\"local\":\"http://192.168.8.78/ttt_xxx_android_1.5.3.344.393.zip\"},\"pack_version\":\"1.5.3.344.393\",\"pack_version_code\":393,\"region\":\"all\",\"release_flag\":0,\"revision\":62,\"size\":38966875,\"status\":3}`\n\treader := strings.NewReader(input)\n\tdecoder := jsoniter.ConfigCompatibleWithStandardLibrary.NewDecoder(reader)\n\tm1 := map[string]interface{}{}\n\tshould.Nil(decoder.Decode(&m1))\n\tm2 := map[string]interface{}{}\n\tshould.Nil(json.Unmarshal([]byte(input), &m2))\n\tshould.Equal(m2, m1)\n\tshould.Equal(\"1.0.76\", m1[\"note\"].(map[string]interface{})[\"CoreServices\"].(map[string]interface{})[\"version_name\"])\n}\n\nfunc Test_map_eface_of_eface(t *testing.T) {\n\tshould := require.New(t)\n\tjson := jsoniter.ConfigCompatibleWithStandardLibrary\n\toutput, err := json.MarshalToString(map[interface{}]interface{}{\n\t\t\"1\": 2,\n\t\t3:   \"4\",\n\t})\n\tshould.NoError(err)\n\tshould.Equal(`{\"1\":2,\"3\":\"4\"}`, output)\n}\n\nfunc Test_encode_nil_map(t *testing.T) {\n\tshould := require.New(t)\n\tvar nilMap map[string]string\n\toutput, err := jsoniter.MarshalToString(nilMap)\n\tshould.NoError(err)\n\tshould.Equal(`null`, output)\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_nested_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n)\n\ntype Level1 struct {\n\tHello []Level2\n}\n\ntype Level2 struct {\n\tWorld string\n}\n\nfunc Test_deep_nested(t *testing.T) {\n\ttype unstructured interface{}\n\n\ttestcases := []struct {\n\t\tname        string\n\t\tdata        []byte\n\t\texpectError string\n\t}{\n\t\t{\n\t\t\tname:        \"array under maxDepth\",\n\t\t\tdata:        []byte(`{\"a\":` + strings.Repeat(`[`, 10000-1) + strings.Repeat(`]`, 10000-1) + `}`),\n\t\t\texpectError: \"\",\n\t\t},\n\t\t{\n\t\t\tname:        \"array over maxDepth\",\n\t\t\tdata:        []byte(`{\"a\":` + strings.Repeat(`[`, 10000) + strings.Repeat(`]`, 10000) + `}`),\n\t\t\texpectError: \"max depth\",\n\t\t},\n\t\t{\n\t\t\tname:        \"object under maxDepth\",\n\t\t\tdata:        []byte(`{\"a\":` + strings.Repeat(`{\"a\":`, 10000-1) + `0` + strings.Repeat(`}`, 10000-1) + `}`),\n\t\t\texpectError: \"\",\n\t\t},\n\t\t{\n\t\t\tname:        \"object over maxDepth\",\n\t\t\tdata:        []byte(`{\"a\":` + strings.Repeat(`{\"a\":`, 10000) + `0` + strings.Repeat(`}`, 10000) + `}`),\n\t\t\texpectError: \"max depth\",\n\t\t},\n\t}\n\n\ttargets := []struct {\n\t\tname string\n\t\tnew  func() interface{}\n\t}{\n\t\t{\n\t\t\tname: \"unstructured\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tvar v interface{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed named field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed missing field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 1 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 2 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 3 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 4 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t\tD interface{} `json:\"d\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 5 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t\tD interface{} `json:\"d\"`\n\t\t\t\t\tE interface{} `json:\"e\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 6 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t\tD interface{} `json:\"d\"`\n\t\t\t\t\tE interface{} `json:\"e\"`\n\t\t\t\t\tF interface{} `json:\"f\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 7 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t\tD interface{} `json:\"d\"`\n\t\t\t\t\tE interface{} `json:\"e\"`\n\t\t\t\t\tF interface{} `json:\"f\"`\n\t\t\t\t\tG interface{} `json:\"g\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 8 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t\tD interface{} `json:\"d\"`\n\t\t\t\t\tE interface{} `json:\"e\"`\n\t\t\t\t\tF interface{} `json:\"f\"`\n\t\t\t\t\tG interface{} `json:\"g\"`\n\t\t\t\t\tH interface{} `json:\"h\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 9 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t\tD interface{} `json:\"d\"`\n\t\t\t\t\tE interface{} `json:\"e\"`\n\t\t\t\t\tF interface{} `json:\"f\"`\n\t\t\t\t\tG interface{} `json:\"g\"`\n\t\t\t\t\tH interface{} `json:\"h\"`\n\t\t\t\t\tI interface{} `json:\"i\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 10 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t\tD interface{} `json:\"d\"`\n\t\t\t\t\tE interface{} `json:\"e\"`\n\t\t\t\t\tF interface{} `json:\"f\"`\n\t\t\t\t\tG interface{} `json:\"g\"`\n\t\t\t\t\tH interface{} `json:\"h\"`\n\t\t\t\t\tI interface{} `json:\"i\"`\n\t\t\t\t\tJ interface{} `json:\"j\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"typed 11 field\",\n\t\t\tnew: func() interface{} {\n\t\t\t\tv := struct {\n\t\t\t\t\tA interface{} `json:\"a\"`\n\t\t\t\t\tB interface{} `json:\"b\"`\n\t\t\t\t\tC interface{} `json:\"c\"`\n\t\t\t\t\tD interface{} `json:\"d\"`\n\t\t\t\t\tE interface{} `json:\"e\"`\n\t\t\t\t\tF interface{} `json:\"f\"`\n\t\t\t\t\tG interface{} `json:\"g\"`\n\t\t\t\t\tH interface{} `json:\"h\"`\n\t\t\t\t\tI interface{} `json:\"i\"`\n\t\t\t\t\tJ interface{} `json:\"j\"`\n\t\t\t\t\tK interface{} `json:\"k\"`\n\t\t\t\t}{}\n\t\t\t\treturn &v\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range testcases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tfor _, target := range targets {\n\t\t\t\tt.Run(target.name, func(t *testing.T) {\n\t\t\t\t\terr := jsoniter.Unmarshal(tc.data, target.new())\n\t\t\t\t\tif len(tc.expectError) == 0 {\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tt.Errorf(\"unexpected error: %v\", err)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif err == nil {\n\t\t\t\t\t\t\tt.Errorf(\"expected error, got none\")\n\t\t\t\t\t\t} else if !strings.Contains(err.Error(), tc.expectError) {\n\t\t\t\t\t\t\tt.Errorf(\"expected error containing '%s', got: %v\", tc.expectError, err)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_nested(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `{\"hello\": [{\"world\": \"value1\"}, {\"world\": \"value2\"}]}`)\n\tl1 := Level1{}\n\tfor l1Field := iter.ReadObject(); l1Field != \"\"; l1Field = iter.ReadObject() {\n\t\tswitch l1Field {\n\t\tcase \"hello\":\n\t\t\tl2Array := []Level2{}\n\t\t\tfor iter.ReadArray() {\n\t\t\t\tl2 := Level2{}\n\t\t\t\tfor l2Field := iter.ReadObject(); l2Field != \"\"; l2Field = iter.ReadObject() {\n\t\t\t\t\tswitch l2Field {\n\t\t\t\t\tcase \"world\":\n\t\t\t\t\t\tl2.World = iter.ReadString()\n\t\t\t\t\tdefault:\n\t\t\t\t\t\titer.ReportError(\"bind l2\", \"unexpected field: \"+l2Field)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tl2Array = append(l2Array, l2)\n\t\t\t}\n\t\t\tl1.Hello = l2Array\n\t\tdefault:\n\t\t\titer.ReportError(\"bind l1\", \"unexpected field: \"+l1Field)\n\t\t}\n\t}\n\tif !reflect.DeepEqual(l1, Level1{\n\t\tHello: []Level2{\n\t\t\t{World: \"value1\"},\n\t\t\t{World: \"value2\"},\n\t\t},\n\t}) {\n\t\tt.Fatal(l1)\n\t}\n}\n\nfunc Benchmark_jsoniter_nested(b *testing.B) {\n\tfor n := 0; n < b.N; n++ {\n\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `{\"hello\": [{\"world\": \"value1\"}, {\"world\": \"value2\"}]}`)\n\t\tl1 := Level1{}\n\t\tfor l1Field := iter.ReadObject(); l1Field != \"\"; l1Field = iter.ReadObject() {\n\t\t\tswitch l1Field {\n\t\t\tcase \"hello\":\n\t\t\t\tl1.Hello = readLevel1Hello(iter)\n\t\t\tdefault:\n\t\t\t\titer.Skip()\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc readLevel1Hello(iter *jsoniter.Iterator) []Level2 {\n\tl2Array := make([]Level2, 0, 2)\n\tfor iter.ReadArray() {\n\t\tl2 := Level2{}\n\t\tfor l2Field := iter.ReadObject(); l2Field != \"\"; l2Field = iter.ReadObject() {\n\t\t\tswitch l2Field {\n\t\t\tcase \"world\":\n\t\t\t\tl2.World = iter.ReadString()\n\t\t\tdefault:\n\t\t\t\titer.Skip()\n\t\t\t}\n\t\t}\n\t\tl2Array = append(l2Array, l2)\n\t}\n\treturn l2Array\n}\n\nfunc Benchmark_json_nested(b *testing.B) {\n\tfor n := 0; n < b.N; n++ {\n\t\tl1 := Level1{}\n\t\tjson.Unmarshal([]byte(`{\"hello\": [{\"world\": \"value1\"}, {\"world\": \"value2\"}]}`), &l1)\n\t}\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_null_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_read_null(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `null`)\n\tshould.True(iter.ReadNil())\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `null`)\n\tshould.Nil(iter.Read())\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `navy`)\n\titer.Read()\n\tshould.True(iter.Error != nil && iter.Error != io.EOF)\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `navy`)\n\titer.ReadNil()\n\tshould.True(iter.Error != nil && iter.Error != io.EOF)\n}\n\nfunc Test_write_null(t *testing.T) {\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\tstream.WriteNil()\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"null\", buf.String())\n}\n\nfunc Test_decode_null_object_field(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[null,\"a\"]`)\n\titer.ReadArray()\n\tif iter.ReadObject() != \"\" {\n\t\tt.FailNow()\n\t}\n\titer.ReadArray()\n\tif iter.ReadString() != \"a\" {\n\t\tt.FailNow()\n\t}\n\ttype TestObject struct {\n\t\tField string\n\t}\n\tobjs := []TestObject{}\n\tshould.Nil(jsoniter.UnmarshalFromString(\"[null]\", &objs))\n\tshould.Len(objs, 1)\n}\n\nfunc Test_decode_null_array_element(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[null,\"a\"]`)\n\tshould.True(iter.ReadArray())\n\tshould.True(iter.ReadNil())\n\tshould.True(iter.ReadArray())\n\tshould.Equal(\"a\", iter.ReadString())\n}\n\nfunc Test_decode_null_string(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[null,\"a\"]`)\n\tshould.True(iter.ReadArray())\n\tshould.Equal(\"\", iter.ReadString())\n\tshould.True(iter.ReadArray())\n\tshould.Equal(\"a\", iter.ReadString())\n}\n\nfunc Test_decode_null_skip(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[null,\"a\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tif iter.ReadString() != \"a\" {\n\t\tt.FailNow()\n\t}\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_object_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"bytes\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc Test_empty_object(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `{}`)\n\tfield := iter.ReadObject()\n\tshould.Equal(\"\", field)\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `{}`)\n\titer.ReadObjectCB(func(iter *jsoniter.Iterator, field string) bool {\n\t\tshould.FailNow(\"should not call\")\n\t\treturn true\n\t})\n}\n\nfunc Test_one_field(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `{\"a\": \"stream\"}`)\n\tfield := iter.ReadObject()\n\tshould.Equal(\"a\", field)\n\tvalue := iter.ReadString()\n\tshould.Equal(\"stream\", value)\n\tfield = iter.ReadObject()\n\tshould.Equal(\"\", field)\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `{\"a\": \"stream\"}`)\n\tshould.True(iter.ReadObjectCB(func(iter *jsoniter.Iterator, field string) bool {\n\t\tshould.Equal(\"a\", field)\n\t\titer.Skip()\n\t\treturn true\n\t}))\n\n}\n\nfunc Test_two_field(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `{ \"a\": \"stream\" , \"c\": \"d\" }`)\n\tfield := iter.ReadObject()\n\tshould.Equal(\"a\", field)\n\tvalue := iter.ReadString()\n\tshould.Equal(\"stream\", value)\n\tfield = iter.ReadObject()\n\tshould.Equal(\"c\", field)\n\tvalue = iter.ReadString()\n\tshould.Equal(\"d\", value)\n\tfield = iter.ReadObject()\n\tshould.Equal(\"\", field)\n\titer = jsoniter.ParseString(jsoniter.ConfigDefault, `{\"field1\": \"1\", \"field2\": 2}`)\n\tfor field := iter.ReadObject(); field != \"\"; field = iter.ReadObject() {\n\t\tswitch field {\n\t\tcase \"field1\":\n\t\t\titer.ReadString()\n\t\tcase \"field2\":\n\t\t\titer.ReadInt64()\n\t\tdefault:\n\t\t\titer.ReportError(\"bind object\", \"unexpected field\")\n\t\t}\n\t}\n}\n\nfunc Test_write_object(t *testing.T) {\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.Config{IndentionStep: 2}.Froze(), buf, 4096)\n\tstream.WriteObjectStart()\n\tstream.WriteObjectField(\"hello\")\n\tstream.WriteInt(1)\n\tstream.WriteMore()\n\tstream.WriteObjectField(\"world\")\n\tstream.WriteInt(2)\n\tstream.WriteObjectEnd()\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"{\\n  \\\"hello\\\": 1,\\n  \\\"world\\\": 2\\n}\", buf.String())\n}\n\nfunc Test_reader_and_load_more(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct {\n\t\tCreatedAt time.Time\n\t}\n\treader := strings.NewReader(`\n{\n\t\"agency\": null,\n\t\"candidateId\": 0,\n\t\"candidate\": \"Blah Blah\",\n\t\"bookingId\": 0,\n\t\"shiftId\": 1,\n\t\"shiftTypeId\": 0,\n\t\"shift\": \"Standard\",\n\t\"bonus\": 0,\n\t\"bonusNI\": 0,\n\t\"days\": [],\n\t\"totalHours\": 27,\n\t\"expenses\": [],\n\t\"weekEndingDateSystem\": \"2016-10-09\",\n\t\"weekEndingDateClient\": \"2016-10-09\",\n\t\"submittedAt\": null,\n\t\"submittedById\": null,\n\t\"approvedAt\": \"2016-10-10T18:38:04Z\",\n\t\"approvedById\": 0,\n\t\"authorisedAt\": \"2016-10-10T18:38:04Z\",\n\t\"authorisedById\": 0,\n\t\"invoicedAt\": \"2016-10-10T20:00:00Z\",\n\t\"revokedAt\": null,\n\t\"revokedById\": null,\n\t\"revokeReason\": null,\n\t\"rejectedAt\": null,\n\t\"rejectedById\": null,\n\t\"rejectReasonCode\": null,\n\t\"rejectReason\": null,\n\t\"createdAt\": \"2016-10-03T00:00:00Z\",\n\t\"updatedAt\": \"2016-11-09T10:26:13Z\",\n\t\"updatedById\": null,\n\t\"overrides\": [],\n\t\"bookingApproverId\": null,\n\t\"bookingApprover\": null,\n\t\"status\": \"approved\"\n}\n\t`)\n\tdecoder := jsoniter.ConfigCompatibleWithStandardLibrary.NewDecoder(reader)\n\tobj := TestObject{}\n\tshould.Nil(decoder.Decode(&obj))\n}\n\nfunc Test_unmarshal_into_existing_value(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct {\n\t\tField1 int\n\t\tField2 interface{}\n\t}\n\tvar obj TestObject\n\tm := map[string]interface{}{}\n\tobj.Field2 = &m\n\tcfg := jsoniter.Config{UseNumber: true}.Froze()\n\terr := cfg.Unmarshal([]byte(`{\"Field1\":1,\"Field2\":{\"k\":\"v\"}}`), &obj)\n\tshould.NoError(err)\n\tshould.Equal(map[string]interface{}{\n\t\t\"k\": \"v\",\n\t}, m)\n}\n\n// for issue421\nfunc Test_unmarshal_anonymous_struct_invalid(t *testing.T) {\n\tshould := require.New(t)\n\tt0 := struct {\n\t\tField1 string\n\t}{}\n\n\tcfg := jsoniter.ConfigCompatibleWithStandardLibrary\n\terr := cfg.UnmarshalFromString(`{\"Field1\":`, &t0)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t0).String())\n\n\tcfgCaseSensitive := jsoniter.Config{\n\t\tCaseSensitive: true,\n\t}.Froze()\n\n\ttype TestObject1 struct {\n\t\tField1 struct {\n\t\t\tInnerField1 string\n\t\t}\n\t}\n\tt1 := TestObject1{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field1\":{\"InnerField1\"`, &t1)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t1.Field1).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t1).String())\n\n\ttype TestObject2 struct {\n\t\tField1 int\n\t\tField2 struct {\n\t\t\tInnerField1 string\n\t\t\tInnerField2 string\n\t\t}\n\t}\n\tt2 := TestObject2{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field2\":{\"InnerField2\"`, &t2)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t2.Field2).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t2).String())\n\n\ttype TestObject3 struct {\n\t\tField1 int\n\t\tField2 int\n\t\tField3 struct {\n\t\t\tInnerField1 string\n\t\t\tInnerField2 string\n\t\t\tInnerField3 string\n\t\t}\n\t}\n\tt3 := TestObject3{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field3\":{\"InnerField3\"`, &t3)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t3.Field3).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t3).String())\n\n\ttype TestObject4 struct {\n\t\tField1 int\n\t\tField2 int\n\t\tField3 int\n\t\tField4 struct {\n\t\t\tInnerField1 string\n\t\t\tInnerField2 string\n\t\t\tInnerField3 string\n\t\t\tInnerField4 string\n\t\t}\n\t}\n\tt4 := TestObject4{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field4\":{\"InnerField4\"`, &t4)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t4.Field4).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t4).String())\n\n\ttype TestObject5 struct {\n\t\tField1 int\n\t\tField2 int\n\t\tField3 int\n\t\tField4 int\n\t\tField5 struct {\n\t\t\tInnerField1 string\n\t\t\tInnerField2 string\n\t\t\tInnerField3 string\n\t\t\tInnerField4 string\n\t\t\tInnerField5 string\n\t\t}\n\t}\n\tt5 := TestObject5{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field5\":{\"InnerField5\"`, &t5)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t5.Field5).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t5).String())\n\n\ttype TestObject6 struct {\n\t\tField1 int\n\t\tField2 int\n\t\tField3 int\n\t\tField4 int\n\t\tField5 int\n\t\tField6 struct {\n\t\t\tInnerField1 string\n\t\t\tInnerField2 string\n\t\t\tInnerField3 string\n\t\t\tInnerField4 string\n\t\t\tInnerField5 string\n\t\t\tInnerField6 string\n\t\t}\n\t}\n\tt6 := TestObject6{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field6\":{\"InnerField6\"`, &t6)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t6.Field6).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t6).String())\n\n\ttype TestObject7 struct {\n\t\tField1 int\n\t\tField2 int\n\t\tField3 int\n\t\tField4 int\n\t\tField5 int\n\t\tField6 int\n\t\tField7 struct {\n\t\t\tInnerField1 string\n\t\t\tInnerField2 string\n\t\t\tInnerField3 string\n\t\t\tInnerField4 string\n\t\t\tInnerField5 string\n\t\t\tInnerField6 string\n\t\t\tInnerField7 string\n\t\t}\n\t}\n\tt7 := TestObject7{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field7\":{\"InnerField7\"`, &t7)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t7.Field7).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t7).String())\n\n\ttype TestObject8 struct {\n\t\tField1 int\n\t\tField2 int\n\t\tField3 int\n\t\tField4 int\n\t\tField5 int\n\t\tField6 int\n\t\tField7 int\n\t\tField8 struct {\n\t\t\tInnerField1 string\n\t\t\tInnerField2 string\n\t\t\tInnerField3 string\n\t\t\tInnerField4 string\n\t\t\tInnerField5 string\n\t\t\tInnerField6 string\n\t\t\tInnerField7 string\n\t\t\tInnerField8 string\n\t\t}\n\t}\n\tt8 := TestObject8{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field8\":{\"InnerField8\"`, &t8)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t8.Field8).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t8).String())\n\n\ttype TestObject9 struct {\n\t\tField1 int\n\t\tField2 int\n\t\tField3 int\n\t\tField4 int\n\t\tField5 int\n\t\tField6 int\n\t\tField7 int\n\t\tField8 int\n\t\tField9 struct {\n\t\t\tInnerField1 string\n\t\t\tInnerField2 string\n\t\t\tInnerField3 string\n\t\t\tInnerField4 string\n\t\t\tInnerField5 string\n\t\t\tInnerField6 string\n\t\t\tInnerField7 string\n\t\t\tInnerField8 string\n\t\t\tInnerField9 string\n\t\t}\n\t}\n\tt9 := TestObject9{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field9\":{\"InnerField9\"`, &t9)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t9.Field9).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t9).String())\n\n\ttype TestObject10 struct {\n\t\tField1  int\n\t\tField2  int\n\t\tField3  int\n\t\tField4  int\n\t\tField5  int\n\t\tField6  int\n\t\tField7  int\n\t\tField8  int\n\t\tField9  int\n\t\tField10 struct {\n\t\t\tInnerField1  string\n\t\t\tInnerField2  string\n\t\t\tInnerField3  string\n\t\t\tInnerField4  string\n\t\t\tInnerField5  string\n\t\t\tInnerField6  string\n\t\t\tInnerField7  string\n\t\t\tInnerField8  string\n\t\t\tInnerField9  string\n\t\t\tInnerField10 string\n\t\t}\n\t}\n\tt10 := TestObject10{}\n\terr = cfgCaseSensitive.UnmarshalFromString(`{\"Field10\":{\"InnerField10\"`, &t10)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t10.Field10).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t10).String())\n\n\terr = cfg.UnmarshalFromString(`{\"Field10\":{\"InnerField10\"`, &t10)\n\tshould.NotNil(err)\n\tshould.NotContains(err.Error(), reflect.TypeOf(t10.Field10).String())\n\tshould.Contains(err.Error(), reflect.TypeOf(t10).String())\n}\n"
  },
  {
    "path": "misc_tests/jsoniter_raw_message_test.go",
    "content": "package misc_tests\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc Test_jsoniter_RawMessage(t *testing.T) {\n\tshould := require.New(t)\n\tvar data jsoniter.RawMessage\n\tshould.Nil(jsoniter.Unmarshal([]byte(`[1,2,3]`), &data))\n\tshould.Equal(`[1,2,3]`, string(data))\n\tstr, err := jsoniter.MarshalToString(data)\n\tshould.Nil(err)\n\tshould.Equal(`[1,2,3]`, str)\n}\n\nfunc Test_encode_map_of_jsoniter_raw_message(t *testing.T) {\n\tshould := require.New(t)\n\ttype RawMap map[string]*jsoniter.RawMessage\n\tvalue := jsoniter.RawMessage(\"[]\")\n\trawMap := RawMap{\"hello\": &value}\n\toutput, err := jsoniter.MarshalToString(rawMap)\n\tshould.Nil(err)\n\tshould.Equal(`{\"hello\":[]}`, output)\n}\n\nfunc Test_marshal_invalid_json_raw_message(t *testing.T) {\n\ttype A struct {\n\t\tRaw json.RawMessage `json:\"raw\"`\n\t}\n\tmessage := []byte(`{}`)\n\n\ta := A{}\n\tshould := require.New(t)\n\tshould.Nil(jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(message, &a))\n\taout, aouterr := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(&a)\n\tshould.Equal(`{\"raw\":null}`, string(aout))\n\tshould.Nil(aouterr)\n}\n\nfunc Test_marshal_nil_json_raw_message(t *testing.T) {\n\ttype A struct {\n\t\tNil1 jsoniter.RawMessage `json:\"raw1\"`\n\t\tNil2 json.RawMessage     `json:\"raw2\"`\n\t}\n\n\ta := A{}\n\tshould := require.New(t)\n\taout, aouterr := jsoniter.Marshal(&a)\n\tshould.Equal(`{\"raw1\":null,\"raw2\":null}`, string(aout))\n\tshould.Nil(aouterr)\n\n\ta.Nil1 = []byte(`Any`)\n\ta.Nil2 = []byte(`Any`)\n\tshould.Nil(jsoniter.Unmarshal(aout, &a))\n\tshould.Nil(a.Nil1)\n\tshould.Nil(a.Nil2)\n}\n\nfunc Test_raw_message_memory_not_copied_issue(t *testing.T) {\n\tjsonStream := `{\"name\":\"xxxxx\",\"bundle_id\":\"com.zonst.majiang\",\"app_platform\":\"ios\",\"app_category\":\"100103\", \"budget_day\":1000,\"bidding_min\":1,\"bidding_max\":2,\"bidding_type\":\"CPM\", \"freq\":{\"open\":true,\"type\":\"day\",\"num\":100},\"speed\":1, \"targeting\":{\"vendor\":{\"open\":true,\"list\":[\"zonst\"]}, \"geo_code\":{\"open\":true,\"list\":[\"156110100\"]},\"app_category\":{\"open\":true,\"list\":[\"100101\"]}, \"day_parting\":{\"open\":true,\"list\":[\"100409\",\"100410\"]},\"device_type\":{\"open\":true,\"list\":[\"ipad\"]}, \"os_version\":{\"open\":true,\"list\":[10]},\"carrier\":{\"open\":true,\"list\":[\"mobile\"]}, \"network\":{\"open\":true,\"list\":[\"4G\"]}},\"url\":{\"tracking_imp_url\":\"http://www.baidu.com\", \"tracking_clk_url\":\"http://www.baidu.com\",\"jump_url\":\"http://www.baidu.com\",\"deep_link_url\":\"http://www.baidu.com\"}}`\n\ttype IteratorObject struct {\n\t\tName        *string              `json:\"name\"`\n\t\tBundleId    *string              `json:\"bundle_id\"`\n\t\tAppCategory *string              `json:\"app_category\"`\n\t\tAppPlatform *string              `json:\"app_platform\"`\n\t\tBudgetDay   *float32             `json:\"budget_day\"`\n\t\tBiddingMax  *float32             `json:\"bidding_max\"`\n\t\tBiddingMin  *float32             `json:\"bidding_min\"`\n\t\tBiddingType *string              `json:\"bidding_type\"`\n\t\tFreq        *jsoniter.RawMessage `json:\"freq\"`\n\t\tTargeting   *jsoniter.RawMessage `json:\"targeting\"`\n\t\tUrl         *jsoniter.RawMessage `json:\"url\"`\n\t\tSpeed       *int                 `json:\"speed\" db:\"speed\"`\n\t}\n\n\tobj := &IteratorObject{}\n\tdecoder := jsoniter.NewDecoder(strings.NewReader(jsonStream))\n\terr := decoder.Decode(obj)\n\tshould := require.New(t)\n\tshould.Nil(err)\n\tshould.Equal(`{\"open\":true,\"type\":\"day\",\"num\":100}`, string(*obj.Freq))\n}\n"
  },
  {
    "path": "pool.go",
    "content": "package jsoniter\n\nimport (\n\t\"io\"\n)\n\n// IteratorPool a thread safe pool of iterators with same configuration\ntype IteratorPool interface {\n\tBorrowIterator(data []byte) *Iterator\n\tReturnIterator(iter *Iterator)\n}\n\n// StreamPool a thread safe pool of streams with same configuration\ntype StreamPool interface {\n\tBorrowStream(writer io.Writer) *Stream\n\tReturnStream(stream *Stream)\n}\n\nfunc (cfg *frozenConfig) BorrowStream(writer io.Writer) *Stream {\n\tstream := cfg.streamPool.Get().(*Stream)\n\tstream.Reset(writer)\n\treturn stream\n}\n\nfunc (cfg *frozenConfig) ReturnStream(stream *Stream) {\n\tstream.out = nil\n\tstream.Error = nil\n\tstream.Attachment = nil\n\tcfg.streamPool.Put(stream)\n}\n\nfunc (cfg *frozenConfig) BorrowIterator(data []byte) *Iterator {\n\titer := cfg.iteratorPool.Get().(*Iterator)\n\titer.ResetBytes(data)\n\treturn iter\n}\n\nfunc (cfg *frozenConfig) ReturnIterator(iter *Iterator) {\n\titer.Error = nil\n\titer.Attachment = nil\n\tcfg.iteratorPool.Put(iter)\n}\n"
  },
  {
    "path": "reflect.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"unsafe\"\n\n\t\"github.com/modern-go/reflect2\"\n)\n\n// ValDecoder is an internal type registered to cache as needed.\n// Don't confuse jsoniter.ValDecoder with json.Decoder.\n// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link).\n//\n// Reflection on type to create decoders, which is then cached\n// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions\n// 1. create instance of new value, for example *int will need a int to be allocated\n// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New\n// 3. assignment to map, both key and value will be reflect.Value\n// For a simple struct binding, it will be reflect.Value free and allocation free\ntype ValDecoder interface {\n\tDecode(ptr unsafe.Pointer, iter *Iterator)\n}\n\n// ValEncoder is an internal type registered to cache as needed.\n// Don't confuse jsoniter.ValEncoder with json.Encoder.\n// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link).\ntype ValEncoder interface {\n\tIsEmpty(ptr unsafe.Pointer) bool\n\tEncode(ptr unsafe.Pointer, stream *Stream)\n}\n\ntype checkIsEmpty interface {\n\tIsEmpty(ptr unsafe.Pointer) bool\n}\n\ntype ctx struct {\n\t*frozenConfig\n\tprefix   string\n\tencoders map[reflect2.Type]ValEncoder\n\tdecoders map[reflect2.Type]ValDecoder\n}\n\nfunc (b *ctx) caseSensitive() bool {\n\tif b.frozenConfig == nil {\n\t\t// default is case-insensitive\n\t\treturn false\n\t}\n\treturn b.frozenConfig.caseSensitive\n}\n\nfunc (b *ctx) append(prefix string) *ctx {\n\treturn &ctx{\n\t\tfrozenConfig: b.frozenConfig,\n\t\tprefix:       b.prefix + \" \" + prefix,\n\t\tencoders:     b.encoders,\n\t\tdecoders:     b.decoders,\n\t}\n}\n\n// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal\nfunc (iter *Iterator) ReadVal(obj interface{}) {\n\tdepth := iter.depth\n\tcacheKey := reflect2.RTypeOf(obj)\n\tdecoder := iter.cfg.getDecoderFromCache(cacheKey)\n\tif decoder == nil {\n\t\ttyp := reflect2.TypeOf(obj)\n\t\tif typ == nil || typ.Kind() != reflect.Ptr {\n\t\t\titer.ReportError(\"ReadVal\", \"can only unmarshal into pointer\")\n\t\t\treturn\n\t\t}\n\t\tdecoder = iter.cfg.DecoderOf(typ)\n\t}\n\tptr := reflect2.PtrOf(obj)\n\tif ptr == nil {\n\t\titer.ReportError(\"ReadVal\", \"can not read into nil pointer\")\n\t\treturn\n\t}\n\tdecoder.Decode(ptr, iter)\n\tif iter.depth != depth {\n\t\titer.ReportError(\"ReadVal\", \"unexpected mismatched nesting\")\n\t\treturn\n\t}\n}\n\n// WriteVal copy the go interface into underlying JSON, same as json.Marshal\nfunc (stream *Stream) WriteVal(val interface{}) {\n\tif nil == val {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tcacheKey := reflect2.RTypeOf(val)\n\tencoder := stream.cfg.getEncoderFromCache(cacheKey)\n\tif encoder == nil {\n\t\ttyp := reflect2.TypeOf(val)\n\t\tencoder = stream.cfg.EncoderOf(typ)\n\t}\n\tencoder.Encode(reflect2.PtrOf(val), stream)\n}\n\nfunc (cfg *frozenConfig) DecoderOf(typ reflect2.Type) ValDecoder {\n\tcacheKey := typ.RType()\n\tdecoder := cfg.getDecoderFromCache(cacheKey)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tctx := &ctx{\n\t\tfrozenConfig: cfg,\n\t\tprefix:       \"\",\n\t\tdecoders:     map[reflect2.Type]ValDecoder{},\n\t\tencoders:     map[reflect2.Type]ValEncoder{},\n\t}\n\tptrType := typ.(*reflect2.UnsafePtrType)\n\tdecoder = decoderOfType(ctx, ptrType.Elem())\n\tcfg.addDecoderToCache(cacheKey, decoder)\n\treturn decoder\n}\n\nfunc decoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tdecoder := getTypeDecoderFromExtension(ctx, typ)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tdecoder = createDecoderOfType(ctx, typ)\n\tfor _, extension := range extensions {\n\t\tdecoder = extension.DecorateDecoder(typ, decoder)\n\t}\n\tdecoder = ctx.decoderExtension.DecorateDecoder(typ, decoder)\n\tfor _, extension := range ctx.extraExtensions {\n\t\tdecoder = extension.DecorateDecoder(typ, decoder)\n\t}\n\treturn decoder\n}\n\nfunc createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tdecoder := ctx.decoders[typ]\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tplaceholder := &placeholderDecoder{}\n\tctx.decoders[typ] = placeholder\n\tdecoder = _createDecoderOfType(ctx, typ)\n\tplaceholder.decoder = decoder\n\treturn decoder\n}\n\nfunc _createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tdecoder := createDecoderOfJsonRawMessage(ctx, typ)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tdecoder = createDecoderOfJsonNumber(ctx, typ)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tdecoder = createDecoderOfMarshaler(ctx, typ)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tdecoder = createDecoderOfAny(ctx, typ)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tdecoder = createDecoderOfNative(ctx, typ)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tswitch typ.Kind() {\n\tcase reflect.Interface:\n\t\tifaceType, isIFace := typ.(*reflect2.UnsafeIFaceType)\n\t\tif isIFace {\n\t\t\treturn &ifaceDecoder{valType: ifaceType}\n\t\t}\n\t\treturn &efaceDecoder{}\n\tcase reflect.Struct:\n\t\treturn decoderOfStruct(ctx, typ)\n\tcase reflect.Array:\n\t\treturn decoderOfArray(ctx, typ)\n\tcase reflect.Slice:\n\t\treturn decoderOfSlice(ctx, typ)\n\tcase reflect.Map:\n\t\treturn decoderOfMap(ctx, typ)\n\tcase reflect.Ptr:\n\t\treturn decoderOfOptional(ctx, typ)\n\tdefault:\n\t\treturn &lazyErrorDecoder{err: fmt.Errorf(\"%s%s is unsupported type\", ctx.prefix, typ.String())}\n\t}\n}\n\nfunc (cfg *frozenConfig) EncoderOf(typ reflect2.Type) ValEncoder {\n\tcacheKey := typ.RType()\n\tencoder := cfg.getEncoderFromCache(cacheKey)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tctx := &ctx{\n\t\tfrozenConfig: cfg,\n\t\tprefix:       \"\",\n\t\tdecoders:     map[reflect2.Type]ValDecoder{},\n\t\tencoders:     map[reflect2.Type]ValEncoder{},\n\t}\n\tencoder = encoderOfType(ctx, typ)\n\tif typ.LikePtr() {\n\t\tencoder = &onePtrEncoder{encoder}\n\t}\n\tcfg.addEncoderToCache(cacheKey, encoder)\n\treturn encoder\n}\n\ntype onePtrEncoder struct {\n\tencoder ValEncoder\n}\n\nfunc (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.encoder.IsEmpty(unsafe.Pointer(&ptr))\n}\n\nfunc (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tencoder.encoder.Encode(unsafe.Pointer(&ptr), stream)\n}\n\nfunc encoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tencoder := getTypeEncoderFromExtension(ctx, typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tencoder = createEncoderOfType(ctx, typ)\n\tfor _, extension := range extensions {\n\t\tencoder = extension.DecorateEncoder(typ, encoder)\n\t}\n\tencoder = ctx.encoderExtension.DecorateEncoder(typ, encoder)\n\tfor _, extension := range ctx.extraExtensions {\n\t\tencoder = extension.DecorateEncoder(typ, encoder)\n\t}\n\treturn encoder\n}\n\nfunc createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tencoder := ctx.encoders[typ]\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tplaceholder := &placeholderEncoder{}\n\tctx.encoders[typ] = placeholder\n\tencoder = _createEncoderOfType(ctx, typ)\n\tplaceholder.encoder = encoder\n\treturn encoder\n}\nfunc _createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tencoder := createEncoderOfJsonRawMessage(ctx, typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tencoder = createEncoderOfJsonNumber(ctx, typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tencoder = createEncoderOfMarshaler(ctx, typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tencoder = createEncoderOfAny(ctx, typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tencoder = createEncoderOfNative(ctx, typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tkind := typ.Kind()\n\tswitch kind {\n\tcase reflect.Interface:\n\t\treturn &dynamicEncoder{typ}\n\tcase reflect.Struct:\n\t\treturn encoderOfStruct(ctx, typ)\n\tcase reflect.Array:\n\t\treturn encoderOfArray(ctx, typ)\n\tcase reflect.Slice:\n\t\treturn encoderOfSlice(ctx, typ)\n\tcase reflect.Map:\n\t\treturn encoderOfMap(ctx, typ)\n\tcase reflect.Ptr:\n\t\treturn encoderOfOptional(ctx, typ)\n\tdefault:\n\t\treturn &lazyErrorEncoder{err: fmt.Errorf(\"%s%s is unsupported type\", ctx.prefix, typ.String())}\n\t}\n}\n\ntype lazyErrorDecoder struct {\n\terr error\n}\n\nfunc (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif iter.WhatIsNext() != NilValue {\n\t\tif iter.Error == nil {\n\t\t\titer.Error = decoder.err\n\t\t}\n\t} else {\n\t\titer.Skip()\n\t}\n}\n\ntype lazyErrorEncoder struct {\n\terr error\n}\n\nfunc (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif ptr == nil {\n\t\tstream.WriteNil()\n\t} else if stream.Error == nil {\n\t\tstream.Error = encoder.err\n\t}\n}\n\nfunc (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn false\n}\n\ntype placeholderDecoder struct {\n\tdecoder ValDecoder\n}\n\nfunc (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tdecoder.decoder.Decode(ptr, iter)\n}\n\ntype placeholderEncoder struct {\n\tencoder ValEncoder\n}\n\nfunc (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tencoder.encoder.Encode(ptr, stream)\n}\n\nfunc (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.encoder.IsEmpty(ptr)\n}\n"
  },
  {
    "path": "reflect_array.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"github.com/modern-go/reflect2\"\n\t\"io\"\n\t\"unsafe\"\n)\n\nfunc decoderOfArray(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tarrayType := typ.(*reflect2.UnsafeArrayType)\n\tdecoder := decoderOfType(ctx.append(\"[arrayElem]\"), arrayType.Elem())\n\treturn &arrayDecoder{arrayType, decoder}\n}\n\nfunc encoderOfArray(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tarrayType := typ.(*reflect2.UnsafeArrayType)\n\tif arrayType.Len() == 0 {\n\t\treturn emptyArrayEncoder{}\n\t}\n\tencoder := encoderOfType(ctx.append(\"[arrayElem]\"), arrayType.Elem())\n\treturn &arrayEncoder{arrayType, encoder}\n}\n\ntype emptyArrayEncoder struct{}\n\nfunc (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteEmptyArray()\n}\n\nfunc (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn true\n}\n\ntype arrayEncoder struct {\n\tarrayType   *reflect2.UnsafeArrayType\n\telemEncoder ValEncoder\n}\n\nfunc (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteArrayStart()\n\telemPtr := unsafe.Pointer(ptr)\n\tencoder.elemEncoder.Encode(elemPtr, stream)\n\tfor i := 1; i < encoder.arrayType.Len(); i++ {\n\t\tstream.WriteMore()\n\t\telemPtr = encoder.arrayType.UnsafeGetIndex(ptr, i)\n\t\tencoder.elemEncoder.Encode(elemPtr, stream)\n\t}\n\tstream.WriteArrayEnd()\n\tif stream.Error != nil && stream.Error != io.EOF {\n\t\tstream.Error = fmt.Errorf(\"%v: %s\", encoder.arrayType, stream.Error.Error())\n\t}\n}\n\nfunc (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn false\n}\n\ntype arrayDecoder struct {\n\tarrayType   *reflect2.UnsafeArrayType\n\telemDecoder ValDecoder\n}\n\nfunc (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tdecoder.doDecode(ptr, iter)\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\titer.Error = fmt.Errorf(\"%v: %s\", decoder.arrayType, iter.Error.Error())\n\t}\n}\n\nfunc (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) {\n\tc := iter.nextToken()\n\tarrayType := decoder.arrayType\n\tif c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\treturn\n\t}\n\tif c != '[' {\n\t\titer.ReportError(\"decode array\", \"expect [ or n, but found \"+string([]byte{c}))\n\t\treturn\n\t}\n\tc = iter.nextToken()\n\tif c == ']' {\n\t\treturn\n\t}\n\titer.unreadByte()\n\telemPtr := arrayType.UnsafeGetIndex(ptr, 0)\n\tdecoder.elemDecoder.Decode(elemPtr, iter)\n\tlength := 1\n\tfor c = iter.nextToken(); c == ','; c = iter.nextToken() {\n\t\tif length >= arrayType.Len() {\n\t\t\titer.Skip()\n\t\t\tcontinue\n\t\t}\n\t\tidx := length\n\t\tlength += 1\n\t\telemPtr = arrayType.UnsafeGetIndex(ptr, idx)\n\t\tdecoder.elemDecoder.Decode(elemPtr, iter)\n\t}\n\tif c != ']' {\n\t\titer.ReportError(\"decode array\", \"expect ], but found \"+string([]byte{c}))\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "reflect_dynamic.go",
    "content": "package jsoniter\n\nimport (\n\t\"github.com/modern-go/reflect2\"\n\t\"reflect\"\n\t\"unsafe\"\n)\n\ntype dynamicEncoder struct {\n\tvalType reflect2.Type\n}\n\nfunc (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tobj := encoder.valType.UnsafeIndirect(ptr)\n\tstream.WriteVal(obj)\n}\n\nfunc (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.valType.UnsafeIndirect(ptr) == nil\n}\n\ntype efaceDecoder struct {\n}\n\nfunc (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tpObj := (*interface{})(ptr)\n\tobj := *pObj\n\tif obj == nil {\n\t\t*pObj = iter.Read()\n\t\treturn\n\t}\n\ttyp := reflect2.TypeOf(obj)\n\tif typ.Kind() != reflect.Ptr {\n\t\t*pObj = iter.Read()\n\t\treturn\n\t}\n\tptrType := typ.(*reflect2.UnsafePtrType)\n\tptrElemType := ptrType.Elem()\n\tif iter.WhatIsNext() == NilValue {\n\t\tif ptrElemType.Kind() != reflect.Ptr {\n\t\t\titer.skipFourBytes('n', 'u', 'l', 'l')\n\t\t\t*pObj = nil\n\t\t\treturn\n\t\t}\n\t}\n\tif reflect2.IsNil(obj) {\n\t\tobj := ptrElemType.New()\n\t\titer.ReadVal(obj)\n\t\t*pObj = obj\n\t\treturn\n\t}\n\titer.ReadVal(obj)\n}\n\ntype ifaceDecoder struct {\n\tvalType *reflect2.UnsafeIFaceType\n}\n\nfunc (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif iter.ReadNil() {\n\t\tdecoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew())\n\t\treturn\n\t}\n\tobj := decoder.valType.UnsafeIndirect(ptr)\n\tif reflect2.IsNil(obj) {\n\t\titer.ReportError(\"decode non empty interface\", \"can not unmarshal into nil\")\n\t\treturn\n\t}\n\titer.ReadVal(obj)\n}\n"
  },
  {
    "path": "reflect_extension.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"github.com/modern-go/reflect2\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\t\"unicode\"\n\t\"unsafe\"\n)\n\nvar typeDecoders = map[string]ValDecoder{}\nvar fieldDecoders = map[string]ValDecoder{}\nvar typeEncoders = map[string]ValEncoder{}\nvar fieldEncoders = map[string]ValEncoder{}\nvar extensions = []Extension{}\n\n// StructDescriptor describe how should we encode/decode the struct\ntype StructDescriptor struct {\n\tType   reflect2.Type\n\tFields []*Binding\n}\n\n// GetField get one field from the descriptor by its name.\n// Can not use map here to keep field orders.\nfunc (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding {\n\tfor _, binding := range structDescriptor.Fields {\n\t\tif binding.Field.Name() == fieldName {\n\t\t\treturn binding\n\t\t}\n\t}\n\treturn nil\n}\n\n// Binding describe how should we encode/decode the struct field\ntype Binding struct {\n\tlevels    []int\n\tField     reflect2.StructField\n\tFromNames []string\n\tToNames   []string\n\tEncoder   ValEncoder\n\tDecoder   ValDecoder\n}\n\n// Extension the one for all SPI. Customize encoding/decoding by specifying alternate encoder/decoder.\n// Can also rename fields by UpdateStructDescriptor.\ntype Extension interface {\n\tUpdateStructDescriptor(structDescriptor *StructDescriptor)\n\tCreateMapKeyDecoder(typ reflect2.Type) ValDecoder\n\tCreateMapKeyEncoder(typ reflect2.Type) ValEncoder\n\tCreateDecoder(typ reflect2.Type) ValDecoder\n\tCreateEncoder(typ reflect2.Type) ValEncoder\n\tDecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder\n\tDecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder\n}\n\n// DummyExtension embed this type get dummy implementation for all methods of Extension\ntype DummyExtension struct {\n}\n\n// UpdateStructDescriptor No-op\nfunc (extension *DummyExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) {\n}\n\n// CreateMapKeyDecoder No-op\nfunc (extension *DummyExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder {\n\treturn nil\n}\n\n// CreateMapKeyEncoder No-op\nfunc (extension *DummyExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder {\n\treturn nil\n}\n\n// CreateDecoder No-op\nfunc (extension *DummyExtension) CreateDecoder(typ reflect2.Type) ValDecoder {\n\treturn nil\n}\n\n// CreateEncoder No-op\nfunc (extension *DummyExtension) CreateEncoder(typ reflect2.Type) ValEncoder {\n\treturn nil\n}\n\n// DecorateDecoder No-op\nfunc (extension *DummyExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder {\n\treturn decoder\n}\n\n// DecorateEncoder No-op\nfunc (extension *DummyExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder {\n\treturn encoder\n}\n\ntype EncoderExtension map[reflect2.Type]ValEncoder\n\n// UpdateStructDescriptor No-op\nfunc (extension EncoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) {\n}\n\n// CreateDecoder No-op\nfunc (extension EncoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder {\n\treturn nil\n}\n\n// CreateEncoder get encoder from map\nfunc (extension EncoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder {\n\treturn extension[typ]\n}\n\n// CreateMapKeyDecoder No-op\nfunc (extension EncoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder {\n\treturn nil\n}\n\n// CreateMapKeyEncoder No-op\nfunc (extension EncoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder {\n\treturn nil\n}\n\n// DecorateDecoder No-op\nfunc (extension EncoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder {\n\treturn decoder\n}\n\n// DecorateEncoder No-op\nfunc (extension EncoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder {\n\treturn encoder\n}\n\ntype DecoderExtension map[reflect2.Type]ValDecoder\n\n// UpdateStructDescriptor No-op\nfunc (extension DecoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) {\n}\n\n// CreateMapKeyDecoder No-op\nfunc (extension DecoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder {\n\treturn nil\n}\n\n// CreateMapKeyEncoder No-op\nfunc (extension DecoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder {\n\treturn nil\n}\n\n// CreateDecoder get decoder from map\nfunc (extension DecoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder {\n\treturn extension[typ]\n}\n\n// CreateEncoder No-op\nfunc (extension DecoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder {\n\treturn nil\n}\n\n// DecorateDecoder No-op\nfunc (extension DecoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder {\n\treturn decoder\n}\n\n// DecorateEncoder No-op\nfunc (extension DecoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder {\n\treturn encoder\n}\n\ntype funcDecoder struct {\n\tfun DecoderFunc\n}\n\nfunc (decoder *funcDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tdecoder.fun(ptr, iter)\n}\n\ntype funcEncoder struct {\n\tfun         EncoderFunc\n\tisEmptyFunc func(ptr unsafe.Pointer) bool\n}\n\nfunc (encoder *funcEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tencoder.fun(ptr, stream)\n}\n\nfunc (encoder *funcEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\tif encoder.isEmptyFunc == nil {\n\t\treturn false\n\t}\n\treturn encoder.isEmptyFunc(ptr)\n}\n\n// DecoderFunc the function form of TypeDecoder\ntype DecoderFunc func(ptr unsafe.Pointer, iter *Iterator)\n\n// EncoderFunc the function form of TypeEncoder\ntype EncoderFunc func(ptr unsafe.Pointer, stream *Stream)\n\n// RegisterTypeDecoderFunc register TypeDecoder for a type with function\nfunc RegisterTypeDecoderFunc(typ string, fun DecoderFunc) {\n\ttypeDecoders[typ] = &funcDecoder{fun}\n}\n\n// RegisterTypeDecoder register TypeDecoder for a typ\nfunc RegisterTypeDecoder(typ string, decoder ValDecoder) {\n\ttypeDecoders[typ] = decoder\n}\n\n// RegisterFieldDecoderFunc register TypeDecoder for a struct field with function\nfunc RegisterFieldDecoderFunc(typ string, field string, fun DecoderFunc) {\n\tRegisterFieldDecoder(typ, field, &funcDecoder{fun})\n}\n\n// RegisterFieldDecoder register TypeDecoder for a struct field\nfunc RegisterFieldDecoder(typ string, field string, decoder ValDecoder) {\n\tfieldDecoders[fmt.Sprintf(\"%s/%s\", typ, field)] = decoder\n}\n\n// RegisterTypeEncoderFunc register TypeEncoder for a type with encode/isEmpty function\nfunc RegisterTypeEncoderFunc(typ string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) {\n\ttypeEncoders[typ] = &funcEncoder{fun, isEmptyFunc}\n}\n\n// RegisterTypeEncoder register TypeEncoder for a type\nfunc RegisterTypeEncoder(typ string, encoder ValEncoder) {\n\ttypeEncoders[typ] = encoder\n}\n\n// RegisterFieldEncoderFunc register TypeEncoder for a struct field with encode/isEmpty function\nfunc RegisterFieldEncoderFunc(typ string, field string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) {\n\tRegisterFieldEncoder(typ, field, &funcEncoder{fun, isEmptyFunc})\n}\n\n// RegisterFieldEncoder register TypeEncoder for a struct field\nfunc RegisterFieldEncoder(typ string, field string, encoder ValEncoder) {\n\tfieldEncoders[fmt.Sprintf(\"%s/%s\", typ, field)] = encoder\n}\n\n// RegisterExtension register extension\nfunc RegisterExtension(extension Extension) {\n\textensions = append(extensions, extension)\n}\n\nfunc getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tdecoder := _getTypeDecoderFromExtension(ctx, typ)\n\tif decoder != nil {\n\t\tfor _, extension := range extensions {\n\t\t\tdecoder = extension.DecorateDecoder(typ, decoder)\n\t\t}\n\t\tdecoder = ctx.decoderExtension.DecorateDecoder(typ, decoder)\n\t\tfor _, extension := range ctx.extraExtensions {\n\t\t\tdecoder = extension.DecorateDecoder(typ, decoder)\n\t\t}\n\t}\n\treturn decoder\n}\nfunc _getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tfor _, extension := range extensions {\n\t\tdecoder := extension.CreateDecoder(typ)\n\t\tif decoder != nil {\n\t\t\treturn decoder\n\t\t}\n\t}\n\tdecoder := ctx.decoderExtension.CreateDecoder(typ)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tfor _, extension := range ctx.extraExtensions {\n\t\tdecoder := extension.CreateDecoder(typ)\n\t\tif decoder != nil {\n\t\t\treturn decoder\n\t\t}\n\t}\n\ttypeName := typ.String()\n\tdecoder = typeDecoders[typeName]\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tif typ.Kind() == reflect.Ptr {\n\t\tptrType := typ.(*reflect2.UnsafePtrType)\n\t\tdecoder := typeDecoders[ptrType.Elem().String()]\n\t\tif decoder != nil {\n\t\t\treturn &OptionalDecoder{ptrType.Elem(), decoder}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tencoder := _getTypeEncoderFromExtension(ctx, typ)\n\tif encoder != nil {\n\t\tfor _, extension := range extensions {\n\t\t\tencoder = extension.DecorateEncoder(typ, encoder)\n\t\t}\n\t\tencoder = ctx.encoderExtension.DecorateEncoder(typ, encoder)\n\t\tfor _, extension := range ctx.extraExtensions {\n\t\t\tencoder = extension.DecorateEncoder(typ, encoder)\n\t\t}\n\t}\n\treturn encoder\n}\n\nfunc _getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tfor _, extension := range extensions {\n\t\tencoder := extension.CreateEncoder(typ)\n\t\tif encoder != nil {\n\t\t\treturn encoder\n\t\t}\n\t}\n\tencoder := ctx.encoderExtension.CreateEncoder(typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tfor _, extension := range ctx.extraExtensions {\n\t\tencoder := extension.CreateEncoder(typ)\n\t\tif encoder != nil {\n\t\t\treturn encoder\n\t\t}\n\t}\n\ttypeName := typ.String()\n\tencoder = typeEncoders[typeName]\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tif typ.Kind() == reflect.Ptr {\n\t\ttypePtr := typ.(*reflect2.UnsafePtrType)\n\t\tencoder := typeEncoders[typePtr.Elem().String()]\n\t\tif encoder != nil {\n\t\t\treturn &OptionalEncoder{encoder}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor {\n\tstructType := typ.(*reflect2.UnsafeStructType)\n\tembeddedBindings := []*Binding{}\n\tbindings := []*Binding{}\n\tfor i := 0; i < structType.NumField(); i++ {\n\t\tfield := structType.Field(i)\n\t\ttag, hastag := field.Tag().Lookup(ctx.getTagKey())\n\t\tif ctx.onlyTaggedField && !hastag && !field.Anonymous() {\n\t\t\tcontinue\n\t\t}\n\t\tif tag == \"-\" || field.Name() == \"_\" {\n\t\t\tcontinue\n\t\t}\n\t\ttagParts := strings.Split(tag, \",\")\n\t\tif field.Anonymous() && (tag == \"\" || tagParts[0] == \"\") {\n\t\t\tif field.Type().Kind() == reflect.Struct {\n\t\t\t\tstructDescriptor := describeStruct(ctx, field.Type())\n\t\t\t\tfor _, binding := range structDescriptor.Fields {\n\t\t\t\t\tbinding.levels = append([]int{i}, binding.levels...)\n\t\t\t\t\tomitempty := binding.Encoder.(*structFieldEncoder).omitempty\n\t\t\t\t\tbinding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty}\n\t\t\t\t\tbinding.Decoder = &structFieldDecoder{field, binding.Decoder}\n\t\t\t\t\tembeddedBindings = append(embeddedBindings, binding)\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t} else if field.Type().Kind() == reflect.Ptr {\n\t\t\t\tptrType := field.Type().(*reflect2.UnsafePtrType)\n\t\t\t\tif ptrType.Elem().Kind() == reflect.Struct {\n\t\t\t\t\tstructDescriptor := describeStruct(ctx, ptrType.Elem())\n\t\t\t\t\tfor _, binding := range structDescriptor.Fields {\n\t\t\t\t\t\tbinding.levels = append([]int{i}, binding.levels...)\n\t\t\t\t\t\tomitempty := binding.Encoder.(*structFieldEncoder).omitempty\n\t\t\t\t\t\tbinding.Encoder = &dereferenceEncoder{binding.Encoder}\n\t\t\t\t\t\tbinding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty}\n\t\t\t\t\t\tbinding.Decoder = &dereferenceDecoder{ptrType.Elem(), binding.Decoder}\n\t\t\t\t\t\tbinding.Decoder = &structFieldDecoder{field, binding.Decoder}\n\t\t\t\t\t\tembeddedBindings = append(embeddedBindings, binding)\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfieldNames := calcFieldNames(field.Name(), tagParts[0], tag)\n\t\tfieldCacheKey := fmt.Sprintf(\"%s/%s\", typ.String(), field.Name())\n\t\tdecoder := fieldDecoders[fieldCacheKey]\n\t\tif decoder == nil {\n\t\t\tdecoder = decoderOfType(ctx.append(field.Name()), field.Type())\n\t\t}\n\t\tencoder := fieldEncoders[fieldCacheKey]\n\t\tif encoder == nil {\n\t\t\tencoder = encoderOfType(ctx.append(field.Name()), field.Type())\n\t\t}\n\t\tbinding := &Binding{\n\t\t\tField:     field,\n\t\t\tFromNames: fieldNames,\n\t\t\tToNames:   fieldNames,\n\t\t\tDecoder:   decoder,\n\t\t\tEncoder:   encoder,\n\t\t}\n\t\tbinding.levels = []int{i}\n\t\tbindings = append(bindings, binding)\n\t}\n\treturn createStructDescriptor(ctx, typ, bindings, embeddedBindings)\n}\nfunc createStructDescriptor(ctx *ctx, typ reflect2.Type, bindings []*Binding, embeddedBindings []*Binding) *StructDescriptor {\n\tstructDescriptor := &StructDescriptor{\n\t\tType:   typ,\n\t\tFields: bindings,\n\t}\n\tfor _, extension := range extensions {\n\t\textension.UpdateStructDescriptor(structDescriptor)\n\t}\n\tctx.encoderExtension.UpdateStructDescriptor(structDescriptor)\n\tctx.decoderExtension.UpdateStructDescriptor(structDescriptor)\n\tfor _, extension := range ctx.extraExtensions {\n\t\textension.UpdateStructDescriptor(structDescriptor)\n\t}\n\tprocessTags(structDescriptor, ctx.frozenConfig)\n\t// merge normal & embedded bindings & sort with original order\n\tallBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...))\n\tsort.Sort(allBindings)\n\tstructDescriptor.Fields = allBindings\n\treturn structDescriptor\n}\n\ntype sortableBindings []*Binding\n\nfunc (bindings sortableBindings) Len() int {\n\treturn len(bindings)\n}\n\nfunc (bindings sortableBindings) Less(i, j int) bool {\n\tleft := bindings[i].levels\n\tright := bindings[j].levels\n\tk := 0\n\tfor {\n\t\tif left[k] < right[k] {\n\t\t\treturn true\n\t\t} else if left[k] > right[k] {\n\t\t\treturn false\n\t\t}\n\t\tk++\n\t}\n}\n\nfunc (bindings sortableBindings) Swap(i, j int) {\n\tbindings[i], bindings[j] = bindings[j], bindings[i]\n}\n\nfunc processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) {\n\tfor _, binding := range structDescriptor.Fields {\n\t\tshouldOmitEmpty := false\n\t\ttagParts := strings.Split(binding.Field.Tag().Get(cfg.getTagKey()), \",\")\n\t\tfor _, tagPart := range tagParts[1:] {\n\t\t\tif tagPart == \"omitempty\" {\n\t\t\t\tshouldOmitEmpty = true\n\t\t\t} else if tagPart == \"string\" {\n\t\t\t\tif binding.Field.Type().Kind() == reflect.String {\n\t\t\t\t\tbinding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg}\n\t\t\t\t\tbinding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg}\n\t\t\t\t} else {\n\t\t\t\t\tbinding.Decoder = &stringModeNumberDecoder{binding.Decoder}\n\t\t\t\t\tbinding.Encoder = &stringModeNumberEncoder{binding.Encoder}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbinding.Decoder = &structFieldDecoder{binding.Field, binding.Decoder}\n\t\tbinding.Encoder = &structFieldEncoder{binding.Field, binding.Encoder, shouldOmitEmpty}\n\t}\n}\n\nfunc calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string {\n\t// ignore?\n\tif wholeTag == \"-\" {\n\t\treturn []string{}\n\t}\n\t// rename?\n\tvar fieldNames []string\n\tif tagProvidedFieldName == \"\" {\n\t\tfieldNames = []string{originalFieldName}\n\t} else {\n\t\tfieldNames = []string{tagProvidedFieldName}\n\t}\n\t// private?\n\tisNotExported := unicode.IsLower(rune(originalFieldName[0])) || originalFieldName[0] == '_'\n\tif isNotExported {\n\t\tfieldNames = []string{}\n\t}\n\treturn fieldNames\n}\n"
  },
  {
    "path": "reflect_json_number.go",
    "content": "package jsoniter\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/modern-go/reflect2\"\n\t\"strconv\"\n\t\"unsafe\"\n)\n\ntype Number string\n\n// String returns the literal text of the number.\nfunc (n Number) String() string { return string(n) }\n\n// Float64 returns the number as a float64.\nfunc (n Number) Float64() (float64, error) {\n\treturn strconv.ParseFloat(string(n), 64)\n}\n\n// Int64 returns the number as an int64.\nfunc (n Number) Int64() (int64, error) {\n\treturn strconv.ParseInt(string(n), 10, 64)\n}\n\nfunc CastJsonNumber(val interface{}) (string, bool) {\n\tswitch typedVal := val.(type) {\n\tcase json.Number:\n\t\treturn string(typedVal), true\n\tcase Number:\n\t\treturn string(typedVal), true\n\t}\n\treturn \"\", false\n}\n\nvar jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem()\nvar jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem()\n\nfunc createDecoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tif typ.AssignableTo(jsonNumberType) {\n\t\treturn &jsonNumberCodec{}\n\t}\n\tif typ.AssignableTo(jsoniterNumberType) {\n\t\treturn &jsoniterNumberCodec{}\n\t}\n\treturn nil\n}\n\nfunc createEncoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tif typ.AssignableTo(jsonNumberType) {\n\t\treturn &jsonNumberCodec{}\n\t}\n\tif typ.AssignableTo(jsoniterNumberType) {\n\t\treturn &jsoniterNumberCodec{}\n\t}\n\treturn nil\n}\n\ntype jsonNumberCodec struct {\n}\n\nfunc (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tswitch iter.WhatIsNext() {\n\tcase StringValue:\n\t\t*((*json.Number)(ptr)) = json.Number(iter.ReadString())\n\tcase NilValue:\n\t\titer.skipFourBytes('n', 'u', 'l', 'l')\n\t\t*((*json.Number)(ptr)) = \"\"\n\tdefault:\n\t\t*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))\n\t}\n}\n\nfunc (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tnumber := *((*json.Number)(ptr))\n\tif len(number) == 0 {\n\t\tstream.writeByte('0')\n\t} else {\n\t\tstream.WriteRaw(string(number))\n\t}\n}\n\nfunc (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn len(*((*json.Number)(ptr))) == 0\n}\n\ntype jsoniterNumberCodec struct {\n}\n\nfunc (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tswitch iter.WhatIsNext() {\n\tcase StringValue:\n\t\t*((*Number)(ptr)) = Number(iter.ReadString())\n\tcase NilValue:\n\t\titer.skipFourBytes('n', 'u', 'l', 'l')\n\t\t*((*Number)(ptr)) = \"\"\n\tdefault:\n\t\t*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))\n\t}\n}\n\nfunc (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tnumber := *((*Number)(ptr))\n\tif len(number) == 0 {\n\t\tstream.writeByte('0')\n\t} else {\n\t\tstream.WriteRaw(string(number))\n\t}\n}\n\nfunc (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn len(*((*Number)(ptr))) == 0\n}\n"
  },
  {
    "path": "reflect_json_raw_message.go",
    "content": "package jsoniter\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/modern-go/reflect2\"\n\t\"unsafe\"\n)\n\nvar jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()\nvar jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()\n\nfunc createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tif typ == jsonRawMessageType {\n\t\treturn &jsonRawMessageCodec{}\n\t}\n\tif typ == jsoniterRawMessageType {\n\t\treturn &jsoniterRawMessageCodec{}\n\t}\n\treturn nil\n}\n\nfunc createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tif typ == jsonRawMessageType {\n\t\treturn &jsonRawMessageCodec{}\n\t}\n\tif typ == jsoniterRawMessageType {\n\t\treturn &jsoniterRawMessageCodec{}\n\t}\n\treturn nil\n}\n\ntype jsonRawMessageCodec struct {\n}\n\nfunc (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif iter.ReadNil() {\n\t\t*((*json.RawMessage)(ptr)) = nil\n\t} else {\n\t\t*((*json.RawMessage)(ptr)) = iter.SkipAndReturnBytes()\n\t}\n}\n\nfunc (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif *((*json.RawMessage)(ptr)) == nil {\n\t\tstream.WriteNil()\n\t} else {\n\t\tstream.WriteRaw(string(*((*json.RawMessage)(ptr))))\n\t}\n}\n\nfunc (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn len(*((*json.RawMessage)(ptr))) == 0\n}\n\ntype jsoniterRawMessageCodec struct {\n}\n\nfunc (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif iter.ReadNil() {\n\t\t*((*RawMessage)(ptr)) = nil\n\t} else {\n\t\t*((*RawMessage)(ptr)) = iter.SkipAndReturnBytes()\n\t}\n}\n\nfunc (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif *((*RawMessage)(ptr)) == nil {\n\t\tstream.WriteNil()\n\t} else {\n\t\tstream.WriteRaw(string(*((*RawMessage)(ptr))))\n\t}\n}\n\nfunc (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn len(*((*RawMessage)(ptr))) == 0\n}\n"
  },
  {
    "path": "reflect_map.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"sort\"\n\t\"unsafe\"\n\n\t\"github.com/modern-go/reflect2\"\n)\n\nfunc decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tmapType := typ.(*reflect2.UnsafeMapType)\n\tkeyDecoder := decoderOfMapKey(ctx.append(\"[mapKey]\"), mapType.Key())\n\telemDecoder := decoderOfType(ctx.append(\"[mapElem]\"), mapType.Elem())\n\treturn &mapDecoder{\n\t\tmapType:     mapType,\n\t\tkeyType:     mapType.Key(),\n\t\telemType:    mapType.Elem(),\n\t\tkeyDecoder:  keyDecoder,\n\t\telemDecoder: elemDecoder,\n\t}\n}\n\nfunc encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tmapType := typ.(*reflect2.UnsafeMapType)\n\tif ctx.sortMapKeys {\n\t\treturn &sortKeysMapEncoder{\n\t\t\tmapType:     mapType,\n\t\t\tkeyEncoder:  encoderOfMapKey(ctx.append(\"[mapKey]\"), mapType.Key()),\n\t\t\telemEncoder: encoderOfType(ctx.append(\"[mapElem]\"), mapType.Elem()),\n\t\t}\n\t}\n\treturn &mapEncoder{\n\t\tmapType:     mapType,\n\t\tkeyEncoder:  encoderOfMapKey(ctx.append(\"[mapKey]\"), mapType.Key()),\n\t\telemEncoder: encoderOfType(ctx.append(\"[mapElem]\"), mapType.Elem()),\n\t}\n}\n\nfunc decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tdecoder := ctx.decoderExtension.CreateMapKeyDecoder(typ)\n\tif decoder != nil {\n\t\treturn decoder\n\t}\n\tfor _, extension := range ctx.extraExtensions {\n\t\tdecoder := extension.CreateMapKeyDecoder(typ)\n\t\tif decoder != nil {\n\t\t\treturn decoder\n\t\t}\n\t}\n\n\tptrType := reflect2.PtrTo(typ)\n\tif ptrType.Implements(unmarshalerType) {\n\t\treturn &referenceDecoder{\n\t\t\t&unmarshalerDecoder{\n\t\t\t\tvalType: ptrType,\n\t\t\t},\n\t\t}\n\t}\n\tif typ.Implements(unmarshalerType) {\n\t\treturn &unmarshalerDecoder{\n\t\t\tvalType: typ,\n\t\t}\n\t}\n\tif ptrType.Implements(textUnmarshalerType) {\n\t\treturn &referenceDecoder{\n\t\t\t&textUnmarshalerDecoder{\n\t\t\t\tvalType: ptrType,\n\t\t\t},\n\t\t}\n\t}\n\tif typ.Implements(textUnmarshalerType) {\n\t\treturn &textUnmarshalerDecoder{\n\t\t\tvalType: typ,\n\t\t}\n\t}\n\n\tswitch typ.Kind() {\n\tcase reflect.String:\n\t\treturn decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))\n\tcase reflect.Bool,\n\t\treflect.Uint8, reflect.Int8,\n\t\treflect.Uint16, reflect.Int16,\n\t\treflect.Uint32, reflect.Int32,\n\t\treflect.Uint64, reflect.Int64,\n\t\treflect.Uint, reflect.Int,\n\t\treflect.Float32, reflect.Float64,\n\t\treflect.Uintptr:\n\t\ttyp = reflect2.DefaultTypeOfKind(typ.Kind())\n\t\treturn &numericMapKeyDecoder{decoderOfType(ctx, typ)}\n\tdefault:\n\t\treturn &lazyErrorDecoder{err: fmt.Errorf(\"unsupported map key type: %v\", typ)}\n\t}\n}\n\nfunc encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tencoder := ctx.encoderExtension.CreateMapKeyEncoder(typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tfor _, extension := range ctx.extraExtensions {\n\t\tencoder := extension.CreateMapKeyEncoder(typ)\n\t\tif encoder != nil {\n\t\t\treturn encoder\n\t\t}\n\t}\n\n\tif typ.Kind() != reflect.String {\n\t\tif typ == textMarshalerType {\n\t\t\treturn &directTextMarshalerEncoder{\n\t\t\t\tstringEncoder: ctx.EncoderOf(reflect2.TypeOf(\"\")),\n\t\t\t}\n\t\t}\n\t\tif typ.Implements(textMarshalerType) {\n\t\t\treturn &textMarshalerEncoder{\n\t\t\t\tvalType:       typ,\n\t\t\t\tstringEncoder: ctx.EncoderOf(reflect2.TypeOf(\"\")),\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch typ.Kind() {\n\tcase reflect.String:\n\t\treturn encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))\n\tcase reflect.Bool,\n\t\treflect.Uint8, reflect.Int8,\n\t\treflect.Uint16, reflect.Int16,\n\t\treflect.Uint32, reflect.Int32,\n\t\treflect.Uint64, reflect.Int64,\n\t\treflect.Uint, reflect.Int,\n\t\treflect.Float32, reflect.Float64,\n\t\treflect.Uintptr:\n\t\ttyp = reflect2.DefaultTypeOfKind(typ.Kind())\n\t\treturn &numericMapKeyEncoder{encoderOfType(ctx, typ)}\n\tdefault:\n\t\tif typ.Kind() == reflect.Interface {\n\t\t\treturn &dynamicMapKeyEncoder{ctx, typ}\n\t\t}\n\t\treturn &lazyErrorEncoder{err: fmt.Errorf(\"unsupported map key type: %v\", typ)}\n\t}\n}\n\ntype mapDecoder struct {\n\tmapType     *reflect2.UnsafeMapType\n\tkeyType     reflect2.Type\n\telemType    reflect2.Type\n\tkeyDecoder  ValDecoder\n\telemDecoder ValDecoder\n}\n\nfunc (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tmapType := decoder.mapType\n\tc := iter.nextToken()\n\tif c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\t*(*unsafe.Pointer)(ptr) = nil\n\t\tmapType.UnsafeSet(ptr, mapType.UnsafeNew())\n\t\treturn\n\t}\n\tif mapType.UnsafeIsNil(ptr) {\n\t\tmapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0))\n\t}\n\tif c != '{' {\n\t\titer.ReportError(\"ReadMapCB\", `expect { or n, but found `+string([]byte{c}))\n\t\treturn\n\t}\n\tc = iter.nextToken()\n\tif c == '}' {\n\t\treturn\n\t}\n\titer.unreadByte()\n\tkey := decoder.keyType.UnsafeNew()\n\tdecoder.keyDecoder.Decode(key, iter)\n\tc = iter.nextToken()\n\tif c != ':' {\n\t\titer.ReportError(\"ReadMapCB\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\treturn\n\t}\n\telem := decoder.elemType.UnsafeNew()\n\tdecoder.elemDecoder.Decode(elem, iter)\n\tdecoder.mapType.UnsafeSetIndex(ptr, key, elem)\n\tfor c = iter.nextToken(); c == ','; c = iter.nextToken() {\n\t\tkey := decoder.keyType.UnsafeNew()\n\t\tdecoder.keyDecoder.Decode(key, iter)\n\t\tc = iter.nextToken()\n\t\tif c != ':' {\n\t\t\titer.ReportError(\"ReadMapCB\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\t\treturn\n\t\t}\n\t\telem := decoder.elemType.UnsafeNew()\n\t\tdecoder.elemDecoder.Decode(elem, iter)\n\t\tdecoder.mapType.UnsafeSetIndex(ptr, key, elem)\n\t}\n\tif c != '}' {\n\t\titer.ReportError(\"ReadMapCB\", `expect }, but found `+string([]byte{c}))\n\t}\n}\n\ntype numericMapKeyDecoder struct {\n\tdecoder ValDecoder\n}\n\nfunc (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tc := iter.nextToken()\n\tif c != '\"' {\n\t\titer.ReportError(\"ReadMapCB\", `expect \", but found `+string([]byte{c}))\n\t\treturn\n\t}\n\tdecoder.decoder.Decode(ptr, iter)\n\tc = iter.nextToken()\n\tif c != '\"' {\n\t\titer.ReportError(\"ReadMapCB\", `expect \", but found `+string([]byte{c}))\n\t\treturn\n\t}\n}\n\ntype numericMapKeyEncoder struct {\n\tencoder ValEncoder\n}\n\nfunc (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.writeByte('\"')\n\tencoder.encoder.Encode(ptr, stream)\n\tstream.writeByte('\"')\n}\n\nfunc (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn false\n}\n\ntype dynamicMapKeyEncoder struct {\n\tctx     *ctx\n\tvalType reflect2.Type\n}\n\nfunc (encoder *dynamicMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tobj := encoder.valType.UnsafeIndirect(ptr)\n\tencoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).Encode(reflect2.PtrOf(obj), stream)\n}\n\nfunc (encoder *dynamicMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\tobj := encoder.valType.UnsafeIndirect(ptr)\n\treturn encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).IsEmpty(reflect2.PtrOf(obj))\n}\n\ntype mapEncoder struct {\n\tmapType     *reflect2.UnsafeMapType\n\tkeyEncoder  ValEncoder\n\telemEncoder ValEncoder\n}\n\nfunc (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif *(*unsafe.Pointer)(ptr) == nil {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tstream.WriteObjectStart()\n\titer := encoder.mapType.UnsafeIterate(ptr)\n\tfor i := 0; iter.HasNext(); i++ {\n\t\tif i != 0 {\n\t\t\tstream.WriteMore()\n\t\t}\n\t\tkey, elem := iter.UnsafeNext()\n\t\tencoder.keyEncoder.Encode(key, stream)\n\t\tif stream.indention > 0 {\n\t\t\tstream.writeTwoBytes(byte(':'), byte(' '))\n\t\t} else {\n\t\t\tstream.writeByte(':')\n\t\t}\n\t\tencoder.elemEncoder.Encode(elem, stream)\n\t}\n\tstream.WriteObjectEnd()\n}\n\nfunc (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\titer := encoder.mapType.UnsafeIterate(ptr)\n\treturn !iter.HasNext()\n}\n\ntype sortKeysMapEncoder struct {\n\tmapType     *reflect2.UnsafeMapType\n\tkeyEncoder  ValEncoder\n\telemEncoder ValEncoder\n}\n\nfunc (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif *(*unsafe.Pointer)(ptr) == nil {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tstream.WriteObjectStart()\n\tmapIter := encoder.mapType.UnsafeIterate(ptr)\n\tsubStream := stream.cfg.BorrowStream(nil)\n\tsubStream.Attachment = stream.Attachment\n\tsubIter := stream.cfg.BorrowIterator(nil)\n\tkeyValues := encodedKeyValues{}\n\tfor mapIter.HasNext() {\n\t\tkey, elem := mapIter.UnsafeNext()\n\t\tsubStreamIndex := subStream.Buffered()\n\t\tencoder.keyEncoder.Encode(key, subStream)\n\t\tif subStream.Error != nil && subStream.Error != io.EOF && stream.Error == nil {\n\t\t\tstream.Error = subStream.Error\n\t\t}\n\t\tencodedKey := subStream.Buffer()[subStreamIndex:]\n\t\tsubIter.ResetBytes(encodedKey)\n\t\tdecodedKey := subIter.ReadString()\n\t\tif stream.indention > 0 {\n\t\t\tsubStream.writeTwoBytes(byte(':'), byte(' '))\n\t\t} else {\n\t\t\tsubStream.writeByte(':')\n\t\t}\n\t\tencoder.elemEncoder.Encode(elem, subStream)\n\t\tkeyValues = append(keyValues, encodedKV{\n\t\t\tkey:      decodedKey,\n\t\t\tkeyValue: subStream.Buffer()[subStreamIndex:],\n\t\t})\n\t}\n\tsort.Sort(keyValues)\n\tfor i, keyValue := range keyValues {\n\t\tif i != 0 {\n\t\t\tstream.WriteMore()\n\t\t}\n\t\tstream.Write(keyValue.keyValue)\n\t}\n\tif subStream.Error != nil && stream.Error == nil {\n\t\tstream.Error = subStream.Error\n\t}\n\tstream.WriteObjectEnd()\n\tstream.cfg.ReturnStream(subStream)\n\tstream.cfg.ReturnIterator(subIter)\n}\n\nfunc (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\titer := encoder.mapType.UnsafeIterate(ptr)\n\treturn !iter.HasNext()\n}\n\ntype encodedKeyValues []encodedKV\n\ntype encodedKV struct {\n\tkey      string\n\tkeyValue []byte\n}\n\nfunc (sv encodedKeyValues) Len() int           { return len(sv) }\nfunc (sv encodedKeyValues) Swap(i, j int)      { sv[i], sv[j] = sv[j], sv[i] }\nfunc (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key }\n"
  },
  {
    "path": "reflect_marshaler.go",
    "content": "package jsoniter\n\nimport (\n\t\"encoding\"\n\t\"encoding/json\"\n\t\"unsafe\"\n\n\t\"github.com/modern-go/reflect2\"\n)\n\nvar marshalerType = reflect2.TypeOfPtr((*json.Marshaler)(nil)).Elem()\nvar unmarshalerType = reflect2.TypeOfPtr((*json.Unmarshaler)(nil)).Elem()\nvar textMarshalerType = reflect2.TypeOfPtr((*encoding.TextMarshaler)(nil)).Elem()\nvar textUnmarshalerType = reflect2.TypeOfPtr((*encoding.TextUnmarshaler)(nil)).Elem()\n\nfunc createDecoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tptrType := reflect2.PtrTo(typ)\n\tif ptrType.Implements(unmarshalerType) {\n\t\treturn &referenceDecoder{\n\t\t\t&unmarshalerDecoder{ptrType},\n\t\t}\n\t}\n\tif ptrType.Implements(textUnmarshalerType) {\n\t\treturn &referenceDecoder{\n\t\t\t&textUnmarshalerDecoder{ptrType},\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc createEncoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tif typ == marshalerType {\n\t\tcheckIsEmpty := createCheckIsEmpty(ctx, typ)\n\t\tvar encoder ValEncoder = &directMarshalerEncoder{\n\t\t\tcheckIsEmpty: checkIsEmpty,\n\t\t}\n\t\treturn encoder\n\t}\n\tif typ.Implements(marshalerType) {\n\t\tcheckIsEmpty := createCheckIsEmpty(ctx, typ)\n\t\tvar encoder ValEncoder = &marshalerEncoder{\n\t\t\tvalType:      typ,\n\t\t\tcheckIsEmpty: checkIsEmpty,\n\t\t}\n\t\treturn encoder\n\t}\n\tptrType := reflect2.PtrTo(typ)\n\tif ctx.prefix != \"\" && ptrType.Implements(marshalerType) {\n\t\tcheckIsEmpty := createCheckIsEmpty(ctx, ptrType)\n\t\tvar encoder ValEncoder = &marshalerEncoder{\n\t\t\tvalType:      ptrType,\n\t\t\tcheckIsEmpty: checkIsEmpty,\n\t\t}\n\t\treturn &referenceEncoder{encoder}\n\t}\n\tif typ == textMarshalerType {\n\t\tcheckIsEmpty := createCheckIsEmpty(ctx, typ)\n\t\tvar encoder ValEncoder = &directTextMarshalerEncoder{\n\t\t\tcheckIsEmpty:  checkIsEmpty,\n\t\t\tstringEncoder: ctx.EncoderOf(reflect2.TypeOf(\"\")),\n\t\t}\n\t\treturn encoder\n\t}\n\tif typ.Implements(textMarshalerType) {\n\t\tcheckIsEmpty := createCheckIsEmpty(ctx, typ)\n\t\tvar encoder ValEncoder = &textMarshalerEncoder{\n\t\t\tvalType:       typ,\n\t\t\tstringEncoder: ctx.EncoderOf(reflect2.TypeOf(\"\")),\n\t\t\tcheckIsEmpty:  checkIsEmpty,\n\t\t}\n\t\treturn encoder\n\t}\n\t// if prefix is empty, the type is the root type\n\tif ctx.prefix != \"\" && ptrType.Implements(textMarshalerType) {\n\t\tcheckIsEmpty := createCheckIsEmpty(ctx, ptrType)\n\t\tvar encoder ValEncoder = &textMarshalerEncoder{\n\t\t\tvalType:       ptrType,\n\t\t\tstringEncoder: ctx.EncoderOf(reflect2.TypeOf(\"\")),\n\t\t\tcheckIsEmpty:  checkIsEmpty,\n\t\t}\n\t\treturn &referenceEncoder{encoder}\n\t}\n\treturn nil\n}\n\ntype marshalerEncoder struct {\n\tcheckIsEmpty checkIsEmpty\n\tvalType      reflect2.Type\n}\n\nfunc (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tobj := encoder.valType.UnsafeIndirect(ptr)\n\tif encoder.valType.IsNullable() && reflect2.IsNil(obj) {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tmarshaler := obj.(json.Marshaler)\n\tbytes, err := marshaler.MarshalJSON()\n\tif err != nil {\n\t\tstream.Error = err\n\t} else {\n\t\t// html escape was already done by jsoniter\n\t\t// but the extra '\\n' should be trimed\n\t\tl := len(bytes)\n\t\tif l > 0 && bytes[l-1] == '\\n' {\n\t\t\tbytes = bytes[:l-1]\n\t\t}\n\t\tstream.Write(bytes)\n\t}\n}\n\nfunc (encoder *marshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.checkIsEmpty.IsEmpty(ptr)\n}\n\ntype directMarshalerEncoder struct {\n\tcheckIsEmpty checkIsEmpty\n}\n\nfunc (encoder *directMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tmarshaler := *(*json.Marshaler)(ptr)\n\tif marshaler == nil {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tbytes, err := marshaler.MarshalJSON()\n\tif err != nil {\n\t\tstream.Error = err\n\t} else {\n\t\tstream.Write(bytes)\n\t}\n}\n\nfunc (encoder *directMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.checkIsEmpty.IsEmpty(ptr)\n}\n\ntype textMarshalerEncoder struct {\n\tvalType       reflect2.Type\n\tstringEncoder ValEncoder\n\tcheckIsEmpty  checkIsEmpty\n}\n\nfunc (encoder *textMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tobj := encoder.valType.UnsafeIndirect(ptr)\n\tif encoder.valType.IsNullable() && reflect2.IsNil(obj) {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tmarshaler := (obj).(encoding.TextMarshaler)\n\tbytes, err := marshaler.MarshalText()\n\tif err != nil {\n\t\tstream.Error = err\n\t} else {\n\t\tstr := string(bytes)\n\t\tencoder.stringEncoder.Encode(unsafe.Pointer(&str), stream)\n\t}\n}\n\nfunc (encoder *textMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.checkIsEmpty.IsEmpty(ptr)\n}\n\ntype directTextMarshalerEncoder struct {\n\tstringEncoder ValEncoder\n\tcheckIsEmpty  checkIsEmpty\n}\n\nfunc (encoder *directTextMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tmarshaler := *(*encoding.TextMarshaler)(ptr)\n\tif marshaler == nil {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tbytes, err := marshaler.MarshalText()\n\tif err != nil {\n\t\tstream.Error = err\n\t} else {\n\t\tstr := string(bytes)\n\t\tencoder.stringEncoder.Encode(unsafe.Pointer(&str), stream)\n\t}\n}\n\nfunc (encoder *directTextMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.checkIsEmpty.IsEmpty(ptr)\n}\n\ntype unmarshalerDecoder struct {\n\tvalType reflect2.Type\n}\n\nfunc (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tvalType := decoder.valType\n\tobj := valType.UnsafeIndirect(ptr)\n\tunmarshaler := obj.(json.Unmarshaler)\n\titer.nextToken()\n\titer.unreadByte() // skip spaces\n\tbytes := iter.SkipAndReturnBytes()\n\terr := unmarshaler.UnmarshalJSON(bytes)\n\tif err != nil {\n\t\titer.ReportError(\"unmarshalerDecoder\", err.Error())\n\t}\n}\n\ntype textUnmarshalerDecoder struct {\n\tvalType reflect2.Type\n}\n\nfunc (decoder *textUnmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tvalType := decoder.valType\n\tobj := valType.UnsafeIndirect(ptr)\n\tif reflect2.IsNil(obj) {\n\t\tptrType := valType.(*reflect2.UnsafePtrType)\n\t\telemType := ptrType.Elem()\n\t\telem := elemType.UnsafeNew()\n\t\tptrType.UnsafeSet(ptr, unsafe.Pointer(&elem))\n\t\tobj = valType.UnsafeIndirect(ptr)\n\t}\n\tunmarshaler := (obj).(encoding.TextUnmarshaler)\n\tstr := iter.ReadString()\n\terr := unmarshaler.UnmarshalText([]byte(str))\n\tif err != nil {\n\t\titer.ReportError(\"textUnmarshalerDecoder\", err.Error())\n\t}\n}\n"
  },
  {
    "path": "reflect_native.go",
    "content": "package jsoniter\n\nimport (\n\t\"encoding/base64\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"unsafe\"\n\n\t\"github.com/modern-go/reflect2\"\n)\n\nconst ptrSize = 32 << uintptr(^uintptr(0)>>63)\n\nfunc createEncoderOfNative(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tif typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 {\n\t\tsliceDecoder := decoderOfSlice(ctx, typ)\n\t\treturn &base64Codec{sliceDecoder: sliceDecoder}\n\t}\n\ttypeName := typ.String()\n\tkind := typ.Kind()\n\tswitch kind {\n\tcase reflect.String:\n\t\tif typeName != \"string\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem())\n\t\t}\n\t\treturn &stringCodec{}\n\tcase reflect.Int:\n\t\tif typeName != \"int\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem())\n\t\t}\n\t\tif strconv.IntSize == 32 {\n\t\t\treturn &int32Codec{}\n\t\t}\n\t\treturn &int64Codec{}\n\tcase reflect.Int8:\n\t\tif typeName != \"int8\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem())\n\t\t}\n\t\treturn &int8Codec{}\n\tcase reflect.Int16:\n\t\tif typeName != \"int16\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem())\n\t\t}\n\t\treturn &int16Codec{}\n\tcase reflect.Int32:\n\t\tif typeName != \"int32\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem())\n\t\t}\n\t\treturn &int32Codec{}\n\tcase reflect.Int64:\n\t\tif typeName != \"int64\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem())\n\t\t}\n\t\treturn &int64Codec{}\n\tcase reflect.Uint:\n\t\tif typeName != \"uint\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem())\n\t\t}\n\t\tif strconv.IntSize == 32 {\n\t\t\treturn &uint32Codec{}\n\t\t}\n\t\treturn &uint64Codec{}\n\tcase reflect.Uint8:\n\t\tif typeName != \"uint8\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem())\n\t\t}\n\t\treturn &uint8Codec{}\n\tcase reflect.Uint16:\n\t\tif typeName != \"uint16\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem())\n\t\t}\n\t\treturn &uint16Codec{}\n\tcase reflect.Uint32:\n\t\tif typeName != \"uint32\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem())\n\t\t}\n\t\treturn &uint32Codec{}\n\tcase reflect.Uintptr:\n\t\tif typeName != \"uintptr\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem())\n\t\t}\n\t\tif ptrSize == 32 {\n\t\t\treturn &uint32Codec{}\n\t\t}\n\t\treturn &uint64Codec{}\n\tcase reflect.Uint64:\n\t\tif typeName != \"uint64\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem())\n\t\t}\n\t\treturn &uint64Codec{}\n\tcase reflect.Float32:\n\t\tif typeName != \"float32\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem())\n\t\t}\n\t\treturn &float32Codec{}\n\tcase reflect.Float64:\n\t\tif typeName != \"float64\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem())\n\t\t}\n\t\treturn &float64Codec{}\n\tcase reflect.Bool:\n\t\tif typeName != \"bool\" {\n\t\t\treturn encoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem())\n\t\t}\n\t\treturn &boolCodec{}\n\t}\n\treturn nil\n}\n\nfunc createDecoderOfNative(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tif typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 {\n\t\tsliceDecoder := decoderOfSlice(ctx, typ)\n\t\treturn &base64Codec{sliceDecoder: sliceDecoder}\n\t}\n\ttypeName := typ.String()\n\tswitch typ.Kind() {\n\tcase reflect.String:\n\t\tif typeName != \"string\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem())\n\t\t}\n\t\treturn &stringCodec{}\n\tcase reflect.Int:\n\t\tif typeName != \"int\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem())\n\t\t}\n\t\tif strconv.IntSize == 32 {\n\t\t\treturn &int32Codec{}\n\t\t}\n\t\treturn &int64Codec{}\n\tcase reflect.Int8:\n\t\tif typeName != \"int8\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem())\n\t\t}\n\t\treturn &int8Codec{}\n\tcase reflect.Int16:\n\t\tif typeName != \"int16\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem())\n\t\t}\n\t\treturn &int16Codec{}\n\tcase reflect.Int32:\n\t\tif typeName != \"int32\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem())\n\t\t}\n\t\treturn &int32Codec{}\n\tcase reflect.Int64:\n\t\tif typeName != \"int64\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem())\n\t\t}\n\t\treturn &int64Codec{}\n\tcase reflect.Uint:\n\t\tif typeName != \"uint\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem())\n\t\t}\n\t\tif strconv.IntSize == 32 {\n\t\t\treturn &uint32Codec{}\n\t\t}\n\t\treturn &uint64Codec{}\n\tcase reflect.Uint8:\n\t\tif typeName != \"uint8\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem())\n\t\t}\n\t\treturn &uint8Codec{}\n\tcase reflect.Uint16:\n\t\tif typeName != \"uint16\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem())\n\t\t}\n\t\treturn &uint16Codec{}\n\tcase reflect.Uint32:\n\t\tif typeName != \"uint32\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem())\n\t\t}\n\t\treturn &uint32Codec{}\n\tcase reflect.Uintptr:\n\t\tif typeName != \"uintptr\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem())\n\t\t}\n\t\tif ptrSize == 32 {\n\t\t\treturn &uint32Codec{}\n\t\t}\n\t\treturn &uint64Codec{}\n\tcase reflect.Uint64:\n\t\tif typeName != \"uint64\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem())\n\t\t}\n\t\treturn &uint64Codec{}\n\tcase reflect.Float32:\n\t\tif typeName != \"float32\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem())\n\t\t}\n\t\treturn &float32Codec{}\n\tcase reflect.Float64:\n\t\tif typeName != \"float64\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem())\n\t\t}\n\t\treturn &float64Codec{}\n\tcase reflect.Bool:\n\t\tif typeName != \"bool\" {\n\t\t\treturn decoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem())\n\t\t}\n\t\treturn &boolCodec{}\n\t}\n\treturn nil\n}\n\ntype stringCodec struct {\n}\n\nfunc (codec *stringCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\t*((*string)(ptr)) = iter.ReadString()\n}\n\nfunc (codec *stringCodec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstr := *((*string)(ptr))\n\tstream.WriteString(str)\n}\n\nfunc (codec *stringCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*string)(ptr)) == \"\"\n}\n\ntype int8Codec struct {\n}\n\nfunc (codec *int8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*int8)(ptr)) = iter.ReadInt8()\n\t}\n}\n\nfunc (codec *int8Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteInt8(*((*int8)(ptr)))\n}\n\nfunc (codec *int8Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*int8)(ptr)) == 0\n}\n\ntype int16Codec struct {\n}\n\nfunc (codec *int16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*int16)(ptr)) = iter.ReadInt16()\n\t}\n}\n\nfunc (codec *int16Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteInt16(*((*int16)(ptr)))\n}\n\nfunc (codec *int16Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*int16)(ptr)) == 0\n}\n\ntype int32Codec struct {\n}\n\nfunc (codec *int32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*int32)(ptr)) = iter.ReadInt32()\n\t}\n}\n\nfunc (codec *int32Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteInt32(*((*int32)(ptr)))\n}\n\nfunc (codec *int32Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*int32)(ptr)) == 0\n}\n\ntype int64Codec struct {\n}\n\nfunc (codec *int64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*int64)(ptr)) = iter.ReadInt64()\n\t}\n}\n\nfunc (codec *int64Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteInt64(*((*int64)(ptr)))\n}\n\nfunc (codec *int64Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*int64)(ptr)) == 0\n}\n\ntype uint8Codec struct {\n}\n\nfunc (codec *uint8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*uint8)(ptr)) = iter.ReadUint8()\n\t}\n}\n\nfunc (codec *uint8Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteUint8(*((*uint8)(ptr)))\n}\n\nfunc (codec *uint8Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*uint8)(ptr)) == 0\n}\n\ntype uint16Codec struct {\n}\n\nfunc (codec *uint16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*uint16)(ptr)) = iter.ReadUint16()\n\t}\n}\n\nfunc (codec *uint16Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteUint16(*((*uint16)(ptr)))\n}\n\nfunc (codec *uint16Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*uint16)(ptr)) == 0\n}\n\ntype uint32Codec struct {\n}\n\nfunc (codec *uint32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*uint32)(ptr)) = iter.ReadUint32()\n\t}\n}\n\nfunc (codec *uint32Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteUint32(*((*uint32)(ptr)))\n}\n\nfunc (codec *uint32Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*uint32)(ptr)) == 0\n}\n\ntype uint64Codec struct {\n}\n\nfunc (codec *uint64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*uint64)(ptr)) = iter.ReadUint64()\n\t}\n}\n\nfunc (codec *uint64Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteUint64(*((*uint64)(ptr)))\n}\n\nfunc (codec *uint64Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*uint64)(ptr)) == 0\n}\n\ntype float32Codec struct {\n}\n\nfunc (codec *float32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*float32)(ptr)) = iter.ReadFloat32()\n\t}\n}\n\nfunc (codec *float32Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteFloat32(*((*float32)(ptr)))\n}\n\nfunc (codec *float32Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*float32)(ptr)) == 0\n}\n\ntype float64Codec struct {\n}\n\nfunc (codec *float64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*float64)(ptr)) = iter.ReadFloat64()\n\t}\n}\n\nfunc (codec *float64Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteFloat64(*((*float64)(ptr)))\n}\n\nfunc (codec *float64Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*float64)(ptr)) == 0\n}\n\ntype boolCodec struct {\n}\n\nfunc (codec *boolCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.ReadNil() {\n\t\t*((*bool)(ptr)) = iter.ReadBool()\n\t}\n}\n\nfunc (codec *boolCodec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteBool(*((*bool)(ptr)))\n}\n\nfunc (codec *boolCodec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn !(*((*bool)(ptr)))\n}\n\ntype base64Codec struct {\n\tsliceType    *reflect2.UnsafeSliceType\n\tsliceDecoder ValDecoder\n}\n\nfunc (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif iter.ReadNil() {\n\t\tcodec.sliceType.UnsafeSetNil(ptr)\n\t\treturn\n\t}\n\tswitch iter.WhatIsNext() {\n\tcase StringValue:\n\t\tsrc := iter.ReadString()\n\t\tdst, err := base64.StdEncoding.DecodeString(src)\n\t\tif err != nil {\n\t\t\titer.ReportError(\"decode base64\", err.Error())\n\t\t} else {\n\t\t\tcodec.sliceType.UnsafeSet(ptr, unsafe.Pointer(&dst))\n\t\t}\n\tcase ArrayValue:\n\t\tcodec.sliceDecoder.Decode(ptr, iter)\n\tdefault:\n\t\titer.ReportError(\"base64Codec\", \"invalid input\")\n\t}\n}\n\nfunc (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif codec.sliceType.UnsafeIsNil(ptr) {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tsrc := *((*[]byte)(ptr))\n\tencoding := base64.StdEncoding\n\tstream.writeByte('\"')\n\tif len(src) != 0 {\n\t\tsize := encoding.EncodedLen(len(src))\n\t\tbuf := make([]byte, size)\n\t\tencoding.Encode(buf, src)\n\t\tstream.buf = append(stream.buf, buf...)\n\t}\n\tstream.writeByte('\"')\n}\n\nfunc (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn len(*((*[]byte)(ptr))) == 0\n}\n"
  },
  {
    "path": "reflect_optional.go",
    "content": "package jsoniter\n\nimport (\n\t\"github.com/modern-go/reflect2\"\n\t\"unsafe\"\n)\n\nfunc decoderOfOptional(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tptrType := typ.(*reflect2.UnsafePtrType)\n\telemType := ptrType.Elem()\n\tdecoder := decoderOfType(ctx, elemType)\n\treturn &OptionalDecoder{elemType, decoder}\n}\n\nfunc encoderOfOptional(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tptrType := typ.(*reflect2.UnsafePtrType)\n\telemType := ptrType.Elem()\n\telemEncoder := encoderOfType(ctx, elemType)\n\tencoder := &OptionalEncoder{elemEncoder}\n\treturn encoder\n}\n\ntype OptionalDecoder struct {\n\tValueType    reflect2.Type\n\tValueDecoder ValDecoder\n}\n\nfunc (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif iter.ReadNil() {\n\t\t*((*unsafe.Pointer)(ptr)) = nil\n\t} else {\n\t\tif *((*unsafe.Pointer)(ptr)) == nil {\n\t\t\t//pointer to null, we have to allocate memory to hold the value\n\t\t\tnewPtr := decoder.ValueType.UnsafeNew()\n\t\t\tdecoder.ValueDecoder.Decode(newPtr, iter)\n\t\t\t*((*unsafe.Pointer)(ptr)) = newPtr\n\t\t} else {\n\t\t\t//reuse existing instance\n\t\t\tdecoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)\n\t\t}\n\t}\n}\n\ntype dereferenceDecoder struct {\n\t// only to deference a pointer\n\tvalueType    reflect2.Type\n\tvalueDecoder ValDecoder\n}\n\nfunc (decoder *dereferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif *((*unsafe.Pointer)(ptr)) == nil {\n\t\t//pointer to null, we have to allocate memory to hold the value\n\t\tnewPtr := decoder.valueType.UnsafeNew()\n\t\tdecoder.valueDecoder.Decode(newPtr, iter)\n\t\t*((*unsafe.Pointer)(ptr)) = newPtr\n\t} else {\n\t\t//reuse existing instance\n\t\tdecoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter)\n\t}\n}\n\ntype OptionalEncoder struct {\n\tValueEncoder ValEncoder\n}\n\nfunc (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif *((*unsafe.Pointer)(ptr)) == nil {\n\t\tstream.WriteNil()\n\t} else {\n\t\tencoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)\n\t}\n}\n\nfunc (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn *((*unsafe.Pointer)(ptr)) == nil\n}\n\ntype dereferenceEncoder struct {\n\tValueEncoder ValEncoder\n}\n\nfunc (encoder *dereferenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif *((*unsafe.Pointer)(ptr)) == nil {\n\t\tstream.WriteNil()\n\t} else {\n\t\tencoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream)\n\t}\n}\n\nfunc (encoder *dereferenceEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\tdePtr := *((*unsafe.Pointer)(ptr))\n\tif dePtr == nil {\n\t\treturn true\n\t}\n\treturn encoder.ValueEncoder.IsEmpty(dePtr)\n}\n\nfunc (encoder *dereferenceEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool {\n\tdeReferenced := *((*unsafe.Pointer)(ptr))\n\tif deReferenced == nil {\n\t\treturn true\n\t}\n\tisEmbeddedPtrNil, converted := encoder.ValueEncoder.(IsEmbeddedPtrNil)\n\tif !converted {\n\t\treturn false\n\t}\n\tfieldPtr := unsafe.Pointer(deReferenced)\n\treturn isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr)\n}\n\ntype referenceEncoder struct {\n\tencoder ValEncoder\n}\n\nfunc (encoder *referenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tencoder.encoder.Encode(unsafe.Pointer(&ptr), stream)\n}\n\nfunc (encoder *referenceEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.encoder.IsEmpty(unsafe.Pointer(&ptr))\n}\n\ntype referenceDecoder struct {\n\tdecoder ValDecoder\n}\n\nfunc (decoder *referenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tdecoder.decoder.Decode(unsafe.Pointer(&ptr), iter)\n}\n"
  },
  {
    "path": "reflect_slice.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"github.com/modern-go/reflect2\"\n\t\"io\"\n\t\"unsafe\"\n)\n\nfunc decoderOfSlice(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tsliceType := typ.(*reflect2.UnsafeSliceType)\n\tdecoder := decoderOfType(ctx.append(\"[sliceElem]\"), sliceType.Elem())\n\treturn &sliceDecoder{sliceType, decoder}\n}\n\nfunc encoderOfSlice(ctx *ctx, typ reflect2.Type) ValEncoder {\n\tsliceType := typ.(*reflect2.UnsafeSliceType)\n\tencoder := encoderOfType(ctx.append(\"[sliceElem]\"), sliceType.Elem())\n\treturn &sliceEncoder{sliceType, encoder}\n}\n\ntype sliceEncoder struct {\n\tsliceType   *reflect2.UnsafeSliceType\n\telemEncoder ValEncoder\n}\n\nfunc (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tif encoder.sliceType.UnsafeIsNil(ptr) {\n\t\tstream.WriteNil()\n\t\treturn\n\t}\n\tlength := encoder.sliceType.UnsafeLengthOf(ptr)\n\tif length == 0 {\n\t\tstream.WriteEmptyArray()\n\t\treturn\n\t}\n\tstream.WriteArrayStart()\n\tencoder.elemEncoder.Encode(encoder.sliceType.UnsafeGetIndex(ptr, 0), stream)\n\tfor i := 1; i < length; i++ {\n\t\tstream.WriteMore()\n\t\telemPtr := encoder.sliceType.UnsafeGetIndex(ptr, i)\n\t\tencoder.elemEncoder.Encode(elemPtr, stream)\n\t}\n\tstream.WriteArrayEnd()\n\tif stream.Error != nil && stream.Error != io.EOF {\n\t\tstream.Error = fmt.Errorf(\"%v: %s\", encoder.sliceType, stream.Error.Error())\n\t}\n}\n\nfunc (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.sliceType.UnsafeLengthOf(ptr) == 0\n}\n\ntype sliceDecoder struct {\n\tsliceType   *reflect2.UnsafeSliceType\n\telemDecoder ValDecoder\n}\n\nfunc (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tdecoder.doDecode(ptr, iter)\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\titer.Error = fmt.Errorf(\"%v: %s\", decoder.sliceType, iter.Error.Error())\n\t}\n}\n\nfunc (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) {\n\tc := iter.nextToken()\n\tsliceType := decoder.sliceType\n\tif c == 'n' {\n\t\titer.skipThreeBytes('u', 'l', 'l')\n\t\tsliceType.UnsafeSetNil(ptr)\n\t\treturn\n\t}\n\tif c != '[' {\n\t\titer.ReportError(\"decode slice\", \"expect [ or n, but found \"+string([]byte{c}))\n\t\treturn\n\t}\n\tc = iter.nextToken()\n\tif c == ']' {\n\t\tsliceType.UnsafeSet(ptr, sliceType.UnsafeMakeSlice(0, 0))\n\t\treturn\n\t}\n\titer.unreadByte()\n\tsliceType.UnsafeGrow(ptr, 1)\n\telemPtr := sliceType.UnsafeGetIndex(ptr, 0)\n\tdecoder.elemDecoder.Decode(elemPtr, iter)\n\tlength := 1\n\tfor c = iter.nextToken(); c == ','; c = iter.nextToken() {\n\t\tidx := length\n\t\tlength += 1\n\t\tsliceType.UnsafeGrow(ptr, length)\n\t\telemPtr = sliceType.UnsafeGetIndex(ptr, idx)\n\t\tdecoder.elemDecoder.Decode(elemPtr, iter)\n\t}\n\tif c != ']' {\n\t\titer.ReportError(\"decode slice\", \"expect ], but found \"+string([]byte{c}))\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "reflect_struct_decoder.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"unsafe\"\n\n\t\"github.com/modern-go/reflect2\"\n)\n\nfunc decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder {\n\tbindings := map[string]*Binding{}\n\tstructDescriptor := describeStruct(ctx, typ)\n\tfor _, binding := range structDescriptor.Fields {\n\t\tfor _, fromName := range binding.FromNames {\n\t\t\told := bindings[fromName]\n\t\t\tif old == nil {\n\t\t\t\tbindings[fromName] = binding\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tignoreOld, ignoreNew := resolveConflictBinding(ctx.frozenConfig, old, binding)\n\t\t\tif ignoreOld {\n\t\t\t\tdelete(bindings, fromName)\n\t\t\t}\n\t\t\tif !ignoreNew {\n\t\t\t\tbindings[fromName] = binding\n\t\t\t}\n\t\t}\n\t}\n\tfields := map[string]*structFieldDecoder{}\n\tfor k, binding := range bindings {\n\t\tfields[k] = binding.Decoder.(*structFieldDecoder)\n\t}\n\n\tif !ctx.caseSensitive() {\n\t\tfor k, binding := range bindings {\n\t\t\tif _, found := fields[strings.ToLower(k)]; !found {\n\t\t\t\tfields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn createStructDecoder(ctx, typ, fields)\n}\n\nfunc createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structFieldDecoder) ValDecoder {\n\tif ctx.disallowUnknownFields {\n\t\treturn &generalStructDecoder{typ: typ, fields: fields, disallowUnknownFields: true}\n\t}\n\tknownHash := map[int64]struct{}{\n\t\t0: {},\n\t}\n\n\tswitch len(fields) {\n\tcase 0:\n\t\treturn &skipObjectDecoder{typ}\n\tcase 1:\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\treturn &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}\n\t\t}\n\tcase 2:\n\t\tvar fieldHash1 int64\n\t\tvar fieldHash2 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldHash1 == 0 {\n\t\t\t\tfieldHash1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldHash2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}\n\tcase 3:\n\t\tvar fieldName1 int64\n\t\tvar fieldName2 int64\n\t\tvar fieldName3 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tvar fieldDecoder3 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldName1 == 0 {\n\t\t\t\tfieldName1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else if fieldName2 == 0 {\n\t\t\t\tfieldName2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldName3 = fieldHash\n\t\t\t\tfieldDecoder3 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &threeFieldsStructDecoder{typ,\n\t\t\tfieldName1, fieldDecoder1,\n\t\t\tfieldName2, fieldDecoder2,\n\t\t\tfieldName3, fieldDecoder3}\n\tcase 4:\n\t\tvar fieldName1 int64\n\t\tvar fieldName2 int64\n\t\tvar fieldName3 int64\n\t\tvar fieldName4 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tvar fieldDecoder3 *structFieldDecoder\n\t\tvar fieldDecoder4 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldName1 == 0 {\n\t\t\t\tfieldName1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else if fieldName2 == 0 {\n\t\t\t\tfieldName2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t} else if fieldName3 == 0 {\n\t\t\t\tfieldName3 = fieldHash\n\t\t\t\tfieldDecoder3 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldName4 = fieldHash\n\t\t\t\tfieldDecoder4 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &fourFieldsStructDecoder{typ,\n\t\t\tfieldName1, fieldDecoder1,\n\t\t\tfieldName2, fieldDecoder2,\n\t\t\tfieldName3, fieldDecoder3,\n\t\t\tfieldName4, fieldDecoder4}\n\tcase 5:\n\t\tvar fieldName1 int64\n\t\tvar fieldName2 int64\n\t\tvar fieldName3 int64\n\t\tvar fieldName4 int64\n\t\tvar fieldName5 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tvar fieldDecoder3 *structFieldDecoder\n\t\tvar fieldDecoder4 *structFieldDecoder\n\t\tvar fieldDecoder5 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldName1 == 0 {\n\t\t\t\tfieldName1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else if fieldName2 == 0 {\n\t\t\t\tfieldName2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t} else if fieldName3 == 0 {\n\t\t\t\tfieldName3 = fieldHash\n\t\t\t\tfieldDecoder3 = fieldDecoder\n\t\t\t} else if fieldName4 == 0 {\n\t\t\t\tfieldName4 = fieldHash\n\t\t\t\tfieldDecoder4 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldName5 = fieldHash\n\t\t\t\tfieldDecoder5 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &fiveFieldsStructDecoder{typ,\n\t\t\tfieldName1, fieldDecoder1,\n\t\t\tfieldName2, fieldDecoder2,\n\t\t\tfieldName3, fieldDecoder3,\n\t\t\tfieldName4, fieldDecoder4,\n\t\t\tfieldName5, fieldDecoder5}\n\tcase 6:\n\t\tvar fieldName1 int64\n\t\tvar fieldName2 int64\n\t\tvar fieldName3 int64\n\t\tvar fieldName4 int64\n\t\tvar fieldName5 int64\n\t\tvar fieldName6 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tvar fieldDecoder3 *structFieldDecoder\n\t\tvar fieldDecoder4 *structFieldDecoder\n\t\tvar fieldDecoder5 *structFieldDecoder\n\t\tvar fieldDecoder6 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldName1 == 0 {\n\t\t\t\tfieldName1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else if fieldName2 == 0 {\n\t\t\t\tfieldName2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t} else if fieldName3 == 0 {\n\t\t\t\tfieldName3 = fieldHash\n\t\t\t\tfieldDecoder3 = fieldDecoder\n\t\t\t} else if fieldName4 == 0 {\n\t\t\t\tfieldName4 = fieldHash\n\t\t\t\tfieldDecoder4 = fieldDecoder\n\t\t\t} else if fieldName5 == 0 {\n\t\t\t\tfieldName5 = fieldHash\n\t\t\t\tfieldDecoder5 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldName6 = fieldHash\n\t\t\t\tfieldDecoder6 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &sixFieldsStructDecoder{typ,\n\t\t\tfieldName1, fieldDecoder1,\n\t\t\tfieldName2, fieldDecoder2,\n\t\t\tfieldName3, fieldDecoder3,\n\t\t\tfieldName4, fieldDecoder4,\n\t\t\tfieldName5, fieldDecoder5,\n\t\t\tfieldName6, fieldDecoder6}\n\tcase 7:\n\t\tvar fieldName1 int64\n\t\tvar fieldName2 int64\n\t\tvar fieldName3 int64\n\t\tvar fieldName4 int64\n\t\tvar fieldName5 int64\n\t\tvar fieldName6 int64\n\t\tvar fieldName7 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tvar fieldDecoder3 *structFieldDecoder\n\t\tvar fieldDecoder4 *structFieldDecoder\n\t\tvar fieldDecoder5 *structFieldDecoder\n\t\tvar fieldDecoder6 *structFieldDecoder\n\t\tvar fieldDecoder7 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldName1 == 0 {\n\t\t\t\tfieldName1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else if fieldName2 == 0 {\n\t\t\t\tfieldName2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t} else if fieldName3 == 0 {\n\t\t\t\tfieldName3 = fieldHash\n\t\t\t\tfieldDecoder3 = fieldDecoder\n\t\t\t} else if fieldName4 == 0 {\n\t\t\t\tfieldName4 = fieldHash\n\t\t\t\tfieldDecoder4 = fieldDecoder\n\t\t\t} else if fieldName5 == 0 {\n\t\t\t\tfieldName5 = fieldHash\n\t\t\t\tfieldDecoder5 = fieldDecoder\n\t\t\t} else if fieldName6 == 0 {\n\t\t\t\tfieldName6 = fieldHash\n\t\t\t\tfieldDecoder6 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldName7 = fieldHash\n\t\t\t\tfieldDecoder7 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &sevenFieldsStructDecoder{typ,\n\t\t\tfieldName1, fieldDecoder1,\n\t\t\tfieldName2, fieldDecoder2,\n\t\t\tfieldName3, fieldDecoder3,\n\t\t\tfieldName4, fieldDecoder4,\n\t\t\tfieldName5, fieldDecoder5,\n\t\t\tfieldName6, fieldDecoder6,\n\t\t\tfieldName7, fieldDecoder7}\n\tcase 8:\n\t\tvar fieldName1 int64\n\t\tvar fieldName2 int64\n\t\tvar fieldName3 int64\n\t\tvar fieldName4 int64\n\t\tvar fieldName5 int64\n\t\tvar fieldName6 int64\n\t\tvar fieldName7 int64\n\t\tvar fieldName8 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tvar fieldDecoder3 *structFieldDecoder\n\t\tvar fieldDecoder4 *structFieldDecoder\n\t\tvar fieldDecoder5 *structFieldDecoder\n\t\tvar fieldDecoder6 *structFieldDecoder\n\t\tvar fieldDecoder7 *structFieldDecoder\n\t\tvar fieldDecoder8 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldName1 == 0 {\n\t\t\t\tfieldName1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else if fieldName2 == 0 {\n\t\t\t\tfieldName2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t} else if fieldName3 == 0 {\n\t\t\t\tfieldName3 = fieldHash\n\t\t\t\tfieldDecoder3 = fieldDecoder\n\t\t\t} else if fieldName4 == 0 {\n\t\t\t\tfieldName4 = fieldHash\n\t\t\t\tfieldDecoder4 = fieldDecoder\n\t\t\t} else if fieldName5 == 0 {\n\t\t\t\tfieldName5 = fieldHash\n\t\t\t\tfieldDecoder5 = fieldDecoder\n\t\t\t} else if fieldName6 == 0 {\n\t\t\t\tfieldName6 = fieldHash\n\t\t\t\tfieldDecoder6 = fieldDecoder\n\t\t\t} else if fieldName7 == 0 {\n\t\t\t\tfieldName7 = fieldHash\n\t\t\t\tfieldDecoder7 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldName8 = fieldHash\n\t\t\t\tfieldDecoder8 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &eightFieldsStructDecoder{typ,\n\t\t\tfieldName1, fieldDecoder1,\n\t\t\tfieldName2, fieldDecoder2,\n\t\t\tfieldName3, fieldDecoder3,\n\t\t\tfieldName4, fieldDecoder4,\n\t\t\tfieldName5, fieldDecoder5,\n\t\t\tfieldName6, fieldDecoder6,\n\t\t\tfieldName7, fieldDecoder7,\n\t\t\tfieldName8, fieldDecoder8}\n\tcase 9:\n\t\tvar fieldName1 int64\n\t\tvar fieldName2 int64\n\t\tvar fieldName3 int64\n\t\tvar fieldName4 int64\n\t\tvar fieldName5 int64\n\t\tvar fieldName6 int64\n\t\tvar fieldName7 int64\n\t\tvar fieldName8 int64\n\t\tvar fieldName9 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tvar fieldDecoder3 *structFieldDecoder\n\t\tvar fieldDecoder4 *structFieldDecoder\n\t\tvar fieldDecoder5 *structFieldDecoder\n\t\tvar fieldDecoder6 *structFieldDecoder\n\t\tvar fieldDecoder7 *structFieldDecoder\n\t\tvar fieldDecoder8 *structFieldDecoder\n\t\tvar fieldDecoder9 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldName1 == 0 {\n\t\t\t\tfieldName1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else if fieldName2 == 0 {\n\t\t\t\tfieldName2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t} else if fieldName3 == 0 {\n\t\t\t\tfieldName3 = fieldHash\n\t\t\t\tfieldDecoder3 = fieldDecoder\n\t\t\t} else if fieldName4 == 0 {\n\t\t\t\tfieldName4 = fieldHash\n\t\t\t\tfieldDecoder4 = fieldDecoder\n\t\t\t} else if fieldName5 == 0 {\n\t\t\t\tfieldName5 = fieldHash\n\t\t\t\tfieldDecoder5 = fieldDecoder\n\t\t\t} else if fieldName6 == 0 {\n\t\t\t\tfieldName6 = fieldHash\n\t\t\t\tfieldDecoder6 = fieldDecoder\n\t\t\t} else if fieldName7 == 0 {\n\t\t\t\tfieldName7 = fieldHash\n\t\t\t\tfieldDecoder7 = fieldDecoder\n\t\t\t} else if fieldName8 == 0 {\n\t\t\t\tfieldName8 = fieldHash\n\t\t\t\tfieldDecoder8 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldName9 = fieldHash\n\t\t\t\tfieldDecoder9 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &nineFieldsStructDecoder{typ,\n\t\t\tfieldName1, fieldDecoder1,\n\t\t\tfieldName2, fieldDecoder2,\n\t\t\tfieldName3, fieldDecoder3,\n\t\t\tfieldName4, fieldDecoder4,\n\t\t\tfieldName5, fieldDecoder5,\n\t\t\tfieldName6, fieldDecoder6,\n\t\t\tfieldName7, fieldDecoder7,\n\t\t\tfieldName8, fieldDecoder8,\n\t\t\tfieldName9, fieldDecoder9}\n\tcase 10:\n\t\tvar fieldName1 int64\n\t\tvar fieldName2 int64\n\t\tvar fieldName3 int64\n\t\tvar fieldName4 int64\n\t\tvar fieldName5 int64\n\t\tvar fieldName6 int64\n\t\tvar fieldName7 int64\n\t\tvar fieldName8 int64\n\t\tvar fieldName9 int64\n\t\tvar fieldName10 int64\n\t\tvar fieldDecoder1 *structFieldDecoder\n\t\tvar fieldDecoder2 *structFieldDecoder\n\t\tvar fieldDecoder3 *structFieldDecoder\n\t\tvar fieldDecoder4 *structFieldDecoder\n\t\tvar fieldDecoder5 *structFieldDecoder\n\t\tvar fieldDecoder6 *structFieldDecoder\n\t\tvar fieldDecoder7 *structFieldDecoder\n\t\tvar fieldDecoder8 *structFieldDecoder\n\t\tvar fieldDecoder9 *structFieldDecoder\n\t\tvar fieldDecoder10 *structFieldDecoder\n\t\tfor fieldName, fieldDecoder := range fields {\n\t\t\tfieldHash := calcHash(fieldName, ctx.caseSensitive())\n\t\t\t_, known := knownHash[fieldHash]\n\t\t\tif known {\n\t\t\t\treturn &generalStructDecoder{typ, fields, false}\n\t\t\t}\n\t\t\tknownHash[fieldHash] = struct{}{}\n\t\t\tif fieldName1 == 0 {\n\t\t\t\tfieldName1 = fieldHash\n\t\t\t\tfieldDecoder1 = fieldDecoder\n\t\t\t} else if fieldName2 == 0 {\n\t\t\t\tfieldName2 = fieldHash\n\t\t\t\tfieldDecoder2 = fieldDecoder\n\t\t\t} else if fieldName3 == 0 {\n\t\t\t\tfieldName3 = fieldHash\n\t\t\t\tfieldDecoder3 = fieldDecoder\n\t\t\t} else if fieldName4 == 0 {\n\t\t\t\tfieldName4 = fieldHash\n\t\t\t\tfieldDecoder4 = fieldDecoder\n\t\t\t} else if fieldName5 == 0 {\n\t\t\t\tfieldName5 = fieldHash\n\t\t\t\tfieldDecoder5 = fieldDecoder\n\t\t\t} else if fieldName6 == 0 {\n\t\t\t\tfieldName6 = fieldHash\n\t\t\t\tfieldDecoder6 = fieldDecoder\n\t\t\t} else if fieldName7 == 0 {\n\t\t\t\tfieldName7 = fieldHash\n\t\t\t\tfieldDecoder7 = fieldDecoder\n\t\t\t} else if fieldName8 == 0 {\n\t\t\t\tfieldName8 = fieldHash\n\t\t\t\tfieldDecoder8 = fieldDecoder\n\t\t\t} else if fieldName9 == 0 {\n\t\t\t\tfieldName9 = fieldHash\n\t\t\t\tfieldDecoder9 = fieldDecoder\n\t\t\t} else {\n\t\t\t\tfieldName10 = fieldHash\n\t\t\t\tfieldDecoder10 = fieldDecoder\n\t\t\t}\n\t\t}\n\t\treturn &tenFieldsStructDecoder{typ,\n\t\t\tfieldName1, fieldDecoder1,\n\t\t\tfieldName2, fieldDecoder2,\n\t\t\tfieldName3, fieldDecoder3,\n\t\t\tfieldName4, fieldDecoder4,\n\t\t\tfieldName5, fieldDecoder5,\n\t\t\tfieldName6, fieldDecoder6,\n\t\t\tfieldName7, fieldDecoder7,\n\t\t\tfieldName8, fieldDecoder8,\n\t\t\tfieldName9, fieldDecoder9,\n\t\t\tfieldName10, fieldDecoder10}\n\t}\n\treturn &generalStructDecoder{typ, fields, false}\n}\n\ntype generalStructDecoder struct {\n\ttyp                   reflect2.Type\n\tfields                map[string]*structFieldDecoder\n\tdisallowUnknownFields bool\n}\n\nfunc (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tvar c byte\n\tfor c = ','; c == ','; c = iter.nextToken() {\n\t\tdecoder.decodeOneField(ptr, iter)\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\tif c != '}' {\n\t\titer.ReportError(\"struct Decode\", `expect }, but found `+string([]byte{c}))\n\t}\n\titer.decrementDepth()\n}\n\nfunc (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) {\n\tvar field string\n\tvar fieldDecoder *structFieldDecoder\n\tif iter.cfg.objectFieldMustBeSimpleString {\n\t\tfieldBytes := iter.ReadStringAsSlice()\n\t\tfield = *(*string)(unsafe.Pointer(&fieldBytes))\n\t\tfieldDecoder = decoder.fields[field]\n\t\tif fieldDecoder == nil && !iter.cfg.caseSensitive {\n\t\t\tfieldDecoder = decoder.fields[strings.ToLower(field)]\n\t\t}\n\t} else {\n\t\tfield = iter.ReadString()\n\t\tfieldDecoder = decoder.fields[field]\n\t\tif fieldDecoder == nil && !iter.cfg.caseSensitive {\n\t\t\tfieldDecoder = decoder.fields[strings.ToLower(field)]\n\t\t}\n\t}\n\tif fieldDecoder == nil {\n\t\tif decoder.disallowUnknownFields {\n\t\t\tmsg := \"found unknown field: \" + field\n\t\t\titer.ReportError(\"ReadObject\", msg)\n\t\t}\n\t\tc := iter.nextToken()\n\t\tif c != ':' {\n\t\t\titer.ReportError(\"ReadObject\", \"expect : after object field, but found \"+string([]byte{c}))\n\t\t}\n\t\titer.Skip()\n\t\treturn\n\t}\n\tc := iter.nextToken()\n\tif c != ':' {\n\t\titer.ReportError(\"ReadObject\", \"expect : after object field, but found \"+string([]byte{c}))\n\t}\n\tfieldDecoder.Decode(ptr, iter)\n}\n\ntype skipObjectDecoder struct {\n\ttyp reflect2.Type\n}\n\nfunc (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tvalueType := iter.WhatIsNext()\n\tif valueType != ObjectValue && valueType != NilValue {\n\t\titer.ReportError(\"skipObjectDecoder\", \"expect object or null\")\n\t\treturn\n\t}\n\titer.Skip()\n}\n\ntype oneFieldStructDecoder struct {\n\ttyp          reflect2.Type\n\tfieldHash    int64\n\tfieldDecoder *structFieldDecoder\n}\n\nfunc (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tif iter.readFieldHash() == decoder.fieldHash {\n\t\t\tdecoder.fieldDecoder.Decode(ptr, iter)\n\t\t} else {\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype twoFieldsStructDecoder struct {\n\ttyp           reflect2.Type\n\tfieldHash1    int64\n\tfieldDecoder1 *structFieldDecoder\n\tfieldHash2    int64\n\tfieldDecoder2 *structFieldDecoder\n}\n\nfunc (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype threeFieldsStructDecoder struct {\n\ttyp           reflect2.Type\n\tfieldHash1    int64\n\tfieldDecoder1 *structFieldDecoder\n\tfieldHash2    int64\n\tfieldDecoder2 *structFieldDecoder\n\tfieldHash3    int64\n\tfieldDecoder3 *structFieldDecoder\n}\n\nfunc (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tcase decoder.fieldHash3:\n\t\t\tdecoder.fieldDecoder3.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype fourFieldsStructDecoder struct {\n\ttyp           reflect2.Type\n\tfieldHash1    int64\n\tfieldDecoder1 *structFieldDecoder\n\tfieldHash2    int64\n\tfieldDecoder2 *structFieldDecoder\n\tfieldHash3    int64\n\tfieldDecoder3 *structFieldDecoder\n\tfieldHash4    int64\n\tfieldDecoder4 *structFieldDecoder\n}\n\nfunc (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tcase decoder.fieldHash3:\n\t\t\tdecoder.fieldDecoder3.Decode(ptr, iter)\n\t\tcase decoder.fieldHash4:\n\t\t\tdecoder.fieldDecoder4.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype fiveFieldsStructDecoder struct {\n\ttyp           reflect2.Type\n\tfieldHash1    int64\n\tfieldDecoder1 *structFieldDecoder\n\tfieldHash2    int64\n\tfieldDecoder2 *structFieldDecoder\n\tfieldHash3    int64\n\tfieldDecoder3 *structFieldDecoder\n\tfieldHash4    int64\n\tfieldDecoder4 *structFieldDecoder\n\tfieldHash5    int64\n\tfieldDecoder5 *structFieldDecoder\n}\n\nfunc (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tcase decoder.fieldHash3:\n\t\t\tdecoder.fieldDecoder3.Decode(ptr, iter)\n\t\tcase decoder.fieldHash4:\n\t\t\tdecoder.fieldDecoder4.Decode(ptr, iter)\n\t\tcase decoder.fieldHash5:\n\t\t\tdecoder.fieldDecoder5.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype sixFieldsStructDecoder struct {\n\ttyp           reflect2.Type\n\tfieldHash1    int64\n\tfieldDecoder1 *structFieldDecoder\n\tfieldHash2    int64\n\tfieldDecoder2 *structFieldDecoder\n\tfieldHash3    int64\n\tfieldDecoder3 *structFieldDecoder\n\tfieldHash4    int64\n\tfieldDecoder4 *structFieldDecoder\n\tfieldHash5    int64\n\tfieldDecoder5 *structFieldDecoder\n\tfieldHash6    int64\n\tfieldDecoder6 *structFieldDecoder\n}\n\nfunc (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tcase decoder.fieldHash3:\n\t\t\tdecoder.fieldDecoder3.Decode(ptr, iter)\n\t\tcase decoder.fieldHash4:\n\t\t\tdecoder.fieldDecoder4.Decode(ptr, iter)\n\t\tcase decoder.fieldHash5:\n\t\t\tdecoder.fieldDecoder5.Decode(ptr, iter)\n\t\tcase decoder.fieldHash6:\n\t\t\tdecoder.fieldDecoder6.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype sevenFieldsStructDecoder struct {\n\ttyp           reflect2.Type\n\tfieldHash1    int64\n\tfieldDecoder1 *structFieldDecoder\n\tfieldHash2    int64\n\tfieldDecoder2 *structFieldDecoder\n\tfieldHash3    int64\n\tfieldDecoder3 *structFieldDecoder\n\tfieldHash4    int64\n\tfieldDecoder4 *structFieldDecoder\n\tfieldHash5    int64\n\tfieldDecoder5 *structFieldDecoder\n\tfieldHash6    int64\n\tfieldDecoder6 *structFieldDecoder\n\tfieldHash7    int64\n\tfieldDecoder7 *structFieldDecoder\n}\n\nfunc (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tcase decoder.fieldHash3:\n\t\t\tdecoder.fieldDecoder3.Decode(ptr, iter)\n\t\tcase decoder.fieldHash4:\n\t\t\tdecoder.fieldDecoder4.Decode(ptr, iter)\n\t\tcase decoder.fieldHash5:\n\t\t\tdecoder.fieldDecoder5.Decode(ptr, iter)\n\t\tcase decoder.fieldHash6:\n\t\t\tdecoder.fieldDecoder6.Decode(ptr, iter)\n\t\tcase decoder.fieldHash7:\n\t\t\tdecoder.fieldDecoder7.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype eightFieldsStructDecoder struct {\n\ttyp           reflect2.Type\n\tfieldHash1    int64\n\tfieldDecoder1 *structFieldDecoder\n\tfieldHash2    int64\n\tfieldDecoder2 *structFieldDecoder\n\tfieldHash3    int64\n\tfieldDecoder3 *structFieldDecoder\n\tfieldHash4    int64\n\tfieldDecoder4 *structFieldDecoder\n\tfieldHash5    int64\n\tfieldDecoder5 *structFieldDecoder\n\tfieldHash6    int64\n\tfieldDecoder6 *structFieldDecoder\n\tfieldHash7    int64\n\tfieldDecoder7 *structFieldDecoder\n\tfieldHash8    int64\n\tfieldDecoder8 *structFieldDecoder\n}\n\nfunc (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tcase decoder.fieldHash3:\n\t\t\tdecoder.fieldDecoder3.Decode(ptr, iter)\n\t\tcase decoder.fieldHash4:\n\t\t\tdecoder.fieldDecoder4.Decode(ptr, iter)\n\t\tcase decoder.fieldHash5:\n\t\t\tdecoder.fieldDecoder5.Decode(ptr, iter)\n\t\tcase decoder.fieldHash6:\n\t\t\tdecoder.fieldDecoder6.Decode(ptr, iter)\n\t\tcase decoder.fieldHash7:\n\t\t\tdecoder.fieldDecoder7.Decode(ptr, iter)\n\t\tcase decoder.fieldHash8:\n\t\t\tdecoder.fieldDecoder8.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype nineFieldsStructDecoder struct {\n\ttyp           reflect2.Type\n\tfieldHash1    int64\n\tfieldDecoder1 *structFieldDecoder\n\tfieldHash2    int64\n\tfieldDecoder2 *structFieldDecoder\n\tfieldHash3    int64\n\tfieldDecoder3 *structFieldDecoder\n\tfieldHash4    int64\n\tfieldDecoder4 *structFieldDecoder\n\tfieldHash5    int64\n\tfieldDecoder5 *structFieldDecoder\n\tfieldHash6    int64\n\tfieldDecoder6 *structFieldDecoder\n\tfieldHash7    int64\n\tfieldDecoder7 *structFieldDecoder\n\tfieldHash8    int64\n\tfieldDecoder8 *structFieldDecoder\n\tfieldHash9    int64\n\tfieldDecoder9 *structFieldDecoder\n}\n\nfunc (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tcase decoder.fieldHash3:\n\t\t\tdecoder.fieldDecoder3.Decode(ptr, iter)\n\t\tcase decoder.fieldHash4:\n\t\t\tdecoder.fieldDecoder4.Decode(ptr, iter)\n\t\tcase decoder.fieldHash5:\n\t\t\tdecoder.fieldDecoder5.Decode(ptr, iter)\n\t\tcase decoder.fieldHash6:\n\t\t\tdecoder.fieldDecoder6.Decode(ptr, iter)\n\t\tcase decoder.fieldHash7:\n\t\t\tdecoder.fieldDecoder7.Decode(ptr, iter)\n\t\tcase decoder.fieldHash8:\n\t\t\tdecoder.fieldDecoder8.Decode(ptr, iter)\n\t\tcase decoder.fieldHash9:\n\t\t\tdecoder.fieldDecoder9.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype tenFieldsStructDecoder struct {\n\ttyp            reflect2.Type\n\tfieldHash1     int64\n\tfieldDecoder1  *structFieldDecoder\n\tfieldHash2     int64\n\tfieldDecoder2  *structFieldDecoder\n\tfieldHash3     int64\n\tfieldDecoder3  *structFieldDecoder\n\tfieldHash4     int64\n\tfieldDecoder4  *structFieldDecoder\n\tfieldHash5     int64\n\tfieldDecoder5  *structFieldDecoder\n\tfieldHash6     int64\n\tfieldDecoder6  *structFieldDecoder\n\tfieldHash7     int64\n\tfieldDecoder7  *structFieldDecoder\n\tfieldHash8     int64\n\tfieldDecoder8  *structFieldDecoder\n\tfieldHash9     int64\n\tfieldDecoder9  *structFieldDecoder\n\tfieldHash10    int64\n\tfieldDecoder10 *structFieldDecoder\n}\n\nfunc (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif !iter.readObjectStart() {\n\t\treturn\n\t}\n\tif !iter.incrementDepth() {\n\t\treturn\n\t}\n\tfor {\n\t\tswitch iter.readFieldHash() {\n\t\tcase decoder.fieldHash1:\n\t\t\tdecoder.fieldDecoder1.Decode(ptr, iter)\n\t\tcase decoder.fieldHash2:\n\t\t\tdecoder.fieldDecoder2.Decode(ptr, iter)\n\t\tcase decoder.fieldHash3:\n\t\t\tdecoder.fieldDecoder3.Decode(ptr, iter)\n\t\tcase decoder.fieldHash4:\n\t\t\tdecoder.fieldDecoder4.Decode(ptr, iter)\n\t\tcase decoder.fieldHash5:\n\t\t\tdecoder.fieldDecoder5.Decode(ptr, iter)\n\t\tcase decoder.fieldHash6:\n\t\t\tdecoder.fieldDecoder6.Decode(ptr, iter)\n\t\tcase decoder.fieldHash7:\n\t\t\tdecoder.fieldDecoder7.Decode(ptr, iter)\n\t\tcase decoder.fieldHash8:\n\t\t\tdecoder.fieldDecoder8.Decode(ptr, iter)\n\t\tcase decoder.fieldHash9:\n\t\t\tdecoder.fieldDecoder9.Decode(ptr, iter)\n\t\tcase decoder.fieldHash10:\n\t\t\tdecoder.fieldDecoder10.Decode(ptr, iter)\n\t\tdefault:\n\t\t\titer.Skip()\n\t\t}\n\t\tif iter.isObjectEnd() {\n\t\t\tbreak\n\t\t}\n\t}\n\tif iter.Error != nil && iter.Error != io.EOF && len(decoder.typ.Type1().Name()) != 0 {\n\t\titer.Error = fmt.Errorf(\"%v.%s\", decoder.typ, iter.Error.Error())\n\t}\n\titer.decrementDepth()\n}\n\ntype structFieldDecoder struct {\n\tfield        reflect2.StructField\n\tfieldDecoder ValDecoder\n}\n\nfunc (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tfieldPtr := decoder.field.UnsafeGet(ptr)\n\tdecoder.fieldDecoder.Decode(fieldPtr, iter)\n\tif iter.Error != nil && iter.Error != io.EOF {\n\t\titer.Error = fmt.Errorf(\"%s: %s\", decoder.field.Name(), iter.Error.Error())\n\t}\n}\n\ntype stringModeStringDecoder struct {\n\telemDecoder ValDecoder\n\tcfg         *frozenConfig\n}\n\nfunc (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tdecoder.elemDecoder.Decode(ptr, iter)\n\tstr := *((*string)(ptr))\n\ttempIter := decoder.cfg.BorrowIterator([]byte(str))\n\tdefer decoder.cfg.ReturnIterator(tempIter)\n\t*((*string)(ptr)) = tempIter.ReadString()\n}\n\ntype stringModeNumberDecoder struct {\n\telemDecoder ValDecoder\n}\n\nfunc (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {\n\tif iter.WhatIsNext() == NilValue {\n\t\tdecoder.elemDecoder.Decode(ptr, iter)\n\t\treturn\n\t}\n\n\tc := iter.nextToken()\n\tif c != '\"' {\n\t\titer.ReportError(\"stringModeNumberDecoder\", `expect \", but found `+string([]byte{c}))\n\t\treturn\n\t}\n\tdecoder.elemDecoder.Decode(ptr, iter)\n\tif iter.Error != nil {\n\t\treturn\n\t}\n\tc = iter.readByte()\n\tif c != '\"' {\n\t\titer.ReportError(\"stringModeNumberDecoder\", `expect \", but found `+string([]byte{c}))\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "reflect_struct_encoder.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"github.com/modern-go/reflect2\"\n\t\"io\"\n\t\"reflect\"\n\t\"unsafe\"\n)\n\nfunc encoderOfStruct(ctx *ctx, typ reflect2.Type) ValEncoder {\n\ttype bindingTo struct {\n\t\tbinding *Binding\n\t\ttoName  string\n\t\tignored bool\n\t}\n\torderedBindings := []*bindingTo{}\n\tstructDescriptor := describeStruct(ctx, typ)\n\tfor _, binding := range structDescriptor.Fields {\n\t\tfor _, toName := range binding.ToNames {\n\t\t\tnew := &bindingTo{\n\t\t\t\tbinding: binding,\n\t\t\t\ttoName:  toName,\n\t\t\t}\n\t\t\tfor _, old := range orderedBindings {\n\t\t\t\tif old.toName != toName {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\told.ignored, new.ignored = resolveConflictBinding(ctx.frozenConfig, old.binding, new.binding)\n\t\t\t}\n\t\t\torderedBindings = append(orderedBindings, new)\n\t\t}\n\t}\n\tif len(orderedBindings) == 0 {\n\t\treturn &emptyStructEncoder{}\n\t}\n\tfinalOrderedFields := []structFieldTo{}\n\tfor _, bindingTo := range orderedBindings {\n\t\tif !bindingTo.ignored {\n\t\t\tfinalOrderedFields = append(finalOrderedFields, structFieldTo{\n\t\t\t\tencoder: bindingTo.binding.Encoder.(*structFieldEncoder),\n\t\t\t\ttoName:  bindingTo.toName,\n\t\t\t})\n\t\t}\n\t}\n\treturn &structEncoder{typ, finalOrderedFields}\n}\n\nfunc createCheckIsEmpty(ctx *ctx, typ reflect2.Type) checkIsEmpty {\n\tencoder := createEncoderOfNative(ctx, typ)\n\tif encoder != nil {\n\t\treturn encoder\n\t}\n\tkind := typ.Kind()\n\tswitch kind {\n\tcase reflect.Interface:\n\t\treturn &dynamicEncoder{typ}\n\tcase reflect.Struct:\n\t\treturn &structEncoder{typ: typ}\n\tcase reflect.Array:\n\t\treturn &arrayEncoder{}\n\tcase reflect.Slice:\n\t\treturn &sliceEncoder{}\n\tcase reflect.Map:\n\t\treturn encoderOfMap(ctx, typ)\n\tcase reflect.Ptr:\n\t\treturn &OptionalEncoder{}\n\tdefault:\n\t\treturn &lazyErrorEncoder{err: fmt.Errorf(\"unsupported type: %v\", typ)}\n\t}\n}\n\nfunc resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) {\n\tnewTagged := new.Field.Tag().Get(cfg.getTagKey()) != \"\"\n\toldTagged := old.Field.Tag().Get(cfg.getTagKey()) != \"\"\n\tif newTagged {\n\t\tif oldTagged {\n\t\t\tif len(old.levels) > len(new.levels) {\n\t\t\t\treturn true, false\n\t\t\t} else if len(new.levels) > len(old.levels) {\n\t\t\t\treturn false, true\n\t\t\t} else {\n\t\t\t\treturn true, true\n\t\t\t}\n\t\t} else {\n\t\t\treturn true, false\n\t\t}\n\t} else {\n\t\tif oldTagged {\n\t\t\treturn true, false\n\t\t}\n\t\tif len(old.levels) > len(new.levels) {\n\t\t\treturn true, false\n\t\t} else if len(new.levels) > len(old.levels) {\n\t\t\treturn false, true\n\t\t} else {\n\t\t\treturn true, true\n\t\t}\n\t}\n}\n\ntype structFieldEncoder struct {\n\tfield        reflect2.StructField\n\tfieldEncoder ValEncoder\n\tomitempty    bool\n}\n\nfunc (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tfieldPtr := encoder.field.UnsafeGet(ptr)\n\tencoder.fieldEncoder.Encode(fieldPtr, stream)\n\tif stream.Error != nil && stream.Error != io.EOF {\n\t\tstream.Error = fmt.Errorf(\"%s: %s\", encoder.field.Name(), stream.Error.Error())\n\t}\n}\n\nfunc (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\tfieldPtr := encoder.field.UnsafeGet(ptr)\n\treturn encoder.fieldEncoder.IsEmpty(fieldPtr)\n}\n\nfunc (encoder *structFieldEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool {\n\tisEmbeddedPtrNil, converted := encoder.fieldEncoder.(IsEmbeddedPtrNil)\n\tif !converted {\n\t\treturn false\n\t}\n\tfieldPtr := encoder.field.UnsafeGet(ptr)\n\treturn isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr)\n}\n\ntype IsEmbeddedPtrNil interface {\n\tIsEmbeddedPtrNil(ptr unsafe.Pointer) bool\n}\n\ntype structEncoder struct {\n\ttyp    reflect2.Type\n\tfields []structFieldTo\n}\n\ntype structFieldTo struct {\n\tencoder *structFieldEncoder\n\ttoName  string\n}\n\nfunc (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteObjectStart()\n\tisNotFirst := false\n\tfor _, field := range encoder.fields {\n\t\tif field.encoder.omitempty && field.encoder.IsEmpty(ptr) {\n\t\t\tcontinue\n\t\t}\n\t\tif field.encoder.IsEmbeddedPtrNil(ptr) {\n\t\t\tcontinue\n\t\t}\n\t\tif isNotFirst {\n\t\t\tstream.WriteMore()\n\t\t}\n\t\tstream.WriteObjectField(field.toName)\n\t\tfield.encoder.Encode(ptr, stream)\n\t\tisNotFirst = true\n\t}\n\tstream.WriteObjectEnd()\n\tif stream.Error != nil && stream.Error != io.EOF {\n\t\tstream.Error = fmt.Errorf(\"%v.%s\", encoder.typ, stream.Error.Error())\n\t}\n}\n\nfunc (encoder *structEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn false\n}\n\ntype emptyStructEncoder struct {\n}\n\nfunc (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.WriteEmptyObject()\n}\n\nfunc (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn false\n}\n\ntype stringModeNumberEncoder struct {\n\telemEncoder ValEncoder\n}\n\nfunc (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\tstream.writeByte('\"')\n\tencoder.elemEncoder.Encode(ptr, stream)\n\tstream.writeByte('\"')\n}\n\nfunc (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.elemEncoder.IsEmpty(ptr)\n}\n\ntype stringModeStringEncoder struct {\n\telemEncoder ValEncoder\n\tcfg         *frozenConfig\n}\n\nfunc (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {\n\ttempStream := encoder.cfg.BorrowStream(nil)\n\ttempStream.Attachment = stream.Attachment\n\tdefer encoder.cfg.ReturnStream(tempStream)\n\tencoder.elemEncoder.Encode(ptr, tempStream)\n\tstream.WriteString(string(tempStream.Buffer()))\n}\n\nfunc (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {\n\treturn encoder.elemEncoder.IsEmpty(ptr)\n}\n"
  },
  {
    "path": "skip_tests/array_test.go",
    "content": "package skip_tests\n\nfunc init() {\n\ttestCases = append(testCases, testCase{\n\t\tptr: (*[]interface{})(nil),\n\t\tinputs: []string{\n\t\t\t`[]`,             // valid\n\t\t\t`[1]`,            // valid\n\t\t\t`[  1, \"hello\"]`, // valid\n\t\t\t`[abc]`,          // invalid\n\t\t\t`[`,              // invalid\n\t\t\t`[[]`,            // invalid\n\t\t},\n\t})\n}\n"
  },
  {
    "path": "skip_tests/float64_test.go",
    "content": "package skip_tests\n\nfunc init() {\n\ttestCases = append(testCases, testCase{\n\t\tptr: (*float64)(nil),\n\t\tinputs: []string{\n\t\t\t\"+1\",    // invalid\n\t\t\t\"-a\",    // invalid\n\t\t\t\"-\\x00\", // invalid, zero byte\n\t\t\t\"0.1\",   // valid\n\t\t\t\"0..1\",  // invalid, more dot\n\t\t\t\"1e+1\",  // valid\n\t\t\t\"1+1\",   // invalid\n\t\t\t\"1E1\",   // valid, e or E\n\t\t\t\"1ee1\",  // invalid\n\t\t\t\"100a\",  // invalid\n\t\t\t\"10.\",   // invalid\n\t\t},\n\t})\n}\n"
  },
  {
    "path": "skip_tests/jsoniter_skip_test.go",
    "content": "package skip_tests\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_skip_number_in_array(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[-0.12, \"stream\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tshould.Nil(iter.Error)\n\tshould.Equal(\"stream\", iter.ReadString())\n}\n\nfunc Test_skip_string_in_array(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[\"hello\", \"stream\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tshould.Nil(iter.Error)\n\tshould.Equal(\"stream\", iter.ReadString())\n}\n\nfunc Test_skip_null(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[null , \"stream\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tif iter.ReadString() != \"stream\" {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_skip_true(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[true , \"stream\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tif iter.ReadString() != \"stream\" {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_skip_false(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[false , \"stream\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tif iter.ReadString() != \"stream\" {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_skip_array(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[[1, [2, [3], 4]], \"stream\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tif iter.ReadString() != \"stream\" {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_skip_empty_array(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[ [ ], \"stream\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tif iter.ReadString() != \"stream\" {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_skip_nested(t *testing.T) {\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[ {\"a\" : [{\"stream\": \"c\"}], \"d\": 102 }, \"stream\"]`)\n\titer.ReadArray()\n\titer.Skip()\n\titer.ReadArray()\n\tif iter.ReadString() != \"stream\" {\n\t\tt.FailNow()\n\t}\n}\n\nfunc Test_skip_and_return_bytes(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.ParseString(jsoniter.ConfigDefault, `[ {\"a\" : [{\"stream\": \"c\"}], \"d\": 102 }, \"stream\"]`)\n\titer.ReadArray()\n\tskipped := iter.SkipAndReturnBytes()\n\tshould.Equal(`{\"a\" : [{\"stream\": \"c\"}], \"d\": 102 }`, string(skipped))\n}\n\nfunc Test_skip_and_return_bytes_with_reader(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(`[ {\"a\" : [{\"stream\": \"c\"}], \"d\": 102 }, \"stream\"]`), 4)\n\titer.ReadArray()\n\tskipped := iter.SkipAndReturnBytes()\n\tshould.Equal(`{\"a\" : [{\"stream\": \"c\"}], \"d\": 102 }`, string(skipped))\n}\n\nfunc Test_append_skip_and_return_bytes_with_reader(t *testing.T) {\n\tshould := require.New(t)\n\titer := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(`[ {\"a\" : [{\"stream\": \"c\"}], \"d\": 102 }, \"stream\"]`), 4)\n\titer.ReadArray()\n\tbuf := make([]byte, 0, 1024)\n\tbuf = iter.SkipAndAppendBytes(buf)\n\tshould.Equal(`{\"a\" : [{\"stream\": \"c\"}], \"d\": 102 }`, string(buf))\n}\n\nfunc Test_skip_empty(t *testing.T) {\n\tshould := require.New(t)\n\tshould.NotNil(jsoniter.Get([]byte(\"\")).LastError())\n}\n\ntype TestResp struct {\n\tCode uint64\n}\n\nfunc Benchmark_jsoniter_skip(b *testing.B) {\n\tinput := []byte(`\n{\n    \"_shards\":{\n        \"total\" : 5,\n        \"successful\" : 5,\n        \"failed\" : 0\n    },\n    \"hits\":{\n        \"total\" : 1,\n        \"hits\" : [\n            {\n                \"_index\" : \"twitter\",\n                \"_type\" : \"tweet\",\n                \"_id\" : \"1\",\n                \"_source\" : {\n                    \"user\" : \"kimchy\",\n                    \"postDate\" : \"2009-11-15T14:12:12\",\n                    \"message\" : \"trying out Elasticsearch\"\n                }\n            }\n        ]\n    },\n    \"code\": 200\n}`)\n\tfor n := 0; n < b.N; n++ {\n\t\tresult := TestResp{}\n\t\titer := jsoniter.ParseBytes(jsoniter.ConfigDefault, input)\n\t\tfor field := iter.ReadObject(); field != \"\"; field = iter.ReadObject() {\n\t\t\tswitch field {\n\t\t\tcase \"code\":\n\t\t\t\tresult.Code = iter.ReadUint64()\n\t\t\tdefault:\n\t\t\t\titer.Skip()\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc Benchmark_json_skip(b *testing.B) {\n\tinput := []byte(`\n{\n    \"_shards\":{\n        \"total\" : 5,\n        \"successful\" : 5,\n        \"failed\" : 0\n    },\n    \"hits\":{\n        \"total\" : 1,\n        \"hits\" : [\n            {\n                \"_index\" : \"twitter\",\n                \"_type\" : \"tweet\",\n                \"_id\" : \"1\",\n                \"_source\" : {\n                    \"user\" : \"kimchy\",\n                    \"postDate\" : \"2009-11-15T14:12:12\",\n                    \"message\" : \"trying out Elasticsearch\"\n                }\n            }\n        ]\n    },\n    \"code\": 200\n}`)\n\tfor n := 0; n < b.N; n++ {\n\t\tresult := TestResp{}\n\t\tjson.Unmarshal(input, &result)\n\t}\n}\n"
  },
  {
    "path": "skip_tests/skip_test.go",
    "content": "package skip_tests\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"io\"\n\t\"reflect\"\n\t\"testing\"\n)\n\ntype testCase struct {\n\tptr    interface{}\n\tinputs []string\n}\n\nvar testCases []testCase\n\nfunc Test_skip(t *testing.T) {\n\tfor _, testCase := range testCases {\n\t\tvalType := reflect.TypeOf(testCase.ptr).Elem()\n\t\tfor _, input := range testCase.inputs {\n\t\t\tt.Run(input, func(t *testing.T) {\n\t\t\t\tshould := require.New(t)\n\t\t\t\tptrVal := reflect.New(valType)\n\t\t\t\tstdErr := json.Unmarshal([]byte(input), ptrVal.Interface())\n\t\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input)\n\t\t\t\titer.Skip()\n\t\t\t\titer.ReadNil() // trigger looking forward\n\t\t\t\terr := iter.Error\n\t\t\t\tif err == io.EOF {\n\t\t\t\t\terr = nil\n\t\t\t\t} else {\n\t\t\t\t\terr = errors.New(\"remaining bytes\")\n\t\t\t\t}\n\t\t\t\tif stdErr == nil {\n\t\t\t\t\tshould.Nil(err)\n\t\t\t\t} else {\n\t\t\t\t\tshould.NotNil(err)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "skip_tests/string_test.go",
    "content": "package skip_tests\n\nfunc init() {\n\ttestCases = append(testCases, testCase{\n\t\tptr: (*string)(nil),\n\t\tinputs: []string{\n\t\t\t`\"\"`,       // valid\n\t\t\t`\"hello\"`,  // valid\n\t\t\t`\"`,        // invalid\n\t\t\t`\"\\\"`,      // invalid\n\t\t\t`\"\\x00\"`,   // invalid\n\t\t\t\"\\\"\\x00\\\"\", // invalid\n\t\t\t\"\\\"\\t\\\"\",   // invalid\n\t\t\t`\"\\t\"`,     // valid\n\t\t},\n\t})\n}\n"
  },
  {
    "path": "skip_tests/struct_test.go",
    "content": "package skip_tests\n\nfunc init() {\n\ttestCases = append(testCases, testCase{\n\t\tptr: (*struct{})(nil),\n\t\tinputs: []string{\n\t\t\t`{}`,                         // valid\n\t\t\t`{\"hello\":\"world\"}`,          // valid\n\t\t\t`{hello:\"world\"}`,            // invalid\n\t\t\t`{\"hello:\"world\"}`,           // invalid\n\t\t\t`{\"hello\",\"world\"}`,          // invalid\n\t\t\t`{\"hello\":{}`,                // invalid\n\t\t\t`{\"hello\":{}}`,               // valid\n\t\t\t`{\"hello\":{}}}`,              // invalid\n\t\t\t`{\"hello\":  {  \"hello\": 1}}`, // valid\n\t\t\t`{abc}`,                      // invalid\n\t\t},\n\t})\n}\n"
  },
  {
    "path": "stream.go",
    "content": "package jsoniter\n\nimport (\n\t\"io\"\n)\n\n// stream is a io.Writer like object, with JSON specific write functions.\n// Error is not returned as return value, but stored as Error member on this stream instance.\ntype Stream struct {\n\tcfg        *frozenConfig\n\tout        io.Writer\n\tbuf        []byte\n\tError      error\n\tindention  int\n\tAttachment interface{} // open for customized encoder\n}\n\n// NewStream create new stream instance.\n// cfg can be jsoniter.ConfigDefault.\n// out can be nil if write to internal buffer.\n// bufSize is the initial size for the internal buffer in bytes.\nfunc NewStream(cfg API, out io.Writer, bufSize int) *Stream {\n\treturn &Stream{\n\t\tcfg:       cfg.(*frozenConfig),\n\t\tout:       out,\n\t\tbuf:       make([]byte, 0, bufSize),\n\t\tError:     nil,\n\t\tindention: 0,\n\t}\n}\n\n// Pool returns a pool can provide more stream with same configuration\nfunc (stream *Stream) Pool() StreamPool {\n\treturn stream.cfg\n}\n\n// Reset reuse this stream instance by assign a new writer\nfunc (stream *Stream) Reset(out io.Writer) {\n\tstream.out = out\n\tstream.buf = stream.buf[:0]\n}\n\n// Available returns how many bytes are unused in the buffer.\nfunc (stream *Stream) Available() int {\n\treturn cap(stream.buf) - len(stream.buf)\n}\n\n// Buffered returns the number of bytes that have been written into the current buffer.\nfunc (stream *Stream) Buffered() int {\n\treturn len(stream.buf)\n}\n\n// Buffer if writer is nil, use this method to take the result\nfunc (stream *Stream) Buffer() []byte {\n\treturn stream.buf\n}\n\n// SetBuffer allows to append to the internal buffer directly\nfunc (stream *Stream) SetBuffer(buf []byte) {\n\tstream.buf = buf\n}\n\n// Write writes the contents of p into the buffer.\n// It returns the number of bytes written.\n// If nn < len(p), it also returns an error explaining\n// why the write is short.\nfunc (stream *Stream) Write(p []byte) (nn int, err error) {\n\tstream.buf = append(stream.buf, p...)\n\tif stream.out != nil {\n\t\tnn, err = stream.out.Write(stream.buf)\n\t\tstream.buf = stream.buf[nn:]\n\t\treturn\n\t}\n\treturn len(p), nil\n}\n\n// WriteByte writes a single byte.\nfunc (stream *Stream) writeByte(c byte) {\n\tstream.buf = append(stream.buf, c)\n}\n\nfunc (stream *Stream) writeTwoBytes(c1 byte, c2 byte) {\n\tstream.buf = append(stream.buf, c1, c2)\n}\n\nfunc (stream *Stream) writeThreeBytes(c1 byte, c2 byte, c3 byte) {\n\tstream.buf = append(stream.buf, c1, c2, c3)\n}\n\nfunc (stream *Stream) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) {\n\tstream.buf = append(stream.buf, c1, c2, c3, c4)\n}\n\nfunc (stream *Stream) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) {\n\tstream.buf = append(stream.buf, c1, c2, c3, c4, c5)\n}\n\n// Flush writes any buffered data to the underlying io.Writer.\nfunc (stream *Stream) Flush() error {\n\tif stream.out == nil {\n\t\treturn nil\n\t}\n\tif stream.Error != nil {\n\t\treturn stream.Error\n\t}\n\t_, err := stream.out.Write(stream.buf)\n\tif err != nil {\n\t\tif stream.Error == nil {\n\t\t\tstream.Error = err\n\t\t}\n\t\treturn err\n\t}\n\tstream.buf = stream.buf[:0]\n\treturn nil\n}\n\n// WriteRaw write string out without quotes, just like []byte\nfunc (stream *Stream) WriteRaw(s string) {\n\tstream.buf = append(stream.buf, s...)\n}\n\n// WriteNil write null to stream\nfunc (stream *Stream) WriteNil() {\n\tstream.writeFourBytes('n', 'u', 'l', 'l')\n}\n\n// WriteTrue write true to stream\nfunc (stream *Stream) WriteTrue() {\n\tstream.writeFourBytes('t', 'r', 'u', 'e')\n}\n\n// WriteFalse write false to stream\nfunc (stream *Stream) WriteFalse() {\n\tstream.writeFiveBytes('f', 'a', 'l', 's', 'e')\n}\n\n// WriteBool write true or false into stream\nfunc (stream *Stream) WriteBool(val bool) {\n\tif val {\n\t\tstream.WriteTrue()\n\t} else {\n\t\tstream.WriteFalse()\n\t}\n}\n\n// WriteObjectStart write { with possible indention\nfunc (stream *Stream) WriteObjectStart() {\n\tstream.indention += stream.cfg.indentionStep\n\tstream.writeByte('{')\n\tstream.writeIndention(0)\n}\n\n// WriteObjectField write \"field\": with possible indention\nfunc (stream *Stream) WriteObjectField(field string) {\n\tstream.WriteString(field)\n\tif stream.indention > 0 {\n\t\tstream.writeTwoBytes(':', ' ')\n\t} else {\n\t\tstream.writeByte(':')\n\t}\n}\n\n// WriteObjectEnd write } with possible indention\nfunc (stream *Stream) WriteObjectEnd() {\n\tstream.writeIndention(stream.cfg.indentionStep)\n\tstream.indention -= stream.cfg.indentionStep\n\tstream.writeByte('}')\n}\n\n// WriteEmptyObject write {}\nfunc (stream *Stream) WriteEmptyObject() {\n\tstream.writeByte('{')\n\tstream.writeByte('}')\n}\n\n// WriteMore write , with possible indention\nfunc (stream *Stream) WriteMore() {\n\tstream.writeByte(',')\n\tstream.writeIndention(0)\n}\n\n// WriteArrayStart write [ with possible indention\nfunc (stream *Stream) WriteArrayStart() {\n\tstream.indention += stream.cfg.indentionStep\n\tstream.writeByte('[')\n\tstream.writeIndention(0)\n}\n\n// WriteEmptyArray write []\nfunc (stream *Stream) WriteEmptyArray() {\n\tstream.writeTwoBytes('[', ']')\n}\n\n// WriteArrayEnd write ] with possible indention\nfunc (stream *Stream) WriteArrayEnd() {\n\tstream.writeIndention(stream.cfg.indentionStep)\n\tstream.indention -= stream.cfg.indentionStep\n\tstream.writeByte(']')\n}\n\nfunc (stream *Stream) writeIndention(delta int) {\n\tif stream.indention == 0 {\n\t\treturn\n\t}\n\tstream.writeByte('\\n')\n\ttoWrite := stream.indention - delta\n\tfor i := 0; i < toWrite; i++ {\n\t\tstream.buf = append(stream.buf, ' ')\n\t}\n}\n"
  },
  {
    "path": "stream_float.go",
    "content": "package jsoniter\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"strconv\"\n)\n\nvar pow10 []uint64\n\nfunc init() {\n\tpow10 = []uint64{1, 10, 100, 1000, 10000, 100000, 1000000}\n}\n\n// WriteFloat32 write float32 to stream\nfunc (stream *Stream) WriteFloat32(val float32) {\n\tif math.IsInf(float64(val), 0) || math.IsNaN(float64(val)) {\n\t\tstream.Error = fmt.Errorf(\"unsupported value: %f\", val)\n\t\treturn\n\t}\n\tabs := math.Abs(float64(val))\n\tfmt := byte('f')\n\t// Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right.\n\tif abs != 0 {\n\t\tif float32(abs) < 1e-6 || float32(abs) >= 1e21 {\n\t\t\tfmt = 'e'\n\t\t}\n\t}\n\tstream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 32)\n\tif fmt == 'e' {\n\t\t// clean up e-09 to e-9\n\t\tn := len(stream.buf)\n\t\tif n >= 4 && stream.buf[n-4] == 'e' && stream.buf[n-3] == '-' && stream.buf[n-2] == '0' {\n\t\t\tstream.buf[n-2] = stream.buf[n-1]\n\t\t\tstream.buf = stream.buf[:n-1]\n\t\t}\n\t}\n}\n\n// WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster\nfunc (stream *Stream) WriteFloat32Lossy(val float32) {\n\tif math.IsInf(float64(val), 0) || math.IsNaN(float64(val)) {\n\t\tstream.Error = fmt.Errorf(\"unsupported value: %f\", val)\n\t\treturn\n\t}\n\tif val < 0 {\n\t\tstream.writeByte('-')\n\t\tval = -val\n\t}\n\tif val > 0x4ffffff {\n\t\tstream.WriteFloat32(val)\n\t\treturn\n\t}\n\tprecision := 6\n\texp := uint64(1000000) // 6\n\tlval := uint64(float64(val)*float64(exp) + 0.5)\n\tstream.WriteUint64(lval / exp)\n\tfval := lval % exp\n\tif fval == 0 {\n\t\treturn\n\t}\n\tstream.writeByte('.')\n\tfor p := precision - 1; p > 0 && fval < pow10[p]; p-- {\n\t\tstream.writeByte('0')\n\t}\n\tstream.WriteUint64(fval)\n\tfor stream.buf[len(stream.buf)-1] == '0' {\n\t\tstream.buf = stream.buf[:len(stream.buf)-1]\n\t}\n}\n\n// WriteFloat64 write float64 to stream\nfunc (stream *Stream) WriteFloat64(val float64) {\n\tif math.IsInf(val, 0) || math.IsNaN(val) {\n\t\tstream.Error = fmt.Errorf(\"unsupported value: %f\", val)\n\t\treturn\n\t}\n\tabs := math.Abs(val)\n\tfmt := byte('f')\n\t// Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right.\n\tif abs != 0 {\n\t\tif abs < 1e-6 || abs >= 1e21 {\n\t\t\tfmt = 'e'\n\t\t}\n\t}\n\tstream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 64)\n\tif fmt == 'e' {\n\t\t// clean up e-09 to e-9\n\t\tn := len(stream.buf)\n\t\tif n >= 4 && stream.buf[n-4] == 'e' && stream.buf[n-3] == '-' && stream.buf[n-2] == '0' {\n\t\t\tstream.buf[n-2] = stream.buf[n-1]\n\t\t\tstream.buf = stream.buf[:n-1]\n\t\t}\n\t}\n}\n\n// WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster\nfunc (stream *Stream) WriteFloat64Lossy(val float64) {\n\tif math.IsInf(val, 0) || math.IsNaN(val) {\n\t\tstream.Error = fmt.Errorf(\"unsupported value: %f\", val)\n\t\treturn\n\t}\n\tif val < 0 {\n\t\tstream.writeByte('-')\n\t\tval = -val\n\t}\n\tif val > 0x4ffffff {\n\t\tstream.WriteFloat64(val)\n\t\treturn\n\t}\n\tprecision := 6\n\texp := uint64(1000000) // 6\n\tlval := uint64(val*float64(exp) + 0.5)\n\tstream.WriteUint64(lval / exp)\n\tfval := lval % exp\n\tif fval == 0 {\n\t\treturn\n\t}\n\tstream.writeByte('.')\n\tfor p := precision - 1; p > 0 && fval < pow10[p]; p-- {\n\t\tstream.writeByte('0')\n\t}\n\tstream.WriteUint64(fval)\n\tfor stream.buf[len(stream.buf)-1] == '0' {\n\t\tstream.buf = stream.buf[:len(stream.buf)-1]\n\t}\n}\n"
  },
  {
    "path": "stream_int.go",
    "content": "package jsoniter\n\nvar digits []uint32\n\nfunc init() {\n\tdigits = make([]uint32, 1000)\n\tfor i := uint32(0); i < 1000; i++ {\n\t\tdigits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0'\n\t\tif i < 10 {\n\t\t\tdigits[i] += 2 << 24\n\t\t} else if i < 100 {\n\t\t\tdigits[i] += 1 << 24\n\t\t}\n\t}\n}\n\nfunc writeFirstBuf(space []byte, v uint32) []byte {\n\tstart := v >> 24\n\tif start == 0 {\n\t\tspace = append(space, byte(v>>16), byte(v>>8))\n\t} else if start == 1 {\n\t\tspace = append(space, byte(v>>8))\n\t}\n\tspace = append(space, byte(v))\n\treturn space\n}\n\nfunc writeBuf(buf []byte, v uint32) []byte {\n\treturn append(buf, byte(v>>16), byte(v>>8), byte(v))\n}\n\n// WriteUint8 write uint8 to stream\nfunc (stream *Stream) WriteUint8(val uint8) {\n\tstream.buf = writeFirstBuf(stream.buf, digits[val])\n}\n\n// WriteInt8 write int8 to stream\nfunc (stream *Stream) WriteInt8(nval int8) {\n\tvar val uint8\n\tif nval < 0 {\n\t\tval = uint8(-nval)\n\t\tstream.buf = append(stream.buf, '-')\n\t} else {\n\t\tval = uint8(nval)\n\t}\n\tstream.buf = writeFirstBuf(stream.buf, digits[val])\n}\n\n// WriteUint16 write uint16 to stream\nfunc (stream *Stream) WriteUint16(val uint16) {\n\tq1 := val / 1000\n\tif q1 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[val])\n\t\treturn\n\t}\n\tr1 := val - q1*1000\n\tstream.buf = writeFirstBuf(stream.buf, digits[q1])\n\tstream.buf = writeBuf(stream.buf, digits[r1])\n\treturn\n}\n\n// WriteInt16 write int16 to stream\nfunc (stream *Stream) WriteInt16(nval int16) {\n\tvar val uint16\n\tif nval < 0 {\n\t\tval = uint16(-nval)\n\t\tstream.buf = append(stream.buf, '-')\n\t} else {\n\t\tval = uint16(nval)\n\t}\n\tstream.WriteUint16(val)\n}\n\n// WriteUint32 write uint32 to stream\nfunc (stream *Stream) WriteUint32(val uint32) {\n\tq1 := val / 1000\n\tif q1 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[val])\n\t\treturn\n\t}\n\tr1 := val - q1*1000\n\tq2 := q1 / 1000\n\tif q2 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[q1])\n\t\tstream.buf = writeBuf(stream.buf, digits[r1])\n\t\treturn\n\t}\n\tr2 := q1 - q2*1000\n\tq3 := q2 / 1000\n\tif q3 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[q2])\n\t} else {\n\t\tr3 := q2 - q3*1000\n\t\tstream.buf = append(stream.buf, byte(q3+'0'))\n\t\tstream.buf = writeBuf(stream.buf, digits[r3])\n\t}\n\tstream.buf = writeBuf(stream.buf, digits[r2])\n\tstream.buf = writeBuf(stream.buf, digits[r1])\n}\n\n// WriteInt32 write int32 to stream\nfunc (stream *Stream) WriteInt32(nval int32) {\n\tvar val uint32\n\tif nval < 0 {\n\t\tval = uint32(-nval)\n\t\tstream.buf = append(stream.buf, '-')\n\t} else {\n\t\tval = uint32(nval)\n\t}\n\tstream.WriteUint32(val)\n}\n\n// WriteUint64 write uint64 to stream\nfunc (stream *Stream) WriteUint64(val uint64) {\n\tq1 := val / 1000\n\tif q1 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[val])\n\t\treturn\n\t}\n\tr1 := val - q1*1000\n\tq2 := q1 / 1000\n\tif q2 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[q1])\n\t\tstream.buf = writeBuf(stream.buf, digits[r1])\n\t\treturn\n\t}\n\tr2 := q1 - q2*1000\n\tq3 := q2 / 1000\n\tif q3 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[q2])\n\t\tstream.buf = writeBuf(stream.buf, digits[r2])\n\t\tstream.buf = writeBuf(stream.buf, digits[r1])\n\t\treturn\n\t}\n\tr3 := q2 - q3*1000\n\tq4 := q3 / 1000\n\tif q4 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[q3])\n\t\tstream.buf = writeBuf(stream.buf, digits[r3])\n\t\tstream.buf = writeBuf(stream.buf, digits[r2])\n\t\tstream.buf = writeBuf(stream.buf, digits[r1])\n\t\treturn\n\t}\n\tr4 := q3 - q4*1000\n\tq5 := q4 / 1000\n\tif q5 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[q4])\n\t\tstream.buf = writeBuf(stream.buf, digits[r4])\n\t\tstream.buf = writeBuf(stream.buf, digits[r3])\n\t\tstream.buf = writeBuf(stream.buf, digits[r2])\n\t\tstream.buf = writeBuf(stream.buf, digits[r1])\n\t\treturn\n\t}\n\tr5 := q4 - q5*1000\n\tq6 := q5 / 1000\n\tif q6 == 0 {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[q5])\n\t} else {\n\t\tstream.buf = writeFirstBuf(stream.buf, digits[q6])\n\t\tr6 := q5 - q6*1000\n\t\tstream.buf = writeBuf(stream.buf, digits[r6])\n\t}\n\tstream.buf = writeBuf(stream.buf, digits[r5])\n\tstream.buf = writeBuf(stream.buf, digits[r4])\n\tstream.buf = writeBuf(stream.buf, digits[r3])\n\tstream.buf = writeBuf(stream.buf, digits[r2])\n\tstream.buf = writeBuf(stream.buf, digits[r1])\n}\n\n// WriteInt64 write int64 to stream\nfunc (stream *Stream) WriteInt64(nval int64) {\n\tvar val uint64\n\tif nval < 0 {\n\t\tval = uint64(-nval)\n\t\tstream.buf = append(stream.buf, '-')\n\t} else {\n\t\tval = uint64(nval)\n\t}\n\tstream.WriteUint64(val)\n}\n\n// WriteInt write int to stream\nfunc (stream *Stream) WriteInt(val int) {\n\tstream.WriteInt64(int64(val))\n}\n\n// WriteUint write uint to stream\nfunc (stream *Stream) WriteUint(val uint) {\n\tstream.WriteUint64(uint64(val))\n}\n"
  },
  {
    "path": "stream_str.go",
    "content": "package jsoniter\n\nimport (\n\t\"unicode/utf8\"\n)\n\n// htmlSafeSet holds the value true if the ASCII character with the given\n// array position can be safely represented inside a JSON string, embedded\n// inside of HTML <script> tags, without any additional escaping.\n//\n// All values are true except for the ASCII control characters (0-31), the\n// double quote (\"), the backslash character (\"\\\"), HTML opening and closing\n// tags (\"<\" and \">\"), and the ampersand (\"&\").\nvar htmlSafeSet = [utf8.RuneSelf]bool{\n\t' ':      true,\n\t'!':      true,\n\t'\"':      false,\n\t'#':      true,\n\t'$':      true,\n\t'%':      true,\n\t'&':      false,\n\t'\\'':     true,\n\t'(':      true,\n\t')':      true,\n\t'*':      true,\n\t'+':      true,\n\t',':      true,\n\t'-':      true,\n\t'.':      true,\n\t'/':      true,\n\t'0':      true,\n\t'1':      true,\n\t'2':      true,\n\t'3':      true,\n\t'4':      true,\n\t'5':      true,\n\t'6':      true,\n\t'7':      true,\n\t'8':      true,\n\t'9':      true,\n\t':':      true,\n\t';':      true,\n\t'<':      false,\n\t'=':      true,\n\t'>':      false,\n\t'?':      true,\n\t'@':      true,\n\t'A':      true,\n\t'B':      true,\n\t'C':      true,\n\t'D':      true,\n\t'E':      true,\n\t'F':      true,\n\t'G':      true,\n\t'H':      true,\n\t'I':      true,\n\t'J':      true,\n\t'K':      true,\n\t'L':      true,\n\t'M':      true,\n\t'N':      true,\n\t'O':      true,\n\t'P':      true,\n\t'Q':      true,\n\t'R':      true,\n\t'S':      true,\n\t'T':      true,\n\t'U':      true,\n\t'V':      true,\n\t'W':      true,\n\t'X':      true,\n\t'Y':      true,\n\t'Z':      true,\n\t'[':      true,\n\t'\\\\':     false,\n\t']':      true,\n\t'^':      true,\n\t'_':      true,\n\t'`':      true,\n\t'a':      true,\n\t'b':      true,\n\t'c':      true,\n\t'd':      true,\n\t'e':      true,\n\t'f':      true,\n\t'g':      true,\n\t'h':      true,\n\t'i':      true,\n\t'j':      true,\n\t'k':      true,\n\t'l':      true,\n\t'm':      true,\n\t'n':      true,\n\t'o':      true,\n\t'p':      true,\n\t'q':      true,\n\t'r':      true,\n\t's':      true,\n\t't':      true,\n\t'u':      true,\n\t'v':      true,\n\t'w':      true,\n\t'x':      true,\n\t'y':      true,\n\t'z':      true,\n\t'{':      true,\n\t'|':      true,\n\t'}':      true,\n\t'~':      true,\n\t'\\u007f': true,\n}\n\n// safeSet holds the value true if the ASCII character with the given array\n// position can be represented inside a JSON string without any further\n// escaping.\n//\n// All values are true except for the ASCII control characters (0-31), the\n// double quote (\"), and the backslash character (\"\\\").\nvar safeSet = [utf8.RuneSelf]bool{\n\t' ':      true,\n\t'!':      true,\n\t'\"':      false,\n\t'#':      true,\n\t'$':      true,\n\t'%':      true,\n\t'&':      true,\n\t'\\'':     true,\n\t'(':      true,\n\t')':      true,\n\t'*':      true,\n\t'+':      true,\n\t',':      true,\n\t'-':      true,\n\t'.':      true,\n\t'/':      true,\n\t'0':      true,\n\t'1':      true,\n\t'2':      true,\n\t'3':      true,\n\t'4':      true,\n\t'5':      true,\n\t'6':      true,\n\t'7':      true,\n\t'8':      true,\n\t'9':      true,\n\t':':      true,\n\t';':      true,\n\t'<':      true,\n\t'=':      true,\n\t'>':      true,\n\t'?':      true,\n\t'@':      true,\n\t'A':      true,\n\t'B':      true,\n\t'C':      true,\n\t'D':      true,\n\t'E':      true,\n\t'F':      true,\n\t'G':      true,\n\t'H':      true,\n\t'I':      true,\n\t'J':      true,\n\t'K':      true,\n\t'L':      true,\n\t'M':      true,\n\t'N':      true,\n\t'O':      true,\n\t'P':      true,\n\t'Q':      true,\n\t'R':      true,\n\t'S':      true,\n\t'T':      true,\n\t'U':      true,\n\t'V':      true,\n\t'W':      true,\n\t'X':      true,\n\t'Y':      true,\n\t'Z':      true,\n\t'[':      true,\n\t'\\\\':     false,\n\t']':      true,\n\t'^':      true,\n\t'_':      true,\n\t'`':      true,\n\t'a':      true,\n\t'b':      true,\n\t'c':      true,\n\t'd':      true,\n\t'e':      true,\n\t'f':      true,\n\t'g':      true,\n\t'h':      true,\n\t'i':      true,\n\t'j':      true,\n\t'k':      true,\n\t'l':      true,\n\t'm':      true,\n\t'n':      true,\n\t'o':      true,\n\t'p':      true,\n\t'q':      true,\n\t'r':      true,\n\t's':      true,\n\t't':      true,\n\t'u':      true,\n\t'v':      true,\n\t'w':      true,\n\t'x':      true,\n\t'y':      true,\n\t'z':      true,\n\t'{':      true,\n\t'|':      true,\n\t'}':      true,\n\t'~':      true,\n\t'\\u007f': true,\n}\n\nvar hex = \"0123456789abcdef\"\n\n// WriteStringWithHTMLEscaped write string to stream with html special characters escaped\nfunc (stream *Stream) WriteStringWithHTMLEscaped(s string) {\n\tvalLen := len(s)\n\tstream.buf = append(stream.buf, '\"')\n\t// write string, the fast path, without utf8 and escape support\n\ti := 0\n\tfor ; i < valLen; i++ {\n\t\tc := s[i]\n\t\tif c < utf8.RuneSelf && htmlSafeSet[c] {\n\t\t\tstream.buf = append(stream.buf, c)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\tif i == valLen {\n\t\tstream.buf = append(stream.buf, '\"')\n\t\treturn\n\t}\n\twriteStringSlowPathWithHTMLEscaped(stream, i, s, valLen)\n}\n\nfunc writeStringSlowPathWithHTMLEscaped(stream *Stream, i int, s string, valLen int) {\n\tstart := i\n\t// for the remaining parts, we process them char by char\n\tfor i < valLen {\n\t\tif b := s[i]; b < utf8.RuneSelf {\n\t\t\tif htmlSafeSet[b] {\n\t\t\t\ti++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif start < i {\n\t\t\t\tstream.WriteRaw(s[start:i])\n\t\t\t}\n\t\t\tswitch b {\n\t\t\tcase '\\\\', '\"':\n\t\t\t\tstream.writeTwoBytes('\\\\', b)\n\t\t\tcase '\\n':\n\t\t\t\tstream.writeTwoBytes('\\\\', 'n')\n\t\t\tcase '\\r':\n\t\t\t\tstream.writeTwoBytes('\\\\', 'r')\n\t\t\tcase '\\t':\n\t\t\t\tstream.writeTwoBytes('\\\\', 't')\n\t\t\tdefault:\n\t\t\t\t// This encodes bytes < 0x20 except for \\t, \\n and \\r.\n\t\t\t\t// If escapeHTML is set, it also escapes <, >, and &\n\t\t\t\t// because they can lead to security holes when\n\t\t\t\t// user-controlled strings are rendered into JSON\n\t\t\t\t// and served to some browsers.\n\t\t\t\tstream.WriteRaw(`\\u00`)\n\t\t\t\tstream.writeTwoBytes(hex[b>>4], hex[b&0xF])\n\t\t\t}\n\t\t\ti++\n\t\t\tstart = i\n\t\t\tcontinue\n\t\t}\n\t\tc, size := utf8.DecodeRuneInString(s[i:])\n\t\tif c == utf8.RuneError && size == 1 {\n\t\t\tif start < i {\n\t\t\t\tstream.WriteRaw(s[start:i])\n\t\t\t}\n\t\t\tstream.WriteRaw(`\\ufffd`)\n\t\t\ti++\n\t\t\tstart = i\n\t\t\tcontinue\n\t\t}\n\t\t// U+2028 is LINE SEPARATOR.\n\t\t// U+2029 is PARAGRAPH SEPARATOR.\n\t\t// They are both technically valid characters in JSON strings,\n\t\t// but don't work in JSONP, which has to be evaluated as JavaScript,\n\t\t// and can lead to security holes there. It is valid JSON to\n\t\t// escape them, so we do so unconditionally.\n\t\t// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.\n\t\tif c == '\\u2028' || c == '\\u2029' {\n\t\t\tif start < i {\n\t\t\t\tstream.WriteRaw(s[start:i])\n\t\t\t}\n\t\t\tstream.WriteRaw(`\\u202`)\n\t\t\tstream.writeByte(hex[c&0xF])\n\t\t\ti += size\n\t\t\tstart = i\n\t\t\tcontinue\n\t\t}\n\t\ti += size\n\t}\n\tif start < len(s) {\n\t\tstream.WriteRaw(s[start:])\n\t}\n\tstream.writeByte('\"')\n}\n\n// WriteString write string to stream without html escape\nfunc (stream *Stream) WriteString(s string) {\n\tvalLen := len(s)\n\tstream.buf = append(stream.buf, '\"')\n\t// write string, the fast path, without utf8 and escape support\n\ti := 0\n\tfor ; i < valLen; i++ {\n\t\tc := s[i]\n\t\tif c > 31 && c != '\"' && c != '\\\\' {\n\t\t\tstream.buf = append(stream.buf, c)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\tif i == valLen {\n\t\tstream.buf = append(stream.buf, '\"')\n\t\treturn\n\t}\n\twriteStringSlowPath(stream, i, s, valLen)\n}\n\nfunc writeStringSlowPath(stream *Stream, i int, s string, valLen int) {\n\tstart := i\n\t// for the remaining parts, we process them char by char\n\tfor i < valLen {\n\t\tif b := s[i]; b < utf8.RuneSelf {\n\t\t\tif safeSet[b] {\n\t\t\t\ti++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif start < i {\n\t\t\t\tstream.WriteRaw(s[start:i])\n\t\t\t}\n\t\t\tswitch b {\n\t\t\tcase '\\\\', '\"':\n\t\t\t\tstream.writeTwoBytes('\\\\', b)\n\t\t\tcase '\\n':\n\t\t\t\tstream.writeTwoBytes('\\\\', 'n')\n\t\t\tcase '\\r':\n\t\t\t\tstream.writeTwoBytes('\\\\', 'r')\n\t\t\tcase '\\t':\n\t\t\t\tstream.writeTwoBytes('\\\\', 't')\n\t\t\tdefault:\n\t\t\t\t// This encodes bytes < 0x20 except for \\t, \\n and \\r.\n\t\t\t\t// If escapeHTML is set, it also escapes <, >, and &\n\t\t\t\t// because they can lead to security holes when\n\t\t\t\t// user-controlled strings are rendered into JSON\n\t\t\t\t// and served to some browsers.\n\t\t\t\tstream.WriteRaw(`\\u00`)\n\t\t\t\tstream.writeTwoBytes(hex[b>>4], hex[b&0xF])\n\t\t\t}\n\t\t\ti++\n\t\t\tstart = i\n\t\t\tcontinue\n\t\t}\n\t\ti++\n\t\tcontinue\n\t}\n\tif start < len(s) {\n\t\tstream.WriteRaw(s[start:])\n\t}\n\tstream.writeByte('\"')\n}\n"
  },
  {
    "path": "stream_test.go",
    "content": "package jsoniter\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_writeByte_should_grow_buffer(t *testing.T) {\n\tshould := require.New(t)\n\tstream := NewStream(ConfigDefault, nil, 1)\n\tstream.writeByte('1')\n\tshould.Equal(\"1\", string(stream.Buffer()))\n\tshould.Equal(1, len(stream.buf))\n\tstream.writeByte('2')\n\tshould.Equal(\"12\", string(stream.Buffer()))\n\tshould.Equal(2, len(stream.buf))\n\tstream.writeThreeBytes('3', '4', '5')\n\tshould.Equal(\"12345\", string(stream.Buffer()))\n}\n\nfunc Test_writeBytes_should_grow_buffer(t *testing.T) {\n\tshould := require.New(t)\n\tstream := NewStream(ConfigDefault, nil, 1)\n\tstream.Write([]byte{'1', '2'})\n\tshould.Equal(\"12\", string(stream.Buffer()))\n\tshould.Equal(2, len(stream.buf))\n\tstream.Write([]byte{'3', '4', '5', '6', '7'})\n\tshould.Equal(\"1234567\", string(stream.Buffer()))\n\tshould.Equal(7, len(stream.buf))\n}\n\nfunc Test_writeIndention_should_grow_buffer(t *testing.T) {\n\tshould := require.New(t)\n\tstream := NewStream(Config{IndentionStep: 2}.Froze(), nil, 1)\n\tstream.WriteVal([]int{1, 2, 3})\n\tshould.Equal(\"[\\n  1,\\n  2,\\n  3\\n]\", string(stream.Buffer()))\n}\n\nfunc Test_writeRaw_should_grow_buffer(t *testing.T) {\n\tshould := require.New(t)\n\tstream := NewStream(ConfigDefault, nil, 1)\n\tstream.WriteRaw(\"123\")\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"123\", string(stream.Buffer()))\n}\n\nfunc Test_writeString_should_grow_buffer(t *testing.T) {\n\tshould := require.New(t)\n\tstream := NewStream(ConfigDefault, nil, 0)\n\tstream.WriteString(\"123\")\n\tshould.Nil(stream.Error)\n\tshould.Equal(`\"123\"`, string(stream.Buffer()))\n}\n\ntype NopWriter struct {\n\tbufferSize int\n}\n\nfunc (w *NopWriter) Write(p []byte) (n int, err error) {\n\tw.bufferSize = cap(p)\n\treturn len(p), nil\n}\n\nfunc Test_flush_buffer_should_stop_grow_buffer(t *testing.T) {\n\t// Stream an array of a zillion zeros.\n\twriter := new(NopWriter)\n\tstream := NewStream(ConfigDefault, writer, 512)\n\tstream.WriteArrayStart()\n\tfor i := 0; i < 10000000; i++ {\n\t\tstream.WriteInt(0)\n\t\tstream.WriteMore()\n\t\tstream.Flush()\n\t}\n\tstream.WriteInt(0)\n\tstream.WriteArrayEnd()\n\n\t// Confirm that the buffer didn't have to grow.\n\tshould := require.New(t)\n\n\t// 512 is the internal buffer size set in NewEncoder\n\t//\n\t// Flush is called after each array element, so only the first 8 bytes of it\n\t// is ever used, and it is never extended. Capacity remains 512.\n\tshould.Equal(512, writer.bufferSize)\n}\n"
  },
  {
    "path": "test.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\necho \"\" > coverage.txt\n\nfor d in $(go list ./... | grep -v vendor); do\n    go test -coverprofile=profile.out -coverpkg=github.com/json-iterator/go $d\n    if [ -f profile.out ]; then\n        cat profile.out >> coverage.txt\n        rm profile.out\n    fi\ndone\n"
  },
  {
    "path": "type_tests/array_test.go",
    "content": "package test\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*[4]bool)(nil),\n\t\t(*[4]byte)(nil),\n\t\t(*[4]float64)(nil),\n\t\t(*[4]int32)(nil),\n\t\t(*[4]map[int32]string)(nil),\n\t\t(*[4]map[string]string)(nil),\n\t\t(*[4]*bool)(nil),\n\t\t(*[4]*float64)(nil),\n\t\t(*[4]*int32)(nil),\n\t\t(*[4]*map[int32]string)(nil),\n\t\t(*[4]*map[string]string)(nil),\n\t\t(*[4]*[4]bool)(nil),\n\t\t(*[4]*[4]byte)(nil),\n\t\t(*[4]*[4]float64)(nil),\n\t\t(*[4]*[4]int32)(nil),\n\t\t(*[4]*[4]*string)(nil),\n\t\t(*[4]*[4]string)(nil),\n\t\t(*[4]*[4]uint8)(nil),\n\t\t(*[4]*string)(nil),\n\t\t(*[4]*struct {\n\t\t\tString string\n\t\t\tInt    int32\n\t\t\tFloat  float64\n\t\t\tStruct struct {\n\t\t\t\tX string\n\t\t\t}\n\t\t\tSlice [4]string\n\t\t\tMap   map[string]string\n\t\t})(nil),\n\t\t(*[4]*uint8)(nil),\n\t\t(*[4][4]bool)(nil),\n\t\t(*[4][4]byte)(nil),\n\t\t(*[4][4]float64)(nil),\n\t\t(*[4][4]int32)(nil),\n\t\t(*[4][4]*string)(nil),\n\t\t(*[4][4]string)(nil),\n\t\t(*[4][4]uint8)(nil),\n\t\t(*[4]string)(nil),\n\t\t(*[4]struct{})(nil),\n\t\t(*[4]structEmpty)(nil),\n\t\t(*[4]struct {\n\t\t\tF *string\n\t\t})(nil),\n\t\t(*[4]struct {\n\t\t\tString string\n\t\t\tInt    int32\n\t\t\tFloat  float64\n\t\t\tStruct struct {\n\t\t\t\tX string\n\t\t\t}\n\t\t\tSlice [4]string\n\t\t\tMap   map[string]string\n\t\t})(nil),\n\t\t(*[4]uint8)(nil),\n\t)\n}\n\ntype structEmpty struct{}\ntype arrayAlis [4]stringAlias\n"
  },
  {
    "path": "type_tests/builtin_test.go",
    "content": "package test\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*bool)(nil),\n\t\t(*boolAlias)(nil),\n\t\t(*byte)(nil),\n\t\t(*byteAlias)(nil),\n\t\t(*float32)(nil),\n\t\t(*float32Alias)(nil),\n\t\t(*float64)(nil),\n\t\t(*float64Alias)(nil),\n\t\t(*int8)(nil),\n\t\t(*int8Alias)(nil),\n\t\t(*int16)(nil),\n\t\t(*int16Alias)(nil),\n\t\t(*int32)(nil),\n\t\t(*int32Alias)(nil),\n\t\t(*int64)(nil),\n\t\t(*int64Alias)(nil),\n\t\t(*string)(nil),\n\t\t(*stringAlias)(nil),\n\t\t(*uint8)(nil),\n\t\t(*uint8Alias)(nil),\n\t\t(*uint16)(nil),\n\t\t(*uint16Alias)(nil),\n\t\t(*uint32)(nil),\n\t\t(*uint32Alias)(nil),\n\t\t(*uintptr)(nil),\n\t\t(*uintptrAlias)(nil),\n\t\t(*struct {\n\t\t\tA int8Alias    `json:\"a\"`\n\t\t\tB int16Alias   `json:\"stream\"`\n\t\t\tC int32Alias   `json:\"c\"`\n\t\t\tD int64Alias   `json:\"d\"`\n\t\t\tE uintAlias    `json:\"e\"`\n\t\t\tF uint16Alias  `json:\"f\"`\n\t\t\tG uint32Alias  `json:\"g\"`\n\t\t\tH uint64Alias  `json:\"h\"`\n\t\t\tI float32Alias `json:\"i\"`\n\t\t\tJ float64Alias `json:\"j\"`\n\t\t\tK stringAlias  `json:\"k\"`\n\t\t\tL intAlias     `json:\"l\"`\n\t\t\tM uintAlias    `json:\"m\"`\n\t\t\tN boolAlias    `json:\"n\"`\n\t\t\tO uintptrAlias `json:\"o\"`\n\t\t})(nil),\n\t)\n}\n\ntype boolAlias bool\ntype byteAlias byte\ntype float32Alias float32\ntype float64Alias float64\ntype ptrFloat64Alias *float64\ntype int8Alias int8\ntype int16Alias int16\ntype int32Alias int32\ntype ptrInt32Alias *int32\ntype int64Alias int64\ntype stringAlias string\ntype ptrStringAlias *string\ntype uint8Alias uint8\ntype uint16Alias uint16\ntype uint32Alias uint32\ntype uintptrAlias uintptr\ntype uintAlias uint\ntype uint64Alias uint64\ntype intAlias int\n"
  },
  {
    "path": "type_tests/map_key_test.go",
    "content": "// +build go1.15\n// remove these tests temporarily until https://github.com/golang/go/issues/38105 and\n// https://github.com/golang/go/issues/38940 is fixed\n\npackage test\n\nimport (\n\t\"encoding\"\n\t\"strings\"\n)\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*map[stringKeyType]string)(nil),\n\t\t(*map[structKeyType]string)(nil),\n\t)\n}\n\ntype stringKeyType string\n\nfunc (k stringKeyType) MarshalText() ([]byte, error) {\n\treturn []byte(\"MANUAL__\" + k), nil\n}\n\nfunc (k *stringKeyType) UnmarshalText(text []byte) error {\n\t*k = stringKeyType(strings.TrimPrefix(string(text), \"MANUAL__\"))\n\treturn nil\n}\n\nvar _ encoding.TextMarshaler = stringKeyType(\"\")\nvar _ encoding.TextUnmarshaler = new(stringKeyType)\n\ntype structKeyType struct {\n\tX string\n}\n\nfunc (k structKeyType) MarshalText() ([]byte, error) {\n\treturn []byte(\"MANUAL__\" + k.X), nil\n}\n\nfunc (k *structKeyType) UnmarshalText(text []byte) error {\n\tk.X = strings.TrimPrefix(string(text), \"MANUAL__\")\n\treturn nil\n}\n\nvar _ encoding.TextMarshaler = structKeyType{}\nvar _ encoding.TextUnmarshaler = &structKeyType{}\n"
  },
  {
    "path": "type_tests/map_test.go",
    "content": "package test\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*map[int8]string)(nil),\n\t\t(*map[int16]string)(nil),\n\t\t(*map[int32]string)(nil),\n\t\t(*map[int64]string)(nil),\n\t\t(*map[string][4]string)(nil),\n\t\t(*map[string]bool)(nil),\n\t\t(*map[string]byte)(nil),\n\t\t(*map[string]float64)(nil),\n\t\t(*map[string]int32)(nil),\n\t\t(*map[string]map[string]string)(nil),\n\t\t(*map[string]*[4]string)(nil),\n\t\t(*map[string]*bool)(nil),\n\t\t(*map[string]*float64)(nil),\n\t\t(*map[string]*int32)(nil),\n\t\t(*map[string]*map[string]string)(nil),\n\t\t(*map[string]*[]string)(nil),\n\t\t(*map[string]*string)(nil),\n\t\t(*map[string]*structVarious)(nil),\n\t\t(*map[string]*uint8)(nil),\n\t\t(*map[string][]string)(nil),\n\t\t(*map[string]string)(nil),\n\t\t(*map[string]stringAlias)(nil),\n\t\t(*map[string]struct{})(nil),\n\t\t(*map[string]structEmpty)(nil),\n\t\t(*map[string]struct {\n\t\t\tF *string\n\t\t})(nil),\n\t\t(*map[string]struct {\n\t\t\tString string\n\t\t\tInt    int32\n\t\t\tFloat  float64\n\t\t\tStruct struct {\n\t\t\t\tX string\n\t\t\t}\n\t\t\tSlice []string\n\t\t\tMap   map[string]string\n\t\t})(nil),\n\t\t(*map[string]uint8)(nil),\n\t\t(*map[stringAlias]string)(nil),\n\t\t(*map[stringAlias]stringAlias)(nil),\n\t\t(*map[uint8]string)(nil),\n\t\t(*map[uint16]string)(nil),\n\t\t(*map[uint32]string)(nil),\n\t)\n}\n\ntype structVarious struct {\n\tString string\n\tInt    int32\n\tFloat  float64\n\tStruct struct {\n\t\tX string\n\t}\n\tSlice []string\n\tMap   map[string]string\n}\n"
  },
  {
    "path": "type_tests/marshaler_string_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"strings\"\n)\n\ntype StringMarshaler string\n\nfunc (m StringMarshaler) encode(str string) string {\n\tbuf := bytes.Buffer{}\n\tb64 := base64.NewEncoder(base64.StdEncoding, &buf)\n\tif _, err := b64.Write([]byte(str)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := b64.Close(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn buf.String()\n}\n\nfunc (m StringMarshaler) decode(str string) string {\n\tif len(str) == 0 {\n\t\treturn \"\"\n\t}\n\tb64 := base64.NewDecoder(base64.StdEncoding, strings.NewReader(str))\n\tbs := make([]byte, len(str))\n\tif n, err := b64.Read(bs); err != nil {\n\t\tpanic(err)\n\t} else {\n\t\tbs = bs[:n]\n\t}\n\treturn string(bs)\n}\n\nfunc (m StringMarshaler) MarshalJSON() ([]byte, error) {\n\treturn []byte(`\"MANUAL__` + m.encode(string(m)) + `\"`), nil\n}\n\nfunc (m *StringMarshaler) UnmarshalJSON(text []byte) error {\n\t*m = StringMarshaler(m.decode(strings.TrimPrefix(strings.Trim(string(text), `\"`), \"MANUAL__\")))\n\treturn nil\n}\n\nvar _ json.Marshaler = *new(StringMarshaler)\nvar _ json.Unmarshaler = new(StringMarshaler)\n\nfunc init() {\n\ttestCases = append(testCases, (*StringMarshaler)(nil))\n}\n"
  },
  {
    "path": "type_tests/marshaler_struct_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"strings\"\n)\n\ntype structMarshaler struct {\n\tX string\n}\n\nfunc (m structMarshaler) encode(str string) string {\n\tbuf := bytes.Buffer{}\n\tb64 := base64.NewEncoder(base64.StdEncoding, &buf)\n\tif _, err := b64.Write([]byte(str)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := b64.Close(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn buf.String()\n}\n\nfunc (m structMarshaler) decode(str string) string {\n\tif len(str) == 0 {\n\t\treturn \"\"\n\t}\n\tb64 := base64.NewDecoder(base64.StdEncoding, strings.NewReader(str))\n\tbs := make([]byte, len(str))\n\tif n, err := b64.Read(bs); err != nil {\n\t\tpanic(err)\n\t} else {\n\t\tbs = bs[:n]\n\t}\n\treturn string(bs)\n}\n\nfunc (m structMarshaler) MarshalJSON() ([]byte, error) {\n\treturn []byte(`\"MANUAL__` + m.encode(m.X) + `\"`), nil\n}\n\nfunc (m *structMarshaler) UnmarshalJSON(text []byte) error {\n\tm.X = m.decode(strings.TrimPrefix(strings.Trim(string(text), `\"`), \"MANUAL__\"))\n\treturn nil\n}\n\nvar _ json.Marshaler = structMarshaler{}\nvar _ json.Unmarshaler = &structMarshaler{}\n\ntype structMarshalerAlias structMarshaler\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*structMarshaler)(nil),\n\t\t(*structMarshalerAlias)(nil),\n\t\t(*struct {\n\t\t\tS string\n\t\t\tM structMarshaler\n\t\t\tI int8\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tS string\n\t\t\tM structMarshalerAlias\n\t\t\tI int8\n\t\t})(nil),\n\t)\n}\n"
  },
  {
    "path": "type_tests/slice_test.go",
    "content": "package test\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*[][4]bool)(nil),\n\t\t(*[][4]byte)(nil),\n\t\t(*[][4]float64)(nil),\n\t\t(*[][4]int32)(nil),\n\t\t(*[][4]*string)(nil),\n\t\t(*[][4]string)(nil),\n\t\t(*[][4]uint8)(nil),\n\t\t(*[]bool)(nil),\n\t\t(*[]byte)(nil),\n\t\t(*[]float64)(nil),\n\t\t(*[]int32)(nil),\n\t\t(*[]int64)(nil),\n\t\t(*[]map[int32]string)(nil),\n\t\t(*[]map[string]string)(nil),\n\t\t(*[4]*[4]bool)(nil),\n\t\t(*[4]*[4]byte)(nil),\n\t\t(*[4]*[4]float64)(nil),\n\t\t(*[4]*[4]int32)(nil),\n\t\t(*[4]*[4]*string)(nil),\n\t\t(*[4]*[4]string)(nil),\n\t\t(*[4]*[4]uint8)(nil),\n\t\t(*[]*bool)(nil),\n\t\t(*[]*float64)(nil),\n\t\t(*[]*int32)(nil),\n\t\t(*[]*map[int32]string)(nil),\n\t\t(*[]*map[string]string)(nil),\n\t\t(*[]*[]bool)(nil),\n\t\t(*[]*[]byte)(nil),\n\t\t(*[]*[]float64)(nil),\n\t\t(*[]*[]int32)(nil),\n\t\t(*[]*[]*string)(nil),\n\t\t(*[]*[]string)(nil),\n\t\t(*[]*[]uint8)(nil),\n\t\t(*[]*string)(nil),\n\t\t(*[]*struct {\n\t\t\tString string\n\t\t\tInt    int32\n\t\t\tFloat  float64\n\t\t\tStruct struct {\n\t\t\t\tX string\n\t\t\t}\n\t\t\tSlice []string\n\t\t\tMap   map[string]string\n\t\t})(nil),\n\t\t(*[]*uint8)(nil),\n\t\t(*[][]bool)(nil),\n\t\t(*[][]byte)(nil),\n\t\t(*[][]float64)(nil),\n\t\t(*[][]int32)(nil),\n\t\t(*[][]*string)(nil),\n\t\t(*[][]string)(nil),\n\t\t(*[][]uint8)(nil),\n\t\t(*[]string)(nil),\n\t\t(*[]struct{})(nil),\n\t\t(*[]structEmpty)(nil),\n\t\t(*[]struct {\n\t\t\tF *string\n\t\t})(nil),\n\t\t(*[]struct {\n\t\t\tString string\n\t\t\tInt    int32\n\t\t\tFloat  float64\n\t\t\tStruct struct {\n\t\t\t\tX string\n\t\t\t}\n\t\t\tSlice []string\n\t\t\tMap   map[string]string\n\t\t})(nil),\n\t\t(*[]uint8)(nil),\n\t\t(*[]jsonMarshaler)(nil),\n\t\t(*[]jsonMarshalerMap)(nil),\n\t\t(*[]textMarshaler)(nil),\n\t\t(*[]textMarshalerMap)(nil),\n\t)\n}\n\ntype jsonMarshaler struct {\n\tId string `json:\"id,omitempty\" db:\"id\"`\n}\n\nfunc (p *jsonMarshaler) MarshalJSON() ([]byte, error) {\n\treturn []byte(`{}`), nil\n}\n\nfunc (p *jsonMarshaler) UnmarshalJSON(input []byte) error {\n\tp.Id = \"hello\"\n\treturn nil\n}\n\ntype jsonMarshalerMap map[int]int\n\nfunc (p *jsonMarshalerMap) MarshalJSON() ([]byte, error) {\n\treturn []byte(`{}`), nil\n}\n\nfunc (p *jsonMarshalerMap) UnmarshalJSON(input []byte) error {\n\treturn nil\n}\n\ntype textMarshaler struct {\n\tId string `json:\"id,omitempty\" db:\"id\"`\n}\n\nfunc (p *textMarshaler) MarshalText() ([]byte, error) {\n\treturn []byte(`{}`), nil\n}\n\nfunc (p *textMarshaler) UnmarshalText(input []byte) error {\n\tp.Id = \"hello\"\n\treturn nil\n}\n\ntype textMarshalerMap map[int]int\n\nfunc (p *textMarshalerMap) MarshalText() ([]byte, error) {\n\treturn []byte(`{}`), nil\n}\n\nfunc (p *textMarshalerMap) UnmarshalText(input []byte) error {\n\treturn nil\n}\n"
  },
  {
    "path": "type_tests/struct_embedded_test.go",
    "content": "package test\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*struct {\n\t\t\tEmbeddedFloat64\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tEmbeddedInt32\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 float64\n\t\t\tStringMarshaler\n\t\t\tF2 int32\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tEmbeddedMapStringString\n\t\t})(nil),\n\t\t(*struct {\n\t\t\t*EmbeddedFloat64\n\t\t})(nil),\n\t\t(*struct {\n\t\t\t*EmbeddedInt32\n\t\t})(nil),\n\t\t(*struct {\n\t\t\t*EmbeddedMapStringString\n\t\t})(nil),\n\t\t(*struct {\n\t\t\t*EmbeddedSliceString\n\t\t})(nil),\n\t\t(*struct {\n\t\t\t*EmbeddedString\n\t\t})(nil),\n\t\t(*struct {\n\t\t\t*EmbeddedStruct\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tEmbeddedSliceString\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tEmbeddedString\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tEmbeddedString `json:\"othername\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tEmbeddedStruct\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 float64\n\t\t\tStringTextMarshaler\n\t\t\tF2 int32\n\t\t})(nil),\n\t\t(*OverlapDifferentLevels)(nil),\n\t\t(*IgnoreDeeperLevel)(nil),\n\t\t(*SameLevel1BothTagged)(nil),\n\t\t(*SameLevel1NoTags)(nil),\n\t\t(*SameLevel1Tagged)(nil),\n\t\t(*SameLevel2BothTagged)(nil),\n\t\t(*SameLevel2NoTags)(nil),\n\t\t(*SameLevel2Tagged)(nil),\n\t\t(*EmbeddedPtr)(nil),\n\t\t(*UnnamedLiteral)(nil),\n\t)\n}\n\ntype EmbeddedFloat64 float64\ntype EmbeddedInt32 int32\ntype EmbeddedMapStringString map[string]string\ntype EmbeddedSliceString []string\ntype EmbeddedString string\ntype EmbeddedStruct struct {\n\tString string\n\tInt    int32\n\tFloat  float64\n\tStruct struct {\n\t\tX string\n\t}\n\tSlice []string\n\tMap   map[string]string\n}\n\ntype OverlapDifferentLevelsE1 struct {\n\tF1 int32\n}\n\ntype OverlapDifferentLevelsE2 struct {\n\tF2 string\n}\n\ntype OverlapDifferentLevels struct {\n\tOverlapDifferentLevelsE1\n\tOverlapDifferentLevelsE2\n\tF1 string\n}\n\ntype IgnoreDeeperLevelDoubleEmbedded struct {\n\tF1 int32 `json:\"F1\"`\n}\n\ntype IgnoreDeeperLevelE1 struct {\n\tIgnoreDeeperLevelDoubleEmbedded\n\tF1 int32\n}\n\ntype IgnoreDeeperLevelE2 struct {\n\tF1 int32 `json:\"F1\"`\n\tIgnoreDeeperLevelDoubleEmbedded\n}\n\ntype IgnoreDeeperLevel struct {\n\tIgnoreDeeperLevelE1\n\tIgnoreDeeperLevelE2\n}\n\ntype SameLevel1BothTaggedE1 struct {\n\tF1 int32 `json:\"F1\"`\n}\n\ntype SameLevel1BothTaggedE2 struct {\n\tF1 int32 `json:\"F1\"`\n}\n\ntype SameLevel1BothTagged struct {\n\tSameLevel1BothTaggedE1\n\tSameLevel1BothTaggedE2\n}\n\ntype SameLevel1NoTagsE1 struct {\n\tF1 int32\n}\n\ntype SameLevel1NoTagsE2 struct {\n\tF1 int32\n}\n\ntype SameLevel1NoTags struct {\n\tSameLevel1NoTagsE1\n\tSameLevel1NoTagsE2\n}\n\ntype SameLevel1TaggedE1 struct {\n\tF1 int32\n}\n\ntype SameLevel1TaggedE2 struct {\n\tF1 int32 `json:\"F1\"`\n}\n\ntype SameLevel1Tagged struct {\n\tSameLevel1TaggedE1\n\tSameLevel1TaggedE2\n}\n\ntype SameLevel2BothTaggedDE1 struct {\n\tF1 int32 `json:\"F1\"`\n}\n\ntype SameLevel2BothTaggedE1 struct {\n\tSameLevel2BothTaggedDE1\n}\n\n// DoubleEmbedded2 TEST ONLY\ntype SameLevel2BothTaggedDE2 struct {\n\tF1 int32 `json:\"F1\"`\n}\n\n// Embedded2 TEST ONLY\ntype SameLevel2BothTaggedE2 struct {\n\tSameLevel2BothTaggedDE2\n}\n\ntype SameLevel2BothTagged struct {\n\tSameLevel2BothTaggedE1\n\tSameLevel2BothTaggedE2\n}\n\ntype SameLevel2NoTagsDE1 struct {\n\tF1 int32\n}\n\ntype SameLevel2NoTagsE1 struct {\n\tSameLevel2NoTagsDE1\n}\n\ntype SameLevel2NoTagsDE2 struct {\n\tF1 int32\n}\n\ntype SameLevel2NoTagsE2 struct {\n\tSameLevel2NoTagsDE2\n}\n\ntype SameLevel2NoTags struct {\n\tSameLevel2NoTagsE1\n\tSameLevel2NoTagsE2\n}\n\n// DoubleEmbedded1 TEST ONLY\ntype SameLevel2TaggedDE1 struct {\n\tF1 int32\n}\n\n// Embedded1 TEST ONLY\ntype SameLevel2TaggedE1 struct {\n\tSameLevel2TaggedDE1\n}\n\n// DoubleEmbedded2 TEST ONLY\ntype SameLevel2TaggedDE2 struct {\n\tF1 int32 `json:\"F1\"`\n}\n\n// Embedded2 TEST ONLY\ntype SameLevel2TaggedE2 struct {\n\tSameLevel2TaggedDE2\n}\n\ntype SameLevel2Tagged struct {\n\tSameLevel2TaggedE1\n\tSameLevel2TaggedE2\n}\n\ntype EmbeddedPtrO1 struct {\n\tO1F string\n}\n\ntype EmbeddedPtrOption struct {\n\tO1 *EmbeddedPtrO1\n}\n\ntype EmbeddedPtr struct {\n\tEmbeddedPtrOption `json:\",\"`\n}\n\ntype UnnamedLiteral struct {\n\t_ struct{}\n}\n"
  },
  {
    "path": "type_tests/struct_field_case_test.go",
    "content": "package test\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*struct {\n\t\t\tUpper bool `json:\"M\"`\n\t\t\tLower bool `json:\"m\"`\n\t\t})(nil),\n\t)\n\tasymmetricTestCases = append(asymmetricTestCases, [][2]interface{}{\n\t\t{\n\t\t\t(*struct {\n\t\t\t\tField string\n\t\t\t})(nil),\n\t\t\t(*struct {\n\t\t\t\tFIELD string\n\t\t\t})(nil),\n\t\t},\n\t\t{\n\t\t\t(*struct {\n\t\t\t\tF1 string\n\t\t\t\tF2 string\n\t\t\t\tF3 string\n\t\t\t})(nil),\n\t\t\t(*struct {\n\t\t\t\tF1 string\n\t\t\t})(nil),\n\t\t},\n\t}...)\n}\n"
  },
  {
    "path": "type_tests/struct_tags_test.go",
    "content": "package test\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*EmbeddedFieldName)(nil),\n\t\t(*StringFieldName)(nil),\n\t\t(*StructFieldName)(nil),\n\t\t(*struct {\n\t\t\tF1 bool `json:\"F1\"`\n\t\t\tF2 bool `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*EmbeddedOmitEmpty)(nil),\n\t\t(*struct {\n\t\t\tF1 float32 `json:\"F1\"`\n\t\t\tF2 float32 `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 int32 `json:\"F1\"`\n\t\t\tF2 int32 `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 map[string]string `json:\"F1\"`\n\t\t\tF2 map[string]string `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *bool `json:\"F1\"`\n\t\t\tF2 *bool `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *float32 `json:\"F1\"`\n\t\t\tF2 *float32 `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *int32 `json:\"F1\"`\n\t\t\tF2 *int32 `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *map[string]string `json:\"F1\"`\n\t\t\tF2 *map[string]string `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *[]string `json:\"F1\"`\n\t\t\tF2 *[]string `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 string `json:\"F1\"`\n\t\t\tF2 string `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *string `json:\"F1\"`\n\t\t\tF2 *string `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *jm `json:\"f,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *tm `json:\"f,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *sjm `json:\"f,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *tm `json:\"f,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *uint32 `json:\"F1\"`\n\t\t\tF2 *uint32 `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 []string `json:\"F1\"`\n\t\t\tF2 []string `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 string `json:\"F1\"`\n\t\t\tF2 string `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF jm `json:\"f,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF tm `json:\"f,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF struct{} `json:\"f,omitempty\"` // omitempty is meaningless here\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF sjm `json:\"f,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF stm `json:\"f,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 uint32 `json:\"F1\"`\n\t\t\tF2 uint32 `json:\"F2,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 bool `json:\"F1\"`\n\t\t\tF2 bool `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 byte `json:\"F1\"`\n\t\t\tF2 byte `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 float32 `json:\"F1\"`\n\t\t\tF2 float32 `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 float64 `json:\"F1\"`\n\t\t\tF2 float64 `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 int8 `json:\"F1\"`\n\t\t\tF2 int8 `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 int16 `json:\"F1\"`\n\t\t\tF2 int16 `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 int32 `json:\"F1\"`\n\t\t\tF2 int32 `json:\"F2,string\"`\n\t\t})(nil),\n\t\t// remove temporarily until https://github.com/golang/go/issues/38126 is fixed\n\t\t// (*struct {\n\t\t// \tF1 string `json:\"F1\"`\n\t\t// \tF2 string `json:\"F2,string\"`\n\t\t// })(nil),\n\t\t(*struct {\n\t\t\tF1 uint8 `json:\"F1\"`\n\t\t\tF2 uint8 `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 uint16 `json:\"F1\"`\n\t\t\tF2 uint16 `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 uint32 `json:\"F1\"`\n\t\t\tF2 uint32 `json:\"F2,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tA           string            `json:\"a,omitempty\"`\n\t\t\tB           string            `json:\"b,omitempty\"`\n\t\t\tAnnotations map[string]string `json:\"annotations,omitempty\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField bool `json:\",omitempty,string\"`\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField bool `json:\"中文\"`\n\t\t})(nil),\n\t)\n}\n\n// S1 TEST ONLY\ntype EmbeddedFieldNameS1 struct {\n\tS1F string\n}\n\n// S2 TEST ONLY\ntype EmbeddedFieldNameS2 struct {\n\tS2F string\n}\n\n// S3 TEST ONLY\ntype EmbeddedFieldNameS3 struct {\n\tS3F string\n}\n\n// S4 TEST ONLY\ntype EmbeddedFieldNameS4 struct {\n\tS4F string\n}\n\n// S5 TEST ONLY\ntype EmbeddedFieldNameS5 struct {\n\tS5F string\n}\n\n// S6 TEST ONLY\ntype EmbeddedFieldNameS6 struct {\n\tS6F string\n}\n\ntype EmbeddedFieldName struct {\n\tEmbeddedFieldNameS1 `json:\"F1\"`\n\tEmbeddedFieldNameS2 `json:\"f2\"`\n\tEmbeddedFieldNameS3 `json:\"-\"`\n\tEmbeddedFieldNameS4 `json:\"-,\"`\n\tEmbeddedFieldNameS5 `json:\",\"`\n\tEmbeddedFieldNameS6 `json:\"\"`\n}\n\ntype StringFieldNameE struct {\n\tE1 string\n}\n\ntype StringFieldName struct {\n\tF1               string `json:\"F1\"`\n\tF2               string `json:\"f2\"`\n\tF3               string `json:\"-\"`\n\tF4               string `json:\"-,\"`\n\tF5               string `json:\",\"`\n\tF6               string `json:\"\"`\n\tStringFieldNameE `json:\"e\"`\n}\n\ntype StructFieldNameS1 struct {\n\tS1F string\n}\n\ntype StructFieldNameS2 struct {\n\tS2F string\n}\n\ntype StructFieldNameS3 struct {\n\tS3F string\n}\n\ntype StructFieldNameS4 struct {\n\tS4F string\n}\n\ntype StructFieldNameS5 struct {\n\tS5F string\n}\n\ntype StructFieldNameS6 struct {\n\tS6F string\n}\n\ntype StructFieldName struct {\n\tF1 StructFieldNameS1 `json:\"F1\"`\n\tF2 StructFieldNameS2 `json:\"f2\"`\n\tF3 StructFieldNameS3 `json:\"-\"`\n\tF4 StructFieldNameS4 `json:\"-,\"`\n\tF5 StructFieldNameS5 `json:\",\"`\n\tF6 StructFieldNameS6 `json:\"\"`\n}\ntype EmbeddedOmitEmptyE struct {\n\tF string `json:\"F,omitempty\"`\n}\n\ntype EmbeddedOmitEmpty struct {\n\tEmbeddedOmitEmptyE\n}\n\ntype jm string\n\nfunc (t *jm) UnmarshalJSON(b []byte) error {\n\treturn nil\n}\n\nfunc (t jm) MarshalJSON() ([]byte, error) {\n\treturn []byte(`\"\"`), nil\n}\n\ntype tm string\n\nfunc (t *tm) UnmarshalText(b []byte) error {\n\treturn nil\n}\n\nfunc (t tm) MarshalText() ([]byte, error) {\n\treturn []byte(`\"\"`), nil\n}\n\ntype sjm struct{}\n\nfunc (t *sjm) UnmarshalJSON(b []byte) error {\n\treturn nil\n}\n\nfunc (t sjm) MarshalJSON() ([]byte, error) {\n\treturn []byte(`\"\"`), nil\n}\n\ntype stm struct{}\n\nfunc (t *stm) UnmarshalText(b []byte) error {\n\treturn nil\n}\n\nfunc (t stm) MarshalText() ([]byte, error) {\n\treturn []byte(`\"\"`), nil\n}\n"
  },
  {
    "path": "type_tests/struct_test.go",
    "content": "package test\n\nimport \"time\"\n\nfunc init() {\n\tstructFields1To11()\n\ttestCases = append(testCases,\n\t\t(*struct1Alias)(nil),\n\t\t(*struct {\n\t\t\tF [4]*string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF [4]string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 [4]stringAlias\n\t\t\tF2 arrayAlis\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 [4]string\n\t\t\tF2 [4]string\n\t\t\tF3 [4]string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF [4]struct {\n\t\t\t\tF1 string\n\t\t\t\tF2 string\n\t\t\t\tF3 string\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct{})(nil),\n\t\t(*structEmpty)(nil),\n\t\t(*struct {\n\t\t\tByte1   byte\n\t\t\tByte2   byte\n\t\t\tBool1   bool\n\t\t\tBool2   bool\n\t\t\tInt8    int8\n\t\t\tInt16   int16\n\t\t\tInt32   int32\n\t\t\tInt64   int64\n\t\t\tUint8   uint8\n\t\t\tUint16  uint16\n\t\t\tUint32  uint32\n\t\t\tUint64  uint64\n\t\t\tFloat32 float32\n\t\t\tFloat64 float64\n\t\t\tString1 string\n\t\t\tString2 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF float64\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF float64Alias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 float64\n\t\t\tF2 float64\n\t\t\tF3 float64\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 float64Alias\n\t\t\tF2 float64Alias\n\t\t\tF3 float64Alias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF int32\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF int32Alias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 int32\n\t\t\tF2 int32\n\t\t\tF3 int32\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 int32Alias\n\t\t\tF2 int32Alias\n\t\t\tF3 int32Alias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF int64\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF map[int32]*string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF map[int32]string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF map[int32]struct {\n\t\t\t\tF1 string\n\t\t\t\tF2 string\n\t\t\t\tF3 string\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF map[string]*string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF map[string]string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF map[string]struct {\n\t\t\t\tF1 string\n\t\t\t\tF2 string\n\t\t\t\tF3 string\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *float64\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *float64Alias\n\t\t\tF2 ptrFloat64Alias\n\t\t\tF3 *ptrFloat64Alias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *int32\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *int32Alias\n\t\t\tF2 ptrInt32Alias\n\t\t\tF3 *ptrInt32Alias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF **struct{}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF **struct {\n\t\t\t\tF1 string\n\t\t\t\tF2 string\n\t\t\t\tF3 string\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *stringAlias\n\t\t\tF2 ptrStringAlias\n\t\t\tF3 *ptrStringAlias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *struct{}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF *struct {\n\t\t\t\tF1 string\n\t\t\t\tF2 string\n\t\t\t\tF3 string\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *float64\n\t\t\tF2 *float64\n\t\t\tF3 *float64\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *int32\n\t\t\tF2 *int32\n\t\t\tF3 *int32\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 *string\n\t\t\tF2 *string\n\t\t\tF3 *string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF []*string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF []string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 []stringAlias\n\t\t\tF2 stringAlias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 []string\n\t\t\tF2 []string\n\t\t\tF3 []string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF []struct {\n\t\t\t\tF1 string\n\t\t\t\tF2 string\n\t\t\t\tF3 string\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF stringAlias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 string\n\t\t\tF2 string\n\t\t\tF3 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 stringAlias\n\t\t\tF2 stringAlias\n\t\t\tF3 stringAlias\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF1 struct{}\n\t\t\tF2 struct{}\n\t\t\tF3 struct{}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF struct{}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF structEmpty\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF struct {\n\t\t\t\tF1 float32\n\t\t\t\tF2 float32\n\t\t\t\tF3 float32\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF struct {\n\t\t\t\tF float32\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF struct2\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF struct {\n\t\t\t\tF1 int32\n\t\t\t\tF2 int32\n\t\t\t\tF3 int32\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF struct {\n\t\t\t\tF1 string\n\t\t\t\tF2 string\n\t\t\t\tF3 string\n\t\t\t}\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tF struct3\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tTF1 struct {\n\t\t\t\tF2 int\n\t\t\t\tF1 *withTime\n\t\t\t}\n\t\t})(nil),\n\t\t(*DeeplyNested)(nil),\n\t)\n}\n\nfunc structFields1To11() {\n\ttestCases = append(testCases,\n\t\t(*struct {\n\t\t\tField1 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1 string\n\t\t\tField2 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1 string\n\t\t\tField2 string\n\t\t\tField3 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1 string\n\t\t\tField2 string\n\t\t\tField3 string\n\t\t\tField4 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1 string\n\t\t\tField2 string\n\t\t\tField3 string\n\t\t\tField4 string\n\t\t\tField5 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1 string\n\t\t\tField2 string\n\t\t\tField3 string\n\t\t\tField4 string\n\t\t\tField5 string\n\t\t\tField6 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1 string\n\t\t\tField2 string\n\t\t\tField3 string\n\t\t\tField4 string\n\t\t\tField5 string\n\t\t\tField6 string\n\t\t\tField7 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1 string\n\t\t\tField2 string\n\t\t\tField3 string\n\t\t\tField4 string\n\t\t\tField5 string\n\t\t\tField6 string\n\t\t\tField7 string\n\t\t\tField8 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1 string\n\t\t\tField2 string\n\t\t\tField3 string\n\t\t\tField4 string\n\t\t\tField5 string\n\t\t\tField6 string\n\t\t\tField7 string\n\t\t\tField8 string\n\t\t\tField9 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1  string\n\t\t\tField2  string\n\t\t\tField3  string\n\t\t\tField4  string\n\t\t\tField5  string\n\t\t\tField6  string\n\t\t\tField7  string\n\t\t\tField8  string\n\t\t\tField9  string\n\t\t\tField10 string\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tField1  string\n\t\t\tField2  string\n\t\t\tField3  string\n\t\t\tField4  string\n\t\t\tField5  string\n\t\t\tField6  string\n\t\t\tField7  string\n\t\t\tField8  string\n\t\t\tField9  string\n\t\t\tField10 string\n\t\t\tField11 string\n\t\t})(nil),\n\t)\n}\n\ntype struct1 struct {\n\tByte1   byte\n\tByte2   byte\n\tBool1   bool\n\tBool2   bool\n\tInt8    int8\n\tInt16   int16\n\tInt32   int32\n\tUint8   uint8\n\tUint16  uint16\n\tUint32  uint32\n\tFloat32 float32\n\tFloat64 float64\n\tString1 string\n\tString2 string\n}\ntype struct1Alias struct1\n\ntype struct2 struct {\n\tF float64\n}\ntype struct3 struct {\n\tF1 stringAlias\n\tF2 stringAlias\n\tF3 stringAlias\n}\n\ntype withTime struct {\n\ttime.Time\n}\n\nfunc (t *withTime) UnmarshalJSON(b []byte) error {\n\treturn nil\n}\nfunc (t withTime) MarshalJSON() ([]byte, error) {\n\treturn []byte(`\"fake\"`), nil\n}\n\ntype YetYetAnotherObject struct {\n\tField string\n}\ntype YetAnotherObject struct {\n\tField *YetYetAnotherObject\n}\ntype AnotherObject struct {\n\tField *YetAnotherObject\n}\ntype DeeplyNested struct {\n\tMe *AnotherObject\n}\n"
  },
  {
    "path": "type_tests/text_marshaler_string_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding\"\n\t\"encoding/base64\"\n\t\"strings\"\n)\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*StringTextMarshaler)(nil),\n\t)\n}\n\n// StringTextMarshaler TEST ONLY\ntype StringTextMarshaler string\n\nfunc (m StringTextMarshaler) encode(str string) string {\n\tbuf := bytes.Buffer{}\n\tb64 := base64.NewEncoder(base64.StdEncoding, &buf)\n\tif _, err := b64.Write([]byte(str)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := b64.Close(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn buf.String()\n}\n\nfunc (m StringTextMarshaler) decode(str string) string {\n\tif len(str) == 0 {\n\t\treturn \"\"\n\t}\n\tb64 := base64.NewDecoder(base64.StdEncoding, strings.NewReader(str))\n\tbs := make([]byte, len(str))\n\tif n, err := b64.Read(bs); err != nil {\n\t\tpanic(err)\n\t} else {\n\t\tbs = bs[:n]\n\t}\n\treturn string(bs)\n}\n\n// MarshalText TEST ONLY\nfunc (m StringTextMarshaler) MarshalText() ([]byte, error) {\n\treturn []byte(`MANUAL__` + m.encode(string(m))), nil\n}\n\n// UnmarshalText TEST ONLY\nfunc (m *StringTextMarshaler) UnmarshalText(text []byte) error {\n\t*m = StringTextMarshaler(m.decode(strings.TrimPrefix(string(text), \"MANUAL__\")))\n\treturn nil\n}\n\nvar _ encoding.TextMarshaler = *new(StringTextMarshaler)\nvar _ encoding.TextUnmarshaler = new(StringTextMarshaler)\n"
  },
  {
    "path": "type_tests/text_marshaler_struct_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding\"\n\t\"encoding/base64\"\n\t\"strings\"\n)\n\nfunc init() {\n\ttestCases = append(testCases,\n\t\t(*structTextMarshaler)(nil),\n\t\t(*structTextMarshalerAlias)(nil),\n\t\t(*struct {\n\t\t\tS string\n\t\t\tM structTextMarshaler\n\t\t\tI int8\n\t\t})(nil),\n\t\t(*struct {\n\t\t\tS string\n\t\t\tM structTextMarshalerAlias\n\t\t\tI int8\n\t\t})(nil),\n\t)\n}\n\ntype structTextMarshaler struct {\n\tX string\n}\n\nfunc (m structTextMarshaler) encode(str string) string {\n\tbuf := bytes.Buffer{}\n\tb64 := base64.NewEncoder(base64.StdEncoding, &buf)\n\tif _, err := b64.Write([]byte(str)); err != nil {\n\t\tpanic(err)\n\t}\n\tif err := b64.Close(); err != nil {\n\t\tpanic(err)\n\t}\n\treturn buf.String()\n}\n\nfunc (m structTextMarshaler) decode(str string) string {\n\tif len(str) == 0 {\n\t\treturn \"\"\n\t}\n\tb64 := base64.NewDecoder(base64.StdEncoding, strings.NewReader(str))\n\tbs := make([]byte, len(str))\n\tif n, err := b64.Read(bs); err != nil {\n\t\tpanic(err)\n\t} else {\n\t\tbs = bs[:n]\n\t}\n\treturn string(bs)\n}\n\nfunc (m structTextMarshaler) MarshalText() ([]byte, error) {\n\treturn []byte(`MANUAL__` + m.encode(m.X)), nil\n}\n\nfunc (m *structTextMarshaler) UnmarshalText(text []byte) error {\n\tm.X = m.decode(strings.TrimPrefix(string(text), \"MANUAL__\"))\n\treturn nil\n}\n\nvar _ encoding.TextMarshaler = structTextMarshaler{}\nvar _ encoding.TextUnmarshaler = &structTextMarshaler{}\n\ntype structTextMarshalerAlias structTextMarshaler\n"
  },
  {
    "path": "type_tests/type_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/davecgh/go-spew/spew\"\n\t\"github.com/google/gofuzz\"\n\t\"github.com/json-iterator/go\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n)\n\nvar testCases []interface{}\nvar asymmetricTestCases [][2]interface{}\n\ntype selectedSymmetricCase struct {\n\ttestCase interface{}\n}\n\nfunc Test_symmetric(t *testing.T) {\n\tfor _, testCase := range testCases {\n\t\tselectedSymmetricCase, found := testCase.(selectedSymmetricCase)\n\t\tif found {\n\t\t\ttestCases = []interface{}{selectedSymmetricCase.testCase}\n\t\t\tbreak\n\t\t}\n\t}\n\tfor _, testCase := range testCases {\n\t\tvalType := reflect.TypeOf(testCase).Elem()\n\t\tt.Run(valType.String(), func(t *testing.T) {\n\t\t\tfz := fuzz.New().MaxDepth(10).NilChance(0.3)\n\t\t\tfor i := 0; i < 100; i++ {\n\t\t\t\tbeforePtrVal := reflect.New(valType)\n\t\t\t\tbeforePtr := beforePtrVal.Interface()\n\t\t\t\tfz.Fuzz(beforePtr)\n\t\t\t\tbefore := beforePtrVal.Elem().Interface()\n\n\t\t\t\tjbStd, err := json.Marshal(before)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"failed to marshal with stdlib: %v\", err)\n\t\t\t\t}\n\t\t\t\tif len(strings.TrimSpace(string(jbStd))) == 0 {\n\t\t\t\t\tt.Fatal(\"stdlib marshal produced empty result and no error\")\n\t\t\t\t}\n\t\t\t\tjbIter, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(before)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"failed to marshal with jsoniter: %v\", err)\n\t\t\t\t}\n\t\t\t\tif len(strings.TrimSpace(string(jbIter))) == 0 {\n\t\t\t\t\tt.Fatal(\"jsoniter marshal produced empty result and no error\")\n\t\t\t\t}\n\t\t\t\tif string(jbStd) != string(jbIter) {\n\t\t\t\t\tt.Fatalf(\"marshal expected:\\n    %s\\ngot:\\n    %s\\nobj:\\n    %s\",\n\t\t\t\t\t\tindent(jbStd, \"    \"), indent(jbIter, \"    \"), dump(before))\n\t\t\t\t}\n\n\t\t\t\tafterStdPtrVal := reflect.New(valType)\n\t\t\t\tafterStdPtr := afterStdPtrVal.Interface()\n\t\t\t\terr = json.Unmarshal(jbIter, afterStdPtr)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"failed to unmarshal with stdlib: %v\\nvia:\\n    %s\",\n\t\t\t\t\t\terr, indent(jbIter, \"    \"))\n\t\t\t\t}\n\t\t\t\tafterIterPtrVal := reflect.New(valType)\n\t\t\t\tafterIterPtr := afterIterPtrVal.Interface()\n\t\t\t\terr = jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(jbIter, afterIterPtr)\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Fatalf(\"failed to unmarshal with jsoniter: %v\\nvia:\\n    %s\",\n\t\t\t\t\t\terr, indent(jbIter, \"    \"))\n\t\t\t\t}\n\t\t\t\tafterStd := afterStdPtrVal.Elem().Interface()\n\t\t\t\tafterIter := afterIterPtrVal.Elem().Interface()\n\t\t\t\tif fingerprint(afterStd) != fingerprint(afterIter) {\n\t\t\t\t\tt.Fatalf(\"unmarshal expected:\\n    %s\\ngot:\\n    %s\\nvia:\\n    %s\",\n\t\t\t\t\t\tdump(afterStd), dump(afterIter), indent(jbIter, \"    \"))\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc Test_asymmetric(t *testing.T) {\n\tfor _, testCase := range asymmetricTestCases {\n\t\tfromType := reflect.TypeOf(testCase[0]).Elem()\n\t\ttoType := reflect.TypeOf(testCase[1]).Elem()\n\t\tfz := fuzz.New().MaxDepth(10).NilChance(0.3)\n\t\tfor i := 0; i < 100; i++ {\n\t\t\tbeforePtrVal := reflect.New(fromType)\n\t\t\tbeforePtr := beforePtrVal.Interface()\n\t\t\tfz.Fuzz(beforePtr)\n\t\t\tbefore := beforePtrVal.Elem().Interface()\n\n\t\t\tjbStd, err := json.Marshal(before)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to marshal with stdlib: %v\", err)\n\t\t\t}\n\t\t\tif len(strings.TrimSpace(string(jbStd))) == 0 {\n\t\t\t\tt.Fatal(\"stdlib marshal produced empty result and no error\")\n\t\t\t}\n\t\t\tjbIter, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(before)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to marshal with jsoniter: %v\", err)\n\t\t\t}\n\t\t\tif len(strings.TrimSpace(string(jbIter))) == 0 {\n\t\t\t\tt.Fatal(\"jsoniter marshal produced empty result and no error\")\n\t\t\t}\n\t\t\tif string(jbStd) != string(jbIter) {\n\t\t\t\tt.Fatalf(\"marshal expected:\\n    %s\\ngot:\\n    %s\\nobj:\\n    %s\",\n\t\t\t\t\tindent(jbStd, \"    \"), indent(jbIter, \"    \"), dump(before))\n\t\t\t}\n\n\t\t\tafterStdPtrVal := reflect.New(toType)\n\t\t\tafterStdPtr := afterStdPtrVal.Interface()\n\t\t\terr = json.Unmarshal(jbIter, afterStdPtr)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to unmarshal with stdlib: %v\\nvia:\\n    %s\",\n\t\t\t\t\terr, indent(jbIter, \"    \"))\n\t\t\t}\n\t\t\tafterIterPtrVal := reflect.New(toType)\n\t\t\tafterIterPtr := afterIterPtrVal.Interface()\n\t\t\terr = jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(jbIter, afterIterPtr)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to unmarshal with jsoniter: %v\\nvia:\\n    %s\",\n\t\t\t\t\terr, indent(jbIter, \"    \"))\n\t\t\t}\n\t\t\tafterStd := afterStdPtrVal.Elem().Interface()\n\t\t\tafterIter := afterIterPtrVal.Elem().Interface()\n\t\t\tif fingerprint(afterStd) != fingerprint(afterIter) {\n\t\t\t\tt.Fatalf(\"unmarshal expected:\\n    %s\\ngot:\\n    %s\\nvia:\\n    %s\",\n\t\t\t\t\tdump(afterStd), dump(afterIter), indent(jbIter, \"    \"))\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst indentStr = \">  \"\n\nfunc fingerprint(obj interface{}) string {\n\tc := spew.ConfigState{\n\t\tSortKeys: true,\n\t\tSpewKeys: true,\n\t}\n\treturn c.Sprintf(\"%v\", obj)\n}\n\nfunc dump(obj interface{}) string {\n\tcfg := spew.ConfigState{\n\t\tIndent: indentStr,\n\t}\n\treturn cfg.Sdump(obj)\n}\n\nfunc indent(src []byte, prefix string) string {\n\tvar buf bytes.Buffer\n\terr := json.Indent(&buf, src, prefix, indentStr)\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"!!! %v\", err)\n\t}\n\treturn buf.String()\n}\n"
  },
  {
    "path": "value_tests/array_test.go",
    "content": "package test\n\nfunc init() {\n\ttwo := float64(2)\n\tmarshalCases = append(marshalCases,\n\t\t[1]*float64{nil},\n\t\t[1]*float64{&two},\n\t\t[2]*float64{},\n\t)\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr:   (*[0]int)(nil),\n\t\tinput: `[1]`,\n\t}, unmarshalCase{\n\t\tptr:   (*[1]int)(nil),\n\t\tinput: `[2]`,\n\t}, unmarshalCase{\n\t\tptr:   (*[1]int)(nil),\n\t\tinput: `[]`,\n\t})\n}\n"
  },
  {
    "path": "value_tests/bool_test.go",
    "content": "package test\n\nfunc init() {\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField bool `json:\"field\"`\n\t\t})(nil),\n\t\tinput: `{\"field\": null}`,\n\t})\n}\n"
  },
  {
    "path": "value_tests/eface_test.go",
    "content": "package test\n\nfunc init() {\n\tvar pEFace = func(val interface{}) *interface{} {\n\t\treturn &val\n\t}\n\tvar pInt = func(val int) *int {\n\t\treturn &val\n\t}\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr:   (**interface{})(nil),\n\t\tinput: `\"hello\"`,\n\t}, unmarshalCase{\n\t\tptr:   (**interface{})(nil),\n\t\tinput: `1e1`,\n\t}, unmarshalCase{\n\t\tptr:   (**interface{})(nil),\n\t\tinput: `1.0e1`,\n\t}, unmarshalCase{\n\t\tptr:   (*[]interface{})(nil),\n\t\tinput: `[1.0e1]`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField interface{}\n\t\t})(nil),\n\t\tinput: `{\"field\":\"hello\"}`,\n\t}, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\ttype TestData struct {\n\t\t\t\tName string `json:\"name\"`\n\t\t\t}\n\t\t\to := &TestData{}\n\t\t\treturn &o\n\t\t},\n\t\tinput: `{\"name\":\"value\"}`,\n\t}, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\tb := true\n\t\t\treturn &struct {\n\t\t\t\tField interface{} `json:\"field\"`\n\t\t\t}{&b}\n\t\t},\n\t\tinput: `{\"field\": null}`,\n\t}, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\tvar pb *bool\n\t\t\treturn &struct {\n\t\t\t\tField interface{} `json:\"field\"`\n\t\t\t}{&pb}\n\t\t},\n\t\tinput: `{\"field\": null}`,\n\t}, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\tb := true\n\t\t\tpb := &b\n\t\t\treturn &struct {\n\t\t\t\tField interface{} `json:\"field\"`\n\t\t\t}{&pb}\n\t\t},\n\t\tinput: `{\"field\": null}`,\n\t})\n\tmarshalCases = append(marshalCases,\n\t\tpEFace(\"hello\"),\n\t\tstruct {\n\t\t\tField interface{}\n\t\t}{\"hello\"},\n\t\tstruct {\n\t\t\tField interface{}\n\t\t}{struct {\n\t\t\tfield chan int\n\t\t}{}},\n\t\tstruct {\n\t\t\tField interface{}\n\t\t}{struct {\n\t\t\tField *int\n\t\t}{pInt(100)}},\n\t)\n}\n"
  },
  {
    "path": "value_tests/error_test.go",
    "content": "package test\n\nimport (\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"reflect\"\n\t\"testing\"\n)\n\nfunc Test_errorInput(t *testing.T) {\n\tfor _, testCase := range unmarshalCases {\n\t\tif testCase.obj != nil {\n\t\t\tcontinue\n\t\t}\n\t\tvalType := reflect.TypeOf(testCase.ptr).Elem()\n\t\tt.Run(valType.String(), func(t *testing.T) {\n\t\t\tfor _, data := range []string{\n\t\t\t\t`x`,\n\t\t\t\t`n`,\n\t\t\t\t`nul`,\n\t\t\t\t`{x}`,\n\t\t\t\t`{\"x\"}`,\n\t\t\t\t`{\"x\": \"y\"x}`,\n\t\t\t\t`{\"x\": \"y\"`,\n\t\t\t\t`{\"x\": \"y\", \"a\"}`,\n\t\t\t\t`[`,\n\t\t\t\t`[{\"x\": \"y\"}`,\n\t\t\t} {\n\t\t\t\tptrVal := reflect.New(valType)\n\t\t\t\tptr := ptrVal.Interface()\n\t\t\t\terr := jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal([]byte(data), ptr)\n\t\t\t\trequire.Error(t, err, \"on input %q\", data)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "value_tests/float_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"testing\"\n\n\tjsoniter \"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc Test_read_float(t *testing.T) {\n\tinputs := []string{\n\t\t`1.1`, `1000`, `9223372036854775807`, `12.3`, `-12.3`, `720368.54775807`, `720368.547758075`,\n\t\t`1e1`, `1e+1`, `1e-1`, `1E1`, `1E+1`, `1E-1`, `-1e1`, `-1e+1`, `-1e-1`,\n\t}\n\tfor _, input := range inputs {\n\t\t// non-streaming\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input+\",\")\n\t\t\texpected, err := strconv.ParseFloat(input, 32)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(float32(expected), iter.ReadFloat32())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input+\",\")\n\t\t\texpected, err := strconv.ParseFloat(input, 64)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(expected, iter.ReadFloat64())\n\t\t})\n\t\t// streaming\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(input+\",\"), 2)\n\t\t\texpected, err := strconv.ParseFloat(input, 32)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(float32(expected), iter.ReadFloat32())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(input+\",\"), 2)\n\t\t\tval := float64(0)\n\t\t\terr := json.Unmarshal([]byte(input), &val)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(val, iter.ReadFloat64())\n\t\t})\n\t}\n}\n\nfunc Test_write_float32(t *testing.T) {\n\tvals := []float32{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,\n\t\t-0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteFloat32Lossy(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\toutput, err := json.Marshal(val)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(string(output), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\toutput, err := json.Marshal(val)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(string(output), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 10)\n\tstream.WriteRaw(\"abcdefg\")\n\tstream.WriteFloat32Lossy(1.123456)\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"abcdefg1.123456\", buf.String())\n\n\tstream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 0)\n\tstream.WriteFloat32(float32(0.0000001))\n\tshould.Equal(\"1e-7\", string(stream.Buffer()))\n}\n\nfunc Test_write_float64(t *testing.T) {\n\tvals := []float64{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,\n\t\t-0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteFloat64Lossy(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 10)\n\tstream.WriteRaw(\"abcdefg\")\n\tstream.WriteFloat64Lossy(1.123456)\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"abcdefg1.123456\", buf.String())\n\n\tstream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 0)\n\tstream.WriteFloat64(float64(0.0000001))\n\tshould.Equal(\"1e-7\", string(stream.Buffer()))\n}\n"
  },
  {
    "path": "value_tests/iface_test.go",
    "content": "package test\n\nimport \"io\"\n\nfunc init() {\n\tvar pCloser1 = func(str string) *io.Closer {\n\t\tcloser := io.Closer(strCloser1(str))\n\t\treturn &closer\n\t}\n\tvar pCloser2 = func(str string) *io.Closer {\n\t\tstrCloser := strCloser2(str)\n\t\tcloser := io.Closer(&strCloser)\n\t\treturn &closer\n\t}\n\tmarshalCases = append(marshalCases,\n\t\tpCloser1(\"hello\"),\n\t\tpCloser2(\"hello\"),\n\t)\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr:   (*[]io.Closer)(nil),\n\t\tinput: \"[null]\",\n\t}, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\tstrCloser := strCloser2(\"\")\n\t\t\treturn &struct {\n\t\t\t\tField io.Closer\n\t\t\t}{\n\t\t\t\t&strCloser,\n\t\t\t}\n\t\t},\n\t\tinput: `{\"Field\": \"hello\"}`,\n\t})\n}\n\ntype strCloser1 string\n\nfunc (closer strCloser1) Close() error {\n\treturn nil\n}\n\ntype strCloser2 string\n\nfunc (closer *strCloser2) Close() error {\n\treturn nil\n}\n"
  },
  {
    "path": "value_tests/int_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/require\"\n\t\"strconv\"\n\t\"testing\"\n)\n\nfunc init() {\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tF1  int8\n\t\t\tF2  int16\n\t\t\tF3  int32\n\t\t\tF4  int64\n\t\t\tF5  int\n\t\t\tF6  uint8\n\t\t\tF7  uint16\n\t\t\tF8  uint32\n\t\t\tF9  uint64\n\t\t\tF10 uint\n\t\t\tF11 float32\n\t\t\tF12 float64\n\t\t\tF13 uintptr\n\t\t})(nil),\n\t\tinput: `{\n\t\t\t\"f1\":null,\n\t\t\t\"f2\":null,\n\t\t\t\"f3\":null,\n\t\t\t\"f4\":null,\n\t\t\t\"f5\":null,\n\t\t\t\"f6\":null,\n\t\t\t\"f7\":null,\n\t\t\t\"f8\":null,\n\t\t\t\"f9\":null,\n\t\t\t\"f10\":null,\n\t\t\t\"f11\":null,\n\t\t\t\"f12\":null,\n\t\t\t\"f13\":null\n\t\t}`,\n\t})\n}\n\nfunc Test_int8(t *testing.T) {\n\tinputs := []string{`127`, `-128`}\n\tfor _, input := range inputs {\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input)\n\t\t\texpected, err := strconv.ParseInt(input, 10, 8)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(int8(expected), iter.ReadInt8())\n\t\t})\n\t}\n}\n\nfunc Test_read_int16(t *testing.T) {\n\tinputs := []string{`32767`, `-32768`}\n\tfor _, input := range inputs {\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input)\n\t\t\texpected, err := strconv.ParseInt(input, 10, 16)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(int16(expected), iter.ReadInt16())\n\t\t})\n\t}\n}\n\nfunc Test_read_int32(t *testing.T) {\n\tinputs := []string{`1`, `12`, `123`, `1234`, `12345`, `123456`, `2147483647`, `-2147483648`}\n\tfor _, input := range inputs {\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input)\n\t\t\texpected, err := strconv.ParseInt(input, 10, 32)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(int32(expected), iter.ReadInt32())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(input), 2)\n\t\t\texpected, err := strconv.ParseInt(input, 10, 32)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(int32(expected), iter.ReadInt32())\n\t\t})\n\t}\n}\n\nfunc Test_read_int_overflow(t *testing.T) {\n\tshould := require.New(t)\n\tinputArr := []string{\"123451\", \"-123451\"}\n\tfor _, s := range inputArr {\n\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, s)\n\t\titer.ReadInt8()\n\t\tshould.NotNil(iter.Error)\n\n\t\titerU := jsoniter.ParseString(jsoniter.ConfigDefault, s)\n\t\titerU.ReadUint8()\n\t\tshould.NotNil(iterU.Error)\n\n\t}\n\n\tinputArr = []string{\"12345678912\", \"-12345678912\"}\n\tfor _, s := range inputArr {\n\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, s)\n\t\titer.ReadInt16()\n\t\tshould.NotNil(iter.Error)\n\n\t\titerUint := jsoniter.ParseString(jsoniter.ConfigDefault, s)\n\t\titerUint.ReadUint16()\n\t\tshould.NotNil(iterUint.Error)\n\t}\n\n\tinputArr = []string{\"3111111111\", \"-3111111111\", \"1234232323232323235678912\", \"-1234567892323232323212\"}\n\tfor _, s := range inputArr {\n\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, s)\n\t\titer.ReadInt32()\n\t\tshould.NotNil(iter.Error)\n\n\t\titerUint := jsoniter.ParseString(jsoniter.ConfigDefault, s)\n\t\titerUint.ReadUint32()\n\t\tshould.NotNil(iterUint.Error)\n\t}\n\n\tinputArr = []string{\"9223372036854775811\", \"-9523372036854775807\", \"1234232323232323235678912\", \"-1234567892323232323212\"}\n\tfor _, s := range inputArr {\n\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, s)\n\t\titer.ReadInt64()\n\t\tshould.NotNil(iter.Error)\n\n\t\titerUint := jsoniter.ParseString(jsoniter.ConfigDefault, s)\n\t\titerUint.ReadUint64()\n\t\tshould.NotNil(iterUint.Error)\n\t}\n}\n\nfunc Test_read_int64(t *testing.T) {\n\tinputs := []string{`1`, `12`, `123`, `1234`, `12345`, `123456`, `9223372036854775807`, `-9223372036854775808`}\n\tfor _, input := range inputs {\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input)\n\t\t\texpected, err := strconv.ParseInt(input, 10, 64)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(expected, iter.ReadInt64())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.Parse(jsoniter.ConfigDefault, bytes.NewBufferString(input), 2)\n\t\t\texpected, err := strconv.ParseInt(input, 10, 64)\n\t\t\tshould.Nil(err)\n\t\t\tshould.Equal(expected, iter.ReadInt64())\n\t\t})\n\t}\n}\n\nfunc Test_write_uint8(t *testing.T) {\n\tvals := []uint8{0, 1, 11, 111, 255}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteUint8(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatUint(uint64(val), 10), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatUint(uint64(val), 10), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 3)\n\tstream.WriteRaw(\"a\")\n\tstream.WriteUint8(100) // should clear buffer\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"a100\", buf.String())\n}\n\nfunc Test_write_int8(t *testing.T) {\n\tvals := []int8{0, 1, -1, 99, 0x7f, -0x80}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteInt8(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatInt(int64(val), 10), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatInt(int64(val), 10), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4)\n\tstream.WriteRaw(\"a\")\n\tstream.WriteInt8(-100) // should clear buffer\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"a-100\", buf.String())\n}\n\nfunc Test_write_uint16(t *testing.T) {\n\tvals := []uint16{0, 1, 11, 111, 255, 0xfff, 0xffff}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteUint16(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatUint(uint64(val), 10), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatUint(uint64(val), 10), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 5)\n\tstream.WriteRaw(\"a\")\n\tstream.WriteUint16(10000) // should clear buffer\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"a10000\", buf.String())\n}\n\nfunc Test_write_int16(t *testing.T) {\n\tvals := []int16{0, 1, 11, 111, 255, 0xfff, 0x7fff, -0x8000}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteInt16(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatInt(int64(val), 10), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatInt(int64(val), 10), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 6)\n\tstream.WriteRaw(\"a\")\n\tstream.WriteInt16(-10000) // should clear buffer\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"a-10000\", buf.String())\n}\n\nfunc Test_write_uint32(t *testing.T) {\n\tvals := []uint32{0, 1, 11, 111, 255, 999999, 0xfff, 0xffff, 0xfffff, 0xffffff, 0xfffffff, 0xffffffff}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteUint32(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatUint(uint64(val), 10), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatUint(uint64(val), 10), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 10)\n\tstream.WriteRaw(\"a\")\n\tstream.WriteUint32(0xffffffff) // should clear buffer\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"a4294967295\", buf.String())\n}\n\nfunc Test_write_int32(t *testing.T) {\n\tvals := []int32{0, 1, 11, 111, 255, 999999, 0xfff, 0xffff, 0xfffff, 0xffffff, 0xfffffff, 0x7fffffff, -0x80000000}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteInt32(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatInt(int64(val), 10), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatInt(int64(val), 10), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 11)\n\tstream.WriteRaw(\"a\")\n\tstream.WriteInt32(-0x7fffffff) // should clear buffer\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"a-2147483647\", buf.String())\n}\n\nfunc Test_write_uint64(t *testing.T) {\n\tvals := []uint64{0, 1, 11, 111, 255, 999999, 0xfff, 0xffff, 0xfffff, 0xffffff, 0xfffffff, 0xffffffff,\n\t\t0xfffffffff, 0xffffffffff, 0xfffffffffff, 0xffffffffffff, 0xfffffffffffff, 0xffffffffffffff,\n\t\t0xfffffffffffffff, 0xffffffffffffffff}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteUint64(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatUint(uint64(val), 10), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatUint(uint64(val), 10), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 10)\n\tstream.WriteRaw(\"a\")\n\tstream.WriteUint64(0xffffffff) // should clear buffer\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"a4294967295\", buf.String())\n}\n\nfunc Test_write_int64(t *testing.T) {\n\tvals := []int64{0, 1, 11, 111, 255, 999999, 0xfff, 0xffff, 0xfffff, 0xffffff, 0xfffffff, 0xffffffff,\n\t\t0xfffffffff, 0xffffffffff, 0xfffffffffff, 0xffffffffffff, 0xfffffffffffff, 0xffffffffffffff,\n\t\t0xfffffffffffffff, 0x7fffffffffffffff, -0x8000000000000000}\n\tfor _, val := range vals {\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteInt64(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatInt(val, 10), buf.String())\n\t\t})\n\t\tt.Run(fmt.Sprintf(\"%v\", val), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tbuf := &bytes.Buffer{}\n\t\t\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096)\n\t\t\tstream.WriteVal(val)\n\t\t\tstream.Flush()\n\t\t\tshould.Nil(stream.Error)\n\t\t\tshould.Equal(strconv.FormatInt(val, 10), buf.String())\n\t\t})\n\t}\n\tshould := require.New(t)\n\tbuf := &bytes.Buffer{}\n\tstream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 10)\n\tstream.WriteRaw(\"a\")\n\tstream.WriteInt64(0xffffffff) // should clear buffer\n\tstream.Flush()\n\tshould.Nil(stream.Error)\n\tshould.Equal(\"a4294967295\", buf.String())\n}\n"
  },
  {
    "path": "value_tests/invalid_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"io\"\n\t\"testing\"\n)\n\nfunc Test_missing_object_end(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct {\n\t\tMetric string                 `json:\"metric\"`\n\t\tTags   map[string]interface{} `json:\"tags\"`\n\t}\n\tobj := TestObject{}\n\tshould.NotNil(jsoniter.UnmarshalFromString(`{\"metric\": \"sys.777\",\"tags\": {\"a\":\"123\"}`, &obj))\n}\n\nfunc Test_missing_array_end(t *testing.T) {\n\tshould := require.New(t)\n\tshould.NotNil(jsoniter.UnmarshalFromString(`[1,2,3`, &[]int{}))\n}\n\nfunc Test_invalid_any(t *testing.T) {\n\tshould := require.New(t)\n\tany := jsoniter.Get([]byte(\"[]\"))\n\tshould.Equal(jsoniter.InvalidValue, any.Get(0.3).ValueType())\n\t// is nil correct ?\n\tshould.Equal(nil, any.Get(0.3).GetInterface())\n\n\tany = any.Get(0.3)\n\tshould.Equal(false, any.ToBool())\n\tshould.Equal(int(0), any.ToInt())\n\tshould.Equal(int32(0), any.ToInt32())\n\tshould.Equal(int64(0), any.ToInt64())\n\tshould.Equal(uint(0), any.ToUint())\n\tshould.Equal(uint32(0), any.ToUint32())\n\tshould.Equal(uint64(0), any.ToUint64())\n\tshould.Equal(float32(0), any.ToFloat32())\n\tshould.Equal(float64(0), any.ToFloat64())\n\tshould.Equal(\"\", any.ToString())\n\n\tshould.Equal(jsoniter.InvalidValue, any.Get(0.1).Get(1).ValueType())\n}\n\nfunc Test_invalid_struct_input(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct{}\n\tinput := []byte{54, 141, 30}\n\tobj := TestObject{}\n\tshould.NotNil(jsoniter.Unmarshal(input, &obj))\n}\n\nfunc Test_invalid_slice_input(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct{}\n\tinput := []byte{93}\n\tobj := []string{}\n\tshould.NotNil(jsoniter.Unmarshal(input, &obj))\n}\n\nfunc Test_invalid_array_input(t *testing.T) {\n\tshould := require.New(t)\n\ttype TestObject struct{}\n\tinput := []byte{93}\n\tobj := [0]string{}\n\tshould.NotNil(jsoniter.Unmarshal(input, &obj))\n}\n\nfunc Test_invalid_float(t *testing.T) {\n\tinputs := []string{\n\t\t`1.e1`, // dot without following digit\n\t\t`1.`,   // dot can not be the last char\n\t\t``,     // empty number\n\t\t`01`,   // extra leading zero\n\t\t`-`,    // negative without digit\n\t\t`--`,   // double negative\n\t\t`--2`,  // double negative\n\t}\n\tfor _, input := range inputs {\n\t\tt.Run(input, func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\titer := jsoniter.ParseString(jsoniter.ConfigDefault, input+\",\")\n\t\t\titer.Skip()\n\t\t\tshould.NotEqual(io.EOF, iter.Error)\n\t\t\tshould.NotNil(iter.Error)\n\t\t\tv := float64(0)\n\t\t\tshould.NotNil(json.Unmarshal([]byte(input), &v))\n\t\t\titer = jsoniter.ParseString(jsoniter.ConfigDefault, input+\",\")\n\t\t\titer.ReadFloat64()\n\t\t\tshould.NotEqual(io.EOF, iter.Error)\n\t\t\tshould.NotNil(iter.Error)\n\t\t\titer = jsoniter.ParseString(jsoniter.ConfigDefault, input+\",\")\n\t\t\titer.ReadFloat32()\n\t\t\tshould.NotEqual(io.EOF, iter.Error)\n\t\t\tshould.NotNil(iter.Error)\n\t\t})\n\t}\n}\n\nfunc Test_chan(t *testing.T) {\n\ttype TestObject struct {\n\t\tMyChan  chan bool\n\t\tMyField int\n\t}\n\n\tobj := TestObject{}\n\n\tt.Run(\"Encode channel\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\tstr, err := jsoniter.Marshal(obj)\n\t\tshould.NotNil(err)\n\t\tshould.Nil(str)\n\t})\n\n\tt.Run(\"Encode channel using compatible configuration\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\tstr, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(obj)\n\t\tshould.NotNil(err)\n\t\tshould.Nil(str)\n\t})\n}\n\nfunc Test_invalid_in_map(t *testing.T) {\n\ttestMap := map[string]interface{}{\"chan\": make(chan interface{})}\n\n\tt.Run(\"Encode map with invalid content\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\tstr, err := jsoniter.Marshal(testMap)\n\t\tshould.NotNil(err)\n\t\tshould.Nil(str)\n\t})\n\n\tt.Run(\"Encode map with invalid content using compatible configuration\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\tstr, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(testMap)\n\t\tshould.NotNil(err)\n\t\tshould.Nil(str)\n\t})\n}\n\nfunc Test_invalid_number(t *testing.T) {\n\ttype Message struct {\n\t\tNumber int `json:\"number\"`\n\t}\n\tobj := Message{}\n\tdecoder := jsoniter.ConfigCompatibleWithStandardLibrary.NewDecoder(bytes.NewBufferString(`{\"number\":\"5\"}`))\n\terr := decoder.Decode(&obj)\n\tinvalidStr := err.Error()\n\tresult, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(invalidStr)\n\tshould := require.New(t)\n\tshould.Nil(err)\n\tresult2, err := json.Marshal(invalidStr)\n\tshould.Nil(err)\n\tshould.Equal(string(result2), string(result))\n}\n\nfunc Test_valid(t *testing.T) {\n\tshould := require.New(t)\n\tshould.True(jsoniter.Valid([]byte(`{}`)))\n\tshould.False(jsoniter.Valid([]byte(`{`)))\n}\n\nfunc Test_nil_pointer(t *testing.T) {\n\tshould := require.New(t)\n\tdata := []byte(`{\"A\":0}`)\n\ttype T struct {\n\t\tX int\n\t}\n\tvar obj *T\n\terr := jsoniter.Unmarshal(data, obj)\n\tshould.NotNil(err)\n}\n\nfunc Test_func_pointer_type(t *testing.T) {\n\ttype TestObject2 struct {\n\t\tF func()\n\t}\n\ttype TestObject1 struct {\n\t\tObj *TestObject2\n\t}\n\tt.Run(\"encode null is valid\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\toutput, err := json.Marshal(TestObject1{})\n\t\tshould.Nil(err)\n\t\tshould.Equal(`{\"Obj\":null}`, string(output))\n\t\toutput, err = jsoniter.Marshal(TestObject1{})\n\t\tshould.Nil(err)\n\t\tshould.Equal(`{\"Obj\":null}`, string(output))\n\t})\n\tt.Run(\"encode not null is invalid\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\t_, err := json.Marshal(TestObject1{Obj: &TestObject2{}})\n\t\tshould.NotNil(err)\n\t\t_, err = jsoniter.Marshal(TestObject1{Obj: &TestObject2{}})\n\t\tshould.NotNil(err)\n\t})\n\tt.Run(\"decode null is valid\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\tvar obj TestObject1\n\t\tshould.Nil(json.Unmarshal([]byte(`{\"Obj\":{\"F\": null}}`), &obj))\n\t\tshould.Nil(jsoniter.Unmarshal([]byte(`{\"Obj\":{\"F\": null}}`), &obj))\n\t})\n\tt.Run(\"decode not null is invalid\", func(t *testing.T) {\n\t\tshould := require.New(t)\n\t\tvar obj TestObject1\n\t\tshould.NotNil(json.Unmarshal([]byte(`{\"Obj\":{\"F\": \"hello\"}}`), &obj))\n\t\tshould.NotNil(jsoniter.Unmarshal([]byte(`{\"Obj\":{\"F\": \"hello\"}}`), &obj))\n\t})\n}\n\nfunc TestEOF(t *testing.T) {\n\tvar s string\n\terr := jsoniter.ConfigCompatibleWithStandardLibrary.NewDecoder(&bytes.Buffer{}).Decode(&s)\n\tassert.Equal(t, io.EOF, err)\n}\n\nfunc TestDecodeErrorType(t *testing.T) {\n\tshould := require.New(t)\n\tvar err error\n\tshould.Nil(jsoniter.Unmarshal([]byte(\"null\"), &err))\n\tshould.NotNil(jsoniter.Unmarshal([]byte(\"123\"), &err))\n}\n\nfunc Test_decode_slash(t *testing.T) {\n\tshould := require.New(t)\n\tvar obj interface{}\n\tshould.NotNil(json.Unmarshal([]byte(\"\\\\\"), &obj))\n\tshould.NotNil(jsoniter.UnmarshalFromString(\"\\\\\", &obj))\n}\n\nfunc Test_NilInput(t *testing.T) {\n\tvar jb []byte // nil\n\tvar out string\n\terr := jsoniter.Unmarshal(jb, &out)\n\tif err == nil {\n\t\tt.Errorf(\"Expected error\")\n\t}\n}\n\nfunc Test_EmptyInput(t *testing.T) {\n\tjb := []byte(\"\")\n\tvar out string\n\terr := jsoniter.Unmarshal(jb, &out)\n\tif err == nil {\n\t\tt.Errorf(\"Expected error\")\n\t}\n}\n\ntype Foo struct {\n\tA jsoniter.Any\n}\n\nfunc Test_nil_any(t *testing.T) {\n\tshould := require.New(t)\n\tdata, _ := jsoniter.Marshal(&Foo{})\n\tshould.Equal(`{\"A\":null}`, string(data))\n}\n"
  },
  {
    "path": "value_tests/map_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"time\"\n)\n\nfunc init() {\n\tvar pRawMessage = func(val json.RawMessage) *json.RawMessage {\n\t\treturn &val\n\t}\n\tnilMap := map[string]string(nil)\n\tmarshalCases = append(marshalCases,\n\t\tmap[string]interface{}{\"abc\": 1},\n\t\tmap[string]MyInterface{\"hello\": MyString(\"world\")},\n\t\tmap[*big.Float]string{big.NewFloat(1.2): \"2\"},\n\t\tmap[string]interface{}{\n\t\t\t\"3\": 3,\n\t\t\t\"1\": 1,\n\t\t\t\"2\": 2,\n\t\t},\n\t\tmap[uint64]interface{}{\n\t\t\tuint64(1): \"a\",\n\t\t\tuint64(2): \"a\",\n\t\t\tuint64(4): \"a\",\n\t\t},\n\t\tnilMap,\n\t\t&nilMap,\n\t\tmap[string]*json.RawMessage{\"hello\": pRawMessage(json.RawMessage(\"[]\"))},\n\t\tmap[Date]bool{{}: true},\n\t\tmap[Date2]bool{{}: true},\n\t\tmap[customKey]string{customKey(1): \"bar\"},\n\t)\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr:   (*map[string]string)(nil),\n\t\tinput: `{\"k\\\"ey\": \"val\"}`,\n\t}, unmarshalCase{\n\t\tptr:   (*map[string]string)(nil),\n\t\tinput: `null`,\n\t}, unmarshalCase{\n\t\tptr:   (*map[string]*json.RawMessage)(nil),\n\t\tinput: \"{\\\"test\\\":[{\\\"key\\\":\\\"value\\\"}]}\",\n\t}, unmarshalCase{\n\t\tptr: (*map[Date]bool)(nil),\n\t\tinput: `{\n        \"2018-12-12\": true,\n        \"2018-12-13\": true,\n        \"2018-12-14\": true\n    \t}`,\n\t}, unmarshalCase{\n\t\tptr: (*map[Date2]bool)(nil),\n\t\tinput: `{\n        \"2018-12-12\": true,\n        \"2018-12-13\": true,\n        \"2018-12-14\": true\n    \t}`,\n\t}, unmarshalCase{\n\t\tptr: (*map[customKey]string)(nil),\n\t\tinput: `{\"foo\": \"bar\"}`,\n\t})\n}\n\ntype MyInterface interface {\n\tHello() string\n}\n\ntype MyString string\n\nfunc (ms MyString) Hello() string {\n\treturn string(ms)\n}\n\ntype Date struct {\n\ttime.Time\n}\n\nfunc (d *Date) UnmarshalJSON(b []byte) error {\n\tdateStr := string(b) // something like `\"2017-08-20\"`\n\n\tif dateStr == \"null\" {\n\t\treturn nil\n\t}\n\n\tt, err := time.Parse(`\"2006-01-02\"`, dateStr)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cant parse date: %#v\", err)\n\t}\n\n\td.Time = t\n\treturn nil\n}\n\nfunc (d *Date) MarshalJSON() ([]byte, error) {\n\treturn []byte(d.Time.Format(\"2006-01-02\")), nil\n}\n\ntype Date2 struct {\n\ttime.Time\n}\n\nfunc (d Date2) UnmarshalJSON(b []byte) error {\n\tdateStr := string(b) // something like `\"2017-08-20\"`\n\n\tif dateStr == \"null\" {\n\t\treturn nil\n\t}\n\n\tt, err := time.Parse(`\"2006-01-02\"`, dateStr)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cant parse date: %#v\", err)\n\t}\n\n\td.Time = t\n\treturn nil\n}\n\nfunc (d Date2) MarshalJSON() ([]byte, error) {\n\treturn []byte(d.Time.Format(\"2006-01-02\")), nil\n}\n\ntype customKey int32\n\nfunc (c customKey) MarshalText() ([]byte, error) {\n\treturn []byte(\"foo\"), nil\n}\n\nfunc (c *customKey) UnmarshalText(value []byte) error {\n\t*c = 1\n\treturn nil\n}\n"
  },
  {
    "path": "value_tests/marshaler_test.go",
    "content": "package test\n\nimport (\n\t\"encoding\"\n\t\"encoding/json\"\n)\n\nfunc init() {\n\tjm := json.Marshaler(jmOfStruct{})\n\ttm1 := encoding.TextMarshaler(tmOfStruct{})\n\ttm2 := encoding.TextMarshaler(&tmOfStructInt{})\n\tmarshalCases = append(marshalCases,\n\t\tjmOfStruct{},\n\t\t&jm,\n\t\ttmOfStruct{},\n\t\t&tm1,\n\t\ttmOfStructInt{},\n\t\t&tm2,\n\t\tmap[tmOfStruct]int{\n\t\t\t{}: 100,\n\t\t},\n\t\tmap[*tmOfStruct]int{\n\t\t\t{}: 100,\n\t\t},\n\t\tmap[encoding.TextMarshaler]int{\n\t\t\ttm1: 100,\n\t\t},\n\t)\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr:   (*tmOfMap)(nil),\n\t\tinput: `\"{1:2}\"`,\n\t}, unmarshalCase{\n\t\tptr:   (*tmOfMapPtr)(nil),\n\t\tinput: `\"{1:2}\"`,\n\t})\n}\n\ntype jmOfStruct struct {\n\tF2 chan []byte\n}\n\nfunc (q jmOfStruct) MarshalJSON() ([]byte, error) {\n\treturn []byte(`\"\"`), nil\n}\n\nfunc (q *jmOfStruct) UnmarshalJSON(value []byte) error {\n\treturn nil\n}\n\ntype tmOfStruct struct {\n\tF2 chan []byte\n}\n\nfunc (q tmOfStruct) MarshalText() ([]byte, error) {\n\treturn []byte(`\"\"`), nil\n}\n\nfunc (q *tmOfStruct) UnmarshalText(value []byte) error {\n\treturn nil\n}\n\ntype tmOfStructInt struct {\n\tField2 int\n}\n\nfunc (q *tmOfStructInt) MarshalText() ([]byte, error) {\n\treturn []byte(`\"abc\"`), nil\n}\n\nfunc (q *tmOfStructInt) UnmarshalText(value []byte) error {\n\treturn nil\n}\n\ntype tmOfMap map[int]int\n\nfunc (q tmOfMap) UnmarshalText(value []byte) error {\n\treturn nil\n}\n\ntype tmOfMapPtr map[int]int\n\nfunc (q *tmOfMapPtr) UnmarshalText(value []byte) error {\n\treturn nil\n}\n"
  },
  {
    "path": "value_tests/number_test.go",
    "content": "package test\n\nimport \"encoding/json\"\n\nfunc init() {\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr:   (*json.Number)(nil),\n\t\tinput: `\"500\"`,\n\t}, unmarshalCase{\n\t\tptr:   (*json.Number)(nil),\n\t\tinput: `1`,\n\t}, unmarshalCase{\n\t\tptr:   (*json.Number)(nil),\n\t\tinput: `null`,\n\t})\n\tmarshalCases = append(marshalCases, json.Number(\"\"))\n}\n"
  },
  {
    "path": "value_tests/ptr_114_test.go",
    "content": "// +build go1.14\n\npackage test\n\nfunc init() {\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\tvar i int\n\t\t\tpi := &i\n\t\t\tppi := &pi\n\t\t\treturn &ppi\n\t\t},\n\t\tinput: \"null\",\n\t})\n}\n"
  },
  {
    "path": "value_tests/ptr_test.go",
    "content": "package test\n\nfunc init() {\n\tvar pInt = func(val int) *int {\n\t\treturn &val\n\t}\n\tmarshalCases = append(marshalCases,\n\t\t(*int)(nil),\n\t\tpInt(100),\n\t)\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\tvar i int\n\t\t\treturn &i\n\t\t},\n\t\tinput: \"null\",\n\t}, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\tvar i *int\n\t\t\treturn &i\n\t\t},\n\t\tinput: \"10\",\n\t}, unmarshalCase{\n\t\tobj: func() interface{} {\n\t\t\tvar i int\n\t\t\tpi := &i\n\t\t\treturn &pi\n\t\t},\n\t\tinput: \"null\",\n\t})\n}\n"
  },
  {
    "path": "value_tests/raw_message_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n)\n\nfunc init() {\n\tmarshalCases = append(marshalCases,\n\t\tjson.RawMessage(\"{}\"),\n\t\tjson.RawMessage(\"12345\"),\n\t\tjson.RawMessage(\"3.14\"),\n\t\tjson.RawMessage(\"-0.5e10\"),\n\t\tstruct {\n\t\t\tEnv   string          `json:\"env\"`\n\t\t\tExtra json.RawMessage `json:\"extra,omitempty\"`\n\t\t}{\n\t\t\tEnv: \"jfdk\",\n\t\t},\n\t)\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr:   (*json.RawMessage)(nil),\n\t\tinput: `[1,2,3]`,\n\t}, unmarshalCase{\n\t\tptr:   (*json.RawMessage)(nil),\n\t\tinput: `1.122e+250`,\n\t})\n}\n"
  },
  {
    "path": "value_tests/slice_test.go",
    "content": "package test\n\nfunc init() {\n\tnilSlice := []string(nil)\n\tmarshalCases = append(marshalCases,\n\t\t[]interface{}{\"hello\"},\n\t\tnilSlice,\n\t\t&nilSlice,\n\t\t[]byte{1, 2, 3},\n\t)\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr:   (*[]string)(nil),\n\t\tinput: \"null\",\n\t}, unmarshalCase{\n\t\tptr:   (*[]string)(nil),\n\t\tinput: \"[]\",\n\t}, unmarshalCase{\n\t\tptr:   (*[]byte)(nil),\n\t\tinput: \"[1,2,3]\",\n\t}, unmarshalCase{\n\t\tptr:   (*[]byte)(nil),\n\t\tinput: `\"aGVsbG8=\"`,\n\t}, unmarshalCase{\n\t\tptr:   (*[]byte)(nil),\n\t\tinput: `\"c3ViamVjdHM\\/X2Q9MQ==\"`,\n\t})\n}\n"
  },
  {
    "path": "value_tests/string_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/json-iterator/go\"\n\t\"testing\"\n\t\"unicode/utf8\"\n)\n\nfunc init() {\n\tmarshalCases = append(marshalCases,\n\t\t`>`,\n\t\t`\"数字山谷\"`,\n\t\t\"he\\u2029\\u2028he\",\n\t)\n\tfor i := 0; i < utf8.RuneSelf; i++ {\n\t\tmarshalCases = append(marshalCases, string([]byte{byte(i)}))\n\t}\n}\n\nfunc Test_read_string(t *testing.T) {\n\tbadInputs := []string{\n\t\t``,\n\t\t`\"`,\n\t\t`\"\\\"`,\n\t\t`\"\\\\\\\"`,\n\t\t\"\\\"\\n\\\"\",\n\t\t`\"\\U0001f64f\"`,\n\t\t`\"\\uD83D\\u00\"`,\n\t}\n\tfor i := 0; i < 32; i++ {\n\t\t// control characters are invalid\n\t\tbadInputs = append(badInputs, string([]byte{'\"', byte(i), '\"'}))\n\t}\n\n\tfor _, input := range badInputs {\n\t\ttestReadString(t, input, \"\", true, \"json.Unmarshal\", json.Unmarshal)\n\t\ttestReadString(t, input, \"\", true, \"jsoniter.Unmarshal\", jsoniter.Unmarshal)\n\t\ttestReadString(t, input, \"\", true, \"jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal\", jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal)\n\t}\n\n\tgoodInputs := []struct {\n\t\tinput       string\n\t\texpectValue string\n\t}{\n\t\t{`\"\"`, \"\"},\n\t\t{`\"a\"`, \"a\"},\n\t\t{`null`, \"\"},\n\t\t{`\"Iñtërnâtiônàlizætiøn,💝🐹🌇⛔\"`, \"Iñtërnâtiônàlizætiøn,💝🐹🌇⛔\"},\n\t\t{`\"\\uD83D\"`, string([]byte{239, 191, 189})},\n\t\t{`\"\\uD83D\\\\\"`, string([]byte{239, 191, 189, '\\\\'})},\n\t\t{`\"\\uD83D\\ub000\"`, string([]byte{239, 191, 189, 235, 128, 128})},\n\t\t{`\"\\uD83D\\ude04\"`, \"😄\"},\n\t\t{`\"\\uDEADBEEF\"`, string([]byte{239, 191, 189, 66, 69, 69, 70})},\n\t\t{`\"hel\\\"lo\"`, `hel\"lo`},\n\t\t{`\"hel\\\\\\/lo\"`, `hel\\/lo`},\n\t\t{`\"hel\\\\blo\"`, `hel\\blo`},\n\t\t{`\"hel\\\\\\blo\"`, \"hel\\\\\\blo\"},\n\t\t{`\"hel\\\\nlo\"`, `hel\\nlo`},\n\t\t{`\"hel\\\\\\nlo\"`, \"hel\\\\\\nlo\"},\n\t\t{`\"hel\\\\tlo\"`, `hel\\tlo`},\n\t\t{`\"hel\\\\flo\"`, `hel\\flo`},\n\t\t{`\"hel\\\\\\flo\"`, \"hel\\\\\\flo\"},\n\t\t{`\"hel\\\\\\rlo\"`, \"hel\\\\\\rlo\"},\n\t\t{`\"hel\\\\\\tlo\"`, \"hel\\\\\\tlo\"},\n\t\t{`\"\\u4e2d\\u6587\"`, \"中文\"},\n\t\t{`\"\\ud83d\\udc4a\"`, \"\\xf0\\x9f\\x91\\x8a\"},\n\t}\n\n\tfor _, tc := range goodInputs {\n\t\ttestReadString(t, tc.input, tc.expectValue, false, \"json.Unmarshal\", json.Unmarshal)\n\t\ttestReadString(t, tc.input, tc.expectValue, false, \"jsoniter.Unmarshal\", jsoniter.Unmarshal)\n\t\ttestReadString(t, tc.input, tc.expectValue, false, \"jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal\", jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal)\n\t}\n}\n\nfunc testReadString(t *testing.T, input string, expectValue string, expectError bool, marshalerName string, marshaler func([]byte, interface{}) error) {\n\tvar value string\n\terr := marshaler([]byte(input), &value)\n\tif expectError != (err != nil) {\n\t\tt.Errorf(\"%q: %s: expected error %v, got %v\", input, marshalerName, expectError, err)\n\t\treturn\n\t}\n\tif value != expectValue {\n\t\tt.Errorf(\"%q: %s: expected %q, got %q\", input, marshalerName, expectValue, value)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "value_tests/struct_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"time\"\n)\n\nfunc init() {\n\tvar pString = func(val string) *string {\n\t\treturn &val\n\t}\n\tepoch := time.Unix(0, 0)\n\tunmarshalCases = append(unmarshalCases, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField interface{}\n\t\t})(nil),\n\t\tinput: `{\"Field\": \"hello\"}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField interface{}\n\t\t})(nil),\n\t\tinput: `{\"Field\": \"hello\"}       `,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField int `json:\"field\"`\n\t\t})(nil),\n\t\tinput: `{\"field\": null}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField int `json:\"field,string\"`\n\t\t})(nil),\n\t\tinput: `{\"field\": null}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tID      int                    `json:\"id\"`\n\t\t\tPayload map[string]interface{} `json:\"payload\"`\n\t\t\tbuf     *bytes.Buffer\n\t\t})(nil),\n\t\tinput: ` {\"id\":1, \"payload\":{\"account\":\"123\",\"password\":\"456\"}}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField1 string\n\t\t})(nil),\n\t\tinput: `{\"Field\\\"1\":\"hello\"}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField1 string\n\t\t})(nil),\n\t\tinput: `{\"\\u0046ield1\":\"hello\"}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField1 *string\n\t\t\tField2 *string\n\t\t})(nil),\n\t\tinput: `{\"field1\": null, \"field2\": \"world\"}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tField1 string\n\t\t\tField2 json.RawMessage\n\t\t})(nil),\n\t\tinput: `{\"field1\": \"hello\", \"field2\":[1,2,3]}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\ta int\n\t\t\tb <-chan int\n\t\t\tC int\n\t\t\td *time.Timer\n\t\t})(nil),\n\t\tinput: `{\"a\": 444, \"b\":\"bad\", \"C\":256, \"d\":{\"not\":\"a timer\"}}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tA string\n\t\t\tB string\n\t\t\tC string\n\t\t\tD string\n\t\t\tE string\n\t\t\tF string\n\t\t\tG string\n\t\t\tH string\n\t\t\tI string\n\t\t\tJ string\n\t\t\tK string\n\t\t})(nil),\n\t\tinput: `{\"a\":\"1\",\"b\":\"2\",\"c\":\"3\",\"d\":\"4\",\"e\":\"5\",\"f\":\"6\",\"g\":\"7\",\"h\":\"8\",\"i\":\"9\",\"j\":\"10\",\"k\":\"11\"}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tT float64 `json:\"T\"`\n\t\t})(nil),\n\t\tinput: `{\"t\":10.0}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tT float64 `json:\"T\"`\n\t\t})(nil),\n\t\tinput: `{\"T\":10.0}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tT float64 `json:\"t\"`\n\t\t})(nil),\n\t\tinput: `{\"T\":10.0}`,\n\t}, unmarshalCase{\n\t\tptr: (*struct {\n\t\t\tKeyString string       `json:\"key_string\"`\n\t\t\tType      string       `json:\"type\"`\n\t\t\tAsks      [][2]float64 `json:\"asks\"`\n\t\t})(nil),\n\t\tinput: `{\"key_string\": \"KEYSTRING\",\"type\": \"TYPE\",\"asks\": [[1e+66,1]]}`,\n\t})\n\tmarshalCases = append(marshalCases,\n\t\tstruct {\n\t\t\tField map[string]interface{}\n\t\t}{\n\t\t\tmap[string]interface{}{\"hello\": \"world\"},\n\t\t},\n\t\tstruct {\n\t\t\tField  map[string]interface{}\n\t\t\tField2 string\n\t\t}{\n\t\t\tmap[string]interface{}{\"hello\": \"world\"}, \"\",\n\t\t},\n\t\tstruct {\n\t\t\tField interface{}\n\t\t}{\n\t\t\t1024,\n\t\t},\n\t\tstruct {\n\t\t\tField MyInterface\n\t\t}{\n\t\t\tMyString(\"hello\"),\n\t\t},\n\t\tstruct {\n\t\t\tF *float64\n\t\t}{},\n\t\tstruct {\n\t\t\t*time.Time\n\t\t}{&epoch},\n\t\tstruct {\n\t\t\t*StructVarious\n\t\t}{&StructVarious{}},\n\t\tstruct {\n\t\t\t*StructVarious\n\t\t\tField int\n\t\t}{nil, 10},\n\t\tstruct {\n\t\t\tField1 int\n\t\t\tField2 [1]*float64\n\t\t}{},\n\t\tstruct {\n\t\t\tField interface{} `json:\"field,omitempty\"`\n\t\t}{},\n\t\tstruct {\n\t\t\tField MyInterface `json:\"field,omitempty\"`\n\t\t}{},\n\t\tstruct {\n\t\t\tField MyInterface `json:\"field,omitempty\"`\n\t\t}{MyString(\"hello\")},\n\t\tstruct {\n\t\t\tField json.Marshaler `json:\"field\"`\n\t\t}{},\n\t\tstruct {\n\t\t\tField MyInterface `json:\"field\"`\n\t\t}{},\n\t\tstruct {\n\t\t\tField MyInterface `json:\"field\"`\n\t\t}{MyString(\"hello\")},\n\t\tstruct {\n\t\t\tField1 string `json:\"field-1,omitempty\"`\n\t\t\tField2 func() `json:\"-\"`\n\t\t}{},\n\t\tstructRecursive{},\n\t\tstruct {\n\t\t\t*CacheItem\n\n\t\t\t// Omit bad keys\n\t\t\tOmitMaxAge omit `json:\"cacheAge,omitempty\"`\n\n\t\t\t// Add nice keys\n\t\t\tMaxAge int `json:\"max_age\"`\n\t\t}{\n\t\t\tCacheItem: &CacheItem{\n\t\t\t\tKey:    \"value\",\n\t\t\t\tMaxAge: 100,\n\t\t\t},\n\t\t\tMaxAge: 20,\n\t\t},\n\t\tstructOrder{},\n\t\tstruct {\n\t\t\tField1 *string\n\t\t\tField2 *string\n\t\t}{Field2: pString(\"world\")},\n\t\tstruct {\n\t\t\ta int\n\t\t\tb <-chan int\n\t\t\tC int\n\t\t\td *time.Timer\n\t\t}{\n\t\t\ta: 42,\n\t\t\tb: make(<-chan int, 10),\n\t\t\tC: 21,\n\t\t\td: time.NewTimer(10 * time.Second),\n\t\t},\n\t\tstruct {\n\t\t\t_UnderscoreField string\n\t\t}{\n\t\t\t\"should not marshal\",\n\t\t},\n\t)\n}\n\ntype StructVarious struct {\n\tField0 string\n\tField1 []string\n\tField2 map[string]interface{}\n}\n\ntype structRecursive struct {\n\tField1 string\n\tMe     *structRecursive\n}\n\ntype omit *struct{}\ntype CacheItem struct {\n\tKey    string `json:\"key\"`\n\tMaxAge int    `json:\"cacheAge\"`\n}\n\ntype orderA struct {\n\tField2 string\n}\n\ntype orderC struct {\n\tField5 string\n}\n\ntype orderB struct {\n\tField4 string\n\torderC\n\tField6 string\n}\n\ntype structOrder struct {\n\tField1 string\n\torderA\n\tField3 string\n\torderB\n\tField7 string\n}\n"
  },
  {
    "path": "value_tests/value_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"github.com/json-iterator/go\"\n\t\"github.com/modern-go/reflect2\"\n\t\"github.com/stretchr/testify/require\"\n\t\"testing\"\n)\n\ntype unmarshalCase struct {\n\tobj      func() interface{}\n\tptr      interface{}\n\tinput    string\n\tselected bool\n}\n\nvar unmarshalCases []unmarshalCase\n\nvar marshalCases = []interface{}{\n\tnil,\n}\n\ntype selectedMarshalCase struct {\n\tmarshalCase interface{}\n}\n\nfunc Test_unmarshal(t *testing.T) {\n\tfor _, testCase := range unmarshalCases {\n\t\tif testCase.selected {\n\t\t\tunmarshalCases = []unmarshalCase{testCase}\n\t\t\tbreak\n\t\t}\n\t}\n\tfor i, testCase := range unmarshalCases {\n\t\tt.Run(fmt.Sprintf(\"[%v]%s\", i, testCase.input), func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\tvar obj1 interface{}\n\t\t\tvar obj2 interface{}\n\t\t\tif testCase.obj != nil {\n\t\t\t\tobj1 = testCase.obj()\n\t\t\t\tobj2 = testCase.obj()\n\t\t\t} else {\n\t\t\t\tvalType := reflect2.TypeOfPtr(testCase.ptr).Elem()\n\t\t\t\tobj1 = valType.New()\n\t\t\t\tobj2 = valType.New()\n\t\t\t}\n\t\t\terr1 := json.Unmarshal([]byte(testCase.input), obj1)\n\t\t\tshould.NoError(err1, \"json\")\n\t\t\terr2 := jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal([]byte(testCase.input), obj2)\n\t\t\tshould.NoError(err2, \"jsoniter\")\n\t\t\tshould.Equal(obj1, obj2)\n\t\t})\n\t}\n}\n\nfunc Test_marshal(t *testing.T) {\n\tfor _, testCase := range marshalCases {\n\t\tselectedMarshalCase, found := testCase.(selectedMarshalCase)\n\t\tif found {\n\t\t\tmarshalCases = []interface{}{selectedMarshalCase.marshalCase}\n\t\t\tbreak\n\t\t}\n\t}\n\tfor i, testCase := range marshalCases {\n\t\tvar name string\n\t\tif testCase != nil {\n\t\t\tname = fmt.Sprintf(\"[%v]%v/%s\", i, testCase, reflect2.TypeOf(testCase).String())\n\t\t}\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tshould := require.New(t)\n\t\t\toutput1, err1 := json.Marshal(testCase)\n\t\t\tshould.NoError(err1, \"json\")\n\t\t\toutput2, err2 := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(testCase)\n\t\t\tshould.NoError(err2, \"jsoniter\")\n\t\t\tshould.Equal(string(output1), string(output2))\n\t\t})\n\t}\n}\n"
  }
]