4#ifndef QMETACONTAINER_H
5#define QMETACONTAINER_H
7#include <QtCore/qcontainerinfo.h>
8#include <QtCore/qflags.h>
9#include <QtCore/qglobal.h>
17class QMetaTypeInterface;
78 template<
typename MetaContainer>
80 : iteratorCapabilities(MetaContainer::getIteratorCapabilities())
81 , sizeFn(MetaContainer::getSizeFn())
82 , clearFn(MetaContainer::getClearFn())
83 , createIteratorFn(MetaContainer::getCreateIteratorFn())
84 , destroyIteratorFn(MetaContainer::getDestroyIteratorFn())
85 , compareIteratorFn(MetaContainer::getCompareIteratorFn())
86 , copyIteratorFn(MetaContainer::getCopyIteratorFn())
87 , advanceIteratorFn(MetaContainer::getAdvanceIteratorFn())
88 , diffIteratorFn(MetaContainer::getDiffIteratorFn())
89 , createConstIteratorFn(MetaContainer::getCreateConstIteratorFn())
90 , destroyConstIteratorFn(MetaContainer::getDestroyConstIteratorFn())
91 , compareConstIteratorFn(MetaContainer::getCompareConstIteratorFn())
92 , copyConstIteratorFn(MetaContainer::getCopyConstIteratorFn())
93 , advanceConstIteratorFn(MetaContainer::getAdvanceConstIteratorFn())
94 , diffConstIteratorFn(MetaContainer::getDiffConstIteratorFn())
131 template<
typename MetaSequence>
188 template<
typename MetaAssociation>
214 template <
typename Iterator>
215 static constexpr IteratorCapabilities capabilitiesForIterator()
217 using Tag =
typename std::iterator_traits<Iterator>::iterator_category;
218 IteratorCapabilities caps {};
219 if constexpr (std::is_base_of_v<std::input_iterator_tag, Tag>)
221 if constexpr (std::is_base_of_v<std::forward_iterator_tag, Tag>)
223 if constexpr (std::is_base_of_v<std::bidirectional_iterator_tag, Tag>)
225 if constexpr (std::is_base_of_v<std::random_access_iterator_tag, Tag>)
230 static constexpr IteratorCapabilities getIteratorCapabilities()
232 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>)
234 else if constexpr (QContainerInfo::has_const_iterator_v<C>)
242 if constexpr (QContainerInfo::has_size_v<C>) {
243 return [](
const void *
c) ->
qsizetype {
return static_cast<const C *
>(
c)->
size(); };
251 if constexpr (QContainerInfo::has_clear_v<C>) {
252 return [](
void *
c) {
return static_cast<C *
>(
c)->
clear(); };
260 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
267 return new Iterator(
static_cast<C *
>(
c)->
begin());
269 return new Iterator(
static_cast<C *
>(
c)->
end());
280 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
281 return [](
const void *
i) {
283 delete static_cast<const Iterator *
>(
i);
292 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
293 return [](
const void *
i,
const void *
j) {
295 return *
static_cast<const Iterator *
>(
i) == *
static_cast<const Iterator *
>(
j);
304 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
305 return [](
void *
i,
const void *
j) {
307 *
static_cast<Iterator *
>(
i) = *
static_cast<const Iterator *
>(
j);
316 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
327 if constexpr (QContainerInfo::has_iterator_v<C> && !std::is_const_v<C>) {
328 return [](
const void *
i,
const void *
j) ->
qsizetype {
339 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
346 return new Iterator(
static_cast<const C *
>(
c)->
begin());
348 return new Iterator(
static_cast<const C *
>(
c)->
end());
359 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
360 return [](
const void *
i) {
362 delete static_cast<const Iterator *
>(
i);
371 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
372 return [](
const void *
i,
const void *
j) {
374 return *
static_cast<const Iterator *
>(
i) == *
static_cast<const Iterator *
>(
j);
383 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
384 return [](
void *
i,
const void *
j) {
386 *
static_cast<Iterator *
>(
i) = *
static_cast<const Iterator *
>(
j);
395 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
406 if constexpr (QContainerInfo::has_const_iterator_v<C>) {
407 return [](
const void *
i,
const void *
j) ->
qsizetype {
418 template<
typename EraseFn>
421 if constexpr (QContainerInfo::has_iterator_v<C>
422 && QContainerInfo::can_erase_at_iterator_v<C> && !std::is_const_v<C>) {
423 return [](
void *
c,
const void *
i) {
439 if constexpr (QContainerInfo::has_value_type_v<C>)
440 return QtPrivate::qMetaTypeInterfaceForType<typename C::value_type>();
445 static constexpr AddRemoveCapabilities getAddRemoveCapabilities()
447 AddRemoveCapabilities caps;
448 if constexpr (QContainerInfo::has_push_back_v<C>)
450 if constexpr (QContainerInfo::has_pop_back_v<C>)
452 if constexpr (QContainerInfo::has_push_front_v<C>)
454 if constexpr (QContainerInfo::has_pop_front_v<C>)
461 if constexpr (QContainerInfo::has_at_index_v<C>) {
464 =
static_cast<const C *
>(
c)->at(
i);
466 }
else if constexpr (QContainerInfo::can_get_at_index_v<C>) {
469 = (*
static_cast<const C *
>(
c))[
i];
478 if constexpr (QContainerInfo::can_set_at_index_v<C>) {
480 (*
static_cast<C *
>(
c))[
i]
490 if constexpr (QContainerInfo::has_push_back_v<C>) {
491 if constexpr (QContainerInfo::has_push_front_v<C>) {
496 static_cast<C *
>(
c)->push_front(
value);
500 static_cast<C *
>(
c)->push_back(
value);
512 static_cast<C *
>(
c)->push_back(
value);
517 }
else if constexpr (QContainerInfo::has_push_front_v<C>) {
523 static_cast<C *
>(
c)->push_front(
value);
528 }
else if constexpr (QContainerInfo::has_insert_v<C>) {
542 if constexpr (QContainerInfo::has_pop_back_v<C>) {
543 if constexpr (QContainerInfo::has_pop_front_v<C>) {
547 static_cast<C *
>(
c)->pop_front();
551 static_cast<C *
>(
c)->pop_back();
562 static_cast<C *
>(
c)->pop_back();
567 }
else if constexpr (QContainerInfo::has_pop_front_v<C>) {
572 static_cast<C *
>(
c)->pop_front();
585 if constexpr (QContainerInfo::has_iterator_v<C>
586 && QContainerInfo::iterator_dereferences_to_value_v<C> && !std::is_const_v<C>) {
587 return [](
const void *
i,
void *
r) {
598 if constexpr (QContainerInfo::has_iterator_v<C>
599 && QContainerInfo::can_set_value_at_iterator_v<C> && !std::is_const_v<C>) {
600 return [](
const void *
i,
const void *
e) {
611 if constexpr (QContainerInfo::has_iterator_v<C>
612 && QContainerInfo::can_insert_value_at_iterator_v<C> && !std::is_const_v<C>) {
613 return [](
void *
c,
const void *
i,
const void *
e) {
625 if constexpr (QContainerInfo::has_const_iterator_v<C>
626 && QContainerInfo::iterator_dereferences_to_value_v<C>) {
627 return [](
const void *
i,
void *
r) {
644 if constexpr (QContainerInfo::has_iterator_v<C>
645 && QContainerInfo::can_erase_range_at_iterator_v<C> && !std::is_const_v<C>) {
646 return [](
void *
c,
const void *
i,
const void *
j) {
663 if constexpr (QContainerInfo::has_key_type_v<C>)
664 return QtPrivate::qMetaTypeInterfaceForType<typename C::key_type>();
671 if constexpr (QContainerInfo::has_mapped_type_v<C>)
672 return QtPrivate::qMetaTypeInterfaceForType<typename C::mapped_type>();
679 if constexpr (QContainerInfo::can_insert_key_v<C>) {
680 return [](
void *
c,
const void *k) {
684 }
else if constexpr (QContainerInfo::can_insert_pair_v<C>) {
685 return [](
void *
c,
const void *k) {
689 }
else if constexpr (QContainerInfo::can_insert_key_mapped_v<C>) {
690 return [](
void *
c,
const void *k) {
701 if constexpr (QContainerInfo::can_erase_at_key_v<C>) {
702 return [](
void *
c,
const void *k) {
705 }
else if constexpr (QContainerInfo::can_remove_at_key_v<C>) {
706 return [](
void *
c,
const void *k) {
716 if constexpr (QContainerInfo::has_contains_v<C>) {
717 return [](
const void *
c,
const void *k) {
718 return static_cast<const C *
>(
c)->
contains(
721 }
else if (QContainerInfo::has_find_v<C>) {
722 return [](
const void *
c,
const void *k) {
723 const C *container =
static_cast<const C *
>(
c);
724 return container->find(
735 if constexpr (QContainerInfo::has_at_key_v<C>) {
736 return [](
const void *
c,
const void *k,
void *
r) {
738 =
static_cast<const C *
>(
c)->at(
741 }
else if constexpr (QContainerInfo::can_get_at_key_v<C>) {
742 return [](
const void *
c,
const void *k,
void *
r) {
744 = (*
static_cast<const C *
>(
c))[
754 if constexpr (QContainerInfo::can_set_at_key_v<C>) {
755 return [](
void *
c,
const void *k,
const void *
m) {
766 if constexpr (QContainerInfo::has_find_v<C>) {
767 return [](
void *
c,
const void *k) ->
void* {
769 return new Iterator(
static_cast<C *
>(
c)->find(
779 if constexpr (QContainerInfo::has_find_v<C>) {
780 return [](
const void *
c,
const void *k) ->
void* {
782 return new Iterator(
static_cast<const C *
>(
c)->find(
790 template<
typename Iterator>
793 if constexpr (QContainerInfo::iterator_has_key_v<C>) {
794 return [](
const void *
i,
void *k) {
796 =
static_cast<const Iterator *
>(
i)->key();
798 }
else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C>
799 && QContainerInfo::value_type_has_first_v<C>) {
800 return [](
const void *
i,
void *k) {
802 = (*
static_cast<const Iterator *
>(
i))->
first;
804 }
else if constexpr (QContainerInfo::iterator_dereferences_to_key_v<C>) {
805 return [](
const void *
i,
void *k) {
807 = *(*
static_cast<const Iterator *
>(
i));
816 return keyAtIteratorFn<QContainerInfo::iterator<C>>();
821 return keyAtIteratorFn<QContainerInfo::const_iterator<C>>();
824 template<
typename Iterator>
827 if constexpr (QContainerInfo::iterator_has_value_v<C>) {
828 return [](
const void *
i,
void *k) {
830 =
static_cast<const Iterator *
>(
i)->value();
832 }
else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C>
833 && QContainerInfo::value_type_has_second_v<C>) {
834 return [](
const void *
i,
void *k) {
836 = (*
static_cast<const Iterator *
>(
i))->second;
838 }
else if constexpr (QContainerInfo::iterator_dereferences_to_mapped_v<C>) {
839 return [](
const void *
i,
void *k) {
841 = *
static_cast<const Iterator *
>(
i);
850 return mappedAtIteratorFn<QContainerInfo::iterator<C>>();
855 return mappedAtIteratorFn<QContainerInfo::const_iterator<C>>();
860 if constexpr (QContainerInfo::can_set_mapped_at_iterator_v<C> && !std::is_const_v<C>) {
861 return [](
const void *
i,
const void *
m) {
865 }
else if constexpr (QContainerInfo::iterator_dereferences_to_value_v<C>
866 && QContainerInfo::value_type_has_second_v<C>) {
867 return [](
const void *
i,
const void *
m) {
891 bool hasInputIterator()
const;
892 bool hasForwardIterator()
const;
893 bool hasBidirectionalIterator()
const;
894 bool hasRandomAccessIterator()
const;
896 bool hasSize()
const;
899 bool canClear()
const;
900 void clear(
void *container)
const;
902 bool hasIterator()
const;
903 void *
begin(
void *container)
const;
904 void *
end(
void *container)
const;
905 void destroyIterator(
const void *iterator)
const;
906 bool compareIterator(
const void *
i,
const void *
j)
const;
907 void copyIterator(
void *
target,
const void *
source)
const;
908 void advanceIterator(
void *iterator,
qsizetype step)
const;
909 qsizetype diffIterator(
const void *
i,
const void *
j)
const;
911 bool hasConstIterator()
const;
912 void *constBegin(
const void *container)
const;
913 void *constEnd(
const void *container)
const;
914 void destroyConstIterator(
const void *iterator)
const;
915 bool compareConstIterator(
const void *
i,
const void *
j)
const;
916 void copyConstIterator(
void *
target,
const void *
source)
const;
917 void advanceConstIterator(
void *iterator,
qsizetype step)
const;
918 qsizetype diffConstIterator(
const void *
i,
const void *
j)
const;
938 bool isSortable()
const;
939 bool canAddValueAtBegin()
const;
940 void addValueAtBegin(
void *container,
const void *
value)
const;
941 bool canAddValueAtEnd()
const;
942 void addValueAtEnd(
void *container,
const void *
value)
const;
943 bool canRemoveValueAtBegin()
const;
944 void removeValueAtBegin(
void *container)
const;
945 bool canRemoveValueAtEnd()
const;
946 void removeValueAtEnd(
void *container)
const;
948 bool canGetValueAtIndex()
const;
951 bool canSetValueAtIndex()
const;
954 bool canAddValue()
const;
955 void addValue(
void *container,
const void *
value)
const;
957 bool canRemoveValue()
const;
958 void removeValue(
void *container)
const;
960 bool canGetValueAtIterator()
const;
961 void valueAtIterator(
const void *iterator,
void *
result)
const;
963 bool canSetValueAtIterator()
const;
964 void setValueAtIterator(
const void *iterator,
const void *
value)
const;
966 bool canInsertValueAtIterator()
const;
967 void insertValueAtIterator(
void *container,
const void *iterator,
const void *
value)
const;
969 bool canEraseValueAtIterator()
const;
970 void eraseValueAtIterator(
void *container,
const void *iterator)
const;
972 bool canEraseRangeAtIterator()
const;
973 void eraseRangeAtIterator(
void *container,
const void *iterator1,
const void *iterator2)
const;
975 bool canGetValueAtConstIterator()
const;
976 void valueAtConstIterator(
const void *iterator,
void *
result)
const;
980 return a.d() ==
b.d();
984 return a.d() !=
b.d();
1010 template<
typename T>
1021 if (
auto iface =
d())
1022 return iface->insertKeyFn;
1028 d()->insertKeyFn(container,
key);
1033 if (
auto iface =
d())
1034 return iface->removeKeyFn;
1040 d()->removeKeyFn(container,
key);
1045 if (
auto iface =
d())
1046 return iface->containsKeyFn;
1051 if (canContainsKey())
1052 return d()->containsKeyFn(container,
key);
1059 if (
auto iface =
d())
1060 return iface->mappedAtKeyFn;
1065 if (canGetMappedAtKey())
1066 d()->mappedAtKeyFn(container,
key, mapped);
1071 if (
auto iface =
d())
1072 return iface->setMappedAtKeyFn;
1077 if (canSetMappedAtKey())
1078 d()->setMappedAtKeyFn(container,
key, mapped);
1083 if (
auto iface =
d())
1084 return iface->keyAtIteratorFn;
1090 if (canGetKeyAtIterator())
1091 d()->keyAtIteratorFn(iterator,
key);
1096 if (
auto iface =
d())
1097 return iface->keyAtConstIteratorFn;
1103 if (canGetKeyAtConstIterator())
1104 d()->keyAtConstIteratorFn(iterator,
key);
1109 if (
auto iface =
d())
1110 return iface->mappedAtIteratorFn;
1116 if (canGetMappedAtIterator())
1117 d()->mappedAtIteratorFn(iterator, mapped);
1122 if (
auto iface =
d())
1123 return iface->mappedAtConstIteratorFn;
1129 if (canGetMappedAtConstIterator())
1130 d()->mappedAtConstIteratorFn(iterator, mapped);
1135 if (
auto iface =
d())
1136 return iface->setMappedAtIteratorFn;
1142 if (canSetMappedAtIterator())
1143 d()->setMappedAtIteratorFn(iterator, mapped);
1148 if (
auto iface =
d())
1149 return iface->createIteratorAtKeyFn;
1155 if (canCreateIteratorAtKey())
1156 return d()->createIteratorAtKeyFn(container,
key);
1162 if (
auto iface =
d())
1163 return iface->createConstIteratorAtKeyFn;
1169 if (canCreateConstIteratorAtKey())
1170 return d()->createConstIteratorAtKeyFn(container,
key);
1176 return a.d() ==
b.d();
1180 return a.d() !=
b.d();
1186 template<
typename T>
1187 struct MetaAssociation
cache insert(employee->id(), employee)
typename C::value_type value_type
typename C::const_iterator const_iterator
typename C::key_type key_type
typename C::mapped_type mapped_type
typename C::iterator iterator
Combined button and popup list for selecting options.
constexpr const QMetaTypeInterface * qMetaTypeInterfaceForType()
qsizetype erase(QByteArray &ba, const T &t)
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)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLboolean GLboolean GLboolean GLboolean a
[7]
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")