mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 00:03:11 +01:00
Make UtilBitScanForward a header implementation (#22406)
This commit is contained in:
@@ -25,16 +25,6 @@
|
|||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# ifndef NOMINMAX
|
|
||||||
# define NOMINMAX
|
|
||||||
# endif
|
|
||||||
# ifndef WIN32_LEAN_AND_MEAN
|
|
||||||
# define WIN32_LEAN_AND_MEAN
|
|
||||||
# endif
|
|
||||||
# include <windows.h>
|
|
||||||
#endif // _WIN32
|
|
||||||
|
|
||||||
int32_t SquaredMetresToSquaredFeet(int32_t squaredMetres)
|
int32_t SquaredMetresToSquaredFeet(int32_t squaredMetres)
|
||||||
{
|
{
|
||||||
// 1 metre squared = 10.7639104 feet squared
|
// 1 metre squared = 10.7639104 feet squared
|
||||||
@@ -62,50 +52,6 @@ int32_t MphToDmps(int32_t mph)
|
|||||||
return (mph * 73243) >> 14;
|
return (mph * 73243) >> 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t UtilBitScanForward(uint32_t source)
|
|
||||||
{
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400) // Visual Studio 2005
|
|
||||||
DWORD i;
|
|
||||||
uint8_t success = _BitScanForward(&i, source);
|
|
||||||
return success != 0 ? i : -1;
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
int32_t success = __builtin_ffs(source);
|
|
||||||
return success - 1;
|
|
||||||
#else
|
|
||||||
# pragma message("Falling back to iterative bitscan forward, consider using intrinsics")
|
|
||||||
// This is a low-hanging optimisation boost, check if your compiler offers
|
|
||||||
// any intrinsic.
|
|
||||||
// cf. https://github.com/OpenRCT2/OpenRCT2/pull/2093
|
|
||||||
for (int32_t i = 0; i < 32; i++)
|
|
||||||
if (source & (1u << i))
|
|
||||||
return i;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t UtilBitScanForward(uint64_t source)
|
|
||||||
{
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400) && defined(_M_X64) // Visual Studio 2005
|
|
||||||
DWORD i;
|
|
||||||
uint8_t success = _BitScanForward64(&i, source);
|
|
||||||
return success != 0 ? i : -1;
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
int32_t success = __builtin_ffsll(source);
|
|
||||||
return success - 1;
|
|
||||||
#else
|
|
||||||
# pragma message("Falling back to iterative bitscan forward, consider using intrinsics")
|
|
||||||
// This is a low-hanging optimisation boost, check if your compiler offers
|
|
||||||
// any intrinsic.
|
|
||||||
// cf. https://github.com/OpenRCT2/OpenRCT2/pull/2093
|
|
||||||
for (int32_t i = 0; i < 64; i++)
|
|
||||||
if (source & (1uLL << i))
|
|
||||||
return i;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Case insensitive logical compare */
|
/* Case insensitive logical compare */
|
||||||
// Example:
|
// Example:
|
||||||
// - Guest 10
|
// - Guest 10
|
||||||
|
|||||||
@@ -19,13 +19,59 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t SquaredMetresToSquaredFeet(int32_t squaredMetres);
|
int32_t SquaredMetresToSquaredFeet(int32_t squaredMetres);
|
||||||
int32_t MetresToFeet(int32_t metres);
|
int32_t MetresToFeet(int32_t metres);
|
||||||
int32_t MphToKmph(int32_t mph);
|
int32_t MphToKmph(int32_t mph);
|
||||||
int32_t MphToDmps(int32_t mph);
|
int32_t MphToDmps(int32_t mph);
|
||||||
|
|
||||||
int32_t UtilBitScanForward(uint32_t source);
|
inline int32_t UtilBitScanForward(uint32_t source)
|
||||||
int32_t UtilBitScanForward(uint64_t source);
|
{
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1400) // Visual Studio 2005
|
||||||
|
unsigned long i;
|
||||||
|
uint8_t success = _BitScanForward(&i, source);
|
||||||
|
return success != 0 ? i : -1;
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
int32_t success = __builtin_ffs(source);
|
||||||
|
return success - 1;
|
||||||
|
#else
|
||||||
|
# pragma message("Falling back to iterative bitscan forward, consider using intrinsics")
|
||||||
|
// This is a low-hanging optimisation boost, check if your compiler offers
|
||||||
|
// any intrinsic.
|
||||||
|
// cf. https://github.com/OpenRCT2/OpenRCT2/pull/2093
|
||||||
|
for (int32_t i = 0; i < 32; i++)
|
||||||
|
if (source & (1u << i))
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int32_t UtilBitScanForward(uint64_t source)
|
||||||
|
{
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1400) && defined(_M_X64) // Visual Studio 2005
|
||||||
|
unsigned long i;
|
||||||
|
uint8_t success = _BitScanForward64(&i, source);
|
||||||
|
return success != 0 ? i : -1;
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
int32_t success = __builtin_ffsll(source);
|
||||||
|
return success - 1;
|
||||||
|
#else
|
||||||
|
# pragma message("Falling back to iterative bitscan forward, consider using intrinsics")
|
||||||
|
// This is a low-hanging optimisation boost, check if your compiler offers
|
||||||
|
// any intrinsic.
|
||||||
|
// cf. https://github.com/OpenRCT2/OpenRCT2/pull/2093
|
||||||
|
for (int32_t i = 0; i < 64; i++)
|
||||||
|
if (source & (1uLL << i))
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int32_t StrLogicalCmp(char const* a, char const* b);
|
int32_t StrLogicalCmp(char const* a, char const* b);
|
||||||
char* SafeStrCpy(char* destination, const char* source, size_t num);
|
char* SafeStrCpy(char* destination, const char* source, size_t num);
|
||||||
char* SafeStrCat(char* destination, const char* source, size_t size);
|
char* SafeStrCat(char* destination, const char* source, size_t size);
|
||||||
|
|||||||
Reference in New Issue
Block a user