|
|
@@ -5,6 +5,8 @@ import (
|
|
|
"fmt"
|
|
|
"io"
|
|
|
"reflect"
|
|
|
+ "unsafe"
|
|
|
+ "github.com/v2pro/plz/reflect2"
|
|
|
)
|
|
|
|
|
|
// Any generic object representation.
|
|
|
@@ -242,3 +244,40 @@ func locatePath(iter *Iterator, path []interface{}) Any {
|
|
|
}
|
|
|
return iter.readAny()
|
|
|
}
|
|
|
+
|
|
|
+type anyCodec struct {
|
|
|
+ valType reflect2.Type
|
|
|
+}
|
|
|
+
|
|
|
+func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
|
|
+ panic("not implemented")
|
|
|
+}
|
|
|
+
|
|
|
+func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
|
|
+ obj := codec.valType.UnsafeIndirect(ptr)
|
|
|
+ any := obj.(Any)
|
|
|
+ any.WriteTo(stream)
|
|
|
+}
|
|
|
+
|
|
|
+func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
|
|
+ obj := codec.valType.UnsafeIndirect(ptr)
|
|
|
+ any := obj.(Any)
|
|
|
+ return any.Size() == 0
|
|
|
+}
|
|
|
+
|
|
|
+type directAnyCodec struct {
|
|
|
+}
|
|
|
+
|
|
|
+func (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
|
|
+ *(*Any)(ptr) = iter.readAny()
|
|
|
+}
|
|
|
+
|
|
|
+func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
|
|
+ any := *(*Any)(ptr)
|
|
|
+ any.WriteTo(stream)
|
|
|
+}
|
|
|
+
|
|
|
+func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
|
|
+ any := *(*Any)(ptr)
|
|
|
+ return any.Size() == 0
|
|
|
+}
|