Hurricane VLSI Database


Collection.h
1// ****************************************************************************************************
2// File: ./hurricane/Collection.h
3// Authors: R. Escassut
4// Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
5//
6// This file is part of Hurricane.
7//
8// Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
9// Lesser General Public License as published by the Free Software Foundation, either version 3 of the
10// License, or (at your option) any later version.
11//
12// Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
13// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
14// General Public License for more details.
15//
16// You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
17// not, see <http://www.gnu.org/licenses/>.
18// ****************************************************************************************************
19
20#ifndef HURRICANE_COLLECTION
21#define HURRICANE_COLLECTION
22
23#include "hurricane/Locator.h"
24#include "hurricane/Filter.h"
25
26namespace Hurricane {
27
28template<class Type> class GenericCollection;
29template<class Type, class SubType> class SubTypeCollection;
30template<class Type, class SubType> class NotSubTypeCollection;
31template<class Type> class SubSetCollection;
32
33
34
35// ****************************************************************************************************
36// Collection declaration
37// ****************************************************************************************************
38
39template<class Type> class Collection {
40// ************************************
41
42// Constructors
43// ************
44
45 protected: Collection()
46 // ********************
47 {
48 }
49
50 private: Collection(const Collection& collection);
51 // ***********************************************
52 // not implemented to forbid copy construction
53 // ***********************************************
54
55// Destructor
56// **********
57
58 public: virtual ~Collection()
59 // **************************
60 {
61 }
62
63// Operators
64// *********
65
66 private: Collection& operator=(const Collection& collection);
67 // **********************************************************
68 // not implemented to forbid assignment
69 // **********************************************************
70
71// Accessors
72// *********
73
74 public: virtual Collection<Type>* getClone() const = 0;
75
76 public: virtual Locator<Type>* getLocator() const = 0;
77
78 public: virtual unsigned getSize() const
79 // *************************************
80 {
81 unsigned size = 0;
82 // we use a GenericLocator to delete the locator allocated by getLocator()
84 while (locator.isValid()) {
85 size++;
86 locator.progress();
87 }
88 return size;
89 }
90
91 public: Type getFirst() const
92 // **************************
93 {
94 // we use a GenericLocator to delete the locator allocated by getLocator()
95 return GenericLocator<Type>(getLocator()).getElement();
96 }
97
98 public: GenericCollection<Type> getSubSet(const Filter<Type>& filter) const
99 // ************************************************************************
100 {
101 return SubSetCollection<Type>(*this, filter);
102 }
103
104 public: template<class SubType> GenericCollection<SubType> getSubSet() const
105 // *************************************************************************
106 {
108 }
109
110 public: template<class SubType>
112 // ******************************************************************************
113 {
114 return getSubSet<SubType>().getSubSet(filter);
115 }
116
117 public: template<class SubType> GenericCollection<SubType> getNotSubSet() const
118 // ****************************************************************************
119 {
120 return NotSubTypeCollection<Type, SubType>(this);
121 }
122
123// Predicates
124// **********
125
126 public: bool isEmpty() const
127 // *************************
128 {
129 // we use a GenericLocator to delete the locator allocated by getLocator()
130 return !GenericLocator<Type>(getLocator()).isValid();
131 }
132
133// Utilitarians
134// ************
135
136 public: void fill(list<Type>& list) const
137 // **************************************
138 {
139 GenericLocator<Type> locator = getLocator();
140 while (locator.isValid()) {
141 list.push_back(locator.getElement());
142 locator.progress();
143 }
144 }
145
146 public: void fill(set<Type>& set) const
147 // ************************************
148 {
149 GenericLocator<Type> locator = getLocator();
150 while (locator.isValid()) {
151 set.insert(locator.getElement());
152 locator.progress();
153 }
154 }
155
156 public: template<class Compare> void fill(set<Type, Compare>& set) const
157 // *********************************************************************
158 {
159 GenericLocator<Type> locator = getLocator();
160 while (locator.isValid()) {
161 set.insert(locator.getElement());
162 locator.progress();
163 }
164 }
165
166 public: void fill(vector<Type>& vector) const
167 // ******************************************
168 {
169 GenericLocator<Type> locator = getLocator();
170 while (locator.isValid()) {
171 vector.push_back(locator.getElement());
172 locator.progress();
173 }
174 }
175
176// Others
177// ******
178
179 public: virtual string _getTypeName() const
180 // **************************************
181 {
182 return _TName("Collection<Type>");
183 };
184
185 public: virtual string _getString() const = 0;
186
187 public: Record* _getRecord() const
188 // *************************
189 {
190 Record* record = NULL;
191 if (!isEmpty()) {
192 record = new Record(getString(this));
193 unsigned n = 1;
194 GenericLocator<Type> locator = getLocator();
195 while (locator.isValid()) {
196 string slotName = getString(n++);
197 Type slotRecord = locator.getElement();
198 record->add(getSlot(slotName, slotRecord));
199 locator.progress();
200 }
201 }
202 return record;
203 }
204
205 public:
206 class iterator {
207 public:
208 iterator ( Locator<Type>* l ) : _locator(l) {}
209 ~iterator () { delete _locator; }
210 bool operator== ( const iterator& o) const { return not (*this != o); }
211 iterator& operator++ () { _locator->progress(); return *this; }
212 Type operator* () { return _locator->getElement(); }
213 bool operator!= ( const iterator& o ) const
214 {
215 bool invalidA = ( _locator == NULL) or not ( _locator->isValid());
216 bool invalidB = (o._locator == NULL) or not (o._locator->isValid());
217 return invalidA != invalidB or (not invalidA and not invalidB and _locator != o._locator);
218 }
219 private:
220 Locator<Type>* _locator;
221 };
222
223 public:
224 iterator begin() { return iterator(getLocator()); }
225 iterator end() { return iterator(NULL); }
226 bool empty() { return begin() == end(); }
227};
228
229
230
231// ****************************************************************************************************
232// GenericCollection declaration
233// ****************************************************************************************************
234
235template<class Type> class GenericCollection : public Collection<Type> {
236// *******************************************************************
237
238// Types
239// *****
240
241 public: typedef Collection<Type> Inherit;
242
243// Attributes
244// **********
245
246 private: Collection<Type>* _collection;
247
248// Constructors
249// ************
250
251 public: GenericCollection()
252 // ***********************
253 : Inherit(),
254 _collection(NULL)
255 {
256 }
257
258 public: GenericCollection(const Collection<Type>& collection)
259 // **********************************************************
260 : Inherit(),
261 _collection(collection.getClone())
262 {
263 }
264
265 public: GenericCollection(const GenericCollection<Type>& genericCollection)
266 // ************************************************************************
267 : Inherit(),
268 _collection(genericCollection.getClone())
269 {
270 }
271
272 public: GenericCollection(Collection<Type>* collection)
273 // *************************************************************
274 // CAUTION : collection will be deleted by the GenericCollection
275 // *************************************************************
276 : Inherit(),
277 _collection(collection)
278 {
279 }
280
281// Destructor
282// **********
283
284 public: virtual ~GenericCollection()
285 // *********************************
286 {
287 if (_collection) delete _collection;
288 }
289
290// Operators
291// *********
292
293 public: GenericCollection& operator=(const Collection<Type>& collection)
294 // *********************************************************************
295 {
296 if (_collection) delete _collection;
297 _collection = collection.getClone();
298 return *this;
299 }
300
301 public: GenericCollection& operator=(const GenericCollection& genericCollection)
302 // *****************************************************************************
303 {
304 if (_collection) delete _collection;
305 _collection = genericCollection.getClone();
306 return *this;
307 }
308
309 public: GenericCollection& operator=(Collection<Type>* collection)
310 // ***************************************************************
311 // CAUTION : collection will be deleted by the GenericCollection
312 // ***************************************************************
313 {
314 if (_collection) delete _collection;
315 _collection = collection;
316 return *this;
317 }
318
319// Accessors
320// *********
321
322 public: virtual Collection<Type>* getClone() const
323 // ***********************************************
324 {
325 return (_collection) ? _collection->getClone() : NULL;
326 }
327
328 public: virtual Locator<Type>* getLocator() const
329 // **********************************************
330 {
331 return (_collection) ? _collection->getLocator() : NULL;
332 }
333
334 public: virtual unsigned getSize() const
335 // *************************************
336 {
337 return (_collection) ? _collection->getSize() : 0;
338 }
339
340// Others
341// ******
342
343 public: virtual string _getTypeName() const
344 // **************************************
345 {
346 return _TName("GenericCollection");
347 };
348
349 public: virtual string _getString() const
350 // **************************************
351 {
352 if (!_collection)
353 return "<" + _getTypeName() + " unbound>";
354 else
355 return "<" + _getTypeName()+ " " + getString(_collection) + ">";
356 }
357
358};
359
360
361
362// ****************************************************************************************************
363// ElementCollection declaration
364// ****************************************************************************************************
365
366template<class Type> class ElementCollection : public Collection<Type> {
367// *********************************************************************
368
369 // -----------------------------------------------------------------
370 // Sub-Class : "::ElementCollection::Locator".
371 public: template<class ElType> class Locator : public Hurricane::Locator<ElType> {
372
373 // Attributes
374 // **********
375 protected: const ElType _element;
376 protected: bool _done;
377
378 // Constructors
379 // ************
380 public: Locator ( const ElType _element ) : _element(_element), _done(false) {};
381 public: Locator ( const Locator &locator ) : _element(locator._element), _done(locator._done) {};
382
383 // Accessors
384 // *********
385 public: virtual ElType getElement () const { return const_cast<ElType>(_element); };
386 public: virtual Locator<ElType>* getClone () const { return new Locator(*this); };
387 public: virtual bool isValid () const { return !_done; };
388 public: virtual void progress () { _done = true; };
389
390 // Hurricane Management
391 // ********************
392 public: virtual string _getString () const {
393 if (!_element)
394 return "<" + _TName("ElementCollection::Locator") + " unbound>";
395 else
396 return "<" + _TName("ElementCollection::Locator") + " " + getString(_element) + ">";
397 }
398
399 };
400
401// Types
402// *****
403
404 public: typedef Collection<Type> Inherit;
405
406// Attributes
407// **********
408
409 private: Type _element;
410
411// Constructors
412// ************
413
414 public: ElementCollection()
415 // ***********************
416 : Inherit(),
417 _element(NULL)
418 {
419 }
420
421 public: ElementCollection(const Type element)
422 // **********************************************************
423 : Inherit(),
424 _element(element)
425 {
426 }
427
428 public: ElementCollection(const ElementCollection<Type>& elementCollection)
429 // ************************************************************************
430 : Inherit(),
431 _element(elementCollection._element)
432 {
433 }
434
435// Accessors
436// *********
437
438 public: virtual Collection<Type>* getClone() const
439 // ***********************************************
440 {
441 return ( new ElementCollection (*this) );
442 }
443
444 public: virtual Locator<Type>* getLocator() const
445 // **********************************************
446 {
447 return ( new Locator<Type> (_element) );
448 }
449
450 public: virtual unsigned getSize() const
451 // *************************************
452 {
453 return (_element) ? 1 : 0;
454 }
455
456// Others
457// ******
458
459 public: virtual string _getString() const
460 // **************************************
461 {
462 if (!_element)
463 return "<" + _TName("ElementCollection") + " unbound>";
464 else
465 return "<" + _TName("ElementCollection") + " " + getString(_element) + ">";
466 }
467
468};
469
470
471
472// ****************************************************************************************************
473// SubTypeCollection declaration
474// ****************************************************************************************************
475
476template<class Type, class SubType> class SubTypeCollection : public Collection<SubType> {
477// *************************************************************************************
478
479// Types
480// *****
481
482 public: typedef Collection<SubType> Inherit;
483
484 public: class Locator : public Hurricane::Locator<SubType> {
485 // *******************************************************
486
487 // Types
488 // *****
489
490 public: typedef Hurricane::Locator<SubType> Inherit;
491
492 // Attributes
493 // **********
494
495 private: GenericLocator<Type> _locator;
496
497 // Constructors
498 // ************
499
500 public: Locator(const GenericCollection<Type>& collection)
501 // ********************************************************
502 : Inherit(),
503 _locator(collection.getLocator())
504 {
505 while (_locator.isValid() && !dynamic_cast<SubType>(_locator.getElement()))
506 _locator.progress();
507 }
508
509 public: Locator(const GenericLocator<Type>& genericLocator)
510 // ********************************************************
511 : Inherit(),
512 _locator(genericLocator.getClone())
513 {
514 while (_locator.isValid() && !dynamic_cast<SubType>(_locator.getElement()))
515 _locator.progress();
516 }
517
518 // Accessors
519 // *********
520
521 public: virtual SubType getElement() const
522 // ***************************************
523 {
524 return (_locator.isValid()) ? (SubType)_locator.getElement() : SubType();
525 }
526
527 public: virtual Hurricane::Locator<SubType>* getClone() const
528 // **********************************************************
529 {
530 return new Locator(_locator);
531 }
532
533 public: virtual Hurricane::Locator<SubType>* getLocator() // 21-10-03
534 // *************************************************
535 {
536 return dynamic_cast<Hurricane::Locator<SubType>*> (
537 _locator.getLocator()->getLocator() );
538 }
539
540
541 // Predicates
542 // **********
543
544 public: virtual bool isValid() const
545 // *********************************
546 {
547 return _locator.isValid();
548 }
549
550 // Updators
551 // ********
552
553 public: virtual void progress()
554 // ****************************
555 {
556 if (_locator.isValid()) {
557 do {
558 _locator.progress();
559 } while (_locator.isValid() && !dynamic_cast<SubType>(_locator.getElement()));
560 }
561 }
562
563 };
564
565// Attributes
566// **********
567
568 private: GenericCollection<Type> _collection;
569
570// Constructors
571// ************
572
573 public: SubTypeCollection()
574 // ********************
575 : Inherit(),
576 _collection()
577 {
578 }
579
580 public: SubTypeCollection(const Collection<Type>* collection)
581 // **********************************************************
582 : Inherit(),
583 _collection(collection->getClone())
584 {
585 }
586
588 // *****************************************************************
589 : Inherit(),
590 _collection(collection)
591 {
592 }
593
594 public: SubTypeCollection(const SubTypeCollection& subTypeCollection)
595 // ******************************************************************
596 : Inherit(),
597 _collection(subTypeCollection._collection)
598 {
599 }
600
601// Operators
602// *********
603
604 public: SubTypeCollection& operator=(const SubTypeCollection& subTypeCollection)
605 // *****************************************************************************
606 {
607 _collection = subTypeCollection._collection;
608 return *this;
609 }
610
611// Accessors
612// *********
613
614 public: virtual Collection<SubType>* getClone() const
615 // **************************************************
616 {
617 return new SubTypeCollection(_collection);
618 }
619
620 public: virtual Hurricane::Locator<SubType>* getLocator() const
621 // ************************************************************
622 {
623 return new Locator(_collection);
624 }
625
626// Accessors
627// *********
628
629 public: virtual string _getString() const
630 // **************************************
631 {
632 return "<" + _TName("SubTypeCollection") + " " + getString(_collection) + ">";
633 }
634
635};
636
637
638// ****************************************************************************************************
639// NotSubTypeCollection declaration
640// ****************************************************************************************************
641
642template<class Type, class SubType> class NotSubTypeCollection : public Collection<SubType> {
643// ******************************************************************************************
644
645// Types
646// *****
647
648 public: typedef Collection<SubType> Inherit;
649
650 public: class Locator : public Hurricane::Locator<SubType> {
651 // *******************************************************
652
653 // Types
654 // *****
655
656 public: typedef Hurricane::Locator<SubType> Inherit;
657
658 // Attributes
659 // **********
660
661 private: GenericLocator<Type> _locator;
662
663 // Constructors
664 // ************
665
666 public: Locator(const GenericCollection<Type>& collection)
667 // ********************************************************
668 : Inherit(),
669 _locator(collection.getLocator())
670 {
671 while (_locator.isValid() && dynamic_cast<SubType>(_locator.getElement()))
672 _locator.progress();
673 }
674
675 public: Locator(const GenericLocator<Type>& genericLocator)
676 // ********************************************************
677 : Inherit(),
678 _locator(genericLocator.getClone())
679 {
680 while (_locator.isValid() && !dynamic_cast<SubType>(_locator.getElement()))
681 _locator.progress();
682 }
683
684 // Accessors
685 // *********
686
687 public: virtual SubType getElement() const
688 // ***************************************
689 {
690 return (_locator.isValid()) ? (SubType)_locator.getElement() : SubType();
691 }
692
693 public: virtual Hurricane::Locator<SubType>* getClone() const
694 // **********************************************************
695 {
696 return new Locator(_locator);
697 }
698
699 public: virtual Hurricane::Locator<SubType>* getLocator() // 21-10-03
700 // *************************************************
701 {
702 return dynamic_cast<Hurricane::Locator<SubType>*> (
703 _locator.getLocator()->getLocator() );
704 }
705
706
707 // Predicates
708 // **********
709
710 public: virtual bool isValid() const
711 // *********************************
712 {
713 return _locator.isValid();
714 }
715
716 // Updators
717 // ********
718
719 public: virtual void progress()
720 // ****************************
721 {
722 if (_locator.isValid()) {
723 do {
724 _locator.progress();
725 } while (_locator.isValid() && !dynamic_cast<SubType>(_locator.getElement()));
726 }
727 }
728
729 };
730
731// Attributes
732// **********
733
734 private: GenericCollection<Type> _collection;
735
736// Constructors
737// ************
738
739 public: NotSubTypeCollection()
740 // ********************
741 : Inherit(),
742 _collection()
743 {
744 }
745
746 public: NotSubTypeCollection(const Collection<Type>* collection)
747 // **********************************************************
748 : Inherit(),
749 _collection(collection->getClone())
750 {
751 }
752
753 public: NotSubTypeCollection(const GenericCollection<Type>& collection)
754 // *****************************************************************
755 : Inherit(),
756 _collection(collection)
757 {
758 }
759
760 public: NotSubTypeCollection(const NotSubTypeCollection& subTypeCollection)
761 // ******************************************************************
762 : Inherit(),
763 _collection(subTypeCollection._collection)
764 {
765 }
766
767// Operators
768// *********
769
770 public: NotSubTypeCollection& operator=(const NotSubTypeCollection& subTypeCollection)
771 // *****************************************************************************
772 {
773 _collection = subTypeCollection._collection;
774 return *this;
775 }
776
777// Accessors
778// *********
779
780 public: virtual Collection<SubType>* getClone() const
781 // **************************************************
782 {
783 return new NotSubTypeCollection(_collection);
784 }
785
786 public: virtual Hurricane::Locator<SubType>* getLocator() const
787 // ************************************************************
788 {
789 return new Locator(_collection);
790 }
791
792// Accessors
793// *********
794
795 public: virtual string _getString() const
796 // **************************************
797 {
798 return "<" + _TName("NotSubTypeCollection") + " " + getString(_collection) + ">";
799 }
800
801};
802
803
804// ****************************************************************************************************
805// SubSetCollection implementation
806// ****************************************************************************************************
807
808template<class Type> class SubSetCollection : public Collection<Type> {
809// ******************************************************************
810
811// Types
812// *****
813
814 public: typedef Collection<Type> Inherit;
815
816 public: class Locator : public Hurricane::Locator<Type> {
817 // ****************************************************
818
819 // Types
820 // *****
821
822 public: typedef Hurricane::Locator<Type> Inherit;
823
824 // Attributes
825 // **********
826
827 private: GenericLocator<Type> _locator;
828 private: GenericFilter<Type> _filter;
829
830 // Constructors
831 // ************
832
833 public: Locator(const SubSetCollection<Type>& collection, const Filter<Type>& filter)
834 // **********************************************************************************
835 : Inherit(),
836 _locator(collection.getLocator()),
837 _filter(filter)
838 {
839 while (_locator.isValid() && !_filter.accept(_locator.getElement()))
840 _locator.progress();
841 }
842
843 public: Locator(const Collection<Type>& collection, const Filter<Type>& filter)
844 // ****************************************************************************
845 : Inherit(),
846 _locator(collection.getLocator()),
847 _filter(filter)
848 {
849 while (_locator.isValid() && !_filter.accept(_locator.getElement()))
850 _locator.progress();
851 }
852
853 public: Locator(const GenericCollection<Type>& genericCollection, const Filter<Type>& filter)
854 // ******************************************************************************************
855 : Inherit(),
856 _locator(genericCollection.getLocator()),
857 _filter(filter)
858 {
859 while (_locator.isValid() && !_filter.accept(_locator.getElement()))
860 _locator.progress();
861 }
862
863 public: Locator(const GenericLocator<Type>& genericLocator, const Filter<Type>& filter)
864 // ************************************************************************************
865 : Inherit(),
866 _locator(genericLocator),
867 _filter(filter)
868 {
869 while (_locator.isValid() && !_filter.accept(_locator.getElement()))
870 _locator.progress();
871 }
872
873 // Accessors
874 // *********
875
876 public: virtual Type getElement() const
877 // ************************************
878 {
879 return (_locator.isValid()) ? _locator.getElement() : Type();
880 }
881
882 public: virtual Hurricane::Locator<Type>* getClone() const
883 // *******************************************************
884 {
885 return new Locator(_locator, _filter);
886 }
887
888 public: virtual Hurricane::Locator<Type>* getLocator() // 21-10-03
889 // ***************************************************
890 {
891 return ( _locator.getLocator()->getLocator() );
892 }
893
894 // Predicates
895 // **********
896
897 public: virtual bool isValid() const
898 // *********************************
899 {
900 return _locator.isValid();
901 }
902
903 // Updators
904 // ********
905
906 public: virtual void progress()
907 // ****************************
908 {
909 if (_locator.isValid()) {
910 do {
911 _locator.progress();
912 } while (_locator.isValid() && !_filter.accept(_locator.getElement()));
913 }
914 }
915
916 };
917
918// Attributes
919// **********
920
921 private: GenericCollection<Type> _collection;
922 private: GenericFilter<Type> _filter;
923
924// Constructors
925// ************
926
927 public: SubSetCollection()
928 // ***********************
929 : Inherit(),
930 _collection(),
931 _filter()
932 {
933 }
934
935 public: SubSetCollection(const Collection<Type>& collection, const Filter<Type>& filter)
936 // *************************************************************************************
937 : Inherit(),
938 _collection(collection),
939 _filter(filter)
940 {
941 }
942
943 public: SubSetCollection(const SubSetCollection& subSetCollection)
944 // ***************************************************************
945 : Inherit(),
946 _collection(subSetCollection._collection),
947 _filter(subSetCollection._filter)
948 {
949 }
950
951// Operators
952// *********
953
954 public: SubSetCollection& operator=(const SubSetCollection& subSetCollection)
955 // **************************************************************************
956 {
957 _collection = subSetCollection._collection;
958 _filter = subSetCollection._filter;
959 return *this;
960 }
961
962// Accessors
963// *********
964
965 public: virtual Collection<Type>* getClone() const
966 // ***********************************************
967 {
968 return new SubSetCollection(_collection, _filter);
969 }
970
971 public: virtual Hurricane::Locator<Type>* getLocator() const
972 // *********************************************************
973 {
974 return new Locator(_collection, _filter);
975 }
976
977// Accessors
978// *********
979
980 public: virtual string _getString() const
981 // **************************************
982 {
983 return "<" + _TName("SubSetCollection") + " " + getString(_collection) + ">";
984 }
985
986};
987
988
989
990// ****************************************************************************************************
991// Generic functions
992// ****************************************************************************************************
993
994
995
996// ****************************************************************************************************
997// Macros declaration
998// ****************************************************************************************************
999
1000#define end_for\
1001/**************/\
1002 }\
1003 }
1004
1005#define for_each_object(Type, element, collection)\
1006/*************************************************/\
1007{\
1008 GenericLocator<Type> _locator = collection.getLocator();\
1009 while (_locator.isValid()) {\
1010 Type element = _locator.getElement();\
1011 _locator.progress();
1012
1013#define for_each_element(Type, element, collection)\
1014/*************************************************/\
1015{\
1016 ElementCollection<Type>::Locator<Type>* _locator = collection.getLocator();\
1017 while (_locator->isValid()) {\
1018 Type element = _locator->getElement();\
1019 _locator->progress();
1020
1021
1022// -------------------------------------------------------------------
1023// Template Class : "ForEachIterator"
1024
1025
1026template<typename Element>
1027class ForEachIterator {
1028 public:
1029 inline ForEachIterator ( GenericCollection<Element> coll );
1030 inline bool isValid ();
1031 inline Element operator* ();
1032 inline Element operator-> ();
1033 inline ForEachIterator& operator++ (int);
1034 public:
1035 GenericCollection<Element> collection;
1036 GenericLocator<Element> locator;
1037 Element element;
1038};
1039
1040
1041template<typename Element>
1042inline ForEachIterator<Element>::ForEachIterator ( GenericCollection<Element> coll )
1043 : collection(coll)
1044 , locator(collection.getLocator())
1045 , element()
1046{
1047 if ( locator.isValid() ) element = locator.getElement();
1048}
1049
1050
1051template< typename Element >
1052inline bool ForEachIterator<Element>::isValid ()
1053{
1054 if ( locator.isValid() ) element = locator.getElement();
1055 return locator.isValid();
1056}
1057
1058
1059template< typename Element >
1060inline Element ForEachIterator<Element>::operator* ()
1061{
1062 return element;
1063}
1064
1065
1066template< typename Element >
1067inline Element ForEachIterator<Element>::operator-> ()
1068{
1069 return element;
1070}
1071
1072
1073template< typename Element >
1074inline ForEachIterator<Element>& ForEachIterator<Element>::operator++ (int)
1075{
1076 locator.progress ();
1077 return *this;
1078}
1079
1080
1081#define forEach(type,iterator,collection) \
1082 for ( ForEachIterator<type> iterator(collection); iterator.isValid() ; iterator++ )
1083
1084
1085} // End of Hurricane namespace.
1086
1087
1088template<typename Type> inline std::string getString ( Hurricane::Collection<Type>& collection )
1089{ return collection._getString(); }
1090
1091template<typename Type> inline std::string getString ( Hurricane::Collection<Type>* collection )
1092{ return collection->_getString(); }
1093
1094template<typename Type> inline std::string getString ( const Hurricane::Collection<Type>* collection )
1095{ return collection->_getString(); }
1096
1097template<typename Type> inline Hurricane::Record* getRecord ( Hurricane::Collection<Type>& collection )
1098{ return collection._getRecord(); }
1099
1100template<typename Type> inline Hurricane::Record* getRecord ( Hurricane::Collection<Type>* collection )
1101{ return collection->_getRecord(); }
1102
1103template<typename Type> inline Hurricane::Record* getRecord ( const Hurricane::Collection<Type>* collection )
1104{ return collection->_getRecord(); }
1105
1106
1107template<typename Type>
1108inline void jsonWrite ( JsonWriter* w, const std::string& key, Hurricane::GenericCollection<Type> collection )
1109{
1110 if (cdebug.enabled(19))
1111 cdebug_log(19,0) << "jsonWrite< GenericCollection<" << Hurricane::demangle(typeid(Type).name())
1112 << "> >(w,key,coll)" << " key:\"" << key << "\"" << std::endl;
1113 cdebug_tabw(19,1);
1114
1115 w->key( key );
1116 w->startArray();
1117 for ( Type element : collection ) jsonWrite( w, element );
1118 w->endArray();
1119
1120 cdebug_tabw(19,-1);
1121}
1122
1123
1124#include "hurricane/MultisetCollection.h"
1125#include "hurricane/SetCollection.h"
1126#include "hurricane/MapCollection.h"
1127#include "hurricane/MultimapCollection.h"
1128#include "hurricane/ListCollection.h"
1129#include "hurricane/VectorCollection.h"
1130
1131
1132
1133
1134#endif // HURRICANE_COLLECTION
1135
1136
1137// ****************************************************************************************************
1138// Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
1139// ****************************************************************************************************
Collection description (API).
Definition Collection.h:39
GenericCollection< SubType > getSubSet() const
Definition Collection.h:104
virtual unsigned getSize() const
Definition Collection.h:78
virtual Collection< Type > * getClone() const =0
virtual Locator< Type > * getLocator() const =0
virtual ~Collection()
Definition Collection.h:58
Type getFirst() const
Definition Collection.h:91
GenericCollection< Type > getSubSet(const Filter< Type > &filter) const
Definition Collection.h:98
GenericCollection< SubType > getSubSet(const Filter< SubType > &filter) const
Definition Collection.h:111
Filter description (API).
Definition Filter.h:36
Generic Collection auto-pointer.
Definition Collection.h:235
GenericCollection(const Collection< Type > &collection)
Definition Collection.h:258
GenericCollection(Collection< Type > *collection)
Definition Collection.h:272
GenericCollection(const GenericCollection< Type > &genericCollection)
Definition Collection.h:265
Generic Filter auto-pointer.
Definition Filter.h:86
Generic Locator auto-pointer.
Definition Locator.h:113
Locator description (API).
Definition Locator.h:33
virtual ElType getElement() const=0
virtual bool isValid() const=0
virtual Locator< ElType > * getClone() const=0
Applies a Filter to a Collection.
Definition Collection.h:808
SubSetCollection(const Collection< Type > &collection, const Filter< Type > &filter)
Definition Collection.h:935
SubSetCollection(const SubSetCollection &subSetCollection)
Definition Collection.h:943
Applies a Type Filter to a Collection.
Definition Collection.h:476
SubTypeCollection(const GenericCollection< Type > &collection)
Definition Collection.h:587
SubTypeCollection(const Collection< Type > *collection)
Definition Collection.h:580
SubTypeCollection(const SubTypeCollection &subTypeCollection)
Definition Collection.h:594
Contains Almost Everything.
Definition BasicLayer.h:39
string demangle(const char *symbol)


Generated by doxygen 1.16.1 on Return to top of page
Hurricane VLSI Database Copyright © 2000-2020 Bull S.A. All rights reserved