NCBI C++ ToolKit
iterator.hpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 #ifndef ITERATOR__HPP
2 #define ITERATOR__HPP
3 
4 /* $Id: iterator.hpp 94696 2021-08-31 17:05:16Z gouriano $
5 * ===========================================================================
6 *
7 * PUBLIC DOMAIN NOTICE
8 * National Center for Biotechnology Information
9 *
10 * This software/database is a "United States Government Work" under the
11 * terms of the United States Copyright Act. It was written as part of
12 * the author's official duties as a United States Government employee and
13 * thus cannot be copyrighted. This software/database is freely available
14 * to the public for use. The National Library of Medicine and the U.S.
15 * Government have not placed any restriction on its use or reproduction.
16 *
17 * Although all reasonable efforts have been taken to ensure the accuracy
18 * and reliability of the software and data, the NLM and the U.S.
19 * Government do not and cannot warrant the performance or results that
20 * may be obtained by using this software or data. The NLM and the U.S.
21 * Government disclaim all warranties, express or implied, including
22 * warranties of performance, merchantability or fitness for any particular
23 * purpose.
24 *
25 * Please cite the author in any work or product based on this material.
26 *
27 * ===========================================================================
28 *
29 * Author: Eugene Vasilchenko
30 *
31 * File Description:
32 * Iterators through object hierarchy
33 */
34 
35 #include <corelib/ncbistd.hpp>
36 #include <corelib/ncbiutil.hpp>
38 #include <serial/serialutil.hpp>
39 #include <serial/serialbase.hpp>
40 #include <set>
41 
42 #include <serial/impl/pathhook.hpp>
43 
44 
45 /** @addtogroup ObjHierarchy
46  *
47  * @{
48  */
49 
50 
52 
53 class CTreeIterator;
54 
55 /// Class holding information about root of non-modifiable object hierarchy
56 /// Do not use it directly
57 class CBeginInfo : public pair<TObjectPtr, TTypeInfo>
58 {
59  typedef pair<TObjectPtr, TTypeInfo> CParent;
60 public:
62 
63  CBeginInfo(TObjectPtr objectPtr, TTypeInfo typeInfo,
64  bool detectLoops = false)
65  : CParent(objectPtr, typeInfo), m_DetectLoops(detectLoops)
66  {
67  }
68  CBeginInfo(const CObjectInfo& object,
69  bool detectLoops = false)
70  : CParent(object.GetObjectPtr(), object.GetTypeInfo()),
71  m_DetectLoops(detectLoops)
72  {
73  }
74  CBeginInfo(CSerialObject& object, bool detectLoops = false)
75  : CParent(&object, object.GetThisTypeInfo()),
76  m_DetectLoops(detectLoops)
77  {
78  }
79 
81 };
82 
83 /// Class holding information about root of non-modifiable object hierarchy
84 /// Do not use it directly
85 class CConstBeginInfo : public pair<TConstObjectPtr, TTypeInfo>
86 {
87  typedef pair<TConstObjectPtr, TTypeInfo> CParent;
88 public:
90 
92  bool detectLoops = false)
93  : CParent(objectPtr, typeInfo), m_DetectLoops(detectLoops)
94  {
95  }
97  bool detectLoops = false)
98  : CParent(object.GetObjectPtr(), object.GetTypeInfo()),
99  m_DetectLoops(detectLoops)
100  {
101  }
103  bool detectLoops = false)
104  : CParent(&object, object.GetThisTypeInfo()),
105  m_DetectLoops(detectLoops)
106  {
107  }
108  CConstBeginInfo(const CBeginInfo& beginInfo)
109  : CParent(beginInfo.first, beginInfo.second),
110  m_DetectLoops(beginInfo.m_DetectLoops)
111  {
112  }
113 
115 };
116 
117 /// Class describing stack level of traversal
119 public:
122 
123  virtual ~CConstTreeLevelIterator(void);
124 
125  virtual bool Valid(void) const = 0;
126  virtual TMemberIndex GetIndex(void) const
127  {
128  return kInvalidMember;
129  }
130  virtual void Next(void) = 0;
131  virtual bool CanGet(void) const
132  {
133  return true;
134  }
135  virtual TObjectInfo Get(void) const = 0;
136  virtual const CItemInfo* GetItemInfo(void) const = 0;
137  virtual CConstTreeLevelIterator* Clone(void) = 0;
138 
139  static CConstTreeLevelIterator* Create(const TObjectInfo& object);
140  static CConstTreeLevelIterator* CreateOne(const TObjectInfo& object);
141 
142  static bool HaveChildren(const CConstObjectInfo& object);
143 protected:
144  virtual void SetItemInfo(const CItemInfo* info) = 0;
145 };
146 
148 {
149 public:
152 
153  virtual ~CTreeLevelIterator(void);
154 
155  virtual bool Valid(void) const = 0;
156  virtual TMemberIndex GetIndex(void) const
157  {
158  return kInvalidMember;
159  }
160  virtual void Next(void) = 0;
161  virtual bool CanGet(void) const
162  {
163  return true;
164  }
165  virtual TObjectInfo Get(void) const = 0;
166  virtual const CItemInfo* GetItemInfo(void) const = 0;
167  virtual CTreeLevelIterator* Clone(void) = 0;
168 
169  static CTreeLevelIterator* Create(const TObjectInfo& object);
170  static CTreeLevelIterator* CreateOne(const TObjectInfo& object);
171 
172  virtual void Erase(void);
173 protected:
174  virtual void SetItemInfo(const CItemInfo* info) = 0;
175 };
176 
177 /// Base class for all iterators over non-modifiable object
178 /// Do not use it directly
179 template<class LevelIterator>
181 {
183  typedef shared_ptr<LevelIterator> TStackLevel;
184 
185 public:
186  typedef typename LevelIterator::TObjectInfo TObjectInfo;
187  typedef typename LevelIterator::TBeginInfo TBeginInfo;
189  typedef list< pair< typename LevelIterator::TObjectInfo, const CItemInfo*> > TIteratorContext;
190 
191  // construct object iterator
193  {
194  }
195  CTreeIteratorTmpl(const TBeginInfo& beginInfo)
196  {
197  Init(beginInfo);
198  }
199  CTreeIteratorTmpl(const TBeginInfo& beginInfo, const string& filter)
200  {
201  Init(beginInfo, filter);
202  }
203  virtual ~CTreeIteratorTmpl(void)
204  {
205  Reset();
206  }
207 
208  /// Get information about current object
210  {
211  _ASSERT(CheckValid());
212  return m_CurrentObject;
213  }
214  /// Get information about current object
215  const TObjectInfo& Get(void) const
216  {
217  _ASSERT(CheckValid());
218  return m_CurrentObject;
219  }
220  /// Get type information of current object
222  {
223  return Get().GetTypeInfo();
224  }
225 
226  /// Reset iterator to initial state
227  void Reset(void)
228  {
229  m_CurrentObject.Reset();
230  m_VisitedObjects.reset();
231  m_Stack.clear();
232  _ASSERT(!*this);
233  }
234 
235  void Next(void)
236  {
237  _ASSERT(CheckValid());
238  m_CurrentObject.Reset();
239 
240  _ASSERT(!m_Stack.empty());
241  if ( Step(m_Stack.back()->Get()) )
242  Walk();
243  }
244 
245  void SkipSubTree(void)
246  {
247  _ASSERT(CheckValid());
248  m_Stack.push_back(TStackLevel(LevelIterator::CreateOne(TObjectInfo())));
249  }
250 
251 
252  bool IsValid(void) const
253  {
254  return CheckValid();
255  }
256 
257  // check whether iterator is not finished
259 
260  /// Go to next object
262  {
263  Next();
264  return *this;
265  }
266 
267  /// Initialize iterator to new root of object hierarchy
268  TThis& operator=(const TBeginInfo& beginInfo)
269  {
270  Init(beginInfo);
271  return *this;
272  }
273 
274  /// Get raw context data
276  {
277  TIteratorContext stk_info;
278  typename vector< TStackLevel >::const_iterator i;
279  for (i = m_Stack.begin(); i != m_Stack.end(); ++i) {
280  stk_info.push_back( make_pair( (*i)->Get(), (*i)->GetItemInfo()));
281  }
282  return stk_info;
283  }
284 
285  /// Get context data as string
286  string GetContext(void) const
287  {
288  string loc;
289  TIteratorContext stk_info = GetContextData();
290  typename TIteratorContext::const_iterator i;
291  for (i = stk_info.begin(); i != stk_info.end(); ++i) {
292  TTypeInfo tt = i->first.GetTypeInfo();
293  const CItemInfo* ii = i->second;
294  string name;
295  if (ii) {
296  const CMemberId& mid = ii->GetId();
297  if (!mid.IsAttlist() && !mid.HasNotag()) {
298  name = mid.GetName();
299  }
300  } else {
301  if (loc.empty()) {
302  name = tt->GetName();
303  }
304  }
305  if (!name.empty()) {
306  if (!loc.empty()) {
307  loc += ".";
308  }
309  loc += name;
310  }
311  }
312  return loc;
313  }
314 
315  /// Check context against filter
316  ///
317  /// @param filter
318  /// Context filter string
319  bool MatchesContext(const string& filter) const
320  {
321  if (filter.empty()) {
322  return true;
323  }
324  return CPathHook::Match(filter,GetContext());
325  }
326 
327  /// Set context filter
328  ///
329  /// @param filter
330  /// Context filter string
331  void SetContextFilter(const string& filter)
332  {
333  m_ContextFilter = filter;
334  if (!MatchesContext(filter)) {
335  Next();
336  }
337  }
338 
339  /// Return element index in STL container
340  int GetContainerElementIndex(void) const
341  {
343  if (m_Stack.size() > 1) {
344  LevelIterator* l( m_Stack[ m_Stack.size()-2 ].get());
345  ind = l->GetIndex();
346  }
347  return int(ind - kInvalidMember - 1);
348  }
349 
350  /// Return member index in sequence, or variant index in choice
351  int GetItemIndex(void) const
352  {
354  if (!m_Stack.empty()) {
355  ind = m_Stack.back().get()->GetIndex();
356  }
357  return int(ind - kInvalidMember - 1);
358  }
359 
360 protected:
361 
362  bool CheckValid(void) const
363  {
364  return m_CurrentObject;
365  }
366 
367  virtual bool CanSelect(const CConstObjectInfo& obj)
368  {
369  if ( !obj )
370  return false;
371  TVisitedObjects* visitedObjects = m_VisitedObjects.get();
372  if ( visitedObjects ) {
373  if ( !visitedObjects->insert(obj.GetObjectPtr()).second ) {
374  // already visited
375  return false;
376  }
377  }
378  return true;
379  }
380 
381  virtual bool CanEnter(const CConstObjectInfo& object)
382  {
384  }
385 
386  void Init(const TBeginInfo& beginInfo)
387  {
388  Reset();
389  if ( !beginInfo.first || !beginInfo.second )
390  return;
391  if ( beginInfo.m_DetectLoops )
393  m_Stack.push_back(TStackLevel(LevelIterator::CreateOne(beginInfo)));
394  Walk();
395  }
396 
397  void Init(const TBeginInfo& beginInfo, const string& filter)
398  {
399  m_ContextFilter = filter;
400  Init(beginInfo);
401  }
402 
403 private:
404  bool Step(const TObjectInfo& current)
405  {
406  if ( CanEnter(current) ) {
407  TStackLevel nextLevel(LevelIterator::Create(current));
408  if ( nextLevel && nextLevel->Valid() ) {
409  m_Stack.push_back(nextLevel);
410  return true;
411  }
412  }
413  // skip all finished iterators
414  _ASSERT(!m_Stack.empty());
415  do {
416  m_Stack.back()->Next();
417  if ( m_Stack.back()->Valid() ) {
418  // next child on this level
419  return true;
420  }
421  m_Stack.pop_back();
422  } while ( !m_Stack.empty() );
423  return false;
424  }
425 
426  void Walk(void)
427  {
428  _ASSERT(!m_Stack.empty());
429  TObjectInfo current;
430  do {
431  while (!m_Stack.back()->CanGet()) {
432  for(;;) {
433  m_Stack.back()->Next();
434  if (m_Stack.back()->Valid()) {
435  break;
436  }
437  m_Stack.pop_back();
438  if (m_Stack.empty()) {
439  return;
440  }
441  }
442  }
443  current = m_Stack.back()->Get();
444  if ( CanSelect(current) ) {
446  m_CurrentObject = current;
447  return;
448  }
449  }
450  } while ( Step(current) );
451  }
452 
453  // stack of tree level iterators
454  vector< TStackLevel > m_Stack;
455  // currently selected object
457  shared_ptr<TVisitedObjects> m_VisitedObjects;
459 
460  friend class CTreeIterator;
461 
462 protected:
463  void Assign(const CTreeIteratorTmpl& it)
464  {
465  m_Stack.clear();
466  for (const auto& e : it.m_Stack) {
467  m_Stack.push_back( TStackLevel(e.get()->Clone()));
468  }
472  }
473 }; /* NCBI_FAKE_WARNING: MSVC */
474 
475 
477 
478 /// Base class for all iterators over modifiable object
479 class NCBI_XSERIAL_EXPORT CTreeIterator : public CTreeIteratorTmpl<CTreeLevelIterator>
480 {
482 public:
485 
486  // construct object iterator
488  {
489  }
490  CTreeIterator(const TBeginInfo& beginInfo)
491  {
492  Init(beginInfo);
493  }
494  CTreeIterator(const TBeginInfo& beginInfo, const string& filter)
495  {
496  Init(beginInfo, filter);
497  }
498 
499  // initialize iterator to new root of object hierarchy
500  CTreeIterator& operator=(const TBeginInfo& beginInfo)
501  {
502  Init(beginInfo);
503  return *this;
504  }
505 
506  /// Delete currently pointed object (throws exception if failed)
507  void Erase(void);
508 };
509 
510 /// template base class for CTypeIterator<> and CTypeConstIterator<>
511 /// Do not use it directly
512 template<class Parent>
513 class CTypeIteratorBase : public Parent
514 {
515  typedef Parent CParent;
516 protected:
517  typedef typename CParent::TBeginInfo TBeginInfo;
518 
520  : m_NeedType(needType)
521  {
522  }
523  CTypeIteratorBase(TTypeInfo needType, const TBeginInfo& beginInfo)
524  : m_NeedType(needType)
525  {
526  this->Init(beginInfo);
527  }
528  CTypeIteratorBase(TTypeInfo needType, const TBeginInfo& beginInfo,
529  const string& filter)
530  : m_NeedType(needType)
531  {
532  this->Init(beginInfo, filter);
533  }
534 
535  virtual bool CanSelect(const CConstObjectInfo& object)
536  {
537  return CParent::CanSelect(object) &&
538  object.GetTypeInfo()->IsType(m_NeedType);
539  }
540  virtual bool CanEnter(const CConstObjectInfo& object)
541  {
542  return CParent::CanEnter(object) &&
543  object.GetTypeInfo()->MayContainType(m_NeedType);
544  }
545 
547  {
548  return m_NeedType;
549  }
550 
551  void Assign(const CTypeIteratorBase& it)
552  {
553  CParent::Assign(it);
554  m_NeedType = it.m_NeedType;
555  }
556 
557 private:
559 };
560 
561 /// Template base class for CTypesIterator and CTypesConstIterator
562 /// Do not use it directly
563 template<class Parent>
564 class CTypesIteratorBase : public Parent
565 {
566  typedef Parent CParent;
567 public:
568  typedef typename CParent::TBeginInfo TBeginInfo;
569  typedef list<TTypeInfo> TTypeList;
570 
572  {
573  }
575  {
576  m_TypeList.push_back(type);
577  }
579  {
580  m_TypeList.push_back(type1);
581  m_TypeList.push_back(type2);
582  }
583  CTypesIteratorBase(const TTypeList& typeList)
584  : m_TypeList(typeList)
585  {
586  }
587  CTypesIteratorBase(const TTypeList& typeList, const TBeginInfo& beginInfo)
588  : m_TypeList(typeList)
589  {
590  Init(beginInfo);
591  }
592  CTypesIteratorBase(const TTypeList& typeList, const TBeginInfo& beginInfo,
593  const string& filter)
594  : m_TypeList(typeList)
595  {
596  Init(beginInfo, filter);
597  }
598 
599  const TTypeList& GetTypeList(void) const
600  {
601  return m_TypeList;
602  }
603 
605  {
606  m_TypeList.push_back(type);
607  return *this;
608  }
609 
611  {
612  this->Init(beginInfo);
613  return *this;
614  }
615 
616  typename CParent::TObjectInfo::TObjectPtrType GetFoundPtr(void) const
617  {
618  return this->Get().GetObjectPtr();
619  }
621  {
622  return this->Get().GetTypeInfo();
623  }
625  {
626  return m_MatchType;
627  }
628 
629 protected:
630 #if 0
631 // There is an (unconfirmed) opinion that putting these two functions
632 // into source (iterator.cpp) reduces the size of an executable.
633 // Still, keeping them there is reported as bug by
634 // Metrowerks Codewarrior 9.0 (Mac OSX)
635  virtual bool CanSelect(const CConstObjectInfo& object);
636  virtual bool CanEnter(const CConstObjectInfo& object);
637 #else
638  virtual bool CanSelect(const CConstObjectInfo& object)
639  {
640  if ( !CParent::CanSelect(object) )
641  return false;
642  m_MatchType = 0;
643  TTypeInfo type = object.GetTypeInfo();
644  ITERATE ( TTypeList, i, GetTypeList() ) {
645  if ( type->IsType(*i) ) {
646  m_MatchType = *i;
647  return true;
648  }
649  }
650  return false;
651  }
652  virtual bool CanEnter(const CConstObjectInfo& object)
653  {
654  if ( !CParent::CanEnter(object) )
655  return false;
656  TTypeInfo type = object.GetTypeInfo();
657  ITERATE ( TTypeList, i, GetTypeList() ) {
658  if ( type->MayContainType(*i) )
659  return true;
660  }
661  return false;
662  }
663 #endif
664 
665 private:
668 };
669 
670 /// Template class for iteration on objects of class C
671 template<class C, class TypeGetter = C>
672 class CTypeIterator : public CTypeIteratorBase<CTreeIterator>
673 {
675 public:
676  using iterator_category = forward_iterator_tag;
677  using value_type = C;
678  using difference_type = ptrdiff_t;
679  using pointer = C*;
680  using reference = C&;
681  typedef typename CParent::TBeginInfo TBeginInfo;
682 
684  : CParent(TypeGetter::GetTypeInfo())
685  {
686  }
687  CTypeIterator(const TBeginInfo& beginInfo)
688  : CParent(TypeGetter::GetTypeInfo(), beginInfo)
689  {
690  }
691  CTypeIterator(const TBeginInfo& beginInfo, const string& filter)
692  : CParent(TypeGetter::GetTypeInfo(), beginInfo, filter)
693  {
694  }
695  explicit CTypeIterator(CSerialObject& object)
696  : CParent(TypeGetter::GetTypeInfo(), TBeginInfo(object))
697  {
698  }
699 
701  {
702  Init(beginInfo);
703  return *this;
704  }
705 
706  C& operator*(void)
707  {
708  return *CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
709  }
710  const C& operator*(void) const
711  {
712  return *CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
713  }
714  C* operator->(void)
715  {
716  return CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
717  }
718  const C* operator->(void) const
719  {
720  return CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
721  }
723  : CParent(TypeGetter::GetTypeInfo())
724  {
725  CParent::Assign(it);
726  }
728  {
729  CParent::Assign(it);
730  return *this;
731  }
733  {
734  return *this;
735  }
737  {
738  return CTypeIterator();
739  }
741  {
743  return *this;
744  }
746  {
747  CTypeIterator tmp(*this);
749  return tmp;
750  }
751  bool operator==(const CTypeIterator& it) const
752  {
753  if (IsValid() && it.IsValid()) {
754  return Get() == it.Get();
755  }
756  return IsValid() == it.IsValid();
757  }
758  bool operator!=(const CTypeIterator& it) const
759  {
760  return !operator==(it);
761  }
762 };
763 
764 /// Template class for iteration on objects of class C (non-medifiable version)
765 template<class C, class TypeGetter = C>
766 class CTypeConstIterator : public CTypeIteratorBase<CTreeConstIterator>
767 {
769 public:
770  using iterator_category = forward_iterator_tag;
771  using value_type = C;
772  using difference_type = ptrdiff_t;
773  using pointer = C*;
774  using reference = C&;
775  typedef typename CParent::TBeginInfo TBeginInfo;
776 
778  : CParent(TypeGetter::GetTypeInfo())
779  {
780  }
781  CTypeConstIterator(const TBeginInfo& beginInfo)
782  : CParent(TypeGetter::GetTypeInfo(), beginInfo)
783  {
784  }
785  CTypeConstIterator(const TBeginInfo& beginInfo, const string& filter)
786  : CParent(TypeGetter::GetTypeInfo(), beginInfo, filter)
787  {
788  }
789  explicit CTypeConstIterator(const CSerialObject& object)
790  : CParent(TypeGetter::GetTypeInfo(), TBeginInfo(object))
791  {
792  }
793 
795  {
796  Init(beginInfo);
797  return *this;
798  }
799 
800  const C& operator*(void) const
801  {
802  return *CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
803  }
804  const C* operator->(void) const
805  {
806  return CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
807  }
809  : CParent(TypeGetter::GetTypeInfo())
810  {
811  CParent::Assign(it);
812  }
814  {
815  CParent::Assign(it);
816  return *this;
817  }
819  {
820  return *this;
821  }
823  {
824  return CTypeConstIterator();
825  }
827  {
828  CParent::operator++();
829  return *this;
830  }
832  {
833  CTypeConstIterator tmp(*this);
834  CParent::operator++();
835  return tmp;
836  }
837  bool operator==(const CTypeConstIterator& it) const
838  {
839  if (IsValid() && it.IsValid()) {
840  return Get() == it.Get();
841  }
842  return IsValid() == it.IsValid();
843  }
844  bool operator!=(const CTypeConstIterator& it) const
845  {
846  return !operator==(it);
847  }
848 };
849 
850 #if 0
851 // these are obsolete (?) Use CTypeIterator and CTypeConstIterator instead
852 
853 /// Do not use it directly
854 template<class Parent>
855 class CLeafTypeIteratorBase : public CTypeIteratorBase<Parent>
856 {
858 protected:
859  typedef typename CParent::TBeginInfo TBeginInfo;
860 
861  CLeafTypeIteratorBase(TTypeInfo needType)
862  : CParent(needType)
863  {
864  }
865  CLeafTypeIteratorBase(TTypeInfo needType, const TBeginInfo& beginInfo)
866  : CParent(needType)
867  {
868  Init(beginInfo);
869  }
870  CLeafTypeIteratorBase(TTypeInfo needType, const TBeginInfo& beginInfo,
871  const string& filter)
872  : CParent(needType)
873  {
874  Init(beginInfo, filter);
875  }
876 
877  virtual bool CanSelect(const CConstObjectInfo& object);
878 };
879 
880 /// Template class for iteration on objects of class C
881 template<class C>
882 class CLeafTypeIterator : public CLeafTypeIteratorBase<CTreeIterator>
883 {
884  typedef CLeafTypeIteratorBase<CTreeIterator> CParent;
885 public:
886  typedef typename CParent::TBeginInfo TBeginInfo;
887 
888  CLeafTypeIterator(void)
889  : CParent(C::GetTypeInfo())
890  {
891  }
892  CLeafTypeIterator(const TBeginInfo& beginInfo)
893  : CParent(C::GetTypeInfo(), beginInfo)
894  {
895  }
896  CLeafTypeIterator(const TBeginInfo& beginInfo, const string& filter)
897  : CParent(C::GetTypeInfo(), beginInfo, filter)
898  {
899  }
900  explicit CLeafTypeIterator(CSerialObject& object)
901  : CParent(C::GetTypeInfo(), TBeginInfo(object))
902  {
903  }
904 
905  CLeafTypeIterator<C>& operator=(const TBeginInfo& beginInfo)
906  {
907  Init(beginInfo);
908  return *this;
909  }
910 
911  C& operator*(void)
912  {
913  return *CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
914  }
915  const C& operator*(void) const
916  {
917  return *CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
918  }
919  C* operator->(void)
920  {
921  return CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
922  }
923  const C* operator->(void) const
924  {
925  return CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
926  }
927 };
928 
929 /// Template class for iteration on objects of class C (non-medifiable version)
930 template<class C>
931 class CLeafTypeConstIterator : public CLeafTypeIteratorBase<CTreeConstIterator>
932 {
933  typedef CLeafTypeIteratorBase<CTreeConstIterator> CParent;
934 public:
935  typedef typename CParent::TBeginInfo TBeginInfo;
936 
937  CLeafTypeConstIterator(void)
938  : CParent(C::GetTypeInfo())
939  {
940  }
941  CLeafTypeConstIterator(const TBeginInfo& beginInfo)
942  : CParent(C::GetTypeInfo(), beginInfo)
943  {
944  }
945  CLeafTypeConstIterator(const TBeginInfo& beginInfo, const string& filter)
946  : CParent(C::GetTypeInfo(), beginInfo, filter)
947  {
948  }
949  explicit CLeafTypeConstIterator(const CSerialObject& object)
950  : CParent(C::GetTypeInfo(), TBeginInfo(object))
951  {
952  }
953 
954  CLeafTypeConstIterator<C>& operator=(const TBeginInfo& beginInfo)
955  {
956  Init(beginInfo);
957  return *this;
958  }
959 
960  const C& operator*(void) const
961  {
962  return *CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
963  }
964  const C* operator->(void) const
965  {
966  return CTypeConverter<C>::SafeCast(Get().GetObjectPtr());
967  }
968 };
969 #endif
970 
971 /// Template class for iteration on objects of standard C++ type T
972 template<typename T>
974 /// Non-modifiable version
975 template<typename T>
977 
978 // get special typeinfo of CObject
980 {
981 public:
982  static TTypeInfo GetTypeInfo(void);
983 };
984 
985 // class for iteration on objects derived from class CObject
987 // class for iteration on objects derived from class CObject
988 // (non-modifiable version)
990 
991 // class for iteration on objects of list of types
993 // class for iteration on objects of list of types (non-modifiable version)
995 
996 // enum flag for turning on loop detection in object hierarchy
999 };
1000 
1001 /// Get starting point of object hierarchy
1002 template<class C>
1003 inline
1005 {
1006  return CBeginInfo(&obj, C::GetTypeInfo(), false);
1007 }
1008 
1009 /// Get starting point of non-modifiable object hierarchy
1010 template<class C>
1011 inline
1013 {
1014  return CConstBeginInfo(&obj, C::GetTypeInfo(), false);
1015 }
1016 
1017 template<class C>
1018 inline
1020 {
1021  return CConstBeginInfo(&obj, C::GetTypeInfo(), false);
1022 }
1023 
1024 /// Get starting point of object hierarchy with loop detection
1025 template<class C>
1026 inline
1028 {
1029  return CBeginInfo(&obj, C::GetTypeInfo(), true);
1030 }
1031 
1032 /// Get starting point of non-modifiable object hierarchy with loop detection
1033 template<class C>
1034 inline
1036 {
1037  return CConstBeginInfo(&obj, C::GetTypeInfo(), true);
1038 }
1039 
1040 template<class C>
1041 inline
1043 {
1044  return CConstBeginInfo(&obj, C::GetTypeInfo(), true);
1045 }
1046 
1047 
1048 /* @} */
1049 
1050 
1052 
1053 #endif /* ITERATOR__HPP */
Class holding information about root of non-modifiable object hierarchy Do not use it directly.
Definition: iterator.hpp:58
Class holding information about root of non-modifiable object hierarchy Do not use it directly.
Definition: iterator.hpp:86
CConstObjectInfo –.
Definition: objectinfo.hpp:421
Class describing stack level of traversal.
Definition: iterator.hpp:118
CObjectInfo –.
Definition: objectinfo.hpp:597
Base class for all serializable objects.
Definition: serialbase.hpp:150
Base class for all iterators over non-modifiable object Do not use it directly.
Definition: iterator.hpp:181
Base class for all iterators over modifiable object.
Definition: iterator.hpp:480
Template class for iteration on objects of class C (non-medifiable version)
Definition: iterator.hpp:767
CTypeInfo class contains all information about C++ types (both basic and classes): members and layout...
Definition: typeinfo.hpp:76
template base class for CTypeIterator<> and CTypeConstIterator<> Do not use it directly
Definition: iterator.hpp:514
Template class for iteration on objects of class C.
Definition: iterator.hpp:673
Template base class for CTypesIterator and CTypesConstIterator Do not use it directly.
Definition: iterator.hpp:565
Definition: set.hpp:45
iterator_bool insert(const value_type &val)
Definition: set.hpp:149
Include a standard set of the NCBI C++ Toolkit most basic headers.
#define C(s)
Definition: common.h:231
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
Definition: dlist.tmpl.h:46
static void Init(void)
Definition: cursor6.c:76
static char tmp[3200]
Definition: utf8.c:42
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
const CMemberId & GetId(void) const
bool IsAttlist(void) const
const string & GetName(void) const
bool HasNotag(void) const
CVect2< NCBI_PROMOTE(int,U) > operator*(int v1, const CVect2< U > &v2)
Definition: globals.hpp:371
void * TObjectPtr
Definition: serialdef.hpp:55
size_t TMemberIndex
Type used for indexing class members and choice variants.
Definition: serialdef.hpp:230
const TMemberIndex kInvalidMember
Special value returned from FindMember.
Definition: serialdef.hpp:237
const void * TConstObjectPtr
Definition: serialdef.hpp:59
static const TObjectType * SafeCast(TTypeInfo type)
Definition: serialutil.hpp:76
CTypesIteratorBase(const TTypeList &typeList)
Definition: iterator.hpp:583
CTreeIteratorTmpl< CTreeLevelIterator > CParent
Definition: iterator.hpp:481
TIteratorContext GetContextData(void) const
Get raw context data.
Definition: iterator.hpp:275
virtual const CItemInfo * GetItemInfo(void) const =0
CTypeIterator(const TBeginInfo &beginInfo)
Definition: iterator.hpp:687
CTypeIteratorBase(TTypeInfo needType, const TBeginInfo &beginInfo)
Definition: iterator.hpp:523
virtual CConstTreeLevelIterator * Clone(void)=0
virtual void Next(void)=0
void Assign(const CTreeIteratorTmpl &it)
Definition: iterator.hpp:463
CTypeIterator< C, TypeGetter > & operator=(const TBeginInfo &beginInfo)
Definition: iterator.hpp:700
CTreeIteratorTmpl(const TBeginInfo &beginInfo)
Definition: iterator.hpp:195
const C * operator->(void) const
Definition: iterator.hpp:718
bool operator!=(const CTypeIterator &it) const
Definition: iterator.hpp:758
CBeginInfo(CSerialObject &object, bool detectLoops=false)
Definition: iterator.hpp:74
CTreeIterator & operator=(const TBeginInfo &beginInfo)
Definition: iterator.hpp:500
pair< TConstObjectPtr, TTypeInfo > CParent
Definition: iterator.hpp:87
CParent::TObjectInfo::TObjectPtrType GetFoundPtr(void) const
Definition: iterator.hpp:616
CTypesIteratorBase(const TTypeList &typeList, const TBeginInfo &beginInfo)
Definition: iterator.hpp:587
virtual void SetItemInfo(const CItemInfo *info)=0
C * operator->(void)
Definition: iterator.hpp:714
TTypeList m_TypeList
Definition: iterator.hpp:666
const TTypeList & GetTypeList(void) const
Definition: iterator.hpp:599
void SkipSubTree(void)
Definition: iterator.hpp:245
CTypeConstIterator operator++(int)
Definition: iterator.hpp:831
bool IsValid(void) const
Definition: iterator.hpp:252
CTypeIterator end(void)
Definition: iterator.hpp:736
CParent::TBeginInfo TBeginInfo
Definition: iterator.hpp:568
virtual bool CanEnter(const CConstObjectInfo &object)
Definition: iterator.hpp:381
CBeginInfo(TObjectPtr objectPtr, TTypeInfo typeInfo, bool detectLoops=false)
Definition: iterator.hpp:63
virtual bool CanGet(void) const
Definition: iterator.hpp:161
CTypesIteratorBase(const TTypeList &typeList, const TBeginInfo &beginInfo, const string &filter)
Definition: iterator.hpp:592
CTypeConstIterator & begin(void)
Definition: iterator.hpp:818
const C & operator*(void) const
Definition: iterator.hpp:800
LevelIterator::TBeginInfo TBeginInfo
Definition: iterator.hpp:187
CTreeIterator(const TBeginInfo &beginInfo)
Definition: iterator.hpp:490
CConstBeginInfo(const CBeginInfo &beginInfo)
Definition: iterator.hpp:108
virtual void Next(void)=0
CTypeIterator(const CTypeIterator &it)
Definition: iterator.hpp:722
TTypeInfo GetMatchType(void) const
Definition: iterator.hpp:624
forward_iterator_tag iterator_category
Definition: iterator.hpp:770
CConstObjectInfo TObjectInfo
Definition: iterator.hpp:89
CConstBeginInfo(TConstObjectPtr objectPtr, TTypeInfo typeInfo, bool detectLoops=false)
Definition: iterator.hpp:91
CTypeIteratorBase< CTreeIterator > CParent
Definition: iterator.hpp:674
virtual bool CanGet(void) const
Definition: iterator.hpp:131
LevelIterator::TObjectInfo TObjectInfo
Definition: iterator.hpp:186
CTypeIterator & begin(void)
Definition: iterator.hpp:732
C & operator*(void)
Definition: iterator.hpp:706
void Reset(void)
Reset iterator to initial state.
Definition: iterator.hpp:227
CTypeConstIterator< C, TypeGetter > & operator=(const TBeginInfo &beginInfo)
Definition: iterator.hpp:794
TObjectInfo & Get(void)
Get information about current object.
Definition: iterator.hpp:209
CTreeIterator(void)
Definition: iterator.hpp:487
CTypesIteratorBase< CTreeIterator > CTypesIterator
Definition: iterator.hpp:992
virtual bool CanSelect(const CConstObjectInfo &obj)
Definition: iterator.hpp:367
string GetContext(void) const
Get context data as string.
Definition: iterator.hpp:286
CTreeIteratorTmpl< CConstTreeLevelIterator > CTreeConstIterator
Definition: iterator.hpp:476
virtual ~CTreeIteratorTmpl(void)
Definition: iterator.hpp:203
virtual void SetItemInfo(const CItemInfo *info)=0
virtual TMemberIndex GetIndex(void) const
Definition: iterator.hpp:156
virtual bool CanEnter(const CConstObjectInfo &object)
Definition: iterator.hpp:540
ptrdiff_t difference_type
Definition: iterator.hpp:772
TBeginInfo::TObjectInfo TObjectInfo
Definition: iterator.hpp:121
CTypesIteratorBase(TTypeInfo type1, TTypeInfo type2)
Definition: iterator.hpp:578
CTypeConstIterator(const CTypeConstIterator &it)
Definition: iterator.hpp:808
CTypeConstIterator end(void)
Definition: iterator.hpp:822
void Next(void)
Definition: iterator.hpp:235
virtual bool Valid(void) const =0
pair< TObjectPtr, TTypeInfo > CParent
Definition: iterator.hpp:59
DECLARE_OPERATOR_BOOL(IsValid())
CBeginInfo TBeginInfo
Definition: iterator.hpp:150
CTypeIteratorBase< CTreeConstIterator > CParent
Definition: iterator.hpp:768
void Assign(const CTypeIteratorBase &it)
Definition: iterator.hpp:551
shared_ptr< LevelIterator > TStackLevel
Definition: iterator.hpp:183
CTypeIteratorBase(TTypeInfo needType)
Definition: iterator.hpp:519
CTypesIteratorBase(void)
Definition: iterator.hpp:571
CParent::TBeginInfo TBeginInfo
Definition: iterator.hpp:517
CParent::TObjectInfo TObjectInfo
Definition: iterator.hpp:483
CParent::TBeginInfo TBeginInfo
Definition: iterator.hpp:484
int GetItemIndex(void) const
Return member index in sequence, or variant index in choice.
Definition: iterator.hpp:351
CTypeIterator(const TBeginInfo &beginInfo, const string &filter)
Definition: iterator.hpp:691
CTreeIteratorTmpl(const TBeginInfo &beginInfo, const string &filter)
Definition: iterator.hpp:199
bool m_DetectLoops
Definition: iterator.hpp:80
forward_iterator_tag iterator_category
Definition: iterator.hpp:676
CTypeIterator(CSerialObject &object)
Definition: iterator.hpp:695
virtual TObjectInfo Get(void) const =0
CTypeIterator & operator=(const CTypeIterator &it)
Definition: iterator.hpp:727
TThis & operator++(void)
Go to next object.
Definition: iterator.hpp:261
bool Step(const TObjectInfo &current)
Definition: iterator.hpp:404
TTypeInfo GetCurrentTypeInfo(void) const
Get type information of current object.
Definition: iterator.hpp:221
CTypeConstIterator(const TBeginInfo &beginInfo, const string &filter)
Definition: iterator.hpp:785
void Walk(void)
Definition: iterator.hpp:426
const TObjectInfo & Get(void) const
Get information about current object.
Definition: iterator.hpp:215
CTypeConstIterator(void)
Definition: iterator.hpp:777
CParent::TBeginInfo TBeginInfo
Definition: iterator.hpp:681
const C * operator->(void) const
Definition: iterator.hpp:804
bool operator==(const CTypeIterator &it) const
Definition: iterator.hpp:751
CConstBeginInfo(const CSerialObject &object, bool detectLoops=false)
Definition: iterator.hpp:102
TTypeInfo m_NeedType
Definition: iterator.hpp:558
CTypeConstIterator(const TBeginInfo &beginInfo)
Definition: iterator.hpp:781
CTypesIteratorBase< CTreeConstIterator > CTypesConstIterator
Definition: iterator.hpp:994
const C & operator*(void) const
Definition: iterator.hpp:710
TTypeInfo GetFoundType(void) const
Definition: iterator.hpp:620
CTypeConstIterator & operator=(const CTypeConstIterator &it)
Definition: iterator.hpp:813
list< TTypeInfo > TTypeList
Definition: iterator.hpp:569
CTreeIteratorTmpl< LevelIterator > TThis
Definition: iterator.hpp:182
CTypeConstIterator< CObject, CObjectGetTypeInfo > CObjectConstIterator
Definition: iterator.hpp:989
TThis & operator=(const TBeginInfo &beginInfo)
Initialize iterator to new root of object hierarchy.
Definition: iterator.hpp:268
CConstBeginInfo ConstBegin(const C &obj)
Get starting point of non-modifiable object hierarchy.
Definition: iterator.hpp:1012
void Init(const TBeginInfo &beginInfo, const string &filter)
Definition: iterator.hpp:397
void Init(const TBeginInfo &beginInfo)
Definition: iterator.hpp:386
CObjectInfo TObjectInfo
Definition: iterator.hpp:61
virtual TObjectInfo Get(void) const =0
CTypeIterator(void)
Definition: iterator.hpp:683
CBeginInfo(const CObjectInfo &object, bool detectLoops=false)
Definition: iterator.hpp:68
virtual CTreeLevelIterator * Clone(void)=0
virtual bool CanEnter(const CConstObjectInfo &object)
Definition: iterator.hpp:652
virtual bool CanSelect(const CConstObjectInfo &object)
Definition: iterator.hpp:638
CConstBeginInfo TBeginInfo
Definition: iterator.hpp:120
CTypeIterator< CObject, CObjectGetTypeInfo > CObjectIterator
Definition: iterator.hpp:986
vector< TStackLevel > m_Stack
Definition: iterator.hpp:454
string m_ContextFilter
Definition: iterator.hpp:458
virtual bool Valid(void) const =0
shared_ptr< TVisitedObjects > m_VisitedObjects
Definition: iterator.hpp:457
bool operator!=(const CTypeConstIterator &it) const
Definition: iterator.hpp:844
static bool HaveChildren(const CConstObjectInfo &object)
Definition: iterator.cpp:262
CTypeIterator & operator++(void)
Definition: iterator.hpp:740
int GetContainerElementIndex(void) const
Return element index in STL container.
Definition: iterator.hpp:340
CBeginInfo Begin(C &obj)
Get starting point of object hierarchy.
Definition: iterator.hpp:1004
TTypeInfo m_MatchType
Definition: iterator.hpp:667
bool CheckValid(void) const
Definition: iterator.hpp:362
CTreeIteratorTmpl(void)
Definition: iterator.hpp:192
CConstBeginInfo(const CConstObjectInfo &object, bool detectLoops=false)
Definition: iterator.hpp:96
CTypesIteratorBase< Parent > & operator=(const TBeginInfo &beginInfo)
Definition: iterator.hpp:610
void SetContextFilter(const string &filter)
Set context filter.
Definition: iterator.hpp:331
virtual bool CanSelect(const CConstObjectInfo &object)
Definition: iterator.hpp:535
set< TConstObjectPtr > TVisitedObjects
Definition: iterator.hpp:188
virtual TMemberIndex GetIndex(void) const
Definition: iterator.hpp:126
CTypesIteratorBase(TTypeInfo type)
Definition: iterator.hpp:574
virtual const CItemInfo * GetItemInfo(void) const =0
CTypeConstIterator & operator++(void)
Definition: iterator.hpp:826
CTypeConstIterator(const CSerialObject &object)
Definition: iterator.hpp:789
bool MatchesContext(const string &filter) const
Check context against filter.
Definition: iterator.hpp:319
CTypeIterator operator++(int)
Definition: iterator.hpp:745
list< pair< typename LevelIterator::TObjectInfo, const CItemInfo * > > TIteratorContext
Definition: iterator.hpp:189
CTypesIteratorBase< Parent > & AddType(TTypeInfo type)
Definition: iterator.hpp:604
TBeginInfo::TObjectInfo TObjectInfo
Definition: iterator.hpp:151
bool operator==(const CTypeConstIterator &it) const
Definition: iterator.hpp:837
EDetectLoops
Definition: iterator.hpp:997
CTypeIteratorBase(TTypeInfo needType, const TBeginInfo &beginInfo, const string &filter)
Definition: iterator.hpp:528
CParent::TBeginInfo TBeginInfo
Definition: iterator.hpp:775
TObjectInfo m_CurrentObject
Definition: iterator.hpp:456
TTypeInfo GetIteratorType(void) const
Definition: iterator.hpp:546
CTreeIterator(const TBeginInfo &beginInfo, const string &filter)
Definition: iterator.hpp:494
@ eDetectLoops
Definition: iterator.hpp:998
static bool Match(const string &mask, const string &path)
Definition: pathhook.cpp:141
TConstObjectPtr GetObjectPtr(void) const
Get pointer to object.
bool IsValid(const CSeq_point &pt, CScope *scope)
Checks that point >= 0 and point < length of Bioseq.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
const string & GetName(void) const
Get name of this type.
Definition: typeinfo.cpp:249
#define NCBI_XSERIAL_EXPORT
Definition: ncbi_export.h:1435
unsigned int
A callback function used to compare two keys in a database.
Definition: types.hpp:1210
int i
static MDB_envinfo info
Definition: mdb_load.c:37
const TYPE & Get(const CNamedParameterList *param)
Useful/utility classes and methods.
Definition: type.c:6
#define _ASSERT
Modified on Wed Apr 17 13:10:20 2024 by modify_doxy.py rev. 669887