simplify to_string to not apply unary - to an unsigned integer

This commit is contained in:
arvidn 2017-09-17 11:52:04 +02:00 committed by Arvid Norberg
parent 7717c02c2f
commit 9839507ecd
2 changed files with 78 additions and 10 deletions

View File

@ -39,7 +39,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/assert.hpp"
#include <cstdlib> // for malloc
#include <cstring> // for memmov/strcpy/strlen
#include <cstring> // for strlen
#include <algorithm> // for search
namespace libtorrent {
@ -52,15 +52,12 @@ namespace libtorrent {
std::array<char, 4 + std::numeric_limits<std::int64_t>::digits10> ret;
char *p = &ret.back();
*p = '\0';
std::uint64_t un = std::uint64_t(n);
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4146 ) /* warning C4146: unary minus operator applied to unsigned type */
#endif // _MSC_VER
if (n < 0) un = -un;
#ifdef _MSC_VER
#pragma warning(pop)
#endif // _MSC_VER
// we want "un" to be the absolute value
// since the absolute of INT64_MIN cannot be represented by a signed
// int64, we calculate the abs in unsigned space
std::uint64_t un = n < 0
? std::numeric_limits<std::uint64_t>::max() - std::uint64_t(n) + 1
: std::uint64_t(n);
do {
*--p = '0' + un % 10;
un /= 10;

View File

@ -131,8 +131,79 @@ TORRENT_TEST(to_string)
{
TEST_CHECK(to_string(345).data() == std::string("345"));
TEST_CHECK(to_string(-345).data() == std::string("-345"));
TEST_CHECK(to_string(std::numeric_limits<std::int64_t>::max()).data() == std::string("9223372036854775807"));
TEST_CHECK(to_string(std::numeric_limits<std::int64_t>::min()).data() == std::string("-9223372036854775808"));
TEST_CHECK(to_string(0).data() == std::string("0"));
TEST_CHECK(to_string(10).data() == std::string("10"));
TEST_CHECK(to_string(100).data() == std::string("100"));
TEST_CHECK(to_string(1000).data() == std::string("1000"));
TEST_CHECK(to_string(10000).data() == std::string("10000"));
TEST_CHECK(to_string(100000).data() == std::string("100000"));
TEST_CHECK(to_string(1000000).data() == std::string("1000000"));
TEST_CHECK(to_string(10000000).data() == std::string("10000000"));
TEST_CHECK(to_string(100000000).data() == std::string("100000000"));
TEST_CHECK(to_string(1000000000).data() == std::string("1000000000"));
TEST_CHECK(to_string(10000000000).data() == std::string("10000000000"));
TEST_CHECK(to_string(100000000000).data() == std::string("100000000000"));
TEST_CHECK(to_string(1000000000000).data() == std::string("1000000000000"));
TEST_CHECK(to_string(10000000000000).data() == std::string("10000000000000"));
TEST_CHECK(to_string(100000000000000).data() == std::string("100000000000000"));
TEST_CHECK(to_string(1000000000000000).data() == std::string("1000000000000000"));
TEST_CHECK(to_string(9).data() == std::string("9"));
TEST_CHECK(to_string(99).data() == std::string("99"));
TEST_CHECK(to_string(999).data() == std::string("999"));
TEST_CHECK(to_string(9999).data() == std::string("9999"));
TEST_CHECK(to_string(99999).data() == std::string("99999"));
TEST_CHECK(to_string(999999).data() == std::string("999999"));
TEST_CHECK(to_string(9999999).data() == std::string("9999999"));
TEST_CHECK(to_string(99999999).data() == std::string("99999999"));
TEST_CHECK(to_string(999999999).data() == std::string("999999999"));
TEST_CHECK(to_string(9999999999).data() == std::string("9999999999"));
TEST_CHECK(to_string(99999999999).data() == std::string("99999999999"));
TEST_CHECK(to_string(999999999999).data() == std::string("999999999999"));
TEST_CHECK(to_string(9999999999999).data() == std::string("9999999999999"));
TEST_CHECK(to_string(99999999999999).data() == std::string("99999999999999"));
TEST_CHECK(to_string(999999999999999).data() == std::string("999999999999999"));
TEST_CHECK(to_string(9999999999999999).data() == std::string("9999999999999999"));
TEST_CHECK(to_string(99999999999999999).data() == std::string("99999999999999999"));
TEST_CHECK(to_string(999999999999999999).data() == std::string("999999999999999999"));
TEST_CHECK(to_string(-10).data() == std::string("-10"));
TEST_CHECK(to_string(-100).data() == std::string("-100"));
TEST_CHECK(to_string(-1000).data() == std::string("-1000"));
TEST_CHECK(to_string(-10000).data() == std::string("-10000"));
TEST_CHECK(to_string(-100000).data() == std::string("-100000"));
TEST_CHECK(to_string(-1000000).data() == std::string("-1000000"));
TEST_CHECK(to_string(-10000000).data() == std::string("-10000000"));
TEST_CHECK(to_string(-100000000).data() == std::string("-100000000"));
TEST_CHECK(to_string(-1000000000).data() == std::string("-1000000000"));
TEST_CHECK(to_string(-10000000000).data() == std::string("-10000000000"));
TEST_CHECK(to_string(-100000000000).data() == std::string("-100000000000"));
TEST_CHECK(to_string(-1000000000000).data() == std::string("-1000000000000"));
TEST_CHECK(to_string(-10000000000000).data() == std::string("-10000000000000"));
TEST_CHECK(to_string(-100000000000000).data() == std::string("-100000000000000"));
TEST_CHECK(to_string(-1000000000000000).data() == std::string("-1000000000000000"));
TEST_CHECK(to_string(-9).data() == std::string("-9"));
TEST_CHECK(to_string(-99).data() == std::string("-99"));
TEST_CHECK(to_string(-999).data() == std::string("-999"));
TEST_CHECK(to_string(-9999).data() == std::string("-9999"));
TEST_CHECK(to_string(-99999).data() == std::string("-99999"));
TEST_CHECK(to_string(-999999).data() == std::string("-999999"));
TEST_CHECK(to_string(-9999999).data() == std::string("-9999999"));
TEST_CHECK(to_string(-99999999).data() == std::string("-99999999"));
TEST_CHECK(to_string(-999999999).data() == std::string("-999999999"));
TEST_CHECK(to_string(-9999999999).data() == std::string("-9999999999"));
TEST_CHECK(to_string(-99999999999).data() == std::string("-99999999999"));
TEST_CHECK(to_string(-999999999999).data() == std::string("-999999999999"));
TEST_CHECK(to_string(-9999999999999).data() == std::string("-9999999999999"));
TEST_CHECK(to_string(-99999999999999).data() == std::string("-99999999999999"));
TEST_CHECK(to_string(-999999999999999).data() == std::string("-999999999999999"));
TEST_CHECK(to_string(-9999999999999999).data() == std::string("-9999999999999999"));
TEST_CHECK(to_string(-99999999999999999).data() == std::string("-99999999999999999"));
TEST_CHECK(to_string(-999999999999999999).data() == std::string("-999999999999999999"));
}
TORRENT_TEST(base64)