summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-09-27 07:50:43 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-09-27 07:50:43 +0000
commit9c322ab976d05b80df7b2e86281b6531bb85ae25 (patch)
treed370ddba0b73ee9f1c9d4b6f370f86af041acb70
parentbccbe8fe3f707b9b810f8c31445e95d532f234d8 (diff)
Because the user's prefix list must remain sorted at all times (because of assumptions in xchat) this means that we don't need to scan the list looking for their highest prefix, it will always be at begin(). This changes the speed of GetPrefix() and GetPrefixValue() from O(n) to O(1).
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5348 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/channels.cpp32
1 files changed, 10 insertions, 22 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index 353798e96..5e2ef907c 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -885,26 +885,20 @@ long chanrec::GetMaxBans()
*/
const char* chanrec::GetPrefixChar(userrec *user)
{
- static char px[2];
- unsigned int mx = 0;
-
- *px = 0;
- *(px+1) = 0;
-
+ static char pf[2] = {0, 0};
+
prefixlist::iterator n = prefixes.find(user);
if (n != prefixes.end())
{
- for (std::vector<prefixtype>::iterator x = n->second.begin(); x != n->second.end(); x++)
+ if (n->second.size())
{
- if (x->second > mx)
- {
- *px = x->first;
- mx = x->second;
- }
+ *pf = n->second.begin()->first;
+ return pf;
}
}
- return px;
+ *pf = 0;
+ return pf;
}
const char* chanrec::GetAllPrefixChars(userrec* user)
@@ -929,19 +923,13 @@ const char* chanrec::GetAllPrefixChars(userrec* user)
unsigned int chanrec::GetPrefixValue(userrec* user)
{
- unsigned int mx = 0;
-
prefixlist::iterator n = prefixes.find(user);
if (n != prefixes.end())
{
- for (std::vector<prefixtype>::iterator x = n->second.begin(); x != n->second.end(); x++)
- {
- if (x->second > mx)
- mx = x->second;
- }
+ if (n->second.size())
+ return n->second.begin()->second;
}
-
- return mx;
+ return 0;
}