14 Star 51 Fork 12

Hprose / hprose-go

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
array_decoder.go 2.71 KB
一键复制 编辑 原始数据 按行查看 历史
Hprose 提交于 2016-10-31 21:45 . Update to hprose 2.0
/**********************************************************\
| |
| hprose |
| |
| Official WebSite: http://www.hprose.com/ |
| http://www.hprose.org/ |
| |
\**********************************************************/
/**********************************************************\
* *
* io/array_decoder.go *
* *
* hprose array decoder for Go. *
* *
* LastModified: Oct 25, 2016 *
* Author: Ma Bingyao <andot@hprose.com> *
* *
\**********************************************************/
package io
import (
"errors"
"reflect"
"unsafe"
"github.com/hprose/hprose-golang/util"
)
func readBytesAsArray(r *Reader, v reflect.Value) {
if !r.Simple {
setReaderRef(r, v)
}
if v.Type().Elem().Kind() != reflect.Uint8 {
panic(errors.New("cannot be converted []byte to " + v.Type().String()))
}
n := v.Len()
sliceHeader := reflect.SliceHeader{
Data: (*emptyInterface)(unsafe.Pointer(&v)).ptr,
Len: n,
Cap: n,
}
b := *(*[]byte)(unsafe.Pointer(&sliceHeader))
l := r.readLength()
min := util.Min(n, l)
if _, err := r.Read(b[:min]); err != nil {
panic(err)
}
if l > min {
r.Next(l - min)
}
r.readByte()
}
func readListAsArray(r *Reader, v reflect.Value) {
n := v.Len()
l := r.ReadCount()
if !r.Simple {
setReaderRef(r, v)
}
min := util.Min(n, l)
for i := 0; i < min; i++ {
r.ReadValue(v.Index(i))
}
if min < l {
x := reflect.New(v.Type().Elem()).Elem()
for i := min; i < l; i++ {
r.ReadValue(x)
}
}
r.readByte()
}
func readRefAsArray(r *Reader, v reflect.Value) {
ref := r.readRef()
if b, ok := ref.([]byte); ok {
reflect.Copy(v, reflect.ValueOf(b))
return
}
if a, ok := ref.(reflect.Value); ok {
reflect.Copy(v, a)
return
}
panic(errors.New("value of type " +
reflect.TypeOf(ref).String() +
" cannot be converted to type array"))
}
var arrayDecoders = [256]func(r *Reader, v reflect.Value){
TagNull: nilDecoder,
TagEmpty: nilDecoder,
TagBytes: readBytesAsArray,
TagList: readListAsArray,
TagRef: readRefAsArray,
}
func arrayDecoder(r *Reader, v reflect.Value, tag byte) {
decoder := arrayDecoders[tag]
if decoder != nil {
decoder(r, v)
return
}
castError(tag, v.Type().String())
}
Go
1
https://gitee.com/andot/hprose-go.git
git@gitee.com:andot/hprose-go.git
andot
hprose-go
hprose-go
v2.0.4

搜索帮助