OTB  10.0.0
Orfeo Toolbox
otbObjectList.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2024 Centre National d'Etudes Spatiales (CNES)
3  *
4  * This file is part of Orfeo Toolbox
5  *
6  * https://www.orfeo-toolbox.org/
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 #ifndef otbObjectList_h
22 #define otbObjectList_h
23 
24 #include <vector>
25 #include "itkDataObject.h"
27 #include "itkObjectFactory.h"
28 
29 namespace otb
30 {
39 template <class TObject>
40 class ITK_EXPORT ObjectList : public itk::DataObject, public DataObjectListInterface
41 {
42 public:
44  typedef ObjectList Self;
45  typedef itk::DataObject Superclass;
46  typedef itk::SmartPointer<Self> Pointer;
47  typedef itk::SmartPointer<const Self> ConstPointer;
48 
50  itkTypeMacro(ObjectList, DataObject);
51 
53  itkNewMacro(Self);
54 
56  typedef TObject ObjectType;
57  typedef itk::SmartPointer<ObjectType> ObjectPointerType;
58  typedef std::vector<ObjectPointerType> InternalContainerType;
59  typedef typename InternalContainerType::size_type InternalContainerSizeType;
60 
65  void Reserve(InternalContainerSizeType size);
66 
71  InternalContainerSizeType Capacity(void) const;
72 
77  InternalContainerSizeType Size(void) const override;
78 
83  void Resize(InternalContainerSizeType size);
84 
89  void PushBack(ObjectType* element);
90 
94  void PopBack(void);
95 
101  void SetNthElement(unsigned int index, ObjectPointerType element);
102  void SetNthElement(unsigned int index, const ObjectType* element);
103 
109  ObjectPointerType GetNthElement(unsigned int index) const;
110 
115  Superclass* GetNthDataObject(unsigned int index) const override;
116 
121  ObjectPointerType Front(void);
122 
127  ObjectPointerType Back(void);
128 
133  void Erase(unsigned int index);
134 
138  void Clear(void);
139 
140  class ConstIterator;
141  class ReverseIterator;
142  class ReverseConstIterator;
143  class Iterator;
144  friend class Iterator;
145  friend class ConstIterator;
146  friend class ReverseIterator;
147  friend class ReverseConstIterator;
148 
154  Iterator Insert(Iterator position, ObjectPointerType element);
155 
161  ReverseIterator Insert(ReverseIterator position, ObjectPointerType element);
162 
168  class ITK_EXPORT Iterator
169  {
170  public:
171  friend class ObjectList;
172  friend class ConstIterator;
174  typedef typename InternalContainerType::iterator InternalIteratorType;
175 
177  Iterator(){};
178 
181  : m_Iter(iter)
182  {};
183 
189  {
190  return (*m_Iter);
191  }
192 
196  void Set(ObjectPointerType element)
197  {
198  (*m_Iter) = element;
199  }
200 
205  {
206  ++m_Iter;
207  return *this;
208  }
209 
214  {
215  --m_Iter;
216  return *this;
217  }
218 
223  {
224  Iterator lIter(m_Iter + i);
225  return lIter;
226  }
227 
232  {
233  Iterator lIter(m_Iter - i);
234  return lIter;
235  }
236 
240  {
241  return m_Iter + i;
242  }
243 
247  {
248  return m_Iter - i;
249  }
250 
254  bool operator!=(const Iterator& it)
255  {
256  return (m_Iter != it.m_Iter);
257  }
258 
262  bool operator==(const Iterator& it)
263  {
264  return (m_Iter == it.m_Iter);
265  }
266 
271  {
272  m_Iter = it.m_Iter;
273  return *this;
274  }
275 
279  Iterator(const Iterator& it)
280  : m_Iter(it.m_Iter)
281  {};
282 
287  {
288  return (m_Iter);
289  }
290 
291  private:
292  // Internal iterator.
294  };
300  class ITK_EXPORT ConstIterator
301  {
302  public:
303  friend class ObjectList;
304  friend class Iterator;
306  typedef typename InternalContainerType::const_iterator InternalConstIteratorType;
307 
310 
313  {
314  m_Iter = iter;
315  };
316 
322  {
323  return (*m_Iter);
324  }
325 
330  {
331  ++m_Iter;
332  return *this;
333  }
334 
339  {
340  --m_Iter;
341  return *this;
342  }
343 
347  bool operator!=(const ConstIterator& it)
348  {
349  return (m_Iter != it.m_Iter);
350  }
351 
355  bool operator==(const ConstIterator& it)
356  {
357  return (m_Iter == it.m_Iter);
358  }
359 
364  {
365  m_Iter = it.m_Iter;
366  return *this;
367  }
368 
373  {
374  m_Iter = it.m_Iter;
375  return *this;
376  }
377 
382  : m_Iter(it.m_Iter)
383  {};
384 
389  : m_Iter(it.m_Iter)
390  {};
391 
392  private:
393  // Internal iterator.
395  };
401  class ITK_EXPORT ReverseIterator
402  {
403  public:
404  friend class ObjectList;
405  friend class Iterator;
406 
407  friend class ReverseConstIterator;
409  typedef typename InternalContainerType::reverse_iterator InternalReverseIteratorType;
410 
413 
416  : m_Iter(iter)
417  {};
418 
424  {
425  return (*m_Iter);
426  }
427 
431  void Set(ObjectPointerType element)
432  {
433  (*m_Iter) = element;
434  }
435 
440  {
441  ++m_Iter;
442  return *this;
443  }
444 
449  {
450  --m_Iter;
451  return *this;
452  }
453 
457  bool operator!=(const ReverseIterator& it)
458  {
459  return (m_Iter != it.m_Iter);
460  }
461 
465  bool operator==(const ReverseIterator& it)
466  {
467  return (m_Iter == it.m_Iter);
468  }
469 
474  {
475  m_Iter = it.m_Iter;
476  return *this;
477  }
478 
483  : m_Iter(it.m_Iter)
484  {};
485 
490  {
491  return (m_Iter);
492  }
493 
494  private:
495  // Internal iterator.
497  };
503  class ITK_EXPORT ReverseConstIterator
504  {
505  public:
506  friend class ObjectList;
507  friend class Iterator;
508  friend class ConstIterator;
509  friend class ReverseIterator;
511  typedef typename InternalContainerType::const_reverse_iterator InternalReverseConstIteratorType;
512 
515 
518  : m_Iter(iter)
519  {};
520 
526  {
527  return (*m_Iter);
528  }
529 
534  {
535  ++m_Iter;
536  return *this;
537  }
538 
543  {
544  --m_Iter;
545  return *this;
546  }
547 
552  {
553  return (m_Iter != it.m_Iter);
554  }
555 
560  {
561  return (m_Iter == it.m_Iter);
562  }
563 
568  {
569  m_Iter = it.m_Iter;
570  return *this;
571  }
572 
577  {
578  m_Iter = it.m_Iter;
579  return *this;
580  }
581 
586  {
587  m_Iter = it.m_Iter;
588  };
589 
594  {
595  m_Iter = it.m_Iter;
596  };
597 
598  private:
599  // Internal iterator.
601  };
606  Iterator Begin(void);
607 
612  ConstIterator Begin(void) const;
613 
618  ReverseIterator ReverseBegin(void);
619 
624  ReverseConstIterator ReverseBegin(void) const;
625 
630  Iterator End(void);
631 
636  ConstIterator End(void) const;
637 
642  ReverseIterator ReverseEnd(void);
643 
648  ReverseConstIterator ReverseEnd(void) const;
649 
655  void Erase(Iterator begin, Iterator end);
656 
661  void Erase(Iterator loc);
662 
663 protected:
665  ObjectList();
666 
668  ~ObjectList() override
669  {
670  }
671 
673  void PrintSelf(std::ostream& os, itk::Indent indent) const override;
674 
675 private:
676  ObjectList(const Self&) = delete;
677  void operator=(const Self&) = delete;
680 };
681 } // end namespace otb
682 
683 #ifndef OTB_MANUAL_INSTANTIATION
684 #include "otbObjectList.hxx"
685 #endif
686 
687 #endif
ConstIterator of the object list.
ObjectPointerType Get(void)
ConstIterator & operator=(const ConstIterator &it)
bool operator==(const ConstIterator &it)
ConstIterator(const Iterator &it)
InternalConstIteratorType m_Iter
ConstIterator(const ConstIterator &it)
ConstIterator & operator=(const Iterator &it)
InternalContainerType::const_iterator InternalConstIteratorType
bool operator!=(const ConstIterator &it)
ConstIterator(InternalConstIteratorType iter)
Iterator of the object list.
Iterator operator+(int i)
Iterator & operator=(const Iterator &it)
Iterator(InternalIteratorType iter)
void Set(ObjectPointerType element)
Iterator operator+=(int i)
ObjectPointerType Get(void)
bool operator!=(const Iterator &it)
InternalContainerType::iterator InternalIteratorType
InternalIteratorType m_Iter
InternalIteratorType & GetIter(void)
Iterator(const Iterator &it)
Iterator operator-=(int i)
bool operator==(const Iterator &it)
Iterator operator-(int i)
ReverseConstIterator of the object list.
ReverseConstIterator & operator=(const ReverseIterator &it)
bool operator!=(const ReverseConstIterator &it)
ReverseConstIterator & operator++()
ReverseConstIterator & operator--()
ReverseConstIterator(const ReverseIterator &it)
ReverseConstIterator(InternalReverseConstIteratorType iter)
InternalContainerType::const_reverse_iterator InternalReverseConstIteratorType
ReverseConstIterator(const ReverseConstIterator &it)
ReverseConstIterator & operator=(const ReverseConstIterator &it)
InternalReverseConstIteratorType m_Iter
bool operator==(const ReverseConstIterator &it)
ReverseIterator of the object list.
void Set(ObjectPointerType element)
ReverseIterator(const ReverseIterator &it)
ReverseIterator & operator--()
ReverseIterator(InternalReverseIteratorType iter)
InternalReverseIteratorType & GetIter(void)
InternalContainerType::reverse_iterator InternalReverseIteratorType
bool operator!=(const ReverseIterator &it)
ObjectPointerType Get(void)
bool operator==(const ReverseIterator &it)
ReverseIterator & operator++()
InternalReverseIteratorType m_Iter
ReverseIterator & operator=(const ReverseIterator &it)
This class is a generic all-purpose wrapping around an std::vector<itk::SmartPointer<ObjectType> >.
Definition: otbObjectList.h:41
itk::SmartPointer< ObjectType > ObjectPointerType
Definition: otbObjectList.h:57
itk::DataObject Superclass
Definition: otbObjectList.h:45
itk::SmartPointer< const Self > ConstPointer
Definition: otbObjectList.h:47
itk::SmartPointer< Self > Pointer
Definition: otbObjectList.h:46
void operator=(const Self &)=delete
ObjectList Self
Definition: otbObjectList.h:44
TObject ObjectType
Definition: otbObjectList.h:53
InternalContainerType::size_type InternalContainerSizeType
Definition: otbObjectList.h:59
~ObjectList() override
std::vector< ObjectPointerType > InternalContainerType
Definition: otbObjectList.h:58
InternalContainerType m_InternalContainer
ObjectList(const Self &)=delete
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.