Browse Source

Type name logging on data type registration failure (#167)

Omega 5 years ago
parent
commit
2eb5662239
2 changed files with 19 additions and 4 deletions
  1. 7 4
      Include/RmlUi/Core/DataTypeRegister.h
  2. 12 0
      Include/RmlUi/Core/Traits.h

+ 7 - 4
Include/RmlUi/Core/DataTypeRegister.h

@@ -39,6 +39,9 @@
 
 
 namespace Rml {
 namespace Rml {
 
 
+#define RMLUI_LOG_TYPE_ERROR(T, msg) RMLUI_ERRORMSG((String(msg) + String(" T: ") + String(rmlui_type_name<T>())).c_str())
+#define RMLUI_LOG_TYPE_ERROR_ASSERT(T, val, msg) RMLUI_ASSERTMSG(val, (String(msg) + String(" T: ") + String(rmlui_type_name<T>())).c_str())
+
 template<typename T>
 template<typename T>
 struct is_valid_data_scalar {
 struct is_valid_data_scalar {
 	static constexpr bool value = std::is_arithmetic<T>::value
 	static constexpr bool value = std::is_arithmetic<T>::value
@@ -95,7 +98,7 @@ public:
 		bool inserted = type_register.emplace(id, std::move(struct_variable)).second;
 		bool inserted = type_register.emplace(id, std::move(struct_variable)).second;
 		if (!inserted)
 		if (!inserted)
 		{
 		{
-			RMLUI_ERRORMSG("Type already declared");
+			RMLUI_LOG_TYPE_ERROR(T, "Type already declared");
 			return StructHandle<T>(nullptr, nullptr);
 			return StructHandle<T>(nullptr, nullptr);
 		}
 		}
 		
 		
@@ -107,7 +110,7 @@ public:
 	{
 	{
 		using value_type = typename Container::value_type;
 		using value_type = typename Container::value_type;
 		VariableDefinition* value_variable = GetOrAddScalar<value_type>();
 		VariableDefinition* value_variable = GetOrAddScalar<value_type>();
-		RMLUI_ASSERTMSG(value_variable, "Underlying value type of array has not been registered.");
+		RMLUI_LOG_TYPE_ERROR_ASSERT(value_type, value_variable, "Underlying value type of array has not been registered.");
 		if (!value_variable)
 		if (!value_variable)
 			return false;
 			return false;
 
 
@@ -118,7 +121,7 @@ public:
 		bool inserted = type_register.emplace(container_id, std::move(array_variable)).second;
 		bool inserted = type_register.emplace(container_id, std::move(array_variable)).second;
 		if (!inserted)
 		if (!inserted)
 		{
 		{
-			RMLUI_ERRORMSG("Array type already declared.");
+			RMLUI_LOG_TYPE_ERROR(Container, "Array type already declared.");
 			return false;
 			return false;
 		}
 		}
 
 
@@ -168,7 +171,7 @@ public:
 		auto it = type_register.find(id);
 		auto it = type_register.find(id);
 		if (it == type_register.end())
 		if (it == type_register.end())
 		{
 		{
-			RMLUI_ERRORMSG("Desired data type T not registered with the type register, please use the 'Register...()' functions before binding values, adding members, or registering arrays of non-scalar types.")
+			RMLUI_LOG_TYPE_ERROR(T, "Desired data type T not registered with the type register, please use the 'Register...()' functions before binding values, adding members, or registering arrays of non-scalar types.");
 			return nullptr;
 			return nullptr;
 		}
 		}
 
 

+ 12 - 0
Include/RmlUi/Core/Traits.h

@@ -136,6 +136,12 @@ const char* rmlui_type_name(const T& /*var*/)
 	return "(type name unavailable)";
 	return "(type name unavailable)";
 }
 }
 
 
+template<class T>
+const char* rmlui_type_name()
+{
+	return "(type name unavailable)";
+}
+
 #else
 #else
 
 
 #include <typeinfo>
 #include <typeinfo>
@@ -156,6 +162,12 @@ const char* rmlui_type_name(const T& var)
 	return typeid(var).name();
 	return typeid(var).name();
 }
 }
 
 
+template<class T>
+const char* rmlui_type_name()
+{
+	return typeid(T).name();
+}
+
 #endif	// RMLUI_USE_CUSTOM_RTTI
 #endif	// RMLUI_USE_CUSTOM_RTTI
 
 
 #endif	// RMLUI_CORE_TRAITS_H
 #endif	// RMLUI_CORE_TRAITS_H