summaryrefslogtreecommitdiff
path: root/src/mongo/db/matcher/matchable.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/matcher/matchable.h')
-rw-r--r--src/mongo/db/matcher/matchable.h116
1 files changed, 59 insertions, 57 deletions
diff --git a/src/mongo/db/matcher/matchable.h b/src/mongo/db/matcher/matchable.h
index a3506005901..66d1a417af0 100644
--- a/src/mongo/db/matcher/matchable.h
+++ b/src/mongo/db/matcher/matchable.h
@@ -36,70 +36,72 @@
namespace mongo {
- class MatchableDocument {
- public:
- // Inlining to allow subclasses to see that this is a no-op and avoid a function call.
- // Speeds up query execution measurably.
- virtual ~MatchableDocument() {}
-
- virtual BSONObj toBSON() const = 0;
-
- /**
- * The neewly returned ElementIterator is allowed to keep a pointer to path.
- * So the caller of this function should make sure path is in scope until
- * the ElementIterator is deallocated
- */
- virtual ElementIterator* allocateIterator( const ElementPath* path ) const = 0;
-
- virtual void releaseIterator( ElementIterator* iterator ) const = 0;
-
- class IteratorHolder {
- public:
- IteratorHolder( const MatchableDocument* doc, const ElementPath* path ) {
- _doc = doc;
- _iterator = _doc->allocateIterator( path );
- }
-
- ~IteratorHolder() {
- _doc->releaseIterator( _iterator );
- }
-
- ElementIterator* operator->() const {
- return _iterator;
- }
- private:
- const MatchableDocument* _doc;
- ElementIterator* _iterator;
- };
- };
+class MatchableDocument {
+public:
+ // Inlining to allow subclasses to see that this is a no-op and avoid a function call.
+ // Speeds up query execution measurably.
+ virtual ~MatchableDocument() {}
- class BSONMatchableDocument : public MatchableDocument {
- public:
- BSONMatchableDocument( const BSONObj& obj );
- virtual ~BSONMatchableDocument();
+ virtual BSONObj toBSON() const = 0;
- virtual BSONObj toBSON() const { return _obj; }
+ /**
+ * The neewly returned ElementIterator is allowed to keep a pointer to path.
+ * So the caller of this function should make sure path is in scope until
+ * the ElementIterator is deallocated
+ */
+ virtual ElementIterator* allocateIterator(const ElementPath* path) const = 0;
- virtual ElementIterator* allocateIterator( const ElementPath* path ) const {
- if ( _iteratorUsed )
- return new BSONElementIterator( path, _obj );
- _iteratorUsed = true;
- _iterator.reset( path, _obj );
- return &_iterator;
+ virtual void releaseIterator(ElementIterator* iterator) const = 0;
+
+ class IteratorHolder {
+ public:
+ IteratorHolder(const MatchableDocument* doc, const ElementPath* path) {
+ _doc = doc;
+ _iterator = _doc->allocateIterator(path);
}
- virtual void releaseIterator( ElementIterator* iterator ) const {
- if ( iterator == &_iterator ) {
- _iteratorUsed = false;
- }
- else {
- delete iterator;
- }
+ ~IteratorHolder() {
+ _doc->releaseIterator(_iterator);
+ }
+
+ ElementIterator* operator->() const {
+ return _iterator;
}
private:
- BSONObj _obj;
- mutable BSONElementIterator _iterator;
- mutable bool _iteratorUsed;
+ const MatchableDocument* _doc;
+ ElementIterator* _iterator;
};
+};
+
+class BSONMatchableDocument : public MatchableDocument {
+public:
+ BSONMatchableDocument(const BSONObj& obj);
+ virtual ~BSONMatchableDocument();
+
+ virtual BSONObj toBSON() const {
+ return _obj;
+ }
+
+ virtual ElementIterator* allocateIterator(const ElementPath* path) const {
+ if (_iteratorUsed)
+ return new BSONElementIterator(path, _obj);
+ _iteratorUsed = true;
+ _iterator.reset(path, _obj);
+ return &_iterator;
+ }
+
+ virtual void releaseIterator(ElementIterator* iterator) const {
+ if (iterator == &_iterator) {
+ _iteratorUsed = false;
+ } else {
+ delete iterator;
+ }
+ }
+
+private:
+ BSONObj _obj;
+ mutable BSONElementIterator _iterator;
+ mutable bool _iteratorUsed;
+};
}