1 /*=============================================================================
2 Copyright (c) 2001-2014 Joel de Guzman
3 Copyright (c) 2001-2011 Hartmut Kaiser
4 Copyright (c) 2010 Bryce Lelbach
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 ================================================_==============================*/
9 #if !defined(BOOST_SPIRIT_X3_STRING_TRAITS_OCTOBER_2008_1252PM)
10 #define BOOST_SPIRIT_X3_STRING_TRAITS_OCTOBER_2008_1252PM
13 #include <boost/mpl/bool.hpp>
15 namespace boost { namespace spirit { namespace x3 { namespace traits
17 ///////////////////////////////////////////////////////////////////////////
18 // Get the C string from a string
19 ///////////////////////////////////////////////////////////////////////////
20 template <typename String>
21 struct extract_c_string;
23 template <typename String>
24 struct extract_c_string
27 static T const* call (T* str)
33 static T const* call (T const* str)
39 // Forwarder that strips const
41 struct extract_c_string<T const>
43 static decltype(auto) call(T const str)
45 return extract_c_string<T>::call(str);
49 // Forwarder that strips references
51 struct extract_c_string<T&>
53 static decltype(auto) call(T& str)
55 return extract_c_string<T>::call(str);
59 // Forwarder that strips const references
61 struct extract_c_string<T const&>
63 static decltype(auto) call(T const& str)
65 return extract_c_string<T>::call(str);
69 template <typename T, typename Traits, typename Allocator>
70 struct extract_c_string<std::basic_string<T, Traits, Allocator> >
72 typedef std::basic_string<T, Traits, Allocator> string;
74 static T const* call (string const& str)
81 decltype(auto) get_c_string(T* str)
83 return extract_c_string<T*>::call(str);
87 decltype(auto) get_c_string(T const* str)
89 return extract_c_string<T const*>::call(str);
92 template <typename String>
93 decltype(auto) get_c_string(String& str)
95 return extract_c_string<String>::call(str);
98 template <typename String>
99 decltype(auto) get_c_string(String const& str)
101 return extract_c_string<String>::call(str);
104 ///////////////////////////////////////////////////////////////////////////
105 // Get the begin/end iterators from a string
106 ///////////////////////////////////////////////////////////////////////////
108 // Implementation for C-style strings.
110 template <typename T>
111 inline T const* get_string_begin(T const* str) { return str; }
113 template <typename T>
114 inline T* get_string_begin(T* str) { return str; }
116 template <typename T>
117 inline T const* get_string_end(T const* str)
125 template <typename T>
126 inline T* get_string_end(T* str)
134 // Implementation for containers (includes basic_string).
135 template <typename T, typename Str>
136 inline typename Str::const_iterator get_string_begin(Str const& str)
137 { return str.begin(); }
139 template <typename T, typename Str>
140 inline typename Str::iterator
141 get_string_begin(Str& str)
142 { return str.begin(); }
144 template <typename T, typename Str>
145 inline typename Str::const_iterator get_string_end(Str const& str)
146 { return str.end(); }
148 template <typename T, typename Str>
149 inline typename Str::iterator
150 get_string_end(Str& str)
151 { return str.end(); }