from li_std_vector_extra import *

iv = IntVector(4)
for i in range(0, 4):
    iv[i] = i

x = average(iv)
y = average([1, 2, 3, 4])

a = half([10, 10.5, 11, 11.5])

dv = DoubleVector(10)
for i in range(0, 10):
    dv[i] = i / 2.0

halve_in_place(dv)


bv = BoolVector(4)
bv[0] = bool(1)
bv[1] = bool(0)
bv[2] = bool(4)
bv[3] = bool(0)

if bv[0] != bv[2]:
    raise RuntimeError("bad std::vector<bool> mapping")

b = B(5)
va = VecA([b, None, b, b])

if va[0].f(1) != 6:
    raise RuntimeError("bad std::vector<A*> mapping")

if vecAptr(va) != 6:
    raise RuntimeError("bad std::vector<A*> mapping")

b.val = 7
if va[3].f(1) != 8:
    raise RuntimeError("bad std::vector<A*> mapping")


ip = PtrInt()
ap = new_ArrInt(10)

ArrInt_setitem(ip, 0, 123)
ArrInt_setitem(ap, 2, 123)

vi = IntPtrVector((ip, ap, None))
if ArrInt_getitem(vi[0], 0) != ArrInt_getitem(vi[1], 2):
    raise RuntimeError("bad std::vector<int*> mapping")

delete_ArrInt(ap)


a = halfs([10, 8, 4, 3])

v = IntVector()
v[0:2] = [1, 2]
if v[0] != 1 or v[1] != 2:
    raise RuntimeError("bad setslice")

if v[0:-1][0] != 1:
    raise RuntimeError("bad getslice")

if v[0:-2].size() != 0:
    raise RuntimeError("bad getslice")

v[0:1] = [2]
if v[0] != 2:
    raise RuntimeError("bad setslice")

v[1:] = [3]
if v[1] != 3:
    raise RuntimeError("bad setslice")

v[2:] = [3]
if v[2] != 3:
    raise RuntimeError("bad setslice")

if v[0:][0] != v[0]:
    raise RuntimeError("bad getslice")


del v[:]
if v.size() != 0:
    raise RuntimeError("bad getslice")

del v[:]
if v.size() != 0:
    raise RuntimeError("bad getslice")


v = vecStr(["hello ", "world"])
if v[0] != "hello world":
    raise RuntimeError("bad std::string+std::vector")


pv = pyvector([1, "hello", (1, 2)])

if pv[1] != "hello":
    raise RuntimeError


iv = IntVector(5)
for i in range(0, 5):
    iv[i] = i

iv[1:3] = []
if iv[1] != 3:
    raise RuntimeError

# Overloading checks
if overloaded1(iv) != "vector<int>":
    raise RuntimeError

if overloaded1(dv) != "vector<double>":
    raise RuntimeError

if overloaded2(iv) != "vector<int>":
    raise RuntimeError

if overloaded2(dv) != "vector<double>":
    raise RuntimeError

if overloaded3(iv) != "vector<int> *":
    raise RuntimeError

if overloaded3(None) != "vector<int> *":
    raise RuntimeError

if overloaded3(100) != "int":
    raise RuntimeError


# vector pointer checks
ip = makeIntPtr(11)
dp = makeDoublePtr(33.3)
error = 0
try:
    # check vector<int *> does not accept double * element
    vi = IntPtrVector((ip, dp))
    error = 1
except:
    pass

if error:
    raise RuntimeError

vi = IntPtrVector((ip, makeIntPtr(22)))
if extractInt(vi[0]) != 11:
    raise RuntimeError

if extractInt(vi[1]) != 22:
    raise RuntimeError

# vector const pointer checks
csp = makeConstShortPtr(111)

error = 0
try:
    # check vector<const unsigned short *> does not accept double * element
    vcs = ConstShortPtrVector((csp, dp))
    error = 1
except:
    pass

if error:
    raise RuntimeError

vcs = ConstShortPtrVector((csp, makeConstShortPtr(222)))
if extractConstShort(vcs[0]) != 111:
    raise RuntimeError

if extractConstShort(vcs[1]) != 222:
    raise RuntimeError

for p in vcs[0:1]:
    if extractConstShort2(p) != 111:
        raise RuntimeError

for p in vcs[1:2]:
    if extractConstShort2(p) != 222:
        raise RuntimeError
