From ceeda2e337077b2edaf1af09cc4df2c30e8205a1 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Tue, 15 Apr 2014 20:05:17 -0700 Subject: Wouldn't it be nice to have some integers too? --- Makefile.in | 2 +- src/char/char.cpp | 36 +- src/compat/alg.hpp | 4 +- src/compat/iter_test.cpp | 6 +- src/generic/enum.hpp | 2 +- src/ints/cmp.cpp | 21 + src/ints/cmp.hpp | 65 +++ src/ints/cmp_test.cpp | 1461 ++++++++++++++++++++++++++++++++++++++++++++++ src/ints/udl.cpp | 21 + src/ints/udl.hpp | 222 +++++++ src/ints/udl_test.cpp | 781 +++++++++++++++++++++++++ src/io/cxxstdio.hpp | 3 + src/login/login.cpp | 4 +- src/map/atcommand.cpp | 8 +- src/map/battle.cpp | 4 +- src/map/battle.t.hpp | 6 +- src/map/clif.cpp | 80 +-- src/map/magic-expr.cpp | 8 +- src/map/magic-stmt.cpp | 2 +- src/map/map.cpp | 4 +- src/map/map.t.hpp | 8 +- src/map/pc.cpp | 15 +- src/map/script.cpp | 2 +- src/map/skill.cpp | 4 +- src/mmo/version.cpp | 2 +- src/mmo/version.hpp | 2 +- 26 files changed, 2678 insertions(+), 95 deletions(-) create mode 100644 src/ints/cmp.cpp create mode 100644 src/ints/cmp.hpp create mode 100644 src/ints/cmp_test.cpp create mode 100644 src/ints/udl.cpp create mode 100644 src/ints/udl.hpp create mode 100644 src/ints/udl_test.cpp diff --git a/Makefile.in b/Makefile.in index 6d595a4..a532bfe 100644 --- a/Makefile.in +++ b/Makefile.in @@ -384,7 +384,7 @@ conf-raw/bool-%.h: FORCE echo '#define $* $(bool_$(value $*))' | maybe-replace $@ conf-raw/str-%.h: FORCE $(MKDIR_FIRST) - echo '#define $* "$(value $*)"' | maybe-replace $@ + echo '#define $* "$(value $*)"_s' | maybe-replace $@ FORCE: ; .PHONY: FORCE override CPPFLAGS += -I . diff --git a/src/char/char.cpp b/src/char/char.cpp index 477c699..87e48cb 100644 --- a/src/char/char.cpp +++ b/src/char/char.cpp @@ -41,6 +41,8 @@ #include "../compat/alg.hpp" +#include "../ints/cmp.hpp" + #include "../strings/mstring.hpp" #include "../strings/astring.hpp" #include "../strings/zstring.hpp" @@ -363,7 +365,7 @@ AString mmo_char_tostr(struct CharPair *cp) { str_p += STRPRINTF("%d,%d "_fmt, i, - p->skill[i].lv | (uint16_t(p->skill[i].flags) << 16)); + p->skill[i].lv | (static_cast(p->skill[i].flags) << 16)); } str_p += '\t'; @@ -1004,12 +1006,12 @@ int mmo_char_send006b(Session *s, struct char_session_data *sd) WFIFO_STRING(s, j + 74, k->name.to__actual(), 24); - WFIFOB(s, j + 98) = min(p->attrs[ATTR::STR], 255); - WFIFOB(s, j + 99) = min(p->attrs[ATTR::AGI], 255); - WFIFOB(s, j + 100) = min(p->attrs[ATTR::VIT], 255); - WFIFOB(s, j + 101) = min(p->attrs[ATTR::INT], 255); - WFIFOB(s, j + 102) = min(p->attrs[ATTR::DEX], 255); - WFIFOB(s, j + 103) = min(p->attrs[ATTR::LUK], 255); + WFIFOB(s, j + 98) = saturate(p->attrs[ATTR::STR]); + WFIFOB(s, j + 99) = saturate(p->attrs[ATTR::AGI]); + WFIFOB(s, j + 100) = saturate(p->attrs[ATTR::VIT]); + WFIFOB(s, j + 101) = saturate(p->attrs[ATTR::INT]); + WFIFOB(s, j + 102) = saturate(p->attrs[ATTR::DEX]); + WFIFOB(s, j + 103) = saturate(p->attrs[ATTR::LUK]); WFIFOB(s, j + 104) = k->char_num; } @@ -2344,10 +2346,10 @@ void parse_char(Session *s) WFIFOL(s, 2 + 32) = cd->manner; WFIFOW(s, 2 + 40) = 0x30; - WFIFOW(s, 2 + 42) = min(cd->hp, 0x7fff); - WFIFOW(s, 2 + 44) = min(cd->max_hp, 0x7fff); - WFIFOW(s, 2 + 46) = min(cd->sp, 0x7fff); - WFIFOW(s, 2 + 48) = min(cd->max_sp, 0x7fff); + WFIFOW(s, 2 + 42) = saturate(cd->hp); + WFIFOW(s, 2 + 44) = saturate(cd->max_hp); + WFIFOW(s, 2 + 46) = saturate(cd->sp); + WFIFOW(s, 2 + 48) = saturate(cd->max_sp); WFIFOW(s, 2 + 50) = static_cast(DEFAULT_WALK_SPEED.count()); // cd->speed; WFIFOW(s, 2 + 52) = cd->species; WFIFOW(s, 2 + 54) = cd->hair; @@ -2362,12 +2364,12 @@ void parse_char(Session *s) WFIFO_STRING(s, 2 + 74, ck->name.to__actual(), 24); - WFIFOB(s, 2 + 98) = min(cd->attrs[ATTR::STR], 255); - WFIFOB(s, 2 + 99) = min(cd->attrs[ATTR::AGI], 255); - WFIFOB(s, 2 + 100) = min(cd->attrs[ATTR::VIT], 255); - WFIFOB(s, 2 + 101) = min(cd->attrs[ATTR::INT], 255); - WFIFOB(s, 2 + 102) = min(cd->attrs[ATTR::DEX], 255); - WFIFOB(s, 2 + 103) = min(cd->attrs[ATTR::LUK], 255); + WFIFOB(s, 2 + 98) = saturate(cd->attrs[ATTR::STR]); + WFIFOB(s, 2 + 99) = saturate(cd->attrs[ATTR::AGI]); + WFIFOB(s, 2 + 100) = saturate(cd->attrs[ATTR::VIT]); + WFIFOB(s, 2 + 101) = saturate(cd->attrs[ATTR::INT]); + WFIFOB(s, 2 + 102) = saturate(cd->attrs[ATTR::DEX]); + WFIFOB(s, 2 + 103) = saturate(cd->attrs[ATTR::LUK]); WFIFOB(s, 2 + 104) = ck->char_num; WFIFOSET(s, 108); diff --git a/src/compat/alg.hpp b/src/compat/alg.hpp index adf3f3f..f9ed8d2 100644 --- a/src/compat/alg.hpp +++ b/src/compat/alg.hpp @@ -21,7 +21,8 @@ # include "../sanity.hpp" -# include +# if 0 +# include template @@ -35,5 +36,6 @@ typename std::common_type::type max(A a, B b) { return b < a ? a : b; } +# endif #endif // TMWA_COMPAT_ALG_HPP diff --git a/src/compat/iter_test.cpp b/src/compat/iter_test.cpp index a07cb0f..99b2e68 100644 --- a/src/compat/iter_test.cpp +++ b/src/compat/iter_test.cpp @@ -20,6 +20,8 @@ #include +#include "../ints/udl.hpp" + #include "../strings/xstring.hpp" #include "../poison.hpp" @@ -33,7 +35,7 @@ TEST(iterpair, strings) TEST(iterpair, signed8) { - IteratorPair> pair = value_range(int8_t(-128), int8_t(127)); + IteratorPair> pair = value_range(-128_n8, +127_p8); int8_t arr[255] = { -128, -127, -126, -125, -124, -123, -122, -121, -120, @@ -68,7 +70,7 @@ TEST(iterpair, signed8) TEST(iterpair, unsigned8) { - IteratorPair> pair = value_range(uint8_t(0), uint8_t(255)); + IteratorPair> pair = value_range(0_u8, 255_u8); uint8_t arr[255] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, diff --git a/src/generic/enum.hpp b/src/generic/enum.hpp index a8a1088..5c0fbef 100644 --- a/src/generic/enum.hpp +++ b/src/generic/enum.hpp @@ -197,7 +197,7 @@ public: static E inced(E v) { - return E(U(v) + 1); + return static_cast(static_cast(v) + 1); } }; diff --git a/src/ints/cmp.cpp b/src/ints/cmp.cpp new file mode 100644 index 0000000..60a8fad --- /dev/null +++ b/src/ints/cmp.cpp @@ -0,0 +1,21 @@ +#include "cmp.hpp" +// cmp.cpp - comparison related operations +// +// Copyright © 2014 Ben Longbons +// +// This file is part of The Mana World (Athena server) +// +// This program 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 of the License, or +// (at your option) any later version. +// +// This program 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 program. If not, see . + +#include "../poison.hpp" diff --git a/src/ints/cmp.hpp b/src/ints/cmp.hpp new file mode 100644 index 0000000..b979c46 --- /dev/null +++ b/src/ints/cmp.hpp @@ -0,0 +1,65 @@ +#ifndef TMWA_INTS_CMP_HPP +#define TMWA_INTS_CMP_HPP +// cmp.hpp - comparison related operations +// +// Copyright © 2014 Ben Longbons +// +// This file is part of The Mana World (Athena server) +// +// This program 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 of the License, or +// (at your option) any later version. +// +// This program 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 program. If not, see . + +# include "../sanity.hpp" + +# include + +namespace ints +{ + template + T saturate(const U& v) + { + typedef std::numeric_limits Tlim; + typedef std::numeric_limits Ulim; + + if (Tlim::is_signed == Ulim::is_signed) + { + if (v > Tlim::max()) + return Tlim::max(); + if (v < Tlim::min()) + return Tlim::min(); + return v; + } + else if (Ulim::is_signed) + { + // from signed to unsigned + + // Not like v < Tlim::min(), even though Tlim::min() == 0 + if (v < 0) + return 0; + if (v > Tlim::max()) + return Tlim::max(); + return v; + } + else // Tlim::is_signed + { + // from unsigned to signed + if (v > Tlim::max()) + return Tlim::max(); + return v; + } + } +} // namespace ints + +using ints::saturate; + +#endif // TMWA_INTS_CMP_HPP diff --git a/src/ints/cmp_test.cpp b/src/ints/cmp_test.cpp new file mode 100644 index 0000000..5767579 --- /dev/null +++ b/src/ints/cmp_test.cpp @@ -0,0 +1,1461 @@ +#include "cmp.hpp" +// cmp_test.cpp - Testsuite for comparison related operations +// +// Copyright © 2014 Ben Longbons +// +// This file is part of The Mana World (Athena server) +// +// This program 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 of the License, or +// (at your option) any later version. +// +// This program 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 program. If not, see . + +#include + +#include "../compat/cast.hpp" + +#include "../poison.hpp" + +// Google Test is *really* slow to compile this file +#undef EXPECT_EQ +#define EXPECT_EQ(a, b) assert(a == b) + +TEST(ints, sati8) +{ + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x80ULL))); + EXPECT_EQ(maybe_cast(-0x7fULL), saturate(maybe_cast( -0x7fULL))); + EXPECT_EQ(maybe_cast(-0x7eULL), saturate(maybe_cast( -0x7eULL))); + EXPECT_EQ(maybe_cast(-0x01ULL), saturate(maybe_cast( -0x01ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x80ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0xfeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0xffULL))); + + + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x8000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x7fffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0100ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00ffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00feULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0081ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0080ULL))); + EXPECT_EQ(maybe_cast(-0x7fULL), saturate(maybe_cast( -0x007fULL))); + EXPECT_EQ(maybe_cast(-0x01ULL), saturate(maybe_cast( -0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x007fULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00feULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fffULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast(+0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast(+0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast(+0x007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x007fULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00feULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x8000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0xfffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0xffffULL))); + + + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x80000000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x7fffffffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00010000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000ffffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000fffeULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00008001ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00008000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00007fffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00000100ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x000000ffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x000000feULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00000081ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00000080ULL))); + EXPECT_EQ(maybe_cast(-0x7fULL), saturate(maybe_cast( -0x0000007fULL))); + EXPECT_EQ(maybe_cast(-0x01ULL), saturate(maybe_cast( -0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast(+0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast(+0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast(+0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0xfffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0xffffffffULL))); + + + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000080000001ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000000008001ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000000000081ULL))); + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(-0x7fULL), saturate(maybe_cast( -0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(-0x01ULL), saturate(maybe_cast( -0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fffffffffffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast(+0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast(+0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast(+0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0xfffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0xffffffffffffffffULL))); +} + +TEST(ints, satu8) +{ + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x80ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7fULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7eULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x01ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x80ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0xfeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0xffULL))); + + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x8000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0081ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x007fULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x007fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x0080ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0x00feULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00ffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0100ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x7fffULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast(+0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast(+0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast(+0x007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x007fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast(+0x0080ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast(+0x00feULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00ffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0100ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x7fffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x8000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0xfffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0xffffULL))); + + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00008001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00000081ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0x000000feULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x7fffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast(+0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast(+0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast(+0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast(+0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast(+0x000000feULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0xfffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0xffffffffULL))); + + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000080000001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000000008001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000000000081ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0x7fffffffffffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast(+0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast(+0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast(+0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast(+0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast(+0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast(+0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0xfffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast(+0xffffffffffffffffULL))); +} + +TEST(ints, sati16) +{ + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x80ULL))); + EXPECT_EQ(maybe_cast(-0x7fULL), saturate(maybe_cast( -0x7fULL))); + EXPECT_EQ(maybe_cast(-0x7eULL), saturate(maybe_cast( -0x7eULL))); + EXPECT_EQ(maybe_cast(-0x01ULL), saturate(maybe_cast( -0x01ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x80ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0xfeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0xffULL))); + + + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x8000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffULL), saturate(maybe_cast( -0x7fffULL))); + EXPECT_EQ(maybe_cast(-0x0100ULL), saturate(maybe_cast( -0x0100ULL))); + EXPECT_EQ(maybe_cast(-0x00ffULL), saturate(maybe_cast( -0x00ffULL))); + EXPECT_EQ(maybe_cast(-0x00feULL), saturate(maybe_cast( -0x00feULL))); + EXPECT_EQ(maybe_cast(-0x0081ULL), saturate(maybe_cast( -0x0081ULL))); + EXPECT_EQ(maybe_cast(-0x0080ULL), saturate(maybe_cast( -0x0080ULL))); + EXPECT_EQ(maybe_cast(-0x007fULL), saturate(maybe_cast( -0x007fULL))); + EXPECT_EQ(maybe_cast(-0x0001ULL), saturate(maybe_cast( -0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7fffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x8000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0xfffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0xffffULL))); + + + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x80000000ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x7fffffffULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x00010000ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x0000ffffULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x0000fffeULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x00008001ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x00008000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffULL), saturate(maybe_cast( -0x00007fffULL))); + EXPECT_EQ(maybe_cast(-0x0100ULL), saturate(maybe_cast( -0x00000100ULL))); + EXPECT_EQ(maybe_cast(-0x00ffULL), saturate(maybe_cast( -0x000000ffULL))); + EXPECT_EQ(maybe_cast(-0x00feULL), saturate(maybe_cast( -0x000000feULL))); + EXPECT_EQ(maybe_cast(-0x0081ULL), saturate(maybe_cast( -0x00000081ULL))); + EXPECT_EQ(maybe_cast(-0x0080ULL), saturate(maybe_cast( -0x00000080ULL))); + EXPECT_EQ(maybe_cast(-0x007fULL), saturate(maybe_cast( -0x0000007fULL))); + EXPECT_EQ(maybe_cast(-0x0001ULL), saturate(maybe_cast( -0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7fffffffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0xfffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0xffffffffULL))); + + + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x0000000080000001ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x0000000000008001ULL))); + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffULL), saturate(maybe_cast( -0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(-0x0100ULL), saturate(maybe_cast( -0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(-0x00ffULL), saturate(maybe_cast( -0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(-0x00feULL), saturate(maybe_cast( -0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(-0x0081ULL), saturate(maybe_cast( -0x0000000000000081ULL))); + EXPECT_EQ(maybe_cast(-0x0080ULL), saturate(maybe_cast( -0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(-0x007fULL), saturate(maybe_cast( -0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(-0x0001ULL), saturate(maybe_cast( -0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7fffffffffffffffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0xfffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0xffffffffffffffffULL))); +} + +TEST(ints, satu16) +{ + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x80ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7fULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7eULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x01ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x80ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0xfeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0xffULL))); + + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x8000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00feULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0081ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7fffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast(+0x8000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast(+0xfffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xffffULL))); + + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00008001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00000081ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast( +0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast( +0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x7fffffffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast(+0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast(+0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xfffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xffffffffULL))); + + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000080000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000000008001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000000000081ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast( +0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast( +0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast( +0x7fffffffffffffffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast(+0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast(+0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xfffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xffffffffffffffffULL))); +} + +TEST(ints, sati32) +{ + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x80ULL))); + EXPECT_EQ(maybe_cast(-0x7fULL), saturate(maybe_cast( -0x7fULL))); + EXPECT_EQ(maybe_cast(-0x7eULL), saturate(maybe_cast( -0x7eULL))); + EXPECT_EQ(maybe_cast(-0x01ULL), saturate(maybe_cast( -0x01ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x80ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0xfeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0xffULL))); + + + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x8000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffULL), saturate(maybe_cast( -0x7fffULL))); + EXPECT_EQ(maybe_cast(-0x0100ULL), saturate(maybe_cast( -0x0100ULL))); + EXPECT_EQ(maybe_cast(-0x00ffULL), saturate(maybe_cast( -0x00ffULL))); + EXPECT_EQ(maybe_cast(-0x00feULL), saturate(maybe_cast( -0x00feULL))); + EXPECT_EQ(maybe_cast(-0x0081ULL), saturate(maybe_cast( -0x0081ULL))); + EXPECT_EQ(maybe_cast(-0x0080ULL), saturate(maybe_cast( -0x0080ULL))); + EXPECT_EQ(maybe_cast(-0x007fULL), saturate(maybe_cast( -0x007fULL))); + EXPECT_EQ(maybe_cast(-0x0001ULL), saturate(maybe_cast( -0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7fffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast(+0x8000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast(+0xfffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xffffULL))); + + + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x80000000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffffffULL), saturate(maybe_cast( -0x7fffffffULL))); + EXPECT_EQ(maybe_cast(-0x00010000ULL), saturate(maybe_cast( -0x00010000ULL))); + EXPECT_EQ(maybe_cast(-0x0000ffffULL), saturate(maybe_cast( -0x0000ffffULL))); + EXPECT_EQ(maybe_cast(-0x0000fffeULL), saturate(maybe_cast( -0x0000fffeULL))); + EXPECT_EQ(maybe_cast(-0x00008001ULL), saturate(maybe_cast( -0x00008001ULL))); + EXPECT_EQ(maybe_cast(-0x00008000ULL), saturate(maybe_cast( -0x00008000ULL))); + EXPECT_EQ(maybe_cast(-0x00007fffULL), saturate(maybe_cast( -0x00007fffULL))); + EXPECT_EQ(maybe_cast(-0x00000100ULL), saturate(maybe_cast( -0x00000100ULL))); + EXPECT_EQ(maybe_cast(-0x000000ffULL), saturate(maybe_cast( -0x000000ffULL))); + EXPECT_EQ(maybe_cast(-0x000000feULL), saturate(maybe_cast( -0x000000feULL))); + EXPECT_EQ(maybe_cast(-0x00000081ULL), saturate(maybe_cast( -0x00000081ULL))); + EXPECT_EQ(maybe_cast(-0x00000080ULL), saturate(maybe_cast( -0x00000080ULL))); + EXPECT_EQ(maybe_cast(-0x0000007fULL), saturate(maybe_cast( -0x0000007fULL))); + EXPECT_EQ(maybe_cast(-0x00000001ULL), saturate(maybe_cast( -0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( +0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast( +0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast( +0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast( +0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast( +0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast( +0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast( +0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast( +0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast( +0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast( +0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast( +0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast( +0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast( +0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast( +0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast( +0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x7fffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast(+0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast(+0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast(+0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast(+0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast(+0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast(+0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast(+0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast(+0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast(+0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast(+0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast(+0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast(+0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast(+0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast(+0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast(+0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0xfffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0xffffffffULL))); + + + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x0000000080000001ULL))); + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffffffULL), saturate(maybe_cast( -0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(-0x00010000ULL), saturate(maybe_cast( -0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(-0x0000ffffULL), saturate(maybe_cast( -0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(-0x0000fffeULL), saturate(maybe_cast( -0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(-0x00008001ULL), saturate(maybe_cast( -0x0000000000008001ULL))); + EXPECT_EQ(maybe_cast(-0x00008000ULL), saturate(maybe_cast( -0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(-0x00007fffULL), saturate(maybe_cast( -0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(-0x00000100ULL), saturate(maybe_cast( -0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(-0x000000ffULL), saturate(maybe_cast( -0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(-0x000000feULL), saturate(maybe_cast( -0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(-0x00000081ULL), saturate(maybe_cast( -0x0000000000000081ULL))); + EXPECT_EQ(maybe_cast(-0x00000080ULL), saturate(maybe_cast( -0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(-0x0000007fULL), saturate(maybe_cast( -0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(-0x00000001ULL), saturate(maybe_cast( -0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( +0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast( +0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast( +0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast( +0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast( +0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast( +0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast( +0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast( +0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast( +0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast( +0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast( +0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast( +0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast( +0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast( +0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast( +0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x7fffffffffffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast(+0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast(+0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast(+0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast(+0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast(+0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast(+0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast(+0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast(+0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast(+0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast(+0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast(+0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast(+0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast(+0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast(+0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast(+0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0xfffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0xffffffffffffffffULL))); +} + +TEST(ints, satu32) +{ + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x80ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7fULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7eULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x01ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x80ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0xfeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0xffULL))); + + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x8000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00feULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0081ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7fffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast(+0x8000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast(+0xfffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xffffULL))); + + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00008001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000081ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( +0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast( +0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast( +0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast( +0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast( +0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast( +0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast( +0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast( +0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast( +0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast( +0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast( +0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast( +0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast( +0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast( +0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast( +0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x7fffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast(+0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast(+0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast(+0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast(+0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast(+0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast(+0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast(+0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast(+0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast(+0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast(+0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast(+0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast(+0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast(+0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast(+0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast(+0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x80000000ULL), saturate(maybe_cast(+0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0xfffffffeULL), saturate(maybe_cast(+0xfffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0xffffffffULL))); + + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000080000001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000000008001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000000000081ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( +0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast( +0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast( +0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast( +0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast( +0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast( +0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast( +0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast( +0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast( +0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast( +0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast( +0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast( +0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast( +0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast( +0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast( +0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x80000000ULL), saturate(maybe_cast( +0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0xfffffffeULL), saturate(maybe_cast( +0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast( +0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast( +0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast( +0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast( +0x7fffffffffffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast(+0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast(+0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast(+0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast(+0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast(+0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast(+0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast(+0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast(+0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast(+0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast(+0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast(+0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast(+0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast(+0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast(+0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast(+0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x80000000ULL), saturate(maybe_cast(+0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0xfffffffeULL), saturate(maybe_cast(+0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0xfffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0xffffffffffffffffULL))); +} + +TEST(ints, sati64) +{ + EXPECT_EQ(maybe_cast(-0x80ULL), saturate(maybe_cast( -0x80ULL))); + EXPECT_EQ(maybe_cast(-0x7fULL), saturate(maybe_cast( -0x7fULL))); + EXPECT_EQ(maybe_cast(-0x7eULL), saturate(maybe_cast( -0x7eULL))); + EXPECT_EQ(maybe_cast(-0x01ULL), saturate(maybe_cast( -0x01ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x80ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0xfeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0xffULL))); + + + EXPECT_EQ(maybe_cast(-0x8000ULL), saturate(maybe_cast( -0x8000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffULL), saturate(maybe_cast( -0x7fffULL))); + EXPECT_EQ(maybe_cast(-0x0100ULL), saturate(maybe_cast( -0x0100ULL))); + EXPECT_EQ(maybe_cast(-0x00ffULL), saturate(maybe_cast( -0x00ffULL))); + EXPECT_EQ(maybe_cast(-0x00feULL), saturate(maybe_cast( -0x00feULL))); + EXPECT_EQ(maybe_cast(-0x0081ULL), saturate(maybe_cast( -0x0081ULL))); + EXPECT_EQ(maybe_cast(-0x0080ULL), saturate(maybe_cast( -0x0080ULL))); + EXPECT_EQ(maybe_cast(-0x007fULL), saturate(maybe_cast( -0x007fULL))); + EXPECT_EQ(maybe_cast(-0x0001ULL), saturate(maybe_cast( -0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7fffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast(+0x8000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast(+0xfffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xffffULL))); + + + EXPECT_EQ(maybe_cast(-0x80000000ULL), saturate(maybe_cast( -0x80000000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffffffULL), saturate(maybe_cast( -0x7fffffffULL))); + EXPECT_EQ(maybe_cast(-0x00010000ULL), saturate(maybe_cast( -0x00010000ULL))); + EXPECT_EQ(maybe_cast(-0x0000ffffULL), saturate(maybe_cast( -0x0000ffffULL))); + EXPECT_EQ(maybe_cast(-0x0000fffeULL), saturate(maybe_cast( -0x0000fffeULL))); + EXPECT_EQ(maybe_cast(-0x00008001ULL), saturate(maybe_cast( -0x00008001ULL))); + EXPECT_EQ(maybe_cast(-0x00008000ULL), saturate(maybe_cast( -0x00008000ULL))); + EXPECT_EQ(maybe_cast(-0x00007fffULL), saturate(maybe_cast( -0x00007fffULL))); + EXPECT_EQ(maybe_cast(-0x00000100ULL), saturate(maybe_cast( -0x00000100ULL))); + EXPECT_EQ(maybe_cast(-0x000000ffULL), saturate(maybe_cast( -0x000000ffULL))); + EXPECT_EQ(maybe_cast(-0x000000feULL), saturate(maybe_cast( -0x000000feULL))); + EXPECT_EQ(maybe_cast(-0x00000081ULL), saturate(maybe_cast( -0x00000081ULL))); + EXPECT_EQ(maybe_cast(-0x00000080ULL), saturate(maybe_cast( -0x00000080ULL))); + EXPECT_EQ(maybe_cast(-0x0000007fULL), saturate(maybe_cast( -0x0000007fULL))); + EXPECT_EQ(maybe_cast(-0x00000001ULL), saturate(maybe_cast( -0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( +0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast( +0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast( +0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast( +0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast( +0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast( +0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast( +0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast( +0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast( +0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast( +0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast( +0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast( +0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast( +0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast( +0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast( +0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x7fffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast(+0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast(+0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast(+0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast(+0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast(+0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast(+0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast(+0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast(+0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast(+0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast(+0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast(+0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast(+0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast(+0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast(+0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast(+0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x80000000ULL), saturate(maybe_cast(+0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0xfffffffeULL), saturate(maybe_cast(+0xfffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0xffffffffULL))); + + + EXPECT_EQ(maybe_cast(-0x8000000000000000ULL), saturate(maybe_cast( -0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(-0x7fffffffffffffffULL), saturate(maybe_cast( -0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(-0x0000000100000000ULL), saturate(maybe_cast( -0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(-0x00000000ffffffffULL), saturate(maybe_cast( -0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(-0x00000000fffffffeULL), saturate(maybe_cast( -0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(-0x0000000080000001ULL), saturate(maybe_cast( -0x0000000080000001ULL))); + EXPECT_EQ(maybe_cast(-0x0000000080000000ULL), saturate(maybe_cast( -0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(-0x000000007fffffffULL), saturate(maybe_cast( -0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(-0x0000000000010000ULL), saturate(maybe_cast( -0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(-0x000000000000ffffULL), saturate(maybe_cast( -0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(-0x000000000000fffeULL), saturate(maybe_cast( -0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(-0x0000000000008001ULL), saturate(maybe_cast( -0x0000000000008001ULL))); + EXPECT_EQ(maybe_cast(-0x0000000000008000ULL), saturate(maybe_cast( -0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(-0x0000000000007fffULL), saturate(maybe_cast( -0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(-0x0000000000000100ULL), saturate(maybe_cast( -0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(-0x00000000000000ffULL), saturate(maybe_cast( -0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(-0x00000000000000feULL), saturate(maybe_cast( -0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(-0x0000000000000081ULL), saturate(maybe_cast( -0x0000000000000081ULL))); + EXPECT_EQ(maybe_cast(-0x0000000000000080ULL), saturate(maybe_cast( -0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(-0x000000000000007fULL), saturate(maybe_cast( -0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(-0x0000000000000001ULL), saturate(maybe_cast( -0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( +0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000001ULL), saturate(maybe_cast( +0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x000000000000007eULL), saturate(maybe_cast( +0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x000000000000007fULL), saturate(maybe_cast( +0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000080ULL), saturate(maybe_cast( +0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00000000000000feULL), saturate(maybe_cast( +0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00000000000000ffULL), saturate(maybe_cast( +0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000100ULL), saturate(maybe_cast( +0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000007ffeULL), saturate(maybe_cast( +0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x0000000000007fffULL), saturate(maybe_cast( +0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000008000ULL), saturate(maybe_cast( +0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x000000000000fffeULL), saturate(maybe_cast( +0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x000000000000ffffULL), saturate(maybe_cast( +0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000010000ULL), saturate(maybe_cast( +0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x000000007ffffffeULL), saturate(maybe_cast( +0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x000000007fffffffULL), saturate(maybe_cast( +0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000080000000ULL), saturate(maybe_cast( +0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000fffffffeULL), saturate(maybe_cast( +0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x00000000ffffffffULL), saturate(maybe_cast( +0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000100000000ULL), saturate(maybe_cast( +0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffffffffffeULL), saturate(maybe_cast( +0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffffffffffULL), saturate(maybe_cast( +0x7fffffffffffffffULL))); + + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast(+0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000001ULL), saturate(maybe_cast(+0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x000000000000007eULL), saturate(maybe_cast(+0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x000000000000007fULL), saturate(maybe_cast(+0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000080ULL), saturate(maybe_cast(+0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00000000000000feULL), saturate(maybe_cast(+0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00000000000000ffULL), saturate(maybe_cast(+0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000100ULL), saturate(maybe_cast(+0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000007ffeULL), saturate(maybe_cast(+0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x0000000000007fffULL), saturate(maybe_cast(+0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000008000ULL), saturate(maybe_cast(+0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x000000000000fffeULL), saturate(maybe_cast(+0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x000000000000ffffULL), saturate(maybe_cast(+0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000010000ULL), saturate(maybe_cast(+0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x000000007ffffffeULL), saturate(maybe_cast(+0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x000000007fffffffULL), saturate(maybe_cast(+0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000080000000ULL), saturate(maybe_cast(+0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000fffffffeULL), saturate(maybe_cast(+0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x00000000ffffffffULL), saturate(maybe_cast(+0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000100000000ULL), saturate(maybe_cast(+0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffffffffffeULL), saturate(maybe_cast(+0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffffffffffULL), saturate(maybe_cast(+0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffffffffffULL), saturate(maybe_cast(+0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffffffffffULL), saturate(maybe_cast(+0xfffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffffffffffULL), saturate(maybe_cast(+0xffffffffffffffffULL))); +} + +TEST(ints, satu64) +{ + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x80ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7fULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x7eULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( -0x01ULL))); + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + + EXPECT_EQ(maybe_cast(+0x00ULL), saturate(maybe_cast( +0x00ULL))); + EXPECT_EQ(maybe_cast(+0x01ULL), saturate(maybe_cast( +0x01ULL))); + EXPECT_EQ(maybe_cast(+0x7eULL), saturate(maybe_cast( +0x7eULL))); + EXPECT_EQ(maybe_cast(+0x7fULL), saturate(maybe_cast( +0x7fULL))); + EXPECT_EQ(maybe_cast(+0x80ULL), saturate(maybe_cast( +0x80ULL))); + EXPECT_EQ(maybe_cast(+0xfeULL), saturate(maybe_cast( +0xfeULL))); + EXPECT_EQ(maybe_cast(+0xffULL), saturate(maybe_cast( +0xffULL))); + + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x8000ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x00feULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0081ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( -0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast( +0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast( +0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast( +0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast( +0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast( +0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast( +0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast( +0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast( +0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast( +0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast( +0x7fffULL))); + + EXPECT_EQ(maybe_cast(+0x0000ULL), saturate(maybe_cast(+0x0000ULL))); + EXPECT_EQ(maybe_cast(+0x0001ULL), saturate(maybe_cast(+0x0001ULL))); + EXPECT_EQ(maybe_cast(+0x007eULL), saturate(maybe_cast(+0x007eULL))); + EXPECT_EQ(maybe_cast(+0x007fULL), saturate(maybe_cast(+0x007fULL))); + EXPECT_EQ(maybe_cast(+0x0080ULL), saturate(maybe_cast(+0x0080ULL))); + EXPECT_EQ(maybe_cast(+0x00feULL), saturate(maybe_cast(+0x00feULL))); + EXPECT_EQ(maybe_cast(+0x00ffULL), saturate(maybe_cast(+0x00ffULL))); + EXPECT_EQ(maybe_cast(+0x0100ULL), saturate(maybe_cast(+0x0100ULL))); + EXPECT_EQ(maybe_cast(+0x7ffeULL), saturate(maybe_cast(+0x7ffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffULL), saturate(maybe_cast(+0x7fffULL))); + EXPECT_EQ(maybe_cast(+0x8000ULL), saturate(maybe_cast(+0x8000ULL))); + EXPECT_EQ(maybe_cast(+0xfffeULL), saturate(maybe_cast(+0xfffeULL))); + EXPECT_EQ(maybe_cast(+0xffffULL), saturate(maybe_cast(+0xffffULL))); + + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00008001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000081ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( -0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast( +0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast( +0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast( +0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast( +0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast( +0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast( +0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast( +0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast( +0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast( +0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast( +0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast( +0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast( +0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast( +0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast( +0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast( +0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast( +0x7fffffffULL))); + + EXPECT_EQ(maybe_cast(+0x00000000ULL), saturate(maybe_cast(+0x00000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000001ULL), saturate(maybe_cast(+0x00000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000007eULL), saturate(maybe_cast(+0x0000007eULL))); + EXPECT_EQ(maybe_cast(+0x0000007fULL), saturate(maybe_cast(+0x0000007fULL))); + EXPECT_EQ(maybe_cast(+0x00000080ULL), saturate(maybe_cast(+0x00000080ULL))); + EXPECT_EQ(maybe_cast(+0x000000feULL), saturate(maybe_cast(+0x000000feULL))); + EXPECT_EQ(maybe_cast(+0x000000ffULL), saturate(maybe_cast(+0x000000ffULL))); + EXPECT_EQ(maybe_cast(+0x00000100ULL), saturate(maybe_cast(+0x00000100ULL))); + EXPECT_EQ(maybe_cast(+0x00007ffeULL), saturate(maybe_cast(+0x00007ffeULL))); + EXPECT_EQ(maybe_cast(+0x00007fffULL), saturate(maybe_cast(+0x00007fffULL))); + EXPECT_EQ(maybe_cast(+0x00008000ULL), saturate(maybe_cast(+0x00008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000fffeULL), saturate(maybe_cast(+0x0000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000ffffULL), saturate(maybe_cast(+0x0000ffffULL))); + EXPECT_EQ(maybe_cast(+0x00010000ULL), saturate(maybe_cast(+0x00010000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffeULL), saturate(maybe_cast(+0x7ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffULL), saturate(maybe_cast(+0x7fffffffULL))); + EXPECT_EQ(maybe_cast(+0x80000000ULL), saturate(maybe_cast(+0x80000000ULL))); + EXPECT_EQ(maybe_cast(+0xfffffffeULL), saturate(maybe_cast(+0xfffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffULL), saturate(maybe_cast(+0xffffffffULL))); + + + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000080000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000000008001ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000000000081ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( -0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast( +0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000001ULL), saturate(maybe_cast( +0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x000000000000007eULL), saturate(maybe_cast( +0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x000000000000007fULL), saturate(maybe_cast( +0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000080ULL), saturate(maybe_cast( +0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00000000000000feULL), saturate(maybe_cast( +0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00000000000000ffULL), saturate(maybe_cast( +0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000100ULL), saturate(maybe_cast( +0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000007ffeULL), saturate(maybe_cast( +0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x0000000000007fffULL), saturate(maybe_cast( +0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000008000ULL), saturate(maybe_cast( +0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x000000000000fffeULL), saturate(maybe_cast( +0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x000000000000ffffULL), saturate(maybe_cast( +0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000010000ULL), saturate(maybe_cast( +0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x000000007ffffffeULL), saturate(maybe_cast( +0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x000000007fffffffULL), saturate(maybe_cast( +0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000080000000ULL), saturate(maybe_cast( +0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000fffffffeULL), saturate(maybe_cast( +0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x00000000ffffffffULL), saturate(maybe_cast( +0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000100000000ULL), saturate(maybe_cast( +0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffffffffffeULL), saturate(maybe_cast( +0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffffffffffULL), saturate(maybe_cast( +0x7fffffffffffffffULL))); + + EXPECT_EQ(maybe_cast(+0x0000000000000000ULL), saturate(maybe_cast(+0x0000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000001ULL), saturate(maybe_cast(+0x0000000000000001ULL))); + EXPECT_EQ(maybe_cast(+0x000000000000007eULL), saturate(maybe_cast(+0x000000000000007eULL))); + EXPECT_EQ(maybe_cast(+0x000000000000007fULL), saturate(maybe_cast(+0x000000000000007fULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000080ULL), saturate(maybe_cast(+0x0000000000000080ULL))); + EXPECT_EQ(maybe_cast(+0x00000000000000feULL), saturate(maybe_cast(+0x00000000000000feULL))); + EXPECT_EQ(maybe_cast(+0x00000000000000ffULL), saturate(maybe_cast(+0x00000000000000ffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000000100ULL), saturate(maybe_cast(+0x0000000000000100ULL))); + EXPECT_EQ(maybe_cast(+0x0000000000007ffeULL), saturate(maybe_cast(+0x0000000000007ffeULL))); + EXPECT_EQ(maybe_cast(+0x0000000000007fffULL), saturate(maybe_cast(+0x0000000000007fffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000008000ULL), saturate(maybe_cast(+0x0000000000008000ULL))); + EXPECT_EQ(maybe_cast(+0x000000000000fffeULL), saturate(maybe_cast(+0x000000000000fffeULL))); + EXPECT_EQ(maybe_cast(+0x000000000000ffffULL), saturate(maybe_cast(+0x000000000000ffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000000010000ULL), saturate(maybe_cast(+0x0000000000010000ULL))); + EXPECT_EQ(maybe_cast(+0x000000007ffffffeULL), saturate(maybe_cast(+0x000000007ffffffeULL))); + EXPECT_EQ(maybe_cast(+0x000000007fffffffULL), saturate(maybe_cast(+0x000000007fffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000080000000ULL), saturate(maybe_cast(+0x0000000080000000ULL))); + EXPECT_EQ(maybe_cast(+0x00000000fffffffeULL), saturate(maybe_cast(+0x00000000fffffffeULL))); + EXPECT_EQ(maybe_cast(+0x00000000ffffffffULL), saturate(maybe_cast(+0x00000000ffffffffULL))); + EXPECT_EQ(maybe_cast(+0x0000000100000000ULL), saturate(maybe_cast(+0x0000000100000000ULL))); + EXPECT_EQ(maybe_cast(+0x7ffffffffffffffeULL), saturate(maybe_cast(+0x7ffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0x7fffffffffffffffULL), saturate(maybe_cast(+0x7fffffffffffffffULL))); + EXPECT_EQ(maybe_cast(+0x8000000000000000ULL), saturate(maybe_cast(+0x8000000000000000ULL))); + EXPECT_EQ(maybe_cast(+0xfffffffffffffffeULL), saturate(maybe_cast(+0xfffffffffffffffeULL))); + EXPECT_EQ(maybe_cast(+0xffffffffffffffffULL), saturate(maybe_cast(+0xffffffffffffffffULL))); +} diff --git a/src/ints/udl.cpp b/src/ints/udl.cpp new file mode 100644 index 0000000..87dac9c --- /dev/null +++ b/src/ints/udl.cpp @@ -0,0 +1,21 @@ +#include "udl.hpp" +// udl.cpp - user-defined literals for integers. +// +// Copyright © 2014 Ben Longbons +// +// This file is part of The Mana World (Athena server) +// +// This program 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 of the License, or +// (at your option) any later version. +// +// This program 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 program. If not, see . + +#include "../poison.hpp" diff --git a/src/ints/udl.hpp b/src/ints/udl.hpp new file mode 100644 index 0000000..e3e5fcc --- /dev/null +++ b/src/ints/udl.hpp @@ -0,0 +1,222 @@ +#ifndef TMWA_INTS_UDL_HPP +#define TMWA_INTS_UDL_HPP +// udl.hpp - user-defined literals for integers. +// +// Copyright © 2014 Ben Longbons +// +// This file is part of The Mana World (Athena server) +// +// This program 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 of the License, or +// (at your option) any later version. +// +// This program 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 program. If not, see . + +# include "../sanity.hpp" + +# include + +# include + +namespace ints +{ + namespace + { + typedef unsigned long long ullong; + template + struct CharParser + { + constexpr static + bool is_dec = '0' <= C && C <= '9'; + constexpr static + bool is_upper = 'A' <= C && C <= 'F'; + constexpr static + bool is_lower = 'a' <= C && C <= 'f'; + + static_assert(is_dec || is_upper || is_lower, "char base"); + + constexpr static + ullong value = is_upper ? (C - 'A' + 10) : is_lower ? (C - 'a' + 10) : C - '0'; + }; + + template + struct BaseParser; + template + struct BaseParser + { + constexpr static + ullong mulled = accum * base; + constexpr static + ullong add = CharParser::value; + static_assert(add < base, "parse base"); + constexpr static + ullong added = mulled + add; + static_assert(added > accum || accum == 0, "parse overflow"); + + constexpr static + ullong value = BaseParser::value; + }; + template + struct BaseParser + { + constexpr static + ullong value = accum; + }; + + template + struct IntParser + { + constexpr static + ullong value = BaseParser<10, 0, C...>::value; + }; + + template + struct IntParser<'0', C...> + { + constexpr static + ullong value = BaseParser<8, 0, C...>::value; + }; + + template + struct IntParser<'0', 'x', C...> + { + constexpr static + ullong value = BaseParser<16, 0, C...>::value; + }; + + template + struct IntParser<'0', 'X', C...> + { + constexpr static + ullong value = BaseParser<16, 0, C...>::value; + }; + + template + struct IntParser<'0', 'b', C...> + { + constexpr static + ullong value = BaseParser<2, 0, C...>::value; + }; + + template + struct IntParser<'0', 'B', C...> + { + constexpr static + ullong value = BaseParser<2, 0, C...>::value; + }; + + template + struct SignedMagnitudeConstant + { + static constexpr + bool sign = S; + static constexpr + ullong magnitude = V; + + template + operator T() + { + typedef typename std::make_unsigned::type U; + + constexpr bool is_signed = T(-1) < T(0); + static_assert(is_signed >= (sign && magnitude), "signed"); + constexpr ullong max = ullong(U(-1) >> is_signed); + static_assert(magnitude <= max || (sign && magnitude == max + 1), "magna"); + return sign ? T(ullong(-magnitude)) : T(magnitude); + } + }; + + template + constexpr + bool operator == (SignedMagnitudeConstant, SignedMagnitudeConstant) + { + return V1 == V2 && (S1 == S2 || !V1); + } + template + constexpr + bool operator != (SignedMagnitudeConstant lhs, SignedMagnitudeConstant rhs) + { + return !(lhs == rhs); + } + template + constexpr + SignedMagnitudeConstant operator -(SignedMagnitudeConstant) + { + return {}; + } + + struct pint8 { int8_t value; int8_t operator +() { return value; } }; + struct pint16 { int16_t value; int16_t operator +() { return value; } }; + struct pint32 { int32_t value; int32_t operator +() { return value; } }; + struct pint64 { int64_t value; int64_t operator +() { return value; } }; + struct nint8 { int8_t value; int8_t operator -() { return value; } }; + struct nint16 { int16_t value; int16_t operator -() { return value; } }; + struct nint32 { int32_t value; int32_t operator -() { return value; } }; + struct nint64 { int64_t value; int64_t operator -() { return value; } }; + + template + SignedMagnitudeConstant::value> operator "" _const() + { return {}; } + + template + constexpr + uint8_t operator "" _u8 () { return operator "" _const(); } + template + constexpr + uint16_t operator "" _u16 () { return operator "" _const(); } + template + constexpr + uint32_t operator "" _u32 () { return operator "" _const(); } + template + constexpr + uint64_t operator "" _u64 () { return operator "" _const(); } + template + constexpr + pint8 operator "" _p8 () { return pint8{operator "" _const()}; } + template + constexpr + pint16 operator "" _p16 () { return pint16{operator "" _const()}; } + template + constexpr + pint32 operator "" _p32 () { return pint32{operator "" _const()}; } + template + constexpr + pint64 operator "" _p64 () { return pint64{operator "" _const()}; } + template + constexpr + nint8 operator "" _n8 () { return nint8{-operator "" _const()}; } + template + constexpr + nint16 operator "" _n16 () { return nint16{-operator "" _const()}; } + template + constexpr + nint32 operator "" _n32 () { return nint32{-operator "" _const()}; } + template + constexpr + nint64 operator "" _n64 () { return nint64{-operator "" _const()}; } + } // anonymous namespace +} // namespace ints + +using ints::operator "" _const; + +using ints::operator "" _u8; +using ints::operator "" _u16; +using ints::operator "" _u32; +using ints::operator "" _u64; +using ints::operator "" _p8; +using ints::operator "" _p16; +using ints::operator "" _p32; +using ints::operator "" _p64; +using ints::operator "" _n8; +using ints::operator "" _n16; +using ints::operator "" _n32; +using ints::operator "" _n64; + +#endif // TMWA_INTS_UDL_HPP diff --git a/src/ints/udl_test.cpp b/src/ints/udl_test.cpp new file mode 100644 index 0000000..26ea7c3 --- /dev/null +++ b/src/ints/udl_test.cpp @@ -0,0 +1,781 @@ +#include "udl.hpp" +// udl_test.cpp - Testsuite for a user-defined integer suffixes +// +// Copyright © 2014 Ben Longbons +// +// This file is part of The Mana World (Athena server) +// +// This program 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 of the License, or +// (at your option) any later version. +// +// This program 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 program. If not, see . + +#include + +#include "../compat/cast.hpp" + +#include "../poison.hpp" + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-variable" +TEST(ints, smc) +{ + { + ints::SignedMagnitudeConstant i; + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + static_cast(i); + } + { + ints::SignedMagnitudeConstant i; + //static_cast(i); + //static_cast(i); + //static_cast(i); + //static_cast(i); + } + { + //ints::SignedMagnitudeConstant i; + } + { + //ints::SignedMagnitudeConstant i; + } +} +#pragma GCC diagnostic pop + +TEST(ints, constant) +{ + EXPECT_EQ(0_const, (ints::SignedMagnitudeConstant{})); + EXPECT_EQ(1_const, (ints::SignedMagnitudeConstant{})); + EXPECT_EQ(1_const, (ints::SignedMagnitudeConstant{})); +} + +TEST(ints, udl8) +{ + EXPECT_EQ(0b00000000_u8, maybe_cast(0b00000000U)); + EXPECT_EQ(0b00000001_u8, maybe_cast(0b00000001U)); + EXPECT_EQ(0b11111110_u8, maybe_cast(0b11111110U)); + EXPECT_EQ(0b11111111_u8, maybe_cast(0b11111111U)); + EXPECT_EQ(-0b10000000_n8, maybe_cast(-0b10000000)); + EXPECT_EQ(-0b01111111_n8, maybe_cast(-0b01111111)); + EXPECT_EQ(-0b00000001_n8, maybe_cast(-0b00000001)); + EXPECT_EQ(+0b00000000_p8, maybe_cast(0b00000000)); + EXPECT_EQ(+0b00000001_p8, maybe_cast(0b00000001)); + EXPECT_EQ(+0b01111110_p8, maybe_cast(0b01111110)); + EXPECT_EQ(+0b01111111_p8, maybe_cast(0b01111111)); + + EXPECT_EQ(0B00000000_u8, maybe_cast(0B00000000U)); + EXPECT_EQ(0B00000001_u8, maybe_cast(0B00000001U)); + EXPECT_EQ(0B11111110_u8, maybe_cast(0B11111110U)); + EXPECT_EQ(0B11111111_u8, maybe_cast(0B11111111U)); + EXPECT_EQ(-0B10000000_n8, maybe_cast(-0B10000000)); + EXPECT_EQ(-0B01111111_n8, maybe_cast(-0B01111111)); + EXPECT_EQ(-0B00000001_n8, maybe_cast(-0B00000001)); + EXPECT_EQ(+0B00000000_p8, maybe_cast(0B00000000)); + EXPECT_EQ(+0B00000001_p8, maybe_cast(0B00000001)); + EXPECT_EQ(+0B01111110_p8, maybe_cast(0B01111110)); + EXPECT_EQ(+0B01111111_p8, maybe_cast(0B01111111)); + + EXPECT_EQ(0000_u8, maybe_cast(0000U)); + EXPECT_EQ(0001_u8, maybe_cast(0001U)); + EXPECT_EQ(0376_u8, maybe_cast(0376U)); + EXPECT_EQ(0377_u8, maybe_cast(0377U)); + EXPECT_EQ(-0200_n8, maybe_cast(-0200)); + EXPECT_EQ(-0177_n8, maybe_cast(-0177)); + EXPECT_EQ(-0001_n8, maybe_cast(-0001)); + EXPECT_EQ(+0000_p8, maybe_cast(0000)); + EXPECT_EQ(+0001_p8, maybe_cast(0001)); + EXPECT_EQ(+0176_p8, maybe_cast(0176)); + EXPECT_EQ(+0177_p8, maybe_cast(0177)); + + EXPECT_EQ(0_u8, maybe_cast(0U)); + EXPECT_EQ(1_u8, maybe_cast(1U)); + EXPECT_EQ(254_u8, maybe_cast(254U)); + EXPECT_EQ(255_u8, maybe_cast(255U)); + EXPECT_EQ(-128_n8, maybe_cast(-128)); + EXPECT_EQ(-127_n8, maybe_cast(-127)); + EXPECT_EQ(-1_n8, maybe_cast(-1)); + EXPECT_EQ(+0_p8, maybe_cast(0)); + EXPECT_EQ(+1_p8, maybe_cast(1)); + EXPECT_EQ(+126_p8, maybe_cast(126)); + EXPECT_EQ(+127_p8, maybe_cast(127)); + + EXPECT_EQ(0x00_u8, maybe_cast(0x00U)); + EXPECT_EQ(0x01_u8, maybe_cast(0x01U)); + EXPECT_EQ(0xfe_u8, maybe_cast(0xfeU)); + EXPECT_EQ(0xff_u8, maybe_cast(0xffU)); + EXPECT_EQ(-0x80_n8, maybe_cast(-0x80)); + EXPECT_EQ(-0x7f_n8, maybe_cast(-0x7f)); + EXPECT_EQ(-0x01_n8, maybe_cast(-0x01)); + EXPECT_EQ(+0x00_p8, maybe_cast(0x00)); + EXPECT_EQ(+0x01_p8, maybe_cast(0x01)); + EXPECT_EQ(+0x7e_p8, maybe_cast(0x7e)); + EXPECT_EQ(+0x7f_p8, maybe_cast(0x7f)); + + EXPECT_EQ(0X00_u8, maybe_cast(0X00U)); + EXPECT_EQ(0X01_u8, maybe_cast(0X01U)); + EXPECT_EQ(0XFE_u8, maybe_cast(0XFEU)); + EXPECT_EQ(0XFF_u8, maybe_cast(0XFFU)); + EXPECT_EQ(-0X80_n8, maybe_cast(-0X80)); + EXPECT_EQ(-0X7F_n8, maybe_cast(-0X7F)); + EXPECT_EQ(-0X01_n8, maybe_cast(-0X01)); + EXPECT_EQ(+0X00_p8, maybe_cast(0X00)); + EXPECT_EQ(+0X01_p8, maybe_cast(0X01)); + EXPECT_EQ(+0X7E_p8, maybe_cast(0X7E)); + EXPECT_EQ(+0X7F_p8, maybe_cast(0X7F)); +} + +TEST(ints, udl16) +{ + EXPECT_EQ(0b0000000000000000_u16, maybe_cast(0b0000000000000000U)); + EXPECT_EQ(0b0000000000000001_u16, maybe_cast(0b0000000000000001U)); + EXPECT_EQ(0b1111111111111110_u16, maybe_cast(0b1111111111111110U)); + EXPECT_EQ(0b1111111111111111_u16, maybe_cast(0b1111111111111111U)); + EXPECT_EQ(-0b1000000000000000_n16, maybe_cast(-0b1000000000000000)); + EXPECT_EQ(-0b0111111111111111_n16, maybe_cast(-0b0111111111111111)); + EXPECT_EQ(-0b0000000000000001_n16, maybe_cast(-0b0000000000000001)); + EXPECT_EQ(+0b0000000000000000_p16, maybe_cast(0b0000000000000000)); + EXPECT_EQ(+0b0000000000000001_p16, maybe_cast(0b0000000000000001)); + EXPECT_EQ(+0b0111111111111110_p16, maybe_cast(0b0111111111111110)); + EXPECT_EQ(+0b0111111111111111_p16, maybe_cast(0b0111111111111111)); + + EXPECT_EQ(0B0000000000000000_u16, maybe_cast(0B0000000000000000U)); + EXPECT_EQ(0B0000000000000001_u16, maybe_cast(0B0000000000000001U)); + EXPECT_EQ(0B1111111111111110_u16, maybe_cast(0B1111111111111110U)); + EXPECT_EQ(0B1111111111111111_u16, maybe_cast(0B1111111111111111U)); + EXPECT_EQ(-0B1000000000000000_n16, maybe_cast(-0B1000000000000000)); + EXPECT_EQ(-0B0111111111111111_n16, maybe_cast(-0B0111111111111111)); + EXPECT_EQ(-0B0000000000000001_n16, maybe_cast(-0B0000000000000001)); + EXPECT_EQ(+0B0000000000000000_p16, maybe_cast(0B0000000000000000)); + EXPECT_EQ(+0B0000000000000001_p16, maybe_cast(0B0000000000000001)); + EXPECT_EQ(+0B0111111111111110_p16, maybe_cast(0B0111111111111110)); + EXPECT_EQ(+0B0111111111111111_p16, maybe_cast(0B0111111111111111)); + + EXPECT_EQ(0000000_u16, maybe_cast(0000000U)); + EXPECT_EQ(0000001_u16, maybe_cast(0000001U)); + EXPECT_EQ(0177776_u16, maybe_cast(0177776U)); + EXPECT_EQ(0177777_u16, maybe_cast(0177777U)); + EXPECT_EQ(-0100000_n16, maybe_cast(-0100000)); + EXPECT_EQ(-0077777_n16, maybe_cast(-0077777)); + EXPECT_EQ(-0000001_n16, maybe_cast(-0000001)); + EXPECT_EQ(+000000_p16, maybe_cast(000000)); + EXPECT_EQ(+000001_p16, maybe_cast(000001)); + EXPECT_EQ(+077776_p16, maybe_cast(077776)); + EXPECT_EQ(+077777_p16, maybe_cast(077777)); + + EXPECT_EQ(0_u16, maybe_cast(0U)); + EXPECT_EQ(1_u16, maybe_cast(1U)); + EXPECT_EQ(65534_u16, maybe_cast(65534U)); + EXPECT_EQ(65535_u16, maybe_cast(65535U)); + EXPECT_EQ(-32768_n16, maybe_cast(-32768)); + EXPECT_EQ(-32767_n16, maybe_cast(-32767)); + EXPECT_EQ(-1_n16, maybe_cast(-1)); + EXPECT_EQ(+0_p16, maybe_cast(0)); + EXPECT_EQ(+1_p16, maybe_cast(1)); + EXPECT_EQ(+32766_p16, maybe_cast(32766)); + EXPECT_EQ(+32767_p16, maybe_cast(32767)); + + EXPECT_EQ(0x0000_u16, maybe_cast(0x0000U)); + EXPECT_EQ(0x0001_u16, maybe_cast(0x0001U)); + EXPECT_EQ(0xfffe_u16, maybe_cast(0xfffeU)); + EXPECT_EQ(0xffff_u16, maybe_cast(0xffffU)); + EXPECT_EQ(-0x8000_n16, maybe_cast(-0x8000)); + EXPECT_EQ(-0x7fff_n16, maybe_cast(-0x7fff)); + EXPECT_EQ(-0x0001_n16, maybe_cast(-0x0001)); + EXPECT_EQ(+0x0000_p16, maybe_cast(0x0000)); + EXPECT_EQ(+0x0001_p16, maybe_cast(0x0001)); + EXPECT_EQ(+0x7ffe_p16, maybe_cast(0x7ffe)); + EXPECT_EQ(+0x7fff_p16, maybe_cast(0x7fff)); + + EXPECT_EQ(0X0000_u16, maybe_cast(0X0000U)); + EXPECT_EQ(0X0001_u16, maybe_cast(0X0001U)); + EXPECT_EQ(0XFFFE_u16, maybe_cast(0XFFFEU)); + EXPECT_EQ(0XFFFF_u16, maybe_cast(0XFFFFU)); + EXPECT_EQ(-0X8000_n16, maybe_cast(-0X8000)); + EXPECT_EQ(-0X7FFF_n16, maybe_cast(-0X7FFF)); + EXPECT_EQ(-0X0001_n16, maybe_cast(-0X0001)); + EXPECT_EQ(+0X0000_p16, maybe_cast(0X0000)); + EXPECT_EQ(+0X0001_p16, maybe_cast(0X0001)); + EXPECT_EQ(+0X7FFE_p16, maybe_cast(0X7FFE)); + EXPECT_EQ(+0X7FFF_p16, maybe_cast(0X7FFF)); +} + +TEST(ints, udl32) +{ + EXPECT_EQ(0b00000000000000000000000000000000_u32, maybe_cast(0b00000000000000000000000000000000U)); + EXPECT_EQ(0b00000000000000000000000000000001_u32, maybe_cast(0b00000000000000000000000000000001U)); + EXPECT_EQ(0b11111111111111111111111111111110_u32, maybe_cast(0b11111111111111111111111111111110U)); + EXPECT_EQ(0b11111111111111111111111111111111_u32, maybe_cast(0b11111111111111111111111111111111U)); + EXPECT_EQ(-0b10000000000000000000000000000000_n32, maybe_cast(-0b10000000000000000000000000000000)); + EXPECT_EQ(-0b01111111111111111111111111111111_n32, maybe_cast(-0b01111111111111111111111111111111)); + EXPECT_EQ(-0b00000000000000000000000000000001_n32, maybe_cast(-0b00000000000000000000000000000001)); + EXPECT_EQ(+0b00000000000000000000000000000000_p32, maybe_cast(0b00000000000000000000000000000000)); + EXPECT_EQ(+0b00000000000000000000000000000001_p32, maybe_cast(0b00000000000000000000000000000001)); + EXPECT_EQ(+0b01111111111111111111111111111110_p32, maybe_cast(0b01111111111111111111111111111110)); + EXPECT_EQ(+0b01111111111111111111111111111111_p32, maybe_cast(0b01111111111111111111111111111111)); + + EXPECT_EQ(0B00000000000000000000000000000000_u32, maybe_cast(0B00000000000000000000000000000000U)); + EXPECT_EQ(0B00000000000000000000000000000001_u32, maybe_cast(0B00000000000000000000000000000001U)); + EXPECT_EQ(0B11111111111111111111111111111110_u32, maybe_cast(0B11111111111111111111111111111110U)); + EXPECT_EQ(0B11111111111111111111111111111111_u32, maybe_cast(0B11111111111111111111111111111111U)); + EXPECT_EQ(-0B10000000000000000000000000000000_n32, maybe_cast(-0B10000000000000000000000000000000)); + EXPECT_EQ(-0B01111111111111111111111111111111_n32, maybe_cast(-0B01111111111111111111111111111111)); + EXPECT_EQ(-0B00000000000000000000000000000001_n32, maybe_cast(-0B00000000000000000000000000000001)); + EXPECT_EQ(+0B00000000000000000000000000000000_p32, maybe_cast(0B00000000000000000000000000000000)); + EXPECT_EQ(+0B00000000000000000000000000000001_p32, maybe_cast(0B00000000000000000000000000000001)); + EXPECT_EQ(+0B01111111111111111111111111111110_p32, maybe_cast(0B01111111111111111111111111111110)); + EXPECT_EQ(+0B01111111111111111111111111111111_p32, maybe_cast(0B01111111111111111111111111111111)); + + EXPECT_EQ(000000000000_u32, maybe_cast(000000000000U)); + EXPECT_EQ(000000000001_u32, maybe_cast(000000000001U)); + EXPECT_EQ(037777777776_u32, maybe_cast(037777777776U)); + EXPECT_EQ(037777777777_u32, maybe_cast(037777777777U)); + EXPECT_EQ(-020000000000_n32, maybe_cast(-020000000000)); + EXPECT_EQ(-017777777777_n32, maybe_cast(-017777777777)); + EXPECT_EQ(-000000000001_n32, maybe_cast(-000000000001)); + EXPECT_EQ(+000000000000_p32, maybe_cast(000000000000)); + EXPECT_EQ(+000000000001_p32, maybe_cast(000000000001)); + EXPECT_EQ(+017777777776_p32, maybe_cast(017777777776)); + EXPECT_EQ(+017777777777_p32, maybe_cast(017777777777)); + + EXPECT_EQ(0_u32, maybe_cast(0U)); + EXPECT_EQ(1_u32, maybe_cast(1U)); + EXPECT_EQ(4294967294_u32, maybe_cast(4294967294U)); + EXPECT_EQ(4294967295_u32, maybe_cast(4294967295U)); + EXPECT_EQ(-2147483648_n32, maybe_cast(-2147483648)); + EXPECT_EQ(-2147483647_n32, maybe_cast(-2147483647)); + EXPECT_EQ(-1_n32, maybe_cast(-1)); + EXPECT_EQ(+0_p32, maybe_cast(0)); + EXPECT_EQ(+1_p32, maybe_cast(1)); + EXPECT_EQ(+2147483646_p32, maybe_cast(2147483646)); + EXPECT_EQ(+2147483647_p32, maybe_cast(2147483647)); + + EXPECT_EQ(0x00000000_u32, maybe_cast(0x00000000U)); + EXPECT_EQ(0x00000001_u32, maybe_cast(0x00000001U)); + EXPECT_EQ(0xfffffffe_u32, maybe_cast(0xfffffffeU)); + EXPECT_EQ(0xffffffff_u32, maybe_cast(0xffffffffU)); + EXPECT_EQ(-0x80000000_n32, maybe_cast(-0x80000000)); + EXPECT_EQ(-0x7fffffff_n32, maybe_cast(-0x7fffffff)); + EXPECT_EQ(-0x00000001_n32, maybe_cast(-0x00000001)); + EXPECT_EQ(+0x00000000_p32, maybe_cast(0x00000000)); + EXPECT_EQ(+0x00000001_p32, maybe_cast(0x00000001)); + EXPECT_EQ(+0x7ffffffe_p32, maybe_cast(0x7ffffffe)); + EXPECT_EQ(+0x7fffffff_p32, maybe_cast(0x7fffffff)); + + EXPECT_EQ(0X00000000_u32, maybe_cast(0X00000000U)); + EXPECT_EQ(0X00000001_u32, maybe_cast(0X00000001U)); + EXPECT_EQ(0XFFFFFFFE_u32, maybe_cast(0XFFFFFFFEU)); + EXPECT_EQ(0XFFFFFFFF_u32, maybe_cast(0XFFFFFFFFU)); + EXPECT_EQ(-0X80000000_n32, maybe_cast(-0X80000000)); + EXPECT_EQ(-0X7FFFFFFF_n32, maybe_cast(-0X7FFFFFFF)); + EXPECT_EQ(-0X00000001_n32, maybe_cast(-0X00000001)); + EXPECT_EQ(+0X00000000_p32, maybe_cast(0X00000000)); + EXPECT_EQ(+0X00000001_p32, maybe_cast(0X00000001)); + EXPECT_EQ(+0X7FFFFFFE_p32, maybe_cast(0X7FFFFFFE)); + EXPECT_EQ(+0X7FFFFFFF_p32, maybe_cast(0X7FFFFFFF)); +} + +TEST(ints, udl64) +{ + EXPECT_EQ(0b0000000000000000000000000000000000000000000000000000000000000000_u64, maybe_cast(0b0000000000000000000000000000000000000000000000000000000000000000U)); + EXPECT_EQ(0b0000000000000000000000000000000000000000000000000000000000000001_u64, maybe_cast(0b0000000000000000000000000000000000000000000000000000000000000001U)); + EXPECT_EQ(0b1111111111111111111111111111111111111111111111111111111111111110_u64, maybe_cast(0b1111111111111111111111111111111111111111111111111111111111111110U)); + EXPECT_EQ(0b1111111111111111111111111111111111111111111111111111111111111111_u64, maybe_cast(0b1111111111111111111111111111111111111111111111111111111111111111U)); + EXPECT_EQ(-0b1000000000000000000000000000000000000000000000000000000000000000_n64, maybe_cast(-0b1000000000000000000000000000000000000000000000000000000000000000)); + EXPECT_EQ(-0b0111111111111111111111111111111111111111111111111111111111111111_n64, maybe_cast(-0b0111111111111111111111111111111111111111111111111111111111111111)); + EXPECT_EQ(-0b0000000000000000000000000000000000000000000000000000000000000001_n64, maybe_cast(-0b0000000000000000000000000000000000000000000000000000000000000001)); + EXPECT_EQ(+0b0000000000000000000000000000000000000000000000000000000000000000_p64, maybe_cast(0b0000000000000000000000000000000000000000000000000000000000000000)); + EXPECT_EQ(+0b0000000000000000000000000000000000000000000000000000000000000001_p64, maybe_cast(0b0000000000000000000000000000000000000000000000000000000000000001)); + EXPECT_EQ(+0b0111111111111111111111111111111111111111111111111111111111111110_p64, maybe_cast(0b0111111111111111111111111111111111111111111111111111111111111110)); + EXPECT_EQ(+0b0111111111111111111111111111111111111111111111111111111111111111_p64, maybe_cast(0b0111111111111111111111111111111111111111111111111111111111111111)); + + EXPECT_EQ(0B0000000000000000000000000000000000000000000000000000000000000000_u64, maybe_cast(0B0000000000000000000000000000000000000000000000000000000000000000U)); + EXPECT_EQ(0B0000000000000000000000000000000000000000000000000000000000000001_u64, maybe_cast(0B0000000000000000000000000000000000000000000000000000000000000001U)); + EXPECT_EQ(0B1111111111111111111111111111111111111111111111111111111111111110_u64, maybe_cast(0B1111111111111111111111111111111111111111111111111111111111111110U)); + EXPECT_EQ(0B1111111111111111111111111111111111111111111111111111111111111111_u64, maybe_cast(0B1111111111111111111111111111111111111111111111111111111111111111U)); + EXPECT_EQ(-0B1000000000000000000000000000000000000000000000000000000000000000_n64, maybe_cast(-0B1000000000000000000000000000000000000000000000000000000000000000)); + EXPECT_EQ(-0B0111111111111111111111111111111111111111111111111111111111111111_n64, maybe_cast(-0B0111111111111111111111111111111111111111111111111111111111111111)); + EXPECT_EQ(-0B0000000000000000000000000000000000000000000000000000000000000001_n64, maybe_cast(-0B0000000000000000000000000000000000000000000000000000000000000001)); + EXPECT_EQ(+0B0000000000000000000000000000000000000000000000000000000000000000_p64, maybe_cast(0B0000000000000000000000000000000000000000000000000000000000000000)); + EXPECT_EQ(+0B0000000000000000000000000000000000000000000000000000000000000001_p64, maybe_cast(0B0000000000000000000000000000000000000000000000000000000000000001)); + EXPECT_EQ(+0B0111111111111111111111111111111111111111111111111111111111111110_p64, maybe_cast(0B0111111111111111111111111111111111111111111111111111111111111110)); + EXPECT_EQ(+0B0111111111111111111111111111111111111111111111111111111111111111_p64, maybe_cast(0B0111111111111111111111111111111111111111111111111111111111111111)); + + EXPECT_EQ(00000000000000000000000_u64, maybe_cast(00000000000000000000000U)); + EXPECT_EQ(00000000000000000000001_u64, maybe_cast(00000000000000000000001U)); + EXPECT_EQ(01777777777777777777776_u64, maybe_cast(01777777777777777777776U)); + EXPECT_EQ(01777777777777777777777_u64, maybe_cast(01777777777777777777777U)); + EXPECT_EQ(-01000000000000000000000_n64, maybe_cast(-01000000000000000000000)); + EXPECT_EQ(-00777777777777777777777_n64, maybe_cast(-00777777777777777777777)); + EXPECT_EQ(-00000000000000000000001_n64, maybe_cast(-000000000000000000000001)); + EXPECT_EQ(+0000000000000000000000_p64, maybe_cast(0000000000000000000000)); + EXPECT_EQ(+0000000000000000000001_p64, maybe_cast(0000000000000000000001)); + EXPECT_EQ(+0777777777777777777776_p64, maybe_cast(0777777777777777777776)); + EXPECT_EQ(+0777777777777777777777_p64, maybe_cast(0777777777777777777777)); + + EXPECT_EQ(0_u64, maybe_cast(0U)); + EXPECT_EQ(1_u64, maybe_cast(1U)); + EXPECT_EQ(18446744073709551614_u64, maybe_cast(18446744073709551614U)); + EXPECT_EQ(18446744073709551615_u64, maybe_cast(18446744073709551615U)); + EXPECT_EQ(-9223372036854775808_n64, maybe_cast(-9223372036854775808U)); + EXPECT_EQ(-9223372036854775807_n64, maybe_cast(-9223372036854775807)); + EXPECT_EQ(-1_n64, maybe_cast(-1)); + EXPECT_EQ(+0_p64, maybe_cast(0)); + EXPECT_EQ(+1_p64, maybe_cast(1)); + EXPECT_EQ(+9223372036854775806_p64, maybe_cast(9223372036854775806)); + EXPECT_EQ(+9223372036854775807_p64, maybe_cast(9223372036854775807)); + + EXPECT_EQ(0x0000000000000000_u64, maybe_cast(0x0000000000000000U)); + EXPECT_EQ(0x0000000000000001_u64, maybe_cast(0x0000000000000001U)); + EXPECT_EQ(0xfffffffffffffffe_u64, maybe_cast(0xfffffffffffffffeU)); + EXPECT_EQ(0xffffffffffffffff_u64, maybe_cast(0xffffffffffffffffU)); + EXPECT_EQ(-0x8000000000000000_n64, maybe_cast(-0x8000000000000000)); + EXPECT_EQ(-0x7fffffffffffffff_n64, maybe_cast(-0x7fffffffffffffff)); + EXPECT_EQ(-0x0000000000000001_n64, maybe_cast(-0x0000000000000001)); + EXPECT_EQ(+0x0000000000000000_p64, maybe_cast(0x0000000000000000)); + EXPECT_EQ(+0x0000000000000001_p64, maybe_cast(0x0000000000000001)); + EXPECT_EQ(+0x7ffffffffffffffe_p64, maybe_cast(0x7ffffffffffffffe)); + EXPECT_EQ(+0x7fffffffffffffff_p64, maybe_cast(0x7fffffffffffffff)); + + EXPECT_EQ(0X0000000000000000_u64, maybe_cast(0X0000000000000000U)); + EXPECT_EQ(0X0000000000000001_u64, maybe_cast(0X0000000000000001U)); + EXPECT_EQ(0XFFFFFFFFFFFFFFFE_u64, maybe_cast(0XFFFFFFFFFFFFFFFEU)); + EXPECT_EQ(0XFFFFFFFFFFFFFFFF_u64, maybe_cast(0XFFFFFFFFFFFFFFFFU)); + EXPECT_EQ(-0X8000000000000000_n64, maybe_cast(-0X8000000000000000)); + EXPECT_EQ(-0X7FFFFFFFFFFFFFFF_n64, maybe_cast(-0X7FFFFFFFFFFFFFFF)); + EXPECT_EQ(-0X0000000000000001_n64, maybe_cast(-0X0000000000000001)); + EXPECT_EQ(+0X0000000000000000_p64, maybe_cast(0X0000000000000000)); + EXPECT_EQ(+0X0000000000000001_p64, maybe_cast(0X0000000000000001)); + EXPECT_EQ(+0X7FFFFFFFFFFFFFFE_p64, maybe_cast(0X7FFFFFFFFFFFFFFE)); + EXPECT_EQ(+0X7FFFFFFFFFFFFFFF_p64, maybe_cast(0X7FFFFFFFFFFFFFFF)); +} diff --git a/src/io/cxxstdio.hpp b/src/io/cxxstdio.hpp index a2faa18..8061d15 100644 --- a/src/io/cxxstdio.hpp +++ b/src/io/cxxstdio.hpp @@ -101,6 +101,9 @@ namespace cxxstdio return v; } + const char *convert_for_printf(const char *) = delete; + char *convert_for_scanf(char *) = delete; + # if 0 template constexpr diff --git a/src/login/login.cpp b/src/login/login.cpp index f8be4ce..6f3122e 100644 --- a/src/login/login.cpp +++ b/src/login/login.cpp @@ -631,7 +631,7 @@ int mmo_auth_init(void) AString str = STRPRINTF("%s has %zu accounts (%d GMs)\n"_fmt, account_filename, auth_data.size(), gm_count); - PRINTF("%s: %s\n"_fmt, __PRETTY_FUNCTION__, str); + PRINTF("mmo_auth_init: %s\n"_fmt, str); LOGIN_LOG("%s\n"_fmt, line); return 0; @@ -2731,7 +2731,7 @@ bool lan_ip_check(IP4Address p) bool lancheck = lan_subnet.covers(p); PRINTF("LAN test (result): %s.\n"_fmt, - (lancheck) ? SGR_BOLD SGR_CYAN "LAN source" SGR_RESET : SGR_BOLD SGR_GREEN "WAN source" SGR_RESET); + (lancheck) ? SGR_BOLD SGR_CYAN "LAN source" SGR_RESET ""_s : SGR_BOLD SGR_GREEN "WAN source" SGR_RESET ""_s); return lancheck; } diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index f721aaa..c76c34c 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -130,7 +130,7 @@ void atcommand_config_write(ZString cfgName) { // This XString is really a ZString, but not declared as one // in order to allow non-heterogenous lookup by XString. - const char *cmd = &*pair.first.begin(); + auto cmd = ZString(strings::really_construct_from_a_pointer, &*pair.first.begin(), nullptr); const AtCommandInfo& info = pair.second; FPRINTF(out, @@ -389,7 +389,7 @@ bool atcommand_config_read(ZString cfgName) /// @ command processing functions static -void atc_do_help(Session *s, const char *cmd, const AtCommandInfo& info) +void atc_do_help(Session *s, ZString cmd, const AtCommandInfo& info) { auto msg = STRPRINTF("\u2007\u2007%d: @%s %s"_fmt, info.level, cmd, info.args); // manually padding because *space* @@ -429,7 +429,7 @@ ATCE atcommand_help(Session *s, dumb_ptr, clif_displaymessage(s, "Synopses of GM commands in category 'all':"_s); for (const auto& pair : atcommand_info) { - const char *cmd = &*pair.first.begin(); + auto cmd = ZString(strings::really_construct_from_a_pointer, &*pair.first.begin(), nullptr); const AtCommandInfo& info = pair.second; atc_do_help(s, cmd, info); } @@ -447,7 +447,7 @@ ATCE atcommand_help(Session *s, dumb_ptr, clif_displaymessage(s, STRPRINTF("Synopses of GM commands in level [%d, %d):"_fmt, low, high)); for (const auto& pair : atcommand_info) { - const char *cmd = &*pair.first.begin(); + auto cmd = ZString(strings::really_construct_from_a_pointer, &*pair.first.begin(), nullptr); const AtCommandInfo& info = pair.second; if (low <= info.level && info.level < high) atc_do_help(s, cmd, info); diff --git a/src/map/battle.cpp b/src/map/battle.cpp index f67414f..c19d310 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1417,9 +1417,9 @@ struct Damage battle_calc_pc_weapon_attack(dumb_ptr src, int dy = abs(src->bl_y - target->bl_y); int malus_dist; - target_distance = max(dx, dy); + target_distance = std::max(dx, dy); malus_dist = - max(0, target_distance - (skill_power(sd, SkillID::AC_OWL) / 75)); + std::max(0, target_distance - (skill_power(sd, SkillID::AC_OWL) / 75)); hitrate -= (malus_dist * (malus_dist + 1)); } diff --git a/src/map/battle.t.hpp b/src/map/battle.t.hpp index 9685ae7..d3a7a9c 100644 --- a/src/map/battle.t.hpp +++ b/src/map/battle.t.hpp @@ -65,11 +65,11 @@ struct BCT }; constexpr -BCT operator & (BCT l, BCT r) { return {uint8_t(l.lo & r.lo), uint8_t(l.mid & r.mid), uint8_t(l.classic & r.classic), uint8_t(l.level & r.level), uint8_t(l.unused & r.unused) }; } +BCT operator & (BCT l, BCT r) { return {static_cast(l.lo & r.lo), static_cast(l.mid & r.mid), static_cast(l.classic & r.classic), static_cast(l.level & r.level), static_cast(l.unused & r.unused) }; } constexpr -BCT operator | (BCT l, BCT r) { return {uint8_t(l.lo | r.lo), uint8_t(l.mid | r.mid), uint8_t(l.classic | r.classic), uint8_t(l.level | r.level), uint8_t(l.unused | r.unused) }; } +BCT operator | (BCT l, BCT r) { return {static_cast(l.lo | r.lo), static_cast(l.mid | r.mid), static_cast(l.classic | r.classic), static_cast(l.level | r.level), static_cast(l.unused | r.unused) }; } constexpr -BCT operator ^ (BCT l, BCT r) { return {uint8_t(l.lo ^ r.lo), uint8_t(l.mid ^ r.mid), uint8_t(l.classic ^ r.classic), uint8_t(l.level ^ r.level), uint8_t(l.unused ^ r.unused) }; } +BCT operator ^ (BCT l, BCT r) { return {static_cast(l.lo ^ r.lo), static_cast(l.mid ^ r.mid), static_cast(l.classic ^ r.classic), static_cast(l.level ^ r.level), static_cast(l.unused ^ r.unused) }; } inline BCT& operator &= (BCT& l, BCT r) { return l = l & r; } inline diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 3e57a6f..6c4d821 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -31,6 +31,8 @@ #include "../compat/fun.hpp" #include "../compat/nullpo.hpp" +#include "../ints/cmp.hpp" + #include "../strings/astring.hpp" #include "../strings/zstring.hpp" #include "../strings/xstring.hpp" @@ -1033,9 +1035,9 @@ int clif_spawnmob(dumb_ptr md) WBUFW(buf, 0) = 0x7c; WBUFL(buf, 2) = md->bl_id; WBUFW(buf, 6) = md->stats[mob_stat::SPEED]; - WBUFW(buf, 8) = uint16_t(md->opt1); - WBUFW(buf, 10) = uint16_t(md->opt2); - WBUFW(buf, 12) = uint16_t(md->option); + WBUFW(buf, 8) = static_cast(md->opt1); + WBUFW(buf, 10) = static_cast(md->opt2); + WBUFW(buf, 12) = static_cast(md->option); WBUFW(buf, 20) = md->mob_class; WBUFPOS(buf, 36, md->bl_x, md->bl_y); clif_send(buf, clif_parse_func_table[0x7c].len, md, SendWho::AREA); @@ -1227,7 +1229,7 @@ int clif_buylist(dumb_ptr sd, dumb_ptr nd) val = nd->shop_items[i].value; WFIFOL(s, 4 + i * 11) = val; // base price WFIFOL(s, 8 + i * 11) = val; // actual price - WFIFOB(s, 12 + i * 11) = uint8_t(id->type); + WFIFOB(s, 12 + i * 11) = static_cast(id->type); WFIFOW(s, 13 + i * 11) = nd->shop_items[i].nameid; } WFIFOW(s, 2) = i * 11 + 4; @@ -1402,7 +1404,7 @@ int clif_additem(dumb_ptr sd, int n, int amount, PickupFail fa WFIFOW(s, 17) = 0; WFIFOW(s, 19) = 0; WFIFOB(s, 21) = 0; - WFIFOB(s, 22) = uint8_t(fail); + WFIFOB(s, 22) = static_cast(fail); } else { @@ -1423,11 +1425,11 @@ int clif_additem(dumb_ptr sd, int n, int amount, PickupFail fa WFIFOW(s, 15) = 0; //card[2]; WFIFOW(s, 17) = 0; //card[3]; } - WFIFOW(s, 19) = uint16_t(pc_equippoint(sd, n)); - WFIFOB(s, 21) = uint8_t(sd->inventory_data[n]->type == ItemType::_7 + WFIFOW(s, 19) = static_cast(pc_equippoint(sd, n)); + WFIFOB(s, 21) = static_cast(sd->inventory_data[n]->type == ItemType::_7 ? ItemType::WEAPON : sd->inventory_data[n]->type); - WFIFOB(s, 22) = uint8_t(fail); + WFIFOB(s, 22) = static_cast(fail); } WFIFOSET(s, clif_parse_func_table[0xa0].len); @@ -1470,17 +1472,17 @@ void clif_itemlist(dumb_ptr sd) continue; WFIFOW(s, n * 18 + 4) = i + 2; WFIFOW(s, n * 18 + 6) = sd->status.inventory[i].nameid; - WFIFOB(s, n * 18 + 8) = uint8_t(sd->inventory_data[i]->type); + WFIFOB(s, n * 18 + 8) = static_cast(sd->inventory_data[i]->type); WFIFOB(s, n * 18 + 9) = 1; //identify; WFIFOW(s, n * 18 + 10) = sd->status.inventory[i].amount; if (sd->inventory_data[i]->equip == EPOS::ARROW) { - WFIFOW(s, n * 18 + 12) = uint16_t(EPOS::ARROW); + WFIFOW(s, n * 18 + 12) = static_cast(EPOS::ARROW); if (bool(sd->status.inventory[i].equip)) arrow = i; // ついでに矢装備チェック } else - WFIFOW(s, n * 18 + 12) = uint16_t(EPOS::ZERO); + WFIFOW(s, n * 18 + 12) = static_cast(EPOS::ZERO); WFIFOW(s, n * 18 + 14) = 0; //card[0]; WFIFOW(s, n * 18 + 16) = 0; //card[1]; WFIFOW(s, n * 18 + 18) = 0; //card[2]; @@ -1515,13 +1517,13 @@ void clif_equiplist(dumb_ptr sd) continue; WFIFOW(s, n * 20 + 4) = i + 2; WFIFOW(s, n * 20 + 6) = sd->status.inventory[i].nameid; - WFIFOB(s, n * 20 + 8) = uint8_t( + WFIFOB(s, n * 20 + 8) = static_cast( sd->inventory_data[i]->type == ItemType::_7 ? ItemType::WEAPON : sd->inventory_data[i]->type); WFIFOB(s, n * 20 + 9) = 0; //identify; - WFIFOW(s, n * 20 + 10) = uint16_t(pc_equippoint(sd, i)); - WFIFOW(s, n * 20 + 12) = uint16_t(sd->status.inventory[i].equip); + WFIFOW(s, n * 20 + 10) = static_cast(pc_equippoint(sd, i)); + WFIFOW(s, n * 20 + 12) = static_cast(sd->status.inventory[i].equip); WFIFOB(s, n * 20 + 14) = 0; //broken or attribute; WFIFOB(s, n * 20 + 15) = 0; //refine; { @@ -1564,7 +1566,7 @@ int clif_storageitemlist(dumb_ptr sd, struct storage *stor) WFIFOW(s, n * 18 + 4) = i + 1; WFIFOW(s, n * 18 + 6) = stor->storage_[i].nameid; - WFIFOB(s, n * 18 + 8) = uint8_t(id->type); + WFIFOB(s, n * 18 + 8) = static_cast(id->type); WFIFOB(s, n * 18 + 9) = 0; //identify; WFIFOW(s, n * 18 + 10) = stor->storage_[i].amount; WFIFOW(s, n * 18 + 12) = 0; @@ -1606,10 +1608,10 @@ int clif_storageequiplist(dumb_ptr sd, struct storage *stor) continue; WFIFOW(s, n * 20 + 4) = i + 1; WFIFOW(s, n * 20 + 6) = stor->storage_[i].nameid; - WFIFOB(s, n * 20 + 8) = uint8_t(id->type); + WFIFOB(s, n * 20 + 8) = static_cast(id->type); WFIFOB(s, n * 20 + 9) = 0; //identify; - WFIFOW(s, n * 20 + 10) = uint16_t(id->equip); - WFIFOW(s, n * 20 + 12) = uint16_t(stor->storage_[i].equip); + WFIFOW(s, n * 20 + 10) = static_cast(id->equip); + WFIFOW(s, n * 20 + 12) = static_cast(stor->storage_[i].equip); WFIFOB(s, n * 20 + 14) = 0; //broken or attribute WFIFOB(s, n * 20 + 15) = 0; //refine; { @@ -1778,7 +1780,7 @@ int clif_updatestatus(dumb_ptr sd, SP type) { ATTR attr = sp_to_attr(type); WFIFOW(s, 0) = 0x141; - WFIFOL(s, 2) = uint16_t(type); + WFIFOL(s, 2) = static_cast(type); WFIFOL(s, 6) = sd->status.attrs[attr]; WFIFOL(s, 10) = sd->paramb[attr] + sd->parame[attr]; len = 14; @@ -1832,7 +1834,7 @@ int clif_changelook_towards(dumb_ptr bl, LOOK type, int val, { EQUIP equip_point = equip_points[type]; - WBUFB(buf, 6) = uint16_t(type); + WBUFB(buf, 6) = static_cast(type); int idx = sd->equip_index_maybe[equip_point]; if (idx >= 0 && sd->inventory_data[idx]) { @@ -1874,7 +1876,7 @@ int clif_changelook_towards(dumb_ptr bl, LOOK type, int val, { WBUFW(buf, 0) = 0x1d7; WBUFL(buf, 2) = bl->bl_id; - WBUFB(buf, 6) = uint8_t(type); + WBUFB(buf, 6) = static_cast(type); WBUFW(buf, 7) = val; WBUFW(buf, 9) = 0; if (dstsd) @@ -1899,17 +1901,17 @@ int clif_initialstatus(dumb_ptr sd) WFIFOW(s, 0) = 0xbd; WFIFOW(s, 2) = sd->status.status_point; - WFIFOB(s, 4) = min(sd->status.attrs[ATTR::STR], 255); + WFIFOB(s, 4) = saturate(sd->status.attrs[ATTR::STR]); WFIFOB(s, 5) = pc_need_status_point(sd, SP::STR); - WFIFOB(s, 6) = min(sd->status.attrs[ATTR::AGI], 255); + WFIFOB(s, 6) = saturate(sd->status.attrs[ATTR::AGI]); WFIFOB(s, 7) = pc_need_status_point(sd, SP::AGI); - WFIFOB(s, 8) = min(sd->status.attrs[ATTR::VIT], 255); + WFIFOB(s, 8) = saturate(sd->status.attrs[ATTR::VIT]); WFIFOB(s, 9) = pc_need_status_point(sd, SP::VIT); - WFIFOB(s, 10) = min(sd->status.attrs[ATTR::INT], 255); + WFIFOB(s, 10) = saturate(sd->status.attrs[ATTR::INT]); WFIFOB(s, 11) = pc_need_status_point(sd, SP::INT); - WFIFOB(s, 12) = min(sd->status.attrs[ATTR::DEX], 255); + WFIFOB(s, 12) = saturate(sd->status.attrs[ATTR::DEX]); WFIFOB(s, 13) = pc_need_status_point(sd, SP::DEX); - WFIFOB(s, 14) = min(sd->status.attrs[ATTR::LUK], 255); + WFIFOB(s, 14) = saturate(sd->status.attrs[ATTR::LUK]); WFIFOB(s, 15) = pc_need_status_point(sd, SP::LUK); WFIFOW(s, 16) = sd->base_atk + sd->watk; @@ -1990,7 +1992,7 @@ int clif_statusupack(dumb_ptr sd, SP type, int ok, int val) Session *s = sd->sess; WFIFOW(s, 0) = 0xbc; - WFIFOW(s, 2) = uint16_t(type); + WFIFOW(s, 2) = static_cast(type); WFIFOB(s, 4) = ok; WFIFOB(s, 5) = val; WFIFOSET(s, clif_parse_func_table[0xbc].len); @@ -2009,7 +2011,7 @@ int clif_equipitemack(dumb_ptr sd, int n, EPOS pos, int ok) Session *s = sd->sess; WFIFOW(s, 0) = 0xaa; WFIFOW(s, 2) = n + 2; - WFIFOW(s, 4) = uint16_t(pos); + WFIFOW(s, 4) = static_cast(pos); WFIFOB(s, 6) = ok; WFIFOSET(s, clif_parse_func_table[0xaa].len); @@ -2027,7 +2029,7 @@ int clif_unequipitemack(dumb_ptr sd, int n, EPOS pos, int ok) Session *s = sd->sess; WFIFOW(s, 0) = 0xac; WFIFOW(s, 2) = n + 2; - WFIFOW(s, 4) = uint16_t(pos); + WFIFOW(s, 4) = static_cast(pos); WFIFOB(s, 6) = ok; WFIFOSET(s, clif_parse_func_table[0xac].len); @@ -2069,9 +2071,9 @@ int clif_changeoption(dumb_ptr bl) WBUFW(buf, 0) = 0x119; WBUFL(buf, 2) = bl->bl_id; - WBUFW(buf, 6) = uint16_t(*battle_get_opt1(bl)); - WBUFW(buf, 8) = uint16_t(*battle_get_opt2(bl)); - WBUFW(buf, 10) = uint16_t(option); + WBUFW(buf, 6) = static_cast(*battle_get_opt1(bl)); + WBUFW(buf, 8) = static_cast(*battle_get_opt2(bl)); + WBUFW(buf, 10) = static_cast(option); WBUFB(buf, 12) = 0; // ?? clif_send(buf, clif_parse_func_table[0x119].len, bl, SendWho::AREA); @@ -2335,7 +2337,7 @@ int clif_storageclose(dumb_ptr sd) void clif_changelook_accessories(dumb_ptr bl, dumb_ptr dest) { - for (LOOK i = LOOK::SHOES; i < LOOK::COUNT; i = LOOK(uint8_t(i) + 1)) + for (LOOK i = LOOK::SHOES; i < LOOK::COUNT; i = LOOK(static_cast(i) + 1)) clif_changelook_towards(bl, i, 0, dest); } @@ -2773,7 +2775,7 @@ int clif_skillup(dumb_ptr sd, SkillID skill_num) Session *s = sd->sess; WFIFOW(s, 0) = 0x10e; - WFIFOW(s, 2) = uint16_t(skill_num); + WFIFOW(s, 2) = static_cast(skill_num); WFIFOW(s, 4) = sd->status.skill[skill_num].lv; WFIFOW(s, 6) = skill_get_sp(skill_num, sd->status.skill[skill_num].lv); range = skill_get_range(skill_num, sd->status.skill[skill_num].lv); @@ -2820,7 +2822,7 @@ int clif_skill_fail(dumb_ptr sd, SkillID skill_id, int type, } WFIFOW(s, 0) = 0x110; - WFIFOW(s, 2) = uint16_t(skill_id); + WFIFOW(s, 2) = static_cast(skill_id); WFIFOW(s, 4) = btype; WFIFOW(s, 6) = 0; WFIFOB(s, 8) = 0; @@ -2847,7 +2849,7 @@ int clif_skill_damage(dumb_ptr src, dumb_ptr dst, sc_data = battle_get_sc_data(dst); WBUFW(buf, 0) = 0x1de; - WBUFW(buf, 2) = uint16_t(skill_id); + WBUFW(buf, 2) = static_cast(skill_id); WBUFL(buf, 4) = src->bl_id; WBUFL(buf, 8) = dst->bl_id; WBUFL(buf, 12) = static_cast(tick.time_since_epoch().count()); @@ -2873,7 +2875,7 @@ int clif_status_change(dumb_ptr bl, StatusChange type, int flag) nullpo_ret(bl); WBUFW(buf, 0) = 0x0196; - WBUFW(buf, 2) = uint16_t(type); + WBUFW(buf, 2) = static_cast(type); WBUFL(buf, 4) = bl->bl_id; WBUFB(buf, 8) = flag; clif_send(buf, clif_parse_func_table[0x196].len, bl, SendWho::AREA); @@ -4343,7 +4345,7 @@ void clif_parse_StopAttack(Session *, dumb_ptr sd) static void clif_parse_StatusUp(Session *s, dumb_ptr sd) { - pc_statusup(sd, SP(RFIFOW(s, 2))); + pc_statusup(sd, static_cast(RFIFOW(s, 2))); } /*========================================== diff --git a/src/map/magic-expr.cpp b/src/map/magic-expr.cpp index 786f870..b6f3208 100644 --- a/src/map/magic-expr.cpp +++ b/src/map/magic-expr.cpp @@ -504,14 +504,14 @@ int fun_bitshr(dumb_ptr, val_t *result, Slice args) static int fun_max(dumb_ptr, val_t *result, Slice args) { - RESULTINT = max(ARGINT(0), ARGINT(1)); + RESULTINT = std::max(ARGINT(0), ARGINT(1)); return 0; } static int fun_min(dumb_ptr, val_t *result, Slice args) { - RESULTINT = min(ARGINT(0), ARGINT(1)); + RESULTINT = std::min(ARGINT(0), ARGINT(1)); return 0; } @@ -639,7 +639,7 @@ int fun_skill(dumb_ptr, val_t *result, Slice args) if (ENTITY_TYPE(0) != BL::PC // don't convert to enum until after the range check || ARGINT(1) < 0 - || ARGINT(1) >= uint16_t(MAX_SKILL)) + || ARGINT(1) >= static_cast(MAX_SKILL)) { RESULTINT = 0; } @@ -944,7 +944,7 @@ int fun_distance(dumb_ptr, val_t *result, Slice args) if (ARGLOCATION(0).m != ARGLOCATION(1).m) RESULTINT = 0x7fffffff; else - RESULTINT = max(abs(ARGLOCATION(0).x - ARGLOCATION(1).x), + RESULTINT = std::max(abs(ARGLOCATION(0).x - ARGLOCATION(1).x), abs(ARGLOCATION(0).y - ARGLOCATION(1).y)); return 0; } diff --git a/src/map/magic-stmt.cpp b/src/map/magic-stmt.cpp index ddadf03..5d1fd97 100644 --- a/src/map/magic-stmt.cpp +++ b/src/map/magic-stmt.cpp @@ -1222,7 +1222,7 @@ dumb_ptr run_foreach(dumb_ptr invocation, magic_clear_var(&area); FPRINTF(stderr, "[magic] Error in spell `%s': FOREACH loop over non-area\n"_fmt, - invocation->spell->name.c_str()); + invocation->spell->name); return return_location; } else diff --git a/src/map/map.cpp b/src/map/map.cpp index 7c14e9e..5c77e7b 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -34,6 +34,8 @@ #include "../compat/nullpo.hpp" #include "../compat/fun.hpp" +#include "../ints/udl.hpp" + #include "../strings/astring.hpp" #include "../strings/zstring.hpp" #include "../strings/xstring.hpp" @@ -678,7 +680,7 @@ std::pair map_randfreecell(map_local *m, if (!bool(read_gatp(m, x + dx, y + dy) & MapCell::UNWALKABLE)) return {static_cast(x + dx), static_cast(y + dy)}; } - return {static_cast(0), static_cast(0)}; + return {0_u16, 0_u16}; } /// Return a randomly selected passable cell within a given range. diff --git a/src/map/map.t.hpp b/src/map/map.t.hpp index 59b6ff4..b6b14bb 100644 --- a/src/map/map.t.hpp +++ b/src/map/map.t.hpp @@ -414,25 +414,25 @@ enum class SP : uint16_t constexpr SP attr_to_sp(ATTR attr) { - return SP(uint16_t(attr) + uint16_t(SP::STR)); + return static_cast(static_cast(attr) + static_cast(SP::STR)); } constexpr ATTR sp_to_attr(SP sp) { - return ATTR(uint16_t(sp) - uint16_t(SP::STR)); + return static_cast(static_cast(sp) - static_cast(SP::STR)); } constexpr SP attr_to_usp(ATTR attr) { - return SP(uint16_t(attr) + uint16_t(SP::USTR)); + return static_cast(static_cast(attr) + static_cast(SP::USTR)); } constexpr ATTR usp_to_attr(SP sp) { - return ATTR(uint16_t(sp) - uint16_t(SP::USTR)); + return static_cast(static_cast(sp) - static_cast(SP::USTR)); } constexpr diff --git a/src/map/pc.cpp b/src/map/pc.cpp index eecaece..a58c9ab 100644 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -1060,7 +1060,7 @@ int pc_calcstatus(dumb_ptr sd, int first) if (sd->spellpower_bonus_target < 0) sd->spellpower_bonus_target = (sd->spellpower_bonus_target * 256) / - (min(128 + skill_power(sd, SkillID::TMW_ASTRAL_SOUL), 256)); + (std::min(128 + skill_power(sd, SkillID::TMW_ASTRAL_SOUL), 256)); #endif if (sd->spellpower_bonus_target < sd->spellpower_bonus_current) @@ -1189,7 +1189,7 @@ int pc_calcstatus(dumb_ptr sd, int first) sd->aspd_rate = 20; for (ATTR attr : ATTRs) - sd->paramc[attr] = max(0, sd->status.attrs[attr] + sd->paramb[attr] + sd->parame[attr]); + sd->paramc[attr] = std::max(0, sd->status.attrs[attr] + sd->paramb[attr] + sd->parame[attr]); if (sd->status.weapon == ItemLook::BOW || sd->status.weapon == ItemLook::_13 @@ -1303,7 +1303,7 @@ int pc_calcstatus(dumb_ptr sd, int first) if (sd->attackrange > 2) { // [fate] ranged weapon? - sd->attackrange += min(skill_power(sd, SkillID::AC_OWL) / 60, 3); + sd->attackrange += std::min(skill_power(sd, SkillID::AC_OWL) / 60, 3); sd->hit += skill_power(sd, SkillID::AC_OWL) / 10; // 20 for 200 } @@ -2936,8 +2936,7 @@ int pc_skillpt_potential(dumb_ptr sd) { int potential = 0; - for (SkillID skill_id = SkillID(); skill_id < MAX_SKILL; - skill_id = SkillID(uint16_t(skill_id) + 1)) + for (SkillID skill_id : erange(SkillID(), MAX_SKILL)) if (sd->status.skill[skill_id].lv && sd->status.skill[skill_id].lv < skill_db[skill_id].max_raise) potential += RAISE_COST(skill_db[skill_id].max_raise) @@ -3843,9 +3842,9 @@ void pc_heal_quick_accumulate(int new_amount, int average_speed = ((new_speed * new_amount) + (current_speed * current_amount)) / (current_amount + new_amount); // new_amount > 0, current_amount >= 0 quick_regen->speed = average_speed; - quick_regen->amount = min(current_amount + new_amount, max); + quick_regen->amount = std::min(current_amount + new_amount, max); - quick_regen->tickdelay = min(quick_regen->speed, quick_regen->tickdelay); + quick_regen->tickdelay = std::min(quick_regen->speed, quick_regen->tickdelay); } int pc_itemheal(dumb_ptr sd, int hp, int sp) @@ -5031,7 +5030,7 @@ int pc_quickregenerate_effect(struct quick_regeneration *quick_regen, if (!(quick_regen->tickdelay--)) { int bonus = - min(heal_speed * battle_config.itemheal_regeneration_factor, + std::min(heal_speed * battle_config.itemheal_regeneration_factor, quick_regen->amount); quick_regen->amount -= bonus; diff --git a/src/map/script.cpp b/src/map/script.cpp index 0cb702b..bcc8a99 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -2448,7 +2448,7 @@ void builtin_getopt2(ScriptState *st) sd = script_rid2sd(st); - push_int(st->stack, ByteCode::INT, uint16_t(sd->opt2)); + push_int(st->stack, ByteCode::INT, static_cast(sd->opt2)); } diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 5b8f2a3..1506c6c 100644 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -594,7 +594,7 @@ interval_t skill_castfix(dumb_ptr bl, interval_t interval) sc_data = battle_get_sc_data(bl); dex = battle_get_dex(bl); - if (skill > SkillID::MAX_SKILL_DB /*|| skill < SkillID()*/) + if (skill >= SkillID::MAX_SKILL_DB /*|| skill < SkillID()*/) return interval_t::zero(); castnodex = skill_get_castnodex(skill, lv); @@ -1245,7 +1245,7 @@ bool skill_readdb(ZString filename) rv = false; continue; } - if (/*i < SkillID() ||*/ i > SkillID::MAX_SKILL_DB) + if (/*i < SkillID() ||*/ i >= SkillID::MAX_SKILL_DB) { rv = false; continue; diff --git a/src/mmo/version.cpp b/src/mmo/version.cpp index 54b1709..1fab68d 100644 --- a/src/mmo/version.cpp +++ b/src/mmo/version.cpp @@ -61,7 +61,7 @@ Version CURRENT_MAP_SERVER_VERSION = VENDOR_POINT, }; -const char CURRENT_VERSION_STRING[] = VERSION_STRING; +LString CURRENT_VERSION_STRING = VERSION_STRING; bool extract(XString str, Version *vers) { diff --git a/src/mmo/version.hpp b/src/mmo/version.hpp index 11bab39..1cec0ba 100644 --- a/src/mmo/version.hpp +++ b/src/mmo/version.hpp @@ -55,7 +55,7 @@ extern Version CURRENT_LOGIN_SERVER_VERSION; extern Version CURRENT_CHAR_SERVER_VERSION; extern Version CURRENT_MAP_SERVER_VERSION; -extern const char CURRENT_VERSION_STRING[]; +extern LString CURRENT_VERSION_STRING; bool extract(XString str, Version *vers); -- cgit v1.2.3-60-g2f50