package main

import . "overload_template_fast"

func main() {
	_ = Foo()

	_ = Maximum(3, 4)
	_ = Maximum(3.4, 5.2)

	// mix 1
	if Mix1("hi") != 101 {
		panic("mix1(const char*)")
	}

	if Mix1(1.0, 1.0) != 102 {
		panic("mix1(double, const double &)")
	}

	if Mix1(1.0) != 103 {
		panic("mix1(double)")
	}

	// mix 2
	if Mix2("hi") != 101 {
		panic("mix2(const char*)")
	}

	if Mix2(1.0, 1.0) != 102 {
		panic("mix2(double, const double &)")
	}

	if Mix2(1.0) != 103 {
		panic("mix2(double)")
	}

	// mix 3
	if Mix3("hi") != 101 {
		panic("mix3(const char*)")
	}

	if Mix3(1.0, 1.0) != 102 {
		panic("mix3(double, const double &)")
	}

	if Mix3(1.0) != 103 {
		panic("mix3(double)")
	}

	// Combination 1
	if Overtparams1(100) != 10 {
		panic("overtparams1(int)")
	}

	if Overtparams1(100.0, 100) != 20 {
		panic("overtparams1(double, int)")
	}

	// Combination 2
	if Overtparams2(100.0, 100) != 40 {
		panic("overtparams2(double, int)")
	}

	// Combination 3
	if Overloaded() != 60 {
		panic("overloaded()")
	}

	if Overloaded(100.0, 100) != 70 {
		panic("overloaded(double, int)")
	}

	// Combination 4
	if Overloadedagain("hello") != 80 {
		panic("overloadedagain(const char *)")
	}

	if Overloadedagain() != 90 {
		panic("overloadedagain(double)")
	}

	// specializations
	if Specialization(10) != 202 {
		panic("specialization(int)")
	}

	if Specialization(10.0) != 203 {
		panic("specialization(double)")
	}

	if Specialization(10, 10) != 204 {
		panic("specialization(int, int)")
	}

	if Specialization(10.0, 10.0) != 205 {
		panic("specialization(double, double)")
	}

	if Specialization("hi", "hi") != 201 {
		panic("specialization(const char *, const char *)")
	}

	// simple specialization
	Xyz()
	Xyz_int()
	Xyz_double()

	// a bit of everything
	if Overload("hi") != 0 {
		panic("overload()")
	}

	if Overload(1) != 10 {
		panic("overload(int t)")
	}

	if Overload(1, 1) != 20 {
		panic("overload(int t, const int &)")
	}

	if Overload(1, "hello") != 30 {
		panic("overload(int t, const char *)")
	}

	k := NewKlass()
	if Overload(k) != 10 {
		panic("overload(Klass t)")
	}

	if Overload(k, k) != 20 {
		panic("overload(Klass t, const Klass &)")
	}

	if Overload(k, "hello") != 30 {
		panic("overload(Klass t, const char *)")
	}

	if Overload(10.0, "hi") != 40 {
		panic("overload(double t, const char *)")
	}

	if Overload() != 50 {
		panic("overload(const char *)")
	}

	// everything put in a namespace
	if Nsoverload("hi") != 1000 {
		panic("nsoverload()")
	}

	if Nsoverload(1) != 1010 {
		panic("nsoverload(int t)")
	}

	if Nsoverload(1, 1) != 1020 {
		panic("nsoverload(int t, const int &)")
	}

	if Nsoverload(1, "hello") != 1030 {
		panic("nsoverload(int t, const char *)")
	}

	if Nsoverload(k) != 1010 {
		panic("nsoverload(Klass t)")
	}

	if Nsoverload(k, k) != 1020 {
		panic("nsoverload(Klass t, const Klass &)")
	}

	if Nsoverload(k, "hello") != 1030 {
		panic("nsoverload(Klass t, const char *)")
	}

	if Nsoverload(10.0, "hi") != 1040 {
		panic("nsoverload(double t, const char *)")
	}

	if Nsoverload() != 1050 {
		panic("nsoverload(const char *)")
	}

	AFoo(1)
	b := NewB()
	b.Foo(1)
}
