4#ifndef QMETACONTAINER_H
5#define QMETACONTAINER_H
7#include <QtCore/qcontainerinfo.h>
8#include <QtCore/qcompare.h>
9#include <QtCore/qflags.h>
10#include <QtCore/qglobal.h>
18class QMetaTypeInterface;
79 template<
typename MetaContainer>
81 : iteratorCapabilities(MetaContainer::getIteratorCapabilities())
82 , sizeFn(MetaContainer::getSizeFn())
83 , clearFn(MetaContainer::getClearFn())
84 , createIteratorFn(MetaContainer::getCreateIteratorFn())
85 , destroyIteratorFn(MetaContainer::getDestroyIteratorFn())
86 , compareIteratorFn(MetaContainer::getCompareIteratorFn())
87 , copyIteratorFn(MetaContainer::getCopyIteratorFn())
88 , advanceIteratorFn(MetaContainer::getAdvanceIteratorFn())
89 , diffIteratorFn(MetaContainer::getDiffIteratorFn())
90 , createConstIteratorFn(MetaContainer::getCreateConstIteratorFn())
91 , destroyConstIteratorFn(MetaContainer::getDestroyConstIteratorFn())
92 , compareConstIteratorFn(MetaContainer::getCompareConstIteratorFn())
93 , copyConstIteratorFn(MetaContainer::getCopyConstIteratorFn())
94 , advanceConstIteratorFn(MetaContainer::getAdvanceConstIteratorFn())
95 , diffConstIteratorFn(MetaContainer::getDiffConstIteratorFn())
132 template<
typename MetaSequence>
189 template<
typename MetaAssociation>
215 template <
typename Iterator>
216 static constexpr IteratorCapabilities capabilitiesForIterator()
218 using Tag =
typename std::iterator_traits<Iterator>::iterator_category;
219 IteratorCapabilities caps {};
220 if constexpr (std::is_base_of_v<std::input_iterator_tag, Tag>)
222 if constexpr (std::is_base_of_v<std::forward_iterator_tag, Tag>)
224 if constexpr (std::is_base_of_v<std::bidirectional_iterator_tag, Tag>)
226 if constexpr (std::is_base_of_v<std::random_access_iterator_tag, Tag>)
231 static constexpr IteratorCapabilities getIteratorCapabilities()
233 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>)
235 else if constexpr (QContainerInfo::has_const_iterator_v<C>)
243 if constexpr (QContainerInfo::has_size_v<C>) {
244 return [](
const void *
c) ->
qsizetype {
return static_cast<const C *
>(
c)->
size(); };
252 if constexpr (QContainerInfo::has_clear_v<C>) {
253 return [](
void *
c) {
return static_cast<C *
>(
c)->
clear(); };
261 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
268 return new Iterator(
static_cast<C *
>(
c)->
begin());
270 return new Iterator(
static_cast<C *
>(
c)->
end());
281 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
282 return [](
const void *
i) {
284 delete static_cast<const Iterator *
>(
i);
293 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
294 return [](
const void *
i,
const void *
j) {
296 return *
static_cast<const Iterator *
>(
i) == *
static_cast<const Iterator *
>(
j);
305 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
306 return [](
void *
i,
const void *
j) {
308 *
static_cast<Iterator *
>(
i) = *
static_cast<const Iterator *
>(
j);
317 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
328 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
329 return [](
const void *
i,
const void *
j) ->
qsizetype {
340 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
347 return new Iterator(
static_cast<const C *
>(
c)->
begin());
349 return new Iterator(
static_cast<const C *
>(
c)->
end());
360 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
361 return [](
const void *
i) {
363 delete static_cast<const Iterator *
>(
i);
372 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
373 return [](
const void *
i,
const void *
j) {
375 return *
static_cast<const Iterator *
>(
i) == *
static_cast<const Iterator *
>(
j);
384 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
385 return [](
void *
i,
const void *
j) {
387 *
static_cast<Iterator *
>(
i) = *
static_cast<const Iterator *
>(
j);
396 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
407 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
408 return [](
const void *
i,
const void *
j) ->
qsizetype {
419 template<
typename EraseFn>
422 if constexpr (QContainerInfo::has_iterator_v<C>
423 && QContainerInfo::can_erase_at_iterator_v<C> && !std::is_const_v<C>) {
424 return [](
void *
c,
const void *
i) {
440 if constexpr (QContainerInfo::has_value_type_v<C>)
441 return QtPrivate::qMetaTypeInterfaceForType<typename C::value_type>();
446 static constexpr AddRemoveCapabilities getAddRemoveCapabilities()
448 AddRemoveCapabilities caps;
449 if constexpr (QContainerInfo::has_push_back_v<C>)
451 if constexpr (QContainerInfo::has_pop_back_v<C>)
453 if constexpr (QContainerInfo::has_push_front_v<C>)
455 if constexpr (QContainerInfo::has_pop_front_v<C>)
462 if constexpr (QContainerInfo::has_at_index_v<C>) {
465 =
static_cast<const C *
>(
c)->at(
i);
467 }
else if constexpr (QContainerInfo::can_get_at_index_v<C>) {
470 = (*
static_cast<const C *
>(
c))[
i];
479 if constexpr (QContainerInfo::can_set_at_index_v<C>) {
481 (*
static_cast<C *
>(
c))[
i]
491 if constexpr (QContainerInfo::has_push_back_v<C>) {
492 if constexpr (QContainerInfo::has_push_front_v<C>) {
497 static_cast<C *
>(
c)->push_front(
value);
501 static_cast<C *
>(
c)->push_back(
value);
513 static_cast<C *
>(
c)->push_back(
value);
518 }
else if constexpr (QContainerInfo::has_push_front_v<C>) {
524 static_cast<C *
>(
c)->push_front(
value);
529 }
else if constexpr (QContainerInfo::has_insert_v<C>) {
543 if constexpr (QContainerInfo::has_pop_back_v<C>) {
544 if constexpr (QContainerInfo::has_pop_front_v<C>) {
548 static_cast<C *
>(
c)->pop_front();
552 static_cast<C *
>(
c)->pop_back();
563 static_cast<C *
>(
c)->pop_back();
568 }
else if constexpr (QContainerInfo::has_pop_front_v<C>) {
573 static_cast<C *
>(
c)->pop_front();
586 if constexpr (QContainerInfo::has_iterator_v<C>
587 && QContainerInfo::iterator_dereferences_to_value_v<C> && !std::is_const_v<C>) {
588 return [](
const void *
i,
void *
r) {
599 if constexpr (QContainerInfo::has_iterator_v<C>
600 && QContainerInfo::can_set_value_at_iterator_v<C> && !std::is_const_v<C>) {
601 return [](
const void *
i,
const void *e) {
612 if constexpr (QContainerInfo::has_iterator_v<C>
613 && QContainerInfo::can_insert_value_at_iterator_v<C> && !std::is_const_v<C>) {
614 return [](
void *
c,
const void *
i,
const void *e) {
626 if constexpr (QContainerInfo::has_const_iterator_v<C>
627 && QContainerInfo::iterator_dereferences_to_value_v<C>) {
628 return [](
const void *
i,
void *
r) {
645 if constexpr (QContainerInfo::has_iterator_v<C>
646 && QContainerInfo::can_erase_range_at_iterator_v<C> && !std::is_const_v<C>) {
647 return [](
void *
c,
const void *
i,
const void *
j) {
664 if constexpr (QContainerInfo::has_key_type_v<C>)
665 return QtPrivate::qMetaTypeInterfaceForType<typename C::key_type>();
672 if constexpr (QContainerInfo::has_mapped_type_v<C>)
673 return QtPrivate::qMetaTypeInterfaceForType<typename C::mapped_type>();
680 if constexpr (QContainerInfo::can_insert_key_v<C>) {
681 return [](
void *
c,
const void *k) {
685 }
else if constexpr (QContainerInfo::can_insert_pair_v<C>) {
686 return [](
void *
c,
const void *k) {
690 }
else if constexpr (QContainerInfo::can_insert_key_mapped_v<C>) {
691 return [](
void *
c,
const void *k) {
702 if constexpr (QContainerInfo::can_erase_at_key_v<C>) {
703 return [](
void *
c,
const void *k) {
706 }
else if constexpr (QContainerInfo::can_remove_at_key_v<C>) {
707 return [](
void *
c,
const void *k) {
717 if constexpr (QContainerInfo::has_contains_v<C>) {
718 return [](
const void *
c,
const void *k) {
719 return static_cast<const C *
>(
c)->
contains(
722 }
else if (QContainerInfo::has_find_v<C>) {
723 return [](
const void *
c,
const void *k) {
724 const C *container =
static_cast<const C *
>(
c);
725 return container->find(
736 if constexpr (QContainerInfo::has_at_key_v<C>) {
737 return [](
const void *
c,
const void *k,
void *
r) {
739 =
static_cast<const C *
>(
c)->at(
742 }
else if constexpr (QContainerInfo::can_get_at_key_v<C>) {
743 return [](
const void *
c,
const void *k,
void *
r) {
745 = (*
static_cast<const C *
>(
c))[
755 if constexpr (QContainerInfo::can_set_at_key_v<C>) {
756 return [](
void *
c,
const void *k,
const void *
m) {
767 if constexpr (QContainerInfo::has_find_v<C>) {
768 return [](
void *
c,
const void *k) ->
void* {
770 return new Iterator(
static_cast<C *
>(
c)->find(
780 if constexpr (QContainerInfo::has_find_v<C>) {
781 return [](
const void *
c,
const void *k) ->
void* {
783 return new Iterator(
static_cast<const C *
>(
c)->find(
791 template<
typename Iterator>
794 if constexpr (QContainerInfo::iterator_has_key_v<C>) {
795 return [](
const void *
i,
void *k) {
797 =
static_cast<const Iterator *
>(
i)->key();
799 }
else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C>
800 && QContainerInfo::value_type_has_first_v<C>) {
801 return [](
const void *
i,
void *k) {
803 = (*
static_cast<const Iterator *
>(
i))->
first;
805 }
else if constexpr (QContainerInfo::iterator_dereferences_to_key_v<C>) {
806 return [](
const void *
i,
void *k) {
808 = *(*
static_cast<const Iterator *
>(
i));
817 return keyAtIteratorFn<QContainerInfo::iterator<C>>();
822 return keyAtIteratorFn<QContainerInfo::const_iterator<C>>();
825 template<
typename Iterator>
828 if constexpr (QContainerInfo::iterator_has_value_v<C>) {
829 return [](
const void *
i,
void *k) {
831 =
static_cast<const Iterator *
>(
i)->value();
833 }
else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C>
834 && QContainerInfo::value_type_has_second_v<C>) {
835 return [](
const void *
i,
void *k) {
837 = (*
static_cast<const Iterator *
>(
i))->second;
839 }
else if constexpr (QContainerInfo::iterator_dereferences_to_mapped_v<C>) {
840 return [](
const void *
i,
void *k) {
842 = *
static_cast<const Iterator *
>(
i);
851 return mappedAtIteratorFn<QContainerInfo::iterator<C>>();
856 return mappedAtIteratorFn<QContainerInfo::const_iterator<C>>();
861 if constexpr (QContainerInfo::can_set_mapped_at_iterator_v<C> && !std::is_const_v<C>) {
862 return [](
const void *
i,
const void *
m) {
866 }
else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C>
867 && QContainerInfo::value_type_has_second_v<C>) {
868 return [](
const void *
i,
const void *
m) {
892 bool hasInputIterator()
const;
893 bool hasForwardIterator()
const;
894 bool hasBidirectionalIterator()
const;
895 bool hasRandomAccessIterator()
const;
897 bool hasSize()
const;
900 bool canClear()
const;
901 void clear(
void *container)
const;
903 bool hasIterator()
const;
904 void *
begin(
void *container)
const;
905 void *
end(
void *container)
const;
906 void destroyIterator(
const void *iterator)
const;
907 bool compareIterator(
const void *
i,
const void *
j)
const;
908 void copyIterator(
void *
target,
const void *
source)
const;
909 void advanceIterator(
void *iterator,
qsizetype step)
const;
910 qsizetype diffIterator(
const void *
i,
const void *
j)
const;
912 bool hasConstIterator()
const;
913 void *constBegin(
const void *container)
const;
914 void *constEnd(
const void *container)
const;
915 void destroyConstIterator(
const void *iterator)
const;
916 bool compareConstIterator(
const void *
i,
const void *
j)
const;
917 void copyConstIterator(
void *
target,
const void *
source)
const;
918 void advanceConstIterator(
void *iterator,
qsizetype step)
const;
919 qsizetype diffConstIterator(
const void *
i,
const void *
j)
const;
939 bool isSortable()
const;
940 bool canAddValueAtBegin()
const;
941 void addValueAtBegin(
void *container,
const void *
value)
const;
942 bool canAddValueAtEnd()
const;
943 void addValueAtEnd(
void *container,
const void *
value)
const;
944 bool canRemoveValueAtBegin()
const;
945 void removeValueAtBegin(
void *container)
const;
946 bool canRemoveValueAtEnd()
const;
947 void removeValueAtEnd(
void *container)
const;
949 bool canGetValueAtIndex()
const;
952 bool canSetValueAtIndex()
const;
955 bool canAddValue()
const;
956 void addValue(
void *container,
const void *
value)
const;
958 bool canRemoveValue()
const;
959 void removeValue(
void *container)
const;
961 bool canGetValueAtIterator()
const;
962 void valueAtIterator(
const void *iterator,
void *
result)
const;
964 bool canSetValueAtIterator()
const;
965 void setValueAtIterator(
const void *iterator,
const void *
value)
const;
967 bool canInsertValueAtIterator()
const;
968 void insertValueAtIterator(
void *container,
const void *iterator,
const void *
value)
const;
970 bool canEraseValueAtIterator()
const;
971 void eraseValueAtIterator(
void *container,
const void *iterator)
const;
973 bool canEraseRangeAtIterator()
const;
974 void eraseRangeAtIterator(
void *container,
const void *iterator1,
const void *iterator2)
const;
976 bool canGetValueAtConstIterator()
const;
977 void valueAtConstIterator(
const void *iterator,
void *
result)
const;
984 return lhs.d() == rhs.d();
1008 template<
typename T>
1019 if (
auto iface =
d())
1020 return iface->insertKeyFn;
1026 d()->insertKeyFn(container,
key);
1031 if (
auto iface =
d())
1032 return iface->removeKeyFn;
1038 d()->removeKeyFn(container,
key);
1043 if (
auto iface =
d())
1044 return iface->containsKeyFn;
1049 if (canContainsKey())
1050 return d()->containsKeyFn(container,
key);
1057 if (
auto iface =
d())
1058 return iface->mappedAtKeyFn;
1063 if (canGetMappedAtKey())
1064 d()->mappedAtKeyFn(container,
key, mapped);
1069 if (
auto iface =
d())
1070 return iface->setMappedAtKeyFn;
1075 if (canSetMappedAtKey())
1076 d()->setMappedAtKeyFn(container,
key, mapped);
1081 if (
auto iface =
d())
1082 return iface->keyAtIteratorFn;
1088 if (canGetKeyAtIterator())
1089 d()->keyAtIteratorFn(iterator,
key);
1094 if (
auto iface =
d())
1095 return iface->keyAtConstIteratorFn;
1101 if (canGetKeyAtConstIterator())
1102 d()->keyAtConstIteratorFn(iterator,
key);
1107 if (
auto iface =
d())
1108 return iface->mappedAtIteratorFn;
1114 if (canGetMappedAtIterator())
1115 d()->mappedAtIteratorFn(iterator, mapped);
1120 if (
auto iface =
d())
1121 return iface->mappedAtConstIteratorFn;
1127 if (canGetMappedAtConstIterator())
1128 d()->mappedAtConstIteratorFn(iterator, mapped);
1133 if (
auto iface =
d())
1134 return iface->setMappedAtIteratorFn;
1140 if (canSetMappedAtIterator())
1141 d()->setMappedAtIteratorFn(iterator, mapped);
1146 if (
auto iface =
d())
1147 return iface->createIteratorAtKeyFn;
1153 if (canCreateIteratorAtKey())
1154 return d()->createIteratorAtKeyFn(container,
key);
1160 if (
auto iface =
d())
1161 return iface->createConstIteratorAtKeyFn;
1167 if (canCreateConstIteratorAtKey())
1168 return d()->createConstIteratorAtKeyFn(container,
key);
1177 return lhs.d() == rhs.d();
1181 template<
typename T>
1182 struct MetaAssociation
cache insert(employee->id(), employee)
typename C::mapped_type mapped_type
typename C::key_type key_type
typename C::value_type value_type
typename C::iterator iterator
typename C::const_iterator const_iterator
Combined button and popup list for selecting options.
constexpr const QMetaTypeInterface * qMetaTypeInterfaceForType()
qsizetype erase(QByteArray &ba, const T &t)
#define Q_DECLARE_EQUALITY_COMPARABLE(...)
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
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_DECLARE_FLAGS(Flags, Enum)
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
static bool contains(const QJsonArray &haystack, unsigned needle)
GLsizei const GLfloat * v
[13]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLsizei GLsizei GLchar * source
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
settings remove("monkey")