// Code generated by Make.  DO NOT EDIT.

package btrfsitem

import (
	"reflect"

	"git.lukeshu.com/go/typedsync"

	"git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsprim"
)

const (
	BLOCK_GROUP_ITEM_KEY     = btrfsprim.BLOCK_GROUP_ITEM_KEY
	CHUNK_ITEM_KEY           = btrfsprim.CHUNK_ITEM_KEY
	DEV_EXTENT_KEY           = btrfsprim.DEV_EXTENT_KEY
	DEV_ITEM_KEY             = btrfsprim.DEV_ITEM_KEY
	DIR_INDEX_KEY            = btrfsprim.DIR_INDEX_KEY
	DIR_ITEM_KEY             = btrfsprim.DIR_ITEM_KEY
	EXTENT_CSUM_KEY          = btrfsprim.EXTENT_CSUM_KEY
	EXTENT_DATA_KEY          = btrfsprim.EXTENT_DATA_KEY
	EXTENT_DATA_REF_KEY      = btrfsprim.EXTENT_DATA_REF_KEY
	EXTENT_ITEM_KEY          = btrfsprim.EXTENT_ITEM_KEY
	FREE_SPACE_BITMAP_KEY    = btrfsprim.FREE_SPACE_BITMAP_KEY
	FREE_SPACE_EXTENT_KEY    = btrfsprim.FREE_SPACE_EXTENT_KEY
	FREE_SPACE_INFO_KEY      = btrfsprim.FREE_SPACE_INFO_KEY
	INODE_ITEM_KEY           = btrfsprim.INODE_ITEM_KEY
	INODE_REF_KEY            = btrfsprim.INODE_REF_KEY
	METADATA_ITEM_KEY        = btrfsprim.METADATA_ITEM_KEY
	ORPHAN_ITEM_KEY          = btrfsprim.ORPHAN_ITEM_KEY
	PERSISTENT_ITEM_KEY      = btrfsprim.PERSISTENT_ITEM_KEY
	QGROUP_INFO_KEY          = btrfsprim.QGROUP_INFO_KEY
	QGROUP_LIMIT_KEY         = btrfsprim.QGROUP_LIMIT_KEY
	QGROUP_RELATION_KEY      = btrfsprim.QGROUP_RELATION_KEY
	QGROUP_STATUS_KEY        = btrfsprim.QGROUP_STATUS_KEY
	ROOT_BACKREF_KEY         = btrfsprim.ROOT_BACKREF_KEY
	ROOT_ITEM_KEY            = btrfsprim.ROOT_ITEM_KEY
	ROOT_REF_KEY             = btrfsprim.ROOT_REF_KEY
	SHARED_BLOCK_REF_KEY     = btrfsprim.SHARED_BLOCK_REF_KEY
	SHARED_DATA_REF_KEY      = btrfsprim.SHARED_DATA_REF_KEY
	TREE_BLOCK_REF_KEY       = btrfsprim.TREE_BLOCK_REF_KEY
	UNTYPED_KEY              = btrfsprim.UNTYPED_KEY
	UUID_RECEIVED_SUBVOL_KEY = btrfsprim.UUID_RECEIVED_SUBVOL_KEY
	UUID_SUBVOL_KEY          = btrfsprim.UUID_SUBVOL_KEY
	XATTR_ITEM_KEY           = btrfsprim.XATTR_ITEM_KEY
)

var (
	blockGroupType      = reflect.TypeOf(BlockGroup{})
	chunkType           = reflect.TypeOf(Chunk{})
	devType             = reflect.TypeOf(Dev{})
	devExtentType       = reflect.TypeOf(DevExtent{})
	devStatsType        = reflect.TypeOf(DevStats{})
	dirEntryType        = reflect.TypeOf(DirEntry{})
	emptyType           = reflect.TypeOf(Empty{})
	extentType          = reflect.TypeOf(Extent{})
	extentCSumType      = reflect.TypeOf(ExtentCSum{})
	extentDataRefType   = reflect.TypeOf(ExtentDataRef{})
	fileExtentType      = reflect.TypeOf(FileExtent{})
	freeSpaceBitmapType = reflect.TypeOf(FreeSpaceBitmap{})
	freeSpaceHeaderType = reflect.TypeOf(FreeSpaceHeader{})
	freeSpaceInfoType   = reflect.TypeOf(FreeSpaceInfo{})
	inodeType           = reflect.TypeOf(Inode{})
	inodeRefsType       = reflect.TypeOf(InodeRefs{})
	metadataType        = reflect.TypeOf(Metadata{})
	qGroupInfoType      = reflect.TypeOf(QGroupInfo{})
	qGroupLimitType     = reflect.TypeOf(QGroupLimit{})
	qGroupStatusType    = reflect.TypeOf(QGroupStatus{})
	rootType            = reflect.TypeOf(Root{})
	rootRefType         = reflect.TypeOf(RootRef{})
	sharedDataRefType   = reflect.TypeOf(SharedDataRef{})
	uuidMapType         = reflect.TypeOf(UUIDMap{})
)

// keytype2gotype is used by UnmarshalItem.
var keytype2gotype = map[Type]reflect.Type{
	BLOCK_GROUP_ITEM_KEY:     blockGroupType,
	CHUNK_ITEM_KEY:           chunkType,
	DEV_EXTENT_KEY:           devExtentType,
	DEV_ITEM_KEY:             devType,
	DIR_INDEX_KEY:            dirEntryType,
	DIR_ITEM_KEY:             dirEntryType,
	EXTENT_CSUM_KEY:          extentCSumType,
	EXTENT_DATA_KEY:          fileExtentType,
	EXTENT_DATA_REF_KEY:      extentDataRefType,
	EXTENT_ITEM_KEY:          extentType,
	FREE_SPACE_BITMAP_KEY:    freeSpaceBitmapType,
	FREE_SPACE_EXTENT_KEY:    emptyType,
	FREE_SPACE_INFO_KEY:      freeSpaceInfoType,
	INODE_ITEM_KEY:           inodeType,
	INODE_REF_KEY:            inodeRefsType,
	METADATA_ITEM_KEY:        metadataType,
	ORPHAN_ITEM_KEY:          emptyType,
	PERSISTENT_ITEM_KEY:      devStatsType,
	QGROUP_INFO_KEY:          qGroupInfoType,
	QGROUP_LIMIT_KEY:         qGroupLimitType,
	QGROUP_RELATION_KEY:      emptyType,
	QGROUP_STATUS_KEY:        qGroupStatusType,
	ROOT_BACKREF_KEY:         rootRefType,
	ROOT_ITEM_KEY:            rootType,
	ROOT_REF_KEY:             rootRefType,
	SHARED_BLOCK_REF_KEY:     emptyType,
	SHARED_DATA_REF_KEY:      sharedDataRefType,
	TREE_BLOCK_REF_KEY:       emptyType,
	UUID_RECEIVED_SUBVOL_KEY: uuidMapType,
	UUID_SUBVOL_KEY:          uuidMapType,
	XATTR_ITEM_KEY:           dirEntryType,
}

// untypedObjID2gotype is used by UnmarshalItem.
var untypedObjID2gotype = map[btrfsprim.ObjID]reflect.Type{
	btrfsprim.FREE_SPACE_OBJECTID: freeSpaceHeaderType,
}

// Pools.
var (
	blockGroupPool      = typedsync.Pool[Item]{New: func() Item { return new(BlockGroup) }}
	chunkPool           = typedsync.Pool[Item]{New: func() Item { return new(Chunk) }}
	devPool             = typedsync.Pool[Item]{New: func() Item { return new(Dev) }}
	devExtentPool       = typedsync.Pool[Item]{New: func() Item { return new(DevExtent) }}
	devStatsPool        = typedsync.Pool[Item]{New: func() Item { return new(DevStats) }}
	dirEntryPool        = typedsync.Pool[Item]{New: func() Item { return new(DirEntry) }}
	emptyPool           = typedsync.Pool[Item]{New: func() Item { return new(Empty) }}
	extentPool          = typedsync.Pool[Item]{New: func() Item { return new(Extent) }}
	extentCSumPool      = typedsync.Pool[Item]{New: func() Item { return new(ExtentCSum) }}
	extentDataRefPool   = typedsync.Pool[Item]{New: func() Item { return new(ExtentDataRef) }}
	fileExtentPool      = typedsync.Pool[Item]{New: func() Item { return new(FileExtent) }}
	freeSpaceBitmapPool = typedsync.Pool[Item]{New: func() Item { return new(FreeSpaceBitmap) }}
	freeSpaceHeaderPool = typedsync.Pool[Item]{New: func() Item { return new(FreeSpaceHeader) }}
	freeSpaceInfoPool   = typedsync.Pool[Item]{New: func() Item { return new(FreeSpaceInfo) }}
	inodePool           = typedsync.Pool[Item]{New: func() Item { return new(Inode) }}
	inodeRefsPool       = typedsync.Pool[Item]{New: func() Item { return new(InodeRefs) }}
	metadataPool        = typedsync.Pool[Item]{New: func() Item { return new(Metadata) }}
	qGroupInfoPool      = typedsync.Pool[Item]{New: func() Item { return new(QGroupInfo) }}
	qGroupLimitPool     = typedsync.Pool[Item]{New: func() Item { return new(QGroupLimit) }}
	qGroupStatusPool    = typedsync.Pool[Item]{New: func() Item { return new(QGroupStatus) }}
	rootPool            = typedsync.Pool[Item]{New: func() Item { return new(Root) }}
	rootRefPool         = typedsync.Pool[Item]{New: func() Item { return new(RootRef) }}
	sharedDataRefPool   = typedsync.Pool[Item]{New: func() Item { return new(SharedDataRef) }}
	uuidMapPool         = typedsync.Pool[Item]{New: func() Item { return new(UUIDMap) }}
)

// gotype2pool is used by UnmarshalItem.
var gotype2pool = map[reflect.Type]*typedsync.Pool[Item]{
	blockGroupType:      &blockGroupPool,
	chunkType:           &chunkPool,
	devType:             &devPool,
	devExtentType:       &devExtentPool,
	devStatsType:        &devStatsPool,
	dirEntryType:        &dirEntryPool,
	emptyType:           &emptyPool,
	extentType:          &extentPool,
	extentCSumType:      &extentCSumPool,
	extentDataRefType:   &extentDataRefPool,
	fileExtentType:      &fileExtentPool,
	freeSpaceBitmapType: &freeSpaceBitmapPool,
	freeSpaceHeaderType: &freeSpaceHeaderPool,
	freeSpaceInfoType:   &freeSpaceInfoPool,
	inodeType:           &inodePool,
	inodeRefsType:       &inodeRefsPool,
	metadataType:        &metadataPool,
	qGroupInfoType:      &qGroupInfoPool,
	qGroupLimitType:     &qGroupLimitPool,
	qGroupStatusType:    &qGroupStatusPool,
	rootType:            &rootPool,
	rootRefType:         &rootRefPool,
	sharedDataRefType:   &sharedDataRefPool,
	uuidMapType:         &uuidMapPool,
}

// isItem implements Item.
func (*BlockGroup) isItem()      {}
func (*Chunk) isItem()           {}
func (*Dev) isItem()             {}
func (*DevExtent) isItem()       {}
func (*DevStats) isItem()        {}
func (*DirEntry) isItem()        {}
func (*Empty) isItem()           {}
func (*Extent) isItem()          {}
func (*ExtentCSum) isItem()      {}
func (*ExtentDataRef) isItem()   {}
func (*FileExtent) isItem()      {}
func (*FreeSpaceBitmap) isItem() {}
func (*FreeSpaceHeader) isItem() {}
func (*FreeSpaceInfo) isItem()   {}
func (*Inode) isItem()           {}
func (*InodeRefs) isItem()       {}
func (*Metadata) isItem()        {}
func (*QGroupInfo) isItem()      {}
func (*QGroupLimit) isItem()     {}
func (*QGroupStatus) isItem()    {}
func (*Root) isItem()            {}
func (*RootRef) isItem()         {}
func (*SharedDataRef) isItem()   {}
func (*UUIDMap) isItem()         {}

// Free implements Item.
func (o *BlockGroup) Free()      { *o = BlockGroup{}; blockGroupPool.Put(o) }
func (o *Dev) Free()             { *o = Dev{}; devPool.Put(o) }
func (o *DevExtent) Free()       { *o = DevExtent{}; devExtentPool.Put(o) }
func (o *DevStats) Free()        { *o = DevStats{}; devStatsPool.Put(o) }
func (o *Empty) Free()           { *o = Empty{}; emptyPool.Put(o) }
func (o *ExtentCSum) Free()      { *o = ExtentCSum{}; extentCSumPool.Put(o) }
func (o *ExtentDataRef) Free()   { *o = ExtentDataRef{}; extentDataRefPool.Put(o) }
func (o *FreeSpaceHeader) Free() { *o = FreeSpaceHeader{}; freeSpaceHeaderPool.Put(o) }
func (o *FreeSpaceInfo) Free()   { *o = FreeSpaceInfo{}; freeSpaceInfoPool.Put(o) }
func (o *Inode) Free()           { *o = Inode{}; inodePool.Put(o) }
func (o *QGroupInfo) Free()      { *o = QGroupInfo{}; qGroupInfoPool.Put(o) }
func (o *QGroupLimit) Free()     { *o = QGroupLimit{}; qGroupLimitPool.Put(o) }
func (o *QGroupStatus) Free()    { *o = QGroupStatus{}; qGroupStatusPool.Put(o) }
func (o *Root) Free()            { *o = Root{}; rootPool.Put(o) }
func (o *SharedDataRef) Free()   { *o = SharedDataRef{}; sharedDataRefPool.Put(o) }
func (o *UUIDMap) Free()         { *o = UUIDMap{}; uuidMapPool.Put(o) }

// Clone is a handy method.
func (o BlockGroup) Clone() BlockGroup           { return o }
func (o Dev) Clone() Dev                         { return o }
func (o DevExtent) Clone() DevExtent             { return o }
func (o DevStats) Clone() DevStats               { return o }
func (o Empty) Clone() Empty                     { return o }
func (o ExtentCSum) Clone() ExtentCSum           { return o }
func (o ExtentDataRef) Clone() ExtentDataRef     { return o }
func (o FreeSpaceHeader) Clone() FreeSpaceHeader { return o }
func (o FreeSpaceInfo) Clone() FreeSpaceInfo     { return o }
func (o Inode) Clone() Inode                     { return o }
func (o QGroupInfo) Clone() QGroupInfo           { return o }
func (o QGroupLimit) Clone() QGroupLimit         { return o }
func (o QGroupStatus) Clone() QGroupStatus       { return o }
func (o Root) Clone() Root                       { return o }
func (o SharedDataRef) Clone() SharedDataRef     { return o }
func (o UUIDMap) Clone() UUIDMap                 { return o }

// CloneItem implements Item.
func (o *BlockGroup) CloneItem() Item {
	ret, _ := blockGroupPool.Get()
	*(ret.(*BlockGroup)) = o.Clone()
	return ret
}
func (o *Chunk) CloneItem() Item { ret, _ := chunkPool.Get(); *(ret.(*Chunk)) = o.Clone(); return ret }
func (o *Dev) CloneItem() Item   { ret, _ := devPool.Get(); *(ret.(*Dev)) = o.Clone(); return ret }
func (o *DevExtent) CloneItem() Item {
	ret, _ := devExtentPool.Get()
	*(ret.(*DevExtent)) = o.Clone()
	return ret
}
func (o *DevStats) CloneItem() Item {
	ret, _ := devStatsPool.Get()
	*(ret.(*DevStats)) = o.Clone()
	return ret
}
func (o *DirEntry) CloneItem() Item {
	ret, _ := dirEntryPool.Get()
	*(ret.(*DirEntry)) = o.Clone()
	return ret
}
func (o *Empty) CloneItem() Item { ret, _ := emptyPool.Get(); *(ret.(*Empty)) = o.Clone(); return ret }
func (o *Extent) CloneItem() Item {
	ret, _ := extentPool.Get()
	*(ret.(*Extent)) = o.Clone()
	return ret
}
func (o *ExtentCSum) CloneItem() Item {
	ret, _ := extentCSumPool.Get()
	*(ret.(*ExtentCSum)) = o.Clone()
	return ret
}
func (o *ExtentDataRef) CloneItem() Item {
	ret, _ := extentDataRefPool.Get()
	*(ret.(*ExtentDataRef)) = o.Clone()
	return ret
}
func (o *FileExtent) CloneItem() Item {
	ret, _ := fileExtentPool.Get()
	*(ret.(*FileExtent)) = o.Clone()
	return ret
}
func (o *FreeSpaceBitmap) CloneItem() Item {
	ret, _ := freeSpaceBitmapPool.Get()
	*(ret.(*FreeSpaceBitmap)) = o.Clone()
	return ret
}
func (o *FreeSpaceHeader) CloneItem() Item {
	ret, _ := freeSpaceHeaderPool.Get()
	*(ret.(*FreeSpaceHeader)) = o.Clone()
	return ret
}
func (o *FreeSpaceInfo) CloneItem() Item {
	ret, _ := freeSpaceInfoPool.Get()
	*(ret.(*FreeSpaceInfo)) = o.Clone()
	return ret
}
func (o *Inode) CloneItem() Item { ret, _ := inodePool.Get(); *(ret.(*Inode)) = o.Clone(); return ret }
func (o *InodeRefs) CloneItem() Item {
	ret, _ := inodeRefsPool.Get()
	*(ret.(*InodeRefs)) = o.Clone()
	return ret
}
func (o *Metadata) CloneItem() Item {
	ret, _ := metadataPool.Get()
	*(ret.(*Metadata)) = o.Clone()
	return ret
}
func (o *QGroupInfo) CloneItem() Item {
	ret, _ := qGroupInfoPool.Get()
	*(ret.(*QGroupInfo)) = o.Clone()
	return ret
}
func (o *QGroupLimit) CloneItem() Item {
	ret, _ := qGroupLimitPool.Get()
	*(ret.(*QGroupLimit)) = o.Clone()
	return ret
}
func (o *QGroupStatus) CloneItem() Item {
	ret, _ := qGroupStatusPool.Get()
	*(ret.(*QGroupStatus)) = o.Clone()
	return ret
}
func (o *Root) CloneItem() Item { ret, _ := rootPool.Get(); *(ret.(*Root)) = o.Clone(); return ret }
func (o *RootRef) CloneItem() Item {
	ret, _ := rootRefPool.Get()
	*(ret.(*RootRef)) = o.Clone()
	return ret
}
func (o *SharedDataRef) CloneItem() Item {
	ret, _ := sharedDataRefPool.Get()
	*(ret.(*SharedDataRef)) = o.Clone()
	return ret
}
func (o *UUIDMap) CloneItem() Item {
	ret, _ := uuidMapPool.Get()
	*(ret.(*UUIDMap)) = o.Clone()
	return ret
}

// Item type assertions.
var (
	_ Item = (*BlockGroup)(nil)
	_ Item = (*Chunk)(nil)
	_ Item = (*Dev)(nil)
	_ Item = (*DevExtent)(nil)
	_ Item = (*DevStats)(nil)
	_ Item = (*DirEntry)(nil)
	_ Item = (*Empty)(nil)
	_ Item = (*Extent)(nil)
	_ Item = (*ExtentCSum)(nil)
	_ Item = (*ExtentDataRef)(nil)
	_ Item = (*FileExtent)(nil)
	_ Item = (*FreeSpaceBitmap)(nil)
	_ Item = (*FreeSpaceHeader)(nil)
	_ Item = (*FreeSpaceInfo)(nil)
	_ Item = (*Inode)(nil)
	_ Item = (*InodeRefs)(nil)
	_ Item = (*Metadata)(nil)
	_ Item = (*QGroupInfo)(nil)
	_ Item = (*QGroupLimit)(nil)
	_ Item = (*QGroupStatus)(nil)
	_ Item = (*Root)(nil)
	_ Item = (*RootRef)(nil)
	_ Item = (*SharedDataRef)(nil)
	_ Item = (*UUIDMap)(nil)
)

// Clone type assertions.
var (
	_ interface{ Clone() BlockGroup }      = BlockGroup{}
	_ interface{ Clone() Chunk }           = Chunk{}
	_ interface{ Clone() Dev }             = Dev{}
	_ interface{ Clone() DevExtent }       = DevExtent{}
	_ interface{ Clone() DevStats }        = DevStats{}
	_ interface{ Clone() DirEntry }        = DirEntry{}
	_ interface{ Clone() Empty }           = Empty{}
	_ interface{ Clone() Extent }          = Extent{}
	_ interface{ Clone() ExtentCSum }      = ExtentCSum{}
	_ interface{ Clone() ExtentDataRef }   = ExtentDataRef{}
	_ interface{ Clone() FileExtent }      = FileExtent{}
	_ interface{ Clone() FreeSpaceBitmap } = FreeSpaceBitmap{}
	_ interface{ Clone() FreeSpaceHeader } = FreeSpaceHeader{}
	_ interface{ Clone() FreeSpaceInfo }   = FreeSpaceInfo{}
	_ interface{ Clone() Inode }           = Inode{}
	_ interface{ Clone() InodeRefs }       = InodeRefs{}
	_ interface{ Clone() Metadata }        = Metadata{}
	_ interface{ Clone() QGroupInfo }      = QGroupInfo{}
	_ interface{ Clone() QGroupLimit }     = QGroupLimit{}
	_ interface{ Clone() QGroupStatus }    = QGroupStatus{}
	_ interface{ Clone() Root }            = Root{}
	_ interface{ Clone() RootRef }         = RootRef{}
	_ interface{ Clone() SharedDataRef }   = SharedDataRef{}
	_ interface{ Clone() UUIDMap }         = UUIDMap{}
)