16 #ifndef ROO_LINKED_LIST_ITER
17 #define ROO_LINKED_LIST_ITER
30 virtual RooAbsArg * next() = 0;
31 virtual ~GenericRooFIter() {}
41 RooFIter(std::unique_ptr<GenericRooFIter> && itImpl) : fIterImpl{std::move(itImpl)} {}
42 RooFIter(
const RooFIter &) =
delete;
43 RooFIter(RooFIter &&) =
default;
44 RooFIter & operator=(
const RooFIter &) =
delete;
45 RooFIter & operator=(RooFIter &&) =
default;
49 return fIterImpl->next();
53 std::unique_ptr<GenericRooFIter> fIterImpl;
58 class RooFIterForLinkedList final :
public GenericRooFIter
61 RooFIterForLinkedList() {}
62 RooFIterForLinkedList(
const RooLinkedList* list) : fPtr (list->_first) {}
65 RooAbsArg *next()
override {
66 if (!fPtr)
return nullptr ;
67 TObject* arg = fPtr->_arg ;
69 return (RooAbsArg*) arg ;
73 const RooLinkedListElem * fPtr{
nullptr};
96 template<
class STLContainer>
97 class TIteratorToSTLInterface final :
public TIterator ,
public GenericRooFIter {
100 TIteratorToSTLInterface(
const STLContainer & container) :
103 fSTLContainer(container),
106 ,fCurrentElem{
nullptr}
108 ,fCurrentElem{fSTLContainer.empty() ?
nullptr : fSTLContainer.front()}
114 TIterator & operator=(
const TIterator &)
override {
118 const TCollection *GetCollection()
const override {
122 RooAbsArg * next()
override {
126 return fSTLContainer[fIndex++];
128 return nextChecked();
133 TObject * Next()
override {
134 return static_cast<TObject*
>(next());
137 void Reset()
override {
140 fCurrentElem = fSTLContainer.empty() ?
nullptr : fSTLContainer.front();
145 Bool_t operator!=(
const TIterator & other)
const override {
146 const auto * castedOther =
147 dynamic_cast<const TIteratorToSTLInterface<STLContainer>*
>(&other);
148 return !castedOther || &fSTLContainer != &(castedOther->fSTLContainer)
149 || fIndex == castedOther->fIndex;
152 TObject * operator*()
const override {
157 assert(fCurrentElem == fSTLContainer[fIndex]);
160 return static_cast<TObject*
>(fSTLContainer[fIndex]);
166 return fSTLContainer.empty()
167 || fIndex >= fSTLContainer.size();
171 RooAbsArg * nextChecked() {
172 RooAbsArg * ret = fSTLContainer.at(fIndex);
173 if (fCurrentElem !=
nullptr && ret != fCurrentElem) {
174 throw std::logic_error(
"A RooCollection should not be modified while iterating. "
175 "Only inserting at end is acceptable.");
177 fCurrentElem = ++fIndex < fSTLContainer.size() ? fSTLContainer[fIndex] :
nullptr;
183 const STLContainer & fSTLContainer;
185 const RooAbsArg * fCurrentElem;
203 class RooLinkedListIter final :
public TIterator {
206 RooLinkedListIter(std::shared_ptr<TIterator> iterImpl) :
207 fIterImpl{std::move(iterImpl)} {
211 RooLinkedListIter(
const RooLinkedListIter &) =
delete;
212 RooLinkedListIter(RooLinkedListIter &&) =
default;
213 RooLinkedListIter & operator=(
const RooLinkedListIter &) =
delete;
214 RooLinkedListIter & operator=(RooLinkedListIter &&) =
default;
216 TIterator &operator=(
const TIterator & other)
override {fIterImpl->operator=(other);
return *
this;}
217 const TCollection *GetCollection()
const override {
return nullptr;}
219 TObject * Next()
override {
return fIterImpl->Next();}
220 void Reset()
override {fIterImpl->Reset();}
221 Bool_t operator!=(
const TIterator & other)
const override {
return fIterImpl->operator!=(other);}
222 TObject * operator*()
const override {
return fIterImpl->operator*();}
225 std::shared_ptr<TIterator> fIterImpl;
232 class RooLinkedListIterImpl final :
public TIterator {
235 RooLinkedListIterImpl() {
240 RooLinkedListIterImpl(
const RooLinkedList* list, Bool_t forward) :
241 TIterator(), _list(list), _ptr(forward ? _list->_first : _list->_last),
245 RooLinkedListIterImpl(
const RooLinkedListIterImpl& other) :
246 TIterator(other), _list(other._list), _ptr(other._ptr),
247 _forward(other._forward)
252 virtual ~RooLinkedListIterImpl() { }
254 TIterator& operator=(
const TIterator& other) {
258 if (&other==
this)
return *this ;
259 const RooLinkedListIterImpl* iter =
dynamic_cast<const RooLinkedListIterImpl*
>(&other) ;
261 _list = iter->_list ;
263 _forward = iter->_forward ;
268 virtual const TCollection *GetCollection()
const {
273 virtual TObject *Next() {
275 if (!_ptr)
return 0 ;
276 TObject* arg = _ptr->_arg ;
277 _ptr = _forward ? _ptr->_next : _ptr->_prev ;
283 if (!_ptr)
return 0 ;
284 TObject* arg = _ptr->_arg ;
285 _ptr = _forward ? _ptr->_next : _ptr->_prev ;
290 virtual void Reset() {
292 _ptr = _forward ? _list->_first : _list->_last ;
295 bool operator!=(
const TIterator &aIter)
const {
296 const RooLinkedListIterImpl *iter(dynamic_cast<const RooLinkedListIterImpl*>(&aIter));
297 if (iter)
return (_ptr != iter->_ptr);
301 bool operator!=(
const RooLinkedListIterImpl &aIter)
const {
302 return (_ptr != aIter._ptr);
305 virtual TObject *operator*()
const {
307 return (_ptr ? _ptr->_arg :
nullptr);
311 const RooLinkedList* _list ;
312 const RooLinkedListElem* _ptr ;