// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by the codec package. DO NOT EDIT.

//lint:file-ignore SA1019 go/doc uses *ast.Object, so we must preserve it.

package somepkg

import (
	"golang.org/x/pkgsite/internal/godoc/codec"
)

func encode_slice_slice_int(e *codec.Encoder, s [][]int) {
	if s == nil {
		e.EncodeNil()
		return
	}
	e.StartList(len(s))
	for _, x := range s {
		encode_slice_int(e, x)
	}
}

func decode_slice_slice_int(d *codec.Decoder, p *[][]int) {
	n := d.StartList()
	if n < 0 {
		return
	}
	s := make([][]int, n)
	for i := 0; i < n; i++ {
		decode_slice_int(d, &s[i])
	}
	*p = s
}

func init() {
	codec.Register([][]int(nil),
		func(e *codec.Encoder, x any) { encode_slice_slice_int(e, x.([][]int)) },
		func(d *codec.Decoder) any { var x [][]int; decode_slice_slice_int(d, &x); return x })
}

func encode_slice_int(e *codec.Encoder, s []int) {
	if s == nil {
		e.EncodeNil()
		return
	}
	e.StartList(len(s))
	for _, x := range s {
		e.EncodeInt(int64(x))
	}
}

func decode_slice_int(d *codec.Decoder, p *[]int) {
	n := d.StartList()
	if n < 0 {
		return
	}
	s := make([]int, n)
	for i := 0; i < n; i++ {
		s[i] = int(d.DecodeInt())
	}
	*p = s
}

func init() {
	codec.Register([]int(nil),
		func(e *codec.Encoder, x any) { encode_slice_int(e, x.([]int)) },
		func(d *codec.Decoder) any { var x []int; decode_slice_int(d, &x); return x })
}
