class NSECBitmap
{
public:
+ NSECBitmap(): d_bitset(nullptr)
+ {
+ }
+ NSECBitmap(const NSECBitmap& rhs): d_set(rhs.d_set)
+ {
+ if (rhs.d_bitset) {
+ d_bitset = std::unique_ptr<std::bitset<nbTypes>>(new std::bitset<nbTypes>(*(rhs.d_bitset)));
+ }
+ }
+ NSECBitmap& operator=(const NSECBitmap& rhs)
+ {
+ d_set = rhs.d_set;
+
+ if (rhs.d_bitset) {
+ d_bitset = std::unique_ptr<std::bitset<nbTypes>>(new std::bitset<nbTypes>(*(rhs.d_bitset)));
+ }
+
+ return *this;
+ }
+ NSECBitmap(NSECBitmap&& rhs): d_bitset(std::move(rhs.d_bitset)), d_set(std::move(rhs.d_set))
+ {
+ }
bool isSet(uint16_t type) const
{
if (d_bitset) {
{
d_bitmap.set(type);
}
+ void set(const NSECBitmap& bitmap)
+ {
+ d_bitmap = bitmap;
+ }
size_t numberOfTypesSet() const
{
return d_bitmap.count();
{
d_bitmap.set(type);
}
+ void set(const NSECBitmap& bitmap)
+ {
+ d_bitmap = bitmap;
+ }
size_t numberOfTypesSet() const
{
return d_bitmap.count();
namespace {
struct NSECXEntry
{
- set<uint16_t> d_set;
+ NSECBitmap d_set;
unsigned int d_ttl;
bool d_auth;
};
DNSName keyname = NSEC3Zone ? DNSName(toBase32Hex(hashQNameWithSalt(ns3pr, zrr.dr.d_name))) : zrr.dr.d_name;
NSECXEntry& ne = nsecxrepo[keyname];
- ne.d_set.insert(zrr.dr.d_type);
+ ne.d_set.set(zrr.dr.d_type);
ne.d_ttl = sd.default_ttl;
csp.submit(zrr);
DNSName keyname = DNSName(toBase32Hex(hashQNameWithSalt(ns3pr, zrr.dr.d_name)));
NSECXEntry& ne = nsecxrepo[keyname];
- ne.d_set.insert(zrr.dr.d_type);
+ ne.d_set.set(zrr.dr.d_type);
csp.submit(zrr);
}
ne.d_ttl = sd.default_ttl;
ne.d_auth = (ne.d_auth || loopZRR.auth || (NSEC3Zone && (!ns3pr.d_flags)));
if (loopZRR.dr.d_type && loopZRR.dr.d_type != QType::RRSIG) {
- ne.d_set.insert(loopZRR.dr.d_type);
+ ne.d_set.set(loopZRR.dr.d_type);
}
}
}
for(nsecxrepo_t::const_iterator iter = nsecxrepo.begin(); iter != nsecxrepo.end(); ++iter) {
if(iter->second.d_auth) {
NSEC3RecordContent n3rc;
- for (const auto type : iter->second.d_set) {
- n3rc.set(type);
- }
+ n3rc.set(iter->second.d_set);
const auto numberOfTypesSet = n3rc.numberOfTypesSet();
if (numberOfTypesSet != 0 && (numberOfTypesSet != 1 || !n3rc.isSet(QType::NS))) {
n3rc.set(QType::RRSIG);
}
else for(nsecxrepo_t::const_iterator iter = nsecxrepo.begin(); iter != nsecxrepo.end(); ++iter) {
NSECRecordContent nrc;
- for (const auto type : iter->second.d_set) {
- nrc.set(type);
- }
+ nrc.set(iter->second.d_set);
nrc.set(QType::RRSIG);
nrc.set(QType::NSEC);