forked from qt-creator/qt-creator
QmlDesigner: Make context menu grouping a single action
- Grouping actions has been merged into one checkable item. - range and view namespaces are available for Utils. Task-number: QDS-8662 Change-Id: I17b2190caf425d0d8271dd68af494dbc2b332f09 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
95
src/libs/utils/ranges.h
Normal file
95
src/libs/utils/ranges.h
Normal file
@@ -0,0 +1,95 @@
|
||||
// Copyright (C) 2023 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||
|
||||
#pragma once
|
||||
|
||||
#if __cplusplus >= 202002L
|
||||
#include <ranges>
|
||||
|
||||
namespace Utils {
|
||||
|
||||
namespace ranges {
|
||||
using std::ranges::reverse_view;
|
||||
}
|
||||
|
||||
namespace views {
|
||||
using std::views::reverse;
|
||||
}
|
||||
|
||||
} // namespace Utils
|
||||
#else
|
||||
#include <stdexcept>
|
||||
|
||||
namespace Utils {
|
||||
|
||||
namespace ranges {
|
||||
|
||||
template <typename Container>
|
||||
class reverse_view
|
||||
{
|
||||
public:
|
||||
using value_type = typename Container::value_type;
|
||||
using size_type = typename Container::size_type;
|
||||
using Type = value_type;
|
||||
using pointer = Type *;
|
||||
using const_pointer = const Type *;
|
||||
using reference = Type &;
|
||||
using const_reference = const Type &;
|
||||
|
||||
using reverse_iterator = typename Container::iterator;
|
||||
using iterator = std::reverse_iterator<reverse_iterator>;
|
||||
|
||||
using const_reverse_iterator = typename Container::const_iterator;
|
||||
using const_iterator = std::reverse_iterator<const_reverse_iterator>;
|
||||
|
||||
using Iterator = iterator;
|
||||
using ConstIterator = const_iterator;
|
||||
|
||||
reverse_view(const Container &k) : d(&k) {}
|
||||
|
||||
const_reverse_iterator rbegin() const noexcept { return d->begin(); }
|
||||
const_reverse_iterator rend() const noexcept { return d->end(); }
|
||||
const_reverse_iterator crbegin() const noexcept { return d->begin(); }
|
||||
const_reverse_iterator crend() const noexcept { return d->end(); }
|
||||
|
||||
const_iterator begin() const noexcept { return const_iterator(rend()); }
|
||||
const_iterator end() const noexcept { return const_iterator(rbegin()); }
|
||||
const_iterator cbegin() const noexcept { return const_iterator(rend()); }
|
||||
const_iterator cend() const noexcept { return const_iterator(rbegin()); }
|
||||
const_iterator constBegin() const noexcept { return const_iterator(rend()); }
|
||||
const_iterator constEnd() const noexcept { return const_iterator(rbegin()); }
|
||||
|
||||
const_reference front() const noexcept { return *cbegin(); }
|
||||
const_reference back() const noexcept { return *crbegin(); }
|
||||
|
||||
[[nodiscard]] size_type size() const noexcept { return d->size(); }
|
||||
[[nodiscard]] bool empty() const noexcept { return d->size() == 0; }
|
||||
explicit operator bool() const { return d->size(); }
|
||||
|
||||
const_reference operator[](size_type idx) const
|
||||
{
|
||||
if (idx < size())
|
||||
return *(begin() + idx);
|
||||
|
||||
throw std::out_of_range("bad index in reverse side");
|
||||
}
|
||||
|
||||
private:
|
||||
const Container *d;
|
||||
};
|
||||
} // namespace ranges
|
||||
|
||||
namespace views {
|
||||
|
||||
constexpr struct {} reverse;
|
||||
|
||||
template <typename T>
|
||||
inline ranges::reverse_view<T> operator|(const T &container, const decltype(reverse)&)
|
||||
{
|
||||
return ranges::reverse_view(container);
|
||||
}
|
||||
|
||||
} // namsepace views
|
||||
} // namespace Utils
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user