tuple.go 966 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package model
  2. import (
  3. "encoding/binary"
  4. "math"
  5. )
  6. const (
  7. _tupleSize = 12
  8. )
  9. // Tuple .
  10. type Tuple struct {
  11. Svid uint64
  12. Score float32
  13. }
  14. // PriorityTuple .
  15. type PriorityTuple struct {
  16. Tuple
  17. Tag string
  18. Name string
  19. Priority int32
  20. }
  21. // ToBytes .
  22. func (t *Tuple) ToBytes() []byte {
  23. b := make([]byte, 12)
  24. b[0] = byte(t.Svid)
  25. b[1] = byte(t.Svid >> 8)
  26. b[2] = byte(t.Svid >> 16)
  27. b[3] = byte(t.Svid >> 24)
  28. b[4] = byte(t.Svid >> 32)
  29. b[5] = byte(t.Svid >> 40)
  30. b[6] = byte(t.Svid >> 48)
  31. b[7] = byte(t.Svid >> 56)
  32. // score
  33. score := math.Float32bits(t.Score)
  34. b[8] = byte(score)
  35. b[9] = byte(score >> 8)
  36. b[10] = byte(score >> 16)
  37. b[11] = byte(score >> 24)
  38. return b
  39. }
  40. // ParseTuple .
  41. func ParseTuple(b []byte) *Tuple {
  42. svid := binary.LittleEndian.Uint64(b[:8])
  43. score := math.Float32frombits(binary.LittleEndian.Uint32(b[8:12]))
  44. return &Tuple{
  45. Svid: svid,
  46. Score: score,
  47. }
  48. }
  49. // TupleSize .
  50. func TupleSize() int {
  51. return _tupleSize
  52. }