// Read a (length prefixed) byteslice then decode the object using the codec
func decodeByteSlice(codec wire.Codec, r io.Reader, n *int64, err *error) interface{} {
	bytez := wire.ReadByteSlice(r, n, err)
	if *err != nil {
		return nil
	}
	n_ := new(int64)
	return codec.Decode(bytes.NewBuffer(bytez), n_, err)
}
// NOTE: The hash is not saved or set.  The caller should set the hash afterwards.
// (Presumably the caller already has the hash)
func ReadIAVLNode(t *IAVLTree, r io.Reader, n *int64, err *error) *IAVLNode {
	node := &IAVLNode{}

	// node header
	node.height = wire.ReadInt8(r, n, err)
	node.size = wire.ReadVarint(r, n, err)
	node.key = decodeByteSlice(t.keyCodec, r, n, err)

	if node.height == 0 {
		// value
		node.value = decodeByteSlice(t.valueCodec, r, n, err)
	} else {
		// children
		node.leftHash = wire.ReadByteSlice(r, n, err)
		node.rightHash = wire.ReadByteSlice(r, n, err)
	}
	return node
}