]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Use pdns_ilexicographical_compare_three_way() in DNSName::canonCompare()...
authorMiod Vallat <miod.vallat@powerdns.com>
Thu, 26 Jun 2025 06:51:30 +0000 (08:51 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Thu, 26 Jun 2025 06:53:01 +0000 (08:53 +0200)
...rather than two std::lexicographical_compare() calls.

Signed-off-by: Miod Vallat <miod.vallat@powerdns.com>
pdns/dnsname.cc
pdns/dnsname.hh

index 04ba589c7e43da9e53ae29eacc82837f0b67a97b..f09f2b1e5f55546587601a8615472d7ce5661495 100644 (file)
@@ -498,25 +498,16 @@ bool DNSName::canonCompare(const DNSName& rhs) const
     ourcount--;
     rhscount--;
 
-    bool res=std::lexicographical_compare(
-                                         d_storage.c_str() + ourpos[ourcount] + 1,
-                                         d_storage.c_str() + ourpos[ourcount] + 1 + *(d_storage.c_str() + ourpos[ourcount]),
-                                         rhs.d_storage.c_str() + rhspos[rhscount] + 1,
-                                         rhs.d_storage.c_str() + rhspos[rhscount] + 1 + *(rhs.d_storage.c_str() + rhspos[rhscount]),
-                                         DNSNameCompare());
-
-    //    cout<<"Forward: "<<res<<endl;
-    if(res)
-      return true;
-
-    res=std::lexicographical_compare(    rhs.d_storage.c_str() + rhspos[rhscount] + 1,
-                                         rhs.d_storage.c_str() + rhspos[rhscount] + 1 + *(rhs.d_storage.c_str() + rhspos[rhscount]),
-                                         d_storage.c_str() + ourpos[ourcount] + 1,
-                                         d_storage.c_str() + ourpos[ourcount] + 1 + *(d_storage.c_str() + ourpos[ourcount]),
-                                         DNSNameCompare());
-    //    cout<<"Reverse: "<<res<<endl;
-    if(res)
-      return false;
+    int res = pdns_ilexicographical_compare_three_way(
+      std::string_view(
+        d_storage.c_str() + ourpos[ourcount] + 1,
+        *(d_storage.c_str() + ourpos[ourcount])),
+      std::string_view(
+        rhs.d_storage.c_str() + rhspos[rhscount] + 1,
+        *(rhs.d_storage.c_str() + rhspos[rhscount])));
+    if (res != 0) {
+      return res < 0;
+    }
   }
   return false;
 }
index 3c44a6c8dbd6bcbc7a0d52664ab39b37e9e180ba..934a757296a2147e8576326593f8f59ee7f5a7b5 100644 (file)
@@ -62,14 +62,6 @@ inline unsigned char dns_tolower(unsigned char chr)
 #include "burtle.hh"
 #include "views.hh"
 
-struct DNSNameCompare
-{
-  bool operator()(const unsigned char& lhs, const unsigned char& rhs) const
-  {
-    return dns_tolower(lhs) < dns_tolower(rhs);
-  }
-};
-
 /* Quest in life:
      accept escaped ascii presentations of DNS names and store them "natively"
      accept a DNS packet with an offset, and extract a DNS name from it
@@ -183,10 +175,17 @@ public:
 
   bool operator<(const DNSName& rhs)  const // this delivers _some_ kind of ordering, but not one useful in a DNS context. Really fast though.
   {
+    struct DNSNameCompare
+    {
+      bool operator()(const unsigned char& lhs, const unsigned char& rhs) const
+      {
+        return dns_tolower(lhs) < dns_tolower(rhs);
+      }
+    };
+
     // note that this is case insensitive, including on the label lengths
     return std::lexicographical_compare(d_storage.rbegin(), d_storage.rend(),
-                                rhs.d_storage.rbegin(), rhs.d_storage.rend(),
-                                DNSNameCompare());
+             rhs.d_storage.rbegin(), rhs.d_storage.rend(), DNSNameCompare());
   }
 
   bool canonCompare(const DNSName& rhs) const;