mgmt: optimize parsing of ControlParameters
Iterate over the sub-elements only once.
Change-Id: I9e1664be38ffc899a7835b556b30003f1661e694
diff --git a/ndn-cxx/mgmt/nfd/control-parameters.cpp b/ndn-cxx/mgmt/nfd/control-parameters.cpp
index 4e8c866..1783ce8 100644
--- a/ndn-cxx/mgmt/nfd/control-parameters.cpp
+++ b/ndn-cxx/mgmt/nfd/control-parameters.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2013-2023 Regents of the University of California.
+ * Copyright (c) 2013-2025 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -125,110 +125,84 @@
NDN_THROW(Error("ControlParameters", block.type()));
}
+ *this = {};
m_wire = block;
m_wire.parse();
- Block::element_const_iterator val;
- val = m_wire.find(tlv::Name);
- m_hasFields[CONTROL_PARAMETER_NAME] = val != m_wire.elements_end();
- if (this->hasName()) {
- m_name.wireDecode(*val);
- }
-
- val = m_wire.find(tlv::nfd::FaceId);
- m_hasFields[CONTROL_PARAMETER_FACE_ID] = val != m_wire.elements_end();
- if (this->hasFaceId()) {
- m_faceId = readNonNegativeInteger(*val);
- }
-
- val = m_wire.find(tlv::nfd::Uri);
- m_hasFields[CONTROL_PARAMETER_URI] = val != m_wire.elements_end();
- if (this->hasUri()) {
- m_uri = readString(*val);
- }
-
- val = m_wire.find(tlv::nfd::LocalUri);
- m_hasFields[CONTROL_PARAMETER_LOCAL_URI] = val != m_wire.elements_end();
- if (this->hasLocalUri()) {
- m_localUri = readString(*val);
- }
-
- val = m_wire.find(tlv::nfd::Origin);
- m_hasFields[CONTROL_PARAMETER_ORIGIN] = val != m_wire.elements_end();
- if (this->hasOrigin()) {
- m_origin = readNonNegativeIntegerAs<RouteOrigin>(*val);
- }
-
- val = m_wire.find(tlv::nfd::Cost);
- m_hasFields[CONTROL_PARAMETER_COST] = val != m_wire.elements_end();
- if (this->hasCost()) {
- m_cost = readNonNegativeInteger(*val);
- }
-
- val = m_wire.find(tlv::nfd::Capacity);
- m_hasFields[CONTROL_PARAMETER_CAPACITY] = val != m_wire.elements_end();
- if (this->hasCapacity()) {
- m_capacity = readNonNegativeInteger(*val);
- }
-
- val = m_wire.find(tlv::nfd::Count);
- m_hasFields[CONTROL_PARAMETER_COUNT] = val != m_wire.elements_end();
- if (this->hasCount()) {
- m_count = readNonNegativeInteger(*val);
- }
-
- val = m_wire.find(tlv::nfd::Flags);
- m_hasFields[CONTROL_PARAMETER_FLAGS] = val != m_wire.elements_end();
- if (this->hasFlags()) {
- m_flags = readNonNegativeInteger(*val);
- }
-
- val = m_wire.find(tlv::nfd::Mask);
- m_hasFields[CONTROL_PARAMETER_MASK] = val != m_wire.elements_end();
- if (this->hasMask()) {
- m_mask = readNonNegativeInteger(*val);
- }
-
- val = m_wire.find(tlv::nfd::Strategy);
- m_hasFields[CONTROL_PARAMETER_STRATEGY] = val != m_wire.elements_end();
- if (this->hasStrategy()) {
- val->parse();
- if (val->elements().empty()) {
- NDN_THROW(Error("Expecting Strategy/Name"));
+ for (const auto& e : m_wire.elements()) {
+ switch (e.type()) {
+ case tlv::Name:
+ m_hasFields[CONTROL_PARAMETER_NAME] = true;
+ m_name.wireDecode(e);
+ break;
+ case tlv::nfd::FaceId:
+ m_hasFields[CONTROL_PARAMETER_FACE_ID] = true;
+ m_faceId = readNonNegativeInteger(e);
+ break;
+ case tlv::nfd::Uri:
+ m_hasFields[CONTROL_PARAMETER_URI] = true;
+ m_uri = readString(e);
+ break;
+ case tlv::nfd::LocalUri:
+ m_hasFields[CONTROL_PARAMETER_LOCAL_URI] = true;
+ m_localUri = readString(e);
+ break;
+ case tlv::nfd::Origin:
+ m_hasFields[CONTROL_PARAMETER_ORIGIN] = true;
+ m_origin = readNonNegativeIntegerAs<RouteOrigin>(e);
+ break;
+ case tlv::nfd::Cost:
+ m_hasFields[CONTROL_PARAMETER_COST] = true;
+ m_cost = readNonNegativeInteger(e);
+ break;
+ case tlv::nfd::Capacity:
+ m_hasFields[CONTROL_PARAMETER_CAPACITY] = true;
+ m_capacity = readNonNegativeInteger(e);
+ break;
+ case tlv::nfd::Count:
+ m_hasFields[CONTROL_PARAMETER_COUNT] = true;
+ m_count = readNonNegativeInteger(e);
+ break;
+ case tlv::nfd::Flags:
+ m_hasFields[CONTROL_PARAMETER_FLAGS] = true;
+ m_flags = readNonNegativeInteger(e);
+ break;
+ case tlv::nfd::Mask:
+ m_hasFields[CONTROL_PARAMETER_MASK] = true;
+ m_mask = readNonNegativeInteger(e);
+ break;
+ case tlv::nfd::Strategy:
+ m_hasFields[CONTROL_PARAMETER_STRATEGY] = true;
+ e.parse();
+ if (e.elements().empty()) {
+ NDN_THROW(Error("Expecting Strategy.Name"));
+ }
+ m_strategy.wireDecode(e.elements().front());
+ break;
+ case tlv::nfd::ExpirationPeriod:
+ m_hasFields[CONTROL_PARAMETER_EXPIRATION_PERIOD] = true;
+ m_expirationPeriod = time::milliseconds(readNonNegativeInteger(e));
+ break;
+ case tlv::nfd::FacePersistency:
+ m_hasFields[CONTROL_PARAMETER_FACE_PERSISTENCY] = true;
+ m_facePersistency = readNonNegativeIntegerAs<FacePersistency>(e);
+ break;
+ case tlv::nfd::BaseCongestionMarkingInterval:
+ m_hasFields[CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL] = true;
+ m_baseCongestionMarkingInterval = time::nanoseconds(readNonNegativeInteger(e));
+ break;
+ case tlv::nfd::DefaultCongestionThreshold:
+ m_hasFields[CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD] = true;
+ m_defaultCongestionThreshold = readNonNegativeInteger(e);
+ break;
+ case tlv::nfd::Mtu:
+ m_hasFields[CONTROL_PARAMETER_MTU] = true;
+ m_mtu = readNonNegativeInteger(e);
+ break;
+ default:
+ // ignore unrecognized elements
+ break;
}
- else {
- m_strategy.wireDecode(*val->elements_begin());
- }
- }
-
- val = m_wire.find(tlv::nfd::ExpirationPeriod);
- m_hasFields[CONTROL_PARAMETER_EXPIRATION_PERIOD] = val != m_wire.elements_end();
- if (this->hasExpirationPeriod()) {
- m_expirationPeriod = time::milliseconds(readNonNegativeInteger(*val));
- }
-
- val = m_wire.find(tlv::nfd::FacePersistency);
- m_hasFields[CONTROL_PARAMETER_FACE_PERSISTENCY] = val != m_wire.elements_end();
- if (this->hasFacePersistency()) {
- m_facePersistency = readNonNegativeIntegerAs<FacePersistency>(*val);
- }
-
- val = m_wire.find(tlv::nfd::BaseCongestionMarkingInterval);
- m_hasFields[CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL] = val != m_wire.elements_end();
- if (this->hasBaseCongestionMarkingInterval()) {
- m_baseCongestionMarkingInterval = time::nanoseconds(readNonNegativeInteger(*val));
- }
-
- val = m_wire.find(tlv::nfd::DefaultCongestionThreshold);
- m_hasFields[CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD] = val != m_wire.elements_end();
- if (this->hasDefaultCongestionThreshold()) {
- m_defaultCongestionThreshold = readNonNegativeInteger(*val);
- }
-
- val = m_wire.find(tlv::nfd::Mtu);
- m_hasFields[CONTROL_PARAMETER_MTU] = val != m_wire.elements_end();
- if (this->hasMtu()) {
- m_mtu = readNonNegativeInteger(*val);
}
}