Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_pointer_utils.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef KIS_POINTER_UTILS_H
8#define KIS_POINTER_UTILS_H
9
10#include <QSharedPointer>
11#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
12#include <QForeach>
13#endif
14
18template <class T>
20 return QSharedPointer<T>(ptr);
21}
22
26template <class A, template <class C> class List>
27List<QSharedPointer<A>> listToQShared(const List<A*> list) {
28 List<QSharedPointer<A>> newList;
29 Q_FOREACH(A* value, list) {
30 newList.append(toQShared(value));
31 }
32 return newList;
33}
34
35
39template <template <class> class Container, class T>
40Container<QWeakPointer<T>> listStrongToWeak(const Container<QSharedPointer<T>> &container)
41{
42 Container<QWeakPointer<T> > result;
43 Q_FOREACH (QSharedPointer<T> v, container) {
44 result << v;
45 }
46 return result;
47}
48
57template <template <class> class Container, class T>
58 Container<QSharedPointer<T> > listWeakToStrong(const Container<QWeakPointer<T>> &container,
59 bool allOrNothing = true)
60{
61 Container<QSharedPointer<T> > result;
62 Q_FOREACH (QWeakPointer<T> v, container) {
63 QSharedPointer<T> strong(v);
64 if (!strong && allOrNothing) {
65 result.clear();
66 return result;
67 }
68
69 if (strong) {
70 result << strong;
71 }
72 }
73 return result;
74}
75
82template <typename R, typename T, template <typename U> class Container>
83inline Container<R> implicitCastList(const Container<T> &list)
84{
85 Container<R> result;
86
87 Q_FOREACH(const T &item, list) {
88 result.append(item);
89 }
90 return result;
91}
92
93
94template<class T>
96template<class T>
97class KisSharedPtr;
98template<class T>
100
108template <typename T>
110{
111 return value;
112}
113
114template <typename T>
116{
117 return value.data();
118}
119
120template <typename T>
122{
123 return value.data();
124}
125
126template <typename T>
128{
129 return value.data();
130}
131
132
133template <typename T>
135{
136};
137
138template <typename T>
140{
141 template <typename U>
143 using ValueType = T;
144
145 template <typename D, typename S>
147 return src.template dynamicCast<D>();
148 }
149};
150
151template <typename T>
153{
154 template <typename U>
156 using ValueType = T;
157
158 template <typename D, typename S>
160 return KisSharedPtr<D>(dynamic_cast<D*>(src.data()));
161 }
162};
163
164template <typename T>
166{
167 template <typename U>
169 using ValueType = T;
170
171 template <typename D, typename S>
173 return KisPinnedSharedPtr<D>(dynamic_cast<D*>(src.data()));
174 }
175};
176
177#endif // KIS_POINTER_UTILS_H
178
float value(const T *src, size_t ch)
qreal v
qreal D(qreal t, const QPointF &P0, const QPointF &P1, const QPointF &P2, const QPointF &P3, const QPointF &p)
QSharedPointer< T > toQShared(T *ptr)
List< QSharedPointer< A > > listToQShared(const List< A * > list)
Container< R > implicitCastList(const Container< T > &list)
Container< QSharedPointer< T > > listWeakToStrong(const Container< QWeakPointer< T > > &container, bool allOrNothing=true)
Container< QWeakPointer< T > > listStrongToWeak(const Container< QSharedPointer< T > > &container)
T * removeSharedPointer(T *value)
static KisPinnedSharedPtr< D > dynamicCastSP(KisPinnedSharedPtr< S > src)
static KisSharedPtr< D > dynamicCastSP(KisSharedPtr< S > src)
static QSharedPointer< D > dynamicCastSP(QSharedPointer< S > src)