node.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package maxminddb
  2. type nodeReader interface {
  3. readLeft(uint) uint
  4. readRight(uint) uint
  5. }
  6. type nodeReader24 struct {
  7. buffer []byte
  8. }
  9. func (n nodeReader24) readLeft(nodeNumber uint) uint {
  10. return (uint(n.buffer[nodeNumber]) << 16) |
  11. (uint(n.buffer[nodeNumber+1]) << 8) |
  12. uint(n.buffer[nodeNumber+2])
  13. }
  14. func (n nodeReader24) readRight(nodeNumber uint) uint {
  15. return (uint(n.buffer[nodeNumber+3]) << 16) |
  16. (uint(n.buffer[nodeNumber+4]) << 8) |
  17. uint(n.buffer[nodeNumber+5])
  18. }
  19. type nodeReader28 struct {
  20. buffer []byte
  21. }
  22. func (n nodeReader28) readLeft(nodeNumber uint) uint {
  23. return ((uint(n.buffer[nodeNumber+3]) & 0xF0) << 20) |
  24. (uint(n.buffer[nodeNumber]) << 16) |
  25. (uint(n.buffer[nodeNumber+1]) << 8) |
  26. uint(n.buffer[nodeNumber+2])
  27. }
  28. func (n nodeReader28) readRight(nodeNumber uint) uint {
  29. return ((uint(n.buffer[nodeNumber+3]) & 0x0F) << 24) |
  30. (uint(n.buffer[nodeNumber+4]) << 16) |
  31. (uint(n.buffer[nodeNumber+5]) << 8) |
  32. uint(n.buffer[nodeNumber+6])
  33. }
  34. type nodeReader32 struct {
  35. buffer []byte
  36. }
  37. func (n nodeReader32) readLeft(nodeNumber uint) uint {
  38. return (uint(n.buffer[nodeNumber]) << 24) |
  39. (uint(n.buffer[nodeNumber+1]) << 16) |
  40. (uint(n.buffer[nodeNumber+2]) << 8) |
  41. uint(n.buffer[nodeNumber+3])
  42. }
  43. func (n nodeReader32) readRight(nodeNumber uint) uint {
  44. return (uint(n.buffer[nodeNumber+4]) << 24) |
  45. (uint(n.buffer[nodeNumber+5]) << 16) |
  46. (uint(n.buffer[nodeNumber+6]) << 8) |
  47. uint(n.buffer[nodeNumber+7])
  48. }