From 22c83f35d4d65d4c2947830b7795a9e344fa1677 Mon Sep 17 00:00:00 2001 From: brain Date: Mon, 29 Oct 2007 00:23:11 +0000 Subject: [PATCH] Ok, now each xline will be in two places. The sorted vector and a map, each line type having its own map stored in a map of maps. (RTFS when its done) This allows for faster checking for simple existence of a line for removal/adding without O(n) lookups git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8420 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/xline.h | 2 +- src/xline.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/xline.h b/include/xline.h index 6e32944fe..711897e4d 100644 --- a/include/xline.h +++ b/include/xline.h @@ -359,7 +359,7 @@ class CoreExport XLineManager public: - std::map elines; + std::map > lookup_lines; /** Constructor * @param Instance A pointer to the creator object diff --git a/src/xline.cpp b/src/xline.cpp index f436d9692..bfa21b21d 100644 --- a/src/xline.cpp +++ b/src/xline.cpp @@ -205,10 +205,10 @@ bool XLineManager::AddELine(long duration, const char* source, const char* reaso active_lines.push_back(item); sort(active_lines.begin(), active_lines.end(),XLineManager::XSortComparison); - elines[hostmask] = item; + lookup_lines['E'][hostmask] = item; // XXX we really only need to check one line (the new one) - this is a bit wasteful! - CheckELines(ServerInstance, elines); + CheckELines(ServerInstance, lookup_lines['E']); return true; } @@ -305,8 +305,8 @@ void ELine::Unset() User* u = (User*)(*u2); u->exempt = false; } - ServerInstance->XLines->elines.erase(this->identmask + std::string("@") + this->hostmask); - CheckELines(ServerInstance, ServerInstance->XLines->elines); + ServerInstance->XLines->lookup_lines['E'].erase(this->identmask + std::string("@") + this->hostmask); + CheckELines(ServerInstance, ServerInstance->XLines->lookup_lines['E']); } // returns a pointer to the reason if a nickname matches a qline, NULL if it didnt match @@ -332,7 +332,7 @@ GLine* XLineManager::matches_gline(User* user) ELine* XLineManager::matches_exception(User* user) { - if (elines.empty()) + if (lookup_lines['E'].empty()) return NULL; for (std::vector::iterator i = active_lines.begin(); i != active_lines.end(); i++) -- 2.39.2