github.com/zerosnake0/jzon@v0.0.9-0.20230801092939-1b135cb83f7f/val_decoder_native_uint.go (about)

     1  package jzon
     2  
     3  import (
     4  	"unsafe"
     5  )
     6  
     7  // uint8 decoder
     8  type uint8Decoder struct {
     9  }
    10  
    11  func (*uint8Decoder) Decode(ptr unsafe.Pointer, it *Iterator, opts *DecOpts) error {
    12  	c, err := it.nextToken()
    13  	if err != nil {
    14  		return err
    15  	}
    16  	if c == 'n' {
    17  		it.head++
    18  		return it.expectBytes("ull")
    19  	}
    20  	quoted := (opts != nil) && (opts.Quoted || opts.MapKey)
    21  	if quoted {
    22  		if c != '"' {
    23  			return UnexpectedByteError{got: c, exp: '"'}
    24  		}
    25  		it.head++
    26  		c, err = it.nextByte()
    27  		if err != nil {
    28  			return err
    29  		}
    30  	}
    31  	it.head++
    32  	i, err := it.readUint8(c)
    33  	if err != nil {
    34  		return err
    35  	}
    36  	if quoted {
    37  		c, err = it.nextByte()
    38  		if err != nil {
    39  			return err
    40  		}
    41  		if c != '"' {
    42  			return UnexpectedByteError{got: c, exp: '"'}
    43  		}
    44  		it.head++
    45  	}
    46  	*(*uint8)(ptr) = i
    47  	return nil
    48  }
    49  
    50  // uint16 decoder
    51  type uint16Decoder struct {
    52  }
    53  
    54  func (*uint16Decoder) Decode(ptr unsafe.Pointer, it *Iterator, opts *DecOpts) error {
    55  	c, err := it.nextToken()
    56  	if err != nil {
    57  		return err
    58  	}
    59  	if c == 'n' {
    60  		it.head++
    61  		return it.expectBytes("ull")
    62  	}
    63  	quoted := (opts != nil) && (opts.Quoted || opts.MapKey)
    64  	if quoted {
    65  		if c != '"' {
    66  			return UnexpectedByteError{got: c, exp: '"'}
    67  		}
    68  		it.head++
    69  		c, err = it.nextByte()
    70  		if err != nil {
    71  			return err
    72  		}
    73  	}
    74  	it.head++
    75  	i, err := it.readUint16(c)
    76  	if err != nil {
    77  		return err
    78  	}
    79  	if quoted {
    80  		c, err = it.nextByte()
    81  		if err != nil {
    82  			return err
    83  		}
    84  		if c != '"' {
    85  			return UnexpectedByteError{got: c, exp: '"'}
    86  		}
    87  		it.head++
    88  	}
    89  	*(*uint16)(ptr) = i
    90  	return nil
    91  }
    92  
    93  // uint32 decoder
    94  type uint32Decoder struct {
    95  }
    96  
    97  func (*uint32Decoder) Decode(ptr unsafe.Pointer, it *Iterator, opts *DecOpts) error {
    98  	c, err := it.nextToken()
    99  	if err != nil {
   100  		return err
   101  	}
   102  	if c == 'n' {
   103  		it.head++
   104  		return it.expectBytes("ull")
   105  	}
   106  	quoted := (opts != nil) && (opts.Quoted || opts.MapKey)
   107  	if quoted {
   108  		if c != '"' {
   109  			return UnexpectedByteError{got: c, exp: '"'}
   110  		}
   111  		it.head++
   112  		c, err = it.nextByte()
   113  		if err != nil {
   114  			return err
   115  		}
   116  	}
   117  	it.head++
   118  	i, err := it.readUint32(c)
   119  	if err != nil {
   120  		return err
   121  	}
   122  	if quoted {
   123  		c, err = it.nextByte()
   124  		if err != nil {
   125  			return err
   126  		}
   127  		if c != '"' {
   128  			return UnexpectedByteError{got: c, exp: '"'}
   129  		}
   130  		it.head++
   131  	}
   132  	*(*uint32)(ptr) = i
   133  	return nil
   134  }
   135  
   136  // uint64 decoder
   137  type uint64Decoder struct {
   138  }
   139  
   140  func (*uint64Decoder) Decode(ptr unsafe.Pointer, it *Iterator, opts *DecOpts) error {
   141  	c, err := it.nextToken()
   142  	if err != nil {
   143  		return err
   144  	}
   145  	if c == 'n' {
   146  		it.head++
   147  		return it.expectBytes("ull")
   148  	}
   149  	quoted := (opts != nil) && (opts.Quoted || opts.MapKey)
   150  	if quoted {
   151  		if c != '"' {
   152  			return UnexpectedByteError{got: c, exp: '"'}
   153  		}
   154  		it.head++
   155  		c, err = it.nextByte()
   156  		if err != nil {
   157  			return err
   158  		}
   159  	}
   160  	it.head++
   161  	i, err := it.readUint64(c)
   162  	if err != nil {
   163  		return err
   164  	}
   165  	if quoted {
   166  		c, err = it.nextByte()
   167  		if err != nil {
   168  			return err
   169  		}
   170  		if c != '"' {
   171  			return UnexpectedByteError{got: c, exp: '"'}
   172  		}
   173  		it.head++
   174  	}
   175  	*(*uint64)(ptr) = i
   176  	return nil
   177  }