aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/PySide6/qtcorehelper.h
blob: 6bce2f5f41b585670f6d785837eae7bf82e79475 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#ifndef QTCOREHELPER_H
#define QTCOREHELPER_H

#include <QtCore/qdirlisting.h>
#include <QtCore/qmutex.h>
#include <QtCore/qobjectdefs.h>

#include <memory>

QT_BEGIN_NAMESPACE

namespace QtCoreHelper {

    using MutexLocker = QT_PREPEND_NAMESPACE(QMutexLocker<QMutex>);
    using RecursiveMutexLocker = QT_PREPEND_NAMESPACE(QMutexLocker<QRecursiveMutex>);

    // ::QMutexLocker is a template with the QMutex class as parameter which can
    // only be represented by different type names in Python. Provide a common API.
    class QMutexLocker
    {
    public:
        Q_DISABLE_COPY_MOVE(QMutexLocker)

        explicit QMutexLocker(QMutex *m)
            : m_mutexLocker(new MutexLocker(m))
        {
        }

        explicit QMutexLocker(QRecursiveMutex *m)
            : m_recursiveMutexLocker(new RecursiveMutexLocker(m))
        {
        }

        void unlock()
        {
            if (m_mutexLocker)
                m_mutexLocker->unlock();
            else
                m_recursiveMutexLocker->unlock();
        }

        void relock()
        {
            if (m_mutexLocker)
                m_mutexLocker->relock();
            else
                m_recursiveMutexLocker->relock();
        }

        QMutex *mutex() const
        {
            return m_mutexLocker ? m_mutexLocker->mutex() : nullptr;
        }

        QRecursiveMutex *recursiveMutex() const
        {
            return m_recursiveMutexLocker ? m_recursiveMutexLocker->mutex() : nullptr;
        }

        ~QMutexLocker()
        {
            delete m_mutexLocker;
            delete m_recursiveMutexLocker;
        }

    private:
        MutexLocker *m_mutexLocker = nullptr;
        RecursiveMutexLocker *m_recursiveMutexLocker = nullptr;
    };

    class QGenericArgumentData;

    // Return value of function Q_ARG() to be passed to QMetaObject::invokeMethod.
    // Frees the data if it is an allocated, primitive type.
    class QGenericArgumentHolder {
    public:
        QGenericArgumentHolder();
        explicit QGenericArgumentHolder(const QMetaType &type, const void *aData);
        QGenericArgumentHolder(const QGenericArgumentHolder &);
        QGenericArgumentHolder(QGenericArgumentHolder &&);
        QGenericArgumentHolder &operator=(const QGenericArgumentHolder &);
        QGenericArgumentHolder &operator=(QGenericArgumentHolder &&);
        ~QGenericArgumentHolder();

        QGenericArgument toGenericArgument() const;

        QMetaType metaType() const;
        const void *data() const;

    private:
        std::shared_ptr<QGenericArgumentData> d;
    };

    class QGenericReturnArgumentData;

    // Return value of function Q_RETURN_ARG() to be passed to QMetaObject::invokeMethod.
    // Frees the data if it is an allocated, primitive type.
    class QGenericReturnArgumentHolder  {
    public:
        explicit QGenericReturnArgumentHolder(const QMetaType &type, void *aData);
        QGenericReturnArgumentHolder(const QGenericReturnArgumentHolder &);
        QGenericReturnArgumentHolder(QGenericReturnArgumentHolder &&);
        QGenericReturnArgumentHolder &operator=(const QGenericReturnArgumentHolder &);
        QGenericReturnArgumentHolder &operator=(QGenericReturnArgumentHolder &&);
        ~QGenericReturnArgumentHolder();

        QGenericReturnArgument toGenericReturnArgument() const;

        QMetaType metaType() const;
        const void *data() const;

    private:
        std::shared_ptr<QGenericReturnArgumentData> d;
    };

    struct QDirListingIteratorPrivate;

    class QDirListingIterator
    {
    public:
        explicit QDirListingIterator(const QDirListing &dl);
        QDirListingIterator();

        QDirListingIterator(const QDirListingIterator &);
        QDirListingIterator &operator=(const QDirListingIterator &);
        QDirListingIterator(QDirListingIterator &&) noexcept;
        QDirListingIterator &operator=(QDirListingIterator &&) noexcept;
        ~QDirListingIterator();

        bool next();
        const QDirListing::DirEntry &value() const;
        bool atEnd() const;

    private:
        std::shared_ptr<QDirListingIteratorPrivate> d;
    };

} // namespace QtCoreHelper

QT_END_NAMESPACE

#endif // QTCOREHELPER_H