I was playing around with strings to see if there was a route to elide
the constructors of OString and OUStrings especially for global const
strings initialised during startup
So e.g.
static const CONST_AGG_OSTRING(sGlobal, "::");
and
static const CONST_AGG_OUSTRING(TMP, "TMP");
which are, respectively, a thing called sGlobal which can be used fairly
transparently as a const OString and TMP as a const OUString. Both are
created on the stack without a constructor call and avoid duplication of
the string literal itself. I'm not sure it's worth it, but it's sort of
fun.
Clearly as mentioned in the inline comment OUStrings are a challenge so
a real world impl have mess around with per-compiler wchar_t prefixes
and size checks like icu does, and/or hack around with -fshort-wchar
like mozilla appears to do. The horror follows...
#ifndef _STRINGHACK_HXX_
#define _STRINGHACK_HXX_
#include <rtl/string.h>
#include <rtl/ustring.h>
namespace rtl
{
class OString;
class OUString;
}
template<int LENGTH> struct const_OString
{
struct internal_String
{
oslInterlockedCount refCount;
sal_Int32 length;
sal_Char buffer[LENGTH];
};
union
{
const internal_String* pRealData;
rtl_String* pData;
};
const internal_String aData;
operator rtl::OString() const
{
return *(reinterpret_cast<const rtl::OString*>(this));
}
};
#define CONST_AGG_OSTRING( name, constAsciiStr ) \
const_OString<sizeof(constAsciiStr)> name = \
{{&name.aData}, {0x40000000|1, \
((sal_Int32)sizeof(constAsciiStr)-1), \
constAsciiStr}}
//The downside here is that gcc L wchar_t is 32bit by default,
//-fshort-wchar can hack it to 16bits. Some other compilers default to
// 16bit or have alternative prefixes see:
// http://bugs.icu-project.org/trac/ticket/2957
#ifdef SAL_UNICODE_NOTEQUAL_WCHAR_T
#define CONST_AGG_OUSTRING( name, constAsciiStr ) \
::rtl::OUString name(RTL_CONSTASCII_USTRINGPARAM(constAsciiStr))
#else
template<int LENGTH> struct const_OUString
{
struct internal_String
{
oslInterlockedCount refCount;
sal_Int32 length;
wchar_t buffer[LENGTH];
};
union
{
const internal_String* pRealData;
rtl_uString* pData;
};
const internal_String aData;
operator rtl::OUString() const
{
return *(reinterpret_cast<const rtl::OUString*>(this));
}
};
#define CONST_AGG_OUSTRING( name, constAsciiStr ) \
const_OUString<sizeof(constAsciiStr)> name = \
{{&name.aData}, {0x40000000|1, \
((sal_Int32)(sizeof(L##constAsciiStr)/sizeof(wchar_t))-1), \
L##constAsciiStr}}
#endif
#endif
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]