6 #ifndef SWIFT_MISC_METACLASS_H
7 #define SWIFT_MISC_METACLASS_H
10 #include <type_traits>
13 #include <QLatin1String>
28 #if defined(Q_OS_WIN) && defined(Q_CC_GNU)
29 # define SWIFT_NO_EXPORT_CONSTEXPR constexpr inline __attribute__((always_inline))
31 # define SWIFT_NO_EXPORT_CONSTEXPR constexpr
37 # define SWIFT_TRAILING_VA_ARGS(...) , __VA_ARGS__
39 # define SWIFT_TRAILING_VA_ARGS(...) , ##__VA_ARGS__
53 #define SWIFT_METACLASS(CLASS, ...) \
54 friend struct swift::misc::private_ns::CMetaClassAccessor; \
55 struct MetaClass : public swift::misc::CMetaClass \
57 using Class = CLASS; \
58 SWIFT_NO_EXPORT_CONSTEXPR static auto getMemberList() { return makeMetaMemberList(__VA_ARGS__); } \
73 #define SWIFT_METAMEMBER(MEMBER, ...) makeMetaMember(&Class::m_##MEMBER, #MEMBER SWIFT_TRAILING_VA_ARGS(__VA_ARGS__))
81 #define SWIFT_METAMEMBER_NAMED(MEMBER, NAME, ...) \
82 makeMetaMember(&Class::m_##MEMBER, NAME SWIFT_TRAILING_VA_ARGS(__VA_ARGS__))
86 inline size_t qHash(
const std::string &key, uint seed) {
return qHash(QString::fromStdString(key), seed); }
89 inline size_t qHash(
const std::string &key) {
return qHash(QString::fromStdString(key)); }
110 constexpr
operator QLatin1String()
const {
return m_latin1; }
118 struct MetaFlags :
public std::integral_constant<quint64, F>
121 constexpr
operator std::bool_constant<static_cast<bool>(F)>()
const {
return {}; }
128 template <qu
int64 A, qu
int64 B>
138 template <qu
int64 A, qu
int64 B>
148 template <
typename M, qu
int64 Flags>
165 template <
typename Flags2>
166 static constexpr
bool has(Flags2 flags)
172 template <
typename T,
typename... Ts>
173 decltype(
auto)
in(T &&
object, Ts &&...args)
const
175 return std::invoke(
m_ptr, std::forward<T>(
object), std::forward<Ts>(args)...);
186 template <
typename... Members>
193 static constexpr
size_t c_size =
sizeof...(Members);
234 template <
typename... Members>
237 return { { { { members }... } } };
242 template <
typename M, qu
int64 Flags = 0>
246 static_assert(std::is_member_object_pointer_v<M>,
"M must be a pointer to member object");
247 return { ptrToMember, name, index, flags };
256 template <
typename MetaClass>
261 template <
typename F>
264 MetaClass::getMemberList().m_members.for_each(std::forward<F>(visitor));
271 struct CMetaClassAccessor
273 template <
typename T>
274 constexpr
static auto getIntrospector()
276 return CMetaClassIntrospector<typename T::MetaClass>();
286 template <
typename T>
289 return private_ns::CMetaClassAccessor::getIntrospector<T>();
Free functions in swift::misc.
Simple literal type containing a single QLatin1String.
const QLatin1String m_latin1
Embedded string.
constexpr CExplicitLatin1String(QLatin1String s)
Implicit constructor.