// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 //! \file #ifndef SWIFT_MISC_CONTAINERBASE_H #define SWIFT_MISC_CONTAINERBASE_H #include "misc/range.h" #include "misc/predicates.h" #include "misc/json.h" #include "misc/mixin/mixinjson.h" #include "misc/mixin/mixinmetatype.h" #include "misc/mixin/mixindbus.h" #include "misc/mixin/mixinstring.h" #include #include namespace swift::misc { //! Class providing static helper methods for different containers class CContainerHelper { public: //! Stringify value object template static QString stringify(const U &obj, bool i18n) { return obj.toQString(i18n); } //! Stringify int static QString stringify(int n, bool i18n) { return i18n ? QLocale().toString(n) : QString::number(n); } //! Stringify uint static QString stringify(uint n, bool i18n) { return i18n ? QLocale().toString(n) : QString::number(n); } //! Stringify qlonglong static QString stringify(qlonglong n, bool i18n) { return i18n ? QLocale().toString(n) : QString::number(n); } //! Stringify qulonglong static QString stringify(qulonglong n, bool i18n) { return i18n ? QLocale().toString(n) : QString::number(n); } //! Stringify double static QString stringify(double n, bool i18n) { return i18n ? QLocale().toString(n) : QString::number(n); } //! Stringify QString static QString stringify(QString str, bool /*i18n*/) { return str; } //! Stringify pair template static QString stringify(const std::pair &pair, bool i18n) { return stringify(pair.first, i18n) + ":" + stringify(pair.second, i18n); } }; /*! * Base class for CCollection and CSequence adding mutating operations and CValueObject facility on top of CRangeBase. */ template class CContainerBase : public CRangeBase, public mixin::MetaType, public mixin::DBusOperators, public mixin::JsonOperators, public mixin::String { public: //! \copydoc swift::misc::CValueObject::compare friend int compare(const Derived &a, const Derived &b) { for (auto i = a.cbegin(), j = b.cbegin(); i != a.cend() && j != b.cend(); ++i, ++j) { if (*i < *j) { return -1; } if (*j < *i) { return 1; } } if (a.size() < b.size()) { return -1; } if (b.size() < a.size()) { return 1; } return 0; } //! Return a new container of a different type, containing the same elements as this one. //! \tparam Other the type of the new container. template