#include <iostream>
#include <array>
#include "refl/refl.h"
#include "vertex.h"
#include "tstring.h"
#include <functional>
using namespace std;
using namespace refl;
struct vec3_parent {
	virtual void norm(int x1, int& x2) {
		x2 = x1 * x2;
		cout << x2 << "vec3_parent::norm" << endl;
	}
};
struct vec3 : public vec3_parent {
	float x = 1;
	float y = 2;
	float z = 3;
	string name{ "hellohellohellohellohellohello" };
	void norm(int x1, int& x2)override {
		x2 = x1 * x2;
		cout << x2 << "vec3::norm" << endl;
	}
	virtual float norm1(int x1 = 10) {
		cout << x1 << "::norm1" << endl;
		return x * y *z * x1;
	}
	static void norm2(int x1 = 10) {
		cout << x1 << "::norm2" << endl;
	}
	static void norm3(int x1 = 10) {
		x1 = x1 * 10;
		cout << x1 << "::norm3" << endl;
	}
	using MyUClass = UClass_Custom;
	static void BuildClass(MyUClass& cls) {
		cls.parent = &TypeInfo<vec3_parent>::StaticClass;
		cls.AttrNum = 3;
		cls.FList = {
			MakeMemberField(&vec3::x, "x"),
			MakeMemberField(&vec3::y, "y"),
			MakeMemberField(&vec3::z, "z"),
			MakeMethodField(&vec3::norm, "norm", {8, 9}),
			MakeMethodField(&vec3::norm1, "norm1",{2})
		};
	}
};
int main() {
	auto cls =  &TypeInfo<vec3>::StaticClass;
	int x = 2, y = 3;
	auto ov = cls->New();
	ov.Invoke("norm", x);
	ov.Invoke("norm", x);
	ov.Invoke("norm", x, y);
	ov.Invoke("norm1", y);
	vec3* v = (vec3*)ov.ptr;
	v->norm1(y);
	ov.Invoke("norm1", y);
	delete v;
	cout << "hello world\n";
}