1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
- // Use of this source code is governed by a MIT license found in the LICENSE file.
- package codec
- // All non-std package dependencies related to testing live in this file,
- // so porting to different environment is easy (just update functions).
- import (
- "errors"
- "reflect"
- )
- // --- these functions are used by both benchmarks and tests
- var errDeepEqualNotMatch = errors.New("Not Match")
- func deepEqual(v1, v2 interface{}) (err error) {
- if !reflect.DeepEqual(v1, v2) {
- err = errDeepEqualNotMatch
- }
- return
- }
- func approxDataSize(rv reflect.Value) (sum int) {
- switch rk := rv.Kind(); rk {
- case reflect.Invalid:
- case reflect.Ptr, reflect.Interface:
- sum += int(rv.Type().Size())
- sum += approxDataSize(rv.Elem())
- case reflect.Slice:
- sum += int(rv.Type().Size())
- for j := 0; j < rv.Len(); j++ {
- sum += approxDataSize(rv.Index(j))
- }
- case reflect.String:
- sum += int(rv.Type().Size())
- sum += rv.Len()
- case reflect.Map:
- sum += int(rv.Type().Size())
- for _, mk := range rv.MapKeys() {
- sum += approxDataSize(mk)
- sum += approxDataSize(rv.MapIndex(mk))
- }
- case reflect.Struct:
- //struct size already includes the full data size.
- //sum += int(rv.Type().Size())
- for j := 0; j < rv.NumField(); j++ {
- sum += approxDataSize(rv.Field(j))
- }
- default:
- //pure value types
- sum += int(rv.Type().Size())
- }
- return
- }
|