Rework CONSTEXPR_IF_MSVC2022 into CONSTEXPR_MULTILINE and CONSTEXPR_MULTILINE_NO_MSVC.
Some checks failed
Codecov / run (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Has been cancelled

gcc-4.9 on Debian 8 doesn't support multi-line constexpr functions.

CONSTEXPR_MULTILINE enables constexpr for MSVC 2022 and gcc-5,
and later versions.

CONSTEXPR_MULTILINE_NO_MSVC enables constexpr for gcc-5 and later,
but not MSVC. Needed for functions that use intrinsics, which
(still) aren't marked as constexpr on MSVC.
This commit is contained in:
David Korth 2025-05-12 21:34:55 -04:00
parent 44eba93a3e
commit 46c83d92c1
9 changed files with 62 additions and 59 deletions

View File

@ -84,8 +84,19 @@ typedef int64_t off64_t;
#endif
// MSVC prior to MSVC 2022 does not support constexpr on multi-line functions.
#if !defined(__cplusplus) || (defined(_MSC_VER) && _MSC_VER < 1930)
# define CONSTEXPR_IF_MSVC2022
// gcc doesn't support constexpr on multi-line functions before gcc-5. (requires C++14)
#if !defined(__cplusplus)
# define CONSTEXPR_MULTILINE
#elif defined(_MSC_VER) && _MSC_VER < 1930
# define CONSTEXPR_MULTILINE
#elif defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 5 || __cplusplus < 201402L)
# define CONSTEXPR_MULTILINE
#else
# define CONSTEXPR_IF_MSVC2022 constexpr
# define CONSTEXPR_MULTILINE constexpr
#endif
#ifdef _MSC_VER
# define CONSTEXPR_MULTILINE_NO_MSVC
#else /* !_MSC_VER */
# define CONSTEXPR_MULTILINE_NO_MSVC CONSTEXPR_MULTILINE
#endif

View File

@ -72,7 +72,7 @@ public:
* @return PDP-swapped DWORD
*/
// FIXME: be32_to_cpu() and __swab16() are not constexpr on MSVC 2022.
static inline CONSTEXPR_NO_MSVC uint32_t PDP_SWAP(uint32_t x)
static inline CONSTEXPR_MULTILINE_NO_MSVC uint32_t PDP_SWAP(uint32_t x)
{
union {
uint32_t d;

View File

@ -42,6 +42,20 @@
# endif /* !__cplusplus */
#endif /* !CONSTEXPR */
// MSVC prior to MSVC 2022 does not support constexpr on multi-line functions.
// gcc doesn't support constexpr on multi-line functions before gcc-5. (requires C++14)
#ifndef CONSTEXPR_MULTILINE
# if !defined(__cplusplus)
# define CONSTEXPR_MULTILINE
# elif defined(_MSC_VER) && _MSC_VER < 1930
# define CONSTEXPR_MULTILINE
# elif defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 5 || __cplusplus < 201402L)
# define CONSTEXPR_MULTILINE
# else
# define CONSTEXPR_MULTILINE constexpr
# endif
#endif /* !CONSTEXPR_MULTILINE */
#if defined(RP_CPU_I386) || defined(RP_CPU_AMD64)
# include "librpcpuid/cpuflags_x86.h"
/* MSVC does not support MMX intrinsics in 64-bit builds. */
@ -124,12 +138,8 @@
* @param f Float to byteswap
* @return Byteswapped float
*/
ATTR_CONST
#ifndef _MSC_VER
static inline CONSTEXPR float __swabf(float f)
#else /* _MSC_VER */
ATTR_CONST CONSTEXPR_MULTILINE
static inline float __swabf(float f)
#endif /* !_MSC_VER */
{
union {
uint32_t u32;

View File

@ -50,7 +50,7 @@ static char lc_decimal[8];
/** File size formatting **/
template<typename T>
static inline CONSTEXPR_IF_MSVC2022 int calc_frac_part_binary(T val, T mask)
static inline CONSTEXPR_MULTILINE int calc_frac_part_binary(T val, T mask)
{
const float f = static_cast<float>(val & (mask - 1)) / static_cast<float>(mask);
int frac_part = static_cast<int>(f * 1000.0f);
@ -70,7 +70,7 @@ static inline CONSTEXPR_IF_MSVC2022 int calc_frac_part_binary(T val, T mask)
}
template<typename T>
static inline CONSTEXPR_IF_MSVC2022 int calc_frac_part_decimal(T val, T divisor)
static inline CONSTEXPR_MULTILINE int calc_frac_part_decimal(T val, T divisor)
{
const float f = static_cast<float>(val % divisor) / static_cast<float>(divisor);
int frac_part = static_cast<int>(f * 1000.0f);

View File

@ -51,7 +51,7 @@ rp_image_ptr fromDreamcastVQ16(PixelFormat px_format,
* @param width Texture width.
* @return Number of palette entries.
*/
static inline CONSTEXPR_IF_MSVC2022 int calcDreamcastSmallVQPaletteEntries_NoMipmaps(int width)
static inline CONSTEXPR_MULTILINE int calcDreamcastSmallVQPaletteEntries_NoMipmaps(int width)
{
if (width <= 16) {
return 8*4;
@ -70,7 +70,7 @@ static inline CONSTEXPR_IF_MSVC2022 int calcDreamcastSmallVQPaletteEntries_NoMip
* @param width Texture width.
* @return Number of palette entries.
*/
static inline CONSTEXPR_IF_MSVC2022 int calcDreamcastSmallVQPaletteEntries_WithMipmaps(int width)
static inline CONSTEXPR_MULTILINE int calcDreamcastSmallVQPaletteEntries_WithMipmaps(int width)
{
if (width <= 16) {
return 16*4;

View File

@ -285,7 +285,7 @@ struct ColorRGB {
* @param color ColorRGB struct.
* @return xRGB32 value. (Alpha channel set to 0xFF)
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t clamp_ColorRGB(ColorRGB color)
static inline CONSTEXPR_MULTILINE uint32_t clamp_ColorRGB(ColorRGB color)
{
uint32_t xrgb32 = 0;
if (color.B > 255) {

View File

@ -2,7 +2,7 @@
* ROM Properties Page shell extension. (librptexture) *
* PixelConversion.hpp: Pixel conversion inline functions. *
* *
* Copyright (c) 2016-2024 by David Korth. *
* Copyright (c) 2016-2025 by David Korth. *
* SPDX-License-Identifier: GPL-2.0-or-later *
***************************************************************************/
@ -62,7 +62,7 @@ static constexpr std::array<uint8_t, 8> c3_lookup = {{
* @param px16 RGB565 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t RGB565_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t RGB565_to_ARGB32(uint16_t px16)
{
// RGB565: RRRRRGGG GGGBBBBB
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -80,7 +80,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t RGB565_to_ARGB32(uint16_t px16)
* @param px16 BGR565 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t BGR565_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t BGR565_to_ARGB32(uint16_t px16)
{
// RGB565: BBBBBGGG GGGRRRRR
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -98,7 +98,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t BGR565_to_ARGB32(uint16_t px16)
* @param px16 ARGB1555 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t ARGB1555_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t ARGB1555_to_ARGB32(uint16_t px16)
{
// ARGB1555: ARRRRRGG GGGBBBBB
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -118,7 +118,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t ARGB1555_to_ARGB32(uint16_t px16)
* @param px16 ABGR1555 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t ABGR1555_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t ABGR1555_to_ARGB32(uint16_t px16)
{
// ABGR1555: ABBBBBGG GGGRRRRR
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -138,7 +138,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t ABGR1555_to_ARGB32(uint16_t px16)
* @param px16 RGBA5551 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t RGBA5551_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t RGBA5551_to_ARGB32(uint16_t px16)
{
// RGBA5551: RRRRRGGG GGBBBBBA
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -158,7 +158,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t RGBA5551_to_ARGB32(uint16_t px16)
* @param px16 BGRA5551 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t BGRA5551_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t BGRA5551_to_ARGB32(uint16_t px16)
{
// BGRA5551: BBBBBGGG GGRRRRRA
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -178,7 +178,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t BGRA5551_to_ARGB32(uint16_t px16)
* @param px16 ARGB4444 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t ARGB4444_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t ARGB4444_to_ARGB32(uint16_t px16)
{
// ARGB4444: AAAARRRR GGGGBBBB
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -195,7 +195,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t ARGB4444_to_ARGB32(uint16_t px16)
* @param px16 ABGR4444 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t ABGR4444_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t ABGR4444_to_ARGB32(uint16_t px16)
{
// ARGB4444: AAAABBBB GGGGRRRR
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -212,7 +212,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t ABGR4444_to_ARGB32(uint16_t px16)
* @param px16 RGBA4444 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t RGBA4444_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t RGBA4444_to_ARGB32(uint16_t px16)
{
// RGBA4444: RRRRGGGG BBBBAAAA
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -229,7 +229,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t RGBA4444_to_ARGB32(uint16_t px16)
* @param px16 BGRA4444 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t BGRA4444_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t BGRA4444_to_ARGB32(uint16_t px16)
{
// RGBA4444: BBBBGGGG RRRRAAAA
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -246,7 +246,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t BGRA4444_to_ARGB32(uint16_t px16)
* @param px16 xRGB4444 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t xRGB4444_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t xRGB4444_to_ARGB32(uint16_t px16)
{
// xRGB4444: xxxxRRRR GGGGBBBB
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -263,7 +263,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t xRGB4444_to_ARGB32(uint16_t px16)
* @param px16 xBGR4444 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t xBGR4444_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t xBGR4444_to_ARGB32(uint16_t px16)
{
// xRGB4444: xxxxBBBB GGGGRRRR
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -280,7 +280,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t xBGR4444_to_ARGB32(uint16_t px16)
* @param px16 RGBx4444 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t RGBx4444_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t RGBx4444_to_ARGB32(uint16_t px16)
{
// RGBx4444: RRRRGGGG BBBBxxxx
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -297,7 +297,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t RGBx4444_to_ARGB32(uint16_t px16)
* @param px16 BGRx4444 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t BGRx4444_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t BGRx4444_to_ARGB32(uint16_t px16)
{
// RGBx4444: BBBBGGGG RRRRxxxx
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -356,7 +356,7 @@ static inline CONSTEXPR_NO_MSVC uint32_t GR88_to_ARGB32(uint16_t px16)
* @param px16 RGB5A3 pixel (Must be host-endian.)
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t RGB5A3_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t RGB5A3_to_ARGB32(uint16_t px16)
{
// px16 high bit: if set, no alpha channel
uint32_t px32 = (px16 & 0x8000U)
@ -391,7 +391,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t RGB5A3_to_ARGB32(uint16_t px16)
* @param px16 IA8 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t IA8_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t IA8_to_ARGB32(uint16_t px16)
{
// FIXME: What's the component order of IA8?
// Assuming I=MSB, A=LSB...
@ -413,7 +413,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t IA8_to_ARGB32(uint16_t px16)
* @param a4 A4 value
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t RGB565_A4_to_ARGB32(uint16_t px16, uint8_t a4)
static inline CONSTEXPR_MULTILINE uint32_t RGB565_A4_to_ARGB32(uint16_t px16, uint8_t a4)
{
// RGB565: RRRRRGGG GGGBBBBB
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -435,7 +435,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t RGB565_A4_to_ARGB32(uint16_t px16,
* @param px16 BGR5A3 pixel (Must be host-endian.)
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t BGR5A3_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t BGR5A3_to_ARGB32(uint16_t px16)
{
// px16 high bit: if set, no alpha channel
uint32_t px32 = (px16 & 0x8000U)
@ -472,7 +472,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t BGR5A3_to_ARGB32(uint16_t px16)
* @param px16 RGB555 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t RGB555_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t RGB555_to_ARGB32(uint16_t px16)
{
// RGB555: xRRRRRGG GGGBBBBB
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -489,7 +489,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t RGB555_to_ARGB32(uint16_t px16)
* @param px16 BGR555 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t BGR555_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t BGR555_to_ARGB32(uint16_t px16)
{
// BGR555: xBBBBBGG GGGRRRRR
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -603,7 +603,7 @@ static inline uint32_t RGB9_E5_to_ARGB32(uint32_t px32)
* @param px16 BGR888_ABGR7888 pixel (Must be host-endian.)
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t BGR888_ABGR7888_to_ARGB32(uint32_t px32)
static inline CONSTEXPR_MULTILINE uint32_t BGR888_ABGR7888_to_ARGB32(uint32_t px32)
{
// px32 high bit: if set, no alpha channel
uint32_t argb = (px32 & 0x80000000U)
@ -651,7 +651,7 @@ static inline constexpr uint32_t L8_to_ARGB32(uint8_t px8)
* @param px8 A4L4 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t A4L4_to_ARGB32(uint8_t px8)
static inline CONSTEXPR_MULTILINE uint32_t A4L4_to_ARGB32(uint8_t px8)
{
// A4L4: AAAALLLL
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -681,7 +681,7 @@ static inline constexpr uint32_t L16_to_ARGB32(uint16_t px16)
* @param px16 A8L8 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t A8L8_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t A8L8_to_ARGB32(uint16_t px16)
{
// A8L8: AAAAAAAA LLLLLLLL
// ARGB32: AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
@ -697,7 +697,7 @@ static inline CONSTEXPR_IF_MSVC2022 uint32_t A8L8_to_ARGB32(uint16_t px16)
* @param px16 L8A8 pixel
* @return ARGB32 pixel
*/
static inline CONSTEXPR_IF_MSVC2022 uint32_t L8A8_to_ARGB32(uint16_t px16)
static inline CONSTEXPR_MULTILINE uint32_t L8A8_to_ARGB32(uint16_t px16)
{
// FIXME: What's the component order of IA8?
// Assuming I=MSB, A=LSB...

View File

@ -53,24 +53,6 @@ public:
* @return Image, or nullptr on error.
*/
rp_image_const_ptr loadImage(void);
#if SYS_BYTEORDER == SYS_BIG_ENDIAN
/**
* Byteswap a float. (TODO: Move to byteswap_rp.h?)
* @param f Float to byteswap.
* @return Byteswapped flaot.
*/
static inline constexpr float __swabf(float f)
{
union {
uint32_t u32;
float f;
} u32_f;
u32_f.f = f;
u32_f.u32 = __swab32(u32_f.u32);
return u32_f.f;
}
#endif /* SYS_BYTEORDER == SYS_BIG_ENDIAN */
};
FILEFORMAT_IMPL(ValveVTF3)

View File

@ -99,7 +99,7 @@ class XboxXPRPrivate final : public FileFormatPrivate
* @param value
* @return
*/
static CONSTEXPR_IF_MSVC2022 uint32_t fill_pattern(uint32_t pattern, uint32_t value)
static CONSTEXPR_MULTILINE uint32_t fill_pattern(uint32_t pattern, uint32_t value)
{
uint32_t result = 0;
uint32_t bit = 1;
@ -130,7 +130,7 @@ class XboxXPRPrivate final : public FileFormatPrivate
* @param bytes_per_pixel
* @return
*/
static inline CONSTEXPR_IF_MSVC2022 unsigned int get_swizzled_offset(
static inline CONSTEXPR_MULTILINE unsigned int get_swizzled_offset(
unsigned int x, unsigned int y,
uint32_t mask_x, uint32_t mask_y,
unsigned int bytes_per_pixel)