File indexing completed on 2024-05-12 05:06:40

0001 /*
0002     SPDX-FileCopyrightText: 2002-2011 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "mymoneykeyvaluecontainer.h"
0008 #include "mymoneykeyvaluecontainer_p.h"
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 // ----------------------------------------------------------------------------
0014 // KDE Includes
0015 
0016 // ----------------------------------------------------------------------------
0017 // Project Includes
0018 
0019 #include "mymoneyexception.h"
0020 
0021 Q_GLOBAL_STATIC(QString, nullString)
0022 
0023 QString MyMoneyKeyValueContainerPrivate::toString(bool value) const
0024 {
0025     return value ? QLatin1String("yes") : QLatin1String("no");
0026 }
0027 
0028 QString MyMoneyKeyValueContainerPrivate::toString(int value) const
0029 {
0030     return QStringLiteral("%1").arg(value);
0031 }
0032 
0033 MyMoneyKeyValueContainer::MyMoneyKeyValueContainer() :
0034     d_ptr(new MyMoneyKeyValueContainerPrivate)
0035 {
0036 }
0037 
0038 MyMoneyKeyValueContainer::MyMoneyKeyValueContainer(const MyMoneyKeyValueContainer& other) :
0039     d_ptr(new MyMoneyKeyValueContainerPrivate(*other.d_func()))
0040 {
0041 }
0042 
0043 MyMoneyKeyValueContainer::~MyMoneyKeyValueContainer()
0044 {
0045     Q_D(MyMoneyKeyValueContainer);
0046     delete d;
0047 }
0048 
0049 QString MyMoneyKeyValueContainer::value(const QString& key, const QString& defaultValue) const
0050 {
0051     Q_D(const MyMoneyKeyValueContainer);
0052     QMap<QString, QString>::ConstIterator it;
0053 
0054     it = d->m_kvp.find(key);
0055     if (it != d->m_kvp.end())
0056         return (*it);
0057     return defaultValue;
0058 }
0059 
0060 bool MyMoneyKeyValueContainer::value(const QString& key, bool defaultValue) const
0061 {
0062     Q_D(const MyMoneyKeyValueContainer);
0063     const auto rc = value(key, d->toString(defaultValue)).toLower();
0064     return rc == QLatin1String("yes") ? true : false;
0065 }
0066 
0067 int MyMoneyKeyValueContainer::value(const QString& key, int defaultValue) const
0068 {
0069     Q_D(const MyMoneyKeyValueContainer);
0070     bool ok;
0071     const auto rc = value(key, d->toString(defaultValue)).toInt(&ok, 0);
0072     return ok ? rc : defaultValue;
0073 }
0074 
0075 QString MyMoneyKeyValueContainer::value(const QString& key) const
0076 {
0077     return value(key, *nullString);
0078 }
0079 
0080 void MyMoneyKeyValueContainer::setValue(const QString& key, const QString& value, const QString& defaultValue)
0081 {
0082     Q_D(MyMoneyKeyValueContainer);
0083 
0084     QMap<QString, QString>::Iterator it;
0085 
0086     if (value != defaultValue) {
0087         d->m_kvp[key] = value;
0088     } else {
0089         it = d->m_kvp.find(key);
0090         if (it != d->m_kvp.end()) {
0091             d->m_kvp.erase(it);
0092         }
0093     }
0094 }
0095 
0096 void MyMoneyKeyValueContainer::setValue(const QString& key, const char* value)
0097 {
0098     setValue(key, QLatin1String(value));
0099 }
0100 
0101 void MyMoneyKeyValueContainer::setValue(const QString& key, bool value, bool defaultValue)
0102 {
0103     Q_D(MyMoneyKeyValueContainer);
0104     setValue(key, d->toString(value), d->toString(defaultValue));
0105 }
0106 
0107 void MyMoneyKeyValueContainer::setValue(const QString& key, int value, int defaultValue)
0108 {
0109     Q_D(MyMoneyKeyValueContainer);
0110     setValue(key, d->toString(value), d->toString(defaultValue));
0111 }
0112 
0113 QMap<QString, QString> MyMoneyKeyValueContainer::pairs() const
0114 {
0115     Q_D(const MyMoneyKeyValueContainer);
0116     return d->m_kvp;
0117 }
0118 
0119 void MyMoneyKeyValueContainer::setPairs(const QMap<QString, QString>& list)
0120 {
0121     Q_D(MyMoneyKeyValueContainer);
0122     d->m_kvp = list;
0123 }
0124 
0125 void MyMoneyKeyValueContainer::deletePair(const QString& key)
0126 {
0127     Q_D(MyMoneyKeyValueContainer);
0128     QMap<QString, QString>::Iterator it;
0129 
0130     it = d->m_kvp.find(key);
0131     if (it != d->m_kvp.end())
0132         d->m_kvp.erase(it);
0133 }
0134 
0135 void MyMoneyKeyValueContainer::clear()
0136 {
0137     Q_D(MyMoneyKeyValueContainer);
0138     d->m_kvp.clear();
0139 }
0140 
0141 bool MyMoneyKeyValueContainer::operator == (const MyMoneyKeyValueContainer& right) const
0142 {
0143     Q_D(const MyMoneyKeyValueContainer);
0144     QMap<QString, QString>::ConstIterator it_a, it_b;
0145 
0146     auto d2 = static_cast<const MyMoneyKeyValueContainerPrivate *>(right.d_func());
0147     it_a = d->m_kvp.begin();
0148     it_b = d2->m_kvp.begin();
0149 
0150     while (it_a != d->m_kvp.end() && it_b != d2->m_kvp.end()) {
0151         if (it_a.key() != it_b.key()
0152                 || (((*it_a).length() != 0 || (*it_b).length() != 0) && *it_a != *it_b))
0153             return false;
0154         ++it_a;
0155         ++it_b;
0156     }
0157 
0158     return (it_a == d->m_kvp.end() && it_b == d2->m_kvp.end());
0159 }
0160 
0161 
0162 QString MyMoneyKeyValueContainer::operator[](const QString& k) const
0163 {
0164     return value(k);
0165 }
0166 
0167 QString& MyMoneyKeyValueContainer::operator[](const QString& k)
0168 {
0169     Q_D(MyMoneyKeyValueContainer);
0170     return d->m_kvp[k];
0171 }