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
19template <class _CharT>
20struct 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
61template <class _CharT>
62TEST_CONSTEXPR_CXX14 int
63constexpr_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
75template <class _CharT>
76TEST_CONSTEXPR_CXX14 size_t
77constexpr_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
85template <class _CharT>
86TEST_CONSTEXPR_CXX14 const _CharT*
87constexpr_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
98template <class _CharT>
99TEST_CONSTEXPR_CXX14 _CharT*
100constexpr_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
118template <class _CharT>
119TEST_CONSTEXPR_CXX14 _CharT*
120constexpr_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
129template <class _CharT>
130TEST_CONSTEXPR_CXX14 _CharT*
131constexpr_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