123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- // © 2017 and later: Unicode, Inc. and others.
- // License & terms of use: http://www.unicode.org/copyright.html
- // char16ptr.h
- // created: 2017feb28 Markus W. Scherer
- #ifndef __CHAR16PTR_H__
- #define __CHAR16PTR_H__
- #include "unicode/utypes.h"
- #if U_SHOW_CPLUSPLUS_API
- #include <cstddef>
- /**
- * \file
- * \brief C++ API: char16_t pointer wrappers with
- * implicit conversion from bit-compatible raw pointer types.
- * Also conversion functions from char16_t * to UChar * and OldUChar *.
- */
- U_NAMESPACE_BEGIN
- /**
- * \def U_ALIASING_BARRIER
- * Barrier for pointer anti-aliasing optimizations even across function boundaries.
- * @internal
- */
- #ifdef U_ALIASING_BARRIER
- // Use the predefined value.
- #elif (defined(__clang__) || defined(__GNUC__)) && U_PLATFORM != U_PF_BROWSER_NATIVE_CLIENT
- # define U_ALIASING_BARRIER(ptr) asm volatile("" : : "rm"(ptr) : "memory")
- #elif defined(U_IN_DOXYGEN)
- # define U_ALIASING_BARRIER(ptr)
- #endif
- /**
- * char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types.
- * @stable ICU 59
- */
- class U_COMMON_API Char16Ptr final {
- public:
- /**
- * Copies the pointer.
- * @param p pointer
- * @stable ICU 59
- */
- inline Char16Ptr(char16_t *p);
- #if !U_CHAR16_IS_TYPEDEF
- /**
- * Converts the pointer to char16_t *.
- * @param p pointer to be converted
- * @stable ICU 59
- */
- inline Char16Ptr(uint16_t *p);
- #endif
- #if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)
- /**
- * Converts the pointer to char16_t *.
- * (Only defined if U_SIZEOF_WCHAR_T==2.)
- * @param p pointer to be converted
- * @stable ICU 59
- */
- inline Char16Ptr(wchar_t *p);
- #endif
- /**
- * nullptr constructor.
- * @param p nullptr
- * @stable ICU 59
- */
- inline Char16Ptr(std::nullptr_t p);
- /**
- * Destructor.
- * @stable ICU 59
- */
- inline ~Char16Ptr();
- /**
- * Pointer access.
- * @return the wrapped pointer
- * @stable ICU 59
- */
- inline char16_t *get() const;
- /**
- * char16_t pointer access via type conversion (e.g., static_cast).
- * @return the wrapped pointer
- * @stable ICU 59
- */
- inline operator char16_t *() const { return get(); }
- private:
- Char16Ptr() = delete;
- #ifdef U_ALIASING_BARRIER
- template<typename T> static char16_t *cast(T *t) {
- U_ALIASING_BARRIER(t);
- return reinterpret_cast<char16_t *>(t);
- }
- char16_t *p_;
- #else
- union {
- char16_t *cp;
- uint16_t *up;
- wchar_t *wp;
- } u_;
- #endif
- };
- /// \cond
- #ifdef U_ALIASING_BARRIER
- Char16Ptr::Char16Ptr(char16_t *p) : p_(p) {}
- #if !U_CHAR16_IS_TYPEDEF
- Char16Ptr::Char16Ptr(uint16_t *p) : p_(cast(p)) {}
- #endif
- #if U_SIZEOF_WCHAR_T==2
- Char16Ptr::Char16Ptr(wchar_t *p) : p_(cast(p)) {}
- #endif
- Char16Ptr::Char16Ptr(std::nullptr_t p) : p_(p) {}
- Char16Ptr::~Char16Ptr() {
- U_ALIASING_BARRIER(p_);
- }
- char16_t *Char16Ptr::get() const { return p_; }
- #else
- Char16Ptr::Char16Ptr(char16_t *p) { u_.cp = p; }
- #if !U_CHAR16_IS_TYPEDEF
- Char16Ptr::Char16Ptr(uint16_t *p) { u_.up = p; }
- #endif
- #if U_SIZEOF_WCHAR_T==2
- Char16Ptr::Char16Ptr(wchar_t *p) { u_.wp = p; }
- #endif
- Char16Ptr::Char16Ptr(std::nullptr_t p) { u_.cp = p; }
- Char16Ptr::~Char16Ptr() {}
- char16_t *Char16Ptr::get() const { return u_.cp; }
- #endif
- /// \endcond
- /**
- * const char16_t * wrapper with implicit conversion from distinct but bit-compatible pointer types.
- * @stable ICU 59
- */
- class U_COMMON_API ConstChar16Ptr final {
- public:
- /**
- * Copies the pointer.
- * @param p pointer
- * @stable ICU 59
- */
- inline ConstChar16Ptr(const char16_t *p);
- #if !U_CHAR16_IS_TYPEDEF
- /**
- * Converts the pointer to char16_t *.
- * @param p pointer to be converted
- * @stable ICU 59
- */
- inline ConstChar16Ptr(const uint16_t *p);
- #endif
- #if U_SIZEOF_WCHAR_T==2 || defined(U_IN_DOXYGEN)
- /**
- * Converts the pointer to char16_t *.
- * (Only defined if U_SIZEOF_WCHAR_T==2.)
- * @param p pointer to be converted
- * @stable ICU 59
- */
- inline ConstChar16Ptr(const wchar_t *p);
- #endif
- /**
- * nullptr constructor.
- * @param p nullptr
- * @stable ICU 59
- */
- inline ConstChar16Ptr(const std::nullptr_t p);
- /**
- * Destructor.
- * @stable ICU 59
- */
- inline ~ConstChar16Ptr();
- /**
- * Pointer access.
- * @return the wrapped pointer
- * @stable ICU 59
- */
- inline const char16_t *get() const;
- /**
- * char16_t pointer access via type conversion (e.g., static_cast).
- * @return the wrapped pointer
- * @stable ICU 59
- */
- inline operator const char16_t *() const { return get(); }
- private:
- ConstChar16Ptr() = delete;
- #ifdef U_ALIASING_BARRIER
- template<typename T> static const char16_t *cast(const T *t) {
- U_ALIASING_BARRIER(t);
- return reinterpret_cast<const char16_t *>(t);
- }
- const char16_t *p_;
- #else
- union {
- const char16_t *cp;
- const uint16_t *up;
- const wchar_t *wp;
- } u_;
- #endif
- };
- /// \cond
- #ifdef U_ALIASING_BARRIER
- ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) : p_(p) {}
- #if !U_CHAR16_IS_TYPEDEF
- ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) : p_(cast(p)) {}
- #endif
- #if U_SIZEOF_WCHAR_T==2
- ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) : p_(cast(p)) {}
- #endif
- ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) : p_(p) {}
- ConstChar16Ptr::~ConstChar16Ptr() {
- U_ALIASING_BARRIER(p_);
- }
- const char16_t *ConstChar16Ptr::get() const { return p_; }
- #else
- ConstChar16Ptr::ConstChar16Ptr(const char16_t *p) { u_.cp = p; }
- #if !U_CHAR16_IS_TYPEDEF
- ConstChar16Ptr::ConstChar16Ptr(const uint16_t *p) { u_.up = p; }
- #endif
- #if U_SIZEOF_WCHAR_T==2
- ConstChar16Ptr::ConstChar16Ptr(const wchar_t *p) { u_.wp = p; }
- #endif
- ConstChar16Ptr::ConstChar16Ptr(const std::nullptr_t p) { u_.cp = p; }
- ConstChar16Ptr::~ConstChar16Ptr() {}
- const char16_t *ConstChar16Ptr::get() const { return u_.cp; }
- #endif
- /// \endcond
- /**
- * Converts from const char16_t * to const UChar *.
- * Includes an aliasing barrier if available.
- * @param p pointer
- * @return p as const UChar *
- * @stable ICU 59
- */
- inline 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 *
- * @stable ICU 59
- */
- inline 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 *
- * @stable ICU 59
- */
- inline 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 *
- * @stable ICU 59
- */
- inline OldUChar *toOldUCharPtr(char16_t *p) {
- #ifdef U_ALIASING_BARRIER
- U_ALIASING_BARRIER(p);
- #endif
- return reinterpret_cast<OldUChar *>(p);
- }
- U_NAMESPACE_END
- #endif /* U_SHOW_CPLUSPLUS_API */
- #endif // __CHAR16PTR_H__
|