package yu_pack

// -----------------------------------------------------------------------------------------------------解包

func (t *Pack) PopLen() int {
	return len(t.buf) - t.get_i
}

func (t *Pack) PopByte() (result byte, ok bool) {
	if t.get_i+1 > len(t.buf) {
		return
	}
	result = t.buf[t.get_i]
	t.get_i++
	ok = true
	return
}

/*
PopInt16L 读取int16数据

字节序为：小端字节序——将低序字节存储在起始地址(123=>[123 0])
*/
func (t *Pack) PopInt16L() (result int16, ok bool) {
	if t.get_i+2 > len(t.buf) {
		return
	}
	result = int16(t.buf[t.get_i]) | int16(t.buf[t.get_i+1])<<8
	t.get_i += 2
	ok = true
	return
}

/*
PopInt16B 读取int16数据

字节序为：大端字节序——将高序字节存储在起始地址(123=>[0 123])
*/
func (t *Pack) PopInt16B() (result int16, ok bool) {
	if t.get_i+2 > len(t.buf) {
		return
	}
	result = int16(t.buf[t.get_i+1]) | int16(t.buf[t.get_i])<<8
	t.get_i += 2
	ok = true
	return
}

/*
PopInt16L 读取int16数据

字节序为：小端字节序——将低序字节存储在起始地址(123=>[123 0])
*/
func (t *Pack) PopUint16L() (result uint16, ok bool) {
	if t.get_i+2 > len(t.buf) {
		return
	}
	result = uint16(t.buf[t.get_i]) | uint16(t.buf[t.get_i+1])<<8
	t.get_i += 2
	ok = true
	return
}

/*
PopInt16B 读取int16数据

字节序为：大端字节序——将高序字节存储在起始地址(123=>[0 123])
*/
func (t *Pack) PopUint16B() (result uint16, ok bool) {
	if t.get_i+2 > len(t.buf) {
		return
	}
	result = uint16(t.buf[t.get_i+1]) | uint16(t.buf[t.get_i])<<8
	t.get_i += 2
	ok = true
	return
}

/*
PopInt32L 读取int32数据

字节序为：小端字节序——将低序字节存储在起始地址(123=>[123 0])
*/
func (t *Pack) PopInt32L() (result int32, ok bool) {
	if t.get_i+4 > len(t.buf) {
		return
	}
	result = int32(t.buf[t.get_i]) | int32(t.buf[t.get_i+1])<<8 |
		int32(t.buf[t.get_i+2])<<16 | int32(t.buf[t.get_i+3])<<24
	t.get_i += 4
	ok = true
	return
}

/*
PopInt32B 读取int32数据

字节序为：大端字节序——将高序字节存储在起始地址(123=>[0 123])
*/
func (t *Pack) PopInt32B() (result int32, ok bool) {
	if t.get_i+4 > len(t.buf) {
		return
	}
	result = int32(t.buf[t.get_i+3]) | int32(t.buf[t.get_i+2])<<8 |
		int32(t.buf[t.get_i+1])<<16 | int32(t.buf[t.get_i])<<24
	t.get_i += 4
	ok = true
	return
}

/*
PopInt32L 读取int32数据

字节序为：小端字节序——将低序字节存储在起始地址(123=>[123 0])
*/
func (t *Pack) PopUint32L() (result uint32, ok bool) {
	if t.get_i+4 > len(t.buf) {
		return
	}
	result = uint32(t.buf[t.get_i]) | uint32(t.buf[t.get_i+1])<<8 |
		uint32(t.buf[t.get_i+2])<<16 | uint32(t.buf[t.get_i+3])<<24
	t.get_i += 4
	ok = true
	return
}

/*
PopInt32B 读取int32数据

字节序为：大端字节序——将高序字节存储在起始地址(123=>[0 123])
*/
func (t *Pack) PopUint32B() (result uint32, ok bool) {
	if t.get_i+4 > len(t.buf) {
		return
	}
	result = uint32(t.buf[t.get_i+3]) | uint32(t.buf[t.get_i+2])<<8 |
		uint32(t.buf[t.get_i+1])<<16 | uint32(t.buf[t.get_i])<<24
	t.get_i += 4
	ok = true
	return
}

/*
PopInt64L 读取int64数据

字节序为：小端字节序——将低序字节存储在起始地址(123=>[123 0])
*/
func (t *Pack) PopInt64L() (result int64, ok bool) {
	if t.get_i+8 > len(t.buf) {
		return
	}
	result = int64(t.buf[t.get_i]) | int64(t.buf[t.get_i+1])<<8 |
		int64(t.buf[t.get_i+2])<<16 | int64(t.buf[t.get_i+3])<<24 |
		int64(t.buf[t.get_i+4])<<32 | int64(t.buf[t.get_i+5])<<40 |
		int64(t.buf[t.get_i+6])<<48 | int64(t.buf[t.get_i+7])<<56
	t.get_i += 8
	ok = true
	return
}

/*
PopInt64B 读取int64数据

字节序为：大端字节序——将高序字节存储在起始地址(123=>[0 123])
*/
func (t *Pack) PopInt64B() (result int64, ok bool) {
	if t.get_i+8 > len(t.buf) {
		return
	}
	result = int64(t.buf[t.get_i+7]) | int64(t.buf[t.get_i+6])<<8 |
		int64(t.buf[t.get_i+5])<<16 | int64(t.buf[t.get_i+4])<<24 |
		int64(t.buf[t.get_i+3])<<32 | int64(t.buf[t.get_i+2])<<40 |
		int64(t.buf[t.get_i+1])<<48 | int64(t.buf[t.get_i])<<56
	t.get_i += 8
	ok = true
	return
}

/*
PopInt64L 读取int64数据

字节序为：小端字节序——将低序字节存储在起始地址(123=>[123 0])
*/
func (t *Pack) PopUint64L() (result uint64, ok bool) {
	if t.get_i+8 > len(t.buf) {
		return
	}
	result = uint64(t.buf[t.get_i]) | uint64(t.buf[t.get_i+1])<<8 |
		uint64(t.buf[t.get_i+2])<<16 | uint64(t.buf[t.get_i+3])<<24 |
		uint64(t.buf[t.get_i+4])<<32 | uint64(t.buf[t.get_i+5])<<40 |
		uint64(t.buf[t.get_i+6])<<48 | uint64(t.buf[t.get_i+7])<<56
	t.get_i += 8
	ok = true
	return
}

/*
PopInt64B 读取int64数据

字节序为：大端字节序——将高序字节存储在起始地址(123=>[0 123])
*/
func (t *Pack) PopUint64B() (result uint64, ok bool) {
	if t.get_i+8 > len(t.buf) {
		return
	}
	result = uint64(t.buf[t.get_i+7]) | uint64(t.buf[t.get_i+6])<<8 |
		uint64(t.buf[t.get_i+5])<<16 | uint64(t.buf[t.get_i+4])<<24 |
		uint64(t.buf[t.get_i+3])<<32 | uint64(t.buf[t.get_i+2])<<40 |
		uint64(t.buf[t.get_i+1])<<48 | uint64(t.buf[t.get_i])<<56
	t.get_i += 8
	ok = true
	return
}

// PopBytes 读取[]byte数据，n < 0 时读取剩余所有数据
func (t *Pack) PopBytes(n int) (result []byte, ok bool) {
	if n == 0 {
		return
	}
	if n < 0 {
		result = make([]byte, len(t.buf)-t.get_i)
		copy(result, t.buf[t.get_i:])
		t.get_i = len(t.buf)
		ok = true
		return
	}
	if t.get_i+n > len(t.buf) {
		return
	}
	result = make([]byte, n)
	copy(result, t.buf[t.get_i:t.get_i+n])
	t.get_i += n
	ok = true
	return
}

func (t *Pack) PopBytesByte(add int) (result []byte, ok bool) {
	if t.get_i+1 > len(t.buf) {
		return
	}
	j_n := int(t.buf[t.get_i])
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+1+j_n > len(t.buf) {
		return
	}
	t.get_i++
	result = make([]byte, j_n)
	copy(result, t.buf[t.get_i:t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopBytesInt16L(add int) (result []byte, ok bool) {
	if t.get_i+2 > len(t.buf) {
		return
	}
	j_n := int(int16(t.buf[t.get_i]) | int16(t.buf[t.get_i+1])<<8)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+2+j_n > len(t.buf) {
		return
	}
	t.get_i += 2
	result = make([]byte, j_n)
	copy(result, t.buf[t.get_i:t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopBytesInt16B(add int) (result []byte, ok bool) {
	if t.get_i+2 > len(t.buf) {
		return
	}
	j_n := int(int16(t.buf[t.get_i+1]) | int16(t.buf[t.get_i])<<8)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+2+j_n > len(t.buf) {
		return
	}
	t.get_i += 2
	result = make([]byte, j_n)
	copy(result, t.buf[t.get_i:t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopBytesInt32L(add int) (result []byte, ok bool) {
	if t.get_i+4 > len(t.buf) {
		return
	}
	j_n := int(int32(t.buf[t.get_i]) | int32(t.buf[t.get_i+1])<<8 |
		int32(t.buf[t.get_i+2])<<16 | int32(t.buf[t.get_i+3])<<24)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+4+j_n > len(t.buf) {
		return
	}
	t.get_i += 4
	result = make([]byte, j_n)
	copy(result, t.buf[t.get_i:t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopBytesInt32B(add int) (result []byte, ok bool) {
	if t.get_i+4 > len(t.buf) {
		return
	}
	j_n := int(int32(t.buf[t.get_i+3]) | int32(t.buf[t.get_i+2])<<8 |
		int32(t.buf[t.get_i+1])<<16 | int32(t.buf[t.get_i])<<24)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+4+j_n > len(t.buf) {
		return
	}
	t.get_i += 4
	result = make([]byte, j_n)
	copy(result, t.buf[t.get_i:t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopBytesInt64L(add int) (result []byte, ok bool) {
	if t.get_i+8 > len(t.buf) {
		return
	}
	j_n := int(int64(t.buf[t.get_i]) | int64(t.buf[t.get_i+1])<<8 |
		int64(t.buf[t.get_i+2])<<16 | int64(t.buf[t.get_i+3])<<24 |
		int64(t.buf[t.get_i+4])<<32 | int64(t.buf[t.get_i+5])<<40 |
		int64(t.buf[t.get_i+6])<<48 | int64(t.buf[t.get_i+7])<<56)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+8+j_n > len(t.buf) {
		return
	}
	t.get_i += 8
	result = make([]byte, j_n)
	copy(result, t.buf[t.get_i:t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopBytesInt64B(add int) (result []byte, ok bool) {
	if t.get_i+8 > len(t.buf) {
		return
	}
	j_n := int(int64(t.buf[t.get_i+7]) | int64(t.buf[t.get_i+6])<<8 |
		int64(t.buf[t.get_i+5])<<16 | int64(t.buf[t.get_i+4])<<24 |
		int64(t.buf[t.get_i+3])<<32 | int64(t.buf[t.get_i+2])<<40 |
		int64(t.buf[t.get_i+1])<<48 | int64(t.buf[t.get_i])<<56)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+8+j_n > len(t.buf) {
		return
	}
	t.get_i += 8
	result = make([]byte, j_n)
	copy(result, t.buf[t.get_i:t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

// PopString 读取string数据，n<0时读取剩余所有数据
func (t *Pack) PopString(n int) (result string, ok bool) {
	if n == 0 {
		return
	}
	if n < 0 {
		result = string(t.buf[t.get_i:])
		t.get_i = len(t.buf)
		ok = true
		return
	}
	if t.get_i+n > len(t.buf) {
		return
	}
	result = string(t.buf[t.get_i : t.get_i+n])
	t.get_i += n
	ok = true
	return
}

func (t *Pack) PopStringByte(add int) (result string, ok bool) {
	if t.get_i+1 > len(t.buf) {
		return
	}
	j_n := int(t.buf[t.get_i])
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+1+j_n > len(t.buf) {
		return
	}
	t.get_i++
	result = string(t.buf[t.get_i : t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopStringInt16L(add int) (result string, ok bool) {
	if t.get_i+2 > len(t.buf) {
		return
	}
	j_n := int(int16(t.buf[t.get_i]) | int16(t.buf[t.get_i+1])<<8)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+2+j_n > len(t.buf) {
		return
	}
	t.get_i += 2
	result = string(t.buf[t.get_i : t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopStringInt16B(add int) (result string, ok bool) {
	if t.get_i+2 > len(t.buf) {
		return
	}
	j_n := int(int16(t.buf[t.get_i+1]) | int16(t.buf[t.get_i])<<8)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+2+j_n > len(t.buf) {
		return
	}
	t.get_i += 2
	result = string(t.buf[t.get_i : t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopStringInt32L(add int) (result string, ok bool) {
	if t.get_i+4 > len(t.buf) {
		return
	}
	j_n := int(int32(t.buf[t.get_i]) | int32(t.buf[t.get_i+1])<<8 |
		int32(t.buf[t.get_i+2])<<16 | int32(t.buf[t.get_i+3])<<24)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+4+j_n > len(t.buf) {
		return
	}
	t.get_i += 4
	result = string(t.buf[t.get_i : t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopStringInt32B(add int) (result string, ok bool) {
	if t.get_i+4 > len(t.buf) {
		return
	}
	j_n := int(int32(t.buf[t.get_i+3]) | int32(t.buf[t.get_i+2])<<8 |
		int32(t.buf[t.get_i+1])<<16 | int32(t.buf[t.get_i])<<24)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+4+j_n > len(t.buf) {
		return
	}
	t.get_i += 4
	result = string(t.buf[t.get_i : t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopStringInt64L(add int) (result string, ok bool) {
	if t.get_i+8 > len(t.buf) {
		return
	}
	j_n := int(int64(t.buf[t.get_i]) | int64(t.buf[t.get_i+1])<<8 |
		int64(t.buf[t.get_i+2])<<16 | int64(t.buf[t.get_i+3])<<24 |
		int64(t.buf[t.get_i+4])<<32 | int64(t.buf[t.get_i+5])<<40 |
		int64(t.buf[t.get_i+6])<<48 | int64(t.buf[t.get_i+7])<<56)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+8+j_n > len(t.buf) {
		return
	}
	t.get_i += 8
	result = string(t.buf[t.get_i : t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}

func (t *Pack) PopStringInt64B(add int) (result string, ok bool) {
	if t.get_i+8 > len(t.buf) {
		return
	}
	j_n := int(int64(t.buf[t.get_i+7]) | int64(t.buf[t.get_i+6])<<8 |
		int64(t.buf[t.get_i+5])<<16 | int64(t.buf[t.get_i+4])<<24 |
		int64(t.buf[t.get_i+3])<<32 | int64(t.buf[t.get_i+2])<<40 |
		int64(t.buf[t.get_i+1])<<48 | int64(t.buf[t.get_i])<<56)
	if j_n += add; j_n < 0 {
		return
	}
	if t.get_i+8+j_n > len(t.buf) {
		return
	}
	t.get_i += 8
	result = string(t.buf[t.get_i : t.get_i+j_n])
	t.get_i += j_n
	ok = true
	return
}
