6#error Do not include qobjectdefs_impl.h directly
7#include <QtCore/qnamespace.h>
11#pragma qt_sync_skip_header_check
12#pragma qt_sync_stop_processing
15#include <QtCore/qfunctionaltools_impl.h>
38 template <
typename... Ts>
struct List {
static constexpr size_t size =
sizeof...(Ts); };
42 template <
typename Head,
typename... Tail>
struct List<Head, Tail...> {
43 static constexpr size_t size = 1 +
sizeof...(Tail);
60 template <
typename R,
typename Lambda>
63 using SlotRet =
decltype(fn());
64 if constexpr (std::is_void_v<R> || std::is_void_v<SlotRet>) {
68 *
reinterpret_cast<R *
>(
args[0]) = fn();
98 template<
int N,
int... I1,
int... I2>
102 template<
int N,
class S1,
class S2>
103 using ConcatSeq = InvokeGenSeq<ConcatSeqImpl<N, S1, S2>>;
105 template<
int N>
struct GenSeq;
123 [[maybe_unused]]
auto staticcast = [](
QObject *
obj) {
return static_cast<Obj *
>(
obj); };
124 [[maybe_unused]]
auto qobjcast = [](
QObject *
obj) {
return Obj::staticMetaObject.cast(
obj); };
126 [[maybe_unused]]
auto dyncast = [](
QObject *
obj) {
return dynamic_cast<Obj *
>(
obj); };
129 auto cast = qobjcast;
132 "Called object is not of the correct type (class destructor may have already run)");
135 template <
typename,
typename,
typename,
typename>
struct FunctorCall;
136 template <
int... II,
typename... SignalArgs,
typename R,
typename Function>
141 call_internal<R>(
arg, [&] {
146 template <
int... II,
typename... SignalArgs,
typename R,
typename... SlotArgs,
typename SlotRet,
class Obj>
151 assertObjectType<Obj>(
o);
152 call_internal<R>(
arg, [&] {
157 template <
int... II,
typename... SignalArgs,
typename R,
typename... SlotArgs,
typename SlotRet,
class Obj>
162 assertObjectType<Obj>(
o);
163 call_internal<R>(
arg, [&] {
168 template <
int... II,
typename... SignalArgs,
typename R,
typename... SlotArgs,
typename SlotRet,
class Obj>
171 static void call(SlotRet (Obj::*
f)(SlotArgs...) noexcept, Obj *
o,
void **
arg)
173 assertObjectType<Obj>(
o);
174 call_internal<R>(
arg, [&]()
noexcept {
179 template <
int... II,
typename... SignalArgs,
typename R,
typename... SlotArgs,
typename SlotRet,
class Obj>
182 static void call(SlotRet (Obj::*
f)(SlotArgs...) const noexcept, Obj *
o,
void **
arg)
184 assertObjectType<Obj>(
o);
185 call_internal<R>(
arg, [&]()
noexcept {
191 template<
class Obj,
typename Ret,
typename... Args>
struct FunctionPointer<Ret (Obj::*) (Args...)>
198 template <
typename SignalArgs,
typename R>
200 FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs,
R,
Function>::call(
f,
o,
arg);
203 template<
class Obj,
typename Ret,
typename... Args>
struct FunctionPointer<Ret (Obj::*) (Args...) const>
210 template <
typename SignalArgs,
typename R>
212 FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs,
R,
Function>::call(
f,
o,
arg);
221 enum {ArgumentCount =
sizeof...(Args), IsPointerToMemberFunction =
false};
222 template <
typename SignalArgs,
typename R>
224 FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs,
R,
Function>::call(
f,
arg);
228 template<
class Obj,
typename Ret,
typename... Args>
struct FunctionPointer<Ret (Obj::*) (Args...) noexcept>
235 template <
typename SignalArgs,
typename R>
237 FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs,
R,
Function>::call(
f,
o,
arg);
240 template<
class Obj,
typename Ret,
typename... Args>
struct FunctionPointer<Ret (Obj::*) (Args...) const noexcept>
245 typedef Ret (Obj::*
Function) (Args...) const noexcept;
247 template <
typename SignalArgs,
typename R>
249 FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs,
R,
Function>::call(
f,
o,
arg);
253 template<
typename Ret,
typename... Args>
struct FunctionPointer<Ret (*) (Args...) noexcept>
258 enum {ArgumentCount =
sizeof...(Args), IsPointerToMemberFunction =
false};
259 template <
typename SignalArgs,
typename R>
261 FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs,
R,
Function>::call(
f,
arg);
267 template <
typename T>
270 template <
typename From,
typename To,
typename Enable =
void>
273 template <
typename From,
typename To>
275 std::void_t< decltype( NarrowingDetector<To>{ {std::declval<From>()} } ) >
276 > : std::true_type {};
282 template <
typename From,
typename To,
typename Enable =
void>
285 template <
typename From,
typename To>
288 std::disjunction_v<std::is_same<From, To>, IsConvertibleWithoutNarrowing<From, To>>
290 > : std::true_type {};
298 static int test(
const std::remove_reference_t<A2>&);
300 enum {
value =
sizeof(
test(std::declval<std::remove_reference_t<A1>>())) ==
sizeof(
int) };
301#ifdef QT_NO_NARROWING_CONVERSIONS_IN_CONNECT
302 using AreArgumentsConvertibleWithoutNarrowing = AreArgumentsConvertibleWithoutNarrowingBase<std::decay_t<A1>, std::decay_t<A2>>;
303 static_assert(AreArgumentsConvertibleWithoutNarrowing::value,
"Signal and slot arguments are not compatible (narrowing)");
316 template <
typename Arg1,
typename Arg2,
typename... Tail1,
typename... Tail2>
332 template <
typename Functor,
typename First,
typename... ArgList>
335 typename List_Left<List<First, ArgList...>, sizeof...(ArgList)>::Value> {};
339 template <
typename F>
static auto test(F
f) ->
decltype(((
f.operator()((std::declval<ArgList>())...)),
int()));
342 Ok =
sizeof(test(std::declval<Functor>())) ==
sizeof(
int),
350 typedef decltype(std::declval<Functor>().operator()((std::declval<ArgList>())...))
Value;
353 template<
typename Func,
typename... Args>
356 using ReturnType =
decltype(std::declval<Func>()(std::declval<Args>()...));
358 enum {ArgumentCount =
sizeof...(Args)};
361 template <
typename SignalArgs,
typename R>
363 FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs,
R, Func>::call(
f,
arg);
367 template <
typename Functor,
typename... Args>
371 template <
typename F,
typename =
void>
372 struct Test : std::false_type
376 template <
typename F>
377 struct Test<F,
std::void_t<decltype(std::declval<F>().operator()(std::declval<Args>()...))>>
384 static constexpr bool value = Type::value;
387 template <
typename Functor,
typename... Args>
391 template <
typename Func,
typename... Args>
397 static auto Resolve(std::true_type CallOperator) ->
FunctorCallable<Func, Args...>;
398 static auto Resolve(std::false_type CallOperator) -> FunctionPointer<std::decay_t<Func>>;
405 template<
typename Func,
typename... Args>
408 template<
typename Func,
typename... Args>
417 template<
typename Prototype,
typename Functor>
418 inline constexpr std::enable_if_t<!std::disjunction_v<std::is_convertible<Prototype, const char *>,
419 std::is_same<std::decay_t<Prototype>,
QMetaMethod>,
420 std::is_convertible<Functor, const char *>,
427 using Actual = std::decay_t<Functor>;
450#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
476 {
if (
p)
p->destroyIfLastRef(); }
481 bool ref() noexcept {
return m_ref.
ref(); }
482#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
483 inline void destroyIfLastRef() noexcept
484 {
if (!m_ref.
deref()) m_impl(Destroy,
this,
nullptr,
nullptr,
nullptr); }
487 inline void call(
QObject *
r,
void **
a) { m_impl(Call,
this,
r,
a,
nullptr); }
490 {
if (!m_ref.
deref()) m_impl(
this,
nullptr,
nullptr, Destroy,
nullptr); }
500 bool isImpl(ImplFn
f)
const {
return m_impl ==
f; }
538 auto get() const noexcept {
return obj.get(); }
541 explicit operator bool() const noexcept {
return bool(
obj); }
547 template <
typename Func,
typename Args,
typename R>
551 using FunctorValue = std::decay_t<Func>;
553 using FuncType = Callable<Func, Args>;
555#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
570 if constexpr (std::is_member_function_pointer_v<FunctorValue>)
571 FuncType::template call<Args, R>(that->object(),
static_cast<typename FuncType::Object *
>(
r),
a);
573 FuncType::template call<Args, R>(that->object(),
r,
a);
576 if constexpr (std::is_member_function_pointer_v<FunctorValue>) {
577 *
ret = *
reinterpret_cast<FunctorValue *
>(
a) == that->object();
596 template <
typename Func,
typename =
void>
599 template <
typename Func>
601 std::enable_if_t<!std::disjunction_v<std::is_convertible<Func, const char *>,
602 std::is_member_function_pointer<Func>
609 template <
typename Func>
611 std::enable_if_t<std::conjunction_v<std::negation<std::is_convertible<Func, const char *>>,
612 std::is_member_function_pointer<Func>,
613 std::is_convertible<typename QtPrivate::FunctionPointer<Func>::Object *, QObject *>
627 template <
typename Prototype,
typename Functor>
628 static constexpr std::enable_if_t<QtPrivate::countMatchingArguments<Prototype, Functor>() >= 0,
633 using ExpectedReturnType =
typename ExpectedSignature::ReturnType;
634 using ExpectedArguments =
typename ExpectedSignature::Arguments;
637 constexpr int MatchingArgumentCount = QtPrivate::countMatchingArguments<Prototype, Functor>();
640 static_assert(int(ActualSignature::ArgumentCount) <= int(ExpectedSignature::ArgumentCount),
641 "Functor requires more arguments than what can be provided.");
647 template<
typename Prototype,
typename Functor,
typename =
void>
649 template<
typename Prototype,
typename Functor>
651 std::is_same_v<decltype(QtPrivate::makeCallableObject<Prototype>(std::forward<Functor>(std::declval<Functor>()))),
652 QtPrivate::QSlotObjectBase *>>
653 > : std::true_type {};
655 template<
typename Prototype,
typename Functor>
658 "Functor is not compatible with expected prototype!");
QCallableObject(const Func &f)
QCallableObject(Func &&f)
void destroyIfLastRef() noexcept
bool isImpl(ImplFn f) const
void call(QObject *r, void **a)
QSlotObjectBase(ImplFn fn)
SlotObjSharedPtr & operator=(SlotObjSharedPtr &&other) noexcept=default
~SlotObjSharedPtr()=default
Q_NODISCARD_CTOR SlotObjSharedPtr(SlotObjUniquePtr o)
auto operator->() const noexcept
void swap(SlotObjSharedPtr &other) noexcept
Q_NODISCARD_CTOR Q_IMPLICIT SlotObjSharedPtr() noexcept=default
auto get() const noexcept
Q_NODISCARD_CTOR SlotObjSharedPtr(SlotObjSharedPtr &&other) noexcept=default
Q_NODISCARD_CTOR SlotObjSharedPtr(const SlotObjSharedPtr &other) noexcept
SlotObjSharedPtr & operator=(const SlotObjSharedPtr &other) noexcept
Combined button and popup list for selecting options.
typename std::conditional_t< std::conjunction_v< std::is_empty< Object >, std::negation< std::is_final< Object > > >, detail::StorageEmptyBaseClassOptimization< Object, Tag >, detail::StorageByValue< Object, Tag > > CompactStorage
void assertObjectType(QObjectPrivate *d)
constexpr bool HasCallOperatorAcceptingArgs_v
typename T::Type InvokeGenSeq
constexpr std::enable_if_t<!std::disjunction_v< std::is_convertible< Prototype, const char * >, std::is_same< std::decay_t< Prototype >, QMetaMethod >, std::is_convertible< Functor, const char * >, std::is_same< std::decay_t< Functor >, QMetaMethod > >, int > countMatchingArguments()
constexpr bool AssertCompatibleFunctions()
std::unique_ptr< QSlotObjectBase, QSlotObjectBase::Deleter > SlotObjUniquePtr
InvokeGenSeq< GenSeq< N > > makeIndexSequence
InvokeGenSeq< ConcatSeqImpl< N, S1, S2 > > ConcatSeq
SlotObjUniquePtr copy(const SlotObjUniquePtr &other) noexcept
static constexpr std::enable_if_t< QtPrivate::countMatchingArguments< Prototype, Functor >() >=0, QtPrivate::QSlotObjectBase * > makeCallableObject(Functor &&func)
static jboolean copy(JNIEnv *, jobject)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
static QDBusError::ErrorType get(const char *name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLuint GLintptr GLsizeiptr size
[1]
#define Q_ASSERT_X(cond, x, msg)
static int compare(quint64 a, quint64 b)
const char className[16]
[1]
static int test(const std::remove_reference_t< A2 > &)
static auto test(F f) -> decltype(((f.operator()((std::declval< ArgList >())...)), int()))
typename QtPrivate::FunctionPointer< Func >::Object ContextType
static void call(Function f, Obj *o, void **arg)
List< Args... > Arguments
List< Args... > Arguments
static void call(Function f, Obj *o, void **arg)
static void call(Function f, Obj *o, void **arg)
List< Args... > Arguments
static void call(Function f, Obj *o, void **arg)
List< Args... > Arguments
List< Args... > Arguments
static void call(Function f, void *, void **arg)
static void call(Function f, void *, void **arg)
List< Args... > Arguments
@ IsPointerToMemberFunction
static void call_internal(void **args, Lambda &&fn) noexcept(noexcept(fn()))
static void call(Function &f, void **arg)
static void call(SlotRet(Obj::*f)(SlotArgs...) const, Obj *o, void **arg)
static void call(SlotRet(Obj::*f)(SlotArgs...) const noexcept, Obj *o, void **arg)
static void call(SlotRet(Obj::*f)(SlotArgs...), Obj *o, void **arg)
static void call(SlotRet(Obj::*f)(SlotArgs...) noexcept, Obj *o, void **arg)
static void call(Func &f, void *, void **arg)
ReturnType(*)(Args...) Function
decltype(std::declval< Func >()(std::declval< Args >()...)) ReturnType
decltype(std::declval< Functor >().operator()((std::declval< ArgList >())...)) Value
makeIndexSequence< N > Value
List< L1..., L2... > Value
List_Append< List< typenameL::Car >, typenameList_Left< typenameL::Cdr, N-1 >::Value >::Value Value
void operator()(QSlotObjectBase *p) const noexcept
static void cleanup(QSlotObjectBase *p) noexcept