1 | // Copyright David Abrahams 2002.
|
---|
2 | // Distributed under the Boost Software License, Version 1.0. (See
|
---|
3 | // accompanying file LICENSE_1_0.txt or copy at
|
---|
4 | // http://www.boost.org/LICENSE_1_0.txt)
|
---|
5 | #ifndef STRING_LITERAL_DWA2002629_HPP
|
---|
6 | # define STRING_LITERAL_DWA2002629_HPP
|
---|
7 |
|
---|
8 | # include <cstddef>
|
---|
9 | # include <boost/type.hpp>
|
---|
10 | # include <boost/type_traits/array_traits.hpp>
|
---|
11 | # include <boost/type_traits/same_traits.hpp>
|
---|
12 | # include <boost/mpl/bool.hpp>
|
---|
13 | # include <boost/detail/workaround.hpp>
|
---|
14 |
|
---|
15 | namespace boost { namespace python { namespace detail {
|
---|
16 |
|
---|
17 | # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
---|
18 | template <class T>
|
---|
19 | struct is_string_literal : mpl::false_
|
---|
20 | {
|
---|
21 | };
|
---|
22 |
|
---|
23 | # if !defined(__MWERKS__) || __MWERKS__ > 0x2407
|
---|
24 | template <std::size_t n>
|
---|
25 | struct is_string_literal<char const[n]> : mpl::true_
|
---|
26 | {
|
---|
27 | };
|
---|
28 |
|
---|
29 | # if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590040)) \
|
---|
30 | || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 730)
|
---|
31 | // This compiler mistakenly gets the type of string literals as char*
|
---|
32 | // instead of char[NN].
|
---|
33 | template <>
|
---|
34 | struct is_string_literal<char* const> : mpl::true_
|
---|
35 | {
|
---|
36 | };
|
---|
37 | # endif
|
---|
38 |
|
---|
39 | # else
|
---|
40 |
|
---|
41 | // CWPro7 has trouble with the array type deduction above
|
---|
42 | template <class T, std::size_t n>
|
---|
43 | struct is_string_literal<T[n]>
|
---|
44 | : is_same<T, char const>
|
---|
45 | {
|
---|
46 | };
|
---|
47 | # endif
|
---|
48 | # else
|
---|
49 | template <bool is_array = true>
|
---|
50 | struct string_literal_helper
|
---|
51 | {
|
---|
52 | typedef char (&yes_string_literal)[1];
|
---|
53 | typedef char (&no_string_literal)[2];
|
---|
54 |
|
---|
55 | template <class T>
|
---|
56 | struct apply
|
---|
57 | {
|
---|
58 | typedef apply<T> self;
|
---|
59 | static T x;
|
---|
60 | static yes_string_literal check(char const*);
|
---|
61 | static no_string_literal check(char*);
|
---|
62 | static no_string_literal check(void const volatile*);
|
---|
63 |
|
---|
64 | BOOST_STATIC_CONSTANT(
|
---|
65 | bool, value = sizeof(self::check(x)) == sizeof(yes_string_literal));
|
---|
66 | typedef mpl::bool_<value> type;
|
---|
67 | };
|
---|
68 | };
|
---|
69 |
|
---|
70 | template <>
|
---|
71 | struct string_literal_helper<false>
|
---|
72 | {
|
---|
73 | template <class T>
|
---|
74 | struct apply : mpl::false_
|
---|
75 | {
|
---|
76 | };
|
---|
77 | };
|
---|
78 |
|
---|
79 | template <class T>
|
---|
80 | struct is_string_literal
|
---|
81 | : string_literal_helper<is_array<T>::value>::apply<T>
|
---|
82 | {
|
---|
83 | };
|
---|
84 | # endif
|
---|
85 |
|
---|
86 | }}} // namespace boost::python::detail
|
---|
87 |
|
---|
88 | #endif // STRING_LITERAL_DWA2002629_HPP
|
---|