Commit 397245df authored by JINMEI Tatuya's avatar JINMEI Tatuya

changed the interface of AbstractRRset::getRdataIterator()

so that the internal cursor would point to the first RDATA
automatically.  This will be a more intuitive and less error prone
behavior.

also removed call to RdataIterator::first() that this change made unnecessary.


git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac410@3529 e5f2f494-b856-4b98-b285-d166d9295462
parent 6a35dc76
......@@ -131,7 +131,7 @@ host_lookup(const char* const name, const char* const type) {
}
RdataIteratorPtr rit = (*it)->getRdataIterator();
for (rit->first(); !rit->isLast(); rit->next()) {
for (; !rit->isLast(); rit->next()) {
// instead of using my name, maybe use returned label?
cout << name << " has address " <<
(*rit).getCurrent().toText() << endl;
......
......@@ -95,7 +95,7 @@ getAdditional(Query& q, ConstRRsetPtr rrset) {
}
RdataIteratorPtr it = rrset->getRdataIterator();
for (it->first(); !it->isLast(); it->next()) {
for (; !it->isLast(); it->next()) {
const Rdata& rd(it->getCurrent());
if (rrset->getType() == RRType::NS()) {
const generic::NS& ns = dynamic_cast<const generic::NS&>(rd);
......@@ -123,7 +123,6 @@ synthesizeCname(QueryTaskPtr task, RRsetPtr rrset, RRsetList& target) {
// More than one DNAME RR in the RRset is illegal, so we only have
// to process the first one.
it->first();
if (it->isLast()) {
return;
}
......@@ -152,7 +151,6 @@ chaseCname(Query& q, QueryTaskPtr task, RRsetPtr rrset) {
// More than one CNAME RR in the RRset is illegal, so we only have
// to process the first one.
it->first();
if (it->isLast()) {
return;
}
......@@ -660,7 +658,6 @@ getNsec3Param(Query& q, ZoneInfo& zoneinfo) {
// XXX: currently only one NSEC3 chain per zone is supported;
// we will need to revisit this.
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
if (it->isLast()) {
return (ConstNsec3ParamPtr());
}
......
......@@ -124,7 +124,6 @@ DataSrcTest::QueryCommon(const RRClass& qclass) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -138,7 +137,6 @@ DataSrcTest::QueryCommon(const RRClass& qclass) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -154,7 +152,6 @@ DataSrcTest::QueryCommon(const RRClass& qclass) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -193,7 +190,6 @@ TEST_F(DataSrcTest, NSQuery) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -216,7 +212,6 @@ TEST_F(DataSrcTest, DuplicateQuery) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -237,7 +232,6 @@ TEST_F(DataSrcTest, DuplicateQuery) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -334,7 +328,6 @@ TEST_F(DataSrcTest, Wildcard) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -353,7 +346,6 @@ TEST_F(DataSrcTest, Wildcard) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -369,7 +361,6 @@ TEST_F(DataSrcTest, Wildcard) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -406,7 +397,6 @@ TEST_F(DataSrcTest, WildcardCname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -419,7 +409,6 @@ TEST_F(DataSrcTest, WildcardCname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -438,7 +427,6 @@ TEST_F(DataSrcTest, WildcardCname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -454,7 +442,6 @@ TEST_F(DataSrcTest, WildcardCname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -474,7 +461,6 @@ TEST_F(DataSrcTest, WildcardCnameNodata) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -506,7 +492,6 @@ TEST_F(DataSrcTest, WildcardCnameNxdomain) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("spork.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -544,7 +529,6 @@ TEST_F(DataSrcTest, AuthDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -556,7 +540,6 @@ TEST_F(DataSrcTest, AuthDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -572,7 +555,6 @@ TEST_F(DataSrcTest, AuthDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -591,7 +573,6 @@ TEST_F(DataSrcTest, Dname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("sql1.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -605,7 +586,6 @@ TEST_F(DataSrcTest, Dname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -621,7 +601,6 @@ TEST_F(DataSrcTest, Dname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -649,7 +628,6 @@ TEST_F(DataSrcTest, Cname) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("cnametest.flame.org.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -668,7 +646,6 @@ TEST_F(DataSrcTest, CnameInt) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("www.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -695,7 +672,6 @@ TEST_F(DataSrcTest, CnameExt) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("www.sql1.example.com.", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -720,7 +696,6 @@ TEST_F(DataSrcTest, Delegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
......@@ -732,7 +707,6 @@ TEST_F(DataSrcTest, Delegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -751,7 +725,6 @@ TEST_F(DataSrcTest, NSDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
......@@ -763,7 +736,6 @@ TEST_F(DataSrcTest, NSDelegation) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -795,7 +767,6 @@ TEST_F(DataSrcTest, NSECZonecut) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -817,7 +788,6 @@ TEST_F(DataSrcTest, DNAMEZonecut) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("ns1.subzone.example.com.", it->getCurrent().toText());
it->next();
EXPECT_FALSE(it->isLast());
......@@ -829,7 +799,6 @@ TEST_F(DataSrcTest, DNAMEZonecut) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_TRUE(it->isLast());
......@@ -854,7 +823,6 @@ TEST_F(DataSrcTest, DS) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("dns01.example.com.", it->getCurrent().toText());
it->next();
EXPECT_EQ("dns02.example.com.", it->getCurrent().toText());
......@@ -890,7 +858,6 @@ TEST_F(DataSrcTest, NSECZonecutOfNonsecureZone) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ(createRdata(RRType::NS(), RRClass::IN(),
"ns.sub.example.org.")->toText(),
it->getCurrent().toText());
......@@ -904,7 +871,6 @@ TEST_F(DataSrcTest, NSECZonecutOfNonsecureZone) {
EXPECT_EQ(RRClass::IN(), rrset->getClass());
it = rrset->getRdataIterator();
it->first();
EXPECT_EQ(createRdata(RRType::A(), RRClass::IN(), "192.0.2.101")->toText(),
it->getCurrent().toText());
it->next();
......
......@@ -244,7 +244,6 @@ checkRRset(RRsetPtr rrset, const Name& expected_name,
EXPECT_EQ(expected_rrttl, rrset->getTTL());
RdataIteratorPtr rdata_iterator = rrset->getRdataIterator();
rdata_iterator->first();
vector<string>::const_iterator data_it = expected_data.begin();
for (; data_it != expected_data.end(); ++data_it) {
EXPECT_FALSE(rdata_iterator->isLast());
......
......@@ -109,7 +109,6 @@ checkRRset(ConstRRsetPtr rrset, const Name& expected_name,
EXPECT_EQ(rrttl, rrset->getTTL());
RdataIteratorPtr rdata_iterator = rrset->getRdataIterator();
rdata_iterator->first();
vector<string>::const_iterator data_it = expected_data.begin();
for (; data_it != expected_data.end(); ++data_it) {
EXPECT_FALSE(rdata_iterator->isLast());
......
......@@ -408,7 +408,7 @@ copyRRset(RRsetPtr const source) {
RRsetPtr rrset = RRsetPtr(new RRset(source->getName(), source->getClass(),
source->getType(), source->getTTL()));
RdataIteratorPtr it = source->getRdataIterator();
for (it->first(); !it->isLast(); it->next()) {
for (; !it->isLast(); it->next()) {
rrset->addRdata(it->getCurrent());
}
if (source->getRRsig()) {
......
......@@ -355,7 +355,7 @@ RRset_getRdata(s_RRset* self) {
RdataIteratorPtr it = self->rrset->getRdataIterator();
for (it->first(); !it->isLast(); it->next()) {
for (; !it->isLast(); it->next()) {
s_Rdata *rds = static_cast<s_Rdata*>(rdata_type.tp_alloc(&rdata_type, 0));
if (rds != NULL) {
// hmz them iterators/shared_ptrs and private constructors
......
......@@ -44,7 +44,6 @@ AbstractRRset::toText() const {
string s;
RdataIteratorPtr it = getRdataIterator();
it->first();
if (it->isLast()) {
isc_throw(EmptyRRset, "ToText() is attempted for an empty RRset");
}
......@@ -66,7 +65,6 @@ rrsetToWire(const AbstractRRset& rrset, T& output, const size_t limit) {
unsigned int n = 0;
RdataIteratorPtr it = rrset.getRdataIterator();
it->first();
if (it->isLast()) {
isc_throw(EmptyRRset, "ToWire() is attempted for an empty RRset");
}
......@@ -224,7 +222,8 @@ private:
BasicRdataIterator() {}
public:
BasicRdataIterator(const std::vector<rdata::ConstRdataPtr>& datavector) :
datavector_(&datavector) {}
datavector_(&datavector), it_(datavector_->begin())
{}
~BasicRdataIterator() {}
virtual void first() { it_ = datavector_->begin(); }
virtual void next() { ++it_; }
......
......@@ -148,7 +148,7 @@ typedef boost::shared_ptr<RdataIterator> RdataIteratorPtr;
/// "sort" and "search(find)" method?
/// - what about comparing two RRsets of the same type? If we need this,
/// should it compare rdata's as a set or as a list (i.e. compare
/// each %rdata one by one or as a whole)? c.f. NLnet Labs' ldns
/// each rdata one by one or as a whole)? c.f. NLnet Labs' ldns
/// (http://www.nlnetlabs.nl/projects/ldns/doc/index.html)
/// has \c ldns_rr_list_compare(), which takes the latter approach
/// (seemingly assuming the caller sorts the lists beforehand).
......@@ -357,7 +357,7 @@ public:
/// \endcode
///
/// This method is more strictly typed than the pointer version:
/// If \c %rdata does not refer to the appropriate derived
/// If \c rdata does not refer to the appropriate derived
/// \c Rdata class
/// for the \c RRType for this \c RRset, it throws an exception of class
/// \c std::bad_cast.
......@@ -385,6 +385,10 @@ public:
/// \brief Return an iterator to go through all RDATA stored in the
/// \c RRset.
///
/// The rdata cursor of the returned iterator will point to the first
/// RDATA, that is, it effectively calls \c RdataIterator::first()
/// internally.
///
/// Using the design pattern terminology, \c getRdataIterator()
/// is an example of a <em>factory method</em>.
///
......@@ -417,10 +421,10 @@ public:
/// The RDATA objects stored in the \c RRset are considered to form
/// a unidirectional list from the \c RdataIterator point of view (while
/// the actual implementation in the derived \c RRset may not use a list).
/// We call this unidirectional list the <em>%rdata list</em>.
/// We call this unidirectional list the <em>rdata list</em>.
///
/// An \c RdataIterator object internally (and conceptually) holds a
/// <em>%rdata cursor</em>, which points to a specific item of the %rdata list.
/// <em>rdata cursor</em>, which points to a specific item of the rdata list.
///
/// Note about design choice: as is clear from the interface, \c RdataIterator
/// is not compatible with the standard iterator classes.
......@@ -458,29 +462,29 @@ private:
//@}
public:
/// \brief Move the %rdata cursor to the first RDATA in the %rdata list
/// \brief Move the rdata cursor to the first RDATA in the rdata list
/// (if any).
///
/// This method can safely be called multiple times, even after moving
/// the %rdata cursor forward by the \c next() method.
/// the rdata cursor forward by the \c next() method.
///
/// This method should never throw an exception.
virtual void first() = 0;
/// \brief Move the %rdata cursor to the next RDATA in the %rdata list
/// \brief Move the rdata cursor to the next RDATA in the rdata list
/// (if any).
///
/// This method should never throw an exception.
virtual void next() = 0;
/// \brief Return the current \c Rdata corresponding to the %rdata cursor.
/// \brief Return the current \c Rdata corresponding to the rdata cursor.
///
/// \return A reference to an \c rdata::::Rdata object corresponding
/// to the %rdata cursor.
/// to the rdata cursor.
virtual const rdata::Rdata& getCurrent() const = 0;
/// \brief Return true iff the %rdata cursor has reached the end of the
/// %rdata list.
/// \brief Return true iff the rdata cursor has reached the end of the
/// rdata list.
///
/// Once this method returns \c true, the behavior of any subsequent
/// call to \c next() or \c getCurrent() is undefined.
......@@ -489,8 +493,8 @@ public:
///
/// This method should never throw an exception.
///
/// \return \c true if the %rdata cursor has reached the end of the
/// %rdata list; otherwise \c false.
/// \return \c true if the rdata cursor has reached the end of the
/// rdata list; otherwise \c false.
virtual bool isLast() const = 0;
};
......
......@@ -293,7 +293,6 @@ TEST_F(MessageTest, fromWire) {
// TTL should be 3600, even though that of the 2nd RR is 7200
EXPECT_EQ(RRTTL(3600), rrset->getTTL());
RdataIteratorPtr it = rrset->getRdataIterator();
it->first();
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
it->next();
EXPECT_EQ("192.0.2.2", it->getCurrent().toText());
......
......@@ -117,8 +117,7 @@ void
addRdataTestCommon(const RRset& rrset) {
EXPECT_EQ(2, rrset.getRdataCount());
RdataIteratorPtr it = rrset.getRdataIterator();
it->first();
RdataIteratorPtr it = rrset.getRdataIterator(); // cursor is set to the 1st
EXPECT_FALSE(it->isLast());
EXPECT_EQ(0, it->getCurrent().compare(in::A("192.0.2.1")));
it->next();
......@@ -156,7 +155,6 @@ TEST_F(RRsetTest, addRdataPtr) {
TEST_F(RRsetTest, iterator) {
// Iterator for an empty RRset.
RdataIteratorPtr it = rrset_a_empty.getRdataIterator();
it->first();
EXPECT_TRUE(it->isLast());
// Normal case (already tested, but do it again just in case)
......
......@@ -150,7 +150,6 @@ TEST_F(RRsetListTest, checkData) {
RdataIteratorPtr it =
list.findRRset(RRType::A(), RRClass::IN())->getRdataIterator();
it->first();
EXPECT_FALSE(it->isLast());
EXPECT_EQ("192.0.2.1", it->getCurrent().toText());
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment