mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-27 03:55:36 +00:00
f8f9f05ffe
This PR modifies viewTypeForContainerType to use the last type parameter of a container type as the value type, enabling the implementation of map-like container types where the second-to-last (usually first) type parameter serves as the key type. It also adds a MapContainer type to test the code generation. Updates #12736 Signed-off-by: Nick Khyl <nickk@tailscale.com>
679 lines
23 KiB
Go
679 lines
23 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
// Code generated by tailscale/cmd/viewer; DO NOT EDIT.
|
|
|
|
package tests
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"net/netip"
|
|
|
|
"golang.org/x/exp/constraints"
|
|
"tailscale.com/types/views"
|
|
)
|
|
|
|
//go:generate go run tailscale.com/cmd/cloner -clonefunc=false -type=StructWithPtrs,StructWithoutPtrs,Map,StructWithSlices,OnlyGetClone,StructWithEmbedded,GenericIntStruct,GenericNoPtrsStruct,GenericCloneableStruct,StructWithContainers
|
|
|
|
// View returns a readonly view of StructWithPtrs.
|
|
func (p *StructWithPtrs) View() StructWithPtrsView {
|
|
return StructWithPtrsView{ж: p}
|
|
}
|
|
|
|
// StructWithPtrsView provides a read-only view over StructWithPtrs.
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type StructWithPtrsView struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *StructWithPtrs
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v StructWithPtrsView) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v StructWithPtrsView) AsStruct() *StructWithPtrs {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v StructWithPtrsView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *StructWithPtrsView) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x StructWithPtrs
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v StructWithPtrsView) Value() *StructWithoutPtrs {
|
|
if v.ж.Value == nil {
|
|
return nil
|
|
}
|
|
x := *v.ж.Value
|
|
return &x
|
|
}
|
|
|
|
func (v StructWithPtrsView) Int() *int {
|
|
if v.ж.Int == nil {
|
|
return nil
|
|
}
|
|
x := *v.ж.Int
|
|
return &x
|
|
}
|
|
|
|
func (v StructWithPtrsView) NoCloneValue() *StructWithoutPtrs { return v.ж.NoCloneValue }
|
|
func (v StructWithPtrsView) String() string { return v.ж.String() }
|
|
func (v StructWithPtrsView) Equal(v2 StructWithPtrsView) bool { return v.ж.Equal(v2.ж) }
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
var _StructWithPtrsViewNeedsRegeneration = StructWithPtrs(struct {
|
|
Value *StructWithoutPtrs
|
|
Int *int
|
|
NoCloneValue *StructWithoutPtrs
|
|
}{})
|
|
|
|
// View returns a readonly view of StructWithoutPtrs.
|
|
func (p *StructWithoutPtrs) View() StructWithoutPtrsView {
|
|
return StructWithoutPtrsView{ж: p}
|
|
}
|
|
|
|
// StructWithoutPtrsView provides a read-only view over StructWithoutPtrs.
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type StructWithoutPtrsView struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *StructWithoutPtrs
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v StructWithoutPtrsView) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v StructWithoutPtrsView) AsStruct() *StructWithoutPtrs {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v StructWithoutPtrsView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *StructWithoutPtrsView) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x StructWithoutPtrs
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v StructWithoutPtrsView) Int() int { return v.ж.Int }
|
|
func (v StructWithoutPtrsView) Pfx() netip.Prefix { return v.ж.Pfx }
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
var _StructWithoutPtrsViewNeedsRegeneration = StructWithoutPtrs(struct {
|
|
Int int
|
|
Pfx netip.Prefix
|
|
}{})
|
|
|
|
// View returns a readonly view of Map.
|
|
func (p *Map) View() MapView {
|
|
return MapView{ж: p}
|
|
}
|
|
|
|
// MapView provides a read-only view over Map.
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type MapView struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *Map
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v MapView) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v MapView) AsStruct() *Map {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v MapView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *MapView) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x Map
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v MapView) Int() views.Map[string, int] { return views.MapOf(v.ж.Int) }
|
|
|
|
func (v MapView) SliceInt() views.MapSlice[string, int] { return views.MapSliceOf(v.ж.SliceInt) }
|
|
|
|
func (v MapView) StructPtrWithPtr() views.MapFn[string, *StructWithPtrs, StructWithPtrsView] {
|
|
return views.MapFnOf(v.ж.StructPtrWithPtr, func(t *StructWithPtrs) StructWithPtrsView {
|
|
return t.View()
|
|
})
|
|
}
|
|
|
|
func (v MapView) StructPtrWithoutPtr() views.MapFn[string, *StructWithoutPtrs, StructWithoutPtrsView] {
|
|
return views.MapFnOf(v.ж.StructPtrWithoutPtr, func(t *StructWithoutPtrs) StructWithoutPtrsView {
|
|
return t.View()
|
|
})
|
|
}
|
|
|
|
func (v MapView) StructWithoutPtr() views.Map[string, StructWithoutPtrs] {
|
|
return views.MapOf(v.ж.StructWithoutPtr)
|
|
}
|
|
|
|
func (v MapView) SlicesWithPtrs() views.MapFn[string, []*StructWithPtrs, views.SliceView[*StructWithPtrs, StructWithPtrsView]] {
|
|
return views.MapFnOf(v.ж.SlicesWithPtrs, func(t []*StructWithPtrs) views.SliceView[*StructWithPtrs, StructWithPtrsView] {
|
|
return views.SliceOfViews[*StructWithPtrs, StructWithPtrsView](t)
|
|
})
|
|
}
|
|
|
|
func (v MapView) SlicesWithoutPtrs() views.MapFn[string, []*StructWithoutPtrs, views.SliceView[*StructWithoutPtrs, StructWithoutPtrsView]] {
|
|
return views.MapFnOf(v.ж.SlicesWithoutPtrs, func(t []*StructWithoutPtrs) views.SliceView[*StructWithoutPtrs, StructWithoutPtrsView] {
|
|
return views.SliceOfViews[*StructWithoutPtrs, StructWithoutPtrsView](t)
|
|
})
|
|
}
|
|
|
|
func (v MapView) StructWithoutPtrKey() views.Map[StructWithoutPtrs, int] {
|
|
return views.MapOf(v.ж.StructWithoutPtrKey)
|
|
}
|
|
|
|
func (v MapView) StructWithPtr() views.MapFn[string, StructWithPtrs, StructWithPtrsView] {
|
|
return views.MapFnOf(v.ж.StructWithPtr, func(t StructWithPtrs) StructWithPtrsView {
|
|
return t.View()
|
|
})
|
|
}
|
|
func (v MapView) SliceIntPtr() map[string][]*int { panic("unsupported") }
|
|
func (v MapView) PointerKey() map[*string]int { panic("unsupported") }
|
|
func (v MapView) StructWithPtrKey() map[StructWithPtrs]int { panic("unsupported") }
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
var _MapViewNeedsRegeneration = Map(struct {
|
|
Int map[string]int
|
|
SliceInt map[string][]int
|
|
StructPtrWithPtr map[string]*StructWithPtrs
|
|
StructPtrWithoutPtr map[string]*StructWithoutPtrs
|
|
StructWithoutPtr map[string]StructWithoutPtrs
|
|
SlicesWithPtrs map[string][]*StructWithPtrs
|
|
SlicesWithoutPtrs map[string][]*StructWithoutPtrs
|
|
StructWithoutPtrKey map[StructWithoutPtrs]int
|
|
StructWithPtr map[string]StructWithPtrs
|
|
SliceIntPtr map[string][]*int
|
|
PointerKey map[*string]int
|
|
StructWithPtrKey map[StructWithPtrs]int
|
|
}{})
|
|
|
|
// View returns a readonly view of StructWithSlices.
|
|
func (p *StructWithSlices) View() StructWithSlicesView {
|
|
return StructWithSlicesView{ж: p}
|
|
}
|
|
|
|
// StructWithSlicesView provides a read-only view over StructWithSlices.
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type StructWithSlicesView struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *StructWithSlices
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v StructWithSlicesView) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v StructWithSlicesView) AsStruct() *StructWithSlices {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v StructWithSlicesView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *StructWithSlicesView) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x StructWithSlices
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v StructWithSlicesView) Values() views.Slice[StructWithoutPtrs] {
|
|
return views.SliceOf(v.ж.Values)
|
|
}
|
|
func (v StructWithSlicesView) ValuePointers() views.SliceView[*StructWithoutPtrs, StructWithoutPtrsView] {
|
|
return views.SliceOfViews[*StructWithoutPtrs, StructWithoutPtrsView](v.ж.ValuePointers)
|
|
}
|
|
func (v StructWithSlicesView) StructPointers() views.SliceView[*StructWithPtrs, StructWithPtrsView] {
|
|
return views.SliceOfViews[*StructWithPtrs, StructWithPtrsView](v.ж.StructPointers)
|
|
}
|
|
func (v StructWithSlicesView) Slice() views.Slice[string] { return views.SliceOf(v.ж.Slice) }
|
|
func (v StructWithSlicesView) Prefixes() views.Slice[netip.Prefix] {
|
|
return views.SliceOf(v.ж.Prefixes)
|
|
}
|
|
func (v StructWithSlicesView) Data() views.ByteSlice[[]byte] { return views.ByteSliceOf(v.ж.Data) }
|
|
func (v StructWithSlicesView) Structs() StructWithPtrs { panic("unsupported") }
|
|
func (v StructWithSlicesView) Ints() *int { panic("unsupported") }
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
var _StructWithSlicesViewNeedsRegeneration = StructWithSlices(struct {
|
|
Values []StructWithoutPtrs
|
|
ValuePointers []*StructWithoutPtrs
|
|
StructPointers []*StructWithPtrs
|
|
Slice []string
|
|
Prefixes []netip.Prefix
|
|
Data []byte
|
|
Structs []StructWithPtrs
|
|
Ints []*int
|
|
}{})
|
|
|
|
// View returns a readonly view of StructWithEmbedded.
|
|
func (p *StructWithEmbedded) View() StructWithEmbeddedView {
|
|
return StructWithEmbeddedView{ж: p}
|
|
}
|
|
|
|
// StructWithEmbeddedView provides a read-only view over StructWithEmbedded.
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type StructWithEmbeddedView struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *StructWithEmbedded
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v StructWithEmbeddedView) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v StructWithEmbeddedView) AsStruct() *StructWithEmbedded {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v StructWithEmbeddedView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *StructWithEmbeddedView) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x StructWithEmbedded
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v StructWithEmbeddedView) A() StructWithPtrsView { return v.ж.A.View() }
|
|
func (v StructWithEmbeddedView) StructWithSlices() StructWithSlicesView {
|
|
return v.ж.StructWithSlices.View()
|
|
}
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
var _StructWithEmbeddedViewNeedsRegeneration = StructWithEmbedded(struct {
|
|
A *StructWithPtrs
|
|
StructWithSlices
|
|
}{})
|
|
|
|
// View returns a readonly view of GenericIntStruct.
|
|
func (p *GenericIntStruct[T]) View() GenericIntStructView[T] {
|
|
return GenericIntStructView[T]{ж: p}
|
|
}
|
|
|
|
// GenericIntStructView[T] provides a read-only view over GenericIntStruct[T].
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type GenericIntStructView[T constraints.Integer] struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *GenericIntStruct[T]
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v GenericIntStructView[T]) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v GenericIntStructView[T]) AsStruct() *GenericIntStruct[T] {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v GenericIntStructView[T]) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *GenericIntStructView[T]) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x GenericIntStruct[T]
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v GenericIntStructView[T]) Value() T { return v.ж.Value }
|
|
func (v GenericIntStructView[T]) Pointer() *T {
|
|
if v.ж.Pointer == nil {
|
|
return nil
|
|
}
|
|
x := *v.ж.Pointer
|
|
return &x
|
|
}
|
|
|
|
func (v GenericIntStructView[T]) Slice() views.Slice[T] { return views.SliceOf(v.ж.Slice) }
|
|
|
|
func (v GenericIntStructView[T]) Map() views.Map[string, T] { return views.MapOf(v.ж.Map) }
|
|
func (v GenericIntStructView[T]) PtrSlice() *T { panic("unsupported") }
|
|
func (v GenericIntStructView[T]) PtrKeyMap() map[*T]string { panic("unsupported") }
|
|
func (v GenericIntStructView[T]) PtrValueMap() map[string]*T { panic("unsupported") }
|
|
func (v GenericIntStructView[T]) SliceMap() map[string][]T { panic("unsupported") }
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
func _GenericIntStructViewNeedsRegeneration[T constraints.Integer](GenericIntStruct[T]) {
|
|
_GenericIntStructViewNeedsRegeneration(struct {
|
|
Value T
|
|
Pointer *T
|
|
Slice []T
|
|
Map map[string]T
|
|
PtrSlice []*T
|
|
PtrKeyMap map[*T]string `json:"-"`
|
|
PtrValueMap map[string]*T
|
|
SliceMap map[string][]T
|
|
}{})
|
|
}
|
|
|
|
// View returns a readonly view of GenericNoPtrsStruct.
|
|
func (p *GenericNoPtrsStruct[T]) View() GenericNoPtrsStructView[T] {
|
|
return GenericNoPtrsStructView[T]{ж: p}
|
|
}
|
|
|
|
// GenericNoPtrsStructView[T] provides a read-only view over GenericNoPtrsStruct[T].
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type GenericNoPtrsStructView[T StructWithoutPtrs | netip.Prefix | BasicType] struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *GenericNoPtrsStruct[T]
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v GenericNoPtrsStructView[T]) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v GenericNoPtrsStructView[T]) AsStruct() *GenericNoPtrsStruct[T] {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v GenericNoPtrsStructView[T]) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *GenericNoPtrsStructView[T]) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x GenericNoPtrsStruct[T]
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v GenericNoPtrsStructView[T]) Value() T { return v.ж.Value }
|
|
func (v GenericNoPtrsStructView[T]) Pointer() *T {
|
|
if v.ж.Pointer == nil {
|
|
return nil
|
|
}
|
|
x := *v.ж.Pointer
|
|
return &x
|
|
}
|
|
|
|
func (v GenericNoPtrsStructView[T]) Slice() views.Slice[T] { return views.SliceOf(v.ж.Slice) }
|
|
|
|
func (v GenericNoPtrsStructView[T]) Map() views.Map[string, T] { return views.MapOf(v.ж.Map) }
|
|
func (v GenericNoPtrsStructView[T]) PtrSlice() *T { panic("unsupported") }
|
|
func (v GenericNoPtrsStructView[T]) PtrKeyMap() map[*T]string { panic("unsupported") }
|
|
func (v GenericNoPtrsStructView[T]) PtrValueMap() map[string]*T { panic("unsupported") }
|
|
func (v GenericNoPtrsStructView[T]) SliceMap() map[string][]T { panic("unsupported") }
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
func _GenericNoPtrsStructViewNeedsRegeneration[T StructWithoutPtrs | netip.Prefix | BasicType](GenericNoPtrsStruct[T]) {
|
|
_GenericNoPtrsStructViewNeedsRegeneration(struct {
|
|
Value T
|
|
Pointer *T
|
|
Slice []T
|
|
Map map[string]T
|
|
PtrSlice []*T
|
|
PtrKeyMap map[*T]string `json:"-"`
|
|
PtrValueMap map[string]*T
|
|
SliceMap map[string][]T
|
|
}{})
|
|
}
|
|
|
|
// View returns a readonly view of GenericCloneableStruct.
|
|
func (p *GenericCloneableStruct[T, V]) View() GenericCloneableStructView[T, V] {
|
|
return GenericCloneableStructView[T, V]{ж: p}
|
|
}
|
|
|
|
// GenericCloneableStructView[T, V] provides a read-only view over GenericCloneableStruct[T, V].
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type GenericCloneableStructView[T views.ViewCloner[T, V], V views.StructView[T]] struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *GenericCloneableStruct[T, V]
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v GenericCloneableStructView[T, V]) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v GenericCloneableStructView[T, V]) AsStruct() *GenericCloneableStruct[T, V] {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v GenericCloneableStructView[T, V]) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *GenericCloneableStructView[T, V]) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x GenericCloneableStruct[T, V]
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v GenericCloneableStructView[T, V]) Value() V { return v.ж.Value.View() }
|
|
func (v GenericCloneableStructView[T, V]) Slice() views.SliceView[T, V] {
|
|
return views.SliceOfViews[T, V](v.ж.Slice)
|
|
}
|
|
|
|
func (v GenericCloneableStructView[T, V]) Map() views.MapFn[string, T, V] {
|
|
return views.MapFnOf(v.ж.Map, func(t T) V {
|
|
return t.View()
|
|
})
|
|
}
|
|
func (v GenericCloneableStructView[T, V]) Pointer() map[string]T { panic("unsupported") }
|
|
func (v GenericCloneableStructView[T, V]) PtrSlice() *T { panic("unsupported") }
|
|
func (v GenericCloneableStructView[T, V]) PtrKeyMap() map[*T]string { panic("unsupported") }
|
|
func (v GenericCloneableStructView[T, V]) PtrValueMap() map[string]*T { panic("unsupported") }
|
|
func (v GenericCloneableStructView[T, V]) SliceMap() map[string][]T { panic("unsupported") }
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
func _GenericCloneableStructViewNeedsRegeneration[T views.ViewCloner[T, V], V views.StructView[T]](GenericCloneableStruct[T, V]) {
|
|
_GenericCloneableStructViewNeedsRegeneration(struct {
|
|
Value T
|
|
Slice []T
|
|
Map map[string]T
|
|
Pointer *T
|
|
PtrSlice []*T
|
|
PtrKeyMap map[*T]string `json:"-"`
|
|
PtrValueMap map[string]*T
|
|
SliceMap map[string][]T
|
|
}{})
|
|
}
|
|
|
|
// View returns a readonly view of StructWithContainers.
|
|
func (p *StructWithContainers) View() StructWithContainersView {
|
|
return StructWithContainersView{ж: p}
|
|
}
|
|
|
|
// StructWithContainersView provides a read-only view over StructWithContainers.
|
|
//
|
|
// Its methods should only be called if `Valid()` returns true.
|
|
type StructWithContainersView struct {
|
|
// ж is the underlying mutable value, named with a hard-to-type
|
|
// character that looks pointy like a pointer.
|
|
// It is named distinctively to make you think of how dangerous it is to escape
|
|
// to callers. You must not let callers be able to mutate it.
|
|
ж *StructWithContainers
|
|
}
|
|
|
|
// Valid reports whether underlying value is non-nil.
|
|
func (v StructWithContainersView) Valid() bool { return v.ж != nil }
|
|
|
|
// AsStruct returns a clone of the underlying value which aliases no memory with
|
|
// the original.
|
|
func (v StructWithContainersView) AsStruct() *StructWithContainers {
|
|
if v.ж == nil {
|
|
return nil
|
|
}
|
|
return v.ж.Clone()
|
|
}
|
|
|
|
func (v StructWithContainersView) MarshalJSON() ([]byte, error) { return json.Marshal(v.ж) }
|
|
|
|
func (v *StructWithContainersView) UnmarshalJSON(b []byte) error {
|
|
if v.ж != nil {
|
|
return errors.New("already initialized")
|
|
}
|
|
if len(b) == 0 {
|
|
return nil
|
|
}
|
|
var x StructWithContainers
|
|
if err := json.Unmarshal(b, &x); err != nil {
|
|
return err
|
|
}
|
|
v.ж = &x
|
|
return nil
|
|
}
|
|
|
|
func (v StructWithContainersView) IntContainer() Container[int] { return v.ж.IntContainer }
|
|
func (v StructWithContainersView) CloneableContainer() ContainerView[*StructWithPtrs, StructWithPtrsView] {
|
|
return ContainerViewOf(&v.ж.CloneableContainer)
|
|
}
|
|
func (v StructWithContainersView) BasicGenericContainer() Container[GenericBasicStruct[int]] {
|
|
return v.ж.BasicGenericContainer
|
|
}
|
|
func (v StructWithContainersView) CloneableGenericContainer() ContainerView[*GenericNoPtrsStruct[int], GenericNoPtrsStructView[int]] {
|
|
return ContainerViewOf(&v.ж.CloneableGenericContainer)
|
|
}
|
|
func (v StructWithContainersView) CloneableMap() MapContainerView[int, *StructWithPtrs, StructWithPtrsView] {
|
|
return MapContainerViewOf(&v.ж.CloneableMap)
|
|
}
|
|
func (v StructWithContainersView) CloneableGenericMap() MapContainerView[int, *GenericNoPtrsStruct[int], GenericNoPtrsStructView[int]] {
|
|
return MapContainerViewOf(&v.ж.CloneableGenericMap)
|
|
}
|
|
|
|
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
|
var _StructWithContainersViewNeedsRegeneration = StructWithContainers(struct {
|
|
IntContainer Container[int]
|
|
CloneableContainer Container[*StructWithPtrs]
|
|
BasicGenericContainer Container[GenericBasicStruct[int]]
|
|
CloneableGenericContainer Container[*GenericNoPtrsStruct[int]]
|
|
CloneableMap MapContainer[int, *StructWithPtrs]
|
|
CloneableGenericMap MapContainer[int, *GenericNoPtrsStruct[int]]
|
|
}{})
|