From 54ab168362287ca45a13965b8a67e54d996e1cf2 Mon Sep 17 00:00:00 2001
From: Tao Wen <taowen@gmail.com>
Date: Sun, 2 Jul 2017 11:03:13 +0800
Subject: [PATCH] #99 support uintptr

---
 feature_reflect.go        | 10 ++++++++++
 feature_reflect_native.go | 19 +++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/feature_reflect.go b/feature_reflect.go
index 44b86d8..c821b6b 100644
--- a/feature_reflect.go
+++ b/feature_reflect.go
@@ -365,6 +365,11 @@ func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error
 			return decoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
 		}
 		return &uint32Codec{}, nil
+	case reflect.Uintptr:
+		if typeName != "uintptr" {
+			return decoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem())
+		}
+		return &uintptrCodec{}, nil
 	case reflect.Uint64:
 		if typeName != "uint64" {
 			return decoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
@@ -530,6 +535,11 @@ func createEncoderOfSimpleType(cfg *frozenConfig, typ reflect.Type) (ValEncoder,
 			return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem())
 		}
 		return &uint32Codec{}, nil
+	case reflect.Uintptr:
+		if typeName != "uintptr" {
+			return encoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem())
+		}
+		return &uintptrCodec{}, nil
 	case reflect.Uint64:
 		if typeName != "uint64" {
 			return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem())
diff --git a/feature_reflect_native.go b/feature_reflect_native.go
index 424b567..61fc2fd 100644
--- a/feature_reflect_native.go
+++ b/feature_reflect_native.go
@@ -47,6 +47,25 @@ func (codec *intCodec) IsEmpty(ptr unsafe.Pointer) bool {
 	return *((*int)(ptr)) == 0
 }
 
+type uintptrCodec struct {
+}
+
+func (codec *uintptrCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
+	*((*uintptr)(ptr)) = uintptr(iter.ReadUint64())
+}
+
+func (codec *uintptrCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
+	stream.WriteUint64(uint64(*((*uintptr)(ptr))))
+}
+
+func (encoder *uintptrCodec) EncodeInterface(val interface{}, stream *Stream) {
+	WriteToStream(val, stream, encoder)
+}
+
+func (codec *uintptrCodec) IsEmpty(ptr unsafe.Pointer) bool {
+	return *((*uintptr)(ptr)) == 0
+}
+
 type int8Codec struct {
 }