1 ///////////////////////////////////////////////////////////////////////////////
2 // literals.hpp
3 //
4 //  Copyright 2008 Eric Niebler. Distributed under the Boost
5 //  Software License, Version 1.0. (See accompanying file
6 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 
8 #ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_LITERALS_HPP_EAN_10_04_2005
9 #define BOOST_XPRESSIVE_DETAIL_UTILITY_LITERALS_HPP_EAN_10_04_2005
10 
11 // MS compatible compilers support #pragma once
12 #if defined(_MSC_VER)
13 # pragma once
14 #endif
15 
16 #include <boost/config.hpp> // for BOOST_STATIC_CONSTANT
17 #include <boost/cstdint.hpp> // for BOOST_STATIC_CONSTANT
18 #include <boost/detail/workaround.hpp>
19 
20 namespace boost { namespace xpressive { namespace detail
21 {
22 
23 ///////////////////////////////////////////////////////////////////////////////
24 // char_literal
25 //
26 template<typename Char, boost::intmax_t Ch, boost::intmax_t Wch>
27 struct char_literal;
28 
29 template<typename Char, boost::intmax_t Ch>
30 struct char_literal<Char, Ch, Ch>
31 {
32     BOOST_STATIC_CONSTANT(boost::intmax_t, value = Ch);
33 };
34 
35 #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
36 template<typename Char, boost::intmax_t Ch>
37 boost::intmax_t const char_literal<Char, Ch, Ch>::value;
38 #endif
39 
40 template<typename Ch>
41 struct string_literal;
42 
43 template<>
44 struct string_literal<char>
45 {
pickboost::xpressive::detail::string_literal46     static BOOST_CONSTEXPR char const *pick(char const *cstr, wchar_t const *)
47     {
48         return cstr;
49     }
50 
pickboost::xpressive::detail::string_literal51     static BOOST_CONSTEXPR char pick(char ch, wchar_t)
52     {
53         return ch;
54     }
55 };
56 
57 template<>
58 struct string_literal<wchar_t>
59 {
pickboost::xpressive::detail::string_literal60     static BOOST_CONSTEXPR wchar_t const *pick(char const *, wchar_t const *cstr)
61     {
62         return cstr;
63     }
64 
pickboost::xpressive::detail::string_literal65     static BOOST_CONSTEXPR wchar_t pick(char, wchar_t ch)
66     {
67         return ch;
68     }
69 };
70 
71 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
72 
73 # define BOOST_XPR_CHAR_(Char, ch) ch
74 # define BOOST_XPR_CSTR_(Char, st) boost::xpressive::detail::string_literal<Char>::pick(st, L##st)
75 
76 #else
77 
78 # define BOOST_XPR_CHAR_(Char, ch) boost::xpressive::detail::char_literal<Char, ch, L##ch>::value
79 # define BOOST_XPR_CSTR_(Char, st) boost::xpressive::detail::string_literal<Char>::pick(st, L##st)
80 
81 #endif
82 
83 }}} // namespace boost::xpressive::detail
84 
85 #endif
86