// 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 |