1 // -*- C++ -*- 2 //===-------------------- constexpr_char_traits ---------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is distributed under the University of Illinois Open Source 7 // License. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _CONSTEXPR_CHAR_TRAITS 12 #define _CONSTEXPR_CHAR_TRAITS 13 14 #include <string> 15 #include <cassert> 16 17 #include "test_macros.h" 18 19 template <class _CharT> 20 struct constexpr_char_traits 21 { 22 typedef _CharT char_type; 23 typedef int int_type; 24 typedef std::streamoff off_type; 25 typedef std::streampos pos_type; 26 typedef std::mbstate_t state_type; 27 28 static TEST_CONSTEXPR_CXX14 void assign(char_type& __c1, const char_type& __c2) TEST_NOEXCEPT 29 {__c1 = __c2;} 30 31 static TEST_CONSTEXPR bool eq(char_type __c1, char_type __c2) TEST_NOEXCEPT 32 {return __c1 == __c2;} 33 34 static TEST_CONSTEXPR bool lt(char_type __c1, char_type __c2) TEST_NOEXCEPT 35 {return __c1 < __c2;} 36 37 static TEST_CONSTEXPR_CXX14 int compare(const char_type* __s1, const char_type* __s2, size_t __n); 38 static TEST_CONSTEXPR_CXX14 size_t length(const char_type* __s); 39 static TEST_CONSTEXPR_CXX14 const char_type* find(const char_type* __s, size_t __n, const char_type& __a); 40 static TEST_CONSTEXPR_CXX14 char_type* move(char_type* __s1, const char_type* __s2, size_t __n); 41 static TEST_CONSTEXPR_CXX14 char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); 42 static TEST_CONSTEXPR_CXX14 char_type* assign(char_type* __s, size_t __n, char_type __a); 43 44 static TEST_CONSTEXPR int_type not_eof(int_type __c) TEST_NOEXCEPT 45 {return eq_int_type(__c, eof()) ? ~eof() : __c;} 46 47 static TEST_CONSTEXPR char_type to_char_type(int_type __c) TEST_NOEXCEPT 48 {return char_type(__c);} 49 50 static TEST_CONSTEXPR int_type to_int_type(char_type __c) TEST_NOEXCEPT 51 {return int_type(__c);} 52 53 static TEST_CONSTEXPR bool eq_int_type(int_type __c1, int_type __c2) TEST_NOEXCEPT 54 {return __c1 == __c2;} 55 56 static TEST_CONSTEXPR int_type eof() TEST_NOEXCEPT 57 {return int_type(EOF);} 58 }; 59 60 61 template <class _CharT> 62 TEST_CONSTEXPR_CXX14 int 63 constexpr_char_traits<_CharT>::compare(const char_type* __s1, const char_type* __s2, size_t __n) 64 { 65 for (; __n; --__n, ++__s1, ++__s2) 66 { 67 if (lt(*__s1, *__s2)) 68 return -1; 69 if (lt(*__s2, *__s1)) 70 return 1; 71 } 72 return 0; 73 } 74 75 template <class _CharT> 76 TEST_CONSTEXPR_CXX14 size_t 77 constexpr_char_traits<_CharT>::length(const char_type* __s) 78 { 79 size_t __len = 0; 80 for (; !eq(*__s, char_type(0)); ++__s) 81 ++__len; 82 return __len; 83 } 84 85 template <class _CharT> 86 TEST_CONSTEXPR_CXX14 const _CharT* 87 constexpr_char_traits<_CharT>::find(const char_type* __s, size_t __n, const char_type& __a) 88 { 89 for (; __n; --__n) 90 { 91 if (eq(*__s, __a)) 92 return __s; 93 ++__s; 94 } 95 return 0; 96 } 97 98 template <class _CharT> 99 TEST_CONSTEXPR_CXX14 _CharT* 100 constexpr_char_traits<_CharT>::move(char_type* __s1, const char_type* __s2, size_t __n) 101 { 102 char_type* __r = __s1; 103 if (__s1 < __s2) 104 { 105 for (; __n; --__n, ++__s1, ++__s2) 106 assign(*__s1, *__s2); 107 } 108 else if (__s2 < __s1) 109 { 110 __s1 += __n; 111 __s2 += __n; 112 for (; __n; --__n) 113 assign(*--__s1, *--__s2); 114 } 115 return __r; 116 } 117 118 template <class _CharT> 119 TEST_CONSTEXPR_CXX14 _CharT* 120 constexpr_char_traits<_CharT>::copy(char_type* __s1, const char_type* __s2, size_t __n) 121 { 122 assert(__s2 < __s1 || __s2 >= __s1+__n); 123 char_type* __r = __s1; 124 for (; __n; --__n, ++__s1, ++__s2) 125 assign(*__s1, *__s2); 126 return __r; 127 } 128 129 template <class _CharT> 130 TEST_CONSTEXPR_CXX14 _CharT* 131 constexpr_char_traits<_CharT>::assign(char_type* __s, size_t __n, char_type __a) 132 { 133 char_type* __r = __s; 134 for (; __n; --__n, ++__s) 135 assign(*__s, __a); 136 return __r; 137 } 138 139 #endif // _CONSTEXPR_CHAR_TRAITS 140