]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/chartype.h
A better fix for wxHash{Map,Set} with g++ 4.7.
[wxWidgets.git] / include / wx / chartype.h
index 64f7147cbbc744d1c0a1be43059fe0518e32aaf0..b2c3342500e1c2ea41d7b6359129bfbc06cdfa5c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Name:        wx/chartype.h
  * Purpose:     Declarations of wxChar and related types
 /*
  * Name:        wx/chartype.h
  * Purpose:     Declarations of wxChar and related types
- * Author:      Joel Farley, Ove Kåven
+ * Author:      Joel Farley, Ove Kåven
  * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
  * Created:     1998/06/12
  * RCS-ID:      $Id$
  * Modified by: Vadim Zeitlin, Robert Roebling, Ron Lee
  * Created:     1998/06/12
  * RCS-ID:      $Id$
@@ -38,8 +38,8 @@
 #endif /* !defined(wxUSE_WCHAR_T) */
 
 /* Unicode support requires wchar_t */
 #endif /* !defined(wxUSE_WCHAR_T) */
 
 /* Unicode support requires wchar_t */
-#if wxUSE_UNICODE && !wxUSE_WCHAR_T
-    #error "wchar_t must be available in Unicode build"
+#if !wxUSE_WCHAR_T
+    #error "wchar_t must be available"
 #endif /* Unicode */
 
 /*
 #endif /* Unicode */
 
 /*
 
    Actually MinGW has tchar.h, but it does not include wchar.h
  */
 
    Actually MinGW has tchar.h, but it does not include wchar.h
  */
-#if defined(__MWERKS__) || defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__)
+#if defined(__VISAGECPP__) || defined(__MINGW32__) || defined(__WATCOMC__)
     #ifndef HAVE_WCHAR_H
         #define HAVE_WCHAR_H
     #endif
 #endif
     #ifndef HAVE_WCHAR_H
         #define HAVE_WCHAR_H
     #endif
 #endif
-#if defined(__MWERKS__) && !defined(__MACH__)
-    #ifndef HAVE_WCSLEN
-        #define HAVE_WCSLEN
-    #endif
-#endif
 
 
-#if wxUSE_WCHAR_T
-    #ifdef HAVE_WCHAR_H
-        /* the current (as of Nov 2002) version of cygwin has a bug in its */
-        /* wchar.h -- there is no extern "C" around the declarations in it */
-        /* and this results in linking errors later; also, at least on some */
-        /* Cygwin versions, wchar.h requires sys/types.h */
-        #ifdef __CYGWIN__
-            #include <sys/types.h>
-            #ifdef __cplusplus
-                extern "C" {
-            #endif
-        #endif /* Cygwin */
-
-        #include <wchar.h>
-
-        #if defined(__CYGWIN__) && defined(__cplusplus)
-            }
-        #endif /* Cygwin and C++ */
-
-    #elif defined(HAVE_WCSTR_H)
-        /* old compilers have relevant declarations here */
-        #include <wcstr.h>
-    #elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__)
-        /* include stdlib.h for wchar_t */
-        #include <stdlib.h>
-    #endif /* HAVE_WCHAR_H */
-
-    #ifdef HAVE_WIDEC_H
-        #include <widec.h>
-    #endif
-#endif /* wxUSE_WCHAR_T */
+#ifdef HAVE_WCHAR_H
+    /* the current (as of Nov 2002) version of cygwin has a bug in its */
+    /* wchar.h -- there is no extern "C" around the declarations in it */
+    /* and this results in linking errors later; also, at least on some */
+    /* Cygwin versions, wchar.h requires sys/types.h */
+    #ifdef __CYGWIN__
+        #include <sys/types.h>
+        #ifdef __cplusplus
+            extern "C" {
+        #endif
+    #endif /* Cygwin */
+
+    #include <wchar.h>
+
+    #if defined(__CYGWIN__) && defined(__cplusplus)
+        }
+    #endif /* Cygwin and C++ */
+
+#elif defined(HAVE_WCSTR_H)
+    /* old compilers have relevant declarations here */
+    #include <wcstr.h>
+#elif defined(__FreeBSD__) || defined(__DARWIN__) || defined(__EMX__)
+    /* include stdlib.h for wchar_t */
+    #include <stdlib.h>
+#endif /* HAVE_WCHAR_H */
+
+#ifdef HAVE_WIDEC_H
+    #include <widec.h>
+#endif
 
 /* -------------------------------------------------------------------------- */
 /* define wxHAVE_TCHAR_SUPPORT for the compilers which support the TCHAR type */
 
 /* -------------------------------------------------------------------------- */
 /* define wxHAVE_TCHAR_SUPPORT for the compilers which support the TCHAR type */
     #define wxHAVE_TCHAR_SUPPORT
 #elif defined(__DMC__)
     #define wxHAVE_TCHAR_SUPPORT
     #define wxHAVE_TCHAR_SUPPORT
 #elif defined(__DMC__)
     #define wxHAVE_TCHAR_SUPPORT
-#elif defined(__WXPALMOS__)
-    #include <stddef.h>
 #elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 )
     #define wxHAVE_TCHAR_SUPPORT
     #include <stddef.h>
 #elif defined(__MINGW32__) && wxCHECK_W32API_VERSION( 1, 0 )
     #define wxHAVE_TCHAR_SUPPORT
     #include <stddef.h>
     typedef char wxChar;
     typedef signed char wxSChar;
     typedef unsigned char wxUChar;
     typedef char wxChar;
     typedef signed char wxSChar;
     typedef unsigned char wxUChar;
-#else /* Unicode */
+#else
     /* VZ: note that VC++ defines _T[SU]CHAR simply as wchar_t and not as    */
     /*     signed/unsigned version of it which (a) makes sense to me (unlike */
     /*     char wchar_t is always unsigned) and (b) was how the previous     */
     /* VZ: note that VC++ defines _T[SU]CHAR simply as wchar_t and not as    */
     /*     signed/unsigned version of it which (a) makes sense to me (unlike */
     /*     char wchar_t is always unsigned) and (b) was how the previous     */
 
 
 /* ------------------------------------------------------------------------- */
 
 
 /* ------------------------------------------------------------------------- */
-/* define _T() and related macros                                            */
+/* define wxT() and related macros                                           */
 /* ------------------------------------------------------------------------- */
 
 /* BSD systems define _T() to be something different in ctype.h, override it */
 /* ------------------------------------------------------------------------- */
 
 /* BSD systems define _T() to be something different in ctype.h, override it */
     #undef _T
 #endif
 
     #undef _T
 #endif
 
-/* could already be defined by tchar.h (it's quasi standard) */
-#ifndef _T
+/*
+   wxT ("wx text") macro turns a literal string constant into a wide char
+   constant. It is mostly unnecessary with wx 2.9 but defined for
+   compatibility.
+ */
+#ifndef wxT
     #if !wxUSE_UNICODE
     #if !wxUSE_UNICODE
-        #define _T(x) x
+        #define wxT(x) x
     #else /* Unicode */
     #else /* Unicode */
-        /* use wxCONCAT_HELPER so that x could be expanded if it's a macro */
-        #define _T(x) wxCONCAT_HELPER(L, x)
+        /*
+            Notice that we use an intermediate macro to allow x to be expanded
+            if it's a macro itself.
+         */
+        #ifndef wxCOMPILER_BROKEN_CONCAT_OPER
+            #define wxT(x) wxCONCAT_HELPER(L, x)
+        #else
+            #define wxT(x) wxPREPEND_L(x)
+        #endif
     #endif /* ASCII/Unicode */
     #endif /* ASCII/Unicode */
-#endif /* !defined(_T) */
+#endif /* !defined(wxT) */
+
+/*
+    wxT_2 exists only for compatibility with wx 2.x and is the same as wxT() in
+    that version but nothing in the newer ones.
+ */
+#define wxT_2(x) x
 
 /*
    wxS ("wx string") macro can be used to create literals using the same
 
 /*
    wxS ("wx string") macro can be used to create literals using the same
    builds everywhere (see wxStringCharType definition above).
  */
 #if wxUSE_UNICODE_WCHAR
    builds everywhere (see wxStringCharType definition above).
  */
 #if wxUSE_UNICODE_WCHAR
-    #define wxS(x) wxCONCAT_HELPER(L, x)
+    /*
+        As above with wxT(), wxS() argument is expanded if it's a macro.
+     */
+    #ifndef wxCOMPILER_BROKEN_CONCAT_OPER
+        #define wxS(x) wxCONCAT_HELPER(L, x)
+    #else
+        #define wxS(x) wxPREPEND_L(x)
+    #endif
 #else /* wxUSE_UNICODE_UTF8 || ANSI */
     #define wxS(x) x
 #endif
 
 #else /* wxUSE_UNICODE_UTF8 || ANSI */
     #define wxS(x) x
 #endif
 
-/* although global macros with such names are normally bad, we want to have  */
-/* another name for _T() which should be used to avoid confusion between     */
-/* _T() and _() in wxWidgets sources */
-#define wxT(x)       _T(x)
+/*
+    _T() is a synonym for wxT() familiar to Windows programmers. As this macro
+    has even higher risk of conflicting with system headers, its use is
+    discouraged and you may predefine wxNO__T to disable it. Additionally, we
+    do it ourselves for Sun CC which is known to use it in its standard headers
+    (see #10660).
+ */
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+    #ifndef wxNO__T
+        #define wxNO__T
+    #endif
+#endif
+
+#if !defined(_T) && !defined(wxNO__T)
+    #define _T(x) wxT(x)
+#endif
 
 /* a helper macro allowing to make another macro Unicode-friendly, see below */
 
 /* a helper macro allowing to make another macro Unicode-friendly, see below */
-#define wxAPPLY_T(x) _T(x)
+#define wxAPPLY_T(x) wxT(x)
 
 /* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */
 #ifndef __TFILE__
 
 /* Unicode-friendly __FILE__, __DATE__ and __TIME__ analogs */
 #ifndef __TFILE__