BIND 10 trac2432, updated. 98d515d5e653a75762b5da424555ac301e7f9af5 [2432] Add a RRsetCollection constructor that takes an std::istream
BIND 10 source code commits
bind10-changes at lists.isc.org
Tue Jan 1 11:27:32 UTC 2013
The branch, trac2432 has been updated
via 98d515d5e653a75762b5da424555ac301e7f9af5 (commit)
via 4a15ebc6f38bf2b2fe66a069a58f22f89e8ec6fc (commit)
from 8f149bd04986ba2542e86c7ce77e5d0e92df16ea (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 98d515d5e653a75762b5da424555ac301e7f9af5
Author: Mukund Sivaraman <muks at isc.org>
Date: Tue Jan 1 16:45:54 2013 +0530
[2432] Add a RRsetCollection constructor that takes an std::istream
commit 4a15ebc6f38bf2b2fe66a069a58f22f89e8ec6fc
Author: Mukund Sivaraman <muks at isc.org>
Date: Tue Jan 1 16:44:55 2013 +0530
[2432] Add more API documentation
-----------------------------------------------------------------------
Summary of changes:
src/lib/dns/rrset_collection.cc | 13 +++++++++++
src/lib/dns/rrset_collection.h | 15 +++++++++++++
src/lib/dns/rrset_collection_base.h | 28 ++++++++++++++++++++++++
src/lib/dns/tests/rrset_collection_unittest.cc | 16 ++++++++++++++
4 files changed, 72 insertions(+)
-----------------------------------------------------------------------
diff --git a/src/lib/dns/rrset_collection.cc b/src/lib/dns/rrset_collection.cc
index 69e1cf4..53f9702 100644
--- a/src/lib/dns/rrset_collection.cc
+++ b/src/lib/dns/rrset_collection.cc
@@ -68,6 +68,19 @@ RRsetCollection::RRsetCollection(const char* filename, const Name& origin,
loader.load();
}
+RRsetCollection::RRsetCollection(std::istream& input_stream, const Name& origin,
+ const RRClass& rrclass)
+{
+ MasterLoaderCallbacks callbacks
+ (boost::bind(&RRsetCollection::loaderCallback, this, _1, _2, _3),
+ boost::bind(&RRsetCollection::loaderCallback, this, _1, _2, _3));
+ MasterLoader loader(input_stream, origin, rrclass, callbacks,
+ boost::bind(&RRsetCollection::addRRset,
+ this, _1, _2, _3, _4, _5),
+ MasterLoader::DEFAULT);
+ loader.load();
+}
+
const AbstractRRset*
RRsetCollection::find(const Name& name, const RRType& rrtype,
const RRClass& rrclass) const {
diff --git a/src/lib/dns/rrset_collection.h b/src/lib/dns/rrset_collection.h
index 540ef55..dfa4dd7 100644
--- a/src/lib/dns/rrset_collection.h
+++ b/src/lib/dns/rrset_collection.h
@@ -43,9 +43,24 @@ public:
///
/// \param filename Name of a file containing a collection of RRs in
/// the master file format (which may or may not form a valid zone).
+ /// \param origin The zone origin.
+ /// \param rrclass The zone class.
RRsetCollection(const char* filename, const isc::dns::Name& origin,
const isc::dns::RRClass& rrclass);
+ /// \brief Constructor.
+ ///
+ /// This constructor is similar to the previous one, but instead of
+ /// taking a filename to load a zone from, it takes an input
+ /// stream. The constructor throws MasterLoaderError if there is an
+ /// error during loading.
+ ///
+ /// \param input_stream The input stream to load from.
+ /// \param origin The zone origin.
+ /// \param rrclass The zone class.
+ RRsetCollection(std::istream& input_stream, const isc::dns::Name& origin,
+ const isc::dns::RRClass& rrclass);
+
/// \brief Destructor
virtual ~RRsetCollection() {}
diff --git a/src/lib/dns/rrset_collection_base.h b/src/lib/dns/rrset_collection_base.h
index ead169d..eae7f6d 100644
--- a/src/lib/dns/rrset_collection_base.h
+++ b/src/lib/dns/rrset_collection_base.h
@@ -58,11 +58,26 @@ public:
protected:
class Iter; // forward declaration
+
+ /// \brief Wraps Iter with a reference count.
typedef boost::shared_ptr<Iter> IterPtr;
+ /// \brief A helper iterator interface for \c RRsetCollectionBase.
+ ///
+ /// This is a protected iterator class that is a helper interface
+ /// used by the public iterator. Derived classes of
+ /// \c RRsetCollectionBase are supposed to implement this class and
+ /// the \c getBeginning() and \c getEnd() methods, so that the
+ /// public interator interface can be provided. This is a forward
+ /// iterator only.
class Iter {
public:
+ /// \brief Returns the \c AbstractRRset currently pointed to by
+ /// the iterator.
virtual const isc::dns::AbstractRRset& getValue() = 0;
+
+ /// \brief Returns an \c IterPtr wrapping an Iter pointing to
+ /// the next \c AbstractRRset in sequence in the collection.
virtual IterPtr getNext() = 0;
/// \brief Check if another iterator is equal to this one.
@@ -77,10 +92,19 @@ protected:
virtual bool equals(Iter& other) = 0;
};
+ /// \brief Returns an \c IterPtr wrapping an Iter pointing to the
+ /// beginning of the collection.
virtual IterPtr getBeginning() = 0;
+
+ /// \brief Returns an \c IterPtr wrapping an Iter pointing past the
+ /// end of the collection.
virtual IterPtr getEnd() = 0;
public:
+ /// \brief A forward \c std::iterator for \c RRsetCollectionBase.
+ ///
+ /// It behaves like a \c std::iterator forward iterator, so please
+ /// see its documentation for usage.
class iterator : std::iterator<std::forward_iterator_tag,
const isc::dns::AbstractRRset>
{
@@ -116,10 +140,14 @@ public:
IterPtr iter_;
};
+ /// \brief Returns an iterator pointing to the beginning of the
+ /// collection.
iterator begin() {
return iterator(getBeginning());
}
+ /// \brief Returns an iterator pointing past the end of the
+ /// collection.
iterator end() {
return iterator(getEnd());
}
diff --git a/src/lib/dns/tests/rrset_collection_unittest.cc b/src/lib/dns/tests/rrset_collection_unittest.cc
index 5452189..7d1b6f6 100644
--- a/src/lib/dns/tests/rrset_collection_unittest.cc
+++ b/src/lib/dns/tests/rrset_collection_unittest.cc
@@ -19,6 +19,7 @@
#include <gtest/gtest.h>
#include <list>
+#include <fstream>
using namespace isc::dns;
using namespace isc::dns::rdata;
@@ -39,6 +40,21 @@ public:
RRsetCollection collection;
};
+TEST_F(RRsetCollectionTest, istreamConstructor) {
+ std::ifstream fs(TEST_DATA_SRCDIR "/example.org");
+ RRsetCollection collection2(fs, origin, rrclass);
+
+ RRsetCollectionBase::iterator iter = collection.begin();
+ RRsetCollectionBase::iterator iter2 = collection2.begin();
+ while (iter != collection.end()) {
+ EXPECT_TRUE(iter2 != collection2.end());
+ EXPECT_EQ((*iter).toText(), (*iter2).toText());
+ ++iter;
+ ++iter2;
+ }
+ EXPECT_TRUE(iter2 == collection2.end());
+}
+
TEST_F(RRsetCollectionTest, findBase) {
// Test the find() that returns isc::dns::AbstractRRset*
const AbstractRRset* rrset = collection.find(Name("www.example.org"),
More information about the bind10-changes
mailing list