+#if wxUSE_FUNC_TEMPLATE_POINTER
+ #define wxBUILTIN_TYPE_INFO( element, type ) \
+ wxBuiltInTypeInfo \
+ s_typeInfo##type(element, &wxToStringConverter<type>, \
+ &wxFromStringConverter<type>, typeid(type).name());
+#else
+ #define wxBUILTIN_TYPE_INFO( element, type ) \
+ void _toString##element( const wxAny& data, wxString &result ) \
+ { wxToStringConverter<type, data, result); } \
+ void _fromString##element( const wxString& data, wxAny &result ) \
+ { wxFromStringConverter<type, data, result); } \
+ wxBuiltInTypeInfo s_typeInfo##type(element, &_toString##element, \
+ &_fromString##element, typeid(type).name());
+#endif
+
+typedef unsigned char unsigned_char;
+typedef unsigned int unsigned_int;
+typedef unsigned long unsigned_long;
+
+wxBuiltInTypeInfo s_typeInfovoid( wxT_VOID, NULL, NULL, typeid(void).name());
+wxBUILTIN_TYPE_INFO( wxT_BOOL, bool);
+wxBUILTIN_TYPE_INFO( wxT_CHAR, char);
+wxBUILTIN_TYPE_INFO( wxT_UCHAR, unsigned_char);
+wxBUILTIN_TYPE_INFO( wxT_INT, int);
+wxBUILTIN_TYPE_INFO( wxT_UINT, unsigned_int);
+wxBUILTIN_TYPE_INFO( wxT_LONG, long);
+wxBUILTIN_TYPE_INFO( wxT_ULONG, unsigned_long);
+wxBUILTIN_TYPE_INFO( wxT_FLOAT, float);
+wxBUILTIN_TYPE_INFO( wxT_DOUBLE, double);
+wxBUILTIN_TYPE_INFO( wxT_STRING, wxString);
+
+#ifdef wxLongLong_t
+wxBUILTIN_TYPE_INFO(wxT_LONGLONG, wxLongLong_t)
+wxBUILTIN_TYPE_INFO(wxT_ULONGLONG, wxULongLong_t)
+#endif
+
+// this are compiler induced specialization which are never used anywhere
+
+wxILLEGAL_TYPE_SPECIALIZATION( char const * )
+wxILLEGAL_TYPE_SPECIALIZATION( char * )
+wxILLEGAL_TYPE_SPECIALIZATION( unsigned char * )
+wxILLEGAL_TYPE_SPECIALIZATION( int * )
+wxILLEGAL_TYPE_SPECIALIZATION( bool * )
+wxILLEGAL_TYPE_SPECIALIZATION( long * )
+wxILLEGAL_TYPE_SPECIALIZATION( wxString * )
+
+// wxRange
+
+template<> void wxStringReadValue(const wxString &s , wxRange &data)