package sqlite3_wrap

import 

func ( *Wrapper) ( Ptr_t) {
	if  == 0 {
		return
	}
	.Xsqlite3_free(int32())
}

func ( *Wrapper) ( int64) Ptr_t {
	 := Ptr_t(.Xsqlite3_malloc64())
	if  == 0 &&  != 0 {
		panic(errutil.OOMErr)
	}
	return 
}

func ( *Wrapper) ( Ptr_t,  int64) Ptr_t {
	 = Ptr_t(.Xsqlite3_realloc64(int32(), ))
	if  == 0 &&  != 0 {
		panic(errutil.OOMErr)
	}
	return 
}

func ( *Wrapper) ( []byte) Ptr_t {
	if len() == 0 {
		return 0
	}
	 := .New(int64(len()))
	.WriteBytes(, )
	return 
}

func ( *Wrapper) ( string) Ptr_t {
	 := .New(int64(len()) + 1)
	.WriteString(, )
	return 
}

const arenaSize = 4096

func ( *Wrapper) () Arena {
	return Arena{
		sqlt: ,
		base: .New(arenaSize),
	}
}

type Arena struct {
	sqlt *Wrapper
	ptrs []Ptr_t
	base Ptr_t
	next int32
}

func ( *Arena) () {
	if .sqlt == nil {
		return
	}
	for ,  := range .ptrs {
		.sqlt.Free()
	}
	.sqlt.Free(.base)
	.sqlt = nil
}

func ( *Arena) () ( func()) {
	 := len(.ptrs)
	 := .next
	return func() {
		for ,  := range .ptrs[:] {
			.sqlt.Free()
		}
		.ptrs = .ptrs[:]
		.next = 
	}
}

func ( *Arena) ( int64) Ptr_t {
	// Align the next address, to 4 or 8 bytes.
	if &7 != 0 {
		.next = (.next + 3) &^ 3
	} else {
		.next = (.next + 7) &^ 7
	}
	if  <= arenaSize-int64(.next) {
		 := .base + Ptr_t(.next)
		.next += int32()
		return Ptr_t()
	}
	 := .sqlt.New()
	.ptrs = append(.ptrs, )
	return Ptr_t()
}

func ( *Arena) ( []byte) Ptr_t {
	if len() == 0 {
		return 0
	}
	 := .New(int64(len()))
	.sqlt.WriteBytes(, )
	return 
}

func ( *Arena) ( string) Ptr_t {
	 := .New(int64(len()) + 1)
	.sqlt.WriteString(, )
	return 
}