You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pack.go 1.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Copyright (c) 2017 Couchbase, Inc.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package vellum
  15. func deltaAddr(base, trans uint64) uint64 {
  16. // transition dest of 0 is special case
  17. if trans == 0 {
  18. return 0
  19. }
  20. return base - trans
  21. }
  22. const packOutMask = 1<<4 - 1
  23. func encodePackSize(transSize, outSize int) byte {
  24. var rv byte
  25. rv = byte(transSize << 4)
  26. rv |= byte(outSize)
  27. return rv
  28. }
  29. func decodePackSize(pack byte) (transSize int, packSize int) {
  30. transSize = int(pack >> 4)
  31. packSize = int(pack & packOutMask)
  32. return
  33. }
  34. const maxNumTrans = 1<<6 - 1
  35. func encodeNumTrans(n int) byte {
  36. if n <= maxNumTrans {
  37. return byte(n)
  38. }
  39. return 0
  40. }
  41. func readPackedUint(data []byte) (rv uint64) {
  42. for i := range data {
  43. shifted := uint64(data[i]) << uint(i*8)
  44. rv |= shifted
  45. }
  46. return
  47. }