// Code generated by fidlgen; DO NOT EDIT.

package table

import (
	_bindings "syscall/zx/fidl"
)

type EmptyTable struct {
	_             struct{} `fidl:"t" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData interface{}
}

func (u *EmptyTable) HasUnknownData() bool {
	return u.I_unknownData != nil
}

func (u *EmptyTable) GetUnknownData() map[uint64]_bindings.UnknownData {
	return u.I_unknownData.(map[uint64]_bindings.UnknownData)
}

type SimpleTable struct {
	_             struct{} `fidl:"t" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData interface{}
	X             int64 `fidl_ordinal:"1"`
	XPresent      bool
	Y             int64 `fidl_ordinal:"5"`
	YPresent      bool
}

func (u *SimpleTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *SimpleTable) GetX() int64 {
	return u.X
}

func (u *SimpleTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *SimpleTable) HasX() bool {
	return u.XPresent
}

func (u *SimpleTable) ClearX() {
	u.XPresent = false
}

func (u *SimpleTable) SetY(y int64) {
	u.Y = y
	u.YPresent = true
}

func (u *SimpleTable) GetY() int64 {
	return u.Y
}

func (u *SimpleTable) GetYWithDefault(_default int64) int64 {
	if !u.HasY() {
		return _default
	}
	return u.Y
}

func (u *SimpleTable) HasY() bool {
	return u.YPresent
}

func (u *SimpleTable) ClearY() {
	u.YPresent = false
}

func (u *SimpleTable) HasUnknownData() bool {
	return u.I_unknownData != nil
}

func (u *SimpleTable) GetUnknownData() map[uint64]_bindings.UnknownData {
	return u.I_unknownData.(map[uint64]_bindings.UnknownData)
}

type OlderSimpleTable struct {
	_             struct{} `fidl:"t" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData interface{}
	X             int64 `fidl_ordinal:"1"`
	XPresent      bool
}

func (u *OlderSimpleTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *OlderSimpleTable) GetX() int64 {
	return u.X
}

func (u *OlderSimpleTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *OlderSimpleTable) HasX() bool {
	return u.XPresent
}

func (u *OlderSimpleTable) ClearX() {
	u.XPresent = false
}

func (u *OlderSimpleTable) HasUnknownData() bool {
	return u.I_unknownData != nil
}

func (u *OlderSimpleTable) GetUnknownData() map[uint64]_bindings.UnknownData {
	return u.I_unknownData.(map[uint64]_bindings.UnknownData)
}

type NewerSimpleTable struct {
	_             struct{} `fidl:"t" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData interface{}
	X             int64 `fidl_ordinal:"1"`
	XPresent      bool
	Y             int64 `fidl_ordinal:"5"`
	YPresent      bool
	Z             int64 `fidl_ordinal:"6"`
	ZPresent      bool
}

func (u *NewerSimpleTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *NewerSimpleTable) GetX() int64 {
	return u.X
}

func (u *NewerSimpleTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *NewerSimpleTable) HasX() bool {
	return u.XPresent
}

func (u *NewerSimpleTable) ClearX() {
	u.XPresent = false
}

func (u *NewerSimpleTable) SetY(y int64) {
	u.Y = y
	u.YPresent = true
}

func (u *NewerSimpleTable) GetY() int64 {
	return u.Y
}

func (u *NewerSimpleTable) GetYWithDefault(_default int64) int64 {
	if !u.HasY() {
		return _default
	}
	return u.Y
}

func (u *NewerSimpleTable) HasY() bool {
	return u.YPresent
}

func (u *NewerSimpleTable) ClearY() {
	u.YPresent = false
}

func (u *NewerSimpleTable) SetZ(z int64) {
	u.Z = z
	u.ZPresent = true
}

func (u *NewerSimpleTable) GetZ() int64 {
	return u.Z
}

func (u *NewerSimpleTable) GetZWithDefault(_default int64) int64 {
	if !u.HasZ() {
		return _default
	}
	return u.Z
}

func (u *NewerSimpleTable) HasZ() bool {
	return u.ZPresent
}

func (u *NewerSimpleTable) ClearZ() {
	u.ZPresent = false
}

func (u *NewerSimpleTable) HasUnknownData() bool {
	return u.I_unknownData != nil
}

func (u *NewerSimpleTable) GetUnknownData() map[uint64]_bindings.UnknownData {
	return u.I_unknownData.(map[uint64]_bindings.UnknownData)
}

type ReverseOrdinalTable struct {
	_             struct{} `fidl:"t" fidl_size_v1:"16" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData interface{}
	Z             int64 `fidl_ordinal:"1"`
	ZPresent      bool
	Y             int64 `fidl_ordinal:"2"`
	YPresent      bool
	X             int64 `fidl_ordinal:"3"`
	XPresent      bool
}

func (u *ReverseOrdinalTable) SetZ(z int64) {
	u.Z = z
	u.ZPresent = true
}

func (u *ReverseOrdinalTable) GetZ() int64 {
	return u.Z
}

func (u *ReverseOrdinalTable) GetZWithDefault(_default int64) int64 {
	if !u.HasZ() {
		return _default
	}
	return u.Z
}

func (u *ReverseOrdinalTable) HasZ() bool {
	return u.ZPresent
}

func (u *ReverseOrdinalTable) ClearZ() {
	u.ZPresent = false
}

func (u *ReverseOrdinalTable) SetY(y int64) {
	u.Y = y
	u.YPresent = true
}

func (u *ReverseOrdinalTable) GetY() int64 {
	return u.Y
}

func (u *ReverseOrdinalTable) GetYWithDefault(_default int64) int64 {
	if !u.HasY() {
		return _default
	}
	return u.Y
}

func (u *ReverseOrdinalTable) HasY() bool {
	return u.YPresent
}

func (u *ReverseOrdinalTable) ClearY() {
	u.YPresent = false
}

func (u *ReverseOrdinalTable) SetX(x int64) {
	u.X = x
	u.XPresent = true
}

func (u *ReverseOrdinalTable) GetX() int64 {
	return u.X
}

func (u *ReverseOrdinalTable) GetXWithDefault(_default int64) int64 {
	if !u.HasX() {
		return _default
	}
	return u.X
}

func (u *ReverseOrdinalTable) HasX() bool {
	return u.XPresent
}

func (u *ReverseOrdinalTable) ClearX() {
	u.XPresent = false
}

func (u *ReverseOrdinalTable) HasUnknownData() bool {
	return u.I_unknownData != nil
}

func (u *ReverseOrdinalTable) GetUnknownData() map[uint64]_bindings.UnknownData {
	return u.I_unknownData.(map[uint64]_bindings.UnknownData)
}
