#pragma once // cast.hpp - Change the type of a variable. // // Copyright © 2011-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 namespace tmwa { template const T& const_(T& t) { return t; } template T no_cast(U&& u) { typedef typename std::remove_reference::type Ti; typedef typename std::remove_reference::type Ui; typedef typename std::remove_cv::type Tb; typedef typename std::remove_cv::type Ub; static_assert(std::is_same::value, "not no cast"); return std::forward(u); } template T base_cast(U&& u) { static_assert(std::is_reference::value, "must base cast with references"); typedef typename std::remove_reference::type Ti; typedef typename std::remove_reference::type Ui; typedef typename std::remove_cv::type Tb; typedef typename std::remove_cv::type Ub; static_assert(std::is_base_of::value, "not base cast"); return std::forward(u); } // use this when e.g. U is an int of unknown size template T maybe_cast(U u) { return u; } template typename std::remove_pointer::type *sign_cast(U *u) { typedef typename std::remove_pointer::type T_; static_assert(sizeof(T_) == sizeof(U), "sign cast must be same size"); return reinterpret_cast(u); } } // namespace tmwa