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