package util

import (
	
	

	
)

const (
	PtrLen = 4
	IntLen = 4
)

type (
	i8  interface{ ~int8 | ~uint8 }
	i32 interface{ ~int32 | ~uint32 }
	i64 interface{ ~int64 | ~uint64 }

	Stk_t = uint64
	Ptr_t uint32
	Res_t int32
)

func ( api.Module,  Ptr_t,  int64) []byte {
	if  == 0 {
		panic(NilErr)
	}
	if uint64() > math.MaxUint32 {
		panic(RangeErr)
	}
	,  := .Memory().Read(uint32(), uint32())
	if ! {
		panic(RangeErr)
	}
	return 
}

func [ i8]( api.Module,  Ptr_t)  {
	if  == 0 {
		panic(NilErr)
	}
	,  := .Memory().ReadByte(uint32())
	if ! {
		panic(RangeErr)
	}
	return ()
}

func [ i8]( api.Module,  Ptr_t,  ) {
	if  == 0 {
		panic(NilErr)
	}
	 := .Memory().WriteByte(uint32(), uint8())
	if ! {
		panic(RangeErr)
	}
}

func [ i32]( api.Module,  Ptr_t)  {
	if  == 0 {
		panic(NilErr)
	}
	,  := .Memory().ReadUint32Le(uint32())
	if ! {
		panic(RangeErr)
	}
	return ()
}

func [ i32]( api.Module,  Ptr_t,  ) {
	if  == 0 {
		panic(NilErr)
	}
	 := .Memory().WriteUint32Le(uint32(), uint32())
	if ! {
		panic(RangeErr)
	}
}

func [ i64]( api.Module,  Ptr_t)  {
	if  == 0 {
		panic(NilErr)
	}
	,  := .Memory().ReadUint64Le(uint32())
	if ! {
		panic(RangeErr)
	}
	return ()
}

func [ i64]( api.Module,  Ptr_t,  ) {
	if  == 0 {
		panic(NilErr)
	}
	 := .Memory().WriteUint64Le(uint32(), uint64())
	if ! {
		panic(RangeErr)
	}
}

func ( api.Module,  Ptr_t) float64 {
	return math.Float64frombits(Read64[uint64](, ))
}

func ( api.Module,  Ptr_t,  float64) {
	Write64(, , math.Float64bits())
}

func ( api.Module,  Ptr_t) bool {
	return Read32[int32](, ) != 0
}

func ( api.Module,  Ptr_t,  bool) {
	var  int32
	if  {
		 = 1
	}
	Write32(, , )
}

func ( api.Module,  Ptr_t,  int64) string {
	if  == 0 {
		panic(NilErr)
	}
	if  <= 0 {
		return ""
	}
	 := .Memory()
	 = min(, math.MaxInt32-1) + 1
	,  := .Read(uint32(), uint32())
	if ! {
		,  = .Read(uint32(), .Size()-uint32())
		if ! {
			panic(RangeErr)
		}
	}
	if  := bytes.IndexByte(, 0);  >= 0 {
		return string([:])
	}
	panic(NoNulErr)
}

func ( api.Module,  Ptr_t,  []byte) {
	 := View(, , int64(len()))
	copy(, )
}

func ( api.Module,  Ptr_t,  string) {
	 := View(, , int64(len())+1)
	[len()] = 0
	copy(, )
}