Hurricane VLSI Database


Commons.h
1 // -*- C++ -*-
2 //
3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
4 //
5 // This file is part of Hurricane.
6 //
7 // Hurricane is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU Lesser General Public License as
9 // 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
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the Lesser GNU General Public
18 // License along with Hurricane. If not, see
19 // <http://www.gnu.org/licenses/>.
20 //
21 // +-----------------------------------------------------------------+
22 // | H U R R I C A N E |
23 // | V L S I B a c k e n d D a t a - B a s e |
24 // | |
25 // | Author : Remy Escassut |
26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
27 // | =============================================================== |
28 // | C++ Header : "./hurricane/Commons.h" |
29 // +-----------------------------------------------------------------+
30 
31 
32 #pragma once
33 #define HURRICANE_COMMONS_H
34 
35 #include <cstdio>
36 #include <cassert>
37 #include <cmath>
38 #include <memory>
39 #include <string>
40 #include <list>
41 #include <set>
42 #include <map>
43 #include <stack>
44 #include <array>
45 #include <vector>
46 #include <iostream>
47 #include <iomanip>
48 #include <fstream>
49 #include <sstream>
50 
51 
52 // +-----------------------------------------------------------------+
53 // | Macros Definition |
54 // +-----------------------------------------------------------------+
55 
56 
57 namespace Hurricane {
58 
59  using namespace std;
60 
61  class Slot;
62 
63 
64  // +-------------------------------------------------------------+
65  // | shared_ptr<> support for DBo |
66  // +-------------------------------------------------------------+
67 
68 
69  template<typename DboType>
70  class DboDestroy {
71  public:
72  inline void operator() ( DboType* dbo ) { dbo->destroy(); }
73  };
74 
75 
76  template<typename DboType>
77  class dbo_ptr : public std::shared_ptr<DboType> {
78  public:
79  dbo_ptr ( DboType* dbo ) : std::shared_ptr<DboType>(dbo,DboDestroy<DboType>()) { }
80  };
81 
82 
83 
84 
85  // +-------------------------------------------------------------+
86  // | Miscellaneous Utilites |
87  // +-------------------------------------------------------------+
88 
89 
90  inline string _TName ( const string& s ) { return s; }
91  inline string _PName ( const string& s ) { return "Hurricane::" + s; }
92 
93  template<class Type>
94  inline Type abs ( const Type& value ) { return (value<0) ? -value : value; }
95 
96  string demangle ( const char* symbol );
97  inline string demangle ( string symbol ) { return demangle(symbol.c_str()); }
98  inline string demangle ( const type_info& info ) { return demangle(info.name()); }
99 
100  template<typename Element>
101  inline void erase_element ( vector<Element*>& v, const Element* e )
102  {
103  for ( auto ielement = v.begin() ; ielement != v.end() ; ++ielement )
104  if (*ielement == e) { v.erase( ielement ); return; }
105  }
106 
107 
108 #if DEPRECATED
109 // For a complete explanation of this function, please look at :
110 // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
111 
112  inline int floatCompare ( float a, float b )
113  {
114  assert ( sizeof(float) == sizeof(int) );
115 
116  if ( a == b ) return 0;
117  return *(int*)&a - *(int*)&b;
118  }
119 
120  inline int floatDifference ( float a, float b, int threshold )
121  {
122  int difference = floatCompare(a,b);
123  if ( abs(difference) < threshold ) return 0;
124 
125  return (difference<0) ? -1 : 1;
126  }
127 
128 
129  inline void floatRound ( float& value, float precision )
130  {
131  float rounded = roundf ( value*precision );
132  value = rounded / precision;
133  }
134 #endif
135 
136  inline float roundfp ( float value, float precision=100.0 ) { return roundf(value*precision)/precision; }
137 
138 
139  template<typename Type> inline void order ( Type& a, Type& b ) { if (a>b) std::swap(a,b); }
140 
141  template<typename Type> inline Type setInBound ( Type lower, Type upper, Type& value )
142  {
143  if (value < lower) value = lower;
144  else if (value > upper) value = upper;
145  return value;
146  }
147 
148 
149 } // End of Hurricane namespace.
150 
151 
152 #include "hurricane/Record.h"
153 
154 
155 // +-----------------------------------------------------------------+
156 // | Functions for Inspector Support |
157 // +-----------------------------------------------------------------+
158 
159 // Note 1: Theses are specialized templates for "getString<>()" & "getRecord<>()".
160 // Note 2: we are outside the Hurricane namespace.
161 // Note 3: thoses templates manage all POD & STL types.
162 
163 
164 template<typename Data> inline Hurricane::Slot* getSlot ( std::string name, Data );
165 
166 
167 // -------------------------------------------------------------------
168 // Inspector Support for : "POD types".
169 
170 // Default match.
171 
172 template<typename Data> inline std::string getString ( Data data )
173 { return std::string("<type ")
174  + Hurricane::demangle(typeid(data).name())
175  + std::string(" unsupported by getString()>"); }
176 
177 // "const &" flavors.
178 
179 template<> inline std::string getString<const bool&> ( const bool& b )
180 { return (b)?"True":"False" ; }
181 
182 template<> inline std::string getString<const int&> ( const int& i )
183 { std::ostringstream os (""); os << i; return os.str(); }
184 
185 template<> inline std::string getString<const long&> ( const long& l )
186 { std::ostringstream os (""); os << l; return os.str(); }
187 
188 template<> inline std::string getString<const unsigned int&> ( const unsigned int& u )
189 { std::ostringstream os (""); os << u; return os.str(); }
190 
191 template<> inline std::string getString<const unsigned long&> ( const unsigned long& ul )
192 { std::ostringstream os (""); os << ul; return os.str(); }
193 
194 template<> inline std::string getString<const unsigned long long&> ( const unsigned long long& ull )
195 { std::ostringstream os (""); os << ull; return os.str(); }
196 
197 template<> inline std::string getString<const unsigned short int&> ( const unsigned short int& us )
198 { std::ostringstream os (""); os << us; return os.str(); }
199 
200 template<> inline std::string getString<const float&> ( const float& f )
201 { std::ostringstream os (""); os << f; return os.str(); }
202 
203 template<> inline std::string getString<const double&> ( const double& d )
204 { std::ostringstream os; os << d; return os.str(); }
205 
206 template<> inline std::string getString<const std::string&> ( const std::string& s )
207 { return s; }
208 
209 // "const *" flavors.
210 
211 template<> inline std::string getString<const bool*> ( const bool* b )
212 { return (*b)?"True":"False" ; }
213 
214 template<> inline std::string getString<const char*> ( const char* c )
215 { return c; }
216 
217 template<> inline std::string getString<const int*> ( const int* i )
218 { std::ostringstream os (""); os << *i; return os.str(); }
219 
220 template<> inline std::string getString<const long*> ( const long* l )
221 { std::ostringstream os (""); os << *l; return os.str(); }
222 
223 template<> inline std::string getString<const unsigned int*> ( const unsigned int* u )
224 { std::ostringstream os (""); os << *u; return os.str(); }
225 
226 template<> inline std::string getString<const unsigned long*> ( const unsigned long* ul )
227 { std::ostringstream os (""); os << *ul; return os.str(); }
228 
229 template<> inline std::string getString<const unsigned long long*> ( const unsigned long long* ull )
230 { std::ostringstream os (""); os << *ull; return os.str(); }
231 
232 template<> inline std::string getString<const unsigned short int*> ( const unsigned short int* us )
233 { std::ostringstream os (""); os << *us; return os.str(); }
234 
235 template<> inline std::string getString<const float*> ( const float* f )
236 { std::ostringstream os (""); os << *f; return os.str(); }
237 
238 template<> inline std::string getString<const double*> ( const double* d )
239 { std::ostringstream os; os << *d; return os.str(); }
240 
241 template<> inline std::string getString<const void*> ( const void* p )
242 { std::ostringstream os ("0x"); os << std::hex << p; return os.str(); }
243 
244 template<> inline std::string getString<const std::string*> ( const std::string* s )
245 { return *s; }
246 
247 
248 // "*" flavors.
249 
250 template<> inline std::string getString<bool*> ( bool* b )
251 { return (*b)?"True":"False" ; }
252 
253 template<> inline std::string getString<char*> ( char* c )
254 { return c; }
255 
256 template<> inline std::string getString<int*> ( int* i )
257 { std::ostringstream os (""); os << *i; return os.str(); }
258 
259 template<> inline std::string getString<long*> ( long* l )
260 { std::ostringstream os (""); os << *l; return os.str(); }
261 
262 template<> inline std::string getString<unsigned int*> ( unsigned int* u )
263 { std::ostringstream os (""); os << *u; return os.str(); }
264 
265 template<> inline std::string getString<unsigned long*> ( unsigned long* ul )
266 { std::ostringstream os (""); os << *ul; return os.str(); }
267 
268 template<> inline std::string getString<unsigned long long*> ( unsigned long long* ull )
269 { std::ostringstream os (""); os << *ull; return os.str(); }
270 
271 template<> inline std::string getString<unsigned short int*> ( unsigned short int* us )
272 { std::ostringstream os (""); os << *us; return os.str(); }
273 
274 template<> inline std::string getString<float*> ( float* f )
275 { std::ostringstream os (""); os << *f; return os.str(); }
276 
277 template<> inline std::string getString<double*> ( double* d )
278 { std::ostringstream os; os << *d; return os.str(); }
279 
280 template<> inline std::string getString<void*> ( void* p )
281 { std::ostringstream os ("0x"); os << std::hex << p; return os.str(); }
282 
283 template<> inline std::string getString<std::string*> ( std::string* s )
284 { return *s; }
285 
286 
287 // "by value" flavors.
288 
289 template<> inline std::string getString<bool> ( bool b )
290 { return (b)?"True":"False" ; }
291 
292 template<> inline std::string getString<char> ( char c )
293 { return std::string(1,c); }
294 
295 template<> inline std::string getString<int> ( int i )
296 { std::ostringstream os (""); os << i; return os.str(); }
297 
298 template<> inline std::string getString<long> ( long l )
299 { std::ostringstream os (""); os << l; return os.str(); }
300 
301 template<> inline std::string getString<unsigned int> ( unsigned int u )
302 { std::ostringstream os (""); os << u; return os.str(); }
303 
304 template<> inline std::string getString<unsigned long> ( unsigned long ul )
305 { std::ostringstream os (""); os << ul; return os.str(); }
306 
307 template<> inline std::string getString<unsigned long long> ( unsigned long long ull )
308 { std::ostringstream os (""); os << ull; return os.str(); }
309 
310 template<> inline std::string getString<unsigned short int> ( unsigned short int us )
311 { std::ostringstream os (""); os << us; return os.str(); }
312 
313 template<> inline std::string getString<float> ( float f )
314 { std::ostringstream os (""); os << f; return os.str(); }
315 
316 template<> inline std::string getString<double> ( double d )
317 { std::ostringstream os; os << d; return os.str(); }
318 
319 template<> inline std::string getString<std::string> ( std::string s )
320 { return s; }
321 
322 
323 template<typename Data> inline Hurricane::Record* getRecord ( Data data )
324 {
325 //std::cerr << "::getRecord(Data) Data=" << Hurricane::demangle(typeid(data).name()) << std::endl;
326  return NULL;
327 }
328 
329 
330 // -------------------------------------------------------------------
331 // Inspector Support for : "[const] std::pair<T,U>&".
332 
333 template<typename T, typename U>
334 inline std::string getString ( const std::pair<T,U>& p )
335 {
336  return "const std::pair<T,U>";
337 }
338 
339 
340 template<typename T, typename U>
341 inline Hurricane::Record* getRecord ( const std::pair<T,U>& p )
342 {
343  Hurricane::Record* record = NULL;
344  record = new Hurricane::Record ( "const std::pair<T,U>" );
345  record->add( getSlot<const T>(std::string("first" ), &p.first ) );
346  record->add( getSlot<const U>(std::string("second"), &p.second) );
347  return record;
348 }
349 
350 
351 template<typename T, typename U>
352 inline std::string getString ( std::pair<T,U>& p )
353 {
354  return "std::pair<T,U>";
355 }
356 
357 
358 template<typename T, typename U>
359 inline Hurricane::Record* getRecord ( std::pair<T,U>& p )
360 {
361  Hurricane::Record* record = NULL;
362  record = new Hurricane::Record ( "std::pair<T,U>" );
363  record->add( getSlot<T>(std::string("first" ), &p.first ) );
364  record->add( getSlot<U>(std::string("second"), &p.second) );
365  return record;
366 }
367 
368 
369 // -------------------------------------------------------------------
370 // Inspector Support for : "[const] std::array<Element>*".
371 
372 
373 template<typename Element,size_t N>
374 inline std::string getString ( std::array<Element,N>* v )
375 {
376  std::string name = "const std::array<Element,N>:";
377  return name + getString<size_t>(v->size());
378 }
379 
380 
381 template<typename Element,size_t N>
382 inline Hurricane::Record* getRecord ( std::array<Element,N>* v )
383 {
384  Hurricane::Record* record = NULL;
385  if ( !v->empty() ) {
386  record = new Hurricane::Record ( "std::array<Element,N>" );
387  unsigned n = 0;
388  typename std::array<Element,N>::iterator iterator = v->begin();
389  while ( iterator != v->end() ) {
390  record->add ( getSlot<Element>(getString(n++), *iterator) );
391  ++iterator;
392  }
393  }
394  return record;
395 }
396 
397 
398 template<typename Element,size_t N>
399 inline std::string getString ( const std::array<Element,N>* v )
400 {
401  std::string name = "const std::array<Element,N>:";
402  return name + getString<size_t>(v->size());
403 }
404 
405 
406 template<typename Element,size_t N>
407 inline Hurricane::Record* getRecord ( const std::array<Element,N>* v )
408 {
409  Hurricane::Record* record = NULL;
410  if ( !v->empty() ) {
411  record = new Hurricane::Record ( "const std::array<Element,N>" );
412  unsigned n = 0;
413  typename std::array<Element,N>::const_iterator iterator = v->begin();
414  while ( iterator != v->end() ) {
415  record->add ( getSlot<const Element>(getString(n++), *iterator) );
416  ++iterator;
417  }
418  }
419  return record;
420 }
421 
422 
423 template<typename Element,size_t N>
424 inline std::string getString ( std::array<Element,N>& v )
425 {
426  std::string name = "std::array<Element,N>&:";
427  return name + getString<size_t>(v.size());
428 }
429 
430 
431 template<typename Element,size_t N>
432 inline Hurricane::Record* getRecord ( std::array<Element,N>& v )
433 {
434  Hurricane::Record* record = NULL;
435  if (not v.empty()) {
436  record = new Hurricane::Record ( "std::array<Element,N>&" );
437  unsigned n = 0;
438  for ( auto element : v )
439  record->add( getSlot<Element>(getString(n++), element) );
440  }
441  return record;
442 }
443 
444 
445 template<typename Element,size_t N>
446 inline std::string getString ( const std::array<Element,N>& v )
447 {
448  std::string name = "const std::array<Element,N>&:";
449  return name + getString<size_t>(v.size());
450 }
451 
452 
453 template<typename Element,size_t N>
454 inline Hurricane::Record* getRecord ( const std::array<Element,N>& v )
455 {
456  Hurricane::Record* record = NULL;
457  if (not v.empty()) {
458  record = new Hurricane::Record ( "const std::array<Element,N>&" );
459  unsigned n = 0;
460  for ( auto element : v )
461  record->add( getSlot<Element>(getString(n++), element) );
462  }
463  return record;
464 }
465 
466 
467 // -------------------------------------------------------------------
468 // Inspector Support for : "std::vector<Element>*".
469 
470 
471 template<typename Element>
472 inline std::string getString ( std::vector<Element>* v )
473 {
474  std::string name = "std::vector<Element>*:";
475  return name + getString<size_t>(v->size());
476 }
477 
478 
479 template<typename Element>
480 inline Hurricane::Record* getRecord ( std::vector<Element>* v )
481 {
482  Hurricane::Record* record = NULL;
483  if ( !v->empty() ) {
484  record = new Hurricane::Record ( "std::vector<Element>*" );
485  unsigned n = 0;
486  typename std::vector<Element>::iterator iterator = v->begin();
487  while ( iterator != v->end() ) {
488  record->add ( getSlot<const Element*>(getString(n++), &(*iterator)) );
489  ++iterator;
490  }
491  }
492  return record;
493 }
494 
495 
496 // -------------------------------------------------------------------
497 // Inspector Support for : "std::vector<Element*>*".
498 
499 
500 template<typename Element>
501 inline std::string getString ( std::vector<Element*>* v )
502 {
503  std::string name = "std::vector<Element*>*:";
504  return name + getString<size_t>(v->size());
505 }
506 
507 
508 template<typename Element>
509 inline Hurricane::Record* getRecord ( std::vector<Element*>* v )
510 {
511  Hurricane::Record* record = NULL;
512  if ( !v->empty() ) {
513  record = new Hurricane::Record ( "std::vector<Element*>*" );
514  unsigned n = 0;
515  typename std::vector<Element*>::iterator iterator = v->begin();
516  while ( iterator != v->end() ) {
517  record->add ( getSlot<Element*>(getString(n++), *iterator) );
518  ++iterator;
519  }
520  }
521  return record;
522 }
523 
524 
525 // -------------------------------------------------------------------
526 // Inspector Support for : "const std::vector<Element>*".
527 
528 
529 template<typename Element>
530 inline std::string getString ( const std::vector<Element>* v )
531 {
532  std::string name = "const std::vector<Element>*:";
533  return name + getString<size_t>(v->size());
534 }
535 
536 
537 template<typename Element>
538 inline Hurricane::Record* getRecord ( const std::vector<Element>* v )
539 {
540  Hurricane::Record* record = NULL;
541  if ( !v->empty() ) {
542  record = new Hurricane::Record ( "const std::vector<Element>*" );
543  unsigned n = 0;
544  typename std::vector<Element>::const_iterator iterator = v->begin();
545  while ( iterator != v->end() ) {
546  record->add ( getSlot<const Element*>(getString(n++), &(*iterator)) );
547  ++iterator;
548  }
549  }
550  return record;
551 }
552 
553 
554 // -------------------------------------------------------------------
555 // Inspector Support for : "const std::vector<Element*>*".
556 
557 
558 template<typename Element>
559 inline std::string getString ( const std::vector<Element*>* v )
560 {
561  std::string name = "const std::vector<Element*>*:";
562  return name + getString<size_t>(v->size());
563 }
564 
565 
566 template<typename Element>
567 inline Hurricane::Record* getRecord ( const std::vector<Element*>* v )
568 {
569  Hurricane::Record* record = NULL;
570  if (not v->empty()) {
571  record = new Hurricane::Record ( "const std::vector<Element*>*" );
572  size_t n = 0;
573  typename std::vector<Element*>::const_iterator iterator = v->begin();
574  while (iterator != v->end()) {
575  record->add ( getSlot<const Element*>(getString(n++), *iterator) );
576  ++iterator;
577  }
578  }
579  return record;
580 }
581 
582 
583 // -------------------------------------------------------------------
584 // Inspector Support for : "const std::list<Element>*".
585 
586 
587 template<typename Element>
588 inline std::string getString ( const std::list<Element>* l )
589 {
590  std::string name = "const std::list<Element>*:";
591  return name + getString<size_t>(l->size());
592 }
593 
594 
595 template<typename Element>
596 inline Hurricane::Record* getRecord ( const std::list<Element>* l )
597 {
598  Hurricane::Record* record = NULL;
599  if ( !l->empty() ) {
600  record = new Hurricane::Record ( "const std::list<Element>" );
601  unsigned n = 1;
602  typename std::list<Element>::const_iterator iterator = l->begin();
603  while ( iterator != l->end() ) {
604  record->add ( getSlot<const Element*>(getString(n++), &(*iterator)) );
605  ++iterator;
606  }
607  }
608  return record;
609 }
610 
611 
612 template<typename Element>
613 inline std::string getString ( std::list<Element>* l )
614 {
615  std::string name = "std::list<Element>*:";
616  return name + getString<size_t>(l->size());
617 }
618 
619 
620 template<typename Element>
621 inline Hurricane::Record* getRecord ( std::list<Element>* l )
622 {
623  Hurricane::Record* record = NULL;
624  if ( !l->empty() ) {
625  record = new Hurricane::Record ( "std::list<Element>" );
626  unsigned n = 1;
627  typename std::list<Element>::iterator iterator = l->begin();
628  while ( iterator != l->end() ) {
629  record->add ( getSlot<const Element*>(getString(n++), &(*iterator)) );
630  ++iterator;
631  }
632  }
633  return record;
634 }
635 
636 
637 // -------------------------------------------------------------------
638 // Inspector Support for : "[const] std::map<Key,Element,Compare>*.
639 
640 
641 template<typename Key, typename Element>
642 inline std::string getString ( std::map<Key,Element>* m )
643 {
644  std::string name = "std::map<Element>:";
645  return name + getString<size_t>(m->size());
646 }
647 
648 
649 template<typename Key, typename Element>
650 inline Hurricane::Record* getRecord ( std::map<Key,Element>* m )
651 {
652  Hurricane::Record* record = NULL;
653  if ( !m->empty() ) {
654  record = new Hurricane::Record ( "std::map<Element>" );
655  typename std::map<Key,Element>::iterator iterator = m->begin();
656  while ( iterator != m->end() ) {
657  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
658  ++iterator;
659  }
660  }
661  return record;
662 }
663 
664 
665 template<typename Key, typename Element>
666 inline std::string getString ( const std::map<Key,Element>* m )
667 {
668  std::string name = "const std::map<Element>:";
669  return name + getString<size_t>(m->size());
670 }
671 
672 
673 template<typename Key, typename Element>
674 inline Hurricane::Record* getRecord ( const std::map<Key,Element>* m )
675 {
676  Hurricane::Record* record = NULL;
677  if ( !m->empty() ) {
678  record = new Hurricane::Record ( "const std::map<Element>" );
679  typename std::map<Key,Element>::const_iterator iterator = m->begin();
680  while ( iterator != m->end() ) {
681  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
682  ++iterator;
683  }
684  }
685  return record;
686 }
687 
688 
689 // -------------------------------------------------------------------
690 // Inspector Support for : "[const] std::map<Key,Element,Compare>*.
691 
692 
693 template<typename Key, typename Element, typename Compare>
694 inline std::string getString ( std::map<Key,Element,Compare>* m )
695 {
696  std::string name = "std::map<Element>:";
697  return name + getString<size_t>(m->size());
698 }
699 
700 
701 template<typename Key, typename Element, typename Compare>
702 inline Hurricane::Record* getRecord ( std::map<Key,Element,Compare>* m )
703 {
704  Hurricane::Record* record = NULL;
705  if ( !m->empty() ) {
706  record = new Hurricane::Record ( "std::map<Element>" );
707  typename std::map<Key,Element,Compare>::iterator iterator = m->begin();
708  while ( iterator != m->end() ) {
709  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
710  ++iterator;
711  }
712  }
713  return record;
714 }
715 
716 
717 template<typename Key, typename Element, typename Compare>
718 inline std::string getString ( const std::map<Key,Element,Compare>* m )
719 {
720  std::string name = "const std::map<Element>:";
721  return name + getString<size_t>(m->size());
722 }
723 
724 
725 template<typename Key, typename Element, typename Compare>
726 inline Hurricane::Record* getRecord ( const std::map<Key,Element,Compare>* m )
727 {
728  Hurricane::Record* record = NULL;
729  if ( !m->empty() ) {
730  record = new Hurricane::Record ( "const std::map<Element>" );
731  typename std::map<Key,Element,Compare>::const_iterator iterator = m->begin();
732  while ( iterator != m->end() ) {
733  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
734  ++iterator;
735  }
736  }
737  return record;
738 }
739 
740 
741 // -------------------------------------------------------------------
742 // Inspector Support for : "const std::multimap<Key,Element,Compare>*".
743 
744 
745 template<typename Key, typename Element, typename Compare>
746 inline std::string getString ( const std::multimap<Key,Element,Compare>* m )
747 {
748  std::string name = "const std::multimap<Element>:";
749  return name + getString<size_t>(m->size());
750 }
751 
752 
753 template<typename Key, typename Element, typename Compare>
754 inline Hurricane::Record* getRecord ( const std::multimap<Key,Element,Compare>* m )
755 {
756  Hurricane::Record* record = NULL;
757  if ( !m->empty() ) {
758  record = new Hurricane::Record ( "const std::multimap<Element>" );
759  typename std::multimap<Key,Element,Compare>::const_iterator iterator = m->begin();
760  while ( iterator != m->end() ) {
761  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
762  ++iterator;
763  }
764  }
765  return record;
766 }
767 
768 
769 template<typename Key, typename Element, typename Compare>
770 inline std::string getString ( std::multimap<Key,Element,Compare>* m )
771 {
772  std::string name = "std::multimap<Element>:";
773  return name + getString<size_t>(m->size());
774 }
775 
776 
777 template<typename Key, typename Element, typename Compare>
778 inline Hurricane::Record* getRecord ( std::multimap<Key,Element,Compare>* m )
779 {
780  Hurricane::Record* record = NULL;
781  if ( !m->empty() ) {
782  record = new Hurricane::Record ( "std::multimap<Element>" );
783  typename std::multimap<Key,Element,Compare>::iterator iterator = m->begin();
784  while ( iterator != m->end() ) {
785  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
786  ++iterator;
787  }
788  }
789  return record;
790 }
791 
792 
793 // -------------------------------------------------------------------
794 // Inspector Support for : "[const] std::set<Element,Compare>*".
795 
796 
797 template<typename Element, typename Compare>
798 inline std::string getString ( const std::set<Element,Compare>* s )
799 {
800  std::string name = "const std::set<Element>:";
801  return name + getString<size_t>(s->size());
802 }
803 
804 
805 template<typename Element, typename Compare>
806 inline Hurricane::Record* getRecord ( const std::set<Element,Compare>* s )
807 {
808  Hurricane::Record* record = NULL;
809  if ( !s->empty() ) {
810  record = new Hurricane::Record ( "const std::set<Element>" );
811  unsigned n = 1;
812  typename std::set<Element,Compare>::const_iterator iterator = s->begin();
813  while ( iterator != s->end() ) {
814  record->add ( getSlot<const Element>(getString(n++), *iterator) );
815  ++iterator;
816  }
817  }
818  return record;
819 }
820 
821 
822 template< typename Element, typename Compare, typename Allocator >
823 inline std::string getString ( std::set<Element,Compare,Allocator>* s )
824 {
825  std::string name = "std::set<Element>:";
826  return name + getString<size_t>(s->size());
827 }
828 
829 
830 template< typename Element, typename Compare, typename Allocator >
831 inline Hurricane::Record* getRecord ( std::set<Element,Compare,Allocator>* s )
832 {
833  Hurricane::Record* record = NULL;
834  if (not s->empty()) {
835  record = new Hurricane::Record ( "std::set<Element>" );
836  unsigned n = 1;
837  typename std::set<Element,Compare,Allocator>::iterator iterator = s->begin();
838  while ( iterator != s->end() ) {
839  record->add( getSlot<Element>(getString(n++), *iterator) );
840  ++iterator;
841  }
842  }
843  return record;
844 }
845 
846 // -------------------------------------------------------------------
847 // Inspector Support for : "[const] std::set<Element,Compare>&".
848 
849 
850 template<typename Element, typename Compare>
851 inline std::string getString ( const std::set<Element,Compare>& s )
852 {
853  std::string name = "const std::set<Element>:";
854  return name + getString<size_t>(s.size());
855 }
856 
857 
858 template<typename Element, typename Compare>
859 inline Hurricane::Record* getRecord ( const std::set<Element,Compare>& s )
860 {
861  Hurricane::Record* record = NULL;
862  if ( !s.empty() ) {
863  record = new Hurricane::Record ( "const std::set<Element>" );
864  unsigned n = 1;
865  typename std::set<Element,Compare>::const_iterator iterator = s.begin();
866  while ( iterator != s.end() ) {
867  record->add ( getSlot<Element>(getString(n++), *iterator) );
868  ++iterator;
869  }
870  }
871  return record;
872 }
873 
874 // -------------------------------------------------------------------
875 // Inspector Support for : "const std::multiset<Element,Compare>*".
876 
877 
878 template<typename Element, typename Compare>
879 inline std::string getString ( const std::multiset<Element,Compare>* s )
880 {
881  std::string name = "std::multiset<Element>:";
882  return name + getString<size_t>(s->size());
883 }
884 
885 
886 template<typename Element, typename Compare>
887 inline Hurricane::Record* getRecord ( const std::multiset<Element,Compare>* s )
888 {
889  Hurricane::Record* record = NULL;
890  if ( !s->empty() ) {
891  record = new Hurricane::Record ( "std::multiset<Element>" );
892  unsigned n = 1;
893  typename std::multiset<Element,Compare>::const_iterator iterator = s->begin();
894  while ( iterator != s->end() ) {
895  record->add ( getSlot<Element>(getString(n++), *iterator) );
896  ++iterator;
897  }
898  }
899  return record;
900 }
901 
902 
903 # define GETSTRING_POINTER_SUPPORT(Data) \
904  template<> inline std::string getString<Data*>( Data* data ) \
905  { \
906  if (!data) return "NULL [" #Data "]"; \
907  return data->_getString(); \
908  } \
909  \
910  template<> inline std::string getString<const Data*>( const Data* data ) \
911  { if (!data) return "NULL [const " #Data "]"; return data->_getString(); }
912 
913 
914 # define IOSTREAM_POINTER_SUPPORT(Data) \
915  inline std::ostream& operator<< ( std::ostream& o, Data* d ) \
916  { \
917  if (!d) return o << "NULL [" #Data "]"; \
918  return o << "&" << getString<const Data*>(d); \
919  } \
920  inline std::ostream& operator<< ( std::ostream& o, const Data* d ) \
921  { \
922  if (!d) return o << "NULL [const " #Data "]"; \
923  return o << "&" << getString<const Data*>(d); \
924  } \
925 
926 
927 # define GETRECORD_POINTER_SUPPORT(Data) \
928  template<> inline Hurricane::Record* getRecord<Data*>( Data* data ) \
929  { if (!data) return NULL; return data->_getRecord(); } \
930  \
931  template<> inline Hurricane::Record* getRecord<const Data*>( const Data* data ) \
932  { if (!data) return NULL; return data->_getRecord(); }
933 
934 
935 # define GETSTRING_REFERENCE_SUPPORT(Data) \
936  template<> inline std::string getString<Data&>( Data& data ) \
937  { return data._getString(); } \
938  \
939  template<> inline std::string getString<const Data&>( const Data& data ) \
940  { return data._getString(); }
941 
942 
943 # define IOSTREAM_REFERENCE_SUPPORT(Data) \
944  inline std::ostream& operator<< ( std::ostream& o, Data& d ) \
945  { return o << getString<Data&>(d); } \
946  \
947  inline std::ostream& operator<< ( std::ostream& o, const Data& d ) \
948  { return o << getString<const Data&>(d); } \
949  \
950 
951 # define GETRECORD_REFERENCE_SUPPORT(Data) \
952  template<> inline Hurricane::Record* getRecord<Data&>( Data& data ) \
953  { return data._getRecord(); } \
954  \
955  template<> inline Hurricane::Record* getRecord<const Data&>( const Data& data ) \
956  { return data._getRecord(); }
957 
958 
959 # define GETSTRING_VALUE_SUPPORT(Data) \
960  template<> inline std::string getString<Data>( Data data ) \
961  { return data._getString(); }
962 
963 
964 # define IOSTREAM_VALUE_SUPPORT(Data) \
965  inline std::ostream& operator<< ( std::ostream& o, Data d ) \
966  { return o << getString<Data>(d); }
967 
968 
969 # define GETRECORD_VALUE_SUPPORT(Data) \
970  template<> inline Hurricane::Record* getRecord<Data>( Data data ) \
971  { return data._getRecord(); }
972 
973 
974 # define INSPECTOR_P_SUPPORT(Data) \
975  GETRECORD_POINTER_SUPPORT(Data) \
976  GETSTRING_POINTER_SUPPORT(Data) \
977  IOSTREAM_POINTER_SUPPORT(Data)
978 
979 
980 # define INSPECTOR_R_SUPPORT(Data) \
981  GETRECORD_REFERENCE_SUPPORT(Data) \
982  GETSTRING_REFERENCE_SUPPORT(Data) \
983  IOSTREAM_REFERENCE_SUPPORT(Data)
984 
985 
986 # define INSPECTOR_PR_SUPPORT(Data) \
987  GETSTRING_POINTER_SUPPORT(Data) \
988  GETSTRING_REFERENCE_SUPPORT(Data) \
989  GETSTRING_VALUE_SUPPORT(Data) \
990  IOSTREAM_POINTER_SUPPORT(Data) \
991  IOSTREAM_REFERENCE_SUPPORT(Data) \
992  GETRECORD_POINTER_SUPPORT(Data) \
993  GETRECORD_REFERENCE_SUPPORT(Data)
994 
995 
996 # define INSPECTOR_PV_SUPPORT(Data) \
997  GETSTRING_POINTER_SUPPORT(Data) \
998  GETSTRING_VALUE_SUPPORT(Data) \
999  IOSTREAM_POINTER_SUPPORT(Data) \
1000  IOSTREAM_VALUE_SUPPORT(Data) \
1001  GETRECORD_POINTER_SUPPORT(Data) \
1002  GETRECORD_VALUE_SUPPORT(Data)
1003 
1004 
1005 #include "hurricane/Tabulation.h"
1006 
1007 
1008 // -------------------------------------------------------------------
1009 // Class : "::cdebug()".
1010 //
1011 // Wrapper around the STL ostream which to print debugging messages.
1012 
1013 class tstream : public std::ostream {
1014  public:
1015  inline int getMinLevel () const;
1016  inline int getMaxLevel () const;
1017  inline int setMinLevel ( int );
1018  inline int setMaxLevel ( int );
1019  inline int getLevel () const;
1020  inline int setLevel ( int );
1021  inline bool enabled () const;
1022  inline bool enabled ( int ) const;
1023  inline tstream& log ( int level, int count=0 );
1024  inline tstream& tabw ( int level, int count );
1025  inline tstream ( std::ostream & );
1026  inline tstream& put ( char c );
1027  inline tstream& flush ();
1028  private:
1029  inline tstream& _tab ();
1030  inline tstream& _tabw ( int count );
1031  public:
1032  // Overload for manipulators.
1033  inline tstream& operator<< ( std::ostream& (*pf)(std::ostream &) );
1034  private:
1035  int _minLevel;
1036  int _maxLevel;
1037  int _level;
1038  Hurricane::Tabulation _tabulation;
1039 };
1040 
1041 
1042 inline tstream::tstream ( std::ostream& s )
1043  : std::ostream(s.rdbuf())
1044  , _minLevel (100000)
1045  , _maxLevel (0)
1046  , _level (0)
1047  , _tabulation(" ")
1048 { }
1049 
1050 inline int tstream::getMinLevel () const { return _minLevel; }
1051 inline int tstream::getMaxLevel () const { return _maxLevel; }
1052 inline int tstream::setMinLevel ( int l ) { int pl=_minLevel; _minLevel=l; return pl; }
1053 inline int tstream::setMaxLevel ( int l ) { int pl=_maxLevel; _maxLevel=l; return pl; }
1054 inline int tstream::getLevel () const { return _level; }
1055 inline int tstream::setLevel ( int l ) { int pl=_level; _level=l; return pl; }
1056 inline bool tstream::enabled () const { return (_level >= _minLevel) and (_level < _maxLevel); }
1057 inline bool tstream::enabled ( int l ) const { return (l >= _minLevel) and (l < _maxLevel); }
1058 inline tstream& tstream::tabw ( int level, int count ) { setLevel(level); return _tabw(count); }
1059 inline tstream& tstream::put ( char c ) { if (enabled()) static_cast<std::ostream*>(this)->put(c); return *this; }
1060 inline tstream& tstream::flush () { if (enabled()) static_cast<std::ostream*>(this)->flush(); return *this; }
1061 inline tstream& tstream::operator<< ( std::ostream& (*pf)(std::ostream&) ) { if (enabled()) (*pf)(*this); return *this; }
1062 
1063 
1064 inline tstream& tstream::_tab () { if (enabled()) (*this) << _tabulation; return *this; }
1065 inline tstream& tstream::_tabw ( int count )
1066 {
1067  if (enabled()) {
1068  if (count > 0) while(count--) _tabulation++;
1069  else if (count < 0) while(count++) _tabulation--;
1070  }
1071  return *this;
1072 }
1073 
1074 inline tstream& tstream::log ( int level, int count )
1075 { setLevel(level); _tab(); return _tabw(count); }
1076 
1077 // For STL Types.
1078 inline tstream& operator<< ( tstream& o, const std::string s )
1079 { if (o.enabled()) { static_cast<std::ostream&>(o) << s; } return o; };
1080 
1081 // For POD Types.
1082 // template<typename T>
1083 // inline tstream& operator<< ( tstream& o, T& t )
1084 // { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T&>(t); } return o; };
1085 
1086 template<typename T>
1087 inline tstream& operator<< ( tstream& o, T* t )
1088 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T*>(t); } return o; };
1089 
1090 // template<typename T>
1091 // inline tstream& operator<< ( tstream& o, const T& t )
1092 // { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<const T&>(t); } return o; };
1093 
1094 template<typename T>
1095 inline tstream& operator<< ( tstream& o, T t )
1096 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T>(t); } return o; };
1097 
1098 template<typename T>
1099 inline tstream& operator<< ( tstream& o, const T* t )
1100 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<const T*>(t); } return o; };
1101 
1102 template<>
1103 inline tstream& operator<< ( tstream& o, std::ios_base& (*pf)(std::ios_base&) )
1104 { if (o.enabled()) { static_cast<std::ostream&>(o) << pf; } return o; };
1105 
1106 struct _Tsetw { int n_; };
1107 inline _Tsetw tsetw ( int n ) { return { n }; }
1108 
1109 struct _Tsetf { int n_; };
1110 inline _Tsetf tsetf ( int n ) { return { n }; }
1111 
1112 template<>
1113 inline tstream& operator<< ( tstream& o, _Tsetw manip )
1114 { if (o.enabled()) { static_cast<std::ostream&>(o) << std::setw(manip.n_); } return o; }
1115 
1116 extern tstream cdebug;
1117 
1118 
1119 #define cdebug_log(level,indent) if (cdebug.enabled(level)) cdebug.log(level,indent)
1120 #define cdebug_tabw(level,indent) cdebug.tabw(level,indent)
1121 
1122 
1123 // x-----------------------------------------------------------------x
1124 // | Classes Neededs in All Hurricane Modules |
1125 // x-----------------------------------------------------------------x
1126 
1127 #include "hurricane/Slot.h"
1128 #include "hurricane/Initializer.h"
1129 #include "hurricane/JsonWriter.h"
1130 #include "hurricane/JsonObject.h"
Tabulation description (API)
Definition: Tabulation.h:35
Trace & indentation enabled stream.
Definition: Commons.h:1013
bool enabled() const
Definition: Commons.h:1056
int getLevel() const
Definition: Commons.h:1054
int setMinLevel(int)
Definition: Commons.h:1052
tstream & log(int level, int count=0)
Definition: Commons.h:1074
int setLevel(int)
Definition: Commons.h:1055
tstream & tabw(int level, int count)
Definition: Commons.h:1058
int setMaxLevel(int)
Definition: Commons.h:1053
int getMinLevel() const
Definition: Commons.h:1050
int getMaxLevel() const
Definition: Commons.h:1051
The namespace dedicated to Hurricane.
Definition: Generalities.dox:5
string demangle(const char *symbol)


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