github.com/cloudwego/dynamicgo@v0.2.6-0.20240519101509-707f41b6b834/proto/binary/binary_skip.go (about)

     1  package binary
     2  
     3  import (
     4  	"github.com/cloudwego/dynamicgo/proto"
     5  	"github.com/cloudwego/dynamicgo/proto/protowire"
     6  )
     7  
     8  func (p *BinaryProtocol) SkipFixed32Type() (int, error) {
     9  	_, err := p.next(4)
    10  	return 4, err
    11  }
    12  
    13  func (p *BinaryProtocol) SkipFixed64Type() (int, error) {
    14  	_, err := p.next(8)
    15  	return 8, err
    16  }
    17  
    18  func (p *BinaryProtocol) SkipBytesType() (int, error) {
    19  	v, n := protowire.ConsumeVarint((p.Buf)[p.Read:])
    20  	if n < 0 {
    21  		return n, errDecodeField
    22  	}
    23  	all := int(v) + n
    24  	_, err := p.next(all)
    25  	return all, err
    26  }
    27  
    28  // skip (L)V once by wireType, useNative is not implemented
    29  func (p *BinaryProtocol) Skip(wireType proto.WireType, useNative bool) (err error) {
    30  	switch wireType {
    31  	case proto.VarintType:
    32  		_, err = p.ReadVarint()
    33  	case proto.Fixed32Type:
    34  		_, err = p.SkipFixed32Type() // the same as p.ReadFixed32Type() but without slice bytes
    35  	case proto.Fixed64Type:
    36  		_, err = p.SkipFixed64Type() // the same as p.ReadFixed64Type() but without slice bytes
    37  	case proto.BytesType:
    38  		_, err = p.SkipBytesType() // the same as p.ReadBytesType() but without slice bytes
    39  	}
    40  	return
    41  }
    42  
    43  // fast skip all elements in LIST/MAP
    44  func (p *BinaryProtocol) SkipAllElements(fieldNumber proto.FieldNumber, ispacked bool) (size int, err error) {
    45  	size = 0
    46  	if ispacked {
    47  		if _, _, _, err := p.ConsumeTag(); err != nil {
    48  			return -1, err
    49  		}
    50  		bytelen, err := p.ReadLength()
    51  		if err != nil {
    52  			return -1, err
    53  		}
    54  		start := p.Read
    55  		for p.Read < start+int(bytelen) {
    56  			if _, err := p.ReadVarint(); err != nil {
    57  				return -1, err
    58  			}
    59  			size++
    60  		}
    61  	} else {
    62  		for p.Read < len(p.Buf) {
    63  			elementFieldNumber, ewt, n, err := p.ConsumeTagWithoutMove()
    64  			if err != nil {
    65  				return -1, err
    66  			}
    67  			if elementFieldNumber != fieldNumber {
    68  				break
    69  			}
    70  			if _, moveTagErr := p.next(n); moveTagErr != nil {
    71  				return -1, moveTagErr
    72  			}
    73  			if err = p.Skip(ewt, false); err != nil {
    74  				return -1, err
    75  			}
    76  			size++
    77  		}
    78  	}
    79  
    80  	return size, nil
    81  }