7#pragma qt_sync_skip_header_check
8#pragma qt_sync_stop_processing
11#ifndef QCONTAINERTOOLS_IMPL_H
12#define QCONTAINERTOOLS_IMPL_H
14#include <QtCore/qglobal.h>
15#include <QtCore/qtypeinfo.h>
17#include <QtCore/qxptype_traits.h>
35template<
typename T,
typename Cmp = std::less<>>
37 Cmp less = {})
noexcept
39 return !less(
p,
b) && less(
p, e);
48template <
typename C,
typename T>
51 static_assert(std::is_same_v<
decltype(std::data(
c)), T>);
56 std::data(
c) + std::distance(std::begin(
c), std::end(
c)));
62template <typename T, typename N>
65 if constexpr (std::is_nothrow_move_constructible_v<T> || !std::is_copy_constructible_v<T>)
71template <
typename T,
typename N>
75 static_assert(std::is_copy_constructible_v<T> || std::is_move_constructible_v<T>,
76 "Refusing to relocate this non-copy/non-move-constructible type.");
78 std::memcpy(
static_cast<void *
>(
out),
79 static_cast<const void *
>(
first),
104 const auto cast = [](T *
p) {
return reinterpret_cast<uchar*
>(
p); };
105 std::rotate(cast(
first), cast(mid), cast(last));
107 std::rotate(
first, mid, last);
123template <
typename T,
typename Predicate>
126 static_assert(std::is_nothrow_destructible_v<T>,
127 "This algorithm requires that T has a non-throwing destructor");
132 while (
first != last) {
134 new (std::addressof(*
out)) T(*
first);
140 std::destroy(std::reverse_iterator(
out), std::reverse_iterator(dest_begin));
146template<
typename iterator,
typename N>
156 using T =
typename std::iterator_traits<iterator>::value_type;
169 iterator intermediate;
171 Destructor(iterator &
it) noexcept :
iter(std::addressof(
it)),
end(
it) { }
173 void freeze()
noexcept
175 intermediate = *
iter;
176 iter = std::addressof(intermediate);
178 ~Destructor()
noexcept
181 std::advance(*
iter, step);
185 } destroyer(d_first);
187 const iterator d_last = d_first +
n;
192 auto pair = std::minmax(d_last,
first);
196 iterator overlapBegin = pair.first;
197 iterator overlapEnd = pair.second;
200 while (d_first != overlapBegin) {
202 new (std::addressof(*d_first)) T(std::move_if_noexcept(*
first));
212 while (d_first != d_last) {
213 *d_first = std::move_if_noexcept(*
first);
221 while (
first != overlapEnd)
235template<
typename T,
typename N>
238 static_assert(std::is_nothrow_destructible_v<T>,
239 "This algorithm requires that T has a non-throwing destructor");
241 if (
n == N(0) ||
first == d_first ||
first ==
nullptr || d_first ==
nullptr)
245 std::memmove(
static_cast<void *
>(d_first),
static_cast<const void *
>(
first),
n *
sizeof(T));
247 if (d_first <
first) {
250 auto rfirst = std::make_reverse_iterator(
first +
n);
251 auto rd_first = std::make_reverse_iterator(d_first +
n);
264template <
typename Iterator>
266 std::is_convertible<typename std::iterator_traits<Iterator>::iterator_category, std::input_iterator_tag>
::value,
269template <
typename Iterator>
271 std::is_convertible<typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>
::value,
274template <
typename Iterator>
276 !std::is_convertible<typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>
::value,
279template <
typename Container,
280 typename InputIterator,
281 IfIsNotForwardIterator<InputIterator> =
true>
286template <
typename Container,
287 typename ForwardIterator,
288 IfIsForwardIterator<ForwardIterator> =
true>
291 c->reserve(
static_cast<typename Container::size_type
>(std::distance(
f, l)));
294template <
typename Iterator>
296 std::declval<Iterator &>().key(),
297 std::declval<Iterator &>().value()
300template <
typename Iterator>
302 std::declval<Iterator &>()->first,
303 std::declval<Iterator &>()->second
306template <
typename Iterator>
308 std::enable_if_t<qxp::is_detected_v<KeyAndValueTest, Iterator>,
bool>;
310template <
typename Iterator>
314 std::negation<qxp::is_detected<KeyAndValueTest, Iterator>>,
318template <
typename Iterator>
320 std::declval<Iterator &>().operator--()
323template <
typename Iterator>
325 std::enable_if_t<qxp::is_detected_v<MoveBackwardsTest, Iterator>,
bool>;
327template <
typename T,
typename U>
329 typename std::enable_if<!std::is_same<T, U>::value,
bool>
::type;
331template<
typename T,
typename U>
334template <
typename Container,
typename Predicate>
342 const auto cbegin =
c.cbegin();
343 const auto cend =
c.cend();
344 const auto t_it = std::find_if(cbegin, cend, pred);
345 auto result = std::distance(cbegin, t_it);
350 const auto e =
c.end();
361 *dest = std::move(*
it);
366 result = std::distance(dest, e);
371template <
typename Container,
typename T>
375 auto cmp = [&](
auto &e) {
return e ==
t; };
379template <
typename Container,
typename T>
382 using CopyProxy = std::conditional_t<std::is_copy_constructible_v<T>, T,
const T &>;
386template <
typename Container,
typename T>
389 const auto cend =
c.cend();
390 const auto it = std::find(
c.cbegin(), cend,
t);
397template <
typename T,
typename Predicate>
401 auto it =
set.begin();
402 const auto e =
set.end();
416template <
typename R,
typename F,
typename ... ArgTypes>
422template <
typename R,
typename F,
typename ... ArgTypes>
424 std::is_invocable<F, ArgTypes...>,
428template <
typename Container,
typename Predicate>
433 using Iterator =
typename Container::iterator;
434 using Key =
typename Container::key_type;
435 using Value =
typename Container::mapped_type;
436 using KeyValuePair = std::pair<const Key &, Value &>;
438 typename Container::size_type
result = 0;
441 const auto e =
c.end();
443 if constexpr (is_invocable_explicit_r_v<bool, Predicate &, Iterator &>) {
450 }
else if constexpr (is_invocable_explicit_r_v<bool, Predicate &, KeyValuePair &&>) {
451 KeyValuePair
p(
it.key(),
it.value());
452 if (pred(std::move(
p))) {
459 static_assert(
sizeof(Container) == 0,
"Predicate has an incompatible signature");
iterator erase(const_iterator i)
QSet< QString >::iterator it
Combined button and popup list for selecting options.
auto associative_erase_if(Container &c, Predicate &pred)
QT_WARNING_POP void q_rotate(T *first, T *mid, T *last)
void q_uninitialized_relocate_n(T *first, N n, T *out)
std::enable_if_t< std::conjunction_v< std::negation< qxp::is_detected< KeyAndValueTest, Iterator > >, qxp::is_detected< FirstAndSecondTest, Iterator > >, bool > IfAssociativeIteratorHasFirstAndSecond
qsizetype qset_erase_if(QSet< T > &set, Predicate &pred)
QT_WARNING_PUSH void q_uninitialized_move_if_noexcept_n(T *first, N n, T *out)
static constexpr bool q_points_into_range(const T *p, const T *b, const T *e, Cmp less={}) noexcept
decltype( std::declval< Iterator & >().operator--()) MoveBackwardsTest
auto sequential_erase_one(Container &c, const T &t)
typename std::enable_if< std::is_convertible< typename std::iterator_traits< Iterator >::iterator_category, std::input_iterator_tag >::value, bool >::type IfIsInputIterator
std::enable_if_t< qxp::is_detected_v< KeyAndValueTest, Iterator >, bool > IfAssociativeIteratorHasKeyAndValue
void q_relocate_overlap_n_left_move(iterator first, N n, iterator d_first)
std::enable_if_t< qxp::is_detected_v< MoveBackwardsTest, Iterator >, bool > IfIteratorCanMoveBackwards
auto sequential_erase_if(Container &c, Predicate &pred)
typename std::enable_if<!std::is_same< T, U >::value, bool >::type IfIsNotSame
typename std::enable_if< std::is_convertible< typename std::iterator_traits< Iterator >::iterator_category, std::forward_iterator_tag >::value, bool >::type IfIsForwardIterator
auto sequential_erase_with_copy(Container &c, const T &t)
typename std::enable_if< !std::is_convertible< typename std::iterator_traits< Iterator >::iterator_category, std::forward_iterator_tag >::value, bool >::type IfIsNotForwardIterator
auto sequential_erase(Container &c, const T &t)
T * q_uninitialized_remove_copy_if(T *first, T *last, T *out, Predicate &pred)
decltype( std::declval< Iterator & >() ->first, std::declval< Iterator & >() ->second) FirstAndSecondTest
void q_relocate_overlap_n(T *first, N n, T *d_first)
void reserveIfForwardIterator(Container *, InputIterator, InputIterator)
typename std::enable_if<!std::is_convertible< T, U >::value, bool >::type IfIsNotConvertible
decltype( std::declval< Iterator & >().key(), std::declval< Iterator & >().value()) KeyAndValueTest
constexpr bool is_invocable_explicit_r_v
typename _detail::detector< qxp::nonesuch, void, Op, Args... >::value_t is_detected
#define QT_WARNING_DISABLE_GCC(text)
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 * iter
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLboolean GLboolean GLboolean b
GLint GLint GLint GLint GLsizei GLsizei GLsizei GLboolean commit
QFuture< QSet< QChar > > set
[10]
QTextStream out(stdout)
[7]
T * operator->() noexcept