blob: 36fc6f81170a5c38835ffe474b81a82d126f74b3 [file] [log] [blame]
// Copyright (C) 2017-2021 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
// { dg-do run { target c++14 } }
// { dg-require-string-conversions "" }
#include <charconv>
#if __cplusplus >= 201703L
# include <string_view>
using std::string_view;
#else
// <charconv> is supported in C++14 as a GNU extension
# include <string>
using string_view = std::string;
#endif
template<typename I>
bool
check_to_chars(I val, string_view expected, int base = 0)
{
// Space for minus sign, 64 binary digits, final '*', and null terminator:
char buf[67] = "******************************************************************";
std::to_chars_result r = base == 0
? std::to_chars(buf, buf+sizeof(buf), val)
: std::to_chars(buf, buf+sizeof(buf), val, base);
return r.ec == std::errc{} && *r.ptr == '*' && string_view(buf, r.ptr - buf) == expected;
}
#include <string>
#include <climits>
#include <testsuite_hooks.h>
// Using default base 10
void
test01()
{
VERIFY( check_to_chars<char>(0, "0") );
VERIFY( check_to_chars<signed char>(0, "0") );
VERIFY( check_to_chars<unsigned char>(0, "0") );
VERIFY( check_to_chars<signed short>(0, "0") );
VERIFY( check_to_chars<unsigned short>(0, "0") );
VERIFY( check_to_chars<signed int>(0, "0") );
VERIFY( check_to_chars<unsigned int>(0, "0") );
VERIFY( check_to_chars<signed long>(0, "0") );
VERIFY( check_to_chars<unsigned long>(0, "0") );
VERIFY( check_to_chars<signed long long>(0, "0") );
VERIFY( check_to_chars<unsigned long long>(0, "0") );
VERIFY( check_to_chars<char>(1, "1") );
VERIFY( check_to_chars<signed char>(1, "1") );
VERIFY( check_to_chars<unsigned char>(1, "1") );
VERIFY( check_to_chars<signed short>(1, "1") );
VERIFY( check_to_chars<unsigned short>(1, "1") );
VERIFY( check_to_chars<signed int>(1, "1") );
VERIFY( check_to_chars<unsigned int>(1, "1") );
VERIFY( check_to_chars<signed long>(1, "1") );
VERIFY( check_to_chars<unsigned long>(1, "1") );
VERIFY( check_to_chars<signed long long>(1, "1") );
VERIFY( check_to_chars<unsigned long long>(1, "1") );
VERIFY( check_to_chars<char>(123, "123") );
VERIFY( check_to_chars<signed char>(123, "123") );
VERIFY( check_to_chars<unsigned char>(123, "123") );
VERIFY( check_to_chars<signed short>(123, "123") );
VERIFY( check_to_chars<unsigned short>(123, "123") );
VERIFY( check_to_chars<signed int>(123, "123") );
VERIFY( check_to_chars<unsigned int>(123, "123") );
VERIFY( check_to_chars<signed long>(123, "123") );
VERIFY( check_to_chars<unsigned long>(123, "123") );
VERIFY( check_to_chars<signed long long>(123, "123") );
VERIFY( check_to_chars<unsigned long long>(123, "123") );
if (std::is_signed<char>::value)
VERIFY( check_to_chars<char>(-79, "-79") );
VERIFY( check_to_chars<signed char>(-79, "-79") );
VERIFY( check_to_chars<signed short>(-79, "-79") );
VERIFY( check_to_chars<signed int>(-79, "-79") );
VERIFY( check_to_chars<signed long>(-79, "-79") );
VERIFY( check_to_chars<signed long long>(-79, "-79") );
using std::to_string;
VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX)) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX)) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX)) );
VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX)) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX)) );
VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX)) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX)) );
VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX)) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX)) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX)) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX)) );
VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN)) );
VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN)) );
VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN)) );
VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN)) );
VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN)) );
VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN)) );
VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2)) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2)) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2)) );
VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2)) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2)) );
VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2)) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2)) );
VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2)) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2)) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2)) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2)) );
}
// Using explicit base 10
void
test02()
{
VERIFY( check_to_chars<char>(0, "0", 10) );
VERIFY( check_to_chars<signed char>(0, "0", 10) );
VERIFY( check_to_chars<unsigned char>(0, "0", 10) );
VERIFY( check_to_chars<signed short>(0, "0", 10) );
VERIFY( check_to_chars<unsigned short>(0, "0", 10) );
VERIFY( check_to_chars<signed int>(0, "0", 10) );
VERIFY( check_to_chars<unsigned int>(0, "0", 10) );
VERIFY( check_to_chars<signed long>(0, "0", 10) );
VERIFY( check_to_chars<unsigned long>(0, "0", 10) );
VERIFY( check_to_chars<signed long long>(0, "0", 10) );
VERIFY( check_to_chars<unsigned long long>(0, "0", 10) );
VERIFY( check_to_chars<char>(1, "1", 10) );
VERIFY( check_to_chars<signed char>(1, "1", 10) );
VERIFY( check_to_chars<unsigned char>(1, "1", 10) );
VERIFY( check_to_chars<signed short>(1, "1", 10) );
VERIFY( check_to_chars<unsigned short>(1, "1", 10) );
VERIFY( check_to_chars<signed int>(1, "1", 10) );
VERIFY( check_to_chars<unsigned int>(1, "1", 10) );
VERIFY( check_to_chars<signed long>(1, "1", 10) );
VERIFY( check_to_chars<unsigned long>(1, "1", 10) );
VERIFY( check_to_chars<signed long long>(1, "1", 10) );
VERIFY( check_to_chars<unsigned long long>(1, "1", 10) );
VERIFY( check_to_chars<char>(123, "123", 10) );
VERIFY( check_to_chars<signed char>(123, "123", 10) );
VERIFY( check_to_chars<unsigned char>(123, "123", 10) );
VERIFY( check_to_chars<signed short>(123, "123", 10) );
VERIFY( check_to_chars<unsigned short>(123, "123", 10) );
VERIFY( check_to_chars<signed int>(123, "123", 10) );
VERIFY( check_to_chars<unsigned int>(123, "123", 10) );
VERIFY( check_to_chars<signed long>(123, "123", 10) );
VERIFY( check_to_chars<unsigned long>(123, "123", 10) );
VERIFY( check_to_chars<signed long long>(123, "123", 10) );
VERIFY( check_to_chars<unsigned long long>(123, "123", 10) );
if (std::is_signed<char>::value)
VERIFY( check_to_chars<char>(-79, "-79", 10) );
VERIFY( check_to_chars<signed char>(-79, "-79", 10) );
VERIFY( check_to_chars<signed short>(-79, "-79", 10) );
VERIFY( check_to_chars<signed int>(-79, "-79", 10) );
VERIFY( check_to_chars<signed long>(-79, "-79", 10) );
VERIFY( check_to_chars<signed long long>(-79, "-79", 10) );
using std::to_string;
VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX), 10) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX), 10) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX), 10) );
VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX), 10) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX), 10) );
VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX), 10) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX), 10) );
VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX), 10) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX), 10) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX), 10) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX), 10) );
VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN), 10) );
VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN), 10) );
VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN), 10) );
VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN), 10) );
VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN), 10) );
VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN), 10) );
VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2), 10) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2), 10) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2), 10) );
VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2), 10) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2), 10) );
VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2), 10) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2), 10) );
VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2), 10) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2), 10) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2), 10) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2), 10) );
}
// Using all bases
void
test03()
{
// -2017 in all bases from [2,36]
const char* str2017[37] = { nullptr, nullptr,
"-11111100001",
"-2202201",
"-133201",
"-31032",
"-13201",
"-5611",
"-3741",
"-2681",
"-2017",
"-1574",
"-1201",
"-bc2",
"-a41",
"-8e7",
"-7e1",
"-6gb",
"-641",
"-5b3",
"-50h",
"-4c1",
"-43f",
"-3ig",
"-3c1",
"-35h",
"-2pf",
"-2kj",
"-2g1",
"-2bg",
"-277",
"-232",
"-1v1",
"-1s4",
"-1pb",
"-1mm",
"-1k1"
};
// -12345 in all bases from [2,36]
const char* str12345[37] = { nullptr, nullptr,
"-11000000111001",
"-121221020",
"-3000321",
"-343340",
"-133053",
"-50664",
"-30071",
"-17836",
"-12345",
"-9303",
"-7189",
"-5808",
"-46db",
"-39d0",
"-3039",
"-28c3",
"-221f",
"-1f3e",
"-1ah5",
"-16ki",
"-13b3",
"-107h",
"-la9",
"-jik",
"-i6l",
"-gp6",
"-fkp",
"-ejk",
"-dlf",
"-cq7",
"-c1p",
"-bb3",
"-an3",
"-a2p",
"-9ix"
};
// -23456 in all bases from [2,36]
const char* str23456[37] = { nullptr, nullptr,
"-101101110100000",
"-1012011202",
"-11232200",
"-1222311",
"-300332",
"-125246",
"-55640",
"-35152",
"-23456",
"-16694",
"-116a8",
"-a8a4",
"-8796",
"-6e3b",
"-5ba0",
"-4d2d",
"-4072",
"-37ia",
"-2icg",
"-2b3k",
"-24a4",
"-1l7j",
"-1gh8",
"-1cd6",
"-18i4",
"-154k",
"-11pk",
"-rpo",
"-q1q",
"-ock",
"-mt0",
"-lhq",
"-k9u",
"-j56",
"-i3k"
};
// INT_MIN in all bases from [2,36]
const char* strINT_MIN[37] = { nullptr, nullptr,
"-10000000000000000000000000000000",
"-12112122212110202102",
"-2000000000000000",
"-13344223434043",
"-553032005532",
"-104134211162",
"-20000000000",
"-5478773672",
"-2147483648",
"-a02220282",
"-4bb2308a8",
"-282ba4aab",
"-1652ca932",
"-c87e66b8",
"-80000000",
"-53g7f549",
"-3928g3h2",
"-27c57h33",
"-1db1f928",
"-140h2d92",
"-ikf5bf2",
"-ebelf96",
"-b5gge58",
"-8jmdnkn",
"-6oj8ioo",
"-5ehnckb",
"-4clm98g",
"-3hk7988",
"-2sb6cs8",
"-2d09uc2",
"-2000000",
"-1lsqtl2",
"-1d8xqrq",
"-15v22un",
"-zik0zk"
};
for (int base = 2; base <= 36; ++base)
{
VERIFY( check_to_chars<char>(0, "0", base) );
VERIFY( check_to_chars<signed char>(0, "0", base) );
VERIFY( check_to_chars<unsigned char>(0, "0", base) );
VERIFY( check_to_chars<signed short>(0, "0", base) );
VERIFY( check_to_chars<unsigned short>(0, "0", base) );
VERIFY( check_to_chars<signed int>(0, "0", base) );
VERIFY( check_to_chars<unsigned int>(0, "0", base) );
VERIFY( check_to_chars<signed long>(0, "0", base) );
VERIFY( check_to_chars<unsigned long>(0, "0", base) );
VERIFY( check_to_chars<signed long long>(0, "0", base) );
VERIFY( check_to_chars<unsigned long long>(0, "0", base) );
VERIFY( check_to_chars<char>(1, "1", base) );
VERIFY( check_to_chars<signed char>(1, "1", base) );
VERIFY( check_to_chars<unsigned char>(1, "1", base) );
VERIFY( check_to_chars<signed short>(1, "1", base) );
VERIFY( check_to_chars<unsigned short>(1, "1", base) );
VERIFY( check_to_chars<signed int>(1, "1", base) );
VERIFY( check_to_chars<unsigned int>(1, "1", base) );
VERIFY( check_to_chars<signed long>(1, "1", base) );
VERIFY( check_to_chars<unsigned long>(1, "1", base) );
VERIFY( check_to_chars<signed long long>(1, "1", base) );
VERIFY( check_to_chars<unsigned long long>(1, "1", base) );
if (std::is_signed<char>::value)
VERIFY( check_to_chars<char>(-1, "-1", base) );
VERIFY( check_to_chars<signed char>(-1, "-1", base) );
VERIFY( check_to_chars<signed short>(-1, "-1", base) );
VERIFY( check_to_chars<signed int>(-1, "-1", base) );
VERIFY( check_to_chars<signed long>(-1, "-1", base) );
VERIFY( check_to_chars<signed long long>(-1, "-1", base) );
if (base > 2)
{
VERIFY( check_to_chars<char>(2, "2", base) );
VERIFY( check_to_chars<signed char>(2, "2", base) );
VERIFY( check_to_chars<unsigned char>(2, "2", base) );
VERIFY( check_to_chars<signed short>(2, "2", base) );
VERIFY( check_to_chars<unsigned short>(2, "2", base) );
VERIFY( check_to_chars<signed int>(2, "2", base) );
VERIFY( check_to_chars<unsigned int>(2, "2", base) );
VERIFY( check_to_chars<signed long>(2, "2", base) );
VERIFY( check_to_chars<unsigned long>(2, "2", base) );
VERIFY( check_to_chars<signed long long>(2, "2", base) );
VERIFY( check_to_chars<unsigned long long>(2, "2", base) );
if (std::is_signed<char>::value)
VERIFY( check_to_chars<char>(-2, "-2", base) );
VERIFY( check_to_chars<signed char>(-2, "-2", base) );
VERIFY( check_to_chars<signed short>(-2, "-2", base) );
VERIFY( check_to_chars<signed int>(-2, "-2", base) );
VERIFY( check_to_chars<signed long>(-2, "-2", base) );
VERIFY( check_to_chars<signed long long>(-2, "-2", base) );
}
VERIFY( check_to_chars(2017u, str2017[base]+1, base) );
VERIFY( check_to_chars(2017, str2017[base]+1, base) );
VERIFY( check_to_chars(-2017, str2017[base], base) );
VERIFY( check_to_chars(12345u, str12345[base]+1, base) );
VERIFY( check_to_chars(12345, str12345[base]+1, base) );
VERIFY( check_to_chars(-12345, str12345[base], base) );
VERIFY( check_to_chars(23456u, str23456[base]+1, base) );
VERIFY( check_to_chars(23456, str23456[base]+1, base) );
VERIFY( check_to_chars(-23456, str23456[base], base) );
VERIFY( check_to_chars(INT_MAX + 1ull, strINT_MIN[base]+1, base) );
VERIFY( check_to_chars(INT_MAX + 1ll, strINT_MIN[base]+1, base) );
VERIFY( check_to_chars(INT_MIN, strINT_MIN[base], base) );
}
VERIFY( check_to_chars(1155, "xx", 34) );
VERIFY( check_to_chars(1224, "yy", 35) );
VERIFY( check_to_chars(1295, "zz", 36) );
}
#include <sstream>
#include <ios>
// base 8
void
test04()
{
auto to_string = [](auto val) {
std::ostringstream ss;
ss << std::oct;
if (val < 0)
ss << '-' << (~val + 1ull);
else if (sizeof(val) == 1)
ss << (int)val;
else
ss << val;
return ss.str();
};
VERIFY( check_to_chars<char>(123, to_string(123), 8) );
VERIFY( check_to_chars<signed char>(123, to_string(123), 8) );
VERIFY( check_to_chars<unsigned char>(123, to_string(123), 8) );
VERIFY( check_to_chars<signed short>(123, to_string(123), 8) );
VERIFY( check_to_chars<unsigned short>(123, to_string(123), 8) );
VERIFY( check_to_chars<signed int>(123, to_string(123), 8) );
VERIFY( check_to_chars<unsigned int>(123, to_string(123), 8) );
VERIFY( check_to_chars<signed long>(123, to_string(123), 8) );
VERIFY( check_to_chars<unsigned long>(123, to_string(123), 8) );
VERIFY( check_to_chars<signed long long>(123, to_string(123), 8) );
VERIFY( check_to_chars<unsigned long long>(123, to_string(123), 8) );
if (std::is_signed<char>::value)
VERIFY( check_to_chars<char>(-79, to_string(-79), 8) );
VERIFY( check_to_chars<signed char>(-79, to_string(-79), 8) );
VERIFY( check_to_chars<signed short>(-79, to_string(-79), 8) );
VERIFY( check_to_chars<signed int>(-79, to_string(-79), 8) );
VERIFY( check_to_chars<signed long>(-79, to_string(-79), 8) );
VERIFY( check_to_chars<signed long long>(-79, to_string(-79), 8) );
VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX), 8) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX), 8) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX), 8) );
VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX), 8) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX), 8) );
VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX), 8) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX), 8) );
VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX), 8) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX), 8) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX), 8) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX), 8) );
VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN), 8) );
VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN), 8) );
VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN), 8) );
VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN), 8) );
VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN), 8) );
VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN), 8) );
VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2), 8) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2), 8) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2), 8) );
VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2), 8) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2), 8) );
VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2), 8) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2), 8) );
VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2), 8) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2), 8) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2), 8) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2), 8) );
}
// base 16
void
test05()
{
auto to_string = [](auto val) {
std::ostringstream ss;
ss << std::hex;
if (val < 0)
ss << '-' << (~val + 1ull);
else if (sizeof(val) == 1)
ss << (int)val;
else
ss << val;
return ss.str();
};
VERIFY( check_to_chars<char>(123, to_string(123), 16) );
VERIFY( check_to_chars<signed char>(123, to_string(123), 16) );
VERIFY( check_to_chars<unsigned char>(123, to_string(123), 16) );
VERIFY( check_to_chars<signed short>(123, to_string(123), 16) );
VERIFY( check_to_chars<unsigned short>(123, to_string(123), 16) );
VERIFY( check_to_chars<signed int>(123, to_string(123), 16) );
VERIFY( check_to_chars<unsigned int>(123, to_string(123), 16) );
VERIFY( check_to_chars<signed long>(123, to_string(123), 16) );
VERIFY( check_to_chars<unsigned long>(123, to_string(123), 16) );
VERIFY( check_to_chars<signed long long>(123, to_string(123), 16) );
VERIFY( check_to_chars<unsigned long long>(123, to_string(123), 16) );
if (std::is_signed<char>::value)
VERIFY( check_to_chars<char>(-79, to_string(-79), 16) );
VERIFY( check_to_chars<signed char>(-79, to_string(-79), 16) );
VERIFY( check_to_chars<signed short>(-79, to_string(-79), 16) );
VERIFY( check_to_chars<signed int>(-79, to_string(-79), 16) );
VERIFY( check_to_chars<signed long>(-79, to_string(-79), 16) );
VERIFY( check_to_chars<signed long long>(-79, to_string(-79), 16) );
VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX), 16) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX), 16) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX), 16) );
VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX), 16) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX), 16) );
VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX), 16) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX), 16) );
VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX), 16) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX), 16) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX), 16) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX), 16) );
VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN), 16) );
VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN), 16) );
VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN), 16) );
VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN), 16) );
VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN), 16) );
VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN), 16) );
VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2), 16) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2), 16) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2), 16) );
VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2), 16) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2), 16) );
VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2), 16) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2), 16) );
VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2), 16) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2), 16) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2), 16) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2), 16) );
}
#include <bitset>
// base 2
void
test06()
{
auto to_string = [](auto val) {
std::string s, sign;
if (val < 0)
{
auto absval = ~val + 1ull;
s = std::bitset<sizeof(absval) * CHAR_BIT>(absval).to_string();
sign = '-';
}
else
s = std::bitset<sizeof(val) * CHAR_BIT>(val).to_string();
auto pos = s.find_first_not_of("0");
if (pos == std::string::npos)
s.resize(1);
else
s.erase(0, pos);
return sign + s;
};
VERIFY( check_to_chars<char>(123, to_string(123), 2) );
VERIFY( check_to_chars<signed char>(123, to_string(123), 2) );
VERIFY( check_to_chars<unsigned char>(123, to_string(123), 2) );
VERIFY( check_to_chars<signed short>(123, to_string(123), 2) );
VERIFY( check_to_chars<unsigned short>(123, to_string(123), 2) );
VERIFY( check_to_chars<signed int>(123, to_string(123), 2) );
VERIFY( check_to_chars<unsigned int>(123, to_string(123), 2) );
VERIFY( check_to_chars<signed long>(123, to_string(123), 2) );
VERIFY( check_to_chars<unsigned long>(123, to_string(123), 2) );
VERIFY( check_to_chars<signed long long>(123, to_string(123), 2) );
VERIFY( check_to_chars<unsigned long long>(123, to_string(123), 2) );
if (std::is_signed<char>::value)
VERIFY( check_to_chars<char>(-79, to_string(-79), 2) );
VERIFY( check_to_chars<signed char>(-79, to_string(-79), 2) );
VERIFY( check_to_chars<signed short>(-79, to_string(-79), 2) );
VERIFY( check_to_chars<signed int>(-79, to_string(-79), 2) );
VERIFY( check_to_chars<signed long>(-79, to_string(-79), 2) );
VERIFY( check_to_chars<signed long long>(-79, to_string(-79), 2) );
VERIFY( check_to_chars<char>(CHAR_MAX, to_string(CHAR_MAX), 2) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX, to_string(SCHAR_MAX), 2) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX, to_string(UCHAR_MAX), 2) );
VERIFY( check_to_chars<signed short>(SHRT_MAX, to_string(SHRT_MAX), 2) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX, to_string(USHRT_MAX), 2) );
VERIFY( check_to_chars<signed int>(INT_MAX, to_string(INT_MAX), 2) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX, to_string(UINT_MAX), 2) );
VERIFY( check_to_chars<signed long>(LONG_MAX, to_string(LONG_MAX), 2) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX, to_string(ULONG_MAX), 2) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX, to_string(LLONG_MAX), 2) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX, to_string(ULLONG_MAX), 2) );
VERIFY( check_to_chars<char>(CHAR_MIN, to_string(CHAR_MIN), 2) );
VERIFY( check_to_chars<signed char>(SCHAR_MIN, to_string(SCHAR_MIN), 2) );
VERIFY( check_to_chars<signed short>(SHRT_MIN, to_string(SHRT_MIN), 2) );
VERIFY( check_to_chars<signed int>(INT_MIN, to_string(INT_MIN), 2) );
VERIFY( check_to_chars<signed long>(LONG_MIN, to_string(LONG_MIN), 2) );
VERIFY( check_to_chars<signed long long>(LLONG_MIN, to_string(LLONG_MIN), 2) );
VERIFY( check_to_chars<char>(CHAR_MAX/2, to_string(CHAR_MAX/2), 2) );
VERIFY( check_to_chars<signed char>(SCHAR_MAX/2, to_string(SCHAR_MAX/2), 2) );
VERIFY( check_to_chars<unsigned char>(UCHAR_MAX/2, to_string(UCHAR_MAX/2), 2) );
VERIFY( check_to_chars<signed short>(SHRT_MAX/2, to_string(SHRT_MAX/2), 2) );
VERIFY( check_to_chars<unsigned short>(USHRT_MAX/2, to_string(USHRT_MAX/2), 2) );
VERIFY( check_to_chars<signed int>(INT_MAX/2, to_string(INT_MAX/2), 2) );
VERIFY( check_to_chars<unsigned int>(UINT_MAX/2, to_string(UINT_MAX/2), 2) );
VERIFY( check_to_chars<signed long>(LONG_MAX/2, to_string(LONG_MAX/2), 2) );
VERIFY( check_to_chars<unsigned long>(ULONG_MAX/2, to_string(ULONG_MAX/2), 2) );
VERIFY( check_to_chars<signed long long>(LLONG_MAX/2, to_string(LLONG_MAX/2), 2) );
VERIFY( check_to_chars<unsigned long long>(ULLONG_MAX/2, to_string(ULLONG_MAX/2), 2) );
}
int
main()
{
test01();
test02();
test03();
test04();
test05();
test06();
}