diff --git a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp index 5a434f3298..8ce76f4200 100644 --- a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp +++ b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp @@ -15,6 +15,8 @@ #include "sqvm.h" #include "sqtable.h" +#include "../../../core/bit_cast.hpp" + #include "../../../string_func.h" #include "../../../safeguards.h" diff --git a/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp b/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp index 412f848f96..24b6397da3 100644 --- a/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqfuncstate.cpp @@ -12,6 +12,8 @@ #include "sqopcodes.h" #include "sqfuncstate.h" +#include "../../../core/bit_cast.hpp" + #include "../../../safeguards.h" #ifdef _DEBUG_DUMP diff --git a/src/3rdparty/squirrel/squirrel/sqvm.cpp b/src/3rdparty/squirrel/squirrel/sqvm.cpp index 3e0019f406..fdd6ecde7c 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.cpp +++ b/src/3rdparty/squirrel/squirrel/sqvm.cpp @@ -17,6 +17,8 @@ #include "sqarray.h" #include "sqclass.h" +#include "../../../core/bit_cast.hpp" + #include "../../../string_func.h" #include "../../../safeguards.h" diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 767759da64..f63358ca2f 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -3,6 +3,7 @@ add_files( alloc_func.hpp alloc_type.hpp backup_type.hpp + bit_cast.hpp bitmath_func.hpp checksum_func.hpp container_func.hpp diff --git a/src/core/bit_cast.hpp b/src/core/bit_cast.hpp new file mode 100644 index 0000000000..866cb397ff --- /dev/null +++ b/src/core/bit_cast.hpp @@ -0,0 +1,35 @@ +/* + * This file is part of OpenTTD. + * OpenTTD 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, version 2. + * OpenTTD 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 OpenTTD. If not, see . + */ + +/** @file bit_cast.hpp std::bit_cast fallback */ + +#ifndef BIT_CAST_HPP +#define BIT_CAST_HPP + +#ifdef __cpp_lib_bit_cast + +#include + +#else + +#include + +namespace std { +template +constexpr To bit_cast(const From& from) noexcept +{ + static_assert(std::is_trivially_constructible_v); + + To to; + memcpy(&to, &from, sizeof(To)); + return to; +} +} + +#endif + +#endif /* BIT_CAST_HPP */