MeshLib C++ Docs
Loading...
Searching...
No Matches
MRCanonicalTypedefs.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMesh/MRMacros.h"
4
22
23#define MR_CANONICAL_TYPEDEFS(type_, name_, aliases_) \
24 MR_IDENTITY type_ name_; \
25 MR_END(DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_A aliases_) \
26 DETAIL_MR_CANONICAL_TYPEDEFS(type_, name_, aliases_)
27
28#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_BODY(name_, ...) using name_ = __VA_ARGS__;
30#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_A(...) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_BODY MR_IDENTITY()(__VA_ARGS__) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_B
31#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_B(...) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_BODY MR_IDENTITY()(__VA_ARGS__) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_A
32#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_A_END
33#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_USING_B_END
34
35#if defined(__has_attribute)
36#if __has_attribute(__preferred_name__)
37#define DETAIL_MR_CANONICAL_TYPEDEFS(type_, name_, aliases_) \
38 MR_IDENTITY type_ \
39 MR_END(DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_A aliases_) \
40 name_; \
41 DETAIL_MR_CANONICAL_TYPEDEFS_CLANG_WORKAROUND(aliases_)
42
43#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_BODY(name_, ...) __attribute__((__preferred_name__(name_)))
44#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_A(...) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_BODY(__VA_ARGS__) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_B
45#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_B(...) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_BODY(__VA_ARGS__) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_A
46#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_A_END
47#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_ATTR_B_END
48
49#ifdef __clang__
50
51#define DETAIL_MR_CANONICAL_TYPEDEFS_CLANG_WORKAROUND(aliases_) \
52 MR_END(DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_A aliases_)
53
54namespace MR::detail::CanonicalTypedefs
55{
56template <typename> struct RegisterType {};
57}
58
59#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_BODY(name_, ...) static_assert((void(::MR::detail::CanonicalTypedefs::RegisterType<__VA_ARGS__>{}), true));
60#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_A(...) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_BODY(__VA_ARGS__) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_B
61#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_B(...) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_BODY(__VA_ARGS__) DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_A
62#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_A_END
63#define DETAIL_MR_CANONICAL_TYPEDEFS_LOOP_TOUCH_B_END
64
65#else
66#define DETAIL_MR_CANONICAL_TYPEDEFS_CLANG_WORKAROUND(aliases_)
67#endif
68
69#else
70#define DETAIL_MR_CANONICAL_TYPEDEFS(type_, name_, aliases_)
71#endif
72
73#else
74#define DETAIL_MR_CANONICAL_TYPEDEFS(type_, name_, aliases_)
75#endif