zhangmeng
2021-07-02 056f71f24cefaf88f2a93714c6678c03ed5f1e0e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*=============================================================================
    Copyright (c) 2001-2014 Joel de Guzman
    Copyright (c) 2001-2011 Hartmut Kaiser
    Copyright (c)      2010 Bryce Lelbach
 
    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
================================================_==============================*/
#if !defined(BOOST_SPIRIT_X3_STRING_TRAITS_OCTOBER_2008_1252PM)
#define BOOST_SPIRIT_X3_STRING_TRAITS_OCTOBER_2008_1252PM
 
#include <string>
#include <boost/mpl/bool.hpp>
 
namespace boost { namespace spirit { namespace x3 { namespace traits
{
    ///////////////////////////////////////////////////////////////////////////
    // Get the C string from a string
    ///////////////////////////////////////////////////////////////////////////
    template <typename String>
    struct extract_c_string;
 
    template <typename String>
    struct extract_c_string
    {
        template <typename T>
        static T const* call (T* str)
        {
            return (T const*)str;
        }
 
        template <typename T>
        static T const* call (T const* str)
        {
            return str;
        }
    };
 
    // Forwarder that strips const
    template <typename T>
    struct extract_c_string<T const>
    {
        static decltype(auto) call(T const str)
        {
            return extract_c_string<T>::call(str);
        }
    };
 
    // Forwarder that strips references
    template <typename T>
    struct extract_c_string<T&>
    {
        static decltype(auto) call(T& str)
        {
            return extract_c_string<T>::call(str);
        }
    };
 
    // Forwarder that strips const references
    template <typename T>
    struct extract_c_string<T const&>
    {
        static decltype(auto) call(T const& str)
        {
            return extract_c_string<T>::call(str);
        }
    };
 
    template <typename T, typename Traits, typename Allocator>
    struct extract_c_string<std::basic_string<T, Traits, Allocator> >
    {
        typedef std::basic_string<T, Traits, Allocator> string;
 
        static T const* call (string const& str)
        {
            return str.c_str();
        }
    };
 
    template <typename T>
    decltype(auto) get_c_string(T* str)
    {
        return extract_c_string<T*>::call(str);
    }
 
    template <typename T>
    decltype(auto) get_c_string(T const* str)
    {
        return extract_c_string<T const*>::call(str);
    }
 
    template <typename String>
    decltype(auto) get_c_string(String& str)
    {
        return extract_c_string<String>::call(str);
    }
 
    template <typename String>
    decltype(auto) get_c_string(String const& str)
    {
        return extract_c_string<String>::call(str);
    }
 
    ///////////////////////////////////////////////////////////////////////////
    // Get the begin/end iterators from a string
    ///////////////////////////////////////////////////////////////////////////
 
    // Implementation for C-style strings.
 
    template <typename T>
    inline T const* get_string_begin(T const* str) { return str; }
 
    template <typename T>
    inline T* get_string_begin(T* str) { return str; }
 
    template <typename T>
    inline T const* get_string_end(T const* str)
    {
        T const* last = str;
        while (*last)
            last++;
        return last;
    }
 
    template <typename T>
    inline T* get_string_end(T* str)
    {
        T* last = str;
        while (*last)
            last++;
        return last;
    }
 
    // Implementation for containers (includes basic_string).
    template <typename T, typename Str>
    inline typename Str::const_iterator get_string_begin(Str const& str)
    { return str.begin(); }
 
    template <typename T, typename Str>
    inline typename Str::iterator
    get_string_begin(Str& str)
    { return str.begin(); }
 
    template <typename T, typename Str>
    inline typename Str::const_iterator get_string_end(Str const& str)
    { return str.end(); }
 
    template <typename T, typename Str>
    inline typename Str::iterator
    get_string_end(Str& str)
    { return str.end(); }
}}}}
 
#endif