#pragma once // 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 "fwd.hpp" #include #include "../diagnostics.hpp" namespace tmwa { namespace ints { DIAG_PUSH(); DIAG_I(type_limits); 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; } } DIAG_POP(); } // namespace ints using ints::saturate; } // namespace tmwa