++order;
}
// cout<<"Adding for netmask "<<formask.toString()<<" the order instruction that "<<valmask.toString()<<" is order "<<order<<endl;
- d_sortlist[formask].d_orders[valmask]=order;
+ d_sortlist.insert(formask).second.d_orders.insert(valmask).second=order;
}
-std::unique_ptr<SortListOrderCmp> SortList::getOrderCmp(const ComboAddress& who)
+std::unique_ptr<SortListOrderCmp> SortList::getOrderCmp(const ComboAddress& who) const
{
if(!d_sortlist.match(who)) {
return std::unique_ptr<SortListOrderCmp>();
return make_unique<SortListOrderCmp>(fnd->second);
}
-bool SortListOrderCmp::operator()(const ComboAddress& a, const ComboAddress& b) const
-{
- int aOrder=std::numeric_limits<int>::max();
- int bOrder=aOrder;
-
- if(d_slo.d_orders.match(a))
- aOrder = d_slo.d_orders[a];
- if(d_slo.d_orders.match(b))
- bOrder = d_slo.d_orders[b];
-
- return aOrder < bOrder;
-}
-
-static ComboAddress getAddr(const DNSRecord& dr)
-{
- if(auto addr=getRR<ARecordContent>(dr)) {
- return addr->getCA();
- }
- else
- return getRR<AAAARecordContent>(dr)->getCA();
-}
+// call this with **stable_sort**
bool SortListOrderCmp::operator()(const DNSRecord& ar, const DNSRecord& br) const
{
- if(ar.d_type < br.d_type)
+ bool aAddr = (ar.d_type == QType::A || ar.d_type == QType::AAAA);
+ bool bAddr = (br.d_type == QType::A || br.d_type == QType::AAAA);
+
+ // anything address related is always 'larger', rest is equal
+
+ if(aAddr && !bAddr)
+ return false;
+ else if(!aAddr && bAddr)
return true;
- if(ar.d_type > br.d_type)
+ else if(!aAddr && !bAddr)
return false;
-
- if(ar.d_type != QType::A && ar.d_type != QType::AAAA)
- return false; // all other types are equal among themselves
+
int aOrder=std::numeric_limits<int>::max();
int bOrder=aOrder;