*/
U_INTERNAL inline UBool U_EXPORT2
uprv_isInvariantUnicodeString(const icu::UnicodeString &s) {
- const char16_t *p = s.getBuffer();
-#ifdef U_ALIASING_BARRIER
- U_ALIASING_BARRIER(p);
-#endif
- return uprv_isInvariantUString(reinterpret_cast<const UChar *>(p), s.length());
+ return uprv_isInvariantUString(icu::toUCharPtr(s.getBuffer()), s.length());
}
#endif /* __cplusplus */
* \file
* \brief C++ API: char16_t pointer wrappers with
* implicit conversion to/from bit-compatible raw pointer types.
+ * Also conversion functions from char16_t * to UChar * and OldUChar *.
*/
U_NAMESPACE_BEGIN
#endif
+/**
+ * Converts from const char16_t * to const UChar *.
+ * Includes an aliasing barrier if available.
+ * @param p pointer
+ * @return p as const UChar *
+ * @draft ICU 59
+ */
+inline U_COMMON_API const UChar *toUCharPtr(const char16_t *p) {
+#ifdef U_ALIASING_BARRIER
+ U_ALIASING_BARRIER(p);
+#endif
+ return reinterpret_cast<const UChar *>(p);
+}
+
+/**
+ * Converts from char16_t * to UChar *.
+ * Includes an aliasing barrier if available.
+ * @param p pointer
+ * @return p as UChar *
+ * @draft ICU 59
+ */
+inline U_COMMON_API UChar *toUCharPtr(char16_t *p) {
+#ifdef U_ALIASING_BARRIER
+ U_ALIASING_BARRIER(p);
+#endif
+ return reinterpret_cast<UChar *>(p);
+}
+
+/**
+ * Converts from const char16_t * to const OldUChar *.
+ * Includes an aliasing barrier if available.
+ * @param p pointer
+ * @return p as const OldUChar *
+ * @draft ICU 59
+ */
+inline U_COMMON_API const OldUChar *toOldUCharPtr(const char16_t *p) {
+#ifdef U_ALIASING_BARRIER
+ U_ALIASING_BARRIER(p);
+#endif
+ return reinterpret_cast<const OldUChar *>(p);
+}
+
+/**
+ * Converts from char16_t * to OldUChar *.
+ * Includes an aliasing barrier if available.
+ * @param p pointer
+ * @return p as OldUChar *
+ * @draft ICU 59
+ */
+inline U_COMMON_API OldUChar *toOldUCharPtr(char16_t *p) {
+#ifdef U_ALIASING_BARRIER
+ U_ALIASING_BARRIER(p);
+#endif
+ return reinterpret_cast<OldUChar *>(p);
+}
+
U_NAMESPACE_END
#endif // __CHAR16PTR_H__
Normalizer::compare(const UnicodeString &s1, const UnicodeString &s2,
uint32_t options,
UErrorCode &errorCode) {
- const char16_t *p1 = s1.getBuffer();
- const char16_t *p2 = s2.getBuffer();
-#ifdef U_ALIASING_BARRIER
- U_ALIASING_BARRIER(p1);
- U_ALIASING_BARRIER(p2);
-#endif
// all argument checking is done in unorm_compare
- return unorm_compare(reinterpret_cast<const UChar *>(p1), s1.length(),
- reinterpret_cast<const UChar *>(p2), s2.length(),
+ return unorm_compare(toUCharPtr(s1.getBuffer()), s1.length(),
+ toUCharPtr(s2.getBuffer()), s2.length(),
options,
&errorCode);
}
*
* @stable ICU 4.4
*/
+
#if 1
// #if 1 is normal. UChar defaults to char16_t in C++.
// For configuration testing of UChar=uint16_t temporarily change this to #if 0.
#elif !defined(UCHAR_TYPE)
# define UCHAR_TYPE uint16_t
#endif
+
#if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || \
defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION)
// Inside the ICU library code, never configurable.
typedef uint16_t UChar;
#endif
+/**
+ * \var OldUChar
+ * Default ICU 58 definition of UChar.
+ * A base type for UTF-16 code units and pointers.
+ * Unsigned 16-bit integer.
+ *
+ * Define OldUChar to be wchar_t if that is 16 bits wide.
+ * If wchar_t is not 16 bits wide, then define UChar to be uint16_t.
+ *
+ * This makes the definition of OldUChar platform-dependent
+ * but allows direct string type compatibility with platforms with
+ * 16-bit wchar_t types.
+ *
+ * This is how UChar was defined in ICU 58, for transition convenience.
+ * Exception: ICU 58 UChar was defined to UCHAR_TYPE if that macro was defined.
+ * The current UChar responds to UCHAR_TYPE but OldUChar does not.
+ *
+ * @draft ICU 59
+ */
+#if U_SIZEOF_WCHAR_T==2
+ typedef wchar_t OldUChar;
+#elif defined(__CHAR16_TYPE__)
+ typedef __CHAR16_TYPE__ OldUChar;
+#else
+ typedef uint16_t OldUChar;
+#endif
+
/**
* Define UChar32 as a type for single Unicode code points.
* UChar32 is a signed 32-bit integer (same as int32_t).
virtual UChar32 getChar32At(int32_t offset) const;
private:
- static inline const UChar *constUCharPtr(const char16_t *p) {
-#ifdef U_ALIASING_BARRIER
- U_ALIASING_BARRIER(p);
-#endif
- return reinterpret_cast<const UChar *>(p);
- }
-
// For char* constructors. Could be made public.
UnicodeString &setToUTF8(StringPiece utf8);
// For extract(char*).
inline UBool
UnicodeString::startsWith(ConstChar16Ptr srcChars, int32_t srcLength) const {
if(srcLength < 0) {
- srcLength = u_strlen(constUCharPtr(srcChars));
+ srcLength = u_strlen(toUCharPtr(srcChars));
}
return doCompare(0, srcLength, srcChars, 0, srcLength) == 0;
}
inline UBool
UnicodeString::startsWith(const char16_t *srcChars, int32_t srcStart, int32_t srcLength) const {
if(srcLength < 0) {
- srcLength = u_strlen(constUCharPtr(srcChars));
+ srcLength = u_strlen(toUCharPtr(srcChars));
}
return doCompare(0, srcLength, srcChars, srcStart, srcLength) == 0;
}
UnicodeString::endsWith(ConstChar16Ptr srcChars,
int32_t srcLength) const {
if(srcLength < 0) {
- srcLength = u_strlen(constUCharPtr(srcChars));
+ srcLength = u_strlen(toUCharPtr(srcChars));
}
return doCompare(length() - srcLength, srcLength,
srcChars, 0, srcLength) == 0;
int32_t srcStart,
int32_t srcLength) const {
if(srcLength < 0) {
- srcLength = u_strlen(constUCharPtr(srcChars + srcStart));
+ srcLength = u_strlen(toUCharPtr(srcChars + srcStart));
}
return doCompare(length() - srcLength, srcLength,
srcChars, srcStart, srcLength) == 0;
#endif
U_CDECL_END
-inline const UChar *constUCharPtr(const char16_t *p) {
-#ifdef U_ALIASING_BARRIER
- U_ALIASING_BARRIER(p);
-#endif
- return reinterpret_cast<const UChar *>(p);
-}
-
U_CDECL_BEGIN
static void U_CALLCONV TestStream(void)
{
inTestStream >> inStr >> inStr2;
if (inStr.compare(thisMu) != 0) {
- u_austrncpy(inStrC, constUCharPtr(inStr.getBuffer()), inStr.length());
+ u_austrncpy(inStrC, toUCharPtr(inStr.getBuffer()), inStr.length());
inStrC[inStr.length()] = 0;
log_err("Got: \"%s\", Expected: \"tHis\\u03BC\"\n", inStrC);
}
if (inStr2.compare(mu) != 0) {
- u_austrncpy(inStrC, constUCharPtr(inStr.getBuffer()), inStr.length());
+ u_austrncpy(inStrC, toUCharPtr(inStr.getBuffer()), inStr.length());
inStrC[inStr.length()] = 0;
log_err("Got: \"%s\", Expected: \"mu\"\n", inStrC);
}
#include "unicode/datamap.h"
#include "unicode/resbund.h"
+#include "unicode/unistr.h"
#include "hash.h"
-#include "toolutil.h"
#include <stdlib.h>
DataMap::~DataMap() {}
DataMap::utoi(const UnicodeString &s) const
{
char ch[256];
- const UChar *u = constUCharPtr(s.getBuffer());
+ const UChar *u = toUCharPtr(s.getBuffer());
int32_t len = s.length();
u_UCharsToChars(u, ch, len);
ch[len] = 0; /* include terminating \0 */
static UBool isWellFormed(const UnicodeString &s) {
UErrorCode errorCode=U_ZERO_ERROR;
- u_strToUTF8(NULL, 0, NULL, constUCharPtr(s.getBuffer()), s.length(), &errorCode);
+ u_strToUTF8(NULL, 0, NULL, toUCharPtr(s.getBuffer()), s.length(), &errorCode);
return U_SUCCESS(errorCode) || errorCode==U_BUFFER_OVERFLOW_ERROR;
}
(int)phase, (long)c);
exit(U_INVALID_FORMAT_ERROR);
}
- int32_t numCP=u_countChar32(constUCharPtr(m.getBuffer()), m.length());
+ int32_t numCP=u_countChar32(toUCharPtr(m.getBuffer()), m.length());
if(numCP!=2) {
fprintf(stderr,
"error in gennorm2 phase %d: "
Norm &norm=norms[value];
const UnicodeString &m=*norm.mapping;
UnicodeString *decomposed=NULL;
- const UChar *s=constUCharPtr(m.getBuffer());
+ const UChar *s=toUCharPtr(m.getBuffer());
int32_t length=m.length();
int32_t prev, i=0;
UChar32 c;
if(length>Normalizer2Impl::MAPPING_LENGTH_MASK) {
return; // writeMapping() will complain about it and print the code point.
}
- const UChar *s=constUCharPtr(m.getBuffer());
+ const UChar *s=toUCharPtr(m.getBuffer());
int32_t i=0;
UChar32 c;
while(i<length) {
}
udata_writeBlock(pData, indexes, sizeof(indexes));
udata_writeBlock(pData, norm16TrieBytes.getAlias(), norm16TrieLength);
- udata_writeUString(pData, constUCharPtr(extraData.getBuffer()), extraData.length());
+ udata_writeUString(pData, toUCharPtr(extraData.getBuffer()), extraData.length());
udata_writeBlock(pData, smallFCD, sizeof(smallFCD));
int32_t writtenSize=udata_finish(pData, errorCode);
if(errorCode.isFailure()) {
#include "unicode/ustring.h"
#include "cmemory.h"
#include "cstring.h"
-#include "toolutil.h"
#include "uhash.h"
#include "unewdata.h"
#include "uresdata.h"
StringBaseResource(int8_t type, const UChar *value, int32_t len, UErrorCode &errorCode);
virtual ~StringBaseResource();
- const UChar *getBuffer() const { return icu::constUCharPtr(fString.getBuffer()); }
+ const UChar *getBuffer() const { return icu::toUCharPtr(fString.getBuffer()); }
int32_t length() const { return fString.length(); }
virtual void handlePreWrite(uint32_t *byteOffset);
#include "unicode/uchar.h"
#include "ustr.h"
#include "prscmnts.h"
-#include "toolutil.h"
#include "unicode/unistr.h"
#include "unicode/utf8.h"
#include "unicode/utf16.h"
u_strToUTF8(NULL,
0,
&len,
- constUCharPtr(outString.getBuffer()),
+ toUCharPtr(outString.getBuffer()),
outString.length(),
&status);
u_strToUTF8(dest,
len,
&len,
- constUCharPtr(outString.getBuffer()),
+ toUCharPtr(outString.getBuffer()),
outString.length(),
&status);
#include "unicode/unistr.h"
#include "unicode/ustring.h"
-#include "toolutil.h"
#include "util.h"
#include "ucln.h"
udbg_stoi(const UnicodeString &s)
{
char ch[256];
- const UChar *u = constUCharPtr(s.getBuffer());
+ const UChar *u = toUCharPtr(s.getBuffer());
int32_t len = s.length();
u_UCharsToChars(u, ch, len);
ch[len] = 0; /* include terminating \0 */
udbg_stod(const UnicodeString &s)
{
char ch[256];
- const UChar *u = constUCharPtr(s.getBuffer());
+ const UChar *u = toUCharPtr(s.getBuffer());
int32_t len = s.length();
u_UCharsToChars(u, ch, len);
ch[len] = 0; /* include terminating \0 */
#include "charstr.h"
#include "cstring.h"
#include "ppucd.h"
-#include "toolutil.h"
#include "uassert.h"
#include "uparse.h"
void
PreparsedUCD::parseString(const char *s, UnicodeString &uni, UErrorCode &errorCode) {
- UChar *buffer=UCharPtr(uni.getBuffer(-1));
+ UChar *buffer=toUCharPtr(uni.getBuffer(-1));
int32_t length=u_parseString(s, buffer, uni.getCapacity(), NULL, &errorCode);
if(errorCode==U_BUFFER_OVERFLOW_ERROR) {
errorCode=U_ZERO_ERROR;
uni.releaseBuffer(0);
- buffer=UCharPtr(uni.getBuffer(length));
+ buffer=toUCharPtr(uni.getBuffer(length));
length=u_parseString(s, buffer, uni.getCapacity(), NULL, &errorCode);
}
uni.releaseBuffer(length);
U_NAMESPACE_BEGIN
-inline const UChar *constUCharPtr(const char16_t *p) {
-#ifdef U_ALIASING_BARRIER
- U_ALIASING_BARRIER(p);
-#endif
- return reinterpret_cast<const UChar *>(p);
-}
-
-inline UChar *UCharPtr(char16_t *p) {
-#ifdef U_ALIASING_BARRIER
- U_ALIASING_BARRIER(p);
-#endif
- return reinterpret_cast<UChar *>(p);
-}
-
/**
* ErrorCode subclass for use in ICU command-line tools.
* The destructor calls handleFailure() which calls exit(errorCode) when isFailure().
#include "unicode/ucnv.h"
#include "unicode/regex.h"
#include "filestrm.h"
-#include "toolutil.h"
#include "xmlparser.h"
#if !UCONFIG_NO_REGULAR_EXPRESSIONS && !UCONFIG_NO_CONVERSION
goto exit;
}
- buffer=UCharPtr(src.getBuffer(bytesLength));
+ buffer=toUCharPtr(src.getBuffer(bytesLength));
if(buffer==NULL) {
// unexpected failure to reserve some string capacity
errorCode=U_MEMORY_ALLOCATION_ERROR;
pb=bytes;
for(;;) {
length=src.length();
- buffer=UCharPtr(src.getBuffer(capacity));
+ buffer=toUCharPtr(src.getBuffer(capacity));
if(buffer==NULL) {
// unexpected failure to reserve some string capacity
errorCode=U_MEMORY_ALLOCATION_ERROR;