| // Copyright David Abrahams 2002. |
| // 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) |
| #ifndef STRING_LITERAL_DWA2002629_HPP |
| # define STRING_LITERAL_DWA2002629_HPP |
| |
| # include <cstddef> |
| # include <boost/type.hpp> |
| # include <boost/type_traits/array_traits.hpp> |
| # include <boost/type_traits/same_traits.hpp> |
| # include <boost/mpl/bool.hpp> |
| # include <boost/detail/workaround.hpp> |
| |
| namespace boost { namespace python { namespace detail { |
| |
| # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION |
| template <class T> |
| struct is_string_literal : mpl::false_ |
| { |
| }; |
| |
| # if !defined(__MWERKS__) || __MWERKS__ > 0x2407 |
| template <std::size_t n> |
| struct is_string_literal<char const[n]> : mpl::true_ |
| { |
| }; |
| |
| # if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590040)) \ |
| || (defined(__sgi) && defined(_COMPILER_VERSION) && _COMPILER_VERSION <= 730) |
| // This compiler mistakenly gets the type of string literals as char* |
| // instead of char[NN]. |
| template <> |
| struct is_string_literal<char* const> : mpl::true_ |
| { |
| }; |
| # endif |
| |
| # else |
| |
| // CWPro7 has trouble with the array type deduction above |
| template <class T, std::size_t n> |
| struct is_string_literal<T[n]> |
| : is_same<T, char const> |
| { |
| }; |
| # endif |
| # else |
| template <bool is_array = true> |
| struct string_literal_helper |
| { |
| typedef char (&yes_string_literal)[1]; |
| typedef char (&no_string_literal)[2]; |
| |
| template <class T> |
| struct apply |
| { |
| typedef apply<T> self; |
| static T x; |
| static yes_string_literal check(char const*); |
| static no_string_literal check(char*); |
| static no_string_literal check(void const volatile*); |
| |
| BOOST_STATIC_CONSTANT( |
| bool, value = sizeof(self::check(x)) == sizeof(yes_string_literal)); |
| typedef mpl::bool_<value> type; |
| }; |
| }; |
| |
| template <> |
| struct string_literal_helper<false> |
| { |
| template <class T> |
| struct apply : mpl::false_ |
| { |
| }; |
| }; |
| |
| template <class T> |
| struct is_string_literal |
| : string_literal_helper<is_array<T>::value>::apply<T> |
| { |
| }; |
| # endif |
| |
| }}} // namespace boost::python::detail |
| |
| #endif // STRING_LITERAL_DWA2002629_HPP |