blob: 5878b90bd6ac18792fcea13901e539154b627a87 (
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
|
// Copyright (C) 2023 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
#if 0
#pragma qt_sync_skip_header_check
#pragma qt_sync_stop_processing
#endif
#ifndef QFUNCTIONALTOOLS_IMPL_H
#define QFUNCTIONALTOOLS_IMPL_H
#include <QtCore/qtconfigmacros.h>
#include <type_traits>
#include <utility>
QT_BEGIN_NAMESPACE
namespace QtPrivate {
namespace detail {
#define FOR_EACH_CVREF(op) \
op(&) \
op(const &) \
op(&&) \
op(const &&) \
/* end */
template <typename Object, typename = void>
struct StorageByValue
{
Object o;
#define MAKE_GETTER(cvref) \
constexpr Object cvref object() cvref noexcept \
{ return static_cast<Object cvref>(o); }
FOR_EACH_CVREF(MAKE_GETTER)
#undef MAKE_GETTER
};
template <typename Object, typename Tag = void>
struct StorageEmptyBaseClassOptimization : Object
{
StorageEmptyBaseClassOptimization(Object &&o)
: Object(std::move(o))
{}
StorageEmptyBaseClassOptimization(const Object &o)
: Object(o)
{}
#define MAKE_GETTER(cvref) \
constexpr Object cvref object() cvref noexcept \
{ return static_cast<Object cvref>(*this); }
FOR_EACH_CVREF(MAKE_GETTER)
#undef MAKE_GETTER
};
} // namespace detail
template <typename Object, typename Tag = void>
using CompactStorage = 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>
>;
} // namespace QtPrivate
#undef FOR_EACH_CVREF
QT_END_NAMESPACE
#endif // QFUNCTIONALTOOLS_IMPL_H
|