File indexing completed on 2024-05-12 16:42:33
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