const size_t wxString::npos = (size_t) -1;
#if wxUSE_STRING_POS_CACHE
+
+#ifdef wxHAS_COMPILER_TLS
+
wxTLS_TYPE(wxString::Cache) wxString::ms_cache;
+#else // !wxHAS_COMPILER_TLS
+
+struct wxStrCacheInitializer
+{
+ wxStrCacheInitializer()
+ {
+ // calling this function triggers s_cache initialization in it, and
+ // from now on it becomes safe to call from multiple threads
+ wxString::GetCache();
+ }
+};
+
+/*
+wxString::Cache& wxString::GetCache()
+{
+ static wxTLS_TYPE(Cache) s_cache;
+
+ return wxTLS_VALUE(s_cache);
+}
+*/
+
+static wxStrCacheInitializer gs_stringCacheInit;
+
+#endif // wxHAS_COMPILER_TLS/!wxHAS_COMPILER_TLS
+
// gdb seems to be unable to display thread-local variables correctly, at least
// not my 6.4.98 version under amd64, so provide this debugging helper to do it
#ifdef __WXDEBUG__
for ( unsigned n = 0; n < wxString::Cache::SIZE; n++ )
{
const wxString::Cache::Element&
- c = wxString::ms_cache.cached[n];
+ c = wxString::GetCacheBegin()[n];
printf("\t%u%s\t%p: pos=(%lu, %lu), len=%ld\n",
n,
- n == wxString::ms_cache.lastUsed ? " [*]" : "",
+ n == wxString::LastUsedCacheElement() ? " [*]" : "",
c.str,
(unsigned long)c.pos,
(unsigned long)c.impl,
wxString::CacheStats wxString::ms_cacheStats;
-namespace
+struct wxStrCacheStatsDumper
{
-
-struct ShowCacheStats
-{
- ~ShowCacheStats()
+ ~wxStrCacheStatsDumper()
{
const wxString::CacheStats& stats = wxString::ms_cacheStats;
stats.lentot, 100.*float(stats.lenhits)/stats.lentot);
}
}
-} s_showCacheStats;
+};
-} // anonymous namespace
+static wxStrCacheStatsDumper s_showCacheStats;
#endif // wxPROFILE_STRING_CACHE
// wxCharBufferType<T>
// ----------------------------------------------------------------------------
+#ifndef __VMS_BROKEN_TEMPLATES
template<>
+#endif
wxCharTypeBuffer<char>::Data
wxCharTypeBuffer<char>::NullData(NULL);
+#ifndef __VMS_BROKEN_TEMPLATES
template<>
+#endif
wxCharTypeBuffer<wchar_t>::Data
wxCharTypeBuffer<wchar_t>::NullData(NULL);