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

0001 /*
0002     SPDX-FileCopyrightText: 2011 Fernando Vilas <fvilas@iname.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "mymoneybalancecache.h"
0007 
0008 // ----------------------------------------------------------------------------
0009 // QT Includes
0010 
0011 // ----------------------------------------------------------------------------
0012 // KDE Includes
0013 
0014 // ----------------------------------------------------------------------------
0015 // Project Includes
0016 
0017 MyMoneyBalanceCacheItem::MyMoneyBalanceCacheItem(const MyMoneyMoney& balance, const QDate& date)
0018     : m_balance(balance), m_date(date)
0019 {}
0020 
0021 const MyMoneyMoney& MyMoneyBalanceCacheItem::balance() const
0022 {
0023     return m_balance;
0024 }
0025 
0026 const QDate& MyMoneyBalanceCacheItem::date() const
0027 {
0028     return m_date;
0029 }
0030 
0031 bool MyMoneyBalanceCacheItem::isValid() const
0032 {
0033     return !(!m_date.isValid() && m_balance == MyMoneyMoney::minValue);
0034 }
0035 
0036 void MyMoneyBalanceCache::clear()
0037 {
0038     m_cache.clear();
0039 }
0040 
0041 void MyMoneyBalanceCache::clear(const QString& accountId)
0042 {
0043     m_cache.remove(accountId);
0044 }
0045 
0046 void MyMoneyBalanceCache::clear(const QString& accountId, const QDate& date)
0047 {
0048     BalanceCacheType::Iterator acctPos = m_cache.find(accountId);
0049     if (m_cache.end() == acctPos)
0050         return;
0051 
0052     // Always remove QDate()
0053     BalanceCacheType::mapped_type::Iterator datePos = (*acctPos).find(QDate());
0054     if ((*acctPos).end() != datePos) {
0055         datePos = (*acctPos).erase(datePos);
0056     }
0057 
0058     // Now look for the actual value and remove it
0059     if (date.isValid()) {
0060         datePos = (*acctPos).lowerBound(date);
0061 
0062         while ((*acctPos).end() != datePos) {
0063             datePos = (*acctPos).erase(datePos);
0064         }
0065     }
0066 }
0067 
0068 bool MyMoneyBalanceCache::isEmpty() const
0069 {
0070     return m_cache.isEmpty();
0071 }
0072 
0073 int MyMoneyBalanceCache::size() const
0074 {
0075     int sum = 0;
0076 
0077     for (BalanceCacheType::ConstIterator i = m_cache.constBegin(); i != m_cache.constEnd(); ++i) {
0078         sum += (*i).size();
0079     }
0080     return sum;
0081 }
0082 
0083 void MyMoneyBalanceCache::insert(const QString& accountId, const QDate& date, const MyMoneyMoney& balance)
0084 {
0085     m_cache[accountId].insert(date, balance);
0086 }
0087 
0088 MyMoneyBalanceCacheItem MyMoneyBalanceCache::balance(const QString& accountId, const QDate& date) const
0089 {
0090     BalanceCacheType::ConstIterator acctPos = m_cache.constFind(accountId);
0091     if (m_cache.constEnd() == acctPos)
0092         return MyMoneyBalanceCacheItem(MyMoneyMoney::minValue, QDate());
0093 
0094     BalanceCacheType::mapped_type::ConstIterator datePos = (*acctPos).constFind(date);
0095 
0096     if ((*acctPos).constEnd() == datePos)
0097         return MyMoneyBalanceCacheItem(MyMoneyMoney::minValue, QDate());
0098 
0099     return MyMoneyBalanceCacheItem(datePos.value(), datePos.key());
0100 }
0101 
0102 MyMoneyBalanceCacheItem MyMoneyBalanceCache::mostRecentBalance(const QString& accountId, const QDate& date) const
0103 {
0104     BalanceCacheType::ConstIterator acctPos = m_cache.constFind(accountId);
0105     if (m_cache.constEnd() == acctPos)
0106         return MyMoneyBalanceCacheItem(MyMoneyMoney::minValue, QDate());
0107 
0108     BalanceCacheType::mapped_type::ConstIterator datePos = (*acctPos).lowerBound(date);
0109 
0110     while ((*acctPos).constEnd() == datePos || ((*acctPos).constBegin() != datePos && datePos.key() > date)) {
0111         --datePos;
0112     }
0113 
0114     if ((*acctPos).constBegin() == datePos && datePos.key() > date)
0115         return MyMoneyBalanceCacheItem(MyMoneyMoney::minValue, QDate());
0116 
0117     return MyMoneyBalanceCacheItem(datePos.value(), datePos.key());
0118 }
0119