Use a set instead of a vector in CModule

CModule has two vectors: A list of timers and a list of sockets for this
module. Since one shouldn't be able to add items multiple times it makes sense
to use a set here instead.


git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1643 726aef4b-f618-498e-8847-2d620e286838
This commit is contained in:
psychon
2009-10-05 20:44:54 +00:00
parent 7361b87130
commit c88ec5f91d
3 changed files with 61 additions and 44 deletions
+49 -31
View File
@@ -235,12 +235,12 @@ CModule::CModule(ModHandle pDLL, const CString& sModName, const CString& sDataDi
}
CModule::~CModule() {
while (m_vTimers.size()) {
RemTimer(m_vTimers[0]->GetName());
while (!m_sTimers.empty()) {
RemTimer(*m_sTimers.begin());
}
while (m_vSockets.size()) {
RemSocket(m_vSockets[0]);
while (!m_sSockets.empty()) {
RemSocket(*m_sSockets.begin());
}
SaveRegistry();
@@ -310,8 +310,11 @@ bool CModule::AddTimer(CTimer* pTimer) {
return false;
}
if (!m_sTimers.insert(pTimer).second)
// Was already added
return true;
m_pManager->AddCron(pTimer);
m_vTimers.push_back(pTimer);
return true;
}
@@ -322,12 +325,19 @@ bool CModule::AddTimer(FPTimer_t pFBCallback, const CString& sLabel, u_int uInte
return AddTimer(pTimer);
}
bool CModule::RemTimer(CTimer* pTimer) {
if (m_sTimers.erase(pTimer) == 0)
return false;
return true;
}
bool CModule::RemTimer(const CString& sLabel) {
for (unsigned int a = 0; a < m_vTimers.size(); a++) {
CTimer* pTimer = m_vTimers[a];
set<CTimer*>::iterator it;
for (it = m_sTimers.begin(); it != m_sTimers.end(); ++it) {
CTimer* pTimer = *it;
if (pTimer->GetName().Equals(sLabel)) {
m_vTimers.erase(m_vTimers.begin() +a);
m_sTimers.erase(it);
m_pManager->DelCronByAddr(pTimer);
return true;
}
@@ -337,9 +347,10 @@ bool CModule::RemTimer(const CString& sLabel) {
}
bool CModule::UnlinkTimer(CTimer* pTimer) {
for (unsigned int a = 0; a < m_vTimers.size(); a++) {
if (pTimer == m_vTimers[a]) {
m_vTimers.erase(m_vTimers.begin() +a);
set<CTimer*>::iterator it;
for (it = m_sTimers.begin(); it != m_sTimers.end(); ++it) {
if (pTimer == *it) {
m_sTimers.erase(it);
return true;
}
}
@@ -348,8 +359,9 @@ bool CModule::UnlinkTimer(CTimer* pTimer) {
}
CTimer* CModule::FindTimer(const CString& sLabel) {
for (unsigned int a = 0; a < m_vTimers.size(); a++) {
CTimer* pTimer = m_vTimers[a];
set<CTimer*>::iterator it;
for (it = m_sTimers.begin(); it != m_sTimers.end(); ++it) {
CTimer* pTimer = *it;
if (pTimer->GetName().Equals(sLabel)) {
return pTimer;
}
@@ -359,7 +371,7 @@ CTimer* CModule::FindTimer(const CString& sLabel) {
}
void CModule::ListTimers() {
if (!m_vTimers.size()) {
if (m_sTimers.empty()) {
PutModule("You have no timers running.");
return;
}
@@ -370,8 +382,9 @@ void CModule::ListTimers() {
Table.AddColumn("Cycles");
Table.AddColumn("Description");
for (unsigned int a = 0; a < m_vTimers.size(); a++) {
CTimer* pTimer = (CTimer*) m_vTimers[a];
set<CTimer*>::iterator it;
for (it = m_sTimers.begin(); it != m_sTimers.end(); ++it) {
CTimer* pTimer = *it;
unsigned int uCycles = pTimer->GetCyclesLeft();
Table.AddRow();
@@ -389,14 +402,15 @@ bool CModule::AddSocket(CSocket* pSocket) {
return false;
}
m_vSockets.push_back(pSocket);
m_sSockets.insert(pSocket);
return true;
}
bool CModule::RemSocket(CSocket* pSocket) {
for (unsigned int a = 0; a < m_vSockets.size(); a++) {
if (m_vSockets[a] == pSocket) {
m_vSockets.erase(m_vSockets.begin() +a);
set<CSocket*>::iterator it;
for (it = m_sSockets.begin(); it != m_sSockets.end(); ++it) {
if (*it == pSocket) {
m_sSockets.erase(it);
m_pManager->DelSockByAddr(pSocket);
return true;
}
@@ -406,11 +420,12 @@ bool CModule::RemSocket(CSocket* pSocket) {
}
bool CModule::RemSocket(const CString& sSockName) {
for (unsigned int a = 0; a < m_vSockets.size(); a++) {
CSocket* pSocket = m_vSockets[a];
set<CSocket*>::iterator it;
for (it = m_sSockets.begin(); it != m_sSockets.end(); ++it) {
CSocket* pSocket = *it;
if (pSocket->GetSockName().Equals(sSockName)) {
m_vSockets.erase(m_vSockets.begin() +a);
m_sSockets.erase(it);
m_pManager->DelSockByAddr(pSocket);
return true;
}
@@ -420,9 +435,10 @@ bool CModule::RemSocket(const CString& sSockName) {
}
bool CModule::UnlinkSocket(CSocket* pSocket) {
for (unsigned int a = 0; a < m_vSockets.size(); a++) {
if (pSocket == m_vSockets[a]) {
m_vSockets.erase(m_vSockets.begin() +a);
set<CSocket*>::iterator it;
for (it = m_sSockets.begin(); it != m_sSockets.end(); ++it) {
if (pSocket == *it) {
m_sSockets.erase(it);
return true;
}
}
@@ -431,8 +447,9 @@ bool CModule::UnlinkSocket(CSocket* pSocket) {
}
CSocket* CModule::FindSocket(const CString& sSockName) {
for (unsigned int a = 0; a < m_vSockets.size(); a++) {
CSocket* pSocket = m_vSockets[a];
set<CSocket*>::iterator it;
for (it = m_sSockets.begin(); it != m_sSockets.end(); ++it) {
CSocket* pSocket = *it;
if (pSocket->GetSockName().Equals(sSockName)) {
return pSocket;
}
@@ -442,7 +459,7 @@ CSocket* CModule::FindSocket(const CString& sSockName) {
}
void CModule::ListSockets() {
if (!m_vSockets.size()) {
if (m_sSockets.empty()) {
PutModule("You have no open sockets.");
return;
}
@@ -455,8 +472,9 @@ void CModule::ListSockets() {
Table.AddColumn("RemoteIP");
Table.AddColumn("RemotePort");
for (unsigned int a = 0; a < m_vSockets.size(); a++) {
CSocket* pSocket = (CSocket*) m_vSockets[a];
set<CSocket*>::iterator it;
for (it = m_sSockets.begin(); it != m_sSockets.end(); ++it) {
CSocket* pSocket = *it;
Table.AddRow();
Table.SetCell("Name", pSocket->GetSockName());
+7 -8
View File
@@ -14,10 +14,8 @@
#include "FileUtils.h"
#include "Utils.h"
#include <set>
#include <vector>
#include <queue>
using std::vector;
using std::set;
// Forward Declarations
@@ -317,11 +315,12 @@ public:
// Timer stuff
bool AddTimer(CTimer* pTimer);
bool AddTimer(FPTimer_t pFBCallback, const CString& sLabel, u_int uInterval, u_int uCycles = 0, const CString& sDescription = "");
bool RemTimer(CTimer* pTimer);
bool RemTimer(const CString& sLabel);
bool UnlinkTimer(CTimer* pTimer);
CTimer* FindTimer(const CString& sLabel);
vector<CTimer*>::const_iterator BeginTimers() const { return m_vTimers.begin(); }
vector<CTimer*>::const_iterator EndTimers() const { return m_vTimers.end(); }
set<CTimer*>::const_iterator BeginTimers() const { return m_sTimers.begin(); }
set<CTimer*>::const_iterator EndTimers() const { return m_sTimers.end(); }
virtual void ListTimers();
// !Timer stuff
@@ -331,8 +330,8 @@ public:
bool RemSocket(const CString& sSockName);
bool UnlinkSocket(CSocket* pSocket);
CSocket* FindSocket(const CString& sSockName);
vector<CSocket*>::const_iterator BeginSockets() const { return m_vSockets.begin(); }
vector<CSocket*>::const_iterator EndSockets() const { return m_vSockets.end(); }
set<CSocket*>::const_iterator BeginSockets() const { return m_sSockets.begin(); }
set<CSocket*>::const_iterator EndSockets() const { return m_sSockets.end(); }
virtual void ListSockets();
// !Socket stuff
@@ -370,8 +369,8 @@ protected:
bool m_bFake;
bool m_bGlobal;
CString m_sDescription;
vector<CTimer*> m_vTimers;
vector<CSocket*> m_vSockets;
set<CTimer*> m_sTimers;
set<CSocket*> m_sSockets;
ModHandle m_pDLL;
CSockManager* m_pManager;
CUser* m_pUser;
+5 -5
View File
@@ -121,7 +121,7 @@ public:
virtual void OnClientLogin()
{
vector<CSocket*>::const_iterator it;
set<CSocket*>::const_iterator it;
for (it = BeginSockets(); it != EndSockets(); it++) {
CSChatSock *p = (CSChatSock*) *it;
@@ -154,7 +154,7 @@ public:
if (sCom.Equals("chat") && !sArgs.empty()) {
CString sNick = "(s)" + sArgs;
vector<CSocket*>::const_iterator it;
set<CSocket*>::const_iterator it;
for (it = BeginSockets(); it != EndSockets(); it++) {
CSChatSock *pSock = (CSChatSock*) *it;
@@ -193,7 +193,7 @@ public:
Table.AddColumn("Status");
Table.AddColumn("Cipher");
vector<CSocket*>::const_iterator it;
set<CSocket*>::const_iterator it;
for (it = BeginSockets(); it != EndSockets(); it++) {
Table.AddRow();
@@ -230,7 +230,7 @@ public:
if (!sArgs.Equals("(s)", false, 3))
sArgs = "(s)" + sArgs;
vector<CSocket*>::const_iterator it;
set<CSocket*>::const_iterator it;
for (it = BeginSockets(); it != EndSockets(); it++) {
CSChatSock *pSock = (CSChatSock*) *it;
@@ -249,7 +249,7 @@ public:
Table.AddColumn("Type");
Table.AddColumn("Cipher");
vector<CSocket*>::const_iterator it;
set<CSocket*>::const_iterator it;
for (it = BeginSockets(); it != EndSockets(); it++) {
Table.AddRow();
Csock *pSock = *it;