/*****************************************************************************
 * Project: RooFit                                                           *
 * Package: RooFitCore                                                       *
 *    File: $Id: RooLinkedListIter.h,v 1.11 2007/05/11 09:11:30 verkerke Exp $
 * Authors:                                                                  *
 *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
 *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
 *                                                                           *
 * Copyright (c) 2000-2005, Regents of the University of California          *
 *                          and Stanford University. All rights reserved.    *
 *                                                                           *
 * Redistribution and use in source and binary forms,                        *
 * with or without modification, are permitted according to the terms        *
 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
 *****************************************************************************/
#ifndef ROO_LINKED_LIST_ITER
#define ROO_LINKED_LIST_ITER

#include "Rtypes.h"
#include "TIterator.h"
#include "RooLinkedList.h"

#if ROOT_VERSION_CODE <= 332546
#ifndef nullptr
#define nullptr 0
#endif
#endif

class RooFIter
{
  public:
  inline RooFIter() : _ptr (0) {}
  inline RooFIter(const RooLinkedList* list) : _ptr (list->_first) {}
    
  inline RooAbsArg *next() { 
    // Return next element in collection
    if (!_ptr) return 0 ;
    TObject* arg = _ptr->_arg ;      
    _ptr = _ptr->_next;
    return (RooAbsArg*) arg ;
  }
    
 private:
    const RooLinkedListElem* _ptr ;  //! Next link element
};



class RooLinkedListIter : public TIterator {
public:

  RooLinkedListIter() {
    // coverity[UNINIT_CTOR]
  } ;


  RooLinkedListIter(const RooLinkedList* list, Bool_t forward) : 
    TIterator(), _list(list), _ptr(forward ? _list->_first : _list->_last),
      _forward(forward)
  { }

  RooLinkedListIter(const RooLinkedListIter& other) :
    TIterator(other), _list(other._list), _ptr(other._ptr),
    _forward(other._forward)
  {
    // Copy constructor
  }
  
  virtual ~RooLinkedListIter() { ; }
  
  TIterator& operator=(const TIterator& other) {

    // Iterator assignment operator

    if (&other==this) return *this ;
    const RooLinkedListIter* iter = dynamic_cast<const RooLinkedListIter*>(&other) ;
    if (iter) {
      _list = iter->_list ;
      _ptr = iter->_ptr ;
      _forward = iter->_forward ;
    }
    return *this ;
  }
    
  virtual const TCollection *GetCollection() const { 
    // Dummy
    return 0 ; 
  }

  virtual TObject *Next() { 
    // Return next element in collection
    if (!_ptr) return 0 ;
    TObject* arg = _ptr->_arg ;      
    _ptr = _forward ? _ptr->_next : _ptr->_prev ;
    return arg ;
  }

  TObject *NextNV() { 
    // Return next element in collection
    if (!_ptr) return 0 ;
    TObject* arg = _ptr->_arg ;      
    _ptr = _forward ? _ptr->_next : _ptr->_prev ;
    return arg ;
  }
  

  virtual void Reset() { 
    // Return iterator to first element in collection
    _ptr = _forward ? _list->_first : _list->_last ;
  }

  bool operator!=(const TIterator &aIter) const {
    const RooLinkedListIter *iter(dynamic_cast<const RooLinkedListIter*>(&aIter));
    if (iter) return (_ptr != iter->_ptr);
    return false; // for base class we don't implement a comparison
  }

  bool operator!=(const RooLinkedListIter &aIter) const {
    return (_ptr != aIter._ptr);
  }

  virtual TObject *operator*() const {
    // Return element iterator points to
    return (_ptr ? _ptr->_arg : nullptr);
  }

protected:
  const RooLinkedList* _list ;     //! Collection iterated over
  const RooLinkedListElem* _ptr ;  //! Next link element
  Bool_t _forward ;                //  Iterator direction

  ClassDef(RooLinkedListIter,2) // Iterator for RooLinkedList container class
} ;




#endif
 RooLinkedListIter.h:1
 RooLinkedListIter.h:2
 RooLinkedListIter.h:3
 RooLinkedListIter.h:4
 RooLinkedListIter.h:5
 RooLinkedListIter.h:6
 RooLinkedListIter.h:7
 RooLinkedListIter.h:8
 RooLinkedListIter.h:9
 RooLinkedListIter.h:10
 RooLinkedListIter.h:11
 RooLinkedListIter.h:12
 RooLinkedListIter.h:13
 RooLinkedListIter.h:14
 RooLinkedListIter.h:15
 RooLinkedListIter.h:16
 RooLinkedListIter.h:17
 RooLinkedListIter.h:18
 RooLinkedListIter.h:19
 RooLinkedListIter.h:20
 RooLinkedListIter.h:21
 RooLinkedListIter.h:22
 RooLinkedListIter.h:23
 RooLinkedListIter.h:24
 RooLinkedListIter.h:25
 RooLinkedListIter.h:26
 RooLinkedListIter.h:27
 RooLinkedListIter.h:28
 RooLinkedListIter.h:29
 RooLinkedListIter.h:30
 RooLinkedListIter.h:31
 RooLinkedListIter.h:32
 RooLinkedListIter.h:33
 RooLinkedListIter.h:34
 RooLinkedListIter.h:35
 RooLinkedListIter.h:36
 RooLinkedListIter.h:37
 RooLinkedListIter.h:38
 RooLinkedListIter.h:39
 RooLinkedListIter.h:40
 RooLinkedListIter.h:41
 RooLinkedListIter.h:42
 RooLinkedListIter.h:43
 RooLinkedListIter.h:44
 RooLinkedListIter.h:45
 RooLinkedListIter.h:46
 RooLinkedListIter.h:47
 RooLinkedListIter.h:48
 RooLinkedListIter.h:49
 RooLinkedListIter.h:50
 RooLinkedListIter.h:51
 RooLinkedListIter.h:52
 RooLinkedListIter.h:53
 RooLinkedListIter.h:54
 RooLinkedListIter.h:55
 RooLinkedListIter.h:56
 RooLinkedListIter.h:57
 RooLinkedListIter.h:58
 RooLinkedListIter.h:59
 RooLinkedListIter.h:60
 RooLinkedListIter.h:61
 RooLinkedListIter.h:62
 RooLinkedListIter.h:63
 RooLinkedListIter.h:64
 RooLinkedListIter.h:65
 RooLinkedListIter.h:66
 RooLinkedListIter.h:67
 RooLinkedListIter.h:68
 RooLinkedListIter.h:69
 RooLinkedListIter.h:70
 RooLinkedListIter.h:71
 RooLinkedListIter.h:72
 RooLinkedListIter.h:73
 RooLinkedListIter.h:74
 RooLinkedListIter.h:75
 RooLinkedListIter.h:76
 RooLinkedListIter.h:77
 RooLinkedListIter.h:78
 RooLinkedListIter.h:79
 RooLinkedListIter.h:80
 RooLinkedListIter.h:81
 RooLinkedListIter.h:82
 RooLinkedListIter.h:83
 RooLinkedListIter.h:84
 RooLinkedListIter.h:85
 RooLinkedListIter.h:86
 RooLinkedListIter.h:87
 RooLinkedListIter.h:88
 RooLinkedListIter.h:89
 RooLinkedListIter.h:90
 RooLinkedListIter.h:91
 RooLinkedListIter.h:92
 RooLinkedListIter.h:93
 RooLinkedListIter.h:94
 RooLinkedListIter.h:95
 RooLinkedListIter.h:96
 RooLinkedListIter.h:97
 RooLinkedListIter.h:98
 RooLinkedListIter.h:99
 RooLinkedListIter.h:100
 RooLinkedListIter.h:101
 RooLinkedListIter.h:102
 RooLinkedListIter.h:103
 RooLinkedListIter.h:104
 RooLinkedListIter.h:105
 RooLinkedListIter.h:106
 RooLinkedListIter.h:107
 RooLinkedListIter.h:108
 RooLinkedListIter.h:109
 RooLinkedListIter.h:110
 RooLinkedListIter.h:111
 RooLinkedListIter.h:112
 RooLinkedListIter.h:113
 RooLinkedListIter.h:114
 RooLinkedListIter.h:115
 RooLinkedListIter.h:116
 RooLinkedListIter.h:117
 RooLinkedListIter.h:118
 RooLinkedListIter.h:119
 RooLinkedListIter.h:120
 RooLinkedListIter.h:121
 RooLinkedListIter.h:122
 RooLinkedListIter.h:123
 RooLinkedListIter.h:124
 RooLinkedListIter.h:125
 RooLinkedListIter.h:126
 RooLinkedListIter.h:127
 RooLinkedListIter.h:128
 RooLinkedListIter.h:129
 RooLinkedListIter.h:130
 RooLinkedListIter.h:131
 RooLinkedListIter.h:132
 RooLinkedListIter.h:133
 RooLinkedListIter.h:134
 RooLinkedListIter.h:135
 RooLinkedListIter.h:136
 RooLinkedListIter.h:137
 RooLinkedListIter.h:138