vector_xdr.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // Copyright (C) 2015 The Protocol Authors.
  2. package protocol
  3. import "github.com/calmh/xdr"
  4. // This stuff is hacked up manually because genxdr doesn't support 'type
  5. // Vector []Counter' declarations and it was tricky when I tried to add it...
  6. type xdrWriter interface {
  7. WriteUint32(uint32) (int, error)
  8. WriteUint64(uint64) (int, error)
  9. }
  10. type xdrReader interface {
  11. ReadUint32() uint32
  12. ReadUint64() uint64
  13. }
  14. // EncodeXDRInto encodes the vector as an XDR object into the given XDR
  15. // encoder.
  16. func (v Vector) EncodeXDRInto(w xdrWriter) (int, error) {
  17. w.WriteUint32(uint32(len(v)))
  18. for i := range v {
  19. w.WriteUint64(v[i].ID)
  20. w.WriteUint64(v[i].Value)
  21. }
  22. return 4 + 16*len(v), nil
  23. }
  24. // DecodeXDRFrom decodes the XDR objects from the given reader into itself.
  25. func (v *Vector) DecodeXDRFrom(r xdrReader) error {
  26. l := int(r.ReadUint32())
  27. if l > 1e6 {
  28. return xdr.ElementSizeExceeded("number of counters", l, 1e6)
  29. }
  30. n := make(Vector, l)
  31. for i := range n {
  32. n[i].ID = r.ReadUint64()
  33. n[i].Value = r.ReadUint64()
  34. }
  35. *v = n
  36. return nil
  37. }