1package jsoniter
2
3import (
4	"encoding/json"
5	"github.com/modern-go/reflect2"
6	"unsafe"
7)
8
9var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()
10var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()
11
12func createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder {
13	if typ == jsonRawMessageType {
14		return &jsonRawMessageCodec{}
15	}
16	if typ == jsoniterRawMessageType {
17		return &jsoniterRawMessageCodec{}
18	}
19	return nil
20}
21
22func createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder {
23	if typ == jsonRawMessageType {
24		return &jsonRawMessageCodec{}
25	}
26	if typ == jsoniterRawMessageType {
27		return &jsoniterRawMessageCodec{}
28	}
29	return nil
30}
31
32type jsonRawMessageCodec struct {
33}
34
35func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
36	*((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes())
37}
38
39func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
40	stream.WriteRaw(string(*((*json.RawMessage)(ptr))))
41}
42
43func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
44	return len(*((*json.RawMessage)(ptr))) == 0
45}
46
47type jsoniterRawMessageCodec struct {
48}
49
50func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
51	*((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes())
52}
53
54func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
55	stream.WriteRaw(string(*((*RawMessage)(ptr))))
56}
57
58func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
59	return len(*((*RawMessage)(ptr))) == 0
60}
61