diff options
| author | 2016-07-31 20:45:22 -0400 | |
|---|---|---|
| committer | 2016-08-03 02:32:22 -0400 | |
| commit | 7d08b0c3d7e1d4450bcb8a96abc7518c5a115917 (patch) | |
| tree | 82c407f0ce531cc4c2fe2a82ed45bb2b171f5251 | |
| parent | KviMenubar: ensure Actions entry has an Icon at least. (diff) | |
| download | KVIrc-7d08b0c3d7e1d4450bcb8a96abc7518c5a115917.tar.gz KVIrc-7d08b0c3d7e1d4450bcb8a96abc7518c5a115917.tar.bz2 KVIrc-7d08b0c3d7e1d4450bcb8a96abc7518c5a115917.zip | |
Part 1: Bring KVIrc to the 21st century
Avoid many un-necessary memory allocations as well as start
the migration to unique pointers where appropriate.
Start migrating out of the KVirc standard library into the C++ standard
library.
62 files changed, 1229 insertions, 1553 deletions
diff --git a/src/kvilib/core/KviPtrListIterator.h b/src/kvilib/core/KviPtrListIterator.h new file mode 100644 index 000000000..6ef974bf4 --- /dev/null +++ b/src/kvilib/core/KviPtrListIterator.h @@ -0,0 +1,73 @@ +#ifndef _KVI_PTR_LIST_ITERATOR_H_ +#define _KVI_PTR_LIST_ITERATOR_H_ +//============================================================================= +// +// File : KviPtrListIterator.h +// Creation date : Tue July 30 2016 06:18:52 by Matt Ullman +// +// This file is part of the KVIrc IRC client distribution +// Copyright (C) 2016 Matt Ullman (staticfox at staticfox dot net) +// +// This program is FREE software. You can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the HOPE that it will be USEFUL, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + +#include "KviPointerList.h" + +template<typename T> +class KviPtrListIterator { + + KviPointerList<T> * ptrList; + T * c; + +public: + + explicit KviPtrListIterator(KviPointerList<T> * ptrList, T *c) + : ptrList(ptrList), + c(c) + { + } + + T &operator*() const + { + return *this->c; + } + + KviPtrListIterator &operator++() + { + this->c = this->ptrList->next(); + return *this; + } + + inline bool operator!=(const KviPtrListIterator & other) const + { + return this->c != other.c; + } + +}; + +template<typename T> +inline KviPtrListIterator<T> begin(KviPointerList<T> * ptrList) +{ + return KviPtrListIterator<T>(ptrList, ptrList->first()); +} + +template<typename T> +inline KviPtrListIterator<T> end(KviPointerList<T> * ptrList) +{ + return KviPtrListIterator<T>(ptrList, nullptr); +} + +#endif diff --git a/src/kvirc/kernel/KviAction.cpp b/src/kvirc/kernel/KviAction.cpp index 92053adce..7fedefba8 100644 --- a/src/kvirc/kernel/KviAction.cpp +++ b/src/kvirc/kernel/KviAction.cpp @@ -52,7 +52,6 @@ KviAction::KviAction(QObject * pParent, const QString & szName, const QString & m_szBigIconId(szBigIconId), m_szSmallIconId(szSmallIconId), m_eSmallIcon(KviIconManager::None), - m_pActionList(nullptr), m_uInternalFlags(KviAction::Enabled), m_uFlags(uFlags), m_szKeySequence(szKeySequence), @@ -68,7 +67,6 @@ KviAction::KviAction(QObject * pParent, const QString & szName, const QString & m_pCategory(pCategory), m_szBigIconId(szBigIconId), m_eSmallIcon(eSmallIcon), - m_pActionList(nullptr), m_uInternalFlags(KviAction::Enabled), m_uFlags(uFlags), m_szKeySequence(szKeySequence), @@ -78,13 +76,8 @@ KviAction::KviAction(QObject * pParent, const QString & szName, const QString & KviAction::~KviAction() { - if(m_pActionList) - { - for(QAction * pAction = m_pActionList->first(); pAction; pAction = m_pActionList->next()) - disconnect(pAction, SIGNAL(destroyed()), this, SLOT(actionDestroyed())); - m_pActionList->setAutoDelete(true); - delete m_pActionList; - } + for(auto & pActionPair : m_pActionList) + disconnect(pActionPair.second.get(), SIGNAL(destroyed()), this, SLOT(actionDestroyed())); if(m_pAccel) unregisterAccelerator(); @@ -142,25 +135,13 @@ void KviAction::setEnabled(bool bEnabled) else m_uInternalFlags &= ~KviAction::Enabled; - if(m_pActionList) + for(auto & pActionPair : m_pActionList) { - if(bEnabled) - { - for(QAction * pAction = m_pActionList->first(); pAction; pAction = m_pActionList->next()) - { - if(!pAction->isEnabled()) - pAction->setEnabled(true); - } - } - else - { - for(QAction * pAction = m_pActionList->first(); pAction; pAction = m_pActionList->next()) - { - if(pAction->isEnabled()) - pAction->setEnabled(false); - } - } + auto & pAction = pActionPair.second; + if (pAction->isEnabled() != bEnabled) + pAction->setEnabled(bEnabled); } + } int KviAction::validateFlags(int iFlagsToValidate) @@ -250,7 +231,7 @@ void KviAction::setup() void KviAction::reloadImages() { - if(!m_pActionList) + if(m_pActionList.empty()) return; QPixmap * pBigPix = bigIcon(); @@ -264,8 +245,9 @@ void KviAction::reloadImages() bool bIconVisibleInMenu = KVI_OPTION_BOOL(KviOption_boolShowIconsInPopupMenus); - for(QAction * pAction = m_pActionList->first(); pAction; pAction = m_pActionList->next()) + for(auto & pActionPair : m_pActionList) { + auto & pAction = pActionPair.second; pAction->setIcon(icon); pAction->setIconVisibleInMenu(bIconVisibleInMenu); } @@ -552,21 +534,21 @@ bool KviAction::addToPopupMenu(QMenu * pMenu) void KviAction::actionDestroyed() { - if(!m_pActionList) - return; QAction * pAction = (QAction *)sender(); - m_pActionList->removeRef(pAction); + + auto upAction = m_pActionList.find(pAction); + + // Qt will clean this up (presumably) + if (upAction != m_pActionList.end()) + upAction->second.release(); + + m_pActionList.erase(pAction); } void KviAction::registerAction(QAction * pAction) { connect(pAction, SIGNAL(destroyed()), this, SLOT(actionDestroyed())); - if(!m_pActionList) - { - m_pActionList = new KviPointerList<QAction>; - m_pActionList->setAutoDelete(false); - } - m_pActionList->append(pAction); + m_pActionList.emplace(pAction, std::unique_ptr<QAction>(pAction)); } QAction * KviAction::addToCustomToolBar(KviCustomToolBar * pParentToolBar) diff --git a/src/kvirc/kernel/KviAction.h b/src/kvirc/kernel/KviAction.h index 048fb5453..9ec4efe72 100644 --- a/src/kvirc/kernel/KviAction.h +++ b/src/kvirc/kernel/KviAction.h @@ -31,13 +31,16 @@ */ #include "kvi_settings.h" -#include "KviPointerList.h" #include "KviIconManager.h" #include <QObject> #include <QPointer> #include <QShortcut> +#include <memory> +#include <unordered_map> +#include <vector> + class QShortcut; class QPixmap; class QMenu; @@ -78,19 +81,19 @@ public: * \brief Returns the name of the category * \return const QString & */ - const QString & name() { return m_szName; }; + const QString & name() const { return m_szName; }; /** * \brief Returns the visible name of the category * \return const QString & */ - const QString & visibleName() { return m_szVisibleName; }; + const QString & visibleName() const { return m_szVisibleName; }; /** * \brief Returns the description of the category * \return const QString & */ - const QString & description() { return m_szDescription; }; + const QString & description() const { return m_szDescription; }; }; /** @@ -200,7 +203,7 @@ protected: QString m_szBigIconId; QString m_szSmallIconId; // this is alternative to m_eSmallIcon KviIconManager::SmallIcon m_eSmallIcon; - KviPointerList<QAction> * m_pActionList; + std::unordered_map<QAction *, std::unique_ptr<QAction>> m_pActionList; unsigned short int m_uInternalFlags; unsigned int m_uFlags; QString m_szKeySequence; @@ -329,9 +332,9 @@ protected: /** * \brief Returns the list of actions associated to the action - * \return KviPointerList<QAction> * + * \return std::unordered_map<QAction *, std::unique_ptr<QAction>> */ - KviPointerList<QAction> * actionList() { return m_pActionList; }; + std::unordered_map<QAction *, std::unique_ptr<QAction>> const & actionList() const { return m_pActionList; }; /** * \brief Registers the action shortcut in the application diff --git a/src/kvirc/kernel/KviApplication.cpp b/src/kvirc/kernel/KviApplication.cpp index 2a06fe4ff..37b3a062d 100644 --- a/src/kvirc/kernel/KviApplication.cpp +++ b/src/kvirc/kernel/KviApplication.cpp @@ -85,8 +85,10 @@ #include "KviQueryWindow.h" #include "KviCaster.h" #include "KviSignalHandler.h" +#include "KviPtrListIterator.h" #include <QMenu> +#include <algorithm> #ifndef COMPILE_NO_IPC #include "KviIpcSentinel.h" @@ -147,6 +149,7 @@ DO NOT REMOVE THEM EVEN IF THEY ARE DEFINED ALSO IN KviApplication.h #include <stdlib.h> // rand & srand #include <time.h> // time() in srand() +#include <map> // std::map<> // Global application pointer KVIRC_API KviApplication * g_pApp = nullptr; @@ -160,7 +163,7 @@ KVIRC_API KviColorWindow * g_pColorWindow = nullptr; KVIRC_API KviTextIconWindow * g_pTextIconWindow = nullptr; KVIRC_API QMenu * g_pInputPopup = nullptr; KVIRC_API QStringList * g_pRecentTopicList = nullptr; -KVIRC_API KviPointerHashTable<QString, KviWindow> * g_pGlobalWindowDict = nullptr; +KVIRC_API std::map<QString, KviWindow *> g_pGlobalWindowDict; KVIRC_API KviMediaManager * g_pMediaManager = nullptr; KVIRC_API KviSharedFilesManager * g_pSharedFilesManager = nullptr; KVIRC_API KviNickServRuleSet * g_pNickServRuleSet = nullptr; @@ -208,7 +211,6 @@ KviApplication::KviApplication(int & argc, char ** argv) m_szConfigFile = QString(); m_bCreateConfig = false; m_bUpdateGuiPending = false; - m_pPendingAvatarChanges = nullptr; m_pRecentChannelDict = nullptr; #ifndef COMPILE_NO_IPC m_pIpcSentinel = nullptr; @@ -442,9 +444,6 @@ void KviApplication::setup() // create the server parser g_pServerParser = new KviIrcServerParser(); - // Global window dictionary - g_pGlobalWindowDict = new KviPointerHashTable<QString, KviWindow>(41); - g_pGlobalWindowDict->setAutoDelete(false); // Script object controller //g_pScriptObjectController = new KviScriptObjectController(); gone @@ -580,7 +579,7 @@ KviApplication::~KviApplication() KviCustomToolBarManager::done(); savePopups(); saveAliases(); - delete g_pGlobalWindowDict; + g_pGlobalWindowDict.clear(); saveScriptAddons(); // kill the remaining resources delete g_pColorWindow; @@ -596,8 +595,7 @@ KviApplication::~KviApplication() #ifdef COMPILE_PSEUDO_TRANSPARENCY destroyPseudoTransparency(); #endif - if(m_pPendingAvatarChanges) - delete m_pPendingAvatarChanges; + m_PendingAvatarChanges.clear(); KviAnimatedPixmapCache::done(); // Kill the thread manager.... all the slave threads should have been already terminated ... #ifdef COMPILE_SSL_SUPPORT @@ -1084,15 +1082,11 @@ void KviApplication::ipcMessage(char * pcMessage) void KviApplication::setAvatarFromOptions() { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.current()); + KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.second); if(pWindow) pWindow->setAvatarFromOptions(); - - ++it; } } @@ -1103,25 +1097,19 @@ void KviApplication::setAvatarOnFileReceived( const QString & szUser, const QString & szHost) { - if(!m_pPendingAvatarChanges) + if(m_PendingAvatarChanges.size() >= KVI_MAX_PENDING_AVATARS) // can't be... { - m_pPendingAvatarChanges = new KviPointerList<KviPendingAvatarChange>; - m_pPendingAvatarChanges->setAutoDelete(true); + m_PendingAvatarChanges.erase(m_PendingAvatarChanges.begin()); // kill the first entry } - if(m_pPendingAvatarChanges->count() >= KVI_MAX_PENDING_AVATARS) // can't be... - { - m_pPendingAvatarChanges->removeFirst(); // kill the first entry - } - - KviPendingAvatarChange * pAvatar = new KviPendingAvatarChange; + std::unique_ptr<KviPendingAvatarChange> pAvatar(new KviPendingAvatarChange()); pAvatar->pConsole = pConsole; pAvatar->szRemoteUrl = szRemoteUrl; pAvatar->szNick = szNick; pAvatar->szUser = szUser; pAvatar->szHost = szHost; - m_pPendingAvatarChanges->append(pAvatar); + m_PendingAvatarChanges.emplace(pAvatar.get(), std::move(pAvatar)); } KviPendingAvatarChange * KviApplication::findPendingAvatarChange( @@ -1129,13 +1117,9 @@ KviPendingAvatarChange * KviApplication::findPendingAvatarChange( const QString & szNick, const QString & szRemoteUrl) { - if(!m_pPendingAvatarChanges) - return nullptr; - - KviPendingAvatarChange * pAvatar; - - for(pAvatar = m_pPendingAvatarChanges->first(); pAvatar; pAvatar = m_pPendingAvatarChanges->next()) + for(auto & upAvatarPair : m_PendingAvatarChanges) { + KviPendingAvatarChange * pAvatar = upAvatarPair.second.get(); if(!pConsole || (pAvatar->pConsole == pConsole)) { if(szNick.isNull() || (szNick == pAvatar->szNick)) @@ -1157,14 +1141,10 @@ void KviApplication::fileDownloadTerminated( const QString & szError, bool bQuiet) { - KviPendingAvatarChange * pAvatar; - if(m_pPendingAvatarChanges) - pAvatar = findPendingAvatarChange(nullptr, szNick, szRemoteUrl); - else - pAvatar = nullptr; + KviPendingAvatarChange * pAvatar = findPendingAvatarChange(nullptr, szNick, szRemoteUrl); - if(!pAvatar) + if(pAvatar == nullptr) { // signal dcc completion only for NON-avatars // FIXME: This option is misnamed and misplaced in the options dialog :( @@ -1227,13 +1207,7 @@ void KviApplication::fileDownloadTerminated( } } - m_pPendingAvatarChanges->removeRef(pAvatar); - - if(m_pPendingAvatarChanges->count() == 0) - { - delete m_pPendingAvatarChanges; - m_pPendingAvatarChanges = nullptr; - } + m_PendingAvatarChanges.erase(pAvatar); } #ifdef COMPILE_PSEUDO_TRANSPARENCY @@ -1585,12 +1559,12 @@ void KviApplication::autoConnectToServers() KviPointerList<KviIrcServer> * pList = g_pServerDataBase->autoConnectOnStartupServers(); if(pList) { - for(KviIrcServer * pServer = pList->first(); pServer; pServer = pList->next()) + for(auto & pServer : pList) { QString szCommand = "server -u \"id:"; - if(pServer->id().isEmpty()) - pServer->generateUniqueId(); - szCommand += pServer->id(); + if(pServer.id().isEmpty()) + pServer.generateUniqueId(); + szCommand += pServer.id(); szCommand += "\""; KviKvsScript::run(szCommand, activeConsole()); } @@ -1600,10 +1574,10 @@ void KviApplication::autoConnectToServers() KviPointerList<KviIrcNetwork> * pListNet = g_pServerDataBase->autoConnectOnStartupNetworks(); if(pListNet) { - for(KviIrcNetwork * pNetwork = pListNet->first(); pNetwork; pNetwork = pListNet->next()) + for(auto & pNetwork : pListNet) { QString szCommandx = "server -u \"net:"; - szCommandx += pNetwork->name(); + szCommandx += pNetwork.name(); szCommandx += "\""; KviKvsScript::run(szCommandx, activeConsole()); } @@ -1649,47 +1623,36 @@ void KviApplication::createFrame() bool KviApplication::connectionExists(KviIrcConnection * pConn) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - if(it.current()->connection() == pConn) + if(it.second->connection() == pConn) return true; - ++it; } return false; } bool KviApplication::windowExists(KviWindow * pWnd) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - if(it.current() == pWnd) + if(it.second == pWnd) return true; - ++it; } return false; } unsigned int KviApplication::windowCount() { - return g_pGlobalWindowDict->count(); + return g_pGlobalWindowDict.size(); } KviConsoleWindow * KviApplication::findConsole(QString & szServer, QString & szNick) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.current()); + KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.second); if(!(pWindow && pWindow->type() == KviWindow::Console && pWindow->isConnected())) - { - ++it; continue; - } if(!szServer.isEmpty()) { @@ -1710,61 +1673,47 @@ KviConsoleWindow * KviApplication::findConsole(QString & szServer, QString & szN return pWindow; } } - - ++it; } return nullptr; } void KviApplication::restartLagMeters() { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.current()); + KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.second); if(pWindow && pWindow->type() == KviWindow::Console && pWindow->connection()) pWindow->connection()->restartLagMeter(); - ++it; } } void KviApplication::restartNotifyLists() { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.current()); + KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.second); if(pWindow && pWindow->type() == KviWindow::Console && pWindow->connection()) pWindow->connection()->restartNotifyList(); - ++it; } } void KviApplication::resetAvatarForMatchingUsers(KviRegisteredUser * pUser) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.current()); + KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.second); if(pWindow && pWindow->type() == KviWindow::Console) pWindow->resetAvatarForMatchingUsers(pUser); - ++it; } } KviConsoleWindow * KviApplication::findConsole(unsigned int uIrcContextId) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.current()); + KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.second); if(pWindow && pWindow->context()->id() == uIrcContextId) return pWindow; - ++it; } return nullptr; } @@ -1781,14 +1730,11 @@ KviConsoleWindow * KviApplication::topmostConnectedConsole() // try ANY connected console - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.current()); + KviConsoleWindow * pWindow = dynamic_cast<KviConsoleWindow *>(it.second); if(pWindow && pWindow->type() == KviWindow::Console && pWindow->isConnected()) return pWindow; - ++it; } return nullptr; @@ -1796,30 +1742,28 @@ KviConsoleWindow * KviApplication::topmostConnectedConsole() KviWindow * KviApplication::findWindow(const QString & szWindowId) { - return g_pGlobalWindowDict->find(szWindowId); + return g_pGlobalWindowDict.find(szWindowId)->second; } KviWindow * KviApplication::findWindowByCaption(const QString & szWindowCaption, int iContextId) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - if(KviQString::equalCI(szWindowCaption, it.current()->plainTextCaption()) && (iContextId == -1 || it.current()->context()->id() == static_cast<uint>(iContextId))) - return it.current(); - ++it; + if(KviQString::equalCI(szWindowCaption, it.second->plainTextCaption()) && (iContextId == -1 || it.second->context()->id() == static_cast<uint>(iContextId))) + return it.second; } + return nullptr; } void KviApplication::registerWindow(KviWindow * pWnd) { - g_pGlobalWindowDict->insert(pWnd->id(), pWnd); + g_pGlobalWindowDict.emplace(pWnd->id(), pWnd); } void KviApplication::unregisterWindow(KviWindow * pWnd) { - g_pGlobalWindowDict->remove(pWnd->id()); + g_pGlobalWindowDict.erase(pWnd->id()); } KviConsoleWindow * KviApplication::activeConsole() @@ -2029,12 +1973,10 @@ void KviApplication::heartbeat(kvi_time_t tNow) if(pTm && !pTm->tm_hour && !pTm->tm_min && !pTm->tm_sec) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(it.current()) + for(auto & it : g_pGlobalWindowDict) { - if(it.current()->view() && it.current()->view()->isLogging()) - it.current()->view()->startLogging(nullptr); - ++it; + if(it.second->view() && it.second->view()->isLogging()) + it.second->view()->startLogging(nullptr); } } } diff --git a/src/kvirc/kernel/KviApplication.h b/src/kvirc/kernel/KviApplication.h index 84cc73df3..7a56598d2 100644 --- a/src/kvirc/kernel/KviApplication.h +++ b/src/kvirc/kernel/KviApplication.h @@ -35,6 +35,10 @@ #include <QFont> #include <QStringList> +#include <memory> +#include <unordered_map> +#include <vector> + #ifdef COMPILE_KDE_SUPPORT #include <KAboutData> #endif @@ -161,7 +165,7 @@ protected: #endif KviWindow * m_pActiveWindow; bool m_bUpdateGuiPending; - KviPointerList<KviPendingAvatarChange> * m_pPendingAvatarChanges; + std::unordered_map<KviPendingAvatarChange *, std::unique_ptr<KviPendingAvatarChange>> m_PendingAvatarChanges; bool m_bSetupDone; KviPointerHashTable<QString, QStringList> * m_pRecentChannelDict; #ifdef COMPILE_PSEUDO_TRANSPARENCY @@ -258,7 +262,7 @@ public: bool mapImageFile(QString & szRetPath, const QString & filename); //void getDefaultDccSaveFilePath(KviCString &path,const char *filename); - void completeDirectory(const QString & word, KviPointerList<QString> * matches); + void completeDirectory(const QString & word, std::vector<QString> & matches); // // Returns a config path suitable for reading (at least) // First lookups the user local config directory, diff --git a/src/kvirc/kernel/KviApplication_filesystem.cpp b/src/kvirc/kernel/KviApplication_filesystem.cpp index e3cc1ca8a..cf43993f3 100644 --- a/src/kvirc/kernel/KviApplication_filesystem.cpp +++ b/src/kvirc/kernel/KviApplication_filesystem.cpp @@ -324,7 +324,7 @@ void KviApplication::getTmpFileName(QString & szBuffer, const QString & szEnding } while(KviFileUtils::fileExists(szBuffer)); } -void KviApplication::completeDirectory(const QString & word, KviPointerList<QString> * matches) +void KviApplication::completeDirectory(const QString & word, std::vector<QString> & matches) { QString szDir = word; QString szFile = word; @@ -338,49 +338,35 @@ void KviApplication::completeDirectory(const QString & word, KviPointerList<QStr QStringList sl = d.entryList(QDir::Dirs); QStringList::Iterator it; - for(it = sl.begin(); it != sl.end(); ++it) + for(auto & t : sl) { - QString * t = new QString(*it); - if(KviQString::equalCS(*t, ".") || KviQString::equalCS(*t, "..")) - { - delete t; - } - else + if(!KviQString::equalCS(t, ".") && !KviQString::equalCS(t, "..")) { #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) - if(KviQString::equalCIN(szFile, *t, szFile.length())) + if(KviQString::equalCIN(szFile, t, szFile.length())) #else - if(KviQString::equalCSN(szFile, *t, szFile.length())) + if(KviQString::equalCSN(szFile, t, szFile.length())) #endif { - t->prepend(szDir); - t->append(KVI_PATH_SEPARATOR_CHAR); - matches->append(t); - } - else - { - delete t; + t.prepend(szDir); + t.append(KVI_PATH_SEPARATOR_CHAR); + matches.push_back(std::move(t)); } } } sl = d.entryList(QDir::Files); - for(it = sl.begin(); it != sl.end(); ++it) + for(auto & t : sl) { - QString * t = new QString(*it); #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) - if(KviQString::equalCIN(szFile, *t, szFile.length())) + if(KviQString::equalCIN(szFile, t, szFile.length())) #else - if(KviQString::equalCSN(szFile, *t, szFile.length())) + if(KviQString::equalCSN(szFile, t, szFile.length())) #endif { - t->prepend(szDir); - matches->append(t); - } - else - { - delete t; + t.prepend(szDir); + matches.push_back(std::move(t)); } } } diff --git a/src/kvirc/kernel/KviCoreActions.cpp b/src/kvirc/kernel/KviCoreActions.cpp index a2ad3d7a1..c15b86823 100644 --- a/src/kvirc/kernel/KviCoreActions.cpp +++ b/src/kvirc/kernel/KviCoreActions.cpp @@ -484,34 +484,30 @@ QAction * KviIrcContextDisplayAction::addToCustomToolBar(KviCustomToolBar * t) void KviIrcContextDisplayAction::activeContextChanged() { - if(m_pActionList) + for(auto & a : m_pActionList) { - for(QAction * a = m_pActionList->first(); a; a = m_pActionList->next()) + auto & pAction = a.second; + QToolBar * t = (QToolBar *)pAction->parentWidget(); + if(t) { - QToolBar * t = (QToolBar *)a->parentWidget(); - if(t) - { - KviIrcContextDisplay * w = (KviIrcContextDisplay *)t->widgetForAction(a); - if(w) - w->update(); - } + KviIrcContextDisplay * w = (KviIrcContextDisplay *)t->widgetForAction(pAction.get()); + if(w) + w->update(); } } } void KviIrcContextDisplayAction::activeContextStateChanged() { - if(m_pActionList) + for(auto & a : m_pActionList) { - for(QAction * a = m_pActionList->first(); a; a = m_pActionList->next()) + auto & pAction = a.second; + QToolBar * t = (QToolBar *)pAction->parentWidget(); + if(t) { - QToolBar * t = (QToolBar *)a->parentWidget(); - if(t) - { - KviIrcContextDisplay * w = (KviIrcContextDisplay *)t->widgetForAction(a); - if(w) - w->update(); - } + KviIrcContextDisplay * w = (KviIrcContextDisplay *)t->widgetForAction(pAction.get()); + if(w) + w->update(); } } } @@ -579,8 +575,8 @@ void KviConnectAction::activeContextChanged() void KviConnectAction::activeContextStateChanged() { - KviPointerList<QAction> * bl = actionList(); - if(!bl) + std::unordered_map<QAction *, std::unique_ptr<QAction>> const & bl = actionList(); + if(bl.empty()) return; bool bIconVisibleInMenu = KVI_OPTION_BOOL(KviOption_boolShowIconsInPopupMenus); @@ -617,22 +613,24 @@ void KviConnectAction::activeContextStateChanged() if(p) { - for(QAction * b = bl->first(); b; b = bl->next()) + for(auto & b : bl) { - if(!b->isEnabled()) - b->setEnabled(true); - b->setIcon(QIcon(*p)); - b->setText(txt); - b->setIconVisibleInMenu(bIconVisibleInMenu); + auto & pAction = b.second; + if(!pAction->isEnabled()) + pAction->setEnabled(true); + pAction->setIcon(QIcon(*p)); + pAction->setText(txt); + pAction->setIconVisibleInMenu(bIconVisibleInMenu); } } else { - for(QAction * b = bl->first(); b; b = bl->next()) + for(auto & b : bl) { - if(b->isEnabled()) - b->setEnabled(false); - b->setIconVisibleInMenu(bIconVisibleInMenu); + auto & pAction = b.second; + if(pAction->isEnabled()) + pAction->setEnabled(false); + pAction->setIconVisibleInMenu(bIconVisibleInMenu); } } } @@ -1082,8 +1080,8 @@ void KviGoAwayAction::activeContextChanged() void KviGoAwayAction::activeContextStateChanged() { - KviPointerList<QAction> * bl = actionList(); - if(!bl) + std::unordered_map<QAction *, std::unique_ptr<QAction>> const & bl = actionList(); + if(bl.empty()) return; bool bIconVisibleInMenu = KVI_OPTION_BOOL(KviOption_boolShowIconsInPopupMenus); @@ -1117,28 +1115,30 @@ void KviGoAwayAction::activeContextStateChanged() if(p) { - for(QAction * b = bl->first(); b; b = bl->next()) + for(auto & b : bl) { - if(!b->isEnabled()) - b->setEnabled(true); - b->setIcon(QIcon(*p)); - b->setText(txt); - b->setIconVisibleInMenu(bIconVisibleInMenu); + auto & pAction = b.second; + if(!pAction->isEnabled()) + pAction->setEnabled(true); + pAction->setIcon(QIcon(*p)); + pAction->setText(txt); + pAction->setIconVisibleInMenu(bIconVisibleInMenu); } m_uInternalFlags |= KviAction::Enabled; - setEnabled(true); } else { - for(QAction * b = bl->first(); b; b = bl->next()) + for(auto & b : bl) { - if(b->isEnabled()) - b->setEnabled(false); - b->setIconVisibleInMenu(bIconVisibleInMenu); + auto & pAction = b.second; + if(pAction->isEnabled()) + pAction->setEnabled(false); + pAction->setIconVisibleInMenu(bIconVisibleInMenu); } m_uInternalFlags &= ~KviAction::Enabled; - setEnabled(true); } + + setEnabled(true); } void KviGoAwayAction::setup() diff --git a/src/kvirc/kernel/KviCoreActions.h b/src/kvirc/kernel/KviCoreActions.h index dc650dbce..2b1990c1b 100644 --- a/src/kvirc/kernel/KviCoreActions.h +++ b/src/kvirc/kernel/KviCoreActions.h @@ -27,7 +27,6 @@ #include "kvi_settings.h" #include "KviAction.h" #include "KviKvsAction.h" -#include "KviPointerList.h" class KviConnectAction : public KviAction { diff --git a/src/kvirc/kernel/KviFileTransfer.cpp b/src/kvirc/kernel/KviFileTransfer.cpp index ee12a704e..7130752bb 100644 --- a/src/kvirc/kernel/KviFileTransfer.cpp +++ b/src/kvirc/kernel/KviFileTransfer.cpp @@ -30,13 +30,14 @@ #include "KviApplication.h" #include <QMenu> +#include <algorithm> +#include <vector> static KviFileTransferManager * g_pFileTransferManager = nullptr; KviFileTransferManager::KviFileTransferManager() : QObject() { - m_pTransferList = nullptr; m_pTransferWindow = nullptr; } @@ -65,30 +66,16 @@ void KviFileTransferManager::cleanup() void KviFileTransferManager::killAllTransfers() { - while(m_pTransferList) - { - KviFileTransfer * t = m_pTransferList->first(); + for(auto & t : m_pTransferList) t->die(); - } } void KviFileTransferManager::killTerminatedTransfers() { - if(m_pTransferList) + for(auto & f : m_pTransferList) { - KviPointerList<KviFileTransfer> l; - l.setAutoDelete(false); - - for(KviFileTransfer * f = m_pTransferList->first(); f; f = m_pTransferList->next()) - { - if(f->terminated()) - { - l.append(f); - } - } - - for(KviFileTransfer * d = l.first(); d; d = l.next()) - d->die(); + if(f->terminated()) + f->die(); } } @@ -107,33 +94,22 @@ void KviFileTransferManager::invokeTransferWindow(bool bCreateMinimized, bool bN void KviFileTransferManager::registerTransfer(KviFileTransfer * t) { - if(!m_pTransferList) - { - m_pTransferList = new KviPointerList<KviFileTransfer>; - m_pTransferList->setAutoDelete(false); - } - - m_pTransferList->append(t); + m_pTransferList.push_back(t); emit transferRegistered(t); } void KviFileTransferManager::unregisterTransfer(KviFileTransfer * t) { - if(!m_pTransferList) + if(m_pTransferList.empty()) { - qDebug("Ops: unregistering transfer with no transfer list!"); + qDebug("Oops: unregistering transfer with no transfer list!"); return; } emit transferUnregistering(t); - m_pTransferList->removeRef(t); - if(m_pTransferList->isEmpty()) - { - delete m_pTransferList; - m_pTransferList = nullptr; - } + m_pTransferList.erase(std::remove(m_pTransferList.begin(), m_pTransferList.end(), t), m_pTransferList.end()); } KviFileTransfer::KviFileTransfer() diff --git a/src/kvirc/kernel/KviFileTransfer.h b/src/kvirc/kernel/KviFileTransfer.h index 987be987f..7fa0a1012 100644 --- a/src/kvirc/kernel/KviFileTransfer.h +++ b/src/kvirc/kernel/KviFileTransfer.h @@ -25,10 +25,10 @@ //============================================================================= #include "kvi_settings.h" -#include "KviPointerList.h" #include "KviTalTableWidget.h" #include <QObject> +#include <vector> class KviFileTransfer; class KviWindow; @@ -49,7 +49,7 @@ public: ~KviFileTransferManager(); protected: - KviPointerList<KviFileTransfer> * m_pTransferList; + std::vector<KviFileTransfer *> m_pTransferList; KviWindow * m_pTransferWindow; protected: @@ -61,7 +61,7 @@ public: // might be zero! KviWindow * transferWindow() { return m_pTransferWindow; }; static KviFileTransferManager * instance(); - KviPointerList<KviFileTransfer> * transferList() { return m_pTransferList; }; + std::vector<KviFileTransfer *> transferList() { return m_pTransferList; }; void invokeTransferWindow(bool bCreateMinimized = false, bool bNoRaise = false); void killAllTransfers(); void killTerminatedTransfers(); diff --git a/src/kvirc/kernel/KviIrcConnection.cpp b/src/kvirc/kernel/KviIrcConnection.cpp index 98de9796d..1409871ed 100644 --- a/src/kvirc/kernel/KviIrcConnection.cpp +++ b/src/kvirc/kernel/KviIrcConnection.cpp @@ -81,10 +81,6 @@ KviIrcConnection::KviIrcConnection(KviIrcContext * pContext, KviIrcConnectionTar m_pConsole = pContext->console(); m_pTarget = pTarget; m_pUserIdentity = pIdentity; - m_pChannelList = new KviPointerList<KviChannelWindow>; - m_pChannelList->setAutoDelete(false); - m_pQueryList = new KviPointerList<KviQueryWindow>; - m_pQueryList->setAutoDelete(false); m_pLink = new KviIrcLink(this); m_pUserDataBase = new KviIrcUserDataBase(); m_pUserInfo = new KviIrcConnectionUserInfo(); @@ -129,8 +125,6 @@ KviIrcConnection::~KviIrcConnection() m_pLagMeter = nullptr; delete m_pLink; // <-- this MAY trigger a linkTerminated() or something like this! - delete m_pChannelList; - delete m_pQueryList; delete m_pTarget; delete m_pUserDataBase; delete m_pUserInfo; @@ -166,7 +160,7 @@ void KviIrcConnection::setEncoding(const QString & szEncoding) } QString szTmp = c->name(); - for(KviChannelWindow * ch = m_pChannelList->first(); ch; ch = m_pChannelList->next()) + for(auto & ch : m_pChannelList) { if((ch->textCodec() != c) && (ch->textCodec() != ch->defaultTextCodec())) // actually not using the default! { @@ -176,7 +170,7 @@ void KviIrcConnection::setEncoding(const QString & szEncoding) } } - for(KviQueryWindow * q = m_pQueryList->first(); q; q = m_pQueryList->next()) + for(auto & q : m_pQueryList) { if((q->textCodec() != c) && (q->textCodec() != q->defaultTextCodec())) // actually not using the default! { @@ -305,11 +299,8 @@ void KviIrcConnection::linkEstablished() m_pServerInfo->setNetworkName(target()->network()->name()); // FIXME: With STARTTLS this is called TWICE! - if(KviPointerList<KviIrcDataStreamMonitor> * l = context()->monitorList()) - { - for(KviIrcDataStreamMonitor * m = l->first(); m; m = l->next()) - m->connectionInitiated(); - } + for(auto & m : context()->monitorList()) + m->connectionInitiated(); // FIXME: With STARTTLS this is called TWICE! context()->connectionEstablished(); @@ -544,11 +535,8 @@ void KviIrcConnection::linkTerminated() delete m_pLagMeter; m_pLagMeter = nullptr; - if(KviPointerList<KviIrcDataStreamMonitor> * l = context()->monitorList()) - { - for(KviIrcDataStreamMonitor * m = l->first(); m; m = l->next()) - m->connectionTerminated(); - } + for(auto & m : context()->monitorList()) + m->connectionTerminated(); // Prepare data for an eventual reconnect context()->connectionTerminated(); @@ -567,7 +555,7 @@ void KviIrcConnection::linkAttemptFailed(int iError) KviChannelWindow * KviIrcConnection::findChannel(const QString & szName) { - for(KviChannelWindow * c = m_pChannelList->first(); c; c = m_pChannelList->next()) + for(auto & c : m_pChannelList) { if(KviQString::equalCI(szName, c->windowName())) return c; @@ -578,7 +566,7 @@ KviChannelWindow * KviIrcConnection::findChannel(const QString & szName) int KviIrcConnection::getCommonChannels(const QString & szNick, QString & szChansBuffer, bool bAddEscapeSequences) { int iCount = 0; - for(KviChannelWindow * c = m_pChannelList->first(); c; c = m_pChannelList->next()) + for(auto & c : m_pChannelList) { if(c->isOn(szNick)) { @@ -605,30 +593,30 @@ int KviIrcConnection::getCommonChannels(const QString & szNick, QString & szChan void KviIrcConnection::unhighlightAllChannels() { - for(KviChannelWindow * c = m_pChannelList->first(); c; c = m_pChannelList->next()) + for(auto & c : m_pChannelList) c->unhighlight(); } void KviIrcConnection::unhighlightAllQueries() { - for(KviQueryWindow * c = m_pQueryList->first(); c; c = m_pQueryList->next()) + for(auto & c : m_pQueryList) c->unhighlight(); } void KviIrcConnection::closeAllChannels() { - while(m_pChannelList->first()) + for(auto & c : m_pChannelList) { - m_pChannelList->first()->close(); + c->close(); QApplication::processEvents(QEventLoop::ExcludeSocketNotifiers | QEventLoop::ExcludeUserInputEvents); } } void KviIrcConnection::closeAllQueries() { - while(m_pQueryList->first()) + for(auto & q : m_pQueryList) { - m_pQueryList->first()->close(); + q->close(); QApplication::processEvents(QEventLoop::ExcludeSocketNotifiers | QEventLoop::ExcludeUserInputEvents); } } @@ -697,17 +685,17 @@ KviQueryWindow * KviIrcConnection::createQuery(const QString & szNick, CreateQue KviQueryWindow * KviIrcConnection::findQuery(const QString & szName) { - for(KviQueryWindow * c = m_pQueryList->first(); c; c = m_pQueryList->next()) + for(auto & q : m_pQueryList) { - if(KviQString::equalCI(szName, c->windowName())) - return c; + if(KviQString::equalCI(szName, q->windowName())) + return q; } return nullptr; } void KviIrcConnection::registerChannel(KviChannelWindow * c) { - m_pChannelList->append(c); + m_pChannelList.push_back(c); if(KVI_OPTION_BOOL(KviOption_boolLogChannelHistory)) g_pApp->addRecentChannel(c->windowName(), m_pServerInfo->networkName()); emit(channelRegistered(c)); @@ -716,7 +704,7 @@ void KviIrcConnection::registerChannel(KviChannelWindow * c) void KviIrcConnection::unregisterChannel(KviChannelWindow * c) { - m_pChannelList->removeRef(c); + m_pChannelList.erase(std::remove(m_pChannelList.begin(), m_pChannelList.end(), c), m_pChannelList.end()); requestQueue()->dequeueChannel(c); emit(channelUnregistered(c)); emit(chanListChanged()); @@ -724,19 +712,19 @@ void KviIrcConnection::unregisterChannel(KviChannelWindow * c) void KviIrcConnection::registerQuery(KviQueryWindow * q) { - m_pQueryList->append(q); + m_pQueryList.push_back(q); } void KviIrcConnection::unregisterQuery(KviQueryWindow * q) { - if(m_pQueryList->removeRef(q)) - return; + m_pQueryList.erase(std::remove(m_pQueryList.begin(), m_pQueryList.end(), q), m_pQueryList.end()); } void KviIrcConnection::keepChannelsOpenAfterDisconnect() { - while(KviChannelWindow * c = m_pChannelList->first()) + while(!m_pChannelList.empty()) { + KviChannelWindow * c = m_pChannelList.front(); c->outputNoFmt(KVI_OUT_SOCKETERROR, __tr2qs("Connection to server lost")); c->setDeadChan(); } @@ -744,8 +732,9 @@ void KviIrcConnection::keepChannelsOpenAfterDisconnect() void KviIrcConnection::keepQueriesOpenAfterDisconnect() { - while(KviQueryWindow * q = m_pQueryList->first()) + while(!m_pQueryList.empty()) { + KviQueryWindow * q = m_pQueryList.front(); q->outputNoFmt(KVI_OUT_SOCKETERROR, __tr2qs("Connection to server lost")); q->setDeadQuery(); } @@ -804,13 +793,10 @@ bool KviIrcConnection::sendFmtData(const char * pcFmt, ...) QString szMsg = QString::fromLatin1((const char *)(pData->data()), iLen - 2); // notify the monitors - if(KviPointerList<KviIrcDataStreamMonitor> * l = context()->monitorList()) + for(auto & m : context()->monitorList()) { - for(KviIrcDataStreamMonitor * m = l->first(); m; m = l->next()) - { - if(m->outgoingMessage(szMsg.toLatin1().data())) - return true; - } + if(m->outgoingMessage(szMsg.toLatin1().data())) + return true; } // Trigger OnOutboundTraffic event @@ -839,13 +825,10 @@ bool KviIrcConnection::sendData(const char * pcBuffer, int iBuflen) szMsg.truncate(iBuflen); // notify the monitors - if(KviPointerList<KviIrcDataStreamMonitor> * l = context()->monitorList()) + for(auto & m : context()->monitorList()) { - for(KviIrcDataStreamMonitor * m = l->first(); m; m = l->next()) - { - if(m->outgoingMessage(szMsg.toUtf8().data())) - return true; - } + if(m->outgoingMessage(szMsg.toUtf8().data())) + return true; } // Trigger OnOutboundTraffic event @@ -1683,7 +1666,7 @@ bool KviIrcConnection::changeUserMode(char cMode, bool bSet) void KviIrcConnection::gatherChannelAndPasswordPairs(QList<QPair<QString, QString>> & lChannelsAndPasses) { - for(KviChannelWindow * c = m_pChannelList->first(); c; c = m_pChannelList->next()) + for(auto & c : m_pChannelList) lChannelsAndPasses.append( QPair<QString, QString>( c->windowName(), @@ -1692,7 +1675,7 @@ void KviIrcConnection::gatherChannelAndPasswordPairs(QList<QPair<QString, QStrin void KviIrcConnection::gatherQueryNames(QStringList & lQueryNames) { - for(KviQueryWindow * q = m_pQueryList->first(); q; q = m_pQueryList->next()) + for(auto & q : m_pQueryList) lQueryNames.append(q->target()); } @@ -1942,13 +1925,10 @@ void KviIrcConnection::incomingMessage(const char * pcMessage) { // A message has arrived from the current server // First of all, notify the monitors - if(KviPointerList<KviIrcDataStreamMonitor> * l = context()->monitorList()) + for(auto & m : context()->monitorList()) { - for(KviIrcDataStreamMonitor * m = l->first(); m; m = l->next()) - { - if(m->incomingMessage(pcMessage)) - return; - } + if(m->incomingMessage(pcMessage)) + return; } // set the last message time m_pStatistics->setLastMessageTime(kvi_unixTime()); @@ -1986,7 +1966,7 @@ void KviIrcConnection::heartbeat(kvi_time_t tNow) // find the channel that has the older list now kvi_time_t tOldest = tNow; KviChannelWindow * pOldest = nullptr; - for(KviChannelWindow * pChan = m_pChannelList->first(); pChan; pChan = m_pChannelList->next()) + for(auto & pChan : m_pChannelList) { if(pChan->lastReceivedWhoReply() < tOldest) { diff --git a/src/kvirc/kernel/KviIrcConnection.h b/src/kvirc/kernel/KviIrcConnection.h index ba19fe70f..8637de3a9 100644 --- a/src/kvirc/kernel/KviIrcConnection.h +++ b/src/kvirc/kernel/KviIrcConnection.h @@ -32,7 +32,6 @@ #include "kvi_settings.h" #include "KviQString.h" -#include "KviPointerList.h" #include "KviTimeUtils.h" #include <QObject> @@ -41,6 +40,8 @@ #include <QList> #include <QPair> +#include <vector> + class QTimer; class QTextCodec; class KviConsoleWindow; @@ -160,8 +161,8 @@ private: KviIrcConnectionStateData * m_pStateData; // owned, never null - KviPointerList<KviChannelWindow> * m_pChannelList; // owned, never null, elements shallow - KviPointerList<KviQueryWindow> * m_pQueryList; // owned, never null, elements shallow + std::vector<KviChannelWindow *> m_pChannelList; // owned, never null, elements shallow + std::vector<KviQueryWindow *> m_pQueryList; // owned, never null, elements shallow KviIrcUserDataBase * m_pUserDataBase; // owned, never null @@ -188,7 +189,7 @@ public: * The pointer is never NULL * \return KviConsoleWindow * */ - inline KviConsoleWindow * console() { return m_pConsole; }; + KviConsoleWindow * console() { return m_pConsole; }; /** * \brief Returns a pointer to the owning KviIrcContext. @@ -196,7 +197,7 @@ public: * The returned value is never NULL * \return KviIrcContext * */ - inline KviIrcContext * context() { return m_pContext; }; + KviIrcContext * context() { return m_pContext; }; /** * \brief Returns the target of this connection. @@ -206,7 +207,7 @@ public: * The returned pointer is never NULL. * \return KviIrcConnectionTarget * */ - inline KviIrcConnectionTarget * target() { return m_pTarget; }; + KviIrcConnectionTarget * target() { return m_pTarget; }; /** * \brief Returns the underlying KviIrcLink object @@ -214,13 +215,13 @@ public: * The returned pointer is never NULL. * \return KviIrcLink * */ - inline KviIrcLink * link() { return m_pLink; }; + KviIrcLink * link() { return m_pLink; }; /** * \brief Returns the current state of the connection * \return State */ - inline State state() { return m_eState; }; + State state() { return m_eState; }; /** * \brief Returns a pointer to the big connection user database. @@ -229,7 +230,7 @@ public: * The returned pointer is never NULL. * \return KviIrcUserDataBase * */ - inline KviIrcUserDataBase * userDataBase() { return m_pUserDataBase; }; + KviIrcUserDataBase * userDataBase() { return m_pUserDataBase; }; /** * \brief Returns a pointer to the KviIrcConnectionUserInfo object @@ -242,7 +243,7 @@ public: * forwarded here. * \return KviIrcConnectionUserInfo * */ - inline KviIrcConnectionUserInfo * userInfo() { return m_pUserInfo; }; + KviIrcConnectionUserInfo * userInfo() { return m_pUserInfo; }; /** * \brief Returns a pointer to the KviIrcConnectionServerInfo object @@ -256,7 +257,7 @@ public: * forwarded here. * \return KviIrcConnectionServerInfo * */ - inline KviIrcConnectionServerInfo * serverInfo() { return m_pServerInfo; }; + KviIrcConnectionServerInfo * serverInfo() { return m_pServerInfo; }; /** * \brief Returns a pointer to the KviIrcConnectionStateData object @@ -270,7 +271,7 @@ public: * forwarded here. * \return KviIrcConnectionStateData * */ - inline KviIrcConnectionStateData * stateData() { return m_pStateData; }; + KviIrcConnectionStateData * stateData() { return m_pStateData; }; /** * \brief Returns a pointer to the KviIrcConnectionAntiCtcpFloodData object @@ -282,7 +283,7 @@ public: * only forwarded here. * \return KviIrcConnectionAntiCtcpFloodData * */ - inline KviIrcConnectionAntiCtcpFloodData * antiCtcpFloodData() + KviIrcConnectionAntiCtcpFloodData * antiCtcpFloodData() { return m_pAntiCtcpFloodData; }; @@ -297,7 +298,7 @@ public: * only forwarded here. * \return KviIrcConnectionNetsplitDetectorData * */ - inline KviIrcConnectionNetsplitDetectorData * netsplitDetectorData() + KviIrcConnectionNetsplitDetectorData * netsplitDetectorData() { return m_pNetsplitDetectorData; }; @@ -312,7 +313,7 @@ public: * forwarded here. * \return KviIrcConnectionAsyncWhoisData * */ - inline KviIrcConnectionAsyncWhoisData * asyncWhoisData() + KviIrcConnectionAsyncWhoisData * asyncWhoisData() { return m_pAsyncWhoisData; }; @@ -327,7 +328,7 @@ public: * forwarded here. * \return KviIrcConnectionStatistics * */ - inline KviIrcConnectionStatistics * statistics() { return m_pStatistics; }; + KviIrcConnectionStatistics * statistics() { return m_pStatistics; }; /** * \brief Returns a pointer to the current KviNotifyListManager. @@ -336,7 +337,7 @@ public: * the current connection. * \return KviNotifyListManager * */ - inline KviNotifyListManager * notifyListManager() + KviNotifyListManager * notifyListManager() { return m_pNotifyListManager; }; @@ -348,21 +349,21 @@ public: * current connection. * \return KviLagMeter * */ - inline KviLagMeter * lagMeter() { return m_pLagMeter; }; + KviLagMeter * lagMeter() { return m_pLagMeter; }; /** * \brief Returns a pointer to the current KviIrcConnectionRequestQueue. * \return KviIrcConnectionRequestQueue * */ - inline KviIrcConnectionRequestQueue * requestQueue() { return m_pRequestQueue; }; + KviIrcConnectionRequestQueue * requestQueue() { return m_pRequestQueue; }; /** * \brief Returns the list of the channels bound to the current connection. * * The pointer itself is never null (though the list may be empty). - * \return KviPointerList<KviChannelWindow> * + * \return & std::vector<KviChannelWindow *> */ - inline KviPointerList<KviChannelWindow> * channelList() { return m_pChannelList; }; + std::vector<KviChannelWindow *> & channelList() { return m_pChannelList; }; /** * \brief Helper that provides a shortcut for really common access to serverInfo()->networkName() @@ -491,9 +492,9 @@ public: * \brief Returns the list of the currently open queries. * * The returned pointer is never NULL (the list may be empty though). - * \return KviPointerList<KviQueryWindow> * + * \return std::vector<KviQueryWindow *> & */ - inline KviPointerList<KviQueryWindow> * queryList() { return m_pQueryList; }; + std::vector<KviQueryWindow *> & queryList() { return m_pQueryList; }; /// /// Visibility mode for createQuery() @@ -666,7 +667,7 @@ public: * windows. The returned pointer may be null if things really went wrong. * \return QTextCodec * */ - inline QTextCodec * textCodec() { return m_pTextCodec; }; + QTextCodec * textCodec() { return m_pTextCodec; }; /** * \brief Returns a pointer to the current global codec for inbound data. @@ -675,7 +676,7 @@ public: * windows. The returned pointer may be null if things really went wrong. * \return QTextCodec * */ - inline QTextCodec * serverCodec() { return m_pSrvCodec; }; + QTextCodec * serverCodec() { return m_pSrvCodec; }; /** * \brief Sets the global encoding for this connection. diff --git a/src/kvirc/kernel/KviIrcContext.cpp b/src/kvirc/kernel/KviIrcContext.cpp index badbd81a8..8cc5b11f9 100644 --- a/src/kvirc/kernel/KviIrcContext.cpp +++ b/src/kvirc/kernel/KviIrcContext.cpp @@ -53,11 +53,13 @@ #include "KviIrcUrl.h" #include "KviUserIdentity.h" #include "KviUserIdentityManager.h" +#include "KviPtrListIterator.h" #include "kvi_debug.h" #include <QTimer> #include <QByteArray> +#include <algorithm> // the irc context identifiers start from 1 static unsigned int g_uNextIrcContextId = 1; @@ -75,10 +77,6 @@ KviIrcContext::KviIrcContext(KviConsoleWindow * pConsole) m_pConnection = nullptr; - m_pDeadChannels = nullptr; - m_pDeadQueries = nullptr; - m_pContextWindows = nullptr; - m_pLinksWindow = nullptr; m_pListWindow = nullptr; @@ -87,7 +85,6 @@ KviIrcContext::KviIrcContext(KviConsoleWindow * pConsole) m_pAsynchronousConnectionData = nullptr; m_pSavedAsynchronousConnectionData = nullptr; m_uConnectAttemptCount = 0; - m_pMonitorList = nullptr; m_pReconnectTimer = nullptr; m_uConnectAttemptCount = 1; @@ -99,16 +96,10 @@ KviIrcContext::~KviIrcContext() { killTimer(m_iHeartbeatTimerId); - while(m_pMonitorList) + for(auto & m : m_pMonitorList) { - KviIrcDataStreamMonitor * m = m_pMonitorList->first(); if(m) m->die(); - else - { - delete m_pMonitorList; - m_pMonitorList = nullptr; - } } if(m_pReconnectTimer) @@ -132,197 +123,151 @@ KviIrcContext::~KviIrcContext() void KviIrcContext::registerDataStreamMonitor(KviIrcDataStreamMonitor * m) { - if(!m_pMonitorList) - { - m_pMonitorList = new KviPointerList<KviIrcDataStreamMonitor>; - m_pMonitorList->setAutoDelete(false); - } - m_pMonitorList->append(m); + m_pMonitorList.push_back(m); } void KviIrcContext::unregisterDataStreamMonitor(KviIrcDataStreamMonitor * m) { - if(!m_pMonitorList) + if(m_pMonitorList.empty()) return; - m_pMonitorList->removeRef(m); - if(m_pMonitorList->isEmpty()) - { - delete m_pMonitorList; - m_pMonitorList = nullptr; - } + + m_pMonitorList.erase(std::remove(m_pMonitorList.begin(), m_pMonitorList.end(), m), m_pMonitorList.end()); } void KviIrcContext::closeAllDeadChannels() { - while(m_pDeadChannels) + for(auto & c : m_DeadChannels) { - KviChannelWindow * c = m_pDeadChannels->first(); - if(c) - { - g_pMainWindow->closeWindow(c); - } - else - { - // ops.... - delete m_pDeadChannels; - m_pDeadChannels = nullptr; - } + KviChannelWindow * chan = static_cast<KviChannelWindow *>(c); + g_pMainWindow->closeWindow(chan); } } void KviIrcContext::closeAllDeadQueries() { - while(m_pDeadQueries) + for(auto & q : m_DeadQueries) { - KviQueryWindow * q = m_pDeadQueries->first(); - if(q) - { - g_pMainWindow->closeWindow(q); - } - else - { - // ops.... - delete m_pDeadQueries; - m_pDeadQueries = nullptr; - } + KviQueryWindow * qWin = static_cast<KviQueryWindow *>(q); + g_pMainWindow->closeWindow(qWin); } } void KviIrcContext::closeAllContextWindows() { - while(m_pContextWindows) + for(auto & w : m_ContextWindows) { - KviWindow * w = m_pContextWindows->first(); - if(w) - { - g_pMainWindow->closeWindow(w); - } - else - { - // ops... - delete m_pContextWindows; - m_pContextWindows = nullptr; - } + KviWindow * wWin = static_cast<KviWindow *>(w); + g_pMainWindow->closeWindow(wWin); } } KviChannelWindow * KviIrcContext::findDeadChannel(const QString & name) { - if(!m_pDeadChannels) + if(m_DeadChannels.empty()) return nullptr; - for(KviChannelWindow * c = m_pDeadChannels->first(); c; c = m_pDeadChannels->next()) + + for(auto & c : m_DeadChannels) { KVI_ASSERT(c->isDeadChan()); if(KviQString::equalCI(name, c->windowName())) return c; } + return nullptr; } KviQueryWindow * KviIrcContext::findDeadQuery(const QString & name) { - if(!m_pDeadQueries) + if(m_DeadQueries.empty()) return nullptr; - for(KviQueryWindow * c = m_pDeadQueries->first(); c; c = m_pDeadQueries->next()) + + for(auto & q : m_DeadQueries) { - KVI_ASSERT(c->isDeadQuery()); - if(KviQString::equalCI(name, c->windowName())) - return c; + KVI_ASSERT(q->isDeadQuery()); + if(KviQString::equalCI(name, q->windowName())) + return q; } return nullptr; } -KviQueryWindow * KviIrcContext::firstDeadQuery() +KviChannelWindow * KviIrcContext::firstDeadChannel() { - if(!m_pDeadQueries) + if(m_DeadChannels.empty()) return nullptr; - return m_pDeadQueries->first(); + + return m_DeadChannels.front(); } -KviChannelWindow * KviIrcContext::firstDeadChannel() +KviQueryWindow * KviIrcContext::firstDeadQuery() { - if(!m_pDeadChannels) + if(m_DeadQueries.empty()) return nullptr; - return m_pDeadChannels->first(); + + return m_DeadQueries.front(); } void KviIrcContext::registerContextWindow(KviWindow * pWnd) { - if(!m_pContextWindows) - { - m_pContextWindows = new KviPointerList<KviWindow>; - m_pContextWindows->setAutoDelete(false); - } - m_pContextWindows->append(pWnd); + m_ContextWindows.push_back(pWnd); } void KviIrcContext::registerDeadChannel(KviChannelWindow * c) { - if(!m_pDeadChannels) - { - m_pDeadChannels = new KviPointerList<KviChannelWindow>; - m_pDeadChannels->setAutoDelete(false); - } - m_pDeadChannels->append(c); + m_DeadChannels.push_back(c); } void KviIrcContext::registerDeadQuery(KviQueryWindow * q) { - if(!m_pDeadQueries) - { - m_pDeadQueries = new KviPointerList<KviQueryWindow>; - m_pDeadQueries->setAutoDelete(false); - } - m_pDeadQueries->append(q); + m_DeadQueries.push_back(q); } bool KviIrcContext::unregisterDeadChannel(KviChannelWindow * c) { // was a dead channel ? - if(!m_pDeadChannels) + if(m_DeadChannels.empty()) return false; - if(!m_pDeadChannels->removeRef(c)) - { - return false; - } - if(m_pDeadChannels->isEmpty()) + + int pos = std::find(m_DeadChannels.begin(), m_DeadChannels.end(), c) - m_DeadChannels.begin(); + + if(pos < m_DeadChannels.size()) { - delete m_pDeadChannels; - m_pDeadChannels = nullptr; + m_DeadChannels.erase(m_DeadChannels.begin() + pos); + return true; } - return true; + + return false; } bool KviIrcContext::unregisterContextWindow(KviWindow * pWnd) { - if(!m_pContextWindows) - return false; - if(!m_pContextWindows->removeRef(pWnd)) - { + if(m_ContextWindows.empty()) return false; - } - if(m_pContextWindows->isEmpty()) + + int pos = std::find(m_ContextWindows.begin(), m_ContextWindows.end(), pWnd) - m_ContextWindows.begin(); + + if(pos < m_ContextWindows.size()) { - delete m_pContextWindows; - m_pContextWindows = nullptr; + m_ContextWindows.erase(m_ContextWindows.begin() + pos); + return true; } - return true; + + return false; } bool KviIrcContext::unregisterDeadQuery(KviQueryWindow * q) { - if(!m_pDeadQueries) - return false; - if(!m_pDeadQueries->removeRef(q)) - { + if(m_DeadQueries.empty()) return false; - } - if(m_pDeadQueries->isEmpty()) + + int pos = std::find(m_DeadQueries.begin(), m_DeadQueries.end(), q) - m_DeadQueries.begin(); + + if(pos < m_DeadQueries.size()) { - delete m_pDeadQueries; - m_pDeadQueries = nullptr; + m_DeadQueries.erase(m_DeadQueries.begin() + pos); + return true; } - return true; + + return false; } void KviIrcContext::createLinksWindow() diff --git a/src/kvirc/kernel/KviIrcContext.h b/src/kvirc/kernel/KviIrcContext.h index 3fc514869..8c6a0a903 100644 --- a/src/kvirc/kernel/KviIrcContext.h +++ b/src/kvirc/kernel/KviIrcContext.h @@ -25,8 +25,9 @@ //============================================================================= #include "kvi_settings.h" -#include "KviPointerList.h" + #include <QObject> +#include <vector> class KviChannelWindow; class KviQueryWindow; @@ -98,13 +99,13 @@ protected: unsigned int m_uConnectAttemptCount; QTimer * m_pReconnectTimer; - KviPointerList<KviIrcDataStreamMonitor> * m_pMonitorList; // owned, may be null + std::vector<KviIrcDataStreamMonitor *> m_pMonitorList; // owned, may be empty // dead channels and queries - KviPointerList<KviChannelWindow> * m_pDeadChannels; - KviPointerList<KviQueryWindow> * m_pDeadQueries; + std::vector<KviChannelWindow *> m_DeadChannels; + std::vector<KviQueryWindow *> m_DeadQueries; // other context bound windows - KviPointerList<KviWindow> * m_pContextWindows; + std::vector<KviWindow *> m_ContextWindows; int m_iHeartbeatTimerId; @@ -132,7 +133,7 @@ public: void registerContextWindow(KviWindow * pWnd); bool unregisterContextWindow(KviWindow * pWnd); - inline KviPointerList<KviIrcDataStreamMonitor> * monitorList() { return m_pMonitorList; }; + inline std::vector<KviIrcDataStreamMonitor *> & monitorList() { return m_pMonitorList; }; // links window void createLinksWindow(); diff --git a/src/kvirc/kernel/KviIrcUrl.cpp b/src/kvirc/kernel/KviIrcUrl.cpp index 122f011e1..a33ad9d8e 100644 --- a/src/kvirc/kernel/KviIrcUrl.cpp +++ b/src/kvirc/kernel/KviIrcUrl.cpp @@ -37,11 +37,13 @@ #include "KviConsoleWindow.h" #include "KviMainWindow.h" +#include <map> + #define _KVI_IRCURL_CPP_ #include "KviIrcUrl.h" // KviApplication.cpp -extern KVIRC_API KviPointerHashTable<QString, KviWindow> * g_pGlobalWindowDict; +extern KVIRC_API std::map<QString, KviWindow *> g_pGlobalWindowDict; bool KviIrcUrl::parse(const char * url, KviCString & cmdBuffer, int contextSpec) { @@ -260,15 +262,14 @@ int KviIrcUrl::run(const QString & text, int contextSpec, KviConsoleWindow * pCo if(contextSpec & TryEveryContext) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); KviConsoleWindow * pTmpConsole = nullptr; pConsole = nullptr; - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - if(wnd->type() == KviWindow::Console) + if(wnd.second->type() == KviWindow::Console) { - pTmpConsole = (KviConsoleWindow *)wnd; + pTmpConsole = (KviConsoleWindow *)wnd.second; if(pTmpConsole->connection()) { @@ -282,8 +283,6 @@ int KviIrcUrl::run(const QString & text, int contextSpec, KviConsoleWindow * pCo } } } - - ++it; } if(!pConsole) @@ -319,7 +318,7 @@ int KviIrcUrl::run(const QString & text, int contextSpec, KviConsoleWindow * pCo // just check if thr user want us to join or part any channel QString tmp; QString toPart; - for(KviChannelWindow * c = pConsole->connection()->channelList()->first(); c; c = pConsole->connection()->channelList()->next()) + for(auto & c : pConsole->connection()->channelList()) { tmp = c->target(); if(c->hasChannelMode('k')) diff --git a/src/kvirc/kernel/KviLagMeter.cpp b/src/kvirc/kernel/KviLagMeter.cpp index 497f69754..90835a158 100644 --- a/src/kvirc/kernel/KviLagMeter.cpp +++ b/src/kvirc/kernel/KviLagMeter.cpp @@ -37,12 +37,12 @@ #include "kvi_out.h" #include "KviLocale.h" +#include <algorithm> + KviLagMeter::KviLagMeter(KviIrcConnection * c) : QObject() { m_pConnection = c; - m_pCheckList = new KviPointerList<KviLagCheck>; - m_pCheckList->setAutoDelete(true); m_uLag = 0; m_uLastEmittedLag = 0; m_uLastReliability = 0; @@ -66,7 +66,6 @@ KviLagMeter::~KviLagMeter() { if(m_pDeletionSignal) *m_pDeletionSignal = true; - delete m_pCheckList; } unsigned int KviLagMeter::secondsSinceLastCompleted() @@ -133,11 +132,11 @@ void KviLagMeter::timerEvent(QTimerEvent *) // the last completed check has been completed a lot of time ago // do we have some checks on the queue ? - if(m_pCheckList->count() > 0) + if(m_CheckList.size() > 0) { // if the first registered check is not too outdated // we wait a little more for it to return - KviLagCheck * c = m_pCheckList->first(); + KviLagCheck * c = m_CheckList.front(); if(c) { if((tv.tv_sec - c->lSecs) <= 10) @@ -204,30 +203,33 @@ void KviLagMeter::lagCheckRegister(const char * key, unsigned int uReliability) c->lSecs = tv.tv_sec; c->lUSecs = tv.tv_usec; c->uReliability = uReliability <= 100 ? uReliability : 100; - m_pCheckList->append(c); - while(m_pCheckList->count() > 30) + m_CheckList.push_back(c); + while(m_CheckList.size() > 30) { // we're fried :/ // either our ping mechanism is not working // or the server is stoned... - m_pCheckList->removeFirst(); + m_CheckList.erase(m_CheckList.begin()); } } bool KviLagMeter::lagCheckComplete(const char * key) { // find this lag check - KviLagCheck * c; - for(c = m_pCheckList->first(); c; c = m_pCheckList->next()) + KviLagCheck * c = nullptr; + for(auto cc : m_CheckList) { - if(kvi_strEqualCS(c->szKey.ptr(), key)) + if(kvi_strEqualCS(cc->szKey.ptr(), key)) + { + c = cc; break; + } } if(!c) return false; // not found // kill any earlier lag checks (IRC is a sequential proto) - while(m_pCheckList->first() != c) - m_pCheckList->removeFirst(); + while(m_CheckList.front() != c) + m_CheckList.erase(m_CheckList.begin()); if(_OUTPUT_PARANOIC) m_pConnection->console()->output(KVI_OUT_VERBOSE, __tr2qs("Lag check completed (%s)"), key); @@ -261,23 +263,17 @@ bool KviLagMeter::lagCheckComplete(const char * key) m_tFirstOwnCheck = 0; m_uLastReliability = c->uReliability; - m_pCheckList->removeFirst(); + m_CheckList.erase(m_CheckList.begin()); return true; } void KviLagMeter::lagCheckAbort(const char * key) { - KviPointerList<KviLagCheck> l; - l.setAutoDelete(false); - KviLagCheck * c; - if(_OUTPUT_PARANOIC) m_pConnection->console()->output(KVI_OUT_VERBOSE, __tr2qs("Lag check aborted (%s)"), key); - for(c = m_pCheckList->first(); c; c = m_pCheckList->next()) + for(auto c : m_CheckList) if(kvi_strEqualCS(c->szKey.ptr(), key)) - l.append(c); - for(c = l.first(); c; c = l.next()) - m_pCheckList->removeRef(c); + m_CheckList.erase(std::remove(m_CheckList.begin(), m_CheckList.end(), c), m_CheckList.end()); } diff --git a/src/kvirc/kernel/KviLagMeter.h b/src/kvirc/kernel/KviLagMeter.h index d693be7d3..751a4f48b 100644 --- a/src/kvirc/kernel/KviLagMeter.h +++ b/src/kvirc/kernel/KviLagMeter.h @@ -27,10 +27,11 @@ #include "kvi_settings.h" #include "KviCString.h" -#include "KviPointerList.h" #include <QObject> +#include <vector> + class KviIrcConnection; class KviLagCheck @@ -57,7 +58,7 @@ protected: unsigned int m_uLastEmittedLag; // last emitted lag long m_tLastCompleted; // time when the last lag was completed (gettimeofday!) unsigned int m_uLastReliability; // how much reliable was the last completed check ? - KviPointerList<KviLagCheck> * m_pCheckList; + std::vector<KviLagCheck *> m_CheckList; long m_tFirstOwnCheck; // time when the first ping after a completed check was sent long m_tLastOwnCheck; // time when the last ping was sent bool m_bOnAlarm; diff --git a/src/kvirc/kernel/KviNotifyList.cpp b/src/kvirc/kernel/KviNotifyList.cpp index c8d2d0e25..76b9c17c4 100644 --- a/src/kvirc/kernel/KviNotifyList.cpp +++ b/src/kvirc/kernel/KviNotifyList.cpp @@ -46,6 +46,10 @@ #include <QStringList> #include <QByteArray> +#include <algorithm> +#include <set> +#include <vector> + // FIXME: #warning "Finish this doc!" /* @@ -272,7 +276,7 @@ void KviNotifyListManager::notifyOffLine(const QString & szNick, const QString & // | ^ // buildRegUserDict() | // | | -// m_pRegUserDict->isEmpty() ? -- YES ---------->+ +// m_pRegUserDict.empty() ? -- YES ------------->+ // | | // NO | // | | @@ -281,28 +285,28 @@ void KviNotifyListManager::notifyOffLine(const QString & szNick, const QString & // | | ^ | // buildNotifyList() | | YES // | | | | -// m_pNotifyList->isEmpty() ? - YES ->+ | | +// m_NotifyList.empty() ? - YES ->+ | | // | | | // NO | | // | | | -// newIsOnSession()<------------- TIMER -------------------- delayedIsOnSession() -- NO - m_pNotifyList->isEmpty() ? +// newIsOnSession()<------------- TIMER -------------------- delayedIsOnSession() -- NO - m_NotifyList.empty() ? // | (can be stopped here) | | // | | | // buildIsOnList() | | // | | | -// m_pIsOnList->isEmpty() ? -- YES ---------->+ | +// m_IsOnList.empty() ? -- YES ---------->+ | // | | // NO | // | | // sendIsOn() - - - - - - - - - - - -> handleIsOn() | // | | -// (build m_pOnlineList) | +// (build m_OnlineList) | // | | -// m_pOnlineList->isEmpty() ? - YES ----------------------->+ +// m_OnlineList.empty() ? - YES ----------------------->+ // | | // NO YES // | | -// delayedUserhostSession()<--------------- NO - m_pOnlineList->isEmpty() ? +// delayedUserhostSession()<--------------- NO - m_OnlineList.empty() ? // | ^ // TIMER (can be stopped here) | // | | @@ -310,7 +314,7 @@ void KviNotifyListManager::notifyOffLine(const QString & szNick, const QString & // | | // buildUserhostList() | // | | -// m_pUserhostList->isEmpty() ? - YES --->+ +// m_UserhostList.empty() ? - YES --->+ // | ^^^ | // | (unexpected!)||| | // NO | @@ -321,22 +325,10 @@ void KviNotifyListManager::notifyOffLine(const QString & szNick, const QString & KviIsOnNotifyListManager::KviIsOnNotifyListManager(KviIrcConnection * pConnection) : KviNotifyListManager(pConnection) { - m_pRegUserDict = new KviPointerHashTable<QString, QString>(17, false); // case insensitive, copy keys - m_pRegUserDict->setAutoDelete(true); - m_pNotifyList = new KviPointerList<QString>; - m_pNotifyList->setAutoDelete(true); - m_pIsOnList = new KviPointerList<QString>; - m_pIsOnList->setAutoDelete(true); - m_pOnlineList = new KviPointerList<QString>; - m_pOnlineList->setAutoDelete(true); - m_pUserhostList = new KviPointerList<QString>; - m_pUserhostList->setAutoDelete(true); - m_pDelayedNotifyTimer = new QTimer(); - connect(m_pDelayedNotifyTimer, SIGNAL(timeout()), this, SLOT(newNotifySession())); - m_pDelayedIsOnTimer = new QTimer(); - connect(m_pDelayedIsOnTimer, SIGNAL(timeout()), this, SLOT(newIsOnSession())); - m_pDelayedUserhostTimer = new QTimer(); - connect(m_pDelayedUserhostTimer, SIGNAL(timeout()), this, SLOT(newUserhostSession())); + connect(&m_pDelayedNotifyTimer, SIGNAL(timeout()), this, SLOT(newNotifySession())); + connect(&m_pDelayedIsOnTimer, SIGNAL(timeout()), this, SLOT(newIsOnSession())); + connect(&m_pDelayedUserhostTimer, SIGNAL(timeout()), this, SLOT(newUserhostSession())); + m_bRunning = false; } @@ -344,14 +336,6 @@ KviIsOnNotifyListManager::~KviIsOnNotifyListManager() { if(m_bRunning) stop(); - delete m_pDelayedNotifyTimer; - delete m_pDelayedIsOnTimer; - delete m_pDelayedUserhostTimer; - delete m_pRegUserDict; - delete m_pOnlineList; - delete m_pNotifyList; - delete m_pIsOnList; - delete m_pUserhostList; } void KviIsOnNotifyListManager::start() @@ -365,7 +349,7 @@ void KviIsOnNotifyListManager::start() m_bExpectingUserhost = false; buildRegUserDict(); - if(m_pRegUserDict->isEmpty()) + if(m_pRegUserDict.empty()) { if(_OUTPUT_VERBOSE) m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: No users to check for, quitting")); @@ -377,7 +361,7 @@ void KviIsOnNotifyListManager::start() void KviIsOnNotifyListManager::buildRegUserDict() { - m_pRegUserDict->clear(); + m_pRegUserDict.clear(); const KviPointerHashTable<QString, KviRegisteredUser> * d = g_pRegisteredUserDataBase->userDict(); KviPointerHashTableIterator<QString, KviRegisteredUser> it(*d); @@ -393,12 +377,12 @@ void KviIsOnNotifyListManager::buildRegUserDict() if(idx > 0) { QString single = notify.left(idx); - m_pRegUserDict->replace(single, new QString(u->name())); + m_pRegUserDict.emplace(single, std::unique_ptr<QString>(new QString(u->name()))); notify.remove(0, idx + 1); } else { - m_pRegUserDict->replace(notify, new QString(u->name())); + m_pRegUserDict.emplace(notify, std::unique_ptr<QString>(new QString(u->name()))); notify = ""; } } @@ -421,15 +405,15 @@ void KviIsOnNotifyListManager::delayedNotifySession() iTimeout = 15; KVI_OPTION_UINT(KviOption_uintNotifyListCheckTimeInSecs) = 15; } - m_pDelayedNotifyTimer->setInterval(iTimeout * 1000); - m_pDelayedNotifyTimer->setSingleShot(true); - m_pDelayedNotifyTimer->start(); + m_pDelayedNotifyTimer.setInterval(iTimeout * 1000); + m_pDelayedNotifyTimer.setSingleShot(true); + m_pDelayedNotifyTimer.start(); } void KviIsOnNotifyListManager::newNotifySession() { buildNotifyList(); - if(m_pNotifyList->isEmpty()) + if(m_NotifyList.empty()) { if(_OUTPUT_VERBOSE) m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: Notify list empty, quitting")); @@ -441,12 +425,10 @@ void KviIsOnNotifyListManager::newNotifySession() void KviIsOnNotifyListManager::buildNotifyList() { - m_pNotifyList->clear(); - KviPointerHashTableIterator<QString, QString> it(*m_pRegUserDict); - while(it.current()) + m_NotifyList.clear(); + for(auto & it : m_pRegUserDict) { - m_pNotifyList->append(new QString(it.currentKey())); - ++it; + m_NotifyList.push_back(std::unique_ptr<QString>(new QString(it.first))); } } @@ -464,15 +446,15 @@ void KviIsOnNotifyListManager::delayedIsOnSession() iTimeout = 5; KVI_OPTION_UINT(KviOption_uintNotifyListIsOnDelayTimeInSecs) = 5; } - m_pDelayedIsOnTimer->setInterval(iTimeout * 1000); - m_pDelayedIsOnTimer->setSingleShot(true); - m_pDelayedIsOnTimer->start(); + m_pDelayedIsOnTimer.setInterval(iTimeout * 1000); + m_pDelayedIsOnTimer.setSingleShot(true); + m_pDelayedIsOnTimer.start(); } void KviIsOnNotifyListManager::newIsOnSession() { buildIsOnList(); - if(m_pIsOnList->isEmpty()) + if(m_IsOnList.empty()) delayedNotifySession(); else sendIsOn(); @@ -480,23 +462,26 @@ void KviIsOnNotifyListManager::newIsOnSession() void KviIsOnNotifyListManager::buildIsOnList() { - m_pIsOnList->clear(); + m_IsOnList.clear(); m_szIsOnString = ""; - m_pNotifyList->setAutoDelete(false); - while(QString * s = m_pNotifyList->first()) + while(!m_NotifyList.empty()) { + const auto sIter = m_NotifyList.begin(); + auto & s = *sIter; + if(((m_szIsOnString.length() + s->length()) + 1) < 504) { if(!m_szIsOnString.isEmpty()) m_szIsOnString.append(' '); m_szIsOnString.append(*s); - m_pIsOnList->append(s); - m_pNotifyList->removeFirst(); + m_IsOnList.push_back(std::move(s)); + m_NotifyList.erase(sIter); } else + { break; + } } - m_pNotifyList->setAutoDelete(true); } void KviIsOnNotifyListManager::sendIsOn() @@ -520,8 +505,7 @@ bool KviIsOnNotifyListManager::handleIsOn(KviIrcMessage * msg) // Check if it is our ISON // all the nicks must be on the IsOnList - KviPointerList<QString> tmplist; - tmplist.setAutoDelete(false); + std::set<std::size_t> tmplist; KviCString nk; const char * aux = msg->trailing(); @@ -534,17 +518,21 @@ bool KviIsOnNotifyListManager::handleIsOn(KviIrcMessage * msg) { bool bGotIt = false; QString dnk = m_pConnection->decodeText(nk.ptr()); - for(QString * s = m_pIsOnList->first(); s && (!bGotIt); s = m_pIsOnList->next()) + + std::size_t i = 0; + for(auto & s : m_IsOnList) { if(KviQString::equalCI(*s, dnk)) { - tmplist.append(s); + tmplist.insert(i); bGotIt = true; + break; } + i++; } if(!bGotIt) { - // ops...not my userhost! + // oops... not my userhost! if(_OUTPUT_VERBOSE) m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: Hey! You've used ISON behind my back? (I might be confused now...)")); return false; @@ -552,45 +540,37 @@ bool KviIsOnNotifyListManager::handleIsOn(KviIrcMessage * msg) } } - // Ok...looks to be my ison (still not sure at 100%, but can't do better) + // Ok... looks to be my ison (still not sure at 100%, but can't do better) if(m_pConnection->lagMeter()) m_pConnection->lagMeter()->lagCheckComplete("@notify_ison"); m_bExpectingIsOn = false; - m_pOnlineList->clear(); + m_OnlineList.clear(); - m_pIsOnList->setAutoDelete(false); - - // Ok...we have an IsOn reply here + // Ok... we have an IsOn reply here // The nicks in the IsOnList that are also in the reply are online, and go to the OnlineList // the remaining in the IsOnList are offline - - QString * s; - - for(s = tmplist.first(); s; s = tmplist.next()) + for(auto i = tmplist.rbegin(); i != tmplist.rend(); ++i) { - m_pIsOnList->removeRef(s); - m_pOnlineList->append(s); + m_OnlineList.push_back(std::move(m_IsOnList[*i])); + m_IsOnList.erase(m_IsOnList.begin() + *i); } - m_pIsOnList->setAutoDelete(true); - // Ok...all the users that are online, are on the OnlineList - // the remaining users are in the m_pIsOnList, and are no longer online + // Ok... all the users that are online, are on the OnlineList + // the remaining users are in the m_IsOnList, and are no longer online // first the easy step: remove the users that have just left irc or have never been online - // we're clearling the m_pIsOnList - while((s = m_pIsOnList->first())) + // we're clearling the m_IsOnList + for(auto & s : m_IsOnList) { + // has just left IRC... make him part if(m_pConsole->notifyListView()->findEntry(*s)) - { - // has just left IRC... make him part notifyOffLine(*s); - } // else has never been here - - m_pIsOnList->removeFirst(); // autodelete is true } + m_IsOnList.clear(); + // ok... complex step now: the remaining users in the userhost list are online // if they have been online before, just remove them from the list // otherwise they must be matched for masks @@ -598,44 +578,43 @@ bool KviIsOnNotifyListManager::handleIsOn(KviIrcMessage * msg) KviIrcUserDataBase * db = console()->connection()->userDataBase(); - KviPointerList<QString> l; - l.setAutoDelete(false); - - for(s = m_pOnlineList->first(); s; s = m_pOnlineList->next()) + std::set<std::size_t> l; + std::size_t i = 0; + for(auto & ss : m_OnlineList) { - if(KviUserListEntry * ent = m_pConsole->notifyListView()->findEntry(*s)) + if(KviUserListEntry * ent = m_pConsole->notifyListView()->findEntry(*ss)) { // the user was online from a previous notify session - // might the mask have been changed ? (heh...this is tricky, maybe too much even) + // might the mask have been changed ? (heh... this is tricky, maybe too much even) if(KVI_OPTION_BOOL(KviOption_boolNotifyListSendUserhostForOnlineUsers)) { // user wants to be sure about online users.... // check if he is on some channels if(ent->globalData()->nRefs() > 1) { - // mmmh...we have more than one ref, so the user is at least in one query or channel + // mmmh... we have more than one ref, so the user is at least in one query or channel // look him up on channels, if we find his entry, we can be sure that he is // still the right user - KviPointerList<KviChannelWindow> * chlist = m_pConsole->connection()->channelList(); - for(KviChannelWindow * ch = chlist->first(); ch; ch = chlist->next()) + std::vector<KviChannelWindow *> chlist = m_pConsole->connection()->channelList(); + for(auto ch : chlist) { - if(KviUserListEntry * le = ch->findEntry(*s)) + if(KviUserListEntry * le = ch->findEntry(*ss)) { - l.append(s); // ok...found on a channel...we don't need a userhost to match him - KviIrcMask mk(*s, le->globalData()->user(), le->globalData()->host()); - if(!doMatchUser(*s, mk)) + l.insert(i); // ok... found on a channel... we don't need a userhost to match him + KviIrcMask mk(*ss, le->globalData()->user(), le->globalData()->host()); + if(!doMatchUser(*ss, mk)) return true; // critical problems = have to restart!!! break; } } - } // else Only one ref...we need a userhost to be sure (don't remove from the list) + } // else Only one ref... we need a userhost to be sure (don't remove from the list) } else { - // user wants no userhost for online users...we "hope" that everything will go ok. - l.append(s); + // user wants no userhost for online users... we "hope" that everything will go ok. + l.insert(i); } - //l.append(s); // we will remove him from the list + //l.insert(i); // we will remove him from the list } else { @@ -643,31 +622,33 @@ bool KviIsOnNotifyListManager::handleIsOn(KviIrcMessage * msg) // check if we have a cached mask if(db) { - if(KviIrcUserEntry * ue = db->find(*s)) + if(KviIrcUserEntry * ue = db->find(*ss)) { // already in the db... do we have a mask ? if(ue->hasUser() && ue->hasHost()) { // yup! we have a complete mask to match on - KviIrcMask mk(*s, ue->user(), ue->host()); + KviIrcMask mk(*ss, ue->user(), ue->host()); // lookup the user's name in the m_pRegUserDict - if(!doMatchUser(*s, mk)) + if(!doMatchUser(*ss, mk)) return true; // critical problems = have to restart!!! - l.append(s); // remove anyway + l.insert(i); // remove anyway } } } } + + i++; } - for(s = l.first(); s; s = l.next()) + for(auto i = l.rbegin(); i != l.rend(); ++i) { - m_pOnlineList->removeRef(s); // autodelete is true + m_OnlineList.erase(m_OnlineList.begin() + *i); } - if(m_pOnlineList->isEmpty()) + if(m_OnlineList.empty()) { - if(m_pNotifyList->isEmpty()) + if(m_NotifyList.empty()) delayedNotifySession(); else delayedIsOnSession(); @@ -682,20 +663,21 @@ bool KviIsOnNotifyListManager::handleIsOn(KviIrcMessage * msg) bool KviIsOnNotifyListManager::doMatchUser(const QString & notifyString, const KviIrcMask & mask) { - QString * nam = m_pRegUserDict->find(notifyString); - if(nam) + const auto i = m_pRegUserDict.find(notifyString); + if(i != m_pRegUserDict.end()) { - // ok...find the user + QString * nam = i->second.get(); + // ok... find the user if(KviRegisteredUser * u = g_pRegisteredUserDataBase->findUserByName(*nam)) { - // ok ... match the user + // ok... match the user if(u->matchesFixed(mask)) { // new user online if(!(m_pConsole->notifyListView()->findEntry(mask.nick()))) { notifyOnLine(mask.nick(), mask.user(), mask.host()); - } // else already online, and matching...all ok + } // else already online, and matching... all ok } else { @@ -717,16 +699,16 @@ bool KviIsOnNotifyListManager::doMatchUser(const QString & notifyString, const K } else { - // ops... unexpected inconsistency .... reguser db modified ? + // oops... unexpected inconsistency.... reguser db modified ? m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Unexpected inconsistency, registered user DB modified? (restarting)")); stop(); start(); - return false; // critical ... exit from the call stack + return false; // critical... exit from the call stack } } else { - // ops...unexpected inconsistency + // oops... unexpected inconsistency m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Unexpected inconsistency, expected \r!n\r%Q\r in the registered user DB"), ¬ifyString); } return true; @@ -746,21 +728,21 @@ void KviIsOnNotifyListManager::delayedUserhostSession() iTimeout = 5; KVI_OPTION_UINT(KviOption_uintNotifyListUserhostDelayTimeInSecs) = 5; } - m_pDelayedUserhostTimer->setInterval(iTimeout * 1000); - m_pDelayedUserhostTimer->setSingleShot(true); - m_pDelayedUserhostTimer->start(); + m_pDelayedUserhostTimer.setInterval(iTimeout * 1000); + m_pDelayedUserhostTimer.setSingleShot(true); + m_pDelayedUserhostTimer.start(); } void KviIsOnNotifyListManager::newUserhostSession() { buildUserhostList(); - if(m_pUserhostList->isEmpty()) + if(m_UserhostList.empty()) { // this is unexpected! m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Unexpected inconsistency, userhost list is empty!")); - if(m_pOnlineList->isEmpty()) + if(m_OnlineList.empty()) { - if(m_pNotifyList->isEmpty()) + if(m_NotifyList.empty()) delayedNotifySession(); else delayedIsOnSession(); @@ -777,21 +759,22 @@ void KviIsOnNotifyListManager::newUserhostSession() void KviIsOnNotifyListManager::buildUserhostList() { m_szUserhostString = ""; - m_pUserhostList->clear(); - - m_pOnlineList->setAutoDelete(false); - int i = 0; - QString * s; - while((s = m_pOnlineList->first()) && (i < MAX_USERHOST_ENTRIES)) + m_UserhostList.clear(); + std::size_t i = 0; + while(!m_OnlineList.empty()) { + const auto sIter = m_OnlineList.begin(); + auto & s = *sIter; + + if (i >= MAX_USERHOST_ENTRIES) + break; + if(!m_szUserhostString.isEmpty()) m_szUserhostString.append(' '); m_szUserhostString.append(*s); - m_pUserhostList->append(s); - m_pOnlineList->removeFirst(); - i++; + m_UserhostList.push_back(std::move(s)); + m_OnlineList.erase(sIter); } - m_pOnlineList->setAutoDelete(true); } void KviIsOnNotifyListManager::sendUserhost() @@ -812,8 +795,8 @@ bool KviIsOnNotifyListManager::handleUserhost(KviIrcMessage * msg) if(!m_bExpectingUserhost) return false; // first check for consistency: all the replies must be on the USERHOST list - KviPointerList<KviIrcMask> tmplist; - tmplist.setAutoDelete(true); + + std::map<std::size_t, std::unique_ptr<KviIrcMask>> tmplist; KviCString nk; const char * aux = msg->trailing(); @@ -857,20 +840,20 @@ bool KviIsOnNotifyListManager::handleUserhost(KviIrcMessage * msg) QString szUser = m_pConnection->decodeText(user.ptr()); QString szHost = m_pConnection->decodeText(host.ptr()); - for(QString * s = m_pUserhostList->first(); s && (!bGotIt); s = m_pUserhostList->next()) + std::size_t i = 0; + for(auto & s : m_UserhostList) { if(KviQString::equalCI(*s, szNick)) { - KviIrcMask * mk = new KviIrcMask(szNick, szUser, szHost); - tmplist.append(mk); + tmplist.emplace(i, std::unique_ptr<KviIrcMask>(new KviIrcMask(szNick, szUser, szHost))); bGotIt = true; - m_pUserhostList->removeRef(s); + break; } } if(!bGotIt) { - // ops...not my userhost! + // oops... not my userhost! if(_OUTPUT_VERBOSE) m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Hey! You've used USERHOST behind my back? (I might be confused now...)")); return false; @@ -884,39 +867,44 @@ bool KviIsOnNotifyListManager::handleUserhost(KviIrcMessage * msg) } } - // Ok...looks to be my usershot (still not sure at 100%, but can't do better) + // Ok... looks to be my usershot (still not sure at 100%, but can't do better) if(m_pConnection->lagMeter()) m_pConnection->lagMeter()->lagCheckComplete("@notify_userhost"); m_bExpectingUserhost = false; - for(KviIrcMask * mk = tmplist.first(); mk; mk = tmplist.next()) + for(auto & pair : tmplist) { + KviIrcMask * mk = pair.second.get(); + if(!doMatchUser(mk->nick(), *mk)) return true; // have to restart!!! } - if(!(m_pUserhostList->isEmpty())) + for(auto i = tmplist.rbegin(); i != tmplist.rend(); ++i) + m_UserhostList.erase(m_UserhostList.begin() + i->first); + + for(auto & s : m_UserhostList) { - // ops...someone is no longer online ? - while(QString * s = m_pUserhostList->first()) - { - if(_OUTPUT_VERBOSE) - m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: \r!n\r%Q\r appears to have gone offline before USERHOST reply was received, will recheck in the next loop"), s); - m_pUserhostList->removeFirst(); - } + // oops... someone is no longer online ? + if(_OUTPUT_VERBOSE) + m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: \r!n\r%Q\r appears to have gone offline before USERHOST reply was received, will recheck in the next loop"), s.get()); } - if(m_pOnlineList->isEmpty()) + m_UserhostList.clear(); + + if(m_OnlineList.empty()) { - if(m_pNotifyList->isEmpty()) + if(m_NotifyList.empty()) delayedNotifySession(); else delayedIsOnSession(); } else + { delayedUserhostSession(); + } return true; } @@ -931,15 +919,15 @@ void KviIsOnNotifyListManager::stop() if(m_pConnection->lagMeter()) m_pConnection->lagMeter()->lagCheckAbort("@notify_ison"); - m_pDelayedNotifyTimer->stop(); - m_pDelayedIsOnTimer->stop(); - m_pDelayedUserhostTimer->stop(); + m_pDelayedNotifyTimer.stop(); + m_pDelayedIsOnTimer.stop(); + m_pDelayedUserhostTimer.stop(); m_pConsole->notifyListView()->partAllButOne(m_pConnection->currentNickName()); - m_pRegUserDict->clear(); - m_pNotifyList->clear(); - m_pIsOnList->clear(); - m_pOnlineList->clear(); - m_pUserhostList->clear(); + m_pRegUserDict.clear(); + m_NotifyList.clear(); + m_IsOnList.clear(); + m_OnlineList.clear(); + m_UserhostList.clear(); m_szIsOnString = ""; m_szUserhostString = ""; m_bRunning = false; @@ -952,8 +940,6 @@ void KviIsOnNotifyListManager::stop() KviStupidNotifyListManager::KviStupidNotifyListManager(KviIrcConnection * pConnection) : KviNotifyListManager(pConnection) { - m_pNickList = new KviPointerList<QString>; - m_pNickList->setAutoDelete(true); m_iRestartTimer = 0; } @@ -964,7 +950,6 @@ KviStupidNotifyListManager::~KviStupidNotifyListManager() killTimer(m_iRestartTimer); m_iRestartTimer = 0; } - delete m_pNickList; } void KviStupidNotifyListManager::start() @@ -977,11 +962,11 @@ void KviStupidNotifyListManager::start() if(_OUTPUT_VERBOSE) m_pConsole->outputNoFmt(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Starting notify list")); buildNickList(); - if(m_pNickList->isEmpty()) + if(m_pNickList.empty()) { if(_OUTPUT_VERBOSE) m_pConsole->outputNoFmt(KVI_OUT_SYSTEMMESSAGE, __tr2qs("No users in the notify list")); - return; // Ok...no nicknames in the list + return; // Ok... no nicknames in the list } m_iNextNickToCheck = 0; m_pConsole->notifyListView()->partAllButOne(m_pConnection->currentNickName()); @@ -991,15 +976,14 @@ void KviStupidNotifyListManager::start() void KviStupidNotifyListManager::sendIsOn() { m_szLastIsOnMsg = ""; - QString * nick = m_pNickList->at(m_iNextNickToCheck); + QString * nick = m_pNickList[m_iNextNickToCheck].get(); KVI_ASSERT(nick); - int i = 0; + std::size_t i = 0; while(nick && ((nick->length() + 5 + m_szLastIsOnMsg.length()) < 510)) { KviQString::appendFormatted(m_szLastIsOnMsg, " %Q", nick); - nick = m_pNickList->next(); - i++; + nick = m_pNickList[m_iNextNickToCheck + ++i].get(); } if(_OUTPUT_PARANOIC) m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: Checking for: %Q"), &m_szLastIsOnMsg); @@ -1035,7 +1019,7 @@ bool KviStupidNotifyListManager::handleIsOn(KviIrcMessage * msg) } } } - // ok...check the users that have left irc now... + // ok... check the users that have left irc now... QStringList sl = m_szLastIsOnMsg.isEmpty() ? QStringList() : m_szLastIsOnMsg.split(' ', QString::SkipEmptyParts); for(auto & it : sl) @@ -1047,7 +1031,7 @@ bool KviStupidNotifyListManager::handleIsOn(KviIrcMessage * msg) } // else has never been here... } - if(((unsigned int)m_iNextNickToCheck) >= m_pNickList->count()) + if(((unsigned int)m_iNextNickToCheck) >= m_pNickList.size()) { // have to restart unsigned int iTimeout = KVI_OPTION_UINT(KviOption_uintNotifyListCheckTimeInSecs); @@ -1101,14 +1085,12 @@ void KviStupidNotifyListManager::buildNickList() { const KviPointerHashTable<QString, KviRegisteredUser> * d = g_pRegisteredUserDataBase->userDict(); KviPointerHashTableIterator<QString, KviRegisteredUser> it(*d); - m_pNickList->clear(); + m_pNickList.clear(); while(it.current()) { QString notify; if(it.current()->getProperty("notify", notify)) - { - m_pNickList->append(new QString(notify)); - } + m_pNickList.push_back(std::unique_ptr<QString>(new QString(notify))); ++it; } } @@ -1120,18 +1102,11 @@ void KviStupidNotifyListManager::buildNickList() KviWatchNotifyListManager::KviWatchNotifyListManager(KviIrcConnection * pConnection) : KviNotifyListManager(pConnection) { - m_pRegUserDict = new KviPointerHashTable<QString, QString>(17, false); - m_pRegUserDict->setAutoDelete(true); -} - -KviWatchNotifyListManager::~KviWatchNotifyListManager() -{ - delete m_pRegUserDict; } void KviWatchNotifyListManager::buildRegUserDict() { - m_pRegUserDict->clear(); + m_pRegUserDict.clear(); const KviPointerHashTable<QString, KviRegisteredUser> * d = g_pRegisteredUserDataBase->userDict(); KviPointerHashTableIterator<QString, KviRegisteredUser> it(*d); @@ -1142,10 +1117,8 @@ void KviWatchNotifyListManager::buildRegUserDict() { notify = notify.trimmed(); QStringList sl = notify.split(' ', QString::SkipEmptyParts); - for(auto & it : sl) - { - m_pRegUserDict->replace(it, new QString(u->name())); - } + for(auto & slit : sl) + m_pRegUserDict.emplace(slit, std::unique_ptr<QString>(new QString(u->name()))); } ++it; } @@ -1159,10 +1132,9 @@ void KviWatchNotifyListManager::start() QString watchStr; - KviPointerHashTableIterator<QString, QString> it(*m_pRegUserDict); - while(it.current()) + for(auto & it : m_pRegUserDict) { - QString nk = it.currentKey(); + QString nk = it.first; if(nk.indexOf('*') == -1) { if((watchStr.length() + nk.length() + 2) > 501) @@ -1175,7 +1147,6 @@ void KviWatchNotifyListManager::start() } KviQString::appendFormatted(watchStr, " +%Q", &nk); } - ++it; } if(!watchStr.isEmpty()) @@ -1190,19 +1161,19 @@ void KviWatchNotifyListManager::stop() { m_pConsole->notifyListView()->partAllButOne(m_pConnection->currentNickName()); m_pConnection->sendFmtData("WATCH c"); - m_pRegUserDict->clear(); + m_pRegUserDict.clear(); } bool KviWatchNotifyListManager::doMatchUser(KviIrcMessage * msg, const QString & notifyString, const KviIrcMask & mask) { - QString * nam = m_pRegUserDict->find(notifyString); - - if(nam) + const auto m = m_pRegUserDict.find(notifyString); + if(m != m_pRegUserDict.end()) { - // ok...find the user + QString * nam = m->second.get(); + // ok... find the user if(KviRegisteredUser * u = g_pRegisteredUserDataBase->findUserByName(*nam)) { - // ok ... match the user + // ok... match the user if(u->matchesFixed(mask)) { // new user online @@ -1212,7 +1183,7 @@ bool KviWatchNotifyListManager::doMatchUser(KviIrcMessage * msg, const QString & } else { - // else already online, and matching...all ok + // else already online, and matching... all ok if(msg->numeric() == RPL_NOWON) { // This is a reply to a /watch +something (should not happen, unless the user is messing) or to /watch l (user requested) @@ -1221,7 +1192,7 @@ bool KviWatchNotifyListManager::doMatchUser(KviIrcMessage * msg, const QString & } else { - // This is a RPL_LOGON....we're desynched ? + // This is a RPL_LOGON.... we're desynched ? notifyOnLine(mask.nick(), mask.user(), mask.host(), __tr2qs("possible watch list desync"), false); } @@ -1249,12 +1220,12 @@ bool KviWatchNotifyListManager::doMatchUser(KviIrcMessage * msg, const QString & } else { - // ops... unexpected inconsistency .... reguser db modified ? + // oops... unexpected inconsistency.... reguser db modified ? m_pConsole->output(KVI_OUT_SYSTEMWARNING, __tr2qs("Notify list: Unexpected inconsistency, registered user DB modified? (watch: restarting)")); stop(); start(); - return false; // critical ... exit from the call stack + return false; // critical... exit from the call stack } } else @@ -1308,8 +1279,8 @@ bool KviWatchNotifyListManager::handleWatchReply(KviIrcMessage * msg) if(_OUTPUT_VERBOSE) m_pConsole->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("Notify list: Stopped watching for \r!n\r%Q\r"), &dnk); } - if(m_pRegUserDict->find(dnk)) - m_pRegUserDict->remove(dnk); // kill that + if(m_pRegUserDict.count(dnk)) + m_pRegUserDict.erase(dnk); // kill that return true; } diff --git a/src/kvirc/kernel/KviNotifyList.h b/src/kvirc/kernel/KviNotifyList.h index 9b1b877db..d21098424 100644 --- a/src/kvirc/kernel/KviNotifyList.h +++ b/src/kvirc/kernel/KviNotifyList.h @@ -26,12 +26,14 @@ #include "kvi_settings.h" #include "KviQString.h" -#include "KviPointerList.h" -#include "KviPointerHashTable.h" #include <QObject> #include <QTimer> +#include <map> +#include <memory> +#include <vector> + class KviConsoleWindow; class KviIrcMessage; class KviIrcMask; @@ -76,18 +78,18 @@ protected: ~KviIsOnNotifyListManager(); private: - KviPointerHashTable<QString, QString> * m_pRegUserDict; // dict notifystring->reguser name - KviPointerList<QString> * m_pNotifyList; // list of notifystring (total) - KviPointerList<QString> * m_pIsOnList; // list of notifystring (one session) + std::map<QString, std::unique_ptr<QString>> m_pRegUserDict; // dict notifystring->reguser name + std::vector<std::unique_ptr<QString>> m_NotifyList; // list of notifystring (total) + std::vector<std::unique_ptr<QString>> m_IsOnList; // list of notifystring (one session) QString m_szIsOnString; // m_pIsOnList in form of a string - KviPointerList<QString> * m_pOnlineList; // - KviPointerList<QString> * m_pUserhostList; + std::vector<std::unique_ptr<QString>> m_OnlineList; + std::vector<std::unique_ptr<QString>> m_UserhostList; QString m_szUserhostString; bool m_bExpectingIsOn; bool m_bExpectingUserhost; - QTimer * m_pDelayedIsOnTimer; - QTimer * m_pDelayedNotifyTimer; - QTimer * m_pDelayedUserhostTimer; + QTimer m_pDelayedIsOnTimer; + QTimer m_pDelayedNotifyTimer; + QTimer m_pDelayedUserhostTimer; bool m_bRunning; protected: @@ -125,9 +127,9 @@ protected: ~KviStupidNotifyListManager(); protected: - KviPointerList<QString> * m_pNickList; + std::vector<std::unique_ptr<QString>> m_pNickList; QString m_szLastIsOnMsg; - int m_iNextNickToCheck; + std::size_t m_iNextNickToCheck; int m_iRestartTimer; protected: @@ -151,10 +153,9 @@ class KVIRC_API KviWatchNotifyListManager : public KviNotifyListManager Q_OBJECT public: KviWatchNotifyListManager(KviIrcConnection * pConnection); - ~KviWatchNotifyListManager(); protected: - KviPointerHashTable<QString, QString> * m_pRegUserDict; // dict notifystring->reguser name + std::map<QString, std::unique_ptr<QString>> m_pRegUserDict; // dict notifystring->reguser name protected: void buildRegUserDict(); virtual void start(); diff --git a/src/kvirc/kernel/KviTextIconManager.cpp b/src/kvirc/kernel/KviTextIconManager.cpp index a05f1d2e3..6997e2b5a 100644 --- a/src/kvirc/kernel/KviTextIconManager.cpp +++ b/src/kvirc/kernel/KviTextIconManager.cpp @@ -27,7 +27,6 @@ #include "KviTextIconManager.h" #include "KviFileUtils.h" #include "KviCString.h" -#include "KviPointerList.h" #include "KviConfigurationFile.h" #include "KviApplication.h" #include "kvi_confignames.h" @@ -36,6 +35,7 @@ #include <QPixmap> #include <QFile> +#include <vector> static KviTextIconAssocEntry default_associations[] = { { ":)", KviIconManager::Smile }, @@ -243,20 +243,19 @@ int KviTextIconManager::load(const QString & szFileName, bool bMerge) { KviConfigurationFileGroupIterator it(*pDict); - KviPointerList<QString> names; - names.setAutoDelete(true); + std::vector<QString> names; while(it.current()) { - names.append(new QString(it.currentKey())); + names.push_back(it.currentKey()); ++it; } cfg.setGroup("TextIcons"); - for(QString * s = names.first(); s; s = names.next()) + for(auto & s : names) { - int iId = cfg.readIntEntry(*s, -1); + int iId = cfg.readIntEntry(s, -1); QString szTmp; QPixmap * pix = nullptr; //qDebug("%s %s %i %i",__FILE__,__FUNCTION__,__LINE__,id); @@ -266,7 +265,7 @@ int KviTextIconManager::load(const QString & szFileName, bool bMerge) } else { - szTmp = cfg.readEntry(*s); + szTmp = cfg.readEntry(s); pix = g_pIconManager->getPixmap(szTmp); if(!pix) { @@ -279,15 +278,15 @@ int KviTextIconManager::load(const QString & szFileName, bool bMerge) { if(bMerge) { - if(!m_pTextIconDict->find(*s)) + if(!m_pTextIconDict->find(s)) { if(iId != -1) { - m_pTextIconDict->replace(*s, new KviTextIcon(g_pIconManager->iconName(iId))); + m_pTextIconDict->replace(s, new KviTextIcon(g_pIconManager->iconName(iId))); } else { - m_pTextIconDict->replace(*s, new KviTextIcon(szTmp)); + m_pTextIconDict->replace(s, new KviTextIcon(szTmp)); } } } @@ -295,11 +294,11 @@ int KviTextIconManager::load(const QString & szFileName, bool bMerge) { if(iId > 0) { - m_pTextIconDict->replace(*s, new KviTextIcon(g_pIconManager->iconName(iId))); + m_pTextIconDict->replace(s, new KviTextIcon(g_pIconManager->iconName(iId))); } else { - m_pTextIconDict->replace(*s, new KviTextIcon(szTmp)); + m_pTextIconDict->replace(s, new KviTextIcon(szTmp)); } } } diff --git a/src/kvirc/kvs/KviKvsAliasManager.cpp b/src/kvirc/kvs/KviKvsAliasManager.cpp index 9e980ebb9..87f9c60f4 100644 --- a/src/kvirc/kvs/KviKvsAliasManager.cpp +++ b/src/kvirc/kvs/KviKvsAliasManager.cpp @@ -116,13 +116,13 @@ void KviKvsAliasManager::add(const QString & szName, KviKvsScript * pAlias) emit aliasRefresh(szName); } -void KviKvsAliasManager::completeCommand(const QString & word, KviPointerList<QString> * matches) +void KviKvsAliasManager::completeCommand(const QString & word, std::vector<QString> & matches) { KviPointerHashTableIterator<QString, KviKvsScript> it(*m_pAliasDict); while(it.current()) { if(KviQString::equalCIN(word, it.current()->name(), word.length())) - matches->append(new QString(it.current()->name())); + matches.push_back(it.current()->name()); ++it; } } diff --git a/src/kvirc/kvs/KviKvsAliasManager.h b/src/kvirc/kvs/KviKvsAliasManager.h index 564100cbe..e390684d3 100644 --- a/src/kvirc/kvs/KviKvsAliasManager.h +++ b/src/kvirc/kvs/KviKvsAliasManager.h @@ -27,11 +27,12 @@ #include "kvi_settings.h" #include "KviPointerHashTable.h" -#include "KviPointerList.h" #include "KviQString.h" #include "KviKvsScript.h" +#include <vector> + class KVIRC_API KviKvsAliasManager : public QObject { Q_OBJECT @@ -70,7 +71,7 @@ public: void save(const QString & filename); void load(const QString & filename); - void completeCommand(const QString & word, KviPointerList<QString> * matches); + void completeCommand(const QString & word, std::vector<QString> & matches); signals: void aliasRefresh(const QString &); }; diff --git a/src/kvirc/kvs/KviKvsCoreSimpleCommands_af.cpp b/src/kvirc/kvs/KviKvsCoreSimpleCommands_af.cpp index d36961e6f..9b9c8fe54 100644 --- a/src/kvirc/kvs/KviKvsCoreSimpleCommands_af.cpp +++ b/src/kvirc/kvs/KviKvsCoreSimpleCommands_af.cpp @@ -39,6 +39,8 @@ #include "KviKvsKernel.h" #include "KviKvsObjectController.h" +#include <map> + #if defined(COMPILE_X11_SUPPORT) && defined(COMPILE_QX11INFO_SUPPORT) #ifndef COMPILE_NO_X_BELL #include "KviXlib.h" // XBell : THIS SHOULD BE INCLUDED AS LAST! @@ -55,7 +57,7 @@ #include "KviTalToolTip.h" // KviApplication.cpp -extern KviPointerHashTable<QString, KviWindow> * g_pGlobalWindowDict; +extern std::map<QString, KviWindow *> g_pGlobalWindowDict; namespace KviKvsCoreSimpleCommands { @@ -130,16 +132,14 @@ namespace KviKvsCoreSimpleCommands //user want to /back if(KVSCSC_pSwitches->find('a', "all-networks")) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - if(wnd->type() == KviWindow::Console) + if(wnd.second->type() == KviWindow::Console) { - KviConsoleWindow * pConsole = (KviConsoleWindow *)wnd; + KviConsoleWindow * pConsole = (KviConsoleWindow *)wnd.second; if(pConsole->isConnected()) pConsole->connection()->sendFmtData("AWAY"); } - ++it; } } else @@ -155,17 +155,15 @@ namespace KviKvsCoreSimpleCommands if(KVSCSC_pSwitches->find('a', "all-networks")) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - if(wnd->type() == KviWindow::Console) + if(wnd.second->type() == KviWindow::Console) { - KviConsoleWindow * pConsole = (KviConsoleWindow *)wnd; + KviConsoleWindow * pConsole = (KviConsoleWindow *)wnd.second; if(pConsole->isConnected()) pConsole->connection()->sendFmtData("AWAY :%s", pConsole->connection()->encodeText(szReason).data()); } - ++it; } } else @@ -209,16 +207,14 @@ namespace KviKvsCoreSimpleCommands if(KVSCSC_pSwitches->find('a', "all-networks")) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - if(wnd->type() == KviWindow::Console) + if(wnd.second->type() == KviWindow::Console) { - KviConsoleWindow * pConsole = (KviConsoleWindow *)wnd; + KviConsoleWindow * pConsole = (KviConsoleWindow *)wnd.second; if(pConsole->isConnected()) pConsole->connection()->sendFmtData("AWAY"); } - ++it; } } else diff --git a/src/kvirc/kvs/KviKvsCoreSimpleCommands_gl.cpp b/src/kvirc/kvs/KviKvsCoreSimpleCommands_gl.cpp index 99c1a4054..b4ac02e9a 100644 --- a/src/kvirc/kvs/KviKvsCoreSimpleCommands_gl.cpp +++ b/src/kvirc/kvs/KviKvsCoreSimpleCommands_gl.cpp @@ -295,15 +295,11 @@ namespace KviKvsCoreSimpleCommands // Get the active window where we ran the command KviWindow * pActive = KVSCSC_pWindow->context()->console()->activeWindow(); - // Get the list of open windows - KviPointerList<KviWindow> * pList = g_pMainWindow->windowList(); - // Scan the windows - for(KviWindow * pWnd = pList->first(); pWnd; pWnd = pList->next()) + for(auto pWnd : g_pMainWindow->windowList()) { // Search for the right socketspy - if( - (pWnd->type() == KviWindow::SocketSpy) && (pWnd->context() == pActive->context())) + if((pWnd->type() == KviWindow::SocketSpy) && (pWnd->context() == pActive->context())) { // Ok, found... send the warning pWnd->outputNoFmt(KVI_OUT_SOCKETMESSAGE, __tr2qs_ctx("The following string was injected by the user:", "kvs")); diff --git a/src/kvirc/kvs/KviKvsKernel.cpp b/src/kvirc/kvs/KviKvsKernel.cpp index c24d7f2c8..f9a05ee9d 100644 --- a/src/kvirc/kvs/KviKvsKernel.cpp +++ b/src/kvirc/kvs/KviKvsKernel.cpp @@ -101,19 +101,19 @@ void KviKvsKernel::done() } } -#define COMPLETE_COMMAND_BY_DICT(__type, __dict) \ - { \ +#define COMPLETE_COMMAND_BY_DICT(__type, __dict) \ + { \ KviPointerHashTableIterator<QString, __type> it(*__dict); \ int l = szCommandBegin.length(); \ while(it.current()) \ { \ - if(KviQString::equalCIN(szCommandBegin, it.currentKey(), l)) \ - pMatches->append(new QString(it.currentKey())); \ - ++it; \ + if(KviQString::equalCIN(szCommandBegin, it.currentKey(), l)) \ + pMatches.push_back(it.currentKey()); \ + ++it; \ } \ } -void KviKvsKernel::completeCommand(const QString & szCommandBegin, KviPointerList<QString> * pMatches) +void KviKvsKernel::completeCommand(const QString & szCommandBegin, std::vector<QString> & pMatches) { int idx = szCommandBegin.indexOf(QChar('.')); if(idx == -1) @@ -136,25 +136,24 @@ void KviKvsKernel::completeCommand(const QString & szCommandBegin, KviPointerLis } } -void KviKvsKernel::completeModuleCommand(const QString & szModuleName, const QString & szCommandBegin, KviPointerList<QString> * pMatches) +void KviKvsKernel::completeModuleCommand(const QString & szModuleName, const QString & szCommandBegin, std::vector<QString> & pMatches) { KviModule * pModule = g_pModuleManager->getModule(szModuleName); if(!pModule) return; - KviPointerList<QString> lModuleMatches; - lModuleMatches.setAutoDelete(true); - pModule->completeCommand(szCommandBegin, &lModuleMatches); - for(QString * pszModuleMatch = lModuleMatches.first(); pszModuleMatch; pszModuleMatch = lModuleMatches.next()) + std::vector<QString> lModuleMatches; + + pModule->completeCommand(szCommandBegin, lModuleMatches); + for(auto & pszModuleMatch : lModuleMatches) { - QString * pszMatch = new QString(*pszModuleMatch); - pszMatch->prepend("."); - pszMatch->prepend(szModuleName); - pMatches->append(pszMatch); + pszModuleMatch.prepend("."); + pszModuleMatch.prepend(szModuleName); + pMatches.push_back(std::move(pszModuleMatch)); } } -void KviKvsKernel::completeFunction(const QString & szFunctionBegin, KviPointerList<QString> * pMatches) +void KviKvsKernel::completeFunction(const QString & szFunctionBegin, std::vector<QString> & pMatches) { int idx = szFunctionBegin.indexOf(QChar('.')); if(idx == -1) @@ -166,26 +165,17 @@ void KviKvsKernel::completeFunction(const QString & szFunctionBegin, KviPointerL while(it.current()) { if(KviQString::equalCIN(szFunctionBegin, it.currentKey(), l)) - { - QString * pMatch = new QString(it.currentKey()); - //pMatch->prepend("$"); - pMatches->append(pMatch); - } + pMatches.push_back(it.currentKey()); ++it; } g_pModuleManager->completeModuleNames(szFunctionBegin, pMatches); - KviPointerList<QString> lAliases; - lAliases.setAutoDelete(true); + std::vector<QString> lAliases; - KviKvsAliasManager::instance()->completeCommand(szFunctionBegin, &lAliases); - for(QString * pszAlias = lAliases.first(); pszAlias; pszAlias = lAliases.next()) - { - QString * pszAliasMatch = new QString(*pszAlias); - //pszAliasMatch->prepend("$"); - pMatches->append(pszAliasMatch); - } + KviKvsAliasManager::instance()->completeCommand(szFunctionBegin, lAliases); + for(auto & pszAlias : lAliases) + pMatches.push_back(std::move(pszAlias)); } else { @@ -196,24 +186,24 @@ void KviKvsKernel::completeFunction(const QString & szFunctionBegin, KviPointerL } } -void KviKvsKernel::completeModuleFunction(const QString & szModuleName, const QString & szCommandBegin, KviPointerList<QString> * pMatches) +void KviKvsKernel::completeModuleFunction(const QString & szModuleName, const QString & szCommandBegin, std::vector<QString> & pMatches) { KviModule * pModule = g_pModuleManager->getModule(szModuleName); if(!pModule) return; - KviPointerList<QString> lModuleMatches; - lModuleMatches.setAutoDelete(true); - pModule->completeFunction(szCommandBegin, &lModuleMatches); - for(QString * pszModuleMatch = lModuleMatches.first(); pszModuleMatch; pszModuleMatch = lModuleMatches.next()) + std::vector<QString> lModuleMatches; + + pModule->completeFunction(szCommandBegin, lModuleMatches); + for(auto & pszModuleMatch : lModuleMatches) { - QString * pszMatch = new QString(*pszModuleMatch); - pszMatch->prepend("."); - pszMatch->prepend(szModuleName); - pszMatch->prepend("$"); - pMatches->append(pszMatch); + pszModuleMatch.prepend("."); + pszModuleMatch.prepend(szModuleName); + pszModuleMatch.prepend("$"); + pMatches.push_back(std::move(pszModuleMatch)); } } + void KviKvsKernel::getAllFunctionsCommandsCore(QStringList * list) { KviPointerHashTableIterator<QString, KviKvsCoreFunctionExecRoutine> it(*m_pCoreFunctionExecRoutineDict); diff --git a/src/kvirc/kvs/KviKvsKernel.h b/src/kvirc/kvs/KviKvsKernel.h index bb09dd508..5dcaf8de4 100644 --- a/src/kvirc/kvs/KviKvsKernel.h +++ b/src/kvirc/kvs/KviKvsKernel.h @@ -27,11 +27,12 @@ #include "kvi_settings.h" #include "KviKvsParser.h" -#include "KviPointerList.h" #include "KviQString.h" #include "KviPointerHashTable.h" +#include <vector> + class KviKvsTreeNodeSpecialCommand; class KviKvsObjectController; class KviKvsAsyncOperationManager; @@ -104,6 +105,7 @@ public: { m_pSpecialCommandParsingRoutineDict->replace(szCmdName, r); }; + KviKvsSpecialCommandParsingRoutine * findSpecialCommandParsingRoutine(const QString & szCmdName) { return m_pSpecialCommandParsingRoutineDict->find(szCmdName); @@ -113,6 +115,7 @@ public: { m_pCoreSimpleCommandExecRoutineDict->replace(szCmdName, r); }; + KviKvsCoreSimpleCommandExecRoutine * findCoreSimpleCommandExecRoutine(const QString & szCmdName) { return m_pCoreSimpleCommandExecRoutineDict->find(szCmdName); @@ -122,6 +125,7 @@ public: { m_pCoreFunctionExecRoutineDict->replace(szFncName, r); }; + KviKvsCoreFunctionExecRoutine * findCoreFunctionExecRoutine(const QString & szFncName) { return m_pCoreFunctionExecRoutineDict->find(szFncName); @@ -131,43 +135,17 @@ public: { m_pCoreCallbackCommandExecRoutineDict->replace(szCmdName, r); }; + KviKvsCoreCallbackCommandExecRoutine * findCoreCallbackCommandExecRoutine(const QString & szCmdName) { return m_pCoreCallbackCommandExecRoutineDict->find(szCmdName); }; - void completeCommand(const QString & szCommandBegin, KviPointerList<QString> * pMatches); - void completeFunction(const QString & szFunctionBegin, KviPointerList<QString> * pMatches); - void completeModuleCommand(const QString & szModuleName, const QString & szCommandBegin, KviPointerList<QString> * matches); - void completeModuleFunction(const QString & szModuleName, const QString & szFunctionBegin, KviPointerList<QString> * matches); + void completeCommand(const QString & szCommandBegin, std::vector<QString> & pMatches); + void completeFunction(const QString & szFunctionBegin, std::vector<QString> & pMatches); + void completeModuleCommand(const QString & szModuleName, const QString & szCommandBegin, std::vector<QString> & matches); + void completeModuleFunction(const QString & szModuleName, const QString & szFunctionBegin, std::vector<QString> & matches); - KviPointerList<QString> * completeCommandAllocateResult(const QString & szCommandBegin) - { - KviPointerList<QString> * p = new KviPointerList<QString>; - p->setAutoDelete(true); - completeCommand(szCommandBegin, p); - return p; - } - - KviPointerList<QString> * completeFunctionAllocateResult(const QString & szFunctionBegin) - { - KviPointerList<QString> * p = new KviPointerList<QString>; - p->setAutoDelete(true); - completeFunction(szFunctionBegin, p); - return p; - } - void freeCompletionResult(KviPointerList<QString> * l) - { - /* if (!l) return; - for (int i=0;i<l->count();i++) - { - delete l->at(i); - } - */ - if(!l) - return; - delete l; - } void getAllFunctionsCommandsCore(QStringList * list); }; diff --git a/src/kvirc/kvs/KviKvsModuleInterface.cpp b/src/kvirc/kvs/KviKvsModuleInterface.cpp index 7dbdb3c11..a3a9dfd08 100644 --- a/src/kvirc/kvs/KviKvsModuleInterface.cpp +++ b/src/kvirc/kvs/KviKvsModuleInterface.cpp @@ -64,25 +64,25 @@ KviKvsModuleInterface::~KviKvsModuleInterface() delete m_pModuleCallbackCommandExecRoutineDict; } -#define COMPLETE_WORD_BY_DICT(__word, __list, __type, __dict) \ - { \ - KviPointerHashTableIterator<QString, __type> it(*__dict); \ - int l = __word.length(); \ +#define COMPLETE_WORD_BY_DICT(word, list, type, dict) \ + { \ + KviPointerHashTableIterator<QString, type> it(*dict); \ + int l = word.length(); \ while(it.current()) \ { \ - if(KviQString::equalCIN(__word, it.currentKey(), l)) \ - __list->append(new QString(it.currentKey())); \ - ++it; \ + if(KviQString::equalCIN(word, it.currentKey(), l)) \ + list.push_back(it.currentKey()); \ + ++it; \ } \ } -void KviKvsModuleInterface::completeCommand(const QString & szCommandBegin, KviPointerList<QString> * pMatches) +void KviKvsModuleInterface::completeCommand(const QString & szCommandBegin, std::vector<QString> & pMatches) { COMPLETE_WORD_BY_DICT(szCommandBegin, pMatches, KviKvsModuleSimpleCommandExecRoutine, m_pModuleSimpleCommandExecRoutineDict) COMPLETE_WORD_BY_DICT(szCommandBegin, pMatches, KviKvsModuleCallbackCommandExecRoutine, m_pModuleCallbackCommandExecRoutineDict) } -void KviKvsModuleInterface::completeFunction(const QString & szFunctionBegin, KviPointerList<QString> * pMatches) +void KviKvsModuleInterface::completeFunction(const QString & szFunctionBegin, std::vector<QString> & pMatches) { COMPLETE_WORD_BY_DICT(szFunctionBegin, pMatches, KviKvsModuleFunctionExecRoutine, m_pModuleFunctionExecRoutineDict) } diff --git a/src/kvirc/kvs/KviKvsModuleInterface.h b/src/kvirc/kvs/KviKvsModuleInterface.h index f2b5c0416..0d04b195e 100644 --- a/src/kvirc/kvs/KviKvsModuleInterface.h +++ b/src/kvirc/kvs/KviKvsModuleInterface.h @@ -32,9 +32,10 @@ #include "KviKvsParameterProcessor.h" #include "KviKvsSwitchList.h" #include "KviKvsScript.h" -#include "KviPointerList.h" #include "KviQString.h" +#include <vector> + class KviModule; class KviKvsTreeNodeDataList; @@ -195,8 +196,8 @@ public: return m_pModuleFunctionExecRoutineDict->find(szFunction); }; - void completeCommand(const QString & cmd, KviPointerList<QString> * matches); - void completeFunction(const QString & cmd, KviPointerList<QString> * matches); + void completeCommand(const QString & cmd, std::vector<QString> & matches); + void completeFunction(const QString & cmd, std::vector<QString> & matches); void getAllFunctionsCommandsModule(QStringList * list, QString & szModuleName); protected: diff --git a/src/kvirc/module/KviModuleExtension.cpp b/src/kvirc/module/KviModuleExtension.cpp index 40f9f85d3..d808c5a25 100644 --- a/src/kvirc/module/KviModuleExtension.cpp +++ b/src/kvirc/module/KviModuleExtension.cpp @@ -28,6 +28,9 @@ #include "KviModule.h" #include "KviModuleManager.h" #include "KviApplication.h" +#include "KviPtrListIterator.h" + +#include <vector> // created and destroyed in KviApplication.cpp KVIRC_API KviModuleExtensionManager * g_pModuleExtensionManager = nullptr; @@ -122,29 +125,28 @@ KviModuleExtensionDescriptor * KviModuleExtensionManager::registerExtension(KviM void KviModuleExtensionManager::unregisterExtensionsByModule(KviModule * m) { KviPointerHashTableIterator<const char *, KviModuleExtensionDescriptorList> it(*m_pExtensionDict); - KviPointerList<KviCString> dying; - dying.setAutoDelete(true); + std::vector<KviCString *> dying; + while(KviModuleExtensionDescriptorList * l = it.current()) { - KviPointerList<KviModuleExtensionDescriptor> dying2; - dying2.setAutoDelete(true); + std::vector<KviModuleExtensionDescriptor *> dying2; - for(KviModuleExtensionDescriptor * d = l->first(); d; d = l->next()) + for(auto & d : l) { - if(d->module() == m) - dying2.append(d); + if(d.module() == m) + dying2.push_back(&d); } - for(KviModuleExtensionDescriptor * de = dying2.first(); de; de = dying2.next()) + for(auto de : dying2) { l->removeRef(de); } if(l->isEmpty()) - dying.append(new KviCString(it.currentKey())); + dying.push_back(new KviCString(it.currentKey())); ++it; } - for(KviCString * li = dying.first(); li; li = dying.next()) + for(auto li : dying) { m_pExtensionDict->remove(li->ptr()); } @@ -190,22 +192,20 @@ KviModuleExtension * KviModuleExtensionManager::allocateExtension(const KviCStri if(!l) return nullptr; - KviModuleExtensionDescriptor * d; - - for(d = l->first(); d; d = l->next()) + for(auto & d : l) { - if(d->name().equalsCI(szName)) - return d->allocate(pWnd, pParams, pSpecial); + if(d.name().equalsCI(szName)) + return d.allocate(pWnd, pParams, pSpecial); } // uhm... not there ? g_pModuleManager->loadModulesByCaps(szType.ptr()); // try again after loading the modules // l = m_pExtensionDict->find(szType.ptr()); <--- this shouldn't change! - for(d = l->first(); d; d = l->next()) + for(auto & d : l) { - if(d->name().equalsCI(szName)) - return d->allocate(pWnd, pParams, pSpecial); + if(d.name().equalsCI(szName)) + return d.allocate(pWnd, pParams, pSpecial); } // no way : no such extension @@ -219,21 +219,20 @@ KviModuleExtension * KviModuleExtensionManager::allocateExtension(const KviCStri if(!l) return nullptr; - KviModuleExtensionDescriptor * d; - for(d = l->first(); d; d = l->next()) + for(auto & d : l) { - if(d->id() == id) - return d->allocate(pWnd, pParams, pSpecial); + if(d.id() == id) + return d.allocate(pWnd, pParams, pSpecial); } // uhm... not there ? g_pModuleManager->loadModulesByCaps(szType.ptr()); // try again after loading the modules // l = m_pExtensionDict->find(szType.ptr()); <--- this shouldn't change! - for(d = l->first(); d; d = l->next()) + for(auto & d : l) { - if(d->id() == id) - return d->allocate(pWnd, pParams, pSpecial); + if(d.id() == id) + return d.allocate(pWnd, pParams, pSpecial); } // no way : no such extension diff --git a/src/kvirc/module/KviModuleManager.cpp b/src/kvirc/module/KviModuleManager.cpp index c9e3b0a49..bf984685f 100644 --- a/src/kvirc/module/KviModuleManager.cpp +++ b/src/kvirc/module/KviModuleManager.cpp @@ -35,6 +35,7 @@ #include <QDir> #include <QLibrary> +#include <vector> KviModuleManager * g_pModuleManager = nullptr; @@ -84,7 +85,7 @@ void KviModuleManager::loadModulesByCaps(const QString & caps) loadModulesByCaps(caps, szDir); } -void KviModuleManager::completeModuleNames(const QString & path, const QString & word, KviPointerList<QString> * matches) +void KviModuleManager::completeModuleNames(const QString & path, const QString & word, std::vector<QString> & matches) { QDir d(path); #if defined(COMPILE_ON_WINDOWS) @@ -97,32 +98,27 @@ void KviModuleManager::completeModuleNames(const QString & path, const QString & // FIXME: maybe check timestamps ? (old modules) QStringList sl = d.entryList(QDir::Files | QDir::Readable | QDir::NoSymLinks); - for(auto & it : sl) + for(auto & modname : sl) { - QString * modname = new QString(it); - KviQString::cutToLast(*modname, KVI_PATH_SEPARATOR_CHAR); - KviQString::cutToFirst(*modname, "kvi"); - if(KviQString::equalCIN(word, *modname, word.length())) + KviQString::cutToLast(modname, KVI_PATH_SEPARATOR_CHAR); + KviQString::cutToFirst(modname, "kvi"); + if(KviQString::equalCIN(word, modname, word.length())) { #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) - KviQString::cutFromLast(*modname, ".dll"); + KviQString::cutFromLast(modname, ".dll"); #else - KviQString::cutFromLast(*modname, ".so"); + KviQString::cutFromLast(modname, ".so"); #endif - if(!modname->isEmpty()) + if(!modname.isEmpty()) { - modname->append('.'); - matches->append(modname); + modname.append('.'); + matches.push_back(std::move(modname)); } - else - delete modname; } - else - delete modname; } } -void KviModuleManager::completeModuleNames(const QString & word, KviPointerList<QString> * matches) +void KviModuleManager::completeModuleNames(const QString & word, std::vector<QString> & matches) { QString szDir; // FIXME: Should check for duplicate names here! @@ -336,8 +332,7 @@ void KviModuleManager::cleanupUnusedModules() { KviPointerHashTableIterator<QString, KviModule> it(*m_pModuleDict); - KviPointerList<KviModule> lModulesToUnload; - lModulesToUnload.setAutoDelete(false); + std::vector<KviModule *> lModulesToUnload; while(it.current()) { @@ -346,7 +341,7 @@ void KviModuleManager::cleanupUnusedModules() if(it.current()->moduleInfo()->can_unload) { if((it.current()->moduleInfo()->can_unload)(it.current())) - lModulesToUnload.append(it.current()); + lModulesToUnload.push_back(it.current()); else { // the module don't want to be unloaded @@ -357,13 +352,13 @@ void KviModuleManager::cleanupUnusedModules() else { if(!(it.current()->isLocked())) - lModulesToUnload.append(it.current()); + lModulesToUnload.push_back(it.current()); } } ++it; } - for(KviModule * pModule = lModulesToUnload.first(); pModule; pModule = lModulesToUnload.next()) + for(auto pModule : lModulesToUnload) unloadModule(pModule); } @@ -371,14 +366,14 @@ void KviModuleManager::unloadAllModules() { KviPointerHashTableIterator<QString, KviModule> it(*m_pModuleDict); - KviPointerList<KviModule> lModulesToUnload; - lModulesToUnload.setAutoDelete(false); + std::vector<KviModule *> lModulesToUnload; + while(KviModule * pModule = it.current()) { - lModulesToUnload.append(pModule); + lModulesToUnload.push_back(pModule); ++it; } - for(KviModule * pModule = lModulesToUnload.first(); pModule; pModule = lModulesToUnload.next()) + for(auto pModule : lModulesToUnload) unloadModule(pModule); } diff --git a/src/kvirc/module/KviModuleManager.h b/src/kvirc/module/KviModuleManager.h index 96c924c22..3c85dcbf3 100644 --- a/src/kvirc/module/KviModuleManager.h +++ b/src/kvirc/module/KviModuleManager.h @@ -25,12 +25,12 @@ //============================================================================= #include "kvi_settings.h" -#include "KviPointerList.h" #include "KviModule.h" #include "KviPointerHashTable.h" #include <QTimer> #include <QObject> +#include <vector> class KVIRC_API KviModuleManager : public QObject { @@ -56,10 +56,10 @@ public: void loadModulesByCaps(const QString & caps, const QString & dir); void loadModulesByCaps(const QString & caps); bool hasLockedModules(); - void completeModuleNames(const QString & word, KviPointerList<QString> * matches); + void completeModuleNames(const QString & word, std::vector<QString> & matches); protected: - void completeModuleNames(const QString & path, const QString & work, KviPointerList<QString> * matches); + void completeModuleNames(const QString & path, const QString & work, std::vector<QString> & matches); public slots: void cleanupUnusedModules(); signals: diff --git a/src/kvirc/sparser/KviAntiSpam.cpp b/src/kvirc/sparser/KviAntiSpam.cpp index 05fc6690d..46dd605ca 100644 --- a/src/kvirc/sparser/KviAntiSpam.cpp +++ b/src/kvirc/sparser/KviAntiSpam.cpp @@ -65,7 +65,7 @@ [/example] */ -bool kvi_mayBeSpam(KviCString * msg, KviCString & spamWord) +bool kvi_mayBeSpam(KviCString msg, KviCString & spamWord) { for(auto & it : KVI_OPTION_STRINGLIST(KviOption_stringlistSpamWords)) { @@ -73,7 +73,7 @@ bool kvi_mayBeSpam(KviCString * msg, KviCString & spamWord) const char * aux = it.toLatin1(); if(aux) { - if(msg->findFirstIdx(aux, false) != -1) + if(msg.findFirstIdx(aux, false) != -1) { spamWord = aux; return true; diff --git a/src/kvirc/sparser/KviAntiSpam.h b/src/kvirc/sparser/KviAntiSpam.h index b00cb3d25..739c75508 100644 --- a/src/kvirc/sparser/KviAntiSpam.h +++ b/src/kvirc/sparser/KviAntiSpam.h @@ -27,6 +27,6 @@ #include "kvi_settings.h" #include "KviCString.h" -extern KVIRC_API bool kvi_mayBeSpam(KviCString * msg, KviCString & spamWord); +extern KVIRC_API bool kvi_mayBeSpam(KviCString msg, KviCString & spamWord); #endif // _KVI_ANTISPAM_H_ diff --git a/src/kvirc/sparser/KviIrcMessage.cpp b/src/kvirc/sparser/KviIrcMessage.cpp index e22c6f659..91be10bff 100644 --- a/src/kvirc/sparser/KviIrcMessage.cpp +++ b/src/kvirc/sparser/KviIrcMessage.cpp @@ -35,9 +35,6 @@ KviIrcMessage::KviIrcMessage(const char * message, KviIrcConnection * pConnectio const char * aux; m_ptr = message; - m_pParams = new KviPointerList<KviCString>; - m_pParams->setAutoDelete(true); - while(*m_ptr == ' ') ++m_ptr; const char * allParams = m_ptr; // just to be sure @@ -75,7 +72,7 @@ KviIrcMessage::KviIrcMessage(const char * message, KviIrcConnection * pConnectio if(*m_ptr == ':') { ++m_ptr; - m_pParams->append(new KviCString(m_ptr)); + m_pParams.push_back(KviCString(m_ptr)); break; // this was the last } else @@ -83,7 +80,7 @@ KviIrcMessage::KviIrcMessage(const char * message, KviIrcConnection * pConnectio aux = m_ptr; while(*m_ptr && (*m_ptr != ' ')) ++m_ptr; - m_pParams->append(new KviCString(aux, m_ptr)); + m_pParams.push_back(KviCString(aux, m_ptr)); while(*m_ptr == ' ') ++m_ptr; } @@ -126,7 +123,6 @@ KviIrcMessage::KviIrcMessage(const char * message, KviIrcConnection * pConnectio KviIrcMessage::~KviIrcMessage() { - delete m_pParams; } void KviIrcMessage::decodeAndSplitMask(char * b, QString & szNick, QString & szUser, QString & szHost) diff --git a/src/kvirc/sparser/KviIrcMessage.h b/src/kvirc/sparser/KviIrcMessage.h index 3f110cdc9..459968338 100644 --- a/src/kvirc/sparser/KviIrcMessage.h +++ b/src/kvirc/sparser/KviIrcMessage.h @@ -25,14 +25,13 @@ //============================================================================= #include "kvi_settings.h" -#include "KviPointerList.h" #include "KviCString.h" #include "KviQString.h" #include "KviConsoleWindow.h" #include "KviKvsHash.h" -#include <QMap> #include <QDateTime> +#include <vector> class KviIrcConnection; class KviIrcContext; @@ -51,7 +50,8 @@ class KVIRC_API KviIrcMessage { public: KviIrcMessage(const char * message, KviIrcConnection * pConnection); - + KviIrcMessage(const KviIrcMessage &) = delete; + KviIrcMessage & operator=(const KviIrcMessage & other) = delete; ~KviIrcMessage(); public: @@ -76,7 +76,7 @@ private: KviCString m_szPrefix; // the extracted prefix string KviCString m_szMessageTags; // the extracted message tags KviCString m_szCommand; // the extracted command (may be numeric) - KviPointerList<KviCString> * m_pParams; // the list of parameters + std::vector<KviCString> m_pParams; // the list of parameters QHash<QString, QString> m_ParsedMessageTags; // parsed messaged tags KviConsoleWindow * m_pConsole; // the console we're attacched to KviIrcConnection * m_pConnection; // the connection we're attacched to @@ -108,37 +108,40 @@ public: QDateTime serverTime() { return m_time; } - bool isEmpty() { return (m_szPrefix.isEmpty() && m_szCommand.isEmpty() && m_pParams->isEmpty()); }; + bool isEmpty() { return (m_szPrefix.isEmpty() && m_szCommand.isEmpty() && m_pParams.empty()); }; - int paramCount() { return m_pParams->count(); }; + int paramCount() { return m_pParams.size(); }; - const char * param(unsigned int idx) { return (idx < m_pParams->count()) ? m_pParams->at(idx)->ptr() : 0; }; + const char * param(unsigned int idx) { return (idx < m_pParams.size()) ? m_pParams[idx].ptr() : 0; }; - const char * safeParam(unsigned int idx) { return (idx < m_pParams->count()) ? m_pParams->at(idx)->ptr() : KviCString::emptyString().ptr(); }; + const char * safeParam(unsigned int idx) { return (idx < m_pParams.size()) ? m_pParams[idx].ptr() : KviCString::emptyString().ptr(); }; - KviCString * paramString(unsigned int idx) { return m_pParams->at(idx); }; + KviCString paramString(unsigned int idx) { return m_pParams[idx]; }; const char * trailing() { - KviCString * tr = m_pParams->last(); - return tr ? tr->ptr() : 0; + if(m_pParams.empty()) + return nullptr; + return m_pParams.back(); }; - KviCString * trailingString() { return m_pParams->last(); }; + KviCString trailingString() { return m_pParams.back(); }; KviCString & safeTrailingString() { - KviCString * tr = m_pParams->last(); - return tr ? *tr : KviCString::emptyString(); + if(m_pParams.empty()) + return KviCString::emptyString(); + return m_pParams.back(); }; const char * safeTrailing() { - KviCString * tr = m_pParams->last(); - return tr ? tr->ptr() : KviCString::emptyString().ptr(); + if(m_pParams.empty()) + return KviCString::emptyString().ptr(); + return m_pParams.back().ptr(); }; const char * allParams() { return m_ptr; }; - KviCString * firstParam() { return m_pParams->first(); }; - KviCString * nextParam() { return m_pParams->next(); }; + KviCString firstParam() { return m_pParams.front(); }; + std::vector<KviCString> const & params() const { return m_pParams; }; void setHaltOutput() { m_iFlags |= HaltOutput; }; bool haltOutput() { return (m_iFlags & HaltOutput); }; diff --git a/src/kvirc/sparser/KviIrcServerParser.cpp b/src/kvirc/sparser/KviIrcServerParser.cpp index e500b2b8a..320d4caa9 100644 --- a/src/kvirc/sparser/KviIrcServerParser.cpp +++ b/src/kvirc/sparser/KviIrcServerParser.cpp @@ -59,8 +59,8 @@ void KviIrcServerParser::parseMessage(const char * message, KviIrcConnection * p parms.append(pConnection->decodeText(msg.safePrefix())); parms.append(pConnection->decodeText(msg.command())); - for(KviCString * str = msg.firstParam(); str; str = msg.nextParam()) - parms.append(pConnection->console()->decodeText(str->ptr())); + for(auto & str : msg.params()) + parms.append(pConnection->console()->decodeText(str.ptr())); if(KviKvsEventManager::instance()->triggerRaw(msg.numeric(), pConnection->console(), &parms)) msg.setHaltOutput(); @@ -119,8 +119,8 @@ void KviIrcServerParser::parseMessage(const char * message, KviIrcConnection * p parms.append(pConnection->decodeText(msg.safePrefix())); parms.append(pConnection->decodeText(msg.command())); - for(KviCString * str = msg.firstParam(); str; str = msg.nextParam()) - parms.append(pConnection->console()->decodeText(str->ptr())); + for(auto & str : msg.params()) + parms.append(pConnection->console()->decodeText(str.ptr())); if(KviKvsEventManager::instance()->trigger(KviEvent_OnUnhandledLiteral, pConnection->console(), &parms)) msg.setHaltOutput(); diff --git a/src/kvirc/sparser/KviIrcServerParser.h b/src/kvirc/sparser/KviIrcServerParser.h index 027bcf1f7..67d06180c 100644 --- a/src/kvirc/sparser/KviIrcServerParser.h +++ b/src/kvirc/sparser/KviIrcServerParser.h @@ -25,7 +25,6 @@ //============================================================================= #include "kvi_settings.h" -#include "KviPointerList.h" #include "KviQString.h" #include "KviConsoleWindow.h" #include "KviIrcMessage.h" diff --git a/src/kvirc/sparser/KviIrcServerParser_literalHandlers.cpp b/src/kvirc/sparser/KviIrcServerParser_literalHandlers.cpp index 2e2c1a018..37b8bd2a9 100644 --- a/src/kvirc/sparser/KviIrcServerParser_literalHandlers.cpp +++ b/src/kvirc/sparser/KviIrcServerParser_literalHandlers.cpp @@ -201,7 +201,7 @@ void KviIrcServerParser::parseLiteralChghost(KviIrcMessage * msg) if(KVS_TRIGGER_EVENT_5_HALTED(KviEvent_OnHostChange, console, szNick, szUser, szHost, szNewUser, szNewHost)) msg->setHaltOutput(); - for(KviChannelWindow * c = console->connection()->channelList()->first(); c; c = console->connection()->channelList()->next()) + for(auto & c : console->connection()->channelList()) { if(!msg->haltOutput()) { @@ -600,19 +600,16 @@ void KviIrcServerParser::parseLiteralQuit(KviIrcMessage * msg) if(console->connection()) { - for( - KviChannelWindow * daChan = console->connection()->channelList()->first(); - daChan; - daChan = console->connection()->channelList()->next()) + for(auto & c : console->connection()->channelList()) { - if(daChan->isOn(szNick)) + if(c->isOn(szNick)) { if(chanlist.isEmpty()) - chanlist = daChan->windowName(); + chanlist = c->windowName(); else { chanlist.append(','); - chanlist.append(daChan->windowName()); + chanlist.append(c->windowName()); } } } @@ -629,7 +626,7 @@ void KviIrcServerParser::parseLiteralQuit(KviIrcMessage * msg) msg->setHaltOutput(); } - for(KviChannelWindow * c = console->connection()->channelList()->first(); c; c = console->connection()->channelList()->next()) + for(auto & c : console->connection()->channelList()) { if(c->part(szNick)) { @@ -861,21 +858,21 @@ void KviIrcServerParser::parseLiteralPrivmsg(KviIrcMessage * msg) PrivmsgIdentifyMsgCapState eCapState = IdentifyMsgCapNotUsed; - KviCString * pTrailing = msg->trailingString(); + KviCString pTrailing = msg->trailingString(); if(pTrailing) { if(msg->connection()->stateData()->identifyMsgCapabilityEnabled()) { - switch(*(pTrailing->ptr())) + switch(*(pTrailing.ptr())) { case '+': // message from identified user eCapState = IdentifyMsgCapUsedIdentified; - pTrailing->cutLeft(1); // kill the first char + pTrailing.cutLeft(1); // kill the first char break; case '-': eCapState = IdentifyMsgCapUsedNotIdentified; - pTrailing->cutLeft(1); // kill the first char + pTrailing.cutLeft(1); // kill the first char break; default: // nothing interesting @@ -883,17 +880,17 @@ void KviIrcServerParser::parseLiteralPrivmsg(KviIrcMessage * msg) } } - if(*(pTrailing->ptr()) == 0x01) + if(*(pTrailing.ptr()) == 0x01) { // FIXME: #warning "DEDICATED CTCP WINDOW ?" - if(pTrailing->len() > 1) + if(pTrailing.len() > 1) { - if(pTrailing->lastCharIs(0x01)) - pTrailing->cutRight(1); - pTrailing->cutLeft(1); + if(pTrailing.lastCharIs(0x01)) + pTrailing.cutRight(1); + pTrailing.cutLeft(1); KviCtcpMessage ctcp; ctcp.msg = msg; - ctcp.pData = pTrailing->ptr(); + ctcp.pData = pTrailing.ptr(); KviIrcMask mSource(szSourceNick, szSourceUser, szSourceHost); // FIXME! ctcp.pSource = &mSource; ctcp.szTarget = szTarget; @@ -979,7 +976,7 @@ void KviIrcServerParser::parseLiteralPrivmsg(KviIrcMessage * msg) // spam message... if(KVI_OPTION_BOOL(KviOption_boolUseAntiSpamOnPrivmsg)) { - KviCString * theMsg = msg->trailingString(); + KviCString theMsg = msg->trailingString(); if(theMsg) { KviCString spamWord; @@ -1120,12 +1117,14 @@ void KviIrcServerParser::parseLiteralPrivmsg(KviIrcMessage * msg) pOut = aWin; else { - for(KviChannelWindow * c = pConnection->channelList()->first(); c; c = pConnection->channelList()->next()) + for(auto & c : pConnection->channelList()) + { if(c->isOn(szOtherNick)) { - pOut = (KviWindow *)c; + pOut = c; break; } + } } } @@ -1233,19 +1232,19 @@ void KviIrcServerParser::parseLiteralNotice(KviIrcMessage * msg) // FIXME: "DEDICATED CTCP WINDOW ?" - KviCString * pTrailing = msg->trailingString(); + KviCString pTrailing = msg->trailingString(); if(pTrailing) { - if(*(pTrailing->ptr()) == 0x01) + if(*(pTrailing.ptr()) == 0x01) { - if(pTrailing->len() > 1) + if(pTrailing.len() > 1) { - if(pTrailing->lastCharIs(0x01)) - pTrailing->cutRight(1); - pTrailing->cutLeft(1); + if(pTrailing.lastCharIs(0x01)) + pTrailing.cutRight(1); + pTrailing.cutLeft(1); KviCtcpMessage ctcp; ctcp.msg = msg; - ctcp.pData = pTrailing->ptr(); + ctcp.pData = pTrailing.ptr(); KviIrcMask talker(szNick, szUser, szHost); // FIXME ctcp.pSource = &talker; ctcp.szTarget = msg->connection()->decodeText(msg->safeParam(0)); @@ -1425,7 +1424,7 @@ void KviIrcServerParser::parseLiteralNotice(KviIrcMessage * msg) // spam message... if(KVI_OPTION_BOOL(KviOption_boolUseAntiSpamOnNotice)) { - KviCString * theMsg = msg->trailingString(); // FIXME + KviCString theMsg = msg->trailingString(); // FIXME if(theMsg) { KviCString spamWord; @@ -1540,10 +1539,10 @@ void KviIrcServerParser::parseLiteralNotice(KviIrcMessage * msg) pOut = aWin; else { - for(KviChannelWindow * c = pConnection->channelList()->first(); c; c = pConnection->channelList()->next()) + for(auto & c : pConnection->channelList()) if(c->isOn(szNick)) { - pOut = (KviWindow *)c; + pOut = c; break; } } @@ -1750,7 +1749,7 @@ void KviIrcServerParser::parseLiteralNick(KviIrcMessage * msg) if(pUserEntry) pUserEntry->setSmartNickColor(-1); - for(KviChannelWindow * c = console->connection()->channelList()->first(); c; c = console->connection()->channelList()->next()) + for(auto & c : console->connection()->channelList()) { if(c->nickChange(szNick, szNewNick)) { @@ -1773,10 +1772,7 @@ void KviIrcServerParser::parseLiteralNick(KviIrcMessage * msg) console->output(KVI_OUT_NICK, __tr2qs("You have changed your nickname to %Q"), &szNewNick); // just update all the captions : we have changed OUR nick - for( - KviQueryWindow * q = console->connection()->queryList()->first(); - q; - q = console->connection()->queryList()->next()) + for(auto & q : console->connection()->queryList()) { if(!msg->haltOutput()) q->output(KVI_OUT_NICK, __tr2qs("You have changed your nickname to %Q"), &szNewNick); diff --git a/src/kvirc/sparser/KviIrcServerParser_numericHandlers.cpp b/src/kvirc/sparser/KviIrcServerParser_numericHandlers.cpp index 12101c734..64cbccbff 100644 --- a/src/kvirc/sparser/KviIrcServerParser_numericHandlers.cpp +++ b/src/kvirc/sparser/KviIrcServerParser_numericHandlers.cpp @@ -2422,8 +2422,7 @@ void KviIrcServerParser::parseNumericStats(KviIrcMessage * msg) if(msg->paramCount() > 2) { KviCString szParms; - KviCString * p = msg->firstParam(); - for(p = msg->nextParam(); p; p = msg->nextParam()) + for(auto & p : msg->params()) { if(szParms.hasData()) szParms.append(' '); diff --git a/src/kvirc/ui/KviChannelWindow.cpp b/src/kvirc/ui/KviChannelWindow.cpp index 2620e840f..81e4d9e79 100644 --- a/src/kvirc/ui/KviChannelWindow.cpp +++ b/src/kvirc/ui/KviChannelWindow.cpp @@ -51,7 +51,6 @@ #include "KviIrcConnectionRequestQueue.h" #include "KviIrcServerParser.h" #include "KviModeWidget.h" -#include "KviPointerHashTable.h" #include "KviKvsScript.h" #include "KviKvsEventTriggers.h" @@ -60,6 +59,7 @@ #include "KviCryptController.h" #endif +#include <set> #include <time.h> #include <QDate> @@ -80,8 +80,6 @@ KviChannelWindow::KviChannelWindow(KviConsoleWindow * lpConsole, const QString & // Init some member variables m_pInput = nullptr; m_iStateFlags = 0; - m_pActionHistory = new KviPointerList<KviChannelAction>; - m_pActionHistory->setAutoDelete(true); m_uActionHistoryHotActionCount = 0; m_pTmpHighLighted = new QStringList(); @@ -159,7 +157,7 @@ KviChannelWindow::KviChannelWindow(KviConsoleWindow * lpConsole, const QString & pButton = new KviWindowToolPageButton(KviIconManager::UnBan, KviIconManager::Ban, szDescription, buttonContainer(), false); pButton->setObjectName("ban_editor_button"); connect(pButton, SIGNAL(clicked()), this, SLOT(toggleListModeEditor())); - m_pListEditorButtons.insert(cMode, pButton); + m_ListEditorButtons.emplace(cMode, pButton); //other list modes (dynamic) QString szListModes = ""; @@ -206,7 +204,7 @@ KviChannelWindow::KviChannelWindow(KviConsoleWindow * lpConsole, const QString & pButton = new KviWindowToolPageButton(eIconOn, eIconOff, szDescription, buttonContainer(), false); pButton->setObjectName("list_mode_editor_button"); connect(pButton, SIGNAL(clicked()), this, SLOT(toggleListModeEditor())); - m_pListEditorButtons.insert(cMode, pButton); + m_ListEditorButtons.emplace(cMode, pButton); } } @@ -263,15 +261,17 @@ KviChannelWindow::~KviChannelWindow() m_pUserListView->enableUpdates(false); m_pUserListView->partAll(); - delete m_pActionHistory; delete m_pTmpHighLighted; - qDeleteAll(m_pListEditors); - m_pListEditors.clear(); - qDeleteAll(m_pListEditorButtons); - m_pListEditorButtons.clear(); - qDeleteAll(m_pModeLists); - m_pModeLists.clear(); + for(auto i : m_ListEditors) + delete i.second; + + for(auto i : m_ListEditorButtons) + delete i.second; + + for(auto i : m_ModeLists) + for(auto ii : i.second) + delete ii; } void KviChannelWindow::toggleToolButtons() @@ -535,36 +535,33 @@ void KviChannelWindow::toggleListModeEditor() return; //wtf? char cMode = 0; - QMap<char, KviWindowToolPageButton *>::const_iterator iter = m_pListEditorButtons.constBegin(); - while(iter != m_pListEditorButtons.constEnd()) + for(auto iter : m_ListEditorButtons) { - if(iter.value() == pButton) + if(iter.second == pButton) { - cMode = iter.key(); + cMode = iter.first; break; } - ++iter; } if(!cMode) - return; //wtf? + return; // wtf? - if(m_pListEditors.contains(cMode)) + const auto iEditor = m_ListEditors.find(cMode); + if(iEditor != m_ListEditors.end()) { - KviMaskEditor * pEditor = m_pListEditors.value(cMode); - m_pListEditors.remove(cMode); + KviMaskEditor * pEditor = iEditor->second; + m_ListEditors.erase(iEditor); pEditor->deleteLater(); pButton->setChecked(false); } else { - if(!m_pModeLists.contains(cMode)) + if(!m_ModeLists.count(cMode)) { - KviPointerList<KviMaskEntry> * pModeList = new KviPointerList<KviMaskEntry>; - pModeList->setAutoDelete(true); - m_pModeLists.insert(cMode, pModeList); + m_ModeLists[cMode]; m_szSentModeRequests.append(cMode); @@ -575,16 +572,16 @@ void KviChannelWindow::toggleListModeEditor() } } - KviPointerList<KviMaskEntry> * pMaskList = m_pModeLists.value(cMode); + std::vector<KviMaskEntry *> pMaskList = m_ModeLists[cMode]; KviMaskEditor * pEditor = new KviMaskEditor(m_pSplitter, this, pButton, pMaskList, cMode, "list_mode_editor"); - connect(pEditor, SIGNAL(removeMasks(KviMaskEditor *, KviPointerList<KviMaskEntry> *)), this, SLOT(removeMasks(KviMaskEditor *, KviPointerList<KviMaskEntry> *))); - m_pListEditors.insert(cMode, pEditor); + connect(pEditor, SIGNAL(removeMasks(KviMaskEditor *, std::vector<KviMaskEntry *>)), this, SLOT(removeMasks(KviMaskEditor *, std::vector<KviMaskEntry *>))); + m_ListEditors.emplace(cMode, pEditor); pEditor->show(); pButton->setChecked(true); } } -void KviChannelWindow::removeMasks(KviMaskEditor * pEditor, KviPointerList<KviMaskEntry> * pList) +void KviChannelWindow::removeMasks(KviMaskEditor * pEditor, const std::vector<KviMaskEntry *> & pList) { if(!connection()) return; @@ -611,8 +608,9 @@ void KviChannelWindow::removeMasks(KviMaskEditor * pEditor, KviPointerList<KviMa const int iMaxCharsPerLine = 502 - szTarget.size(); int iCurCharsPerLine = iMaxCharsPerLine; - for(KviMaskEntry * pEntry = pList->first(); pEntry; pEntry = pList->next()) + for(auto i = pList.begin(); i != pList.end();) { + KviMaskEntry * pEntry = *i; szFlags += pEditor->flag(); iCurCharsPerLine--; @@ -633,7 +631,7 @@ void KviChannelWindow::removeMasks(KviMaskEditor * pEditor, KviPointerList<KviMa // move back the iterator by one position // WARNING: this could lead to an infinite loop if a single specified mode // change is longer than iMaxCharsPerLine - pEntry = pList->prev(); + pEntry = *--i; // reset cycle variables iCurCharsPerLine = iMaxCharsPerLine; @@ -641,6 +639,10 @@ void KviChannelWindow::removeMasks(KviMaskEditor * pEditor, KviPointerList<KviMa szFlags = ""; szMasks = ""; } + else + { + ++i; + } } if(iCurModeChangesPerLine != iMaxModeChangesPerLine) @@ -687,9 +689,9 @@ void KviChannelWindow::setChannelMode(char cMode, bool bAdd) void KviChannelWindow::setChannelModeWithParam(char cMode, QString & szParam) { if(szParam.isEmpty()) - m_szChannelParameterModes.remove(cMode); + m_szChannelParameterModes.erase(cMode); else - m_szChannelParameterModes.insert(cMode, szParam); + m_szChannelParameterModes.emplace(cMode, szParam); updateModeLabel(); updateCaption(); } @@ -710,25 +712,19 @@ void KviChannelWindow::removeHighlightedUser(const QString & szNick) void KviChannelWindow::getChannelModeString(QString & szBuffer) { szBuffer = m_szChannelMode; + //add modes that use a parameter - QMap<char, QString>::const_iterator iter = m_szChannelParameterModes.constBegin(); - while(iter != m_szChannelParameterModes.constEnd()) - { - szBuffer.append(QChar(iter.key())); - ++iter; - } + for(auto iter : m_szChannelParameterModes) + szBuffer.append(QChar(iter.first)); } void KviChannelWindow::getChannelModeStringWithEmbeddedParams(QString & szBuffer) { szBuffer = m_szChannelMode; + //add modes that use a parameter - QMap<char, QString>::const_iterator iter = m_szChannelParameterModes.constBegin(); - while(iter != m_szChannelParameterModes.constEnd()) - { - szBuffer.append(QString(" %1:%2").arg(QChar(iter.key())).arg(iter.value())); - ++iter; - } + for(auto iter : m_szChannelParameterModes) + szBuffer.append(QString(" %1:%2").arg(QChar(iter.first)).arg(iter.second)); } bool KviChannelWindow::setOp(const QString & szNick, bool bOp, bool bIsMe) @@ -750,26 +746,19 @@ void KviChannelWindow::setDeadChan() m_pUserListView->setUserDataBase(nullptr); //clear all mask editors - QMap<char, KviMaskEditor *>::const_iterator iter2 = m_pListEditors.constBegin(); - while(iter2 != m_pListEditors.constEnd()) - { - iter2.value()->clear(); - ++iter2; - } + for(auto & iter : m_ListEditors) + iter.second->clear(); //clear all mask lists (eg bans) - QMap<char, KviPointerList<KviMaskEntry> *>::const_iterator iter = m_pModeLists.constBegin(); - while(iter != m_pModeLists.constEnd()) - { - iter.value()->clear(); - ++iter; - } - m_pModeLists.clear(); + for(auto & iter : m_ModeLists) + iter.second.clear(); + + m_ModeLists.clear(); m_szSentModeRequests.clear(); m_pTopicWidget->reset(); - m_pActionHistory->clear(); + m_ActionHistory.clear(); m_uActionHistoryHotActionCount = 0; m_szChannelMode = ""; @@ -807,11 +796,10 @@ void KviChannelWindow::setAliveChan() updateCaption(); m_pTopicWidget->reset(); // reset the topic (fixes bug #20 signaled by Klaus Weidenbach) - //refresh all open mask editors - QMap<char, KviMaskEditor *>::const_iterator iter2 = m_pListEditors.constBegin(); - while(iter2 != m_pListEditors.constEnd()) + // refresh all open mask editors + for(auto & iter : m_ListEditors) { - char cMode = iter2.value()->flag(); + char cMode = iter.second->flag(); m_szSentModeRequests.append(cMode); if(connection()) @@ -819,7 +807,6 @@ void KviChannelWindow::setAliveChan() QByteArray szName = connection()->encodeText(m_szName); connection()->sendFmtData("MODE %s %c", szName.data(), cMode); } - ++iter2; } } @@ -1481,9 +1468,9 @@ bool KviChannelWindow::nickChange(const QString & szOldNick, const QString & szN { channelAction(szNewNick, KVI_USERACTION_NICK, kvi_getUserActionTemperature(KVI_USERACTION_NICK)); // update any nick/mask editor; by now we limit to the q and a mode - if(m_pModeLists.contains('q')) + if(m_ModeLists.count('q')) setModeInList('q', szOldNick, false, QString(), 0, szNewNick); - if(m_pModeLists.contains('a')) + if(m_ModeLists.count('a')) setModeInList('a', szOldNick, false, QString(), 0, szNewNick); } return bWasHere; @@ -1496,9 +1483,9 @@ bool KviChannelWindow::part(const QString & szNick) { channelAction(szNick, KVI_USERACTION_PART, kvi_getUserActionTemperature(KVI_USERACTION_PART)); // update any nick/mask editor; by now we limit to the q and a mode - if(m_pModeLists.contains('q')) + if(m_ModeLists.count('q')) setModeInList('q', szNick, false, QString(), 0); - if(m_pModeLists.contains('a')) + if(m_ModeLists.count('a')) setModeInList('a', szNick, false, QString(), 0); } return bWasHere; @@ -1511,7 +1498,7 @@ bool KviChannelWindow::activityMeter(unsigned int * puActivityValue, unsigned in unsigned int uHotActionPercent; double dActionsPerMinute; - if(m_pActionHistory->count() < 1) + if(m_ActionHistory.size() < 1) { // nothing is happening uHotActionPercent = 0; @@ -1521,11 +1508,11 @@ bool KviChannelWindow::activityMeter(unsigned int * puActivityValue, unsigned in { kvi_time_t tNow = kvi_unixTime(); - KviChannelAction * pAction = m_pActionHistory->last(); + KviChannelAction * pAction = m_ActionHistory.back(); double dSpan = (double)(tNow - pAction->tTime); - if(m_pActionHistory->count() < KVI_CHANNEL_ACTION_HISTORY_MAX_COUNT) + if(m_ActionHistory.size() < KVI_CHANNEL_ACTION_HISTORY_MAX_COUNT) { if(m_joinTime.secsTo(QDateTime::currentDateTime()) < KVI_CHANNEL_ACTION_HISTORY_MAX_TIMESPAN) { @@ -1541,11 +1528,11 @@ bool KviChannelWindow::activityMeter(unsigned int * puActivityValue, unsigned in } // else the actions have been pushed out of the history because they were too much if(dSpan > 0.0) - dActionsPerMinute = (((double)(m_pActionHistory->count())) / (dSpan)) * 60.0; + dActionsPerMinute = (((double)(m_ActionHistory.size())) / (dSpan)) * 60.0; else - dActionsPerMinute = (double)(m_pActionHistory->count()); // ??? + dActionsPerMinute = (double)(m_ActionHistory.size()); // ??? - uHotActionPercent = (m_uActionHistoryHotActionCount * 100) / (m_pActionHistory->count()); + uHotActionPercent = (m_uActionHistoryHotActionCount * 100) / (m_ActionHistory.size()); } if(dActionsPerMinute < 0.3) @@ -1590,28 +1577,28 @@ void KviChannelWindow::channelAction(const QString & szNick, unsigned int uActio if(iTemperature > 0) m_uActionHistoryHotActionCount++; - m_pActionHistory->append(pAction); + m_ActionHistory.push_back(pAction); fixActionHistory(); } void KviChannelWindow::fixActionHistory() { - while(m_pActionHistory->count() > KVI_CHANNEL_ACTION_HISTORY_MAX_COUNT) - m_pActionHistory->removeFirst(); + while(m_ActionHistory.size() > KVI_CHANNEL_ACTION_HISTORY_MAX_COUNT) + m_ActionHistory.erase(m_ActionHistory.begin(), m_ActionHistory.begin() + 1); - KviChannelAction * pAction = m_pActionHistory->last(); - if(!pAction) + if(m_ActionHistory.empty()) return; + KviChannelAction * pAction = m_ActionHistory.back(); kvi_time_t tMinimum = pAction->tTime - KVI_CHANNEL_ACTION_HISTORY_MAX_TIMESPAN; - KviChannelAction * pAct = m_pActionHistory->first(); + KviChannelAction * pAct = m_ActionHistory.front(); while(pAct && (pAct->tTime < tMinimum)) { if(pAct->iTemperature > 0) m_uActionHistoryHotActionCount--; - m_pActionHistory->removeFirst(); - pAct = m_pActionHistory->first(); + m_ActionHistory.erase(m_ActionHistory.begin(), m_ActionHistory.begin() + 1); + pAct = m_ActionHistory.front(); } } @@ -1628,7 +1615,7 @@ void KviChannelWindow::getChannelActivityStats(KviChannelActivityStats * pStats) { fixActionHistory(); - pStats->uActionCount = m_pActionHistory->count(); + pStats->uActionCount = m_ActionHistory.size(); pStats->iAverageActionTemperature = 0; pStats->uActionsInTheLastMinute = 0; pStats->uHotActionCount = 0; @@ -1647,10 +1634,10 @@ void KviChannelWindow::getChannelActivityStats(KviChannelActivityStats * pStats) kvi_time_t tNow = kvi_unixTime(); - KviChannelAction * pAction = m_pActionHistory->last(); + KviChannelAction * pAction = m_ActionHistory.back(); pStats->uLastActionTimeSpan = tNow - pAction->tTime; - pAction = m_pActionHistory->first(); + pAction = m_ActionHistory.front(); pStats->uFirstActionTimeSpan = tNow - pAction->tTime; double dSpan = (double)pStats->uFirstActionTimeSpan; @@ -1680,15 +1667,15 @@ void KviChannelWindow::getChannelActivityStats(KviChannelActivityStats * pStats) tTwoMinsAgo -= 120; tNow -= 60; - KviPointerHashTable<QString, int> userDict; - userDict.setAutoDelete(false); + std::set<QString> userDict; - int iFake; pStats->lTalkingUsers.clear(); pStats->lWereTalkingUsers.clear(); - for(pAction = m_pActionHistory->last(); pAction; pAction = m_pActionHistory->prev()) + for(unsigned i = m_ActionHistory.size(); i-- > 0; ) { + pAction = m_ActionHistory[i]; + if(pAction->tTime >= tNow) pStats->uActionsInTheLastMinute++; @@ -1699,7 +1686,7 @@ void KviChannelWindow::getChannelActivityStats(KviChannelActivityStats * pStats) if((pAction->uActionType == KVI_USERACTION_PRIVMSG) || (pAction->uActionType == KVI_USERACTION_NOTICE) || (pAction->uActionType == KVI_USERACTION_ACTION)) { - if(!userDict.find(pAction->szNick)) + if(userDict.count(pAction->szNick) == 0) { if(isOn(pAction->szNick.toLatin1())) { @@ -1708,7 +1695,7 @@ void KviChannelWindow::getChannelActivityStats(KviChannelActivityStats * pStats) else pStats->lWereTalkingUsers.append(pAction->szNick); - userDict.insert(pAction->szNick, &iFake); + userDict.insert(pAction->szNick); } } } @@ -1868,69 +1855,64 @@ void KviChannelWindow::setModeInList(char cMode, const QString & szMask, bool bA if(!connection()) return; - if(!m_pModeLists.contains(cMode)) + if(!m_ModeLists.count(cMode)) { // we want to remove an item but we don't have any list? if(!bAdd) return; // lazily insert it - KviPointerList<KviMaskEntry> * pModeList = new KviPointerList<KviMaskEntry>; - pModeList->setAutoDelete(true); - m_pModeLists.insert(cMode, pModeList); + m_ModeLists[cMode]; } - KviPointerList<KviMaskEntry> * pList = m_pModeLists.value(cMode); + std::vector<KviMaskEntry *> & pList = m_ModeLists[cMode]; KviMaskEditor * pEditor = nullptr; - if(m_pListEditors.contains(cMode)) - pEditor = m_pListEditors.value(cMode); + if(m_ListEditors.count(cMode)) + pEditor = m_ListEditors[cMode]; internalMask(szMask, bAdd, szSetBy, uSetAt, pList, &pEditor, szChangeMask); - m_pUserListView->setMaskEntries(cMode, (int)pList->count()); + m_pUserListView->setMaskEntries(cMode, pList.size()); } -void KviChannelWindow::internalMask(const QString & szMask, bool bAdd, const QString & szSetBy, unsigned int uSetAt, KviPointerList<KviMaskEntry> * pList, KviMaskEditor ** ppEd, QString & szChangeMask) +void KviChannelWindow::internalMask(const QString & szMask, bool bAdd, const QString & szSetBy, unsigned int uSetAt, std::vector<KviMaskEntry *> & pList, KviMaskEditor ** ppEd, QString & szChangeMask) { KviMaskEntry * pEntry = nullptr; if(bAdd) { - for(pEntry = pList->first(); pEntry; pEntry = pList->next()) + for(auto & e : pList) { - if(KviQString::equalCI(pEntry->szMask, szMask)) + if(KviQString::equalCI(e->szMask, szMask)) return; //already there } pEntry = new KviMaskEntry; pEntry->szMask = szMask; pEntry->szSetBy = (!szSetBy.isEmpty()) ? szSetBy : __tr2qs("(Unknown)"); pEntry->uSetAt = uSetAt; - pList->append(pEntry); + pList.push_back(pEntry); if(*ppEd) (*ppEd)->addMask(pEntry); } else { - for(pEntry = pList->first(); pEntry; pEntry = pList->next()) - { - if(KviQString::equalCI(pEntry->szMask, szMask)) - break; - } + auto iter = pList.begin(); + for(; iter != pList.end() && !KviQString::equalCI((*iter)->szMask, szMask); ++iter); - if(pEntry) + if(iter != pList.end()) { //delete mask from the editor if(*ppEd) - (*ppEd)->removeMask(pEntry); + (*ppEd)->removeMask(*iter); if(szChangeMask.isNull()) { //delete mask - pList->removeRef(pEntry); + pList.erase(iter); } else { //update mask - pEntry->szMask = szChangeMask; + (*iter)->szMask = szChangeMask; if(*ppEd) - (*ppEd)->addMask(pEntry); + (*ppEd)->addMask(*iter); } } } @@ -1960,13 +1942,11 @@ void KviChannelWindow::updateModeLabel() ++pcAux; } - QMap<char, QString>::const_iterator iter = m_szChannelParameterModes.constBegin(); - while(iter != m_szChannelParameterModes.constEnd()) + for(auto & iter : m_szChannelParameterModes) { - QString szDescription = KviQString::toHtmlEscaped(m_pConsole->connection()->serverInfo()->getChannelModeDescription(iter.key())); - QString szValue = KviQString::toHtmlEscaped(iter.value()); - KviQString::appendFormatted(szTip, br + "<b>%c</b>: %Q: <b>%Q</b>", iter.key(), &szDescription, &szValue); - ++iter; + QString szDescription = KviQString::toHtmlEscaped(m_pConsole->connection()->serverInfo()->getChannelModeDescription(iter.first)); + QString szValue = KviQString::toHtmlEscaped(iter.second); + KviQString::appendFormatted(szTip, br + "<b>%c</b>: %Q: <b>%Q</b>", iter.first, &szDescription, &szValue); } szTip += enr + snr + "<hr>"; diff --git a/src/kvirc/ui/KviChannelWindow.h b/src/kvirc/ui/KviChannelWindow.h index fb9588549..33c76fc85 100644 --- a/src/kvirc/ui/KviChannelWindow.h +++ b/src/kvirc/ui/KviChannelWindow.h @@ -39,13 +39,15 @@ #include "KviUserListView.h" #include "KviTimeUtils.h" #include "KviModeWidget.h" -#include "KviPointerHashTable.h" #include <QList> #include <QDateTime> #include <QStringList> #include <QToolButton> +#include <map> +#include <vector> + class KviConsoleWindow; class KviTopicWidget; class KviIrcMask; @@ -163,8 +165,8 @@ protected: QToolButton * m_pDoubleViewButton; KviWindowToolPageButton * m_pListViewButton; KviWindowToolPageButton * m_pModeEditorButton; - QMap<char, KviWindowToolPageButton *> m_pListEditorButtons; - QMap<char, KviMaskEditor *> m_pListEditors; + std::map<char, KviWindowToolPageButton *> m_ListEditorButtons; + std::map<char, KviMaskEditor *> m_ListEditors; KviModeEditor * m_pModeEditor; KviIrcView * m_pMessageView; KviTopicWidget * m_pTopicWidget; @@ -173,14 +175,14 @@ protected: int m_iStateFlags; QString m_szSentModeRequests; QString m_szChannelMode; - QMap<char, QString> m_szChannelParameterModes; - QMap<char, KviPointerList<KviMaskEntry> *> m_pModeLists; + std::map<char, QString> m_szChannelParameterModes; + std::map<char, std::vector<KviMaskEntry *>> m_ModeLists; KviPixmap m_privateBackground; QDateTime m_joinTime; QString m_szNameWithUserFlag; QStringList * m_pTmpHighLighted; unsigned int m_uActionHistoryHotActionCount; - KviPointerList<KviChannelAction> * m_pActionHistory; + std::vector<KviChannelAction *> m_ActionHistory; kvi_time_t m_tLastReceivedWhoReply; QList<int> m_VertSplitterSizesList; QList<int> m_SplitterSizesList; @@ -213,13 +215,15 @@ public: /** * \brief Returns a list of masks for a specific mode - * \return KviPointerList<KviMaskEntry> * + * \return const std::vector<KviMaskEntry *> & */ - inline KviPointerList<KviMaskEntry> * modeMasks(char cMode) + const std::vector<KviMaskEntry *> & modeMasks(char cMode) const { - if(m_pModeLists.contains(cMode)) - return m_pModeLists.value(cMode); - return 0; + static const std::vector<KviMaskEntry *> EMPTY_VECTOR; + const auto it = m_ModeLists.find(cMode); + if(it != m_ModeLists.end()) + return it->second; + return EMPTY_VECTOR; }; /** @@ -305,12 +309,7 @@ public: * \brief Returns the number of masks is a channel mode list * \return unsigned int */ - unsigned int maskCount(char cMode) - { - if(m_pModeLists.contains(cMode)) - return m_pModeLists.value(cMode)->count(); - return 0; - }; + unsigned int maskCount(char cMode) const { return this->modeMasks(cMode).size(); }; /** * \brief Called when someone sets a channel mode that is stored in a list; these modes require a parameter that is tipically a mask @@ -416,7 +415,7 @@ public: * \brief Returns true if the channel has an invite list * \return bool */ - bool hasInviteList() { return m_pModeLists.contains('I'); }; + bool hasInviteList() { return m_ModeLists.count('I'); }; /** * \brief Returns true if the channel has a WHO list @@ -438,19 +437,19 @@ public: * \brief Returns true if the channel has a ban list * \return bool */ - bool hasBanList() { return m_pModeLists.contains('b'); }; + bool hasBanList() { return m_ModeLists.count('b'); }; /** * \brief Returns true if the channel has a ban exception list * \return bool */ - bool hasBanExceptionList() { return m_pModeLists.contains('e'); }; + bool hasBanExceptionList() { return m_ModeLists.count('e'); }; /** * \brief Returns true if the channel has a quiet ban list * \return bool */ - bool hasQuietBanList() { return m_pModeLists.contains('q'); }; + bool hasQuietBanList() { return m_ModeLists.count('q'); }; /** * \brief Returns true if the channel has to be closed on part @@ -823,14 +822,20 @@ public: * \param cMode The mode * \return bool */ - bool hasChannelMode(char cMode) { return m_szChannelParameterModes.contains(cMode); }; + bool hasChannelMode(char cMode) { return m_szChannelParameterModes.count(cMode); }; /** * \brief Returns the value (parameter) for a channel mode (eg. the password for mode k) * \param cMode The mode * \return QString */ - QString channelModeParam(char cMode) const { return m_szChannelParameterModes.value(cMode); }; + QString channelModeParam(char cMode) const + { + const auto it = m_szChannelParameterModes.find(cMode); + if(it != m_szChannelParameterModes.end()) + return it->second; + return QString(); + }; /** * \brief Adds a user to the highlight list @@ -956,7 +961,7 @@ protected: * \param szChangeMask If bAdd is false and this string is set, the mask will be updated instead that removed * \return void */ - void internalMask(const QString & szMask, bool bAdd, const QString & szSetBy, unsigned int uSetAt, KviPointerList<KviMaskEntry> * l, KviMaskEditor ** ppEd, QString & szChangeMask); + void internalMask(const QString & szMask, bool bAdd, const QString & szSetBy, unsigned int uSetAt, std::vector<KviMaskEntry *> & l, KviMaskEditor ** ppEd, QString & szChangeMask); /** * \brief Splits the channel view into two views @@ -1051,7 +1056,7 @@ private slots: * \param pList The list of masks to remove * \return void */ - void removeMasks(KviMaskEditor * pEd, KviPointerList<KviMaskEntry> * pList); + void removeMasks(KviMaskEditor * pEd, const std::vector<KviMaskEntry *> & pList); /** * \brief Toggles tool buttons widget over the listview diff --git a/src/kvirc/ui/KviConsoleWindow.cpp b/src/kvirc/ui/KviConsoleWindow.cpp index 3ce48d585..ea4772ddc 100644 --- a/src/kvirc/ui/KviConsoleWindow.cpp +++ b/src/kvirc/ui/KviConsoleWindow.cpp @@ -213,14 +213,14 @@ void KviConsoleWindow::triggerCreationEvents() KVS_TRIGGER_EVENT_0(KviEvent_OnIrcContextCreated, this); } -void KviConsoleWindow::completeChannel(const QString & word, KviPointerList<QString> * matches) +void KviConsoleWindow::completeChannel(const QString & word, std::vector<QString> & matches) { // FIXME: first look in our context ? /* if(!connection())return; - for(KviChannelWindow * c = connection()->channelList()->first();c;c = connection()->channelList()->next()) + for(auto & c : connection()->channelList()) { - if(kvi_strEqualCIN(c->windowName(),word.ptr(),word.len()))matches->append(new KviCString((*it) + if(kvi_strEqualCIN(c.windowName(),word.ptr(),word.len()))matches->append(new KviCString((*it) } */ QStringList * pList = g_pApp->recentChannelsForNetwork(currentNetworkName()); @@ -229,12 +229,12 @@ void KviConsoleWindow::completeChannel(const QString & word, KviPointerList<QStr for(auto & it : *pList) { if(KviQString::equalCIN(it, word, word.length())) - matches->append(new QString(it)); + matches.push_back(it); } } } -void KviConsoleWindow::completeServer(const QString & word, KviPointerList<QString> * matches) +void KviConsoleWindow::completeServer(const QString & word, std::vector<QString> & matches) { for(auto srv : KVI_OPTION_STRINGLIST(KviOption_stringlistRecentServers)) { @@ -244,9 +244,7 @@ void KviConsoleWindow::completeServer(const QString & word, KviPointerList<QStri KviQString::cutFromLast(srv, ':'); //We should have a full server name here, without the irc:// and without the port if(KviQString::equalCIN(srv, word, word.length())) - { - matches->append(new QString(srv)); - } + matches.push_back(srv); } } @@ -467,17 +465,20 @@ void KviConsoleWindow::updateUri() if(server) { KviIrcUrl::join(uri, server); - KviChannelWindow * last = connection()->channelList()->last(); - for(KviChannelWindow * c = connection()->channelList()->first(); c; c = connection()->channelList()->next()) + if(connection()->channelList().size()) { - uri.append(c->target()); - if(c->hasChannelMode('k')) + KviChannelWindow * last = connection()->channelList().back(); + for(auto & c : connection()->channelList()) { - uri.append("?"); - uri.append(c->channelModeParam('k')); + uri.append(c->target()); + if(c->hasChannelMode('k')) + { + uri.append("?"); + uri.append(c->channelModeParam('k')); + } + if(c != last) + uri.append(","); } - if(c != last) - uri.append(","); } } } @@ -881,7 +882,7 @@ void KviConsoleWindow::avatarChangedUpdateWindows(const QString & nick, const QS // in quiet mode avoid bugging the user about avatar changes bool bOut = ((!textLine.isEmpty()) && (!(_OUTPUT_QUIET))); - for(KviChannelWindow * c = connection()->channelList()->first(); c; c = connection()->channelList()->next()) + for(auto & c : connection()->channelList()) { if(c->avatarChanged(nick)) { @@ -889,7 +890,7 @@ void KviConsoleWindow::avatarChangedUpdateWindows(const QString & nick, const QS c->outputNoFmt(KVI_OUT_AVATAR, textLine); } } - for(KviQueryWindow * q = connection()->queryList()->first(); q; q = connection()->queryList()->next()) + for(auto & q : connection()->queryList()) { if(q->avatarChanged(nick)) { @@ -1232,12 +1233,10 @@ void KviConsoleWindow::getWindowListTipText(QString & buffer) if((context()->state() == KviIrcContext::Connected) && connection()) { QString num; + unsigned int uD, uH; - unsigned int uD; - unsigned int uH; - - uD = connection()->channelList()->count(); - uH = connection()->queryList()->count(); + uD = connection()->channelList().size(); + uH = connection()->queryList().size(); if(uD || uH > 0) { diff --git a/src/kvirc/ui/KviConsoleWindow.h b/src/kvirc/ui/KviConsoleWindow.h index a7ee50666..9788b2b72 100644 --- a/src/kvirc/ui/KviConsoleWindow.h +++ b/src/kvirc/ui/KviConsoleWindow.h @@ -32,11 +32,11 @@ #include "KviIrcServer.h" #include "KviCString.h" #include "KviIrcContext.h" -#include "KviPointerList.h" #include "KviUserListView.h" #include "KviThemedComboBox.h" #include <time.h> +#include <vector> #include <QToolButton> @@ -186,8 +186,8 @@ public: KviWindow * activeWindow(); // User db, connection related - void completeChannel(const QString & word, KviPointerList<QString> * matches); - void completeServer(const QString & word, KviPointerList<QString> * matches); + void completeChannel(const QString & word, std::vector<QString> & matches); + void completeServer(const QString & word, std::vector<QString> & matches); void connectionAttached(); void connectionDetached(); diff --git a/src/kvirc/ui/KviHistoryWindow.cpp b/src/kvirc/ui/KviHistoryWindow.cpp index 7f6d9d19d..790f14e26 100644 --- a/src/kvirc/ui/KviHistoryWindow.cpp +++ b/src/kvirc/ui/KviHistoryWindow.cpp @@ -62,10 +62,8 @@ void KviHistoryWindow::fill() { clear(); - for(QString * szTmp = KviInputHistory::instance()->list()->last(); szTmp; szTmp = KviInputHistory::instance()->list()->prev()) - { - addItem(*szTmp); - } + for(auto & szTmp : KviInputHistory::instance()->list()) + addItem(szTmp); if(count() > 0) setCurrentItem(item(count() - 1)); diff --git a/src/kvirc/ui/KviInputEditor.cpp b/src/kvirc/ui/KviInputEditor.cpp index 57da7b7d5..fa0fe0992 100644 --- a/src/kvirc/ui/KviInputEditor.cpp +++ b/src/kvirc/ui/KviInputEditor.cpp @@ -167,13 +167,8 @@ KviInputEditor::KviInputEditor(QWidget * pPar, KviWindow * pWnd, KviUserListView m_bUpdatesEnabled = true; m_pKviWindow = pWnd; m_pUserListView = pView; - m_pHistory = new KviPointerList<QString>; - m_pHistory->setAutoDelete(true); m_bReadOnly = false; - m_pUndoStack = nullptr; - m_pRedoStack = nullptr; - setAttribute(Qt::WA_InputMethodEnabled, true); setAutoFillBackground(false); @@ -205,16 +200,7 @@ KviInputEditor::~KviInputEditor() g_pLastFontMetrics = nullptr; } - if(m_pIconMenu) - delete m_pIconMenu; - - delete m_pHistory; - - if(m_pUndoStack) - delete m_pUndoStack; - - if(m_pRedoStack) - delete m_pRedoStack; + delete m_pIconMenu; if(m_iCursorTimer) killTimer(m_iCursorTimer); @@ -365,10 +351,10 @@ bool KviInputEditor::checkWordSpelling(const QString & szWord) pBlock->iLength = pBlock->szText.length(); \ pBlock->bSpellCheckable = _bSpellCheckable; \ pBlock->bCorrect = _bCorrect; \ - _lBuffer.append(pBlock); \ + _lBuffer.insert(pBlock); \ } while(0) -void KviInputEditor::splitTextIntoSpellCheckerBlocks(const QString & szText, KviPointerList<KviInputEditorSpellCheckerBlock> & lBuffer) +void KviInputEditor::splitTextIntoSpellCheckerBlocks(const QString & szText, std::unordered_set<KviInputEditorSpellCheckerBlock *> & lBuffer) { #ifdef COMPILE_ENCHANT_SUPPORT if(szText.isEmpty()) @@ -525,8 +511,7 @@ void KviInputEditor::rebuildTextBlocks() qDeleteAll(m_p->lTextBlocks); m_p->lTextBlocks.clear(); - KviPointerList<KviInputEditorSpellCheckerBlock> lSpellCheckerBlocks; - lSpellCheckerBlocks.setAutoDelete(true); + std::unordered_set<KviInputEditorSpellCheckerBlock *> lSpellCheckerBlocks; #ifdef COMPILE_ENCHANT_SUPPORT splitTextIntoSpellCheckerBlocks(m_szTextBuffer, lSpellCheckerBlocks); @@ -536,7 +521,7 @@ void KviInputEditor::rebuildTextBlocks() m_p->bTextBlocksDirty = false; - if(lSpellCheckerBlocks.isEmpty()) // should never happen, but well... + if(lSpellCheckerBlocks.empty()) // should never happen, but well... return; // nothing to do #define NOT_CONTROL_CHAR() \ @@ -552,7 +537,7 @@ void KviInputEditor::rebuildTextBlocks() KviInputEditorTextBlock * pBlock; - for(KviInputEditorSpellCheckerBlock * spb = lSpellCheckerBlocks.first(); spb; spb = lSpellCheckerBlocks.next()) + for(auto spb : lSpellCheckerBlocks) { if(spb->bSpellCheckable && !spb->bCorrect) uFlags |= KviInputEditorTextBlock::IsSpellingMistake; @@ -1140,7 +1125,7 @@ void KviInputEditor::showContextPopup(const QPoint & pos) #ifdef COMPILE_ENCHANT_SUPPORT // check if the cursor is in a spell-checkable block - KviPointerList<KviInputEditorSpellCheckerBlock> lBuffer; + std::unordered_set<KviInputEditorSpellCheckerBlock *> lBuffer; splitTextIntoSpellCheckerBlocks(m_szTextBuffer, lBuffer); KviInputEditorSpellCheckerBlock * pCurrentBlock = findSpellCheckerBlockAtCursor(lBuffer); @@ -1186,11 +1171,11 @@ void KviInputEditor::showContextPopupHere() showContextPopup(mapToGlobal(QPoint(fXPos, iBottom))); } -KviInputEditorSpellCheckerBlock * KviInputEditor::findSpellCheckerBlockAtCursor(KviPointerList<KviInputEditorSpellCheckerBlock> & lBlocks) +KviInputEditorSpellCheckerBlock * KviInputEditor::findSpellCheckerBlockAtCursor(std::unordered_set<KviInputEditorSpellCheckerBlock *> & lBlocks) { KviInputEditorSpellCheckerBlock * pCurrentBlock = nullptr; - for(KviInputEditorSpellCheckerBlock * pBlock = lBlocks.first(); pBlock; pBlock = lBlocks.next()) + for(auto pBlock : lBlocks) { if(m_iCursorPosition <= (pBlock->iStart + pBlock->iLength)) { @@ -1217,7 +1202,7 @@ void KviInputEditor::fillSpellCheckerCorrectionsPopup() #ifdef COMPILE_ENCHANT_SUPPORT // check if the cursor is in a spellcheckable block - KviPointerList<KviInputEditorSpellCheckerBlock> lBuffer; + std::unordered_set<KviInputEditorSpellCheckerBlock *> lBuffer; splitTextIntoSpellCheckerBlocks(m_szTextBuffer, lBuffer); KviInputEditorSpellCheckerBlock * pCurrentBlock = findSpellCheckerBlockAtCursor(lBuffer); @@ -1299,7 +1284,7 @@ void KviInputEditor::spellCheckerPopupCorrectionActionTriggered() if(szWord.isEmpty()) return; - KviPointerList<KviInputEditorSpellCheckerBlock> lBuffer; + std::unordered_set<KviInputEditorSpellCheckerBlock *> lBuffer; splitTextIntoSpellCheckerBlocks(m_szTextBuffer, lBuffer); KviInputEditorSpellCheckerBlock * pCurrentBlock = findSpellCheckerBlockAtCursor(lBuffer); @@ -1694,12 +1679,12 @@ void KviInputEditor::handleDragSelection() void KviInputEditor::finishInput() { - if(!m_szTextBuffer.isEmpty() /* && (!m_pHistory->current() || m_szTextBuffer.compare(*(m_pHistory->current())))*/) + if(!m_szTextBuffer.isEmpty() /* && (!m_History->current() || m_szTextBuffer.compare(*(m_History->current())))*/) { if(m_pInputParent->inherits("KviInput")) - KviInputHistory::instance()->add(new QString(m_szTextBuffer)); + KviInputHistory::instance()->add(m_szTextBuffer); - m_pHistory->insert(0, new QString(m_szTextBuffer)); + m_History.insert(m_History.begin(), m_szTextBuffer); } //ensure the color window is hidden (bug #835) @@ -1708,8 +1693,8 @@ void KviInputEditor::finishInput() g_pColorWindow->hide(); KVI_ASSERT(KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES > 1); //ABSOLUTELY NEEDED, if not, pHist will be destroyed... - if(m_pHistory->count() > KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES) - m_pHistory->removeLast(); + if(m_History.size() > KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES) + m_History.pop_back(); m_iCurHistoryIdx = -1; } @@ -1723,17 +1708,8 @@ void KviInputEditor::returnPressed(bool) void KviInputEditor::clearUndoStack() { - if(m_pUndoStack) - { - delete m_pUndoStack; - m_pUndoStack = nullptr; - } - - if(m_pRedoStack) - { - delete m_pRedoStack; - m_pRedoStack = nullptr; - } + m_UndoStack.clear(); + m_RedoStack.clear(); } void KviInputEditor::focusInEvent(QFocusEvent * e) @@ -2178,8 +2154,7 @@ void KviInputEditor::completion(bool bShift) else iOffset = 0; - KviPointerList<QString> tmp; - tmp.setAutoDelete(true); + std::vector<QString> tmp; bool bIsCommand = false; bool bIsFunction = false; @@ -2196,7 +2171,7 @@ void KviInputEditor::completion(bool bShift) szWord.remove(0, 2 - iOffset); if(szWord.isEmpty()) return; - KviKvsKernel::instance()->completeFunction(szWord, &tmp); + KviKvsKernel::instance()->completeFunction(szWord, tmp); // function names don't need to be escaped bIsFunction = true; } @@ -2206,14 +2181,14 @@ void KviInputEditor::completion(bool bShift) szWord.remove(0, 1 - iOffset); if(szWord.isEmpty()) return; - KviKvsKernel::instance()->completeCommand(szWord, &tmp); + KviKvsKernel::instance()->completeCommand(szWord, tmp); // commands don't need to be escaped bIsCommand = true; } else { // directory completion attempt - g_pApp->completeDirectory(szWord, &tmp); + g_pApp->completeDirectory(szWord, tmp); bIsDir = true; } } @@ -2223,7 +2198,7 @@ void KviInputEditor::completion(bool bShift) szWord.remove(0, 1); if(szWord.isEmpty()) return; - KviKvsKernel::instance()->completeFunction(szWord, &tmp); + KviKvsKernel::instance()->completeFunction(szWord, tmp); bIsFunction = true; } else if(uc == '#' || uc == '&' || uc == '!') @@ -2240,7 +2215,7 @@ void KviInputEditor::completion(bool bShift) return; } if(m_pKviWindow->console()) - m_pKviWindow->console()->completeChannel(szWord, &tmp); + m_pKviWindow->console()->completeChannel(szWord, tmp); } //FIXME: Complete also on irc:// starting strings, not only irc.? @@ -2250,7 +2225,7 @@ void KviInputEditor::completion(bool bShift) // irc server name if(m_pKviWindow) if(m_pKviWindow->console()) - m_pKviWindow->console()->completeServer(szWord, &tmp); + m_pKviWindow->console()->completeServer(szWord, tmp); } else { @@ -2262,7 +2237,7 @@ void KviInputEditor::completion(bool bShift) if(m_szLastCompletedNick.isEmpty()) { //first round of zsh completion - m_pUserListView->completeNickBashLike(szWord, &tmp, bShift); + m_pUserListView->completeNickBashLike(szWord, tmp, bShift); bIsNick = true; m_szLastCompletedNick = szWord; } @@ -2275,7 +2250,7 @@ void KviInputEditor::completion(bool bShift) } else if(KVI_OPTION_BOOL(KviOption_boolBashLikeNickCompletion)) { - m_pUserListView->completeNickBashLike(szWord, &tmp, bShift); + m_pUserListView->completeNickBashLike(szWord, tmp, bShift); bIsNick = true; } else @@ -2288,11 +2263,11 @@ void KviInputEditor::completion(bool bShift) } // Lookup the longest exact match - if(tmp.count() > 0) + if(tmp.size() > 0) { - if(tmp.count() == 1) + if(tmp.size() == 1) { - szMatch = *(tmp.first()); + szMatch = tmp.front(); if(szMatch.left(1) == '$') szMatch.remove(0, 1); if(bIsCommand && szMatch.right(1) != '.') @@ -2316,17 +2291,16 @@ void KviInputEditor::completion(bool bShift) else { QString szAll; - QString * szTmp = tmp.first(); - szMatch = *szTmp; + QString szMatch = tmp.front(); int iWLen = szWord.length(); if(szMatch.left(1) == '$') szMatch.remove(0, 1); - for(; szTmp; szTmp = tmp.next()) + for(auto szTmpIter : tmp) { - if(szTmp->length() < szMatch.length()) - szMatch.remove(szTmp->length(), szMatch.length() - szTmp->length()); + if(szTmpIter.length() < szMatch.length()) + szMatch.remove(szTmpIter.length(), szMatch.length() - szTmpIter.length()); // All the matches here have length >= word.len()!!! - const QChar * b1 = (*szTmp).constData() + iWLen; + const QChar * b1 = szTmpIter.constData() + iWLen; const QChar * b2 = szMatch.constData() + iWLen; const QChar * c1 = b1; const QChar * c2 = b2; @@ -2341,10 +2315,10 @@ void KviInputEditor::completion(bool bShift) szMatch.remove(iLen, szMatch.length() - iLen); if(!szAll.isEmpty()) szAll.append(", "); - szAll.append(*szTmp); + szAll.append(szTmpIter); } if(m_pKviWindow) - m_pKviWindow->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("%d matches: %Q"), tmp.count(), &szAll); + m_pKviWindow->output(KVI_OUT_SYSTEMMESSAGE, __tr2qs("%d matches: %Q"), tmp.size(), &szAll); } } else if(m_pKviWindow) @@ -2666,19 +2640,14 @@ void KviInputEditor::undo() if(!isUndoAvailable()) return; - if(!m_pUndoStack) + if(m_UndoStack.empty()) return; // this should be ensured by isUndoAvailable() but well... - EditCommand * pCommand = m_pUndoStack->takeLast(); + EditCommand * pCommand = m_UndoStack.back(); + m_UndoStack.pop_back(); Q_ASSERT(pCommand); // should be true: we delete the empty undo stack - if(m_pUndoStack->isEmpty()) - { - delete m_pUndoStack; - m_pUndoStack = nullptr; - } - m_iSelectionBegin = -1; m_iSelectionEnd = -1; @@ -2701,15 +2670,9 @@ void KviInputEditor::undo() break; } - if(!m_pRedoStack) - { - m_pRedoStack = new KviPointerList<EditCommand>; - m_pRedoStack->setAutoDelete(true); - } - - m_pRedoStack->append(pCommand); - if(m_pRedoStack->count() > KVI_INPUT_MAX_UNDO_SIZE) - m_pRedoStack->removeFirst(); // will delete it + m_RedoStack.push_back(pCommand); + if(m_RedoStack.size() > KVI_INPUT_MAX_UNDO_SIZE) + m_RedoStack.erase(m_RedoStack.begin(), m_RedoStack.begin() + 1); // will delete it } void KviInputEditor::redo() @@ -2717,19 +2680,14 @@ void KviInputEditor::redo() if(!isRedoAvailable()) return; - if(!m_pRedoStack) + if(m_RedoStack.empty()) return; // this should be ensured by isUndoAvailable() but well... - EditCommand * pCommand = m_pRedoStack->takeLast(); + EditCommand * pCommand = m_RedoStack.back(); + m_RedoStack.pop_back(); Q_ASSERT(pCommand); // should be true: we delete the empty redo stack - if(m_pRedoStack->isEmpty()) - { - delete m_pRedoStack; - m_pRedoStack = nullptr; - } - m_iSelectionBegin = -1; m_iSelectionEnd = -1; @@ -2752,28 +2710,17 @@ void KviInputEditor::redo() break; } - if(!m_pUndoStack) - { - m_pUndoStack = new KviPointerList<EditCommand>; - m_pUndoStack->setAutoDelete(true); - } - - m_pUndoStack->append(pCommand); - if(m_pUndoStack->count() > KVI_INPUT_MAX_UNDO_SIZE) - m_pUndoStack->removeFirst(); // will delete it + m_UndoStack.push_back(pCommand); + if(m_UndoStack.size() > KVI_INPUT_MAX_UNDO_SIZE) + m_UndoStack.erase(m_UndoStack.begin(), m_UndoStack.begin() + 1); // will delete it } void KviInputEditor::addUndo(EditCommand * pCommand) { - if(!m_pUndoStack) - { - m_pUndoStack = new KviPointerList<EditCommand>; - m_pUndoStack->setAutoDelete(true); - } - m_pUndoStack->append(pCommand); + m_UndoStack.push_back(pCommand); - if(m_pUndoStack->count() > KVI_INPUT_MAX_UNDO_SIZE) - m_pUndoStack->removeFirst(); // will delete it + if(m_UndoStack.size() > KVI_INPUT_MAX_UNDO_SIZE) + m_UndoStack.erase(m_UndoStack.begin(), m_UndoStack.begin() + 1); // will delete it } void KviInputEditor::openHistory() @@ -3205,14 +3152,14 @@ void KviInputEditor::sendPlain() KviUserInput::parseNonCommand(szBuffer, m_pKviWindow); if(!szBuffer.isEmpty()) { - KviInputHistory::instance()->add(new QString(szBuffer)); - m_pHistory->insert(0, new QString(szBuffer)); + KviInputHistory::instance()->add(szBuffer); + m_History.insert(m_History.begin(), szBuffer); } KVI_ASSERT(KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES > 1); //ABSOLUTELY NEEDED, if not, pHist will be destroyed... - if(m_pHistory->count() > KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES) - m_pHistory->removeLast(); + if(m_History.size() > KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES) + m_History.pop_back(); m_iCurHistoryIdx = -1; } @@ -3241,14 +3188,14 @@ void KviInputEditor::sendKvs() if(!szBuffer.isEmpty()) { - KviInputHistory::instance()->add(new QString(szBuffer)); - m_pHistory->insert(0, new QString(szBuffer)); + KviInputHistory::instance()->add(szBuffer); + m_History.insert(m_History.begin(), szBuffer); } KVI_ASSERT(KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES > 1); //ABSOLUTELY NEEDED, if not, pHist will be destroyed... - if(m_pHistory->count() > KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES) - m_pHistory->removeLast(); + if(m_History.size() > KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES) + m_History.pop_back(); m_iCurHistoryIdx = -1; } @@ -3323,17 +3270,17 @@ void KviInputEditor::historyPrev() if(m_bReadOnly) return; - if(m_pHistory->count() < 1) + if(m_History.size() < 1) return; if(m_iCurHistoryIdx < 0) { m_szSaveTextBuffer = m_szTextBuffer; - m_szTextBuffer = *(m_pHistory->at(0)); + m_szTextBuffer = m_History[0]; m_p->bTextBlocksDirty = true; m_iCurHistoryIdx = 0; } - else if(m_iCurHistoryIdx >= (int)(m_pHistory->count() - 1)) + else if(m_iCurHistoryIdx >= (int)(m_History.size() - 1)) { m_szTextBuffer = m_szSaveTextBuffer; m_p->bTextBlocksDirty = true; @@ -3342,7 +3289,7 @@ void KviInputEditor::historyPrev() else { m_iCurHistoryIdx++; - m_szTextBuffer = *(m_pHistory->at(m_iCurHistoryIdx)); + m_szTextBuffer = m_History[m_iCurHistoryIdx]; m_p->bTextBlocksDirty = true; } clearSelection(); @@ -3357,14 +3304,14 @@ void KviInputEditor::historyNext() if(m_bReadOnly) return; - if(m_pHistory->count() < 1) + if(m_History.size() < 1) return; if(m_iCurHistoryIdx < 0) { m_szSaveTextBuffer = m_szTextBuffer; - m_szTextBuffer = *(m_pHistory->at(m_pHistory->count() - 1)); - m_iCurHistoryIdx = m_pHistory->count() - 1; + m_szTextBuffer = m_History[m_History.size() - 1]; + m_iCurHistoryIdx = m_History.size() - 1; } else if(m_iCurHistoryIdx == 0) { @@ -3374,7 +3321,7 @@ void KviInputEditor::historyNext() else { m_iCurHistoryIdx--; - m_szTextBuffer = *(m_pHistory->at(m_iCurHistoryIdx)); + m_szTextBuffer = m_History[m_iCurHistoryIdx]; } m_p->bTextBlocksDirty = true; clearSelection(); diff --git a/src/kvirc/ui/KviInputEditor.h b/src/kvirc/ui/KviInputEditor.h index db7168ac6..4d80bc6ed 100644 --- a/src/kvirc/ui/KviInputEditor.h +++ b/src/kvirc/ui/KviInputEditor.h @@ -43,7 +43,6 @@ */ #include "kvi_settings.h" -#include "KviPointerList.h" #include "KviCString.h" #include "KviWindow.h" @@ -51,6 +50,9 @@ #include <QString> #include <QWidget> +#include <unordered_set> +#include <vector> + class QKeyEvent; class QDragEnterEvent; class QFontMetricsF; @@ -135,7 +137,7 @@ protected: int m_iSelectionAnchorChar; // History stuff - KviPointerList<QString> * m_pHistory; + std::vector<QString> m_History; int m_iCurHistoryIdx; KviCString m_szSaveTextBuffer; @@ -244,22 +246,22 @@ protected: }; /** - * \var m_pUndoStack + * \var m_UndoStack * \brief The undo stack. * * Contains owned pointers and has autodelete set to true. The most recent command * is at the end. Null when no undo is available. */ - KviPointerList<EditCommand> * m_pUndoStack; + std::vector<EditCommand *> m_UndoStack; /** - * \var m_pRedoStack + * \var m_RedoStack * \brief The redo stack. * * Contains owned pointers and has autodelete set to true. The most recently undone * command is at the end. Null when no redo is available. */ - KviPointerList<EditCommand> * m_pRedoStack; + std::vector<EditCommand *> m_RedoStack; KviInputEditorPrivate * m_p; @@ -502,13 +504,13 @@ private: * \brief Returns true is there are some action in the undo stack * \return bool */ - inline bool isUndoAvailable() const { return !m_bReadOnly && m_pUndoStack; } + inline bool isUndoAvailable() const { return !m_bReadOnly && !m_UndoStack.empty(); } /** * \brief Returns true is there are some action in the redo stack * \return bool */ - inline bool isRedoAvailable() const { return !m_bReadOnly && m_pRedoStack; } + inline bool isRedoAvailable() const { return !m_bReadOnly && !m_RedoStack.empty(); } /** * \brief Inserts one action in the undo stack @@ -968,8 +970,8 @@ protected: virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const; virtual void paintEvent(QPaintEvent * e); bool checkWordSpelling(const QString & szWord); - void splitTextIntoSpellCheckerBlocks(const QString & szText, KviPointerList<KviInputEditorSpellCheckerBlock> & lBuffer); - KviInputEditorSpellCheckerBlock * findSpellCheckerBlockAtCursor(KviPointerList<KviInputEditorSpellCheckerBlock> & lBlocks); + void splitTextIntoSpellCheckerBlocks(const QString & szText, std::unordered_set<KviInputEditorSpellCheckerBlock *> & lBuffer); + KviInputEditorSpellCheckerBlock * findSpellCheckerBlockAtCursor(std::unordered_set<KviInputEditorSpellCheckerBlock *> & lBlocks); void fillSpellCheckerCorrectionsPopup(); void rebuildTextBlocks(); diff --git a/src/kvirc/ui/KviInputHistory.cpp b/src/kvirc/ui/KviInputHistory.cpp index 5e2f44626..e9c650b70 100644 --- a/src/kvirc/ui/KviInputHistory.cpp +++ b/src/kvirc/ui/KviInputHistory.cpp @@ -33,17 +33,6 @@ KviInputHistory * KviInputHistory::m_pSelf = nullptr; unsigned int KviInputHistory::m_uCount = 0; -KviInputHistory::KviInputHistory() -{ - m_pStringList = new KviPointerList<QString>; - m_pStringList->setAutoDelete(true); -} - -KviInputHistory::~KviInputHistory() -{ - delete m_pStringList; -} - void KviInputHistory::init() { if((!m_pSelf) && (m_pSelf->count() == 0)) @@ -70,11 +59,11 @@ void KviInputHistory::delRef() m_uCount--; } -void KviInputHistory::add(QString * szString) +void KviInputHistory::add(QString szString) { - m_pStringList->insert(0, szString); - if(m_pStringList->count() > KVI_INPUT_MAX_GLOBAL_HISTORY_ENTRIES) - m_pStringList->removeLast(); + m_StringList.insert(m_StringList.begin(), std::move(szString)); + if(m_StringList.size() > KVI_INPUT_MAX_GLOBAL_HISTORY_ENTRIES) + m_StringList.pop_back(); } void KviInputHistory::load(const QString & szFileName) @@ -93,7 +82,7 @@ void KviInputHistory::load(const QString & szFileName) szTmp.sprintf("S%d", i); QString szEntry = c.readEntry(szTmp.ptr(), ""); if(!szEntry.isEmpty()) - add(new QString(szEntry)); + add(szEntry); } } @@ -102,17 +91,17 @@ void KviInputHistory::save(const QString & szFileName) KviConfigurationFile c(szFileName, KviConfigurationFile::Write); c.clear(); - c.writeEntry("Count", m_pStringList->count()); + c.writeEntry("Count", static_cast<unsigned>(m_StringList.size())); KviCString szTmp; int iIdx = 0; - for(QString * szString = m_pStringList->first(); szString; szString = m_pStringList->next()) + for(auto & szString : m_StringList) { - if(!szString->isEmpty()) + if(!szString.isEmpty()) { szTmp.sprintf("S%d", iIdx); - c.writeEntry(szTmp.ptr(), *szString); + c.writeEntry(szTmp.ptr(), szString); iIdx++; } } diff --git a/src/kvirc/ui/KviInputHistory.h b/src/kvirc/ui/KviInputHistory.h index ab251aaf7..b8884dd5e 100644 --- a/src/kvirc/ui/KviInputHistory.h +++ b/src/kvirc/ui/KviInputHistory.h @@ -38,7 +38,8 @@ */ #include "kvi_settings.h" -#include "KviPointerList.h" + +#include <vector> #define KVI_INPUT_MAX_GLOBAL_HISTORY_ENTRIES 500 #define KVI_INPUT_MAX_LOCAL_HISTORY_ENTRIES 50 @@ -54,20 +55,10 @@ private: static unsigned int m_uCount; protected: - KviPointerList<QString> * m_pStringList; + std::vector<QString> m_StringList; public: /** - * \brief Constructs the input history object - * \return KviInputHistory - */ - KviInputHistory(); - /** - * \brief Destroys the input history object - */ - ~KviInputHistory(); - - /** * \brief Initializes the class instance * \return void */ @@ -108,13 +99,13 @@ public: * \param szString The string to add * \return void */ - void add(QString * szString); + void add(QString szString); /** * \brief Returns the list of string in the history * \return KviPointerList<QString> * */ - KviPointerList<QString> * list() { return m_pStringList; }; + std::vector<QString> list() { return m_StringList; }; /** * \brief Saves the history diff --git a/src/kvirc/ui/KviMainWindow.cpp b/src/kvirc/ui/KviMainWindow.cpp index 76719d332..4bf1b6dcf 100644 --- a/src/kvirc/ui/KviMainWindow.cpp +++ b/src/kvirc/ui/KviMainWindow.cpp @@ -76,6 +76,7 @@ #include <QCheckBox> #include <time.h> +#include <algorithm> #ifdef COMPILE_PSEUDO_TRANSPARENCY #include <QPixmap> @@ -105,12 +106,7 @@ KviMainWindow::KviMainWindow(QWidget * pParent) setWindowIcon(*(g_pIconManager->getSmallIcon(KviIconManager::KVIrc))); #endif - m_pWinList = new KviPointerList<KviWindow>; setWindowTitle(KVI_DEFAULT_FRAME_CAPTION); - m_pWinList->setAutoDelete(false); - - m_pModuleExtensionToolBarList = new KviPointerList<KviMexToolBar>; - m_pModuleExtensionToolBarList->setAutoDelete(false); m_pActiveContext = nullptr; @@ -128,7 +124,6 @@ KviMainWindow::KviMainWindow(QWidget * pParent) m_pWindowStack = new KviWindowStack(m_pSplitter, "mdi_manager"); // This theoretically had to exists before KviWindowStack (that uses enterSdiMode) - m_pAccellerators = new KviPointerList<QShortcut>; m_pMenuBar = new KviMenuBar(this, "main_menu_bar"); setMenuWidget(m_pMenuBar); #ifndef COMPILE_ON_MAC @@ -204,9 +199,8 @@ KviMainWindow::~KviMainWindow() // Now start killing stuff // Explicitly kill all the module extension toolbars: qt has NOT to delete them: we must call their "die" method - while(KviMexToolBar * t = m_pModuleExtensionToolBarList->first()) + for(auto & t : m_pModuleExtensionToolBarList) t->die(); - delete m_pModuleExtensionToolBarList; KVI_OPTION_BOOL(KviOption_boolShowDockExtension) = m_pTrayIcon != nullptr; @@ -216,38 +210,43 @@ KviMainWindow::~KviMainWindow() m_pTrayIcon = nullptr; } - if(m_pStatusBar) - { - delete m_pStatusBar; - m_pStatusBar = nullptr; - } - //close all not console windows - for(int i = m_pWinList->count() - 1; i >= 0; --i) + delete m_pStatusBar; + m_pStatusBar = nullptr; + + std::vector<KviWindow *> l_winListCopy(m_WinList.begin(), m_WinList.end()); + std::vector<KviWindow *>::size_type iCount = 0; + + // close all not console windows + while(iCount < l_winListCopy.size()) { - KviWindow * wnd = m_pWinList->at(i); - if(wnd->type() != KviWindow::Console) - closeWindow(wnd); + KviWindow * lkWindow = l_winListCopy[iCount]; + if(lkWindow->type() != KviWindow::Console) + { + closeWindow(lkWindow); + l_winListCopy.erase(l_winListCopy.begin() + iCount); + } + else + { + ++iCount; + } } // close all the remaining windows (consoles) - while(m_pWinList->first()) - closeWindow(m_pWinList->first()); - - delete m_pWinList; - delete m_pAccellerators; + for(auto & i : l_winListCopy) + closeWindow(i); g_pMainWindow = nullptr; } void KviMainWindow::registerModuleExtensionToolBar(KviMexToolBar * t) { - m_pModuleExtensionToolBarList->append(t); + m_pModuleExtensionToolBarList.insert(t); } void KviMainWindow::unregisterModuleExtensionToolBar(KviMexToolBar * t) { - m_pModuleExtensionToolBarList->removeRef(t); + m_pModuleExtensionToolBarList.erase(t); } void KviMainWindow::restoreModuleExtensionToolBars() @@ -266,25 +265,23 @@ void KviMainWindow::restoreModuleExtensionToolBars() void KviMainWindow::saveModuleExtensionToolBars() { - KVI_OPTION_STRINGLIST(KviOption_stringlistModuleExtensionToolbars) - .clear(); + KVI_OPTION_STRINGLIST(KviOption_stringlistModuleExtensionToolbars).clear(); - for(KviMexToolBar * t = m_pModuleExtensionToolBarList->first(); t; t = m_pModuleExtensionToolBarList->next()) + for(auto & t : m_pModuleExtensionToolBarList) { QString s = t->descriptor()->module()->name(); s += ":"; s += t->descriptor()->name().ptr(); - //qDebug("FOUND TOOLBAR %s",t->descriptor()->name().ptr()); + //qDebug("FOUND TOOLBAR %s",t.descriptor()->name().ptr()); - KVI_OPTION_STRINGLIST(KviOption_stringlistModuleExtensionToolbars) - .append(s); + KVI_OPTION_STRINGLIST(KviOption_stringlistModuleExtensionToolbars).append(s); } } KviMexToolBar * KviMainWindow::moduleExtensionToolBar(int extensionId) { - for(KviMexToolBar * t = m_pModuleExtensionToolBarList->first(); t; t = m_pModuleExtensionToolBarList->next()) + for(auto & t : m_pModuleExtensionToolBarList) { if(extensionId == t->descriptor()->id()) return t; @@ -294,15 +291,15 @@ KviMexToolBar * KviMainWindow::moduleExtensionToolBar(int extensionId) void KviMainWindow::installAccelerators() { - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_PREV, this, SLOT(switchToPrevWindow()), nullptr, Qt::ApplicationShortcut)); - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_NEXT, this, SLOT(switchToNextWindow()), nullptr, Qt::ApplicationShortcut)); - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_PREV_CONTEXT, this, SLOT(switchToPrevWindowInContext()), nullptr, Qt::ApplicationShortcut)); - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_NEXT_CONTEXT, this, SLOT(switchToNextWindowInContext()), nullptr, Qt::ApplicationShortcut)); - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_PREV_HIGHLIGHT, this, SLOT(switchToPrevHighlightedWindow()), nullptr, Qt::ApplicationShortcut)); - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_NEXT_HIGHLIGHT, this, SLOT(switchToNextHighlightedWindow()), nullptr, Qt::ApplicationShortcut)); - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_CLOSE, this, SLOT(closeActiveWindow()), nullptr, Qt::ApplicationShortcut)); - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_PREV_TAB, this, SLOT(switchToPrevWindow()), nullptr, Qt::ApplicationShortcut)); - m_pAccellerators->append(KviShortcut::create(KVI_SHORTCUTS_WIN_NEXT_TAB, this, SLOT(switchToNextWindow()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_PREV, this, SLOT(switchToPrevWindow()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_NEXT, this, SLOT(switchToNextWindow()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_PREV_CONTEXT, this, SLOT(switchToPrevWindowInContext()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_NEXT_CONTEXT, this, SLOT(switchToNextWindowInContext()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_PREV_HIGHLIGHT, this, SLOT(switchToPrevHighlightedWindow()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_NEXT_HIGHLIGHT, this, SLOT(switchToNextHighlightedWindow()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_CLOSE, this, SLOT(closeActiveWindow()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_PREV_TAB, this, SLOT(switchToPrevWindow()), nullptr, Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(KVI_SHORTCUTS_WIN_NEXT_TAB, this, SLOT(switchToNextWindow()), nullptr, Qt::ApplicationShortcut)); static int accel_table[] = { Qt::Key_1 + Qt::ControlModifier, // script accels... @@ -344,7 +341,7 @@ void KviMainWindow::installAccelerators() int i = 0, keys = 0; while((keys = accel_table[i])) { - m_pAccellerators->append(KviShortcut::create(keys, this, SLOT(accelActivated()), SLOT(accelActivated()), Qt::ApplicationShortcut)); + m_pAccellerators.push_back(KviShortcut::create(keys, this, SLOT(accelActivated()), SLOT(accelActivated()), Qt::ApplicationShortcut)); i++; } } @@ -352,11 +349,14 @@ void KviMainWindow::installAccelerators() void KviMainWindow::freeAccelleratorKeySequence(QString & key) { QKeySequence kS(key); - for(QShortcut * pS = m_pAccellerators->first(); pS; pS = m_pAccellerators->next()) + for(auto & pS : m_pAccellerators) { if(pS->key() == kS) { - m_pAccellerators->removeRef(pS); + m_pAccellerators.erase( + std::remove(m_pAccellerators.begin(), m_pAccellerators.end(), pS), + m_pAccellerators.end() + ); return; } } @@ -465,7 +465,7 @@ void KviMainWindow::closeWindow(KviWindow * wnd) } // forget it... - m_pWinList->removeRef(wnd); + m_WinList.erase(wnd); #if 0 // hide it @@ -484,7 +484,7 @@ void KviMainWindow::closeWindow(KviWindow * wnd) // this happens when there are only minimized windows in the Mdi area // just pick another window to be the active one bool bGotIt = false; - for(KviWindow * pOther = m_pWinList->first(); pOther; pOther = m_pWinList->next()) + for(auto & pOther : m_WinList) { if(wnd != pOther) { @@ -523,7 +523,7 @@ void KviMainWindow::closeWindow(KviWindow * wnd) void KviMainWindow::addWindow(KviWindow * wnd, bool bShow) { - m_pWinList->append(wnd); + m_WinList.insert(wnd); wnd->createWindowListItem(); // create the window WindowList item AFTER it has been constructed QString group; @@ -666,7 +666,7 @@ KviConsoleWindow * KviMainWindow::createNewConsole(bool bFirstInFrame, bool bSho unsigned int KviMainWindow::consoleCount() { unsigned int count = 0; - for(KviWindow * wnd = m_pWinList->first(); wnd; wnd = m_pWinList->next()) + for(auto & wnd : m_WinList) { if(wnd) if(wnd->type() == KviWindow::Console) @@ -677,7 +677,7 @@ unsigned int KviMainWindow::consoleCount() KviConsoleWindow * KviMainWindow::firstConsole() { - for(KviWindow * wnd = m_pWinList->first(); wnd; wnd = m_pWinList->next()) + for(auto & wnd : m_WinList) { if(wnd->type() == KviWindow::Console) return (KviConsoleWindow *)wnd; @@ -690,7 +690,7 @@ KviConsoleWindow * KviMainWindow::firstConsole() KviConsoleWindow * KviMainWindow::firstNotConnectedConsole() { - for(KviWindow * wnd = m_pWinList->first(); wnd; wnd = m_pWinList->next()) + for(auto & wnd : m_WinList) { if(wnd->type() == KviWindow::Console) { @@ -708,7 +708,7 @@ void KviMainWindow::childWindowCloseRequest(KviWindow * wnd) void KviMainWindow::setActiveWindow(KviWindow * wnd) { - // ASSERT(m_pWinList->findRef(wnd)) + // ASSERT(m_WinList.findRef(wnd)) m_pWindowStack->showAndActivate(wnd); } @@ -776,7 +776,7 @@ void KviMainWindow::windowActivated(KviWindow * wnd, bool bForce) if(!wnd) return; // this can happen? - // ASSERT(m_pWinList->findRef(wnd)) + // ASSERT(m_WinList.findRef(wnd)) // unless we want to bForce the active window to be re-activated if(g_pActiveWindow == wnd && !bForce) return; @@ -872,7 +872,7 @@ void KviMainWindow::closeEvent(QCloseEvent * e) { // check for running connections bool bGotRunningConnection = false; - for(KviWindow * w = m_pWinList->first(); w; w = m_pWinList->next()) + for(auto & w : m_WinList) { if(w->type() == KviWindow::Console) { @@ -972,7 +972,7 @@ void KviMainWindow::updatePseudoTransparency() if(g_pShadedChildGlobalDesktopBackground) { - for(KviWindow * wnd = m_pWinList->first(); wnd; wnd = m_pWinList->next()) + for(auto & wnd : m_WinList) wnd->updateBackgrounds(); m_pWindowList->updatePseudoTransparency(); } @@ -993,7 +993,7 @@ void KviMainWindow::applyOptions() { m_pWindowStack->update(); - for(KviWindow * wnd = m_pWinList->first(); wnd; wnd = m_pWinList->next()) + for(auto & wnd : m_WinList) wnd->applyOptions(); m_pWindowList->applyOptions(); @@ -1289,18 +1289,13 @@ void KviMainWindow::createWindowList() void KviMainWindow::recreateWindowList() { - KviWindow * w; - for(w = m_pWinList->first(); w; w = m_pWinList->next()) - { + for(auto & w : m_WinList) w->destroyWindowListItem(); - } createWindowList(); - for(w = m_pWinList->first(); w; w = m_pWinList->next()) - { + for(auto & w : m_WinList) w->createWindowListItem(); - } if(g_pActiveWindow) m_pWindowList->setActiveItem(g_pActiveWindow->windowListItem()); @@ -1351,15 +1346,10 @@ void KviMainWindow::setIconSize(unsigned int uSize) KviTalMainWindow::setIconSize(sSize); - KviPointerListIterator<KviMexToolBar> it(*(m_pModuleExtensionToolBarList)); - if(it.current()) + for(auto & t : m_pModuleExtensionToolBarList) { - while(KviMexToolBar * t = it.current()) - { - t->setIconSize(sSize); - t->update(); - ++it; - } + t->setIconSize(sSize); + t->update(); } KviPointerHashTableIterator<QString, KviCustomToolBarDescriptor> it2(*(KviCustomToolBarManager::instance()->descriptors())); @@ -1382,15 +1372,10 @@ void KviMainWindow::setButtonStyle(unsigned int uStyle) KVI_OPTION_UINT(KviOption_uintToolBarButtonStyle) = uStyle; - KviPointerListIterator<KviMexToolBar> it(*(m_pModuleExtensionToolBarList)); - if(it.current()) + for(auto & t : m_pModuleExtensionToolBarList) { - while(KviMexToolBar * t = it.current()) - { - t->setToolButtonStyle((Qt::ToolButtonStyle)uStyle); - t->update(); - ++it; - } + t->setToolButtonStyle((Qt::ToolButtonStyle)uStyle); + t->update(); } KviPointerHashTableIterator<QString, KviCustomToolBarDescriptor> it2(*(KviCustomToolBarManager::instance()->descriptors())); diff --git a/src/kvirc/ui/KviMainWindow.h b/src/kvirc/ui/KviMainWindow.h index c9751438b..96c449452 100644 --- a/src/kvirc/ui/KviMainWindow.h +++ b/src/kvirc/ui/KviMainWindow.h @@ -33,7 +33,9 @@ #include "KviTalMainWindow.h" #include "KviQString.h" -#include "KviPointerList.h" + +#include <unordered_set> +#include <vector> class KviMenuBar; class KviWindowStack; @@ -50,11 +52,6 @@ class QMenu; class KviTrayIcon; class QShortcut; -#ifdef COMPILE_ON_WINDOWS -// MSVC has problems with KviPointerList<KviWindow> otherwise -#include "KviWindow.h" -#endif - class KVIRC_API KviMainWindow : public KviTalMainWindow //, public KviIrcContextManager { friend class KviWindow; @@ -78,15 +75,15 @@ protected: QSplitter * m_pSplitter; // the frame is splitted vertically and thus can host widgets KviMenuBar * m_pMenuBar; // the main menu bar KviWindowStack * m_pWindowStack; // the mdi manager widget (child of the splitter) - KviPointerList<KviMexToolBar> * m_pModuleExtensionToolBarList; // the module extension toolbars + std::unordered_set<KviMexToolBar *> m_pModuleExtensionToolBarList; // the module extension toolbars KviWindowListBase * m_pWindowList; // the WindowList KviStatusBar * m_pStatusBar; // the mdi workspace child windows - KviPointerList<KviWindow> * m_pWinList; // the main list of windows - KviIrcContext * m_pActiveContext; // the context of the m_pActiveWindow + std::unordered_set<KviWindow *> m_WinList; // the main list of windows + KviIrcContext * m_pActiveContext; // the context of the m_pActiveWindow // other KviTrayIcon * m_pTrayIcon; // the frame's dock extension: this should be prolly moved ? - KviPointerList<QShortcut> * m_pAccellerators; // global application accellerators + std::vector<QShortcut *> m_pAccellerators; // global application accellerators public: // the mdi manager: handles mdi children KviWindowStack * windowStack() { return m_pWindowStack; }; @@ -103,7 +100,7 @@ public: KviIrcConnection * activeConnection(); // The list of the windows belonging to this frame // Note that the windows may be also undocked, but they are still owned by the frame - KviPointerList<KviWindow> * windowList() { return m_pWinList; }; + std::unordered_set<KviWindow *> & windowList() { return m_WinList; }; // Sets the specified window to be the active one // Raises it and focuses it void setActiveWindow(KviWindow * wnd); @@ -117,7 +114,7 @@ public: // window list. This is useful for asynchronous functions // that keep a window pointer and need to ensure that it is still // valid after an uncontrolled delay. (Think of a /timer implementation) - bool windowExists(KviWindow * wnd) { return (m_pWinList->findRef(wnd) != -1); }; + bool windowExists(KviWindow * wnd) { return (m_WinList.count(wnd)); }; // The number of consoles in this frame unsigned int consoleCount(); // Creates a new console window. DON'T use the KviConsoleWindow constructor directly. diff --git a/src/kvirc/ui/KviMaskEditor.cpp b/src/kvirc/ui/KviMaskEditor.cpp index 8fa50b74b..4a9a81502 100644 --- a/src/kvirc/ui/KviMaskEditor.cpp +++ b/src/kvirc/ui/KviMaskEditor.cpp @@ -117,7 +117,7 @@ void KviMaskInputDialog::accept() QDialog::accept(); } -KviMaskEditor::KviMaskEditor(QWidget * par, KviChannelWindow * pChannel, KviWindowToolPageButton * button, KviPointerList<KviMaskEntry> * maskList, char cMode, const char * name) +KviMaskEditor::KviMaskEditor(QWidget * par, KviChannelWindow * pChannel, KviWindowToolPageButton * button, std::vector<KviMaskEntry *> maskList, char cMode, const char * name) : KviWindowToolWidget(par, button) { setObjectName(name); @@ -223,7 +223,7 @@ KviMaskEditor::KviMaskEditor(QWidget * par, KviChannelWindow * pChannel, KviWind return; } - for(KviMaskEntry * e = maskList->first(); e; e = maskList->next()) + for(auto & e : maskList) addMask(e); updateOpStatus(); @@ -273,8 +273,8 @@ void KviMaskEditor::searchTextChanged(const QString & text) void KviMaskEditor::removeClicked() { - KviPointerList<KviMaskEntry> * l = new KviPointerList<KviMaskEntry>; - l->setAutoDelete(true); + std::vector<KviMaskEntry *> l; + KviMaskItem * it; for(int i = 0; i < m_pMaskBox->topLevelItemCount(); i++) { @@ -285,12 +285,11 @@ void KviMaskEditor::removeClicked() e->szMask = it->mask()->szMask; e->szSetBy = it->mask()->szSetBy; e->uSetAt = it->mask()->uSetAt; - l->append(e); + l.push_back(e); } } - if(l->count() > 0) + if(l.size() > 0) emit removeMasks(this, l); - delete l; } void KviMaskEditor::addClicked() diff --git a/src/kvirc/ui/KviMaskEditor.h b/src/kvirc/ui/KviMaskEditor.h index dfcae35db..206cbafc1 100644 --- a/src/kvirc/ui/KviMaskEditor.h +++ b/src/kvirc/ui/KviMaskEditor.h @@ -25,7 +25,6 @@ //============================================================================= #include "kvi_settings.h" -#include "KviPointerList.h" #include "KviCString.h" #include "KviWindowToolWidget.h" #include "KviIconManager.h" @@ -36,6 +35,8 @@ #include <QLineEdit> #include <QWidget> +#include <vector> + class KviMaskEditor; class KviChannelWindow; @@ -96,7 +97,7 @@ class KVIRC_API KviMaskEditor : public KviWindowToolWidget { Q_OBJECT public: - KviMaskEditor(QWidget * par, KviChannelWindow * pChannel, KviWindowToolPageButton * button, KviPointerList<KviMaskEntry> * maskList, + KviMaskEditor(QWidget * par, KviChannelWindow * pChannel, KviWindowToolPageButton * button, std::vector<KviMaskEntry *> maskList, char cMode, const char * name); ~KviMaskEditor(); @@ -121,7 +122,7 @@ protected slots: void searchTextChanged(const QString &); void updateOpStatus(); signals: - void removeMasks(KviMaskEditor *, KviPointerList<KviMaskEntry> *); + void removeMasks(KviMaskEditor *, std::vector<KviMaskEntry *>); }; #endif //_KVI_MASKEDITOR_H_ diff --git a/src/kvirc/ui/KviUserListView.cpp b/src/kvirc/ui/KviUserListView.cpp index c12b1d5a4..6d89f2705 100644 --- a/src/kvirc/ui/KviUserListView.cpp +++ b/src/kvirc/ui/KviUserListView.cpp @@ -461,7 +461,7 @@ void KviUserListView::animatedAvatarUpdated(KviUserListEntry * e) } } -void KviUserListView::completeNickBashLike(const QString & szBegin, KviPointerList<QString> * pList, bool bAppendMask) +void KviUserListView::completeNickBashLike(const QString & szBegin, std::vector<QString> & pList, bool bAppendMask) { KviUserListEntry * pEntry = m_pHeadItem; @@ -470,12 +470,9 @@ void KviUserListView::completeNickBashLike(const QString & szBegin, KviPointerLi if(KviQString::equalCIN(szBegin, pEntry->m_szNick, szBegin.length())) { if(bAppendMask) - { - QString * szTmp = new QString(QString("%1!%2@%3").arg(pEntry->m_szNick, pEntry->m_pGlobalData->user(), pEntry->m_pGlobalData->host())); - pList->append(szTmp); - } + pList.push_back(QString("%1!%2@%3").arg(pEntry->m_szNick, pEntry->m_pGlobalData->user(), pEntry->m_pGlobalData->host())); else - pList->append(new QString(pEntry->m_szNick)); + pList.push_back(pEntry->m_szNick); } pEntry = pEntry->m_pNext; } diff --git a/src/kvirc/ui/KviUserListView.h b/src/kvirc/ui/KviUserListView.h index acd5b296f..121010269 100644 --- a/src/kvirc/ui/KviUserListView.h +++ b/src/kvirc/ui/KviUserListView.h @@ -38,7 +38,6 @@ */ #include "kvi_settings.h" -#include "KviPointerList.h" #include "KviPointerHashTable.h" #include "KviWindowToolWidget.h" #include "KviCString.h" @@ -48,6 +47,7 @@ #include "KviTalToolTip.h" #include <time.h> +#include <vector> #include <QWidget> @@ -738,7 +738,7 @@ public: * \param bAppendMask Whether to append the complete mask * \return void */ - void completeNickBashLike(const QString & szBegin, KviPointerList<QString> * pList, bool bAppendMask); + void completeNickBashLike(const QString & szBegin, std::vector<QString> & pList, bool bAppendMask); protected: /** diff --git a/src/modules/chan/libkvichan.cpp b/src/modules/chan/libkvichan.cpp index e1c374f6d..bb470b9b7 100644 --- a/src/modules/chan/libkvichan.cpp +++ b/src/modules/chan/libkvichan.cpp @@ -36,6 +36,8 @@ #include "KviIrcConnectionTarget.h" #include "KviIrcConnection.h" +#include <vector> + static KviChannelWindow * chan_kvs_find_channel(KviKvsModuleFunctionCall * c, QString & szChan, bool bNoWarnings = false) { if(szChan.isEmpty()) @@ -1333,13 +1335,12 @@ static bool chan_kvs_fnc_banlist(KviKvsModuleFunctionCall * c) if(!ch) return true; - int idx = 0; - - KviPointerList<KviMaskEntry> * l = ch->modeMasks('b'); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks('b'); + if(l.empty()) return true; - for(KviMaskEntry * e = l->first(); e; e = l->next()) + int idx = 0; + for(auto e : l) { pArray->set(idx, new KviKvsVariant(e->szMask)); idx++; @@ -1383,13 +1384,12 @@ static bool chan_kvs_fnc_banexceptionlist(KviKvsModuleFunctionCall * c) if(!ch) return true; - int idx = 0; - - KviPointerList<KviMaskEntry> * l = ch->modeMasks('e'); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks('e'); + if(l.empty()) return true; - for(KviMaskEntry * e = l->first(); e; e = l->next()) + int idx = 0; + for(auto e : l) { pArray->set(idx, new KviKvsVariant(e->szMask)); idx++; @@ -1433,13 +1433,12 @@ static bool chan_kvs_fnc_invitelist(KviKvsModuleFunctionCall * c) if(!ch) return true; - int idx = 0; - - KviPointerList<KviMaskEntry> * l = ch->modeMasks('I'); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks('I'); + if(l.empty()) return true; - for(KviMaskEntry * e = l->first(); e; e = l->next()) + int idx = 0; + for(auto e : l) { pArray->set(idx, new KviKvsVariant(e->szMask)); idx++; @@ -1486,13 +1485,12 @@ static bool chan_kvs_fnc_masklist(KviKvsModuleFunctionCall * c) if(!ch) return true; - int idx = 0; - - KviPointerList<KviMaskEntry> * l = ch->modeMasks(cMode); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks(cMode); + if(l.empty()) return true; - for(KviMaskEntry * e = l->first(); e; e = l->next()) + int idx = 0; + for(auto e : l) { pArray->set(idx, new KviKvsVariant(e->szMask)); idx++; @@ -1535,14 +1533,14 @@ static bool chan_kvs_fnc_matchban(KviKvsModuleFunctionCall * c) return true; } - KviPointerList<KviMaskEntry> * l = ch->modeMasks('b'); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks('b'); + if(l.empty()) { c->returnValue()->setNothing(); return true; } - for(KviMaskEntry * e = l->first(); e; e = l->next()) + for(auto e : l) { if(KviQString::matchString(e->szMask, szMask)) { @@ -1589,14 +1587,14 @@ static bool chan_kvs_fnc_matchbanexception(KviKvsModuleFunctionCall * c) return true; } - KviPointerList<KviMaskEntry> * l = ch->modeMasks('e'); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks('e'); + if(l.empty()) { c->returnValue()->setNothing(); return true; } - for(KviMaskEntry * e = l->first(); e; e = l->next()) + for(auto e : l) { if(KviQString::matchString(e->szMask, szMask)) { @@ -1643,14 +1641,14 @@ static bool chan_kvs_fnc_matchinvite(KviKvsModuleFunctionCall * c) return true; } - KviPointerList<KviMaskEntry> * l = ch->modeMasks('I'); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks('I'); + if(l.empty()) { c->returnValue()->setNothing(); return true; } - for(KviMaskEntry * e = l->first(); e; e = l->next()) + for(auto e : l) { if(KviQString::matchString(e->szMask, szMask)) { @@ -1704,14 +1702,14 @@ static bool chan_kvs_fnc_matchqban(KviKvsModuleFunctionCall * c) return true; } - KviPointerList<KviMaskEntry> * l = ch->modeMasks('b'); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks('b'); + if(l.empty()) { c->returnValue()->setNothing(); return true; } - for(KviMaskEntry * e = l->first(); e; e = l->next()) + for(auto e : l) { if(KviQString::matchString(e->szMask, szMask)) { @@ -1762,14 +1760,14 @@ static bool chan_kvs_fnc_matchmask(KviKvsModuleFunctionCall * c) return true; } - KviPointerList<KviMaskEntry> * l = ch->modeMasks(cMode); - if(!l) + const std::vector<KviMaskEntry *> & l = ch->modeMasks(cMode); + if(l.empty()) { c->returnValue()->setNothing(); return true; } - for(KviMaskEntry * e = l->first(); e; e = l->next()) + for(auto e : l) { if(KviQString::matchString(e->szMask, szMask)) { diff --git a/src/modules/context/libkvicontext.cpp b/src/modules/context/libkvicontext.cpp index 8fa531894..186fce01c 100644 --- a/src/modules/context/libkvicontext.cpp +++ b/src/modules/context/libkvicontext.cpp @@ -469,9 +469,8 @@ static bool context_kvs_fnc_list(KviKvsModuleFunctionCall * c) { KviKvsArray * pArray = new KviKvsArray(); - KviPointerList<KviWindow> * pWinList = g_pMainWindow->windowList(); int idx = 0; - for(KviWindow * pWnd = pWinList->first(); pWnd; pWnd = pWinList->next()) + for(auto pWnd : g_pMainWindow->windowList()) { if(pWnd->type() == KviWindow::Console) { diff --git a/src/modules/filetransferwindow/FileTransferWindow.cpp b/src/modules/filetransferwindow/FileTransferWindow.cpp index 5a681bb1d..a9c639a49 100644 --- a/src/modules/filetransferwindow/FileTransferWindow.cpp +++ b/src/modules/filetransferwindow/FileTransferWindow.cpp @@ -49,6 +49,7 @@ #include <QKeyEvent> #include <QWidgetAction> #include <QHeaderView> +#include <vector> #ifdef COMPILE_KDE4_SUPPORT #include <kurl.h> @@ -349,11 +350,12 @@ void FileTransferWindow::tipRequest(KviDynamicToolTip * tip, const QPoint & pnt) void FileTransferWindow::fillTransferView() { - KviPointerList<KviFileTransfer> * l = KviFileTransferManager::instance()->transferList(); - if(!l) + std::vector<KviFileTransfer *> l = KviFileTransferManager::instance()->transferList(); + if(l.empty()) return; + FileTransferItem * it; - for(KviFileTransfer * t = l->first(); t; t = l->next()) + for(auto t : l) { it = new FileTransferItem(m_pTableWidget, t); t->setDisplayItem(it); diff --git a/src/modules/trayicon/libkvitrayicon.cpp b/src/modules/trayicon/libkvitrayicon.cpp index 77e4edab4..1516ccabc 100644 --- a/src/modules/trayicon/libkvitrayicon.cpp +++ b/src/modules/trayicon/libkvitrayicon.cpp @@ -52,6 +52,7 @@ #include <stdlib.h> #include <time.h> +#include <map> #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW) #define ICON_SIZE 16 @@ -60,7 +61,7 @@ #define ICON_SIZE 48 #endif -extern KVIRC_API KviPointerHashTable<QString, KviWindow> * g_pGlobalWindowDict; +extern KVIRC_API std::map<QString, KviWindow *> g_pGlobalWindowDict; static KviTrayIconWidget * g_pTrayIcon = nullptr; static QPixmap * g_pDock1 = nullptr; @@ -270,10 +271,9 @@ void KviTrayIconWidget::doAway(bool) if(id < 0) { - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - KviConsoleWindow * pConsole = dynamic_cast<KviConsoleWindow *>(wnd); + KviConsoleWindow * pConsole = dynamic_cast<KviConsoleWindow *>(wnd.second); if(pConsole && pConsole->isConnected()) { if(id == -2) @@ -286,7 +286,6 @@ void KviTrayIconWidget::doAway(bool) pConsole->connection()->encodeText(KVI_OPTION_STRING(KviOption_stringAwayMessage)).data()); } } - ++it; } } else @@ -326,13 +325,12 @@ void KviTrayIconWidget::fillContextPopup() QAction * pSeparator = m_pAwayPopup->addSeparator(); - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); bool bAllAway = true; bool bAllUnaway = true; int iNetCount = 0; - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - KviConsoleWindow * pConsole = dynamic_cast<KviConsoleWindow *>(wnd); + KviConsoleWindow * pConsole = dynamic_cast<KviConsoleWindow *>(wnd.second); if(pConsole && pConsole->isConnected()) { QAction * id; @@ -351,7 +349,6 @@ void KviTrayIconWidget::fillContextPopup() id->setData(pConsole->context()->id()); iNetCount++; } - ++it; } if(iNetCount == 1) { diff --git a/src/modules/url/libkviurl.cpp b/src/modules/url/libkviurl.cpp index 564c041c5..a22a10451 100644 --- a/src/modules/url/libkviurl.cpp +++ b/src/modules/url/libkviurl.cpp @@ -34,7 +34,6 @@ #include "KviAction.h" #include "KviActionManager.h" #include "KviWindowListBase.h" -#include "KviPointerList.h" #include "KviKvsEventManager.h" #include "KviWindow.h" #include "KviOptions.h" @@ -64,9 +63,9 @@ typedef struct _UrlDlgList const char * g_pUrlListFilename = "/list.kviurl"; const char * g_pBanListFilename = "/list.kviban"; -KviPointerList<KviUrl> * g_pList; -KviPointerList<UrlDlgList> * g_pUrlDlgList; -KviPointerList<QString> * g_pBanList; +std::unordered_set<KviUrl *> g_List; +std::vector<UrlDlgList *> g_UrlDlgList; +std::unordered_set<QString *> g_BanList; ConfigDialog * g_pConfigDialog; QString szConfigPath; @@ -136,7 +135,7 @@ void UrlDialogTreeWidget::paintEvent(QPaintEvent * event) // ---------------------------- CLASS URLDIALOG ------------------------begin // -UrlDialog::UrlDialog(KviPointerList<KviUrl> *) +UrlDialog::UrlDialog(std::unordered_set<KviUrl *>) : KviWindow(KviWindow::Tool, "URL List") { setAutoFillBackground(false); @@ -183,8 +182,8 @@ void UrlDialog::loadList() void UrlDialog::clear() { - g_pList->clear(); - for(UrlDlgList * tmpitem = g_pUrlDlgList->first(); tmpitem; tmpitem = g_pUrlDlgList->next()) + g_List.clear(); + for(auto & tmpitem : g_UrlDlgList) { if(tmpitem->dlg) tmpitem->dlg->m_pUrlList->clear(); @@ -204,11 +203,11 @@ void UrlDialog::remove() return; } - for(KviUrl * tmp = g_pList->first(); tmp; tmp = g_pList->next()) + for(auto & tmp : g_List) { if(tmp->url == m_pUrlList->currentItem()->text(0)) { - g_pList->removeRef(tmp); + g_List.erase(tmp); delete m_pUrlList->currentItem(); return; } @@ -237,7 +236,7 @@ void UrlDialog::popup(QTreeWidgetItem * item, const QPoint & point) p.addSeparator(); m_pListPopup = new QMenu("list", nullptr); - for(KviWindow * w = g_pMainWindow->windowList()->first(); w; w = g_pMainWindow->windowList()->next()) + for(auto & w : g_pMainWindow->windowList()) { if((w->type() == KviWindow::Channel) || (w->type() == KviWindow::Query) || (w->type() == KviWindow::DccChat)) { @@ -412,7 +411,7 @@ BanFrame::BanFrame(QWidget * parent, const char * name, bool banEnabled) m_pBanList = new QListWidget(this); m_pBanList->setMinimumHeight(100); loadBanList(); - for(QString * tmp = g_pBanList->first(); tmp; tmp = g_pBanList->next()) + for(auto tmp : g_BanList) { m_pBanList->addItem(*tmp); // load ban list into listbox } @@ -446,7 +445,7 @@ void BanFrame::addBan() QString * pText = new QString(QInputDialog::getText(this, __tr2qs("URL Ban List - KVIrc"), __tr2qs("Enter a URL to ban."), QLineEdit::Normal, QString(), &ok)); if(ok && !pText->isEmpty()) { - g_pBanList->append(pText); + g_BanList.insert(pText); m_pBanList->addItem(*pText); } } @@ -462,11 +461,11 @@ void BanFrame::removeBan() return; } QString item(m_pBanList->currentItem()->text()); - for(QString * tmp = g_pBanList->first(); tmp; tmp = g_pBanList->next()) + for(auto tmp : g_BanList) { if(tmp->compare(item) == 0) { - g_pBanList->removeCurrent(); + g_BanList.erase(tmp); delete m_pBanList->currentItem(); return; } @@ -498,9 +497,9 @@ void saveUrlList() QTextStream stream(&file); - stream << g_pList->count() << endl; + stream << g_List.size() << endl; - for(KviUrl * tmp = g_pList->first(); tmp; tmp = g_pList->next()) + for(auto tmp : g_List) { stream << tmp->url << endl; stream << tmp->window << endl; @@ -523,9 +522,9 @@ void loadUrlList() QTextStream stream(&file); - g_pList->clear(); + g_List.clear(); - for(UrlDlgList * tmpitem = g_pUrlDlgList->first(); tmpitem; tmpitem = g_pUrlDlgList->next()) + for(auto tmpitem : g_UrlDlgList) { if(tmpitem->dlg) tmpitem->dlg->m_pUrlList->clear(); @@ -541,9 +540,9 @@ void loadUrlList() tmp->count = stream.readLine().toInt(); tmp->timestamp = stream.readLine(); - g_pList->append(tmp); + g_List.insert(tmp); - for(UrlDlgList * tmpitem = g_pUrlDlgList->first(); tmpitem; tmpitem = g_pUrlDlgList->next()) + for(auto tmpitem : g_UrlDlgList) { if(tmpitem->dlg) { @@ -568,8 +567,8 @@ void saveBanList() QTextStream stream(&file); - stream << g_pBanList->count() << endl; - for(QString * tmp = g_pBanList->first(); tmp; tmp = g_pBanList->next()) + stream << g_BanList.size() << endl; + for(auto tmp : g_BanList) { stream << *tmp << endl; } @@ -589,14 +588,14 @@ void loadBanList() QTextStream stream(&file); - g_pBanList->clear(); + g_BanList.clear(); int i = 0; int num = stream.readLine().toInt(); while((!stream.atEnd()) && (i < num)) { QString * tmp = new QString(stream.readLine()); - g_pBanList->append(tmp); + g_BanList.insert(tmp); i++; } file.close(); @@ -618,13 +617,13 @@ void loadBanList() [b]Window[/b]: window where the URL has been shown last[br] [b]Count[/b]: number of URLs shown[br] [b]Timestamp[/b]: date/time when the URL has been shown first[br][br] - + Clicking right on the URL column of the list a menu will popup, through it you can remove the selected item, find the URL in the window it appeared last, and say it to: [i]@Console, Channels, Queries, DCC Chats[/i] and [i]User windows[/i].[br] The list is saved to file when you click on the menu item or when you unload the plugin on condition that you have checked the relative checkbox in configuration dialog.[br][br] - + You can also open the URL in your web browser double clicking on it in the URL list window. */ @@ -634,10 +633,10 @@ static bool url_kvs_cmd_list(KviKvsModuleCommandCall *) if(tmpitem->dlg) return false; - tmpitem->dlg = new UrlDialog(g_pList); + tmpitem->dlg = new UrlDialog(g_List); g_pMainWindow->addWindow(tmpitem->dlg); - for(KviUrl * tmp = g_pList->first(); tmp; tmp = g_pList->next()) + for(auto tmp : g_List) { QString tmpCount; tmpCount.setNum(tmp->count); @@ -648,14 +647,14 @@ static bool url_kvs_cmd_list(KviKvsModuleCommandCall *) UrlDlgList * findFrame() { - UrlDlgList * tmpitem = g_pUrlDlgList->first(); + UrlDlgList * tmpitem = g_UrlDlgList.front(); if(!tmpitem) { UrlDlgList * udl = new UrlDlgList(); udl->dlg = nullptr; udl->menu_id = -1; - g_pUrlDlgList->append(udl); - tmpitem = g_pUrlDlgList->current(); + g_UrlDlgList.push_back(udl); + tmpitem = g_UrlDlgList.back(); } return tmpitem; } @@ -691,7 +690,7 @@ int check_url(KviWindow * w, const QString & szUrl) // return 0 if no occurrence { int tmp = 0; - for(QString * tmpi = g_pBanList->first(); tmpi; tmpi = g_pBanList->next()) + for(auto tmpi : g_BanList) { if(szUrl.indexOf(*tmpi, Qt::CaseInsensitive) != -1) tmp++; @@ -699,7 +698,7 @@ int check_url(KviWindow * w, const QString & szUrl) // return 0 if no occurrence if(tmp > 0) return tmp; - for(KviUrl * u = g_pList->first(); u; u = g_pList->next()) + for(auto u : g_List) { if(u->url == szUrl) { @@ -709,7 +708,7 @@ int check_url(KviWindow * w, const QString & szUrl) // return 0 if no occurrence } } - for(UrlDlgList * tmpitem = g_pUrlDlgList->first(); tmpitem; tmpitem = g_pUrlDlgList->next()) + for(auto tmpitem : g_UrlDlgList) { if(tmpitem->dlg) { @@ -754,8 +753,8 @@ bool urllist_module_event_onUrl(KviKvsModuleEventCall * c) tmp->count = 1; tmp->timestamp = tmpTimestamp; - g_pList->append(tmp); - for(UrlDlgList * tmpitem = g_pUrlDlgList->first(); tmpitem; tmpitem = g_pUrlDlgList->next()) + g_List.insert(tmp); + for(auto tmpitem : g_UrlDlgList) { if(tmpitem->dlg) { @@ -784,15 +783,6 @@ bool urllist_module_event_onUrl(KviKvsModuleEventCall * c) static bool url_module_init(KviModule * m) { - g_pList = new KviPointerList<KviUrl>; - g_pList->setAutoDelete(true); - - g_pUrlDlgList = new KviPointerList<UrlDlgList>; - g_pUrlDlgList->setAutoDelete(true); - - g_pBanList = new KviPointerList<QString>; - g_pBanList->setAutoDelete(true); - KVSM_REGISTER_SIMPLE_COMMAND(m, "list", url_kvs_cmd_list); KVSM_REGISTER_SIMPLE_COMMAND(m, "config", url_kvs_cmd_config); @@ -805,7 +795,7 @@ static bool url_module_init(KviModule * m) UrlDlgList * udl = new UrlDlgList(); udl->dlg = nullptr; - g_pUrlDlgList->append(udl); + g_UrlDlgList.push_back(udl); return true; } @@ -816,19 +806,15 @@ static bool url_module_cleanup(KviModule *) cfg.setGroup("ConfigDialog"); if(cfg.readBoolEntry("SaveUrlListOnUnload", false) == true) saveUrlList(); - for(UrlDlgList * tmpitem = g_pUrlDlgList->first(); tmpitem; tmpitem = g_pUrlDlgList->next()) + for(auto tmpitem : g_UrlDlgList) { if(tmpitem->dlg) tmpitem->dlg->close(); } - delete g_pList; - g_pList = nullptr; - delete g_pBanList; - g_pBanList = nullptr; - - delete g_pUrlDlgList; - g_pUrlDlgList = nullptr; + g_List.clear(); + g_BanList.clear(); + g_UrlDlgList.clear(); return true; } diff --git a/src/modules/url/libkviurl.h b/src/modules/url/libkviurl.h index 56203de3c..623d11b5a 100644 --- a/src/modules/url/libkviurl.h +++ b/src/modules/url/libkviurl.h @@ -45,6 +45,9 @@ #include <QCheckBox> #include <QListWidget> +#include <unordered_set> +#include <vector> + typedef struct _KviUrl { QString url; @@ -72,7 +75,7 @@ class UrlDialog : public KviWindow { Q_OBJECT public: - UrlDialog(KviPointerList<KviUrl> * g_pList); + UrlDialog(std::unordered_set<KviUrl *> g_List); ~UrlDialog(); private: diff --git a/src/modules/window/UserWindow.cpp b/src/modules/window/UserWindow.cpp index 48d34c734..e1d7500ab 100644 --- a/src/modules/window/UserWindow.cpp +++ b/src/modules/window/UserWindow.cpp @@ -28,12 +28,15 @@ #include "KviMainWindow.h" #include "KviConsoleWindow.h" -extern KviPointerList<UserWindow> * g_pUserWindowList; +#include <algorithm> +#include <map> + +extern std::vector<UserWindow *> g_pUserWindowList; UserWindow::UserWindow(const char * pcName, QString & szIcon, KviConsoleWindow * pConsole, int iCreationFlags) : KviWindow(KviWindow::UserWindow, pcName, pConsole) { - g_pUserWindowList->append(this); + g_pUserWindowList.push_back(this); m_szIcon = szIcon; @@ -55,7 +58,7 @@ UserWindow::~UserWindow() { if(context()) context()->unregisterContextWindow(this); - g_pUserWindowList->removeRef(this); + g_pUserWindowList.erase(std::remove(g_pUserWindowList.begin(), g_pUserWindowList.end(), this), g_pUserWindowList.end()); } QPixmap * UserWindow::myIconPtr() diff --git a/src/modules/window/libkviwindow.cpp b/src/modules/window/libkviwindow.cpp index ea690f02a..cb7e4be88 100644 --- a/src/modules/window/libkviwindow.cpp +++ b/src/modules/window/libkviwindow.cpp @@ -38,9 +38,10 @@ #include "KviModuleManager.h" #include "KviMemory.h" #include "KviChannelWindow.h" -#include "KviPointerHashTable.h" #include <QTimer> +#include <map> +#include <vector> #ifdef COMPILE_CRYPT_SUPPORT #include "KviCryptEngine.h" @@ -50,8 +51,8 @@ extern KVIRC_API KviCryptEngineManager * g_pCryptEngineManager; #endif // KviApplication.cpp -extern KVIRC_API KviPointerHashTable<QString, KviWindow> * g_pGlobalWindowDict; -KviPointerList<UserWindow> * g_pUserWindowList = nullptr; +extern KVIRC_API std::map<QString, KviWindow *> g_pGlobalWindowDict; +std::vector<UserWindow *> g_pUserWindowList; // $window.caption $window.x $window.y $window.width $window.height $window.isActive $window.type // $window.input.text $window.input.cursorpos $window.input.textlen @@ -841,78 +842,72 @@ static bool window_kvs_fnc_list(KviKvsModuleFunctionCall * c) { // all contexts but no "no_context" windows bool bAllWindows = KviQString::equalCI(szType, "all"); - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - if(wnd->context()) + if(wnd.second->context()) { if(bAllWindows) { - pArray->set(id, new KviKvsVariant(QString(wnd->id()))); + pArray->set(id, new KviKvsVariant(QString(wnd.second->id()))); id++; } else { - if(szType.toLower() == wnd->typeString()) + if(szType.toLower() == wnd.second->typeString()) { - pArray->set(id, new KviKvsVariant(QString(wnd->id()))); + pArray->set(id, new KviKvsVariant(QString(wnd.second->id()))); id++; } } } - ++it; } } else if(KviQString::equalCI(szContext, "any")) { // all contexts and also "no_context" windows bool bAllWindows = KviQString::equalCI(szType.toLower(), "all"); - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { if(bAllWindows) { - pArray->set(id, new KviKvsVariant(QString(wnd->id()))); + pArray->set(id, new KviKvsVariant(QString(wnd.second->id()))); id++; } else { - if(szType.toLower() == wnd->typeString()) + if(szType.toLower() == wnd.second->typeString()) { - pArray->set(id, new KviKvsVariant(QString(wnd->id()))); + pArray->set(id, new KviKvsVariant(QString(wnd.second->id()))); id++; } } - ++it; } } else if(KviQString::equalCI(szContext, "none")) { // only "no_context" windows bool bAllWindows = KviQString::equalCI(szType.toLower(), "all"); - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - if(!wnd->context()) + if(!wnd.second->context()) { if(bAllWindows) { - pArray->set(id, new KviKvsVariant(QString(wnd->id()))); + pArray->set(id, new KviKvsVariant(QString(wnd.second->id()))); id++; } else { - if(szType.toLower() == wnd->typeString()) + if(szType.toLower() == wnd.second->typeString()) { - pArray->set(id, new KviKvsVariant(QString(wnd->id()))); + pArray->set(id, new KviKvsVariant(QString(wnd.second->id()))); id++; } } } - ++it; } } else @@ -942,30 +937,28 @@ static bool window_kvs_fnc_list(KviKvsModuleFunctionCall * c) } bool bAllWindows = KviQString::equalCI(szType.toLower(), "all"); - KviPointerHashTableIterator<QString, KviWindow> it(*g_pGlobalWindowDict); - while(KviWindow * wnd = it.current()) + for(auto & wnd : g_pGlobalWindowDict) { - if(wnd->context()) + if(wnd.second->context()) { - if(wnd->context()->id() == uId) + if(wnd.second->context()->id() == uId) { if(bAllWindows) { - pArray->set(id, new KviKvsVariant(QString(wnd->id()))); + pArray->set(id, new KviKvsVariant(QString(wnd.second->id()))); id++; } else { - if(szType.toLower() == wnd->typeString()) + if(szType.toLower() == wnd.second->typeString()) { - pArray->set(id, new KviKvsVariant(QString(wnd->id()))); + pArray->set(id, new KviKvsVariant(QString(wnd.second->id()))); id++; } } } } - ++it; } } return true; @@ -1505,9 +1498,6 @@ static bool window_kvs_cmd_fake(KviKvsModuleCommandCall * c) static bool window_module_init(KviModule * m) { - g_pUserWindowList = new KviPointerList<UserWindow>(); - g_pUserWindowList->setAutoDelete(false); - KVSM_REGISTER_FUNCTION(m, "activityTemperature", window_kvs_fnc_activityTemperature); KVSM_REGISTER_FUNCTION(m, "activityLevel", window_kvs_fnc_activityLevel); KVSM_REGISTER_FUNCTION(m, "highlightLevel", window_kvs_fnc_highlightLevel); @@ -1550,15 +1540,15 @@ static bool window_module_init(KviModule * m) static bool window_module_cleanup(KviModule *) { - while(UserWindow * w = g_pUserWindowList->first()) + for(auto & w : g_pUserWindowList) w->close(); - delete g_pUserWindowList; + g_pUserWindowList.clear(); return true; } static bool window_module_can_unload(KviModule *) { - return g_pUserWindowList->isEmpty(); + return g_pUserWindowList.empty(); } KVIRC_MODULE( |
