#pragma once
#include "any.h"
#include <unordered_map>
namespace refl {
	using UClassPair = std::pair<const UClass*, const UClass*>;
	// 自定义哈希函数
	struct UClassPairHash {
		std::size_t operator()(const UClassPair& pair) const {
			std::hash<const UClass*> ptr_hash;
			return ptr_hash(pair.first) ^ (ptr_hash(pair.second) << 1);
		}
	};
	struct UClassPairEqual {
		bool operator()(const UClassPair& lhs, const UClassPair& rhs) const {
			return lhs.first == rhs.first && lhs.second == rhs.second;
		}
	};
	using ConvertFunc = bool (*)(Any& to, const Any& from);
	using ConvertMap = std::unordered_map<UClassPair, ConvertFunc, UClassPairHash, UClassPairEqual>;
	class Convert {
	protected:
		static ConvertMap BuildClassMap();
		template<typename From, typename To>
		static bool ConvertTo(Any& to, const Any& from);
	public:
		static bool Construct(Any& to,const Any& from);
		inline static ConvertMap ClassMap = BuildClassMap();
	};
}