summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2017-04-06 12:22:52 -0400
committerAdam <Adam@anope.org>2017-04-06 12:22:52 -0400
commit72bb1b14d372fa6065af77e8b98e8aab5295fe23 (patch)
treed0e426a88a64b67ba832fcd4648ec1d6f198fc42
parent7f5cb607af73a4134a158a14006bdc3e202d0a34 (diff)
Fix access comparison operators
-rw-r--r--include/modules/chanserv/chanaccess.h35
-rw-r--r--include/modules/chanserv/main/chanaccess.h2
-rw-r--r--modules/chanserv/access.cpp22
-rw-r--r--modules/chanserv/main/chanaccess.cpp20
4 files changed, 39 insertions, 40 deletions
diff --git a/include/modules/chanserv/chanaccess.h b/include/modules/chanserv/chanaccess.h
index dff39c0f8..ec05a7ae5 100644
--- a/include/modules/chanserv/chanaccess.h
+++ b/include/modules/chanserv/chanaccess.h
@@ -83,40 +83,17 @@ class CoreExport ChanAccess : public Serialize::Object
*/
virtual void AccessUnserialize(const Anope::string &data) anope_abstract;
+ virtual int Compare(ChanAccess *other) anope_abstract;
+
/* Comparison operators to other Access entries */
- virtual bool operator>(ChanAccess &other)
+ bool operator>(ChanAccess &other)
{
-// const std::vector<Privilege> &privs = service->GetPrivileges();
-// for (unsigned i = privs.size(); i > 0; --i)
-// {
-// bool this_p = this->HasPriv(privs[i - 1].name),
-// other_p = other.HasPriv(privs[i - 1].name);
-//
-// if (!this_p && !other_p)
-// continue;
-//
-// return this_p && !other_p;
-// }
-
- return false;
+ return Compare(&other) > 0;
}
-#warning "move this out"
- virtual bool operator<(ChanAccess &other)
+ bool operator<(ChanAccess &other)
{
-// const std::vector<Privilege> &privs = service->GetPrivileges();
-// for (unsigned i = privs.size(); i > 0; --i)
-// {
-// bool this_p = this->HasPriv(privs[i - 1].name),
-// other_p = other.HasPriv(privs[i - 1].name);
-//
-// if (!this_p && !other_p)
-// continue;
-//
-// return !this_p && other_p;
-// }
-
- return false;
+ return Compare(&other) < 0;
}
bool operator>=(ChanAccess &other)
diff --git a/include/modules/chanserv/main/chanaccess.h b/include/modules/chanserv/main/chanaccess.h
index fb78056ea..ca6661a5b 100644
--- a/include/modules/chanserv/main/chanaccess.h
+++ b/include/modules/chanserv/main/chanaccess.h
@@ -45,4 +45,6 @@ class ChanAccessImpl : public ChanServ::ChanAccess
Anope::string Mask() override;
bool Matches(const User *u, NickServ::Account *acc) override;
+
+ int Compare(ChanAccess *other) override;
};
diff --git a/modules/chanserv/access.cpp b/modules/chanserv/access.cpp
index a29524a73..8342e5973 100644
--- a/modules/chanserv/access.cpp
+++ b/modules/chanserv/access.cpp
@@ -60,20 +60,20 @@ class AccessChanAccessImpl : public AccessChanAccess
}
}
- bool operator>(ChanServ::ChanAccess &other) override
+ int Compare(ChanAccess *other) override
{
- if (this->GetSerializableType() != other.GetSerializableType())
- return ChanServ::ChanAccess::operator>(other);
- else
- return this->GetLevel() > anope_dynamic_static_cast<AccessChanAccess *>(&other)->GetLevel();
- }
+ if (this->GetSerializableType() != other->GetSerializableType())
+ return ChanAccess::Compare(other);
- bool operator<(ChanServ::ChanAccess &other) override
- {
- if (this->GetSerializableType() != other.GetSerializableType())
- return ChanAccess::operator<(other);
+ int lev = this->GetLevel();
+ int theirlev = anope_dynamic_static_cast<AccessChanAccess *>(other)->GetLevel();
+
+ if (lev > theirlev)
+ return 1;
+ else if (lev < theirlev)
+ return -1;
else
- return this->GetLevel() < anope_dynamic_static_cast<AccessChanAccess *>(&other)->GetLevel();
+ return 0;
}
};
diff --git a/modules/chanserv/main/chanaccess.cpp b/modules/chanserv/main/chanaccess.cpp
index f2b170989..bc2778bc3 100644
--- a/modules/chanserv/main/chanaccess.cpp
+++ b/modules/chanserv/main/chanaccess.cpp
@@ -110,3 +110,23 @@ bool ChanAccessImpl::Matches(const User *u, NickServ::Account *acc)
return false;
}
+
+int ChanAccessImpl::Compare(ChanAccess *other)
+{
+ const std::vector<ChanServ::Privilege> &privs = ChanServ::service->GetPrivileges();
+ for (unsigned int i = privs.size(); i > 0; --i)
+ {
+ bool this_p = this->HasPriv(privs[i - 1].name),
+ other_p = other->HasPriv(privs[i - 1].name);
+
+ if (!this_p && !other_p)
+ continue;
+
+ if (this_p && !other_p)
+ return 1;
+ else if (!this_p && other_p)
+ return -1;
+ }
+
+ return 0;
+}