bufferhelper.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. package util
  2. import (
  3. "bufio"
  4. "bytes"
  5. "encoding/binary"
  6. "io"
  7. "math"
  8. )
  9. func readBool(r *bytes.Buffer, data *bool) error {
  10. b, err := r.ReadByte()
  11. if err != nil {
  12. return err
  13. }
  14. *data = b != 0
  15. return nil
  16. }
  17. func readInt8(r *bytes.Buffer, data *int8) error {
  18. b, err := r.ReadByte()
  19. if err != nil {
  20. return err
  21. }
  22. *data = int8(b)
  23. return nil
  24. }
  25. func readUint8(r *bytes.Buffer, data *uint8) error {
  26. b, err := r.ReadByte()
  27. if err != nil {
  28. return err
  29. }
  30. *data = uint8(b)
  31. return nil
  32. }
  33. func readInt16(r *bytes.Buffer, data *int16) error {
  34. order := binary.LittleEndian
  35. var b [2]byte
  36. bs := b[:]
  37. _, err := readFull(r, bs)
  38. if err != nil {
  39. return err
  40. }
  41. *data = int16(order.Uint16(bs))
  42. return nil
  43. }
  44. func readUint16(r *bytes.Buffer, data *uint16) error {
  45. order := binary.LittleEndian
  46. var b [2]byte
  47. bs := b[:]
  48. _, err := readFull(r, bs)
  49. if err != nil {
  50. return err
  51. }
  52. *data = order.Uint16(bs)
  53. return nil
  54. }
  55. func readInt(r *bytes.Buffer, data *int) error {
  56. order := binary.LittleEndian
  57. var b [4]byte
  58. bs := b[:]
  59. _, err := readFull(r, bs)
  60. if err != nil {
  61. return err
  62. }
  63. *data = int(int32(order.Uint32(bs)))
  64. return nil
  65. }
  66. func readInt32(r *bytes.Buffer, data *int32) error {
  67. order := binary.LittleEndian
  68. var b [4]byte
  69. bs := b[:]
  70. _, err := readFull(r, bs)
  71. if err != nil {
  72. return err
  73. }
  74. *data = int32(order.Uint32(bs))
  75. return nil
  76. }
  77. func readUint(r *bytes.Buffer, data *uint) error {
  78. order := binary.LittleEndian
  79. var b [4]byte
  80. bs := b[:]
  81. _, err := readFull(r, bs)
  82. if err != nil {
  83. return err
  84. }
  85. *data = uint(order.Uint32(bs))
  86. return nil
  87. }
  88. func readUint32(r *bytes.Buffer, data *uint32) error {
  89. order := binary.LittleEndian
  90. var b [4]byte
  91. bs := b[:]
  92. _, err := readFull(r, bs)
  93. if err != nil {
  94. return err
  95. }
  96. *data = order.Uint32(bs)
  97. return nil
  98. }
  99. func readInt64(r *bytes.Buffer, data *int64) error {
  100. order := binary.LittleEndian
  101. var b [8]byte
  102. bs := b[:]
  103. _, err := readFull(r, bs)
  104. if err != nil {
  105. return err
  106. }
  107. *data = int64(order.Uint64(bs))
  108. return nil
  109. }
  110. func readUint64(r *bytes.Buffer, data *uint64) error {
  111. order := binary.LittleEndian
  112. var b [8]byte
  113. bs := b[:]
  114. _, err := readFull(r, bs)
  115. if err != nil {
  116. return err
  117. }
  118. *data = order.Uint64(bs)
  119. return nil
  120. }
  121. func readFloat32(r *bytes.Buffer, data *float32) error {
  122. order := binary.LittleEndian
  123. var b [4]byte
  124. bs := b[:]
  125. _, err := readFull(r, bs)
  126. if err != nil {
  127. return err
  128. }
  129. *data = math.Float32frombits(order.Uint32(bs))
  130. return nil
  131. }
  132. func readFloat64(r *bytes.Buffer, data *float64) error {
  133. order := binary.LittleEndian
  134. var b [8]byte
  135. bs := b[:]
  136. _, err := readFull(r, bs)
  137. if err != nil {
  138. return err
  139. }
  140. *data = math.Float64frombits(order.Uint64(bs))
  141. return nil
  142. }
  143. func readBuffBool(r *bufio.Reader, data *bool) error {
  144. b, err := r.ReadByte()
  145. if err != nil {
  146. return err
  147. }
  148. *data = b != 0
  149. return nil
  150. }
  151. func readBuffInt8(r *bufio.Reader, data *int8) error {
  152. b, err := r.ReadByte()
  153. if err != nil {
  154. return err
  155. }
  156. *data = int8(b)
  157. return nil
  158. }
  159. func readBuffUint8(r *bufio.Reader, data *uint8) error {
  160. b, err := r.ReadByte()
  161. if err != nil {
  162. return err
  163. }
  164. *data = uint8(b)
  165. return nil
  166. }
  167. func readBuffInt16(r *bufio.Reader, data *int16) error {
  168. order := binary.LittleEndian
  169. var b [2]byte
  170. bs := b[:]
  171. _, err := readBuffFull(r, bs)
  172. if err != nil {
  173. return err
  174. }
  175. *data = int16(order.Uint16(bs))
  176. return nil
  177. }
  178. func readBuffUint16(r *bufio.Reader, data *uint16) error {
  179. order := binary.LittleEndian
  180. var b [2]byte
  181. bs := b[:]
  182. _, err := readBuffFull(r, bs)
  183. if err != nil {
  184. return err
  185. }
  186. *data = order.Uint16(bs)
  187. return nil
  188. }
  189. func readBuffInt(r *bufio.Reader, data *int) error {
  190. order := binary.LittleEndian
  191. var b [4]byte
  192. bs := b[:]
  193. _, err := readBuffFull(r, bs)
  194. if err != nil {
  195. return err
  196. }
  197. *data = int(int32(order.Uint32(bs)))
  198. return nil
  199. }
  200. func readBuffInt32(r *bufio.Reader, data *int32) error {
  201. order := binary.LittleEndian
  202. var b [4]byte
  203. bs := b[:]
  204. _, err := readBuffFull(r, bs)
  205. if err != nil {
  206. return err
  207. }
  208. *data = int32(order.Uint32(bs))
  209. return nil
  210. }
  211. func readBuffUint(r *bufio.Reader, data *uint) error {
  212. order := binary.LittleEndian
  213. var b [4]byte
  214. bs := b[:]
  215. _, err := readBuffFull(r, bs)
  216. if err != nil {
  217. return err
  218. }
  219. *data = uint(order.Uint32(bs))
  220. return nil
  221. }
  222. func readBuffUint32(r *bufio.Reader, data *uint32) error {
  223. order := binary.LittleEndian
  224. var b [4]byte
  225. bs := b[:]
  226. _, err := readBuffFull(r, bs)
  227. if err != nil {
  228. return err
  229. }
  230. *data = order.Uint32(bs)
  231. return nil
  232. }
  233. func readBuffInt64(r *bufio.Reader, data *int64) error {
  234. order := binary.LittleEndian
  235. var b [8]byte
  236. bs := b[:]
  237. _, err := readBuffFull(r, bs)
  238. if err != nil {
  239. return err
  240. }
  241. *data = int64(order.Uint64(bs))
  242. return nil
  243. }
  244. func readBuffUint64(r *bufio.Reader, data *uint64) error {
  245. order := binary.LittleEndian
  246. var b [8]byte
  247. bs := b[:]
  248. _, err := readBuffFull(r, bs)
  249. if err != nil {
  250. return err
  251. }
  252. *data = order.Uint64(bs)
  253. return nil
  254. }
  255. func readBuffFloat32(r *bufio.Reader, data *float32) error {
  256. order := binary.LittleEndian
  257. var b [4]byte
  258. bs := b[:]
  259. _, err := readBuffFull(r, bs)
  260. if err != nil {
  261. return err
  262. }
  263. *data = math.Float32frombits(order.Uint32(bs))
  264. return nil
  265. }
  266. func readBuffFloat64(r *bufio.Reader, data *float64) error {
  267. order := binary.LittleEndian
  268. var b [8]byte
  269. bs := b[:]
  270. _, err := readBuffFull(r, bs)
  271. if err != nil {
  272. return err
  273. }
  274. *data = math.Float64frombits(order.Uint64(bs))
  275. return nil
  276. }
  277. // read full is a bufio.Reader specific implementation of io.ReadFull() which
  278. // avoids escaping our stack allocated scratch bytes
  279. func readBuffFull(r *bufio.Reader, buf []byte) (n int, err error) {
  280. min := len(buf)
  281. for n < min && err == nil {
  282. var nn int
  283. nn, err = r.Read(buf[n:])
  284. n += nn
  285. }
  286. if n >= min {
  287. err = nil
  288. } else if n > 0 && err == io.EOF {
  289. err = io.ErrUnexpectedEOF
  290. }
  291. return
  292. }
  293. // read full is a bytes.Buffer specific implementation of io.ReadFull() which
  294. // avoids escaping our stack allocated scratch bytes
  295. func readFull(r *bytes.Buffer, buf []byte) (n int, err error) {
  296. min := len(buf)
  297. for n < min && err == nil {
  298. var nn int
  299. nn, err = r.Read(buf[n:])
  300. n += nn
  301. }
  302. if n >= min {
  303. err = nil
  304. } else if n > 0 && err == io.EOF {
  305. err = io.ErrUnexpectedEOF
  306. }
  307. return
  308. }
  309. func writeBool(w *bytes.Buffer, data bool) error {
  310. if data {
  311. return w.WriteByte(1)
  312. }
  313. return w.WriteByte(0)
  314. }
  315. func writeInt8(w *bytes.Buffer, data int8) error {
  316. return w.WriteByte(byte(data))
  317. }
  318. func writeUint8(w *bytes.Buffer, data uint8) error {
  319. return w.WriteByte(byte(data))
  320. }
  321. func writeInt16(w *bytes.Buffer, data int16) error {
  322. var b [2]byte
  323. bs := b[:]
  324. binary.LittleEndian.PutUint16(bs, uint16(data))
  325. _, err := w.Write(bs)
  326. return err
  327. }
  328. func writeUint16(w *bytes.Buffer, data uint16) error {
  329. var b [2]byte
  330. bs := b[:]
  331. binary.LittleEndian.PutUint16(bs, data)
  332. _, err := w.Write(bs)
  333. return err
  334. }
  335. func writeInt32(w *bytes.Buffer, data int32) error {
  336. var b [4]byte
  337. bs := b[:]
  338. binary.LittleEndian.PutUint32(bs, uint32(data))
  339. _, err := w.Write(bs)
  340. return err
  341. }
  342. func writeUint32(w *bytes.Buffer, data uint32) error {
  343. var b [4]byte
  344. bs := b[:]
  345. binary.LittleEndian.PutUint32(bs, data)
  346. _, err := w.Write(bs)
  347. return err
  348. }
  349. func writeInt(w *bytes.Buffer, data int) error {
  350. var b [4]byte
  351. bs := b[:]
  352. binary.LittleEndian.PutUint32(bs, uint32(int32(data)))
  353. _, err := w.Write(bs)
  354. return err
  355. }
  356. func writeUint(w *bytes.Buffer, data uint) error {
  357. var b [4]byte
  358. bs := b[:]
  359. binary.LittleEndian.PutUint32(bs, uint32(data))
  360. _, err := w.Write(bs)
  361. return err
  362. }
  363. func writeInt64(w *bytes.Buffer, data int64) error {
  364. var b [8]byte
  365. bs := b[:]
  366. binary.LittleEndian.PutUint64(bs, uint64(data))
  367. _, err := w.Write(bs)
  368. return err
  369. }
  370. func writeUint64(w *bytes.Buffer, data uint64) error {
  371. var b [8]byte
  372. bs := b[:]
  373. binary.LittleEndian.PutUint64(bs, data)
  374. _, err := w.Write(bs)
  375. return err
  376. }
  377. func writeFloat32(w *bytes.Buffer, data float32) error {
  378. var b [4]byte
  379. bs := b[:]
  380. binary.LittleEndian.PutUint32(bs, math.Float32bits(data))
  381. _, err := w.Write(bs)
  382. return err
  383. }
  384. func writeFloat64(w *bytes.Buffer, data float64) error {
  385. var b [8]byte
  386. bs := b[:]
  387. binary.LittleEndian.PutUint64(bs, math.Float64bits(data))
  388. _, err := w.Write(bs)
  389. return err
  390. }
  391. func writeBuffBool(w *bufio.Writer, data bool) error {
  392. if data {
  393. return w.WriteByte(1)
  394. }
  395. return w.WriteByte(0)
  396. }
  397. func writeBuffInt8(w *bufio.Writer, data int8) error {
  398. return w.WriteByte(byte(data))
  399. }
  400. func writeBuffUint8(w *bufio.Writer, data uint8) error {
  401. return w.WriteByte(byte(data))
  402. }
  403. func writeBuffInt16(w *bufio.Writer, data int16) error {
  404. var b [2]byte
  405. bs := b[:]
  406. binary.LittleEndian.PutUint16(bs, uint16(data))
  407. _, err := w.Write(bs)
  408. return err
  409. }
  410. func writeBuffUint16(w *bufio.Writer, data uint16) error {
  411. var b [2]byte
  412. bs := b[:]
  413. binary.LittleEndian.PutUint16(bs, data)
  414. _, err := w.Write(bs)
  415. return err
  416. }
  417. func writeBuffInt32(w *bufio.Writer, data int32) error {
  418. var b [4]byte
  419. bs := b[:]
  420. binary.LittleEndian.PutUint32(bs, uint32(data))
  421. _, err := w.Write(bs)
  422. return err
  423. }
  424. func writeBuffUint32(w *bufio.Writer, data uint32) error {
  425. var b [4]byte
  426. bs := b[:]
  427. binary.LittleEndian.PutUint32(bs, data)
  428. _, err := w.Write(bs)
  429. return err
  430. }
  431. func writeBuffInt(w *bufio.Writer, data int) error {
  432. var b [4]byte
  433. bs := b[:]
  434. binary.LittleEndian.PutUint32(bs, uint32(int32(data)))
  435. _, err := w.Write(bs)
  436. return err
  437. }
  438. func writeBuffUint(w *bufio.Writer, data uint) error {
  439. var b [4]byte
  440. bs := b[:]
  441. binary.LittleEndian.PutUint32(bs, uint32(data))
  442. _, err := w.Write(bs)
  443. return err
  444. }
  445. func writeBuffInt64(w *bufio.Writer, data int64) error {
  446. var b [8]byte
  447. bs := b[:]
  448. binary.LittleEndian.PutUint64(bs, uint64(data))
  449. _, err := w.Write(bs)
  450. return err
  451. }
  452. func writeBuffUint64(w *bufio.Writer, data uint64) error {
  453. var b [8]byte
  454. bs := b[:]
  455. binary.LittleEndian.PutUint64(bs, data)
  456. _, err := w.Write(bs)
  457. return err
  458. }
  459. func writeBuffFloat32(w *bufio.Writer, data float32) error {
  460. var b [4]byte
  461. bs := b[:]
  462. binary.LittleEndian.PutUint32(bs, math.Float32bits(data))
  463. _, err := w.Write(bs)
  464. return err
  465. }
  466. func writeBuffFloat64(w *bufio.Writer, data float64) error {
  467. var b [8]byte
  468. bs := b[:]
  469. binary.LittleEndian.PutUint64(bs, math.Float64bits(data))
  470. _, err := w.Write(bs)
  471. return err
  472. }