diff options
Diffstat (limited to 'src/boost/libs/config/test/boost_no_cxx11_user_lit.ipp')
-rw-r--r-- | src/boost/libs/config/test/boost_no_cxx11_user_lit.ipp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/boost/libs/config/test/boost_no_cxx11_user_lit.ipp b/src/boost/libs/config/test/boost_no_cxx11_user_lit.ipp new file mode 100644 index 000000000..090e0c036 --- /dev/null +++ b/src/boost/libs/config/test/boost_no_cxx11_user_lit.ipp @@ -0,0 +1,67 @@ +// (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; +} + +} |