MeshLib C++ Docs
Loading...
Searching...
No Matches
MRMacros.h
Go to the documentation of this file.
1#pragma once
2
4
6#define MR_STR(...) MR_STR_(__VA_ARGS__)
7#define MR_STR_(...) #__VA_ARGS__
8
10#define MR_IDENTITY(...) __VA_ARGS__
11
13#define MR_END(...) DETAIL_MR_END(__VA_ARGS__)
14#define DETAIL_MR_END(...) __VA_ARGS__##_END
15
17#define MR_CONCAT( a, b ) MR_CONCAT_( a, b )
18#define MR_CONCAT_( a, b ) a##b
19
20#define MR_CONCAT3( a, b, c ) MR_CONCAT3_( a, b, c )
21#define MR_CONCAT3_( a, b, c ) a##b##c
22
28#if __cpp_concepts && __has_include(<concepts>) && !(defined(__clang__) && __clang_major__ <= 14) && !(defined(__GNUC__) && !defined(__clang__) && __GNUC__ <= 12)
29# define MR_HAS_REQUIRES 1
30# define MR_REQUIRES_IF_SUPPORTED(...) requires(__VA_ARGS__)
31#else
32# define MR_HAS_REQUIRES 0
33# define MR_REQUIRES_IF_SUPPORTED(...)
34#endif
35
36
37#ifdef _MSC_VER
38#define MR_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]
39#else
40#define MR_NO_UNIQUE_ADDRESS [[no_unique_address]]
41#endif
42
43
65#ifdef __clang__
66# define MR_LIFETIMEBOUND [[clang::lifetimebound]]
67# if __clang_major__ >= 20
68# define MR_LIFETIME_CAPTURE_BY(x) [[clang::lifetime_capture_by(x)]]
69# define MR_THIS_LIFETIME_CAPTURE_BY(x) [[clang::lifetime_capture_by(x)]]
70# else
71# define MR_LIFETIME_CAPTURE_BY(x) [[clang::annotate ("mrbind::lifetime_capture_by=" #x)]]
72# define MR_THIS_LIFETIME_CAPTURE_BY(x) [[clang::annotate_type("mrbind::lifetime_capture_by=" #x)]]
73# endif
74# define MR_LIFETIMEBOUND_NESTED [[clang::annotate ("mrbind::lifetimebound_nested")]]
75# define MR_THIS_LIFETIMEBOUND_NESTED [[clang::annotate_type("mrbind::lifetimebound_nested")]]
76# define MR_LIFETIME_CAPTURE_BY_NESTED(x) [[clang::annotate ("mrbind::lifetime_capture_by_nested=" #x)]]
77# define MR_THIS_LIFETIME_CAPTURE_BY_NESTED(x) [[clang::annotate_type("mrbind::lifetime_capture_by_nested=" #x)]]
78#else
79# define MR_LIFETIMEBOUND
80# define MR_LIFETIME_CAPTURE_BY(x)
81# define MR_THIS_LIFETIME_CAPTURE_BY(x)
82# define MR_LIFETIMEBOUND_NESTED
83# define MR_THIS_LIFETIMEBOUND_NESTED
84# define MR_LIFETIME_CAPTURE_BY_NESTED(x)
85# define MR_THIS_LIFETIME_CAPTURE_BY_NESTED(x)
86#endif
87
88
90#if defined(_MSC_VER) && !defined(__clang__) && (!defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL == 1)
91#define MR_LEGACY_MSVC_PREPROCESSOR 1
92#else
93#define MR_LEGACY_MSVC_PREPROCESSOR 0
94#endif
95
97#if MR_LEGACY_MSVC_PREPROCESSOR
98#define MR_TRIM_LEADING_COMMA(...) DETAIL_MR_TRIM_LEADING_COMMA_ DETAIL_MR_TRIM_LEADING_COMMA_DEFER(__VA_ARGS__)
99#define DETAIL_MR_TRIM_LEADING_COMMA_DEFER
100#else
101#define MR_TRIM_LEADING_COMMA(...) DETAIL_MR_TRIM_LEADING_COMMA_(__VA_ARGS__)
102#endif
103#define DETAIL_MR_TRIM_LEADING_COMMA_(x, ...) DETAIL_MR_TRIM_LEADING_COMMA_EMPTY(x) __VA_ARGS__
104#define DETAIL_MR_TRIM_LEADING_COMMA_EMPTY()