config/test/boost_no_cxx11_user_lit.ipp
Marcel Raad 884b53b563 Fix user-defined literal tests for MSVC
The test currently tests not only the compiler's support for user-defined literals, but also its constexpr support, which is only partly implemented in MSVC 14. This change removes the constexpr's that MSVC doesn't like so that the tests pass on MSVC 14 CTP2.
2014-08-12 10:25:04 +02:00

68 lines
1.9 KiB
C++

// (C) Copyright John Maddock 2013
// Use, modification and distribution are subject to 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)
// See http://www.boost.org/libs/config for more information.
// MACRO: BOOST_NO_CXX11_USER_DEFINED_LITERALS
// TITLE: C++11 user defined literals.
// DESCRIPTION: The compiler does not support the C++11 literals including user-defined suffixes.
#include <memory>
namespace boost_no_cxx11_user_defined_literals {
struct my_literal
{
my_literal() : val(0) {}
my_literal(int i) : val(i) {}
my_literal(const my_literal& a) : val(a.val) {}
bool operator==(const my_literal& a) const { return val == a.val; }
int val;
};
template <unsigned base, unsigned long long val, char... Digits>
struct parse_int
{
// The default specialization is also the termination condition:
// it gets invoked only when sizeof...Digits == 0.
static_assert(base<=16u,"only support up to hexadecimal");
static constexpr unsigned long long value{ val };
};
template <unsigned base, unsigned long long val, char c, char... Digits>
struct parse_int<base, val, c, Digits...>
{
static constexpr unsigned long long char_value = (c >= '0' && c <= '9')
? c - '0'
: (c >= 'a' && c <= 'f')
? c - 'a'
: (c >= 'A' && c <= 'F')
? c - 'A'
: 400u;
static_assert(char_value < base, "Encountered a digit out of range");
static constexpr unsigned long long value{ parse_int<base, val * base +
char_value, Digits...>::value };
};
my_literal operator "" _suf1(unsigned long long v)
{
return my_literal(v);
}
template <char...PACK>
my_literal operator "" _bin()
{
return parse_int<2, 0, PACK...>::value;
}
int test()
{
my_literal a = 0x23_suf1;
my_literal b = 1001_bin;
return ((a == my_literal(0x23)) && (b == my_literal(9))) ? 0 : 1;
}
}