summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-10-29 00:23:11 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2007-10-29 00:23:11 +0000
commit22c83f35d4d65d4c2947830b7795a9e344fa1677 (patch)
tree43b2a1821b337cc5dbcdea9a814018f4ffc0cb69
parent8782cde20b474cf50f11fc6685c70a785bb3b2be (diff)
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
-rw-r--r--include/xline.h2
-rw-r--r--src/xline.cpp10
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<std::string, ELine *> elines;
+ std::map<char, std::map<std::string, ELine *> > 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<XLine*>::iterator i = active_lines.begin(); i != active_lines.end(); i++)