From 820fd91f838d98e73bf53043a4a4523bd611fc96 Mon Sep 17 00:00:00 2001
From: Fons Rademakers <Fons.Rademakers@cern.ch>
Date: Thu, 24 Apr 2008 16:23:42 +0000
Subject: [PATCH] iterator of TOrdCollection objects can be now used with
 std::for_each, std::find_if, std::count_if and the like.

git-svn-id: http://root.cern.ch/svn/root/trunk@23531 27541ba8-7e3a-0410-8455-c3a389f83636
---
 core/cont/inc/TOrdCollection.h   | 10 +++++++++-
 core/cont/src/TOrdCollection.cxx | 13 ++++++++-----
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/core/cont/inc/TOrdCollection.h b/core/cont/inc/TOrdCollection.h
index 405da79b6f1..b99b90d2edd 100644
--- a/core/cont/inc/TOrdCollection.h
+++ b/core/cont/inc/TOrdCollection.h
@@ -25,6 +25,9 @@
 #include "TSeqCollection.h"
 #endif
 
+#include <iterator>
+
+
 class TOrdCollectionIter;
 
 
@@ -52,6 +55,8 @@ private:
 public:
    enum { kDefaultCapacity = 1, kMinExpand = 8, kShrinkFactor = 2 };
 
+   typedef TOrdCollectionIter Iterator_t;
+
    TOrdCollection(Int_t capacity = kDefaultCapacity);
    ~TOrdCollection();
    void          Clear(Option_t *option="");
@@ -90,7 +95,10 @@ public:
 //                                                                      //
 //////////////////////////////////////////////////////////////////////////
 
-class TOrdCollectionIter : public TIterator {
+class TOrdCollectionIter : public TIterator,
+                           public std::iterator<std::bidirectional_iterator_tag,
+                                                TObject*, std::ptrdiff_t,
+                                                const TObject**, const TObject*&> {
 
 private:
    const TOrdCollection  *fCol;       //collection being iterated
diff --git a/core/cont/src/TOrdCollection.cxx b/core/cont/src/TOrdCollection.cxx
index 3b67a4c46fd..5fa6fc00d4c 100644
--- a/core/cont/src/TOrdCollection.cxx
+++ b/core/cont/src/TOrdCollection.cxx
@@ -459,13 +459,11 @@ Int_t TOrdCollection::BinarySearch(TObject *obj)
 ClassImp(TOrdCollectionIter)
 
 //______________________________________________________________________________
-TOrdCollectionIter::TOrdCollectionIter(const TOrdCollection *col, Bool_t dir)
+TOrdCollectionIter::TOrdCollectionIter(const TOrdCollection *col, Bool_t dir): fCol(col), fDirection(dir)
 {
    // Create collection iterator. By default the iteration direction
    // is kIterForward. To go backward use kIterBackward.
 
-   fCol = col;
-   fDirection = dir;
    Reset();
 }
 
@@ -477,6 +475,7 @@ TOrdCollectionIter::TOrdCollectionIter(const TOrdCollectionIter &iter) : TIterat
    fCol       = iter.fCol;
    fDirection = iter.fDirection;
    fCursor    = iter.fCursor;
+   fCurCursor = iter.fCurCursor;
 }
 
 //______________________________________________________________________________
@@ -489,6 +488,7 @@ TIterator &TOrdCollectionIter::operator=(const TIterator &rhs)
       fCol       = rhs1.fCol;
       fDirection = rhs1.fDirection;
       fCursor    = rhs1.fCursor;
+      fCurCursor = rhs1.fCurCursor;
    }
    return *this;
 }
@@ -502,6 +502,7 @@ TOrdCollectionIter &TOrdCollectionIter::operator=(const TOrdCollectionIter &rhs)
       fCol       = rhs.fCol;
       fDirection = rhs.fDirection;
       fCursor    = rhs.fCursor;
+      fCurCursor = rhs.fCurCursor;
    }
    return *this;
 }
@@ -532,6 +533,8 @@ void TOrdCollectionIter::Reset()
       fCursor = 0;
    else
       fCursor = fCol->GetSize() - 1;
+   
+   fCurCursor = fCursor;
 }
 
 //______________________________________________________________________________
@@ -540,7 +543,7 @@ bool TOrdCollectionIter::operator!=(const TIterator &aIter) const
    // This operator compares two TIterator objects.
 
    if (nullptr == (&aIter))
-      return fCurCursor;
+      return (fCurCursor < fCol->GetSize());
 
    if (aIter.IsA() == TOrdCollectionIter::Class()) {
       const TOrdCollectionIter &iter(dynamic_cast<const TOrdCollectionIter &>(aIter));
@@ -555,7 +558,7 @@ bool TOrdCollectionIter::operator!=(const TOrdCollectionIter &aIter) const
    // This operator compares two TOrdCollectionIter objects.
 
    if (nullptr == (&aIter))
-      return fCurCursor;
+      return (fCurCursor < fCol->GetSize());
 
    return (fCurCursor != aIter.fCurCursor);
 }
-- 
GitLab