10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2017 and later: Unicode, Inc. and others. 20596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 30596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 40596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// char16ptr.h 50596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// created: 2017feb28 Markus W. Scherer 60596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 70596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifndef __CHAR16PTR_H__ 80596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#define __CHAR16PTR_H__ 90596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 100596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#include <cstddef> 110596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#include "unicode/utypes.h" 120596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 130596faeddefbf198de137d5e893708495ab1584cFredrik Roubert/** 140596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * \file 150596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * \brief C++ API: char16_t pointer wrappers with 160596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * implicit conversion from bit-compatible raw pointer types. 170596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Also conversion functions from char16_t * to UChar * and OldUChar *. 180596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 190596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 200596faeddefbf198de137d5e893708495ab1584cFredrik RoubertU_NAMESPACE_BEGIN 210596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 220596faeddefbf198de137d5e893708495ab1584cFredrik Roubert/** 230596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * \def U_ALIASING_BARRIER 240596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Barrier for pointer anti-aliasing optimizations even across function boundaries. 250596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @internal 260596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 270596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 280596faeddefbf198de137d5e893708495ab1584cFredrik Roubert // Use the predefined value. 290596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#elif (defined(__clang__) || defined(__GNUC__)) && U_PLATFORM != U_PF_BROWSER_NATIVE_CLIENT 300596faeddefbf198de137d5e893708495ab1584cFredrik Roubert# define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory") 310596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 320596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 330596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// Do not use #ifndef U_HIDE_DRAFT_API for the following class, it 340596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// is now used in place of UChar* in several stable C++ methods 350596faeddefbf198de137d5e893708495ab1584cFredrik Roubert/** 360596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. 370596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 380596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 390596faeddefbf198de137d5e893708495ab1584cFredrik Roubertclass U_COMMON_API Char16Ptr U_FINAL { 400596faeddefbf198de137d5e893708495ab1584cFredrik Roubertpublic: 410596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 420596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Copies the pointer. 430596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer 440596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 450596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 460596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline Char16Ptr(char16_t *p); 470596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if !U_CHAR16_IS_TYPEDEF 480596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 490596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Converts the pointer to char16_t *. 500596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer to be converted 510596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 520596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 530596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline Char16Ptr(uint16_t *p); 540596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 550596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) 560596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 570596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Converts the pointer to char16_t *. 580596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * (Only defined if U_SIZEOF_WCHAR_T==2.) 590596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer to be converted 600596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 610596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 620596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline Char16Ptr(wchar_t *p); 630596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 640596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 650596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * nullptr constructor. 660596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p nullptr 670596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 680596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 690596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline Char16Ptr(std::nullptr_t p); 700596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 710596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Destructor. 720596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 730596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 740596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline ~Char16Ptr(); 750596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 760596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 770596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Pointer access. 780596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @return the wrapped pointer 790596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 800596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 810596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline char16_t *get() const; 820596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 830596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * char16_t pointer access via type conversion (e.g., static_cast). 840596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @return the wrapped pointer 850596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 860596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 870596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline operator char16_t *() const { return get(); } 880596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 890596faeddefbf198de137d5e893708495ab1584cFredrik Roubertprivate: 900596faeddefbf198de137d5e893708495ab1584cFredrik Roubert Char16Ptr() = delete; 910596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 920596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 930596faeddefbf198de137d5e893708495ab1584cFredrik Roubert template<typename T> static char16_t *cast(T *t) { 940596faeddefbf198de137d5e893708495ab1584cFredrik Roubert U_ALIASING_BARRIER(t); 950596faeddefbf198de137d5e893708495ab1584cFredrik Roubert return reinterpret_cast<char16_t *>(t); 960596faeddefbf198de137d5e893708495ab1584cFredrik Roubert } 970596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 98ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert char16_t *p_; 990596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#else 1000596faeddefbf198de137d5e893708495ab1584cFredrik Roubert union { 1010596faeddefbf198de137d5e893708495ab1584cFredrik Roubert char16_t *cp; 1020596faeddefbf198de137d5e893708495ab1584cFredrik Roubert uint16_t *up; 1030596faeddefbf198de137d5e893708495ab1584cFredrik Roubert wchar_t *wp; 104ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert } u_; 1050596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 1060596faeddefbf198de137d5e893708495ab1584cFredrik Roubert}; 1070596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 1080596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 1090596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 110ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertChar16Ptr::Char16Ptr(char16_t *p) : p_(p) {} 1110596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if !U_CHAR16_IS_TYPEDEF 112ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertChar16Ptr::Char16Ptr(uint16_t *p) : p_(cast(p)) {} 1130596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 1140596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if U_SIZEOF_WCHAR_T==2 115ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertChar16Ptr::Char16Ptr(wchar_t *p) : p_(cast(p)) {} 1160596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 117ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertChar16Ptr::Char16Ptr(std::nullptr_t p) : p_(p) {} 1180596faeddefbf198de137d5e893708495ab1584cFredrik RoubertChar16Ptr::~Char16Ptr() { 119ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert U_ALIASING_BARRIER(p_); 1200596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 1210596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 122ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertchar16_t *Char16Ptr::get() const { return p_; } 1230596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 1240596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#else 1250596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 126ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertChar16Ptr::Char16Ptr(char16_t *p) { u_.cp = p; } 1270596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if !U_CHAR16_IS_TYPEDEF 128ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertChar16Ptr::Char16Ptr(uint16_t *p) { u_.up = p; } 1290596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 1300596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if U_SIZEOF_WCHAR_T==2 131ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertChar16Ptr::Char16Ptr(wchar_t *p) { u_.wp = p; } 1320596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 133ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertChar16Ptr::Char16Ptr(std::nullptr_t p) { u_.cp = p; } 1340596faeddefbf198de137d5e893708495ab1584cFredrik RoubertChar16Ptr::~Char16Ptr() {} 1350596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 136ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertchar16_t *Char16Ptr::get() const { return u_.cp; } 1370596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 1380596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 1390596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 1400596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// Do not use #ifndef U_HIDE_DRAFT_API for the following class, it is 1410596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// now used in place of const UChar* in several stable C++ methods 1420596faeddefbf198de137d5e893708495ab1584cFredrik Roubert/** 1430596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * const char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types. 1440596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 1450596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 1460596faeddefbf198de137d5e893708495ab1584cFredrik Roubertclass U_COMMON_API ConstChar16Ptr U_FINAL { 1470596faeddefbf198de137d5e893708495ab1584cFredrik Roubertpublic: 1480596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 1490596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Copies the pointer. 1500596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer 1510596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 1520596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 1530596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline ConstChar16Ptr(const char16_t *p); 1540596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if !U_CHAR16_IS_TYPEDEF 1550596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 1560596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Converts the pointer to char16_t *. 1570596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer to be converted 1580596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 1590596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 1600596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline ConstChar16Ptr(const uint16_t *p); 1610596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 1620596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN) 1630596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 1640596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Converts the pointer to char16_t *. 1650596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * (Only defined if U_SIZEOF_WCHAR_T==2.) 1660596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer to be converted 1670596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 1680596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 1690596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline ConstChar16Ptr(const wchar_t *p); 1700596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 1710596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 1720596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * nullptr constructor. 1730596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p nullptr 1740596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 1750596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 1760596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline ConstChar16Ptr(const std::nullptr_t p); 1770596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 1780596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 1790596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Destructor. 1800596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 1810596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 1820596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline ~ConstChar16Ptr(); 1830596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 1840596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 1850596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Pointer access. 1860596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @return the wrapped pointer 1870596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 1880596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 1890596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline const char16_t *get() const; 1900596faeddefbf198de137d5e893708495ab1584cFredrik Roubert /** 1910596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * char16_t pointer access via type conversion (e.g., static_cast). 1920596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @return the wrapped pointer 1930596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 1940596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 1950596faeddefbf198de137d5e893708495ab1584cFredrik Roubert inline operator const char16_t *() const { return get(); } 1960596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 1970596faeddefbf198de137d5e893708495ab1584cFredrik Roubertprivate: 1980596faeddefbf198de137d5e893708495ab1584cFredrik Roubert ConstChar16Ptr() = delete; 1990596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 2000596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 2010596faeddefbf198de137d5e893708495ab1584cFredrik Roubert template<typename T> static const char16_t *cast(const T *t) { 2020596faeddefbf198de137d5e893708495ab1584cFredrik Roubert U_ALIASING_BARRIER(t); 2030596faeddefbf198de137d5e893708495ab1584cFredrik Roubert return reinterpret_cast<const char16_t *>(t); 2040596faeddefbf198de137d5e893708495ab1584cFredrik Roubert } 2050596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 206ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert const char16_t *p_; 2070596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#else 2080596faeddefbf198de137d5e893708495ab1584cFredrik Roubert union { 2090596faeddefbf198de137d5e893708495ab1584cFredrik Roubert const char16_t *cp; 2100596faeddefbf198de137d5e893708495ab1584cFredrik Roubert const uint16_t *up; 2110596faeddefbf198de137d5e893708495ab1584cFredrik Roubert const wchar_t *wp; 212ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert } u_; 2130596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 2140596faeddefbf198de137d5e893708495ab1584cFredrik Roubert}; 2150596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 2160596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 2170596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 218ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {} 2190596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if !U_CHAR16_IS_TYPEDEF 220ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p_(cast(p)) {} 2210596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 2220596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if U_SIZEOF_WCHAR_T==2 223ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p_(cast(p)) {} 2240596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 225ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p_(p) {} 2260596faeddefbf198de137d5e893708495ab1584cFredrik RoubertConstChar16Ptr::~ConstChar16Ptr() { 227ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert U_ALIASING_BARRIER(p_); 2280596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 2290596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 230ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertconst char16_t *ConstChar16Ptr::get() const { return p_; } 2310596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 2320596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#else 2330596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 234ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u_.cp = p; } 2350596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if !U_CHAR16_IS_TYPEDEF 236ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u_.up = p; } 2370596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 2380596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#if U_SIZEOF_WCHAR_T==2 239ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u_.wp = p; } 2400596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 241ffdc27edd5503111189fc11165c5a11289a71f79Fredrik RoubertConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u_.cp = p; } 2420596faeddefbf198de137d5e893708495ab1584cFredrik RoubertConstChar16Ptr::~ConstChar16Ptr() {} 2430596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 244ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubertconst char16_t *ConstChar16Ptr::get() const { return u_.cp; } 2450596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 2460596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 2470596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 2480596faeddefbf198de137d5e893708495ab1584cFredrik Roubert/** 2490596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Converts from const char16_t * to const UChar *. 2500596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Includes an aliasing barrier if available. 2510596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer 2520596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @return p as const UChar * 2530596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 2540596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 2550596faeddefbf198de137d5e893708495ab1584cFredrik Roubertinline const UChar *toUCharPtr(const char16_t *p) { 2560596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 2570596faeddefbf198de137d5e893708495ab1584cFredrik Roubert U_ALIASING_BARRIER(p); 2580596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 2590596faeddefbf198de137d5e893708495ab1584cFredrik Roubert return reinterpret_cast<const UChar *>(p); 2600596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 2610596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 2620596faeddefbf198de137d5e893708495ab1584cFredrik Roubert/** 2630596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Converts from char16_t * to UChar *. 2640596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Includes an aliasing barrier if available. 2650596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer 2660596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @return p as UChar * 2670596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 2680596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 2690596faeddefbf198de137d5e893708495ab1584cFredrik Roubertinline UChar *toUCharPtr(char16_t *p) { 2700596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 2710596faeddefbf198de137d5e893708495ab1584cFredrik Roubert U_ALIASING_BARRIER(p); 2720596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 2730596faeddefbf198de137d5e893708495ab1584cFredrik Roubert return reinterpret_cast<UChar *>(p); 2740596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 2750596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 2760596faeddefbf198de137d5e893708495ab1584cFredrik Roubert/** 2770596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Converts from const char16_t * to const OldUChar *. 2780596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Includes an aliasing barrier if available. 2790596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer 2800596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @return p as const OldUChar * 2810596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 2820596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 2830596faeddefbf198de137d5e893708495ab1584cFredrik Roubertinline const OldUChar *toOldUCharPtr(const char16_t *p) { 2840596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 2850596faeddefbf198de137d5e893708495ab1584cFredrik Roubert U_ALIASING_BARRIER(p); 2860596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 2870596faeddefbf198de137d5e893708495ab1584cFredrik Roubert return reinterpret_cast<const OldUChar *>(p); 2880596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 2890596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 2900596faeddefbf198de137d5e893708495ab1584cFredrik Roubert/** 2910596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Converts from char16_t * to OldUChar *. 2920596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * Includes an aliasing barrier if available. 2930596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @param p pointer 2940596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @return p as OldUChar * 2950596faeddefbf198de137d5e893708495ab1584cFredrik Roubert * @draft ICU 59 2960596faeddefbf198de137d5e893708495ab1584cFredrik Roubert */ 2970596faeddefbf198de137d5e893708495ab1584cFredrik Roubertinline OldUChar *toOldUCharPtr(char16_t *p) { 2980596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#ifdef U_ALIASING_BARRIER 2990596faeddefbf198de137d5e893708495ab1584cFredrik Roubert U_ALIASING_BARRIER(p); 3000596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif 3010596faeddefbf198de137d5e893708495ab1584cFredrik Roubert return reinterpret_cast<OldUChar *>(p); 3020596faeddefbf198de137d5e893708495ab1584cFredrik Roubert} 3030596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 3040596faeddefbf198de137d5e893708495ab1584cFredrik RoubertU_NAMESPACE_END 3050596faeddefbf198de137d5e893708495ab1584cFredrik Roubert 3060596faeddefbf198de137d5e893708495ab1584cFredrik Roubert#endif // __CHAR16PTR_H__ 307