any_array.go raw

   1  package jsoniter
   2  
   3  import (
   4  	"reflect"
   5  	"unsafe"
   6  )
   7  
   8  type arrayLazyAny struct {
   9  	baseAny
  10  	cfg *frozenConfig
  11  	buf []byte
  12  	err error
  13  }
  14  
  15  func (any *arrayLazyAny) ValueType() ValueType {
  16  	return ArrayValue
  17  }
  18  
  19  func (any *arrayLazyAny) MustBeValid() Any {
  20  	return any
  21  }
  22  
  23  func (any *arrayLazyAny) LastError() error {
  24  	return any.err
  25  }
  26  
  27  func (any *arrayLazyAny) ToBool() bool {
  28  	iter := any.cfg.BorrowIterator(any.buf)
  29  	defer any.cfg.ReturnIterator(iter)
  30  	return iter.ReadArray()
  31  }
  32  
  33  func (any *arrayLazyAny) ToInt() int {
  34  	if any.ToBool() {
  35  		return 1
  36  	}
  37  	return 0
  38  }
  39  
  40  func (any *arrayLazyAny) ToInt32() int32 {
  41  	if any.ToBool() {
  42  		return 1
  43  	}
  44  	return 0
  45  }
  46  
  47  func (any *arrayLazyAny) ToInt64() int64 {
  48  	if any.ToBool() {
  49  		return 1
  50  	}
  51  	return 0
  52  }
  53  
  54  func (any *arrayLazyAny) ToUint() uint {
  55  	if any.ToBool() {
  56  		return 1
  57  	}
  58  	return 0
  59  }
  60  
  61  func (any *arrayLazyAny) ToUint32() uint32 {
  62  	if any.ToBool() {
  63  		return 1
  64  	}
  65  	return 0
  66  }
  67  
  68  func (any *arrayLazyAny) ToUint64() uint64 {
  69  	if any.ToBool() {
  70  		return 1
  71  	}
  72  	return 0
  73  }
  74  
  75  func (any *arrayLazyAny) ToFloat32() float32 {
  76  	if any.ToBool() {
  77  		return 1
  78  	}
  79  	return 0
  80  }
  81  
  82  func (any *arrayLazyAny) ToFloat64() float64 {
  83  	if any.ToBool() {
  84  		return 1
  85  	}
  86  	return 0
  87  }
  88  
  89  func (any *arrayLazyAny) ToString() string {
  90  	return *(*string)(unsafe.Pointer(&any.buf))
  91  }
  92  
  93  func (any *arrayLazyAny) ToVal(val interface{}) {
  94  	iter := any.cfg.BorrowIterator(any.buf)
  95  	defer any.cfg.ReturnIterator(iter)
  96  	iter.ReadVal(val)
  97  }
  98  
  99  func (any *arrayLazyAny) Get(path ...interface{}) Any {
 100  	if len(path) == 0 {
 101  		return any
 102  	}
 103  	switch firstPath := path[0].(type) {
 104  	case int:
 105  		iter := any.cfg.BorrowIterator(any.buf)
 106  		defer any.cfg.ReturnIterator(iter)
 107  		valueBytes := locateArrayElement(iter, firstPath)
 108  		if valueBytes == nil {
 109  			return newInvalidAny(path)
 110  		}
 111  		iter.ResetBytes(valueBytes)
 112  		return locatePath(iter, path[1:])
 113  	case int32:
 114  		if '*' == firstPath {
 115  			iter := any.cfg.BorrowIterator(any.buf)
 116  			defer any.cfg.ReturnIterator(iter)
 117  			arr := make([]Any, 0)
 118  			iter.ReadArrayCB(func(iter *Iterator) bool {
 119  				found := iter.readAny().Get(path[1:]...)
 120  				if found.ValueType() != InvalidValue {
 121  					arr = append(arr, found)
 122  				}
 123  				return true
 124  			})
 125  			return wrapArray(arr)
 126  		}
 127  		return newInvalidAny(path)
 128  	default:
 129  		return newInvalidAny(path)
 130  	}
 131  }
 132  
 133  func (any *arrayLazyAny) Size() int {
 134  	size := 0
 135  	iter := any.cfg.BorrowIterator(any.buf)
 136  	defer any.cfg.ReturnIterator(iter)
 137  	iter.ReadArrayCB(func(iter *Iterator) bool {
 138  		size++
 139  		iter.Skip()
 140  		return true
 141  	})
 142  	return size
 143  }
 144  
 145  func (any *arrayLazyAny) WriteTo(stream *Stream) {
 146  	stream.Write(any.buf)
 147  }
 148  
 149  func (any *arrayLazyAny) GetInterface() interface{} {
 150  	iter := any.cfg.BorrowIterator(any.buf)
 151  	defer any.cfg.ReturnIterator(iter)
 152  	return iter.Read()
 153  }
 154  
 155  type arrayAny struct {
 156  	baseAny
 157  	val reflect.Value
 158  }
 159  
 160  func wrapArray(val interface{}) *arrayAny {
 161  	return &arrayAny{baseAny{}, reflect.ValueOf(val)}
 162  }
 163  
 164  func (any *arrayAny) ValueType() ValueType {
 165  	return ArrayValue
 166  }
 167  
 168  func (any *arrayAny) MustBeValid() Any {
 169  	return any
 170  }
 171  
 172  func (any *arrayAny) LastError() error {
 173  	return nil
 174  }
 175  
 176  func (any *arrayAny) ToBool() bool {
 177  	return any.val.Len() != 0
 178  }
 179  
 180  func (any *arrayAny) ToInt() int {
 181  	if any.val.Len() == 0 {
 182  		return 0
 183  	}
 184  	return 1
 185  }
 186  
 187  func (any *arrayAny) ToInt32() int32 {
 188  	if any.val.Len() == 0 {
 189  		return 0
 190  	}
 191  	return 1
 192  }
 193  
 194  func (any *arrayAny) ToInt64() int64 {
 195  	if any.val.Len() == 0 {
 196  		return 0
 197  	}
 198  	return 1
 199  }
 200  
 201  func (any *arrayAny) ToUint() uint {
 202  	if any.val.Len() == 0 {
 203  		return 0
 204  	}
 205  	return 1
 206  }
 207  
 208  func (any *arrayAny) ToUint32() uint32 {
 209  	if any.val.Len() == 0 {
 210  		return 0
 211  	}
 212  	return 1
 213  }
 214  
 215  func (any *arrayAny) ToUint64() uint64 {
 216  	if any.val.Len() == 0 {
 217  		return 0
 218  	}
 219  	return 1
 220  }
 221  
 222  func (any *arrayAny) ToFloat32() float32 {
 223  	if any.val.Len() == 0 {
 224  		return 0
 225  	}
 226  	return 1
 227  }
 228  
 229  func (any *arrayAny) ToFloat64() float64 {
 230  	if any.val.Len() == 0 {
 231  		return 0
 232  	}
 233  	return 1
 234  }
 235  
 236  func (any *arrayAny) ToString() string {
 237  	str, _ := MarshalToString(any.val.Interface())
 238  	return str
 239  }
 240  
 241  func (any *arrayAny) Get(path ...interface{}) Any {
 242  	if len(path) == 0 {
 243  		return any
 244  	}
 245  	switch firstPath := path[0].(type) {
 246  	case int:
 247  		if firstPath < 0 || firstPath >= any.val.Len() {
 248  			return newInvalidAny(path)
 249  		}
 250  		return Wrap(any.val.Index(firstPath).Interface())
 251  	case int32:
 252  		if '*' == firstPath {
 253  			mappedAll := make([]Any, 0)
 254  			for i := 0; i < any.val.Len(); i++ {
 255  				mapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...)
 256  				if mapped.ValueType() != InvalidValue {
 257  					mappedAll = append(mappedAll, mapped)
 258  				}
 259  			}
 260  			return wrapArray(mappedAll)
 261  		}
 262  		return newInvalidAny(path)
 263  	default:
 264  		return newInvalidAny(path)
 265  	}
 266  }
 267  
 268  func (any *arrayAny) Size() int {
 269  	return any.val.Len()
 270  }
 271  
 272  func (any *arrayAny) WriteTo(stream *Stream) {
 273  	stream.WriteVal(any.val)
 274  }
 275  
 276  func (any *arrayAny) GetInterface() interface{} {
 277  	return any.val.Interface()
 278  }
 279