package mstypes

import (
	
	
	
	
)

// Byte sizes of primitive types
const (
	SizeBool   = 1
	SizeChar   = 1
	SizeUint8  = 1
	SizeUint16 = 2
	SizeUint32 = 4
	SizeUint64 = 8
	SizeEnum   = 2
	SizeSingle = 4
	SizeDouble = 8
	SizePtr    = 4
)

// Reader reads simple byte stream data into a Go representations
type Reader struct {
	r *bufio.Reader // source of the data
}

// NewReader creates a new instance of a simple Reader.
func ( io.Reader) *Reader {
	 := new(Reader)
	.r = bufio.NewReader()
	return 
}

func ( *Reader) ( []byte) ( int,  error) {
	return .r.Read()
}

func ( *Reader) () (uint8, error) {
	,  := .r.ReadByte()
	if  != nil {
		return uint8(0), 
	}
	return uint8(), nil
}

func ( *Reader) () (uint16, error) {
	,  := .ReadBytes(SizeUint16)
	if  != nil {
		return uint16(0), 
	}
	return binary.LittleEndian.Uint16(), nil
}

func ( *Reader) () (uint32, error) {
	,  := .ReadBytes(SizeUint32)
	if  != nil {
		return uint32(0), 
	}
	return binary.LittleEndian.Uint32(), nil
}

func ( *Reader) () (uint64, error) {
	,  := .ReadBytes(SizeUint64)
	if  != nil {
		return uint64(0), 
	}
	return binary.LittleEndian.Uint64(), nil
}

func ( *Reader) () ( FileTime,  error) {
	.LowDateTime,  = .Uint32()
	if  != nil {
		return
	}
	.HighDateTime,  = .Uint32()
	if  != nil {
		return
	}
	return
}

// UTF16String returns a string that is UTF16 encoded in a byte slice. n is the number of bytes representing the string
func ( *Reader) ( int) ( string,  error) {
	//Length divided by 2 as each run is 16bits = 2bytes
	 := make([]rune, /2, /2)
	for  := 0;  < len(); ++ {
		var  uint16
		,  = .Uint16()
		if  != nil {
			return
		}
		[] = rune()
	}
	 = string()
	return
}

// readBytes returns a number of bytes from the NDR byte stream.
func ( *Reader) ( int) ([]byte, error) {
	//TODO make this take an int64 as input to allow for larger values on all systems?
	 := make([]byte, , )
	,  := .r.Read()
	if  != nil ||  !=  {
		return , fmt.Errorf("error reading bytes from stream: %v", )
	}
	return , nil
}