github.com/urso/go-structform@v0.0.2/ubjson/visitor.go (about) 1 package ubjson 2 3 import ( 4 "encoding/binary" 5 "io" 6 "math" 7 "strconv" 8 9 structform "github.com/urso/go-structform" 10 ) 11 12 type Visitor struct { 13 w writer 14 scratch [16]byte 15 16 length lengthStack 17 } 18 19 type writer struct { 20 out io.Writer 21 } 22 23 var _ structform.ExtVisitor = &Visitor{} 24 25 const ( 26 maxUint = ^uint(0) 27 maxInt = int(maxUint >> 1) 28 isUint64 = maxUint > math.MaxUint32 29 isInt64 = maxInt > math.MaxInt32 30 ) 31 32 func (w writer) write(b []byte) error { 33 _, err := w.out.Write(b) 34 return err 35 } 36 37 func NewVisitor(out io.Writer) *Visitor { 38 v := &Visitor{w: writer{out}} 39 v.length.stack = v.length.stack0[:0] 40 return v 41 } 42 43 func (vs *Visitor) writeByte(b byte) error { 44 vs.scratch[0] = b 45 return vs.w.write(vs.scratch[:1]) 46 } 47 48 func (vs *Visitor) optionalCount(l int) error { 49 vs.length.push(int64(l)) 50 51 if l <= 0 { 52 // don't add size if array is empty or size is unknown 53 return nil 54 } 55 56 if err := vs.writeByte(countMarker); err != nil { 57 return err 58 } 59 return vs.writeLen(l) 60 } 61 62 func (vs *Visitor) OnObjectStart(l int, _ structform.BaseType) error { 63 // TODO: add typed object support in case of values being passed one by one 64 65 // if number of elements is known, add size 66 if err := vs.writeByte(objStartMarker); err != nil { 67 return err 68 } 69 70 return vs.optionalCount(l) 71 } 72 73 func (vs *Visitor) OnObjectFinished() error { 74 if vs.length.pop() <= 0 { 75 return vs.writeByte(objEndMarker) 76 } 77 return nil 78 } 79 80 func (vs *Visitor) OnKey(s string) error { 81 return vs.string(str2Bytes(s), false) 82 } 83 84 func (vs *Visitor) OnKeyRef(s []byte) error { 85 return vs.string(s, false) 86 } 87 88 func (vs *Visitor) OnArrayStart(l int, t structform.BaseType) error { 89 // TODO: optimize array by computing type tag 90 91 if err := vs.writeByte(arrStartMarker); err != nil { 92 return err 93 } 94 95 // if array size is known, add at least size 96 return vs.optionalCount(l) 97 } 98 99 func (vs *Visitor) OnArrayFinished() error { 100 if vs.length.pop() <= 0 { 101 return vs.writeByte(arrEndMarker) 102 } 103 return nil 104 } 105 106 func (vs *Visitor) writeLen(l int) error { 107 return vs.onInt(l, true) 108 } 109 110 func (vs *Visitor) OnStringRef(s []byte) error { 111 if len(s) == 0 { 112 return vs.string(nil, true) 113 } 114 return vs.string(s, true) 115 } 116 117 func (vs *Visitor) OnString(s string) error { 118 if len(s) == 0 { 119 return vs.string(nil, true) 120 } 121 return vs.string(str2Bytes(s), true) 122 } 123 124 func (vs *Visitor) string(s []byte, marker bool) error { 125 if marker { 126 if err := vs.writeByte(stringMarker); err != nil { 127 return err 128 } 129 } 130 131 L := len(s) 132 if err := vs.writeLen(L); err != nil { 133 return err 134 } 135 if L == 0 { 136 return nil 137 } 138 return vs.w.write(s) 139 } 140 141 func (vs *Visitor) OnBool(b bool) error { 142 if b { 143 return vs.writeByte(trueMarker) 144 } 145 return vs.writeByte(falseMarker) 146 } 147 148 func (vs *Visitor) OnNil() error { 149 return vs.writeByte(nullMarker) 150 } 151 152 // int 153 154 func (vs *Visitor) OnInt8(i int8) error { 155 return vs.int8(i, true) 156 } 157 158 func (vs *Visitor) int8(i int8, marker bool) error { 159 if marker { 160 if err := vs.writeByte(int8Marker); err != nil { 161 return err 162 } 163 } 164 return vs.writeByte(byte(i)) 165 } 166 167 func (vs *Visitor) OnInt16(i int16) error { 168 if math.MinInt8 <= i && i <= math.MaxInt8 { 169 return vs.int8(int8(i), true) 170 } 171 return vs.int16(i, true) 172 } 173 174 func (vs *Visitor) int16(i int16, marker bool) error { 175 if marker { 176 if err := vs.writeByte(int16Marker); err != nil { 177 return err 178 } 179 } 180 binary.BigEndian.PutUint16(vs.scratch[:2], uint16(i)) 181 return vs.w.write(vs.scratch[:2]) 182 } 183 184 func (vs *Visitor) OnInt32(i int32) error { 185 if math.MinInt16 <= i && i <= math.MaxInt16 { 186 return vs.OnInt16(int16(i)) 187 } 188 return vs.int32(i, true) 189 } 190 191 func (vs *Visitor) int32(i int32, marker bool) error { 192 if marker { 193 if err := vs.writeByte(int32Marker); err != nil { 194 return err 195 } 196 } 197 binary.BigEndian.PutUint32(vs.scratch[:4], uint32(i)) 198 return vs.w.write(vs.scratch[:4]) 199 } 200 201 func (vs *Visitor) OnInt64(i int64) error { 202 if math.MinInt32 <= i && i <= math.MaxInt32 { 203 return vs.OnInt32(int32(i)) 204 } 205 return vs.int64(i, true) 206 } 207 208 func (vs *Visitor) int64(i int64, marker bool) error { 209 if marker { 210 if err := vs.writeByte(int64Marker); err != nil { 211 return err 212 } 213 } 214 binary.BigEndian.PutUint64(vs.scratch[:8], uint64(i)) 215 return vs.w.write(vs.scratch[:8]) 216 } 217 218 func (vs *Visitor) OnInt(i int) error { 219 return vs.onInt(i, true) 220 } 221 222 func (vs *Visitor) onInt(i int, marker bool) error { 223 switch { 224 case math.MinInt8 <= i && i <= math.MaxInt8: 225 return vs.int8(int8(i), marker) 226 case 0 <= i && i <= math.MaxUint8: 227 return vs.uint8(uint8(i), marker) 228 case math.MinInt16 <= i && i <= math.MaxInt16: 229 return vs.int16(int16(i), marker) 230 case math.MinInt32 <= i && i <= math.MaxInt32: 231 return vs.int32(int32(i), marker) 232 default: 233 return vs.int64(int64(i), marker) 234 } 235 } 236 237 func (vs *Visitor) OnByte(b byte) error { 238 vs.scratch[0] = charMarker 239 vs.scratch[1] = b 240 return vs.w.write(vs.scratch[:2]) 241 } 242 243 // uint 244 245 func (vs *Visitor) OnUint8(u uint8) error { 246 return vs.uint8(u, true) 247 } 248 249 func (vs *Visitor) uint8(u uint8, marker bool) error { 250 if marker { 251 vs.scratch[0], vs.scratch[1] = uint8Marker, u 252 return vs.w.write(vs.scratch[:2]) 253 } 254 return vs.writeByte(u) 255 } 256 257 func (vs *Visitor) OnUint16(u uint16) error { 258 return vs.OnUint64(uint64(u)) 259 } 260 261 func (vs *Visitor) OnUint32(u uint32) error { 262 return vs.OnUint64(uint64(u)) 263 } 264 265 func (vs *Visitor) OnUint64(u uint64) error { 266 return vs.uint64(u, uintType(u), true) 267 } 268 269 func (vs *Visitor) uint64(u uint64, t byte, marker bool) error { 270 switch t { 271 case int8Marker: 272 return vs.int8(int8(u), marker) 273 case uint8Marker: 274 return vs.uint8(uint8(u), marker) 275 case int16Marker: 276 return vs.int16(int16(u), marker) 277 case int32Marker: 278 return vs.int32(int32(u), marker) 279 case int64Marker: 280 return vs.int64(int64(u), marker) 281 default: 282 return vs.uint64HighPrec(u, marker) 283 } 284 } 285 286 func (vs *Visitor) uint64HighPrec(u uint64, marker bool) error { 287 if marker { 288 if err := vs.writeByte(highPrecMarker); err != nil { 289 return err 290 } 291 } 292 293 b := strconv.AppendUint(vs.scratch[:0], u, 10) 294 if err := vs.writeLen(len(b)); err != nil { 295 return err 296 } 297 return vs.w.write(b) 298 } 299 300 func (vs *Visitor) OnUint(u uint) error { 301 return vs.OnUint64(uint64(u)) 302 } 303 304 // float 305 306 func (vs *Visitor) OnFloat32(f float32) error { 307 return vs.float32(f, true) 308 } 309 310 func (vs *Visitor) float32(f float32, marker bool) error { 311 if marker { 312 if err := vs.writeByte(float32Marker); err != nil { 313 return err 314 } 315 } 316 317 bits := math.Float32bits(f) 318 binary.BigEndian.PutUint32(vs.scratch[:4], bits) 319 return vs.w.write(vs.scratch[:4]) 320 } 321 322 func (vs *Visitor) OnFloat64(f float64) error { 323 return vs.float64(f, true) 324 } 325 326 func (vs *Visitor) float64(f float64, marker bool) error { 327 if marker { 328 if err := vs.writeByte(float64Marker); err != nil { 329 return err 330 } 331 } 332 333 bits := math.Float64bits(f) 334 binary.BigEndian.PutUint64(vs.scratch[:8], bits) 335 return vs.w.write(vs.scratch[:8]) 336 } 337 338 // specialize array encoders 339 340 func (vs *Visitor) onTypedStruct(s, t byte, count int) error { 341 vs.scratch[0] = s 342 vs.scratch[1] = typeMarker 343 vs.scratch[2] = t 344 vs.scratch[3] = countMarker 345 346 if err := vs.w.write(vs.scratch[:4]); err != nil { 347 return err 348 } 349 return vs.writeLen(count) 350 351 } 352 353 func (vs *Visitor) onArray(t byte, count int) error { 354 return vs.onTypedStruct(arrStartMarker, t, count) 355 } 356 357 func (vs *Visitor) OnStringArray(a []string) error { 358 if done, err := vs.onEmptyArray(len(a)); done { 359 return err 360 } 361 362 if err := vs.onArray(stringMarker, len(a)); err != nil { 363 return err 364 } 365 for _, v := range a { 366 if err := vs.string(str2Bytes(v), false); err != nil { 367 return err 368 } 369 } 370 return nil 371 } 372 373 func (vs *Visitor) OnBoolArray(a []bool) error { 374 // no special encoding for boolean arrays => fall back to per element encoding 375 376 if err := vs.OnArrayStart(len(a), structform.AnyType); err != nil { 377 return err 378 } 379 for _, b := range a { 380 if err := vs.OnBool(b); err != nil { 381 return err 382 } 383 } 384 return nil 385 } 386 387 func (vs *Visitor) OnInt8Array(a []int8) error { 388 if done, err := vs.onEmptyArray(len(a)); done { 389 return err 390 } 391 392 if err := vs.onArray(int8Marker, len(a)); err != nil { 393 return err 394 } 395 for _, v := range a { 396 if err := vs.int8(v, false); err != nil { 397 return err 398 } 399 } 400 return nil 401 } 402 403 func (vs *Visitor) OnInt16Array(a []int16) error { 404 if done, err := vs.onEmptyArray(len(a)); done { 405 return err 406 } 407 408 if err := vs.onArray(int16Marker, len(a)); err != nil { 409 return err 410 } 411 for _, v := range a { 412 if err := vs.int16(v, false); err != nil { 413 return err 414 } 415 } 416 return nil 417 } 418 419 func (vs *Visitor) OnInt32Array(a []int32) error { 420 if done, err := vs.onEmptyArray(len(a)); done { 421 return err 422 } 423 424 if err := vs.onArray(int32Marker, len(a)); err != nil { 425 return err 426 } 427 for _, v := range a { 428 if err := vs.int32(v, false); err != nil { 429 return err 430 } 431 } 432 return nil 433 } 434 435 func (vs *Visitor) OnInt64Array(a []int64) error { 436 if done, err := vs.onEmptyArray(len(a)); done { 437 return err 438 } 439 440 if err := vs.onArray(int64Marker, len(a)); err != nil { 441 return err 442 } 443 for _, v := range a { 444 if err := vs.int64(v, false); err != nil { 445 return err 446 } 447 } 448 return nil 449 } 450 451 func (vs *Visitor) OnIntArray(a []int) error { 452 if done, err := vs.onEmptyArray(len(a)); done { 453 return err 454 } 455 456 marker := int32Marker 457 if isInt64 { 458 marker = int64Marker 459 } 460 461 if err := vs.onArray(marker, len(a)); err != nil { 462 return err 463 } 464 for _, v := range a { 465 var err error 466 467 if isInt64 { 468 err = vs.int64(int64(v), false) 469 } else { 470 err = vs.int32(int32(v), false) 471 } 472 473 if err != nil { 474 return err 475 } 476 } 477 478 return nil 479 } 480 481 func (vs *Visitor) OnBytes(a []byte) error { 482 if done, err := vs.onEmptyArray(len(a)); done { 483 return err 484 } 485 486 if err := vs.onArray(uint8Marker, len(a)); err != nil { 487 return err 488 } 489 490 for _, v := range a { 491 if err := vs.uint8(v, false); err != nil { 492 return err 493 } 494 } 495 return nil 496 497 } 498 499 func (vs *Visitor) OnUint8Array(a []uint8) error { 500 if done, err := vs.onEmptyArray(len(a)); done { 501 return err 502 } 503 504 if err := vs.onArray(uint8Marker, len(a)); err != nil { 505 return err 506 } 507 for _, v := range a { 508 if err := vs.uint8(v, false); err != nil { 509 return err 510 } 511 } 512 return nil 513 } 514 515 func (vs *Visitor) OnUint16Array(a []uint16) error { 516 if done, err := vs.onEmptyArray(len(a)); done { 517 return err 518 } 519 520 // find type: 521 minT := int8Marker 522 for _, v := range a { 523 minT = maxNumType(minT, uintType(uint64(v))) 524 } 525 526 // serialize array 527 if err := vs.onArray(minT, len(a)); err != nil { 528 return err 529 } 530 for _, v := range a { 531 if err := vs.uint64(uint64(v), minT, false); err != nil { 532 return err 533 } 534 } 535 return nil 536 } 537 538 func (vs *Visitor) OnUint32Array(a []uint32) error { 539 if done, err := vs.onEmptyArray(len(a)); done { 540 return err 541 } 542 543 // find type: 544 minT := int8Marker 545 for _, v := range a { 546 minT = maxNumType(minT, uintType(uint64(v))) 547 } 548 549 // serialize array 550 if err := vs.onArray(minT, len(a)); err != nil { 551 return err 552 } 553 for _, v := range a { 554 if err := vs.uint64(uint64(v), minT, false); err != nil { 555 return err 556 } 557 } 558 return nil 559 } 560 561 func (vs *Visitor) OnUint64Array(a []uint64) error { 562 if done, err := vs.onEmptyArray(len(a)); done { 563 return err 564 } 565 566 // find type: 567 minT := int8Marker 568 for _, v := range a { 569 minT = maxNumType(minT, uintType(v)) 570 } 571 572 // serialize array 573 if err := vs.onArray(minT, len(a)); err != nil { 574 return err 575 } 576 for _, v := range a { 577 if err := vs.uint64(v, minT, false); err != nil { 578 return err 579 } 580 } 581 return nil 582 } 583 584 func (vs *Visitor) OnUintArray(a []uint) error { 585 if done, err := vs.onEmptyArray(len(a)); done { 586 return err 587 } 588 589 // find type: 590 minT := int8Marker 591 for _, v := range a { 592 minT = maxNumType(minT, uintType(uint64(v))) 593 } 594 595 // serialize array 596 if err := vs.onArray(minT, len(a)); err != nil { 597 return err 598 } 599 for _, v := range a { 600 if err := vs.uint64(uint64(v), minT, false); err != nil { 601 return err 602 } 603 } 604 return nil 605 } 606 607 func (vs *Visitor) OnFloat32Array(a []float32) error { 608 if done, err := vs.onEmptyArray(len(a)); done { 609 return err 610 } 611 612 if err := vs.onArray(float32Marker, len(a)); err != nil { 613 return err 614 } 615 for _, v := range a { 616 if err := vs.float32(v, false); err != nil { 617 return err 618 } 619 } 620 return nil 621 } 622 623 func (vs *Visitor) OnFloat64Array(a []float64) error { 624 if done, err := vs.onEmptyArray(len(a)); done { 625 return err 626 } 627 628 if err := vs.onArray(float64Marker, len(a)); err != nil { 629 return err 630 } 631 for _, v := range a { 632 if err := vs.float64(v, false); err != nil { 633 return err 634 } 635 } 636 return nil 637 } 638 639 func (vs *Visitor) OnStringObject(m map[string]string) error { 640 if done, err := vs.onEmptyObject(len(m)); done { 641 return err 642 } 643 if err := vs.onObject(stringMarker, len(m)); err != nil { 644 return err 645 } 646 for k, v := range m { 647 if err := vs.string(str2Bytes(k), false); err != nil { 648 return err 649 } 650 if err := vs.string(str2Bytes(v), false); err != nil { 651 return err 652 } 653 } 654 655 return nil 656 } 657 658 func (vs *Visitor) OnBoolObject(m map[string]bool) error { 659 if done, err := vs.onEmptyObject(len(m)); done { 660 return err 661 } 662 if err := vs.optionalCount(len(m)); err != nil { 663 return err 664 } 665 666 for k, v := range m { 667 if err := vs.string(str2Bytes(k), false); err != nil { 668 return err 669 } 670 if err := vs.OnBool(v); err != nil { 671 return err 672 } 673 } 674 675 return nil 676 } 677 678 func (vs *Visitor) OnInt8Object(m map[string]int8) error { 679 if done, err := vs.onEmptyObject(len(m)); done { 680 return err 681 } 682 if err := vs.onObject(int8Marker, len(m)); err != nil { 683 return err 684 } 685 for k, v := range m { 686 if err := vs.string(str2Bytes(k), false); err != nil { 687 return err 688 } 689 if err := vs.int8(v, false); err != nil { 690 return err 691 } 692 } 693 694 return nil 695 } 696 697 func (vs *Visitor) OnInt16Object(m map[string]int16) error { 698 if done, err := vs.onEmptyObject(len(m)); done { 699 return err 700 } 701 if err := vs.onObject(int16Marker, len(m)); err != nil { 702 return err 703 } 704 for k, v := range m { 705 if err := vs.string(str2Bytes(k), false); err != nil { 706 return err 707 } 708 if err := vs.int16(v, false); err != nil { 709 return err 710 } 711 } 712 713 return nil 714 } 715 716 func (vs *Visitor) OnInt32Object(m map[string]int32) error { 717 if done, err := vs.onEmptyObject(len(m)); done { 718 return err 719 } 720 if err := vs.onObject(int32Marker, len(m)); err != nil { 721 return err 722 } 723 for k, v := range m { 724 if err := vs.string(str2Bytes(k), false); err != nil { 725 return err 726 } 727 if err := vs.int32(v, false); err != nil { 728 return err 729 } 730 } 731 732 return nil 733 } 734 735 func (vs *Visitor) OnInt64Object(m map[string]int64) error { 736 if done, err := vs.onEmptyObject(len(m)); done { 737 return err 738 } 739 740 if err := vs.onObject(int64Marker, len(m)); err != nil { 741 return err 742 } 743 for k, v := range m { 744 if err := vs.string(str2Bytes(k), false); err != nil { 745 return err 746 } 747 if err := vs.int64(v, false); err != nil { 748 return err 749 } 750 } 751 752 return nil 753 } 754 755 func (vs *Visitor) OnIntObject(m map[string]int) error { 756 if done, err := vs.onEmptyObject(len(m)); done { 757 return err 758 } 759 760 marker := int32Marker 761 if isInt64 { 762 marker = int64Marker 763 } 764 765 if err := vs.onObject(marker, len(m)); err != nil { 766 return err 767 } 768 for k, v := range m { 769 var err error 770 if err = vs.string(str2Bytes(k), false); err != nil { 771 return err 772 } 773 if isInt64 { 774 err = vs.int64(int64(v), false) 775 } else { 776 err = vs.int32(int32(v), false) 777 } 778 if err != nil { 779 return err 780 } 781 } 782 783 return nil 784 } 785 786 func (vs *Visitor) OnUint8Object(m map[string]uint8) error { 787 if done, err := vs.onEmptyObject(len(m)); done { 788 return err 789 } 790 791 if err := vs.onObject(uint8Marker, len(m)); err != nil { 792 return err 793 } 794 for k, v := range m { 795 if err := vs.string(str2Bytes(k), false); err != nil { 796 return err 797 } 798 if err := vs.uint8(v, false); err != nil { 799 return err 800 } 801 } 802 803 return nil 804 } 805 806 func (vs *Visitor) OnUint16Object(m map[string]uint16) error { 807 if done, err := vs.onEmptyObject(len(m)); done { 808 return err 809 } 810 811 // find type: 812 minT := int8Marker 813 for _, v := range m { 814 minT = maxNumType(minT, uintType(uint64(v))) 815 } 816 817 //serialize object 818 if err := vs.onObject(minT, len(m)); err != nil { 819 return err 820 } 821 for k, v := range m { 822 if err := vs.string(str2Bytes(k), false); err != nil { 823 return err 824 } 825 if err := vs.uint64(uint64(v), minT, false); err != nil { 826 return err 827 } 828 } 829 830 return nil 831 } 832 833 func (vs *Visitor) OnUint32Object(m map[string]uint32) error { 834 if done, err := vs.onEmptyObject(len(m)); done { 835 return err 836 } 837 838 // find type: 839 minT := int8Marker 840 for _, v := range m { 841 minT = maxNumType(minT, uintType(uint64(v))) 842 } 843 844 //serialize object 845 if err := vs.onObject(minT, len(m)); err != nil { 846 return err 847 } 848 for k, v := range m { 849 if err := vs.string(str2Bytes(k), false); err != nil { 850 return err 851 } 852 if err := vs.uint64(uint64(v), minT, false); err != nil { 853 return err 854 } 855 } 856 857 return nil 858 } 859 860 func (vs *Visitor) OnUint64Object(m map[string]uint64) error { 861 if done, err := vs.onEmptyObject(len(m)); done { 862 return err 863 } 864 865 // find type: 866 minT := int8Marker 867 for _, v := range m { 868 minT = maxNumType(minT, uintType(uint64(v))) 869 } 870 871 //serialize object 872 if err := vs.onObject(minT, len(m)); err != nil { 873 return err 874 } 875 for k, v := range m { 876 if err := vs.string(str2Bytes(k), false); err != nil { 877 return err 878 } 879 if err := vs.uint64(uint64(v), minT, false); err != nil { 880 return err 881 } 882 } 883 884 return nil 885 } 886 887 func (vs *Visitor) OnUintObject(m map[string]uint) error { 888 if done, err := vs.onEmptyObject(len(m)); done { 889 return err 890 } 891 892 // find type: 893 minT := int8Marker 894 for _, v := range m { 895 minT = maxNumType(minT, uintType(uint64(v))) 896 } 897 898 //serialize object 899 if err := vs.onObject(minT, len(m)); err != nil { 900 return err 901 } 902 for k, v := range m { 903 if err := vs.string(str2Bytes(k), false); err != nil { 904 return err 905 } 906 if err := vs.uint64(uint64(v), minT, false); err != nil { 907 return err 908 } 909 } 910 911 return nil 912 } 913 914 func (vs *Visitor) OnFloat32Object(m map[string]float32) error { 915 if done, err := vs.onEmptyObject(len(m)); done { 916 return err 917 } 918 if err := vs.onObject(float32Marker, len(m)); err != nil { 919 return err 920 } 921 for k, v := range m { 922 if err := vs.string(str2Bytes(k), false); err != nil { 923 return err 924 } 925 if err := vs.float32(v, false); err != nil { 926 return err 927 } 928 } 929 930 return nil 931 } 932 933 func (vs *Visitor) OnFloat64Object(m map[string]float64) error { 934 if done, err := vs.onEmptyObject(len(m)); done { 935 return err 936 } 937 938 if err := vs.onObject(float64Marker, len(m)); err != nil { 939 return err 940 } 941 for k, v := range m { 942 if err := vs.string(str2Bytes(k), false); err != nil { 943 return err 944 } 945 if err := vs.float64(v, false); err != nil { 946 return err 947 } 948 } 949 950 return nil 951 } 952 953 func (vs *Visitor) onEmptyArray(l int) (bool, error) { 954 if l > 0 { 955 return false, nil 956 } 957 958 vs.scratch[0], vs.scratch[1] = arrStartMarker, arrEndMarker 959 return true, vs.w.write(vs.scratch[:2]) 960 } 961 962 func (vs *Visitor) onEmptyObject(l int) (bool, error) { 963 if l > 0 { 964 return false, nil 965 } 966 967 vs.scratch[0], vs.scratch[1] = objStartMarker, objEndMarker 968 return true, vs.w.write(vs.scratch[:2]) 969 } 970 971 func (vs *Visitor) onObject(marker byte, count int) error { 972 return vs.onTypedStruct(objStartMarker, marker, count) 973 } 974 975 func maxNumType(a, b byte) byte { 976 switch { 977 case a == highPrecMarker || b == highPrecMarker: 978 return highPrecMarker 979 case a == int64Marker || b == int64Marker: 980 return int64Marker 981 case a == int32Marker || b == int32Marker: 982 return int32Marker 983 case a == int16Marker || b == int16Marker: 984 return int16Marker 985 case a == uint8Marker || b == uint8Marker: 986 return uint8Marker 987 default: 988 return int8Marker 989 } 990 } 991 992 func uintType(u uint64) byte { 993 switch { 994 case u <= math.MaxInt8: 995 return int8Marker 996 case u <= math.MaxUint8: 997 return uint8Marker 998 case u <= math.MaxInt16: 999 return int16Marker 1000 case u <= math.MaxInt32: 1001 return int32Marker 1002 case u <= math.MaxInt64: 1003 return int64Marker 1004 default: 1005 return highPrecMarker 1006 } 1007 }