return std::lexicographical_compare(ours.rbegin(), ours.rend(), rhsLabels.rbegin(), rhsLabels.rend(), CIStringCompare());
}
+bool DNSName::canonCompare(const DNSName& rhs) const
+{
+ // 01234567890abcd
+ // us: 1a3www4ds9a2nl
+ // rhs: 3www6online3com
+ // to compare, we start at the back, is nl < com? no -> done
+ //
+ // 0,2,6,a
+ // 0,4,a
+
+ uint8_t ourpos[64], rhspos[64];
+ uint8_t ourcount=0, rhscount=0;
+ //cout<<"Asked to compare "<<toString()<<" to "<<rhs.toString()<<endl;
+ for(const unsigned char* p = (const unsigned char*)d_storage.c_str(); p < (const unsigned char*)d_storage.c_str() + d_storage.size() && *p && ourcount < sizeof(ourpos); p+=*p+1)
+ ourpos[ourcount++]=(p-(const unsigned char*)d_storage.c_str());
+ for(const unsigned char* p = (const unsigned char*)rhs.d_storage.c_str(); p < (const unsigned char*)rhs.d_storage.c_str() + rhs.d_storage.size() && *p && rhscount < sizeof(rhspos); p+=*p+1)
+ rhspos[rhscount++]=(p-(const unsigned char*)rhs.d_storage.c_str());
+
+ if(ourcount == sizeof(ourpos) || rhscount==sizeof(rhspos)) {
+ return slowCanonCompare(rhs);
+ }
+
+ for(;;) {
+ if(ourcount == 0 && rhscount != 0)
+ return true;
+ if(rhscount == 0)
+ return false;
+ 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;
+ }
+ return false;
+}
+
+
vector<std::string> DNSName::getRawLabels() const
{
vector<std::string> ret;
DNSNameCompare());
}
- inline bool canonCompare(const DNSName& rhs) const;
+ bool canonCompare(const DNSName& rhs) const;
bool slowCanonCompare(const DNSName& rhs) const;
typedef boost::container::string string_t;
size_t hash_value(DNSName const& d);
-inline bool DNSName::canonCompare(const DNSName& rhs) const
-{
- // 01234567890abcd
- // us: 1a3www4ds9a2nl
- // rhs: 3www6online3com
- // to compare, we start at the back, is nl < com? no -> done
- //
- // 0,2,6,a
- // 0,4,a
-
- uint8_t ourpos[64], rhspos[64];
- uint8_t ourcount=0, rhscount=0;
- //cout<<"Asked to compare "<<toString()<<" to "<<rhs.toString()<<endl;
- for(const unsigned char* p = (const unsigned char*)d_storage.c_str(); p < (const unsigned char*)d_storage.c_str() + d_storage.size() && *p && ourcount < sizeof(ourpos); p+=*p+1)
- ourpos[ourcount++]=(p-(const unsigned char*)d_storage.c_str());
- for(const unsigned char* p = (const unsigned char*)rhs.d_storage.c_str(); p < (const unsigned char*)rhs.d_storage.c_str() + rhs.d_storage.size() && *p && rhscount < sizeof(rhspos); p+=*p+1)
- rhspos[rhscount++]=(p-(const unsigned char*)rhs.d_storage.c_str());
-
- if(ourcount == sizeof(ourpos) || rhscount==sizeof(rhspos)) {
- return slowCanonCompare(rhs);
- }
-
- for(;;) {
- if(ourcount == 0 && rhscount != 0)
- return true;
- if(rhscount == 0)
- return false;
- 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;
- }
- return false;
-}
-
-
struct CanonDNSNameCompare
{
bool operator()(const DNSName&a, const DNSName& b) const