From 3b5a0f5bd2b025c8cf70f37fbf5fee1687f61989 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 8 Jan 2021 12:43:47 +0100 Subject: [PATCH] Again, bug fix in the Inspector support, on getSlot<> template. The policy about how to create slots was not completly clear. Now, only add *pointers* or *references* to class attributes, never do a "copy by value". Reflect that change in SlotTemplate<> various partial specializations. Hammer in your head that in C++ functions templates do not allow for partial specialization. So write only *one* template for ::getSlot<>() (refdefinition simply got ignoreds, at least with gcc). * Bug: In Slot, only one template for getSlot<> (see above). Adjust SlotTemplates<> to provides partial specialization only for: * "const Data&". * "Data*". * "const Data*". * "Data* const" * "Record*". * Bug: In Instance::_getRecord(), suppress slot based on transient values "XCenter" & "YCenter". * Bug: In CRL::ToolEngine::_getRecord(), suppress slot "Name" based on a transient value. * Change: In ::getRecord(std::list*) (and variant), pass all elements to ::getSlot() as (const Element*). --- crlcore/src/ccore/ToolEngine.cpp | 8 +- hurricane/src/hurricane/Instance.cpp | 4 +- hurricane/src/hurricane/JsonObject.cpp | 6 +- hurricane/src/hurricane/Slot.cpp | 3 + hurricane/src/hurricane/hurricane/Commons.h | 30 +-- hurricane/src/hurricane/hurricane/Instance.h | 16 +- hurricane/src/hurricane/hurricane/Slot.h | 200 +++++++++++-------- hurricane/src/viewer/RecordModel.cpp | 40 ++-- 8 files changed, 166 insertions(+), 141 deletions(-) diff --git a/crlcore/src/ccore/ToolEngine.cpp b/crlcore/src/ccore/ToolEngine.cpp index 7f1fb86d..45e18ccf 100644 --- a/crlcore/src/ccore/ToolEngine.cpp +++ b/crlcore/src/ccore/ToolEngine.cpp @@ -268,10 +268,10 @@ namespace CRL { { Record* record = Super::_getRecord(); if ( record ) { - record->add ( getSlot ( "Cell" , _cell ) ); - record->add ( getSlot ( "Name" , getName() ) ); - record->add ( getSlot ( "placementModificationFlag", _placementModificationFlag ) ); - record->add ( getSlot ( "routingModificationFlag" , _routingModificationFlag ) ); + record->add ( getSlot ( "_cell" , _cell ) ); + //record->add ( getSlot ( "Name" , getName() ) ); + record->add ( getSlot ( "_placementModificationFlag", _placementModificationFlag ) ); + record->add ( getSlot ( "_routingModificationFlag" , _routingModificationFlag ) ); } return record; } diff --git a/hurricane/src/hurricane/Instance.cpp b/hurricane/src/hurricane/Instance.cpp index 415920bb..38dfb236 100644 --- a/hurricane/src/hurricane/Instance.cpp +++ b/hurricane/src/hurricane/Instance.cpp @@ -629,8 +629,8 @@ Record* Instance::_getRecord() const record->add(getSlot("MasterCell", _masterCell)); record->add(getSlot("Transformation", &_transformation)); record->add(getSlot("PlacementStatus", &_placementStatus)); - record->add(getSlot("XCenter", DbU::getValueString(getAbutmentBox().getXCenter()))); - record->add(getSlot("YCenter", DbU::getValueString(getAbutmentBox().getYCenter()))); + //record->add(getSlot("XCenter", DbU::getValueString(getAbutmentBox().getXCenter()))); + //record->add(getSlot("YCenter", DbU::getValueString(getAbutmentBox().getYCenter()))); record->add(getSlot("Plugs", &_plugMap)); record->add(getSlot("SharedPathes", &_sharedPathMap)); } diff --git a/hurricane/src/hurricane/JsonObject.cpp b/hurricane/src/hurricane/JsonObject.cpp index e8c67315..bff68811 100644 --- a/hurricane/src/hurricane/JsonObject.cpp +++ b/hurricane/src/hurricane/JsonObject.cpp @@ -32,9 +32,11 @@ // Needed for registering. May be deleted later. #include "hurricane/Initializer.h" #include "hurricane/DebugSession.h" +#include "hurricane/Error.h" #include "hurricane/Warning.h" -#include "hurricane/Library.h" -#include "hurricane/Cell.h" +#include "hurricane/Entity.h" +//#include "hurricane/Library.h" +//#include "hurricane/Cell.h" namespace Hurricane { diff --git a/hurricane/src/hurricane/Slot.cpp b/hurricane/src/hurricane/Slot.cpp index e97217f3..1a3ac1a9 100644 --- a/hurricane/src/hurricane/Slot.cpp +++ b/hurricane/src/hurricane/Slot.cpp @@ -64,4 +64,7 @@ namespace Hurricane { } + void* const Slot::getPData () const + { return NULL; } + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/Commons.h b/hurricane/src/hurricane/hurricane/Commons.h index 550986e1..258545c6 100644 --- a/hurricane/src/hurricane/hurricane/Commons.h +++ b/hurricane/src/hurricane/hurricane/Commons.h @@ -161,10 +161,7 @@ namespace Hurricane { // Note 3: thoses templates manage all POD & STL types. -// Forward declaration of "getSlot<>()" template. - -template inline Hurricane::Slot* getSlot ( std::string name, Data ); -template inline Hurricane::Slot* getSlot ( std::string name, Data* ); +template inline Hurricane::Slot* getSlot ( std::string name, Data ); // ------------------------------------------------------------------- @@ -324,7 +321,10 @@ template<> inline std::string getString ( std::string s ) template inline Hurricane::Record* getRecord ( Data data ) -{ return NULL; } +{ +//std::cerr << "::getRecord(Data) Data=" << Hurricane::demangle(typeid(data).name()) << std::endl; + return NULL; +} // ------------------------------------------------------------------- @@ -485,7 +485,7 @@ inline Hurricane::Record* getRecord ( std::vector* v ) unsigned n = 0; typename std::vector::iterator iterator = v->begin(); while ( iterator != v->end() ) { - record->add ( getSlot(getString(n++), &(*iterator)) ); + record->add ( getSlot(getString(n++), &(*iterator)) ); ++iterator; } } @@ -512,9 +512,9 @@ inline Hurricane::Record* getRecord ( std::vector* v ) if ( !v->empty() ) { record = new Hurricane::Record ( "std::vector*" ); unsigned n = 0; - typename std::vector::iterator iterator = v->begin(); + typename std::vector::iterator iterator = v->begin(); while ( iterator != v->end() ) { - record->add ( getSlot(getString(n++), *iterator) ); + record->add ( getSlot(getString(n++), *iterator) ); ++iterator; } } @@ -543,7 +543,7 @@ inline Hurricane::Record* getRecord ( const std::vector* v ) unsigned n = 0; typename std::vector::const_iterator iterator = v->begin(); while ( iterator != v->end() ) { - record->add ( getSlot(getString(n++), &(*iterator)) ); + record->add ( getSlot(getString(n++), &(*iterator)) ); ++iterator; } } @@ -587,7 +587,7 @@ inline Hurricane::Record* getRecord ( const std::vector* v ) template inline std::string getString ( const std::list* l ) { - std::string name = "const std::list:"; + std::string name = "const std::list*:"; return name + getString(l->size()); } @@ -601,7 +601,7 @@ inline Hurricane::Record* getRecord ( const std::list* l ) unsigned n = 1; typename std::list::const_iterator iterator = l->begin(); while ( iterator != l->end() ) { - record->add ( getSlot(getString(n++), *iterator) ); + record->add ( getSlot(getString(n++), &(*iterator)) ); ++iterator; } } @@ -612,7 +612,7 @@ inline Hurricane::Record* getRecord ( const std::list* l ) template inline std::string getString ( std::list* l ) { - std::string name = "std::list:"; + std::string name = "std::list*:"; return name + getString(l->size()); } @@ -626,7 +626,7 @@ inline Hurricane::Record* getRecord ( std::list* l ) unsigned n = 1; typename std::list::iterator iterator = l->begin(); while ( iterator != l->end() ) { - record->add ( getSlot(getString(n++), *iterator) ); + record->add ( getSlot(getString(n++), &(*iterator)) ); ++iterator; } } @@ -831,12 +831,12 @@ template< typename Element, typename Compare, typename Allocator > inline Hurricane::Record* getRecord ( std::set* s ) { Hurricane::Record* record = NULL; - if ( !s->empty() ) { + if (not s->empty()) { record = new Hurricane::Record ( "std::set" ); unsigned n = 1; typename std::set::iterator iterator = s->begin(); while ( iterator != s->end() ) { - record->add ( getSlot(getString(n++), *iterator) ); + record->add( getSlot(getString(n++), *iterator) ); ++iterator; } } diff --git a/hurricane/src/hurricane/hurricane/Instance.h b/hurricane/src/hurricane/hurricane/Instance.h index 079aa151..d9bdd644 100644 --- a/hurricane/src/hurricane/hurricane/Instance.h +++ b/hurricane/src/hurricane/hurricane/Instance.h @@ -243,14 +243,14 @@ inline Hurricane::Record* getRecord -inline Hurricane::Record* getRecord - ( const Hurricane::Instance::PlacementStatus::Code object ) - { - Hurricane::Record* record = new Hurricane::Record(getString(object)); - record->add(getSlot("Code", (unsigned int)object)); - return record; - } +// template<> +// inline Hurricane::Record* getRecord +// ( const Hurricane::Instance::PlacementStatus::Code object ) +// { +// Hurricane::Record* record = new Hurricane::Record(getString(object)); +// record->add(getSlot("Code", (unsigned int)object)); +// return record; +// } INSPECTOR_P_SUPPORT(Hurricane::Instance); diff --git a/hurricane/src/hurricane/hurricane/Slot.h b/hurricane/src/hurricane/hurricane/Slot.h index 28fb1c89..fd1be3b7 100644 --- a/hurricane/src/hurricane/hurricane/Slot.h +++ b/hurricane/src/hurricane/hurricane/Slot.h @@ -29,13 +29,12 @@ // +-----------------------------------------------------------------+ -#ifndef HURRICANE_SLOT_H -#define HURRICANE_SLOT_H - -#ifndef HURRICANE_COMMONS_H +#ifndef HURRICANE_COMMONS_H #error "Slot.h musn't be included alone, please uses Commons.h." #endif +#ifndef HURRICANE_SLOT_H +#define HURRICANE_SLOT_H namespace Hurricane { @@ -49,31 +48,32 @@ namespace Hurricane { virtual ~Slot (); // Accessors. static size_t getAllocateds (); - const string& getName () const; + string getName () const; virtual string getDataString () const = 0; virtual Record* getDataRecord () const = 0; virtual Slot* getClone () const = 0; + virtual void* const getPData () const; protected: // Internal: Static Attributes. static size_t _allocateds; // Internal: Attributes. - const string _name; + string _name; protected: // Internal: Constructors & Destructors. - Slot ( const string& name ); + Slot ( string name ); }; // Inline Member Functions. - inline Slot::Slot ( const string& name ) : _name(name) + inline Slot::Slot ( string name ) : _name(name) { _allocateds++; //cerr << "Slot::Slot() - " << _name << " " << hex << (void*)this << endl; } - inline const string& Slot::getName () const { return _name; } + inline string Slot::getName () const { return _name; } // ------------------------------------------------------------------- @@ -82,15 +82,15 @@ namespace Hurricane { template class SlotTemplate : public Slot { public: - SlotTemplate ( const string& name, Data data ); - SlotTemplate ( string& name, Data data ); + SlotTemplate ( string name, Data data ); virtual string getDataString () const; virtual Record* getDataRecord () const; virtual SlotTemplate* getClone () const; const Data& getData () const; + virtual void* const getPData () const; protected: - Data _data; + const Data _data; private: SlotTemplate ( const SlotTemplate& ); SlotTemplate& operator= ( const SlotTemplate& ); @@ -99,16 +99,12 @@ namespace Hurricane { // Inline Member Functions. template - SlotTemplate::SlotTemplate ( const string& name, Data data ) + SlotTemplate::SlotTemplate ( string name, Data data ) : Slot(name), _data(data) { - //std::cerr << "SlotTemplate::SlotTemplate() ( \"" << name << "\" )" << std::endl; + //std::cerr << " SlotTemplate::SlotTemplate() ( \"" << name << "\" )" << std::endl; } - template - SlotTemplate::SlotTemplate ( string& name, Data data ) - : Slot(name), _data(data) { } - template string SlotTemplate::getDataString () const { return ::getString(_data); } @@ -126,22 +122,26 @@ namespace Hurricane { return _data; } + template + void* const SlotTemplate::getPData () const + { return (void* const)( &_data ); } + // ------------------------------------------------------------------- -// Class : "SlotTemplate". +// Class : "SlotTemplate". template - class SlotTemplate : public Slot { + class SlotTemplate : public Slot { public: - SlotTemplate ( const string& name, const Data data ); - SlotTemplate ( string& name, const Data data ); + SlotTemplate ( string name, const Data& data ); virtual string getDataString () const; virtual Record* getDataRecord () const; - virtual SlotTemplate* + virtual SlotTemplate* getClone () const; const Data& getData () const; + virtual void* const getPData () const; protected: - const Data _data; + const Data& _data; private: SlotTemplate ( const SlotTemplate& ); SlotTemplate& operator= ( const SlotTemplate& ); @@ -150,45 +150,45 @@ namespace Hurricane { // Inline Member Functions. template - SlotTemplate::SlotTemplate ( const string& name, const Data data ) + SlotTemplate::SlotTemplate ( string name, const Data& data ) : Slot(name), _data(data) { - //std::cerr << "SlotTemplate::SlotTemplate(const Data) ( \"" << name << "\" )" << std::endl; + //std::cerr << " SlotTemplate::SlotTemplate(const Data&) ( \"" << name << "\" )" << std::endl; } template - SlotTemplate::SlotTemplate ( string& name, const Data data ) - : Slot(name), _data(data) { } + string SlotTemplate::getDataString () const { return ::getString(_data); } template - string SlotTemplate::getDataString () const { return ::getString(_data); } + Record* SlotTemplate::getDataRecord () const { return ::getRecord(_data); } template - Record* SlotTemplate::getDataRecord () const { return ::getRecord(_data); } - - template - SlotTemplate* SlotTemplate::getClone () const + SlotTemplate* SlotTemplate::getClone () const { return new SlotTemplate(_name,_data); } template - const Data& SlotTemplate::getData () const + const Data& SlotTemplate::getData () const { return _data; } + template + void* const SlotTemplate::getPData () const + { return (void* const)( &_data ); } + // ------------------------------------------------------------------- -// Class : "SlotTemplate". +// Class : "SlotTemplate". template class SlotTemplate : public Slot { public: - SlotTemplate ( const string& name, Data* data ); - SlotTemplate ( string& name, Data* data ); + SlotTemplate ( string name, Data* data ); virtual string getDataString () const; virtual Record* getDataRecord () const; virtual SlotTemplate* getClone () const; Data* getData () const; + virtual void* const getPData () const; private: SlotTemplate ( const SlotTemplate& ); SlotTemplate& operator= ( const SlotTemplate& ); @@ -199,16 +199,12 @@ namespace Hurricane { // Inline Member Functions. template - SlotTemplate::SlotTemplate ( const string& name, Data* data ) + SlotTemplate::SlotTemplate ( string name, Data* data ) : Slot(name), _data(data) { - //std::cerr << "SlotTemplate::SlotTemplate(Data*) \"" << name << "\"" << std::endl; + //std::cerr << " SlotTemplate::SlotTemplate(Data*) \"" << name << "\"" << std::endl; } - template - SlotTemplate::SlotTemplate ( string& name, Data* data ) - : Slot(name), _data(data) {} - template string SlotTemplate::getDataString () const { return ::getString(_data); } @@ -230,21 +226,81 @@ namespace Hurricane { return _data; } + template + void* const SlotTemplate::getPData () const + { return (void* const)( _data ); } + // ------------------------------------------------------------------- -// Class : "SlotTemplate". +// Class : "SlotTemplate". + + + template + class SlotTemplate : public Slot { + public: + SlotTemplate ( string name, const Data* data ); + virtual string getDataString () const; + virtual Record* getDataRecord () const; + virtual SlotTemplate* + getClone () const; + Data* getData () const; + virtual void* const getPData () const; + private: + SlotTemplate ( const SlotTemplate& ); + SlotTemplate& operator= ( const SlotTemplate& ); + protected: + const Data* _data; + }; + + +// Inline Member Functions. + template + SlotTemplate::SlotTemplate ( string name, const Data* data ) + : Slot(name), _data(data) + { + //std::cerr << " SlotTemplate::SlotTemplate(const Data*) \"" << name << "\"" << std::endl; + } + + template + string SlotTemplate::getDataString () const { return ::getString(_data); } + + template + Record* SlotTemplate::getDataRecord () const + { + //std::cerr << "SlotTemplate::getDataRecord()" << std::endl; + return ::getRecord(_data); + } + + template + SlotTemplate* SlotTemplate::getClone () const + { return new SlotTemplate(_name,_data); } + + template + Data* SlotTemplate::getData () const + { + //std::cerr << "SlotTemplate::getData()" << _data << std::endl; + return _data; + } + + template + void* const SlotTemplate::getPData () const + { return (void* const)( _data ); } + + +// ------------------------------------------------------------------- +// Class : "SlotTemplate". template class SlotTemplate : public Slot { public: - SlotTemplate ( const string& name, Data* const data ); - SlotTemplate ( string& name, Data* const data ); + SlotTemplate ( string name, Data* const data ); virtual string getDataString () const; virtual Record* getDataRecord () const; virtual SlotTemplate* getClone () const; Data* const getData () const; + virtual void* const getPData () const; private: SlotTemplate ( const SlotTemplate& ); SlotTemplate& operator= ( const SlotTemplate& ); @@ -255,16 +311,12 @@ namespace Hurricane { // Inline Member Functions. template - SlotTemplate::SlotTemplate ( const string& name, Data* const data ) + SlotTemplate::SlotTemplate ( string name, Data* const data ) : Slot(name), _data(data) { //std::cerr << "SlotTemplate::SlotTemplate(Data* const) ( \"" << name << "\" )" << std::endl; } - template - SlotTemplate::SlotTemplate ( string& name, Data* const data ) - : Slot(name), _data(data) {} - template string SlotTemplate::getDataString () const { return ::getString(_data); } @@ -279,16 +331,19 @@ namespace Hurricane { Data* const SlotTemplate::getData () const { return _data; } + template + void* const SlotTemplate::getPData () const + { return (void* const)( _data ); } + // ------------------------------------------------------------------- -// Class : "SlotTemplate". +// Class : "SlotTemplate". template<> class SlotTemplate : public Slot { public: - inline SlotTemplate ( const string& name, Record* data ); - inline SlotTemplate ( string& name, Record* data ); + inline SlotTemplate ( string name, Record* data ); inline virtual string getDataString () const; inline virtual Record* getDataRecord () const; inline virtual SlotTemplate* @@ -302,15 +357,12 @@ namespace Hurricane { // Inline Member Functions. - inline SlotTemplate::SlotTemplate ( const string& name, Record* data ) + inline SlotTemplate::SlotTemplate ( string name, Record* data ) : Slot(name), _data(data) { //std::cerr << "SlotTemplate::SlotTemplate(Record*) ( \"" << name << "\" )" << std::endl; } - inline SlotTemplate::SlotTemplate ( string& name, Record* data ) - : Slot(name), _data(data) {} - inline string SlotTemplate::getDataString () const { return _name; } inline Record* SlotTemplate::getDataRecord () const { return _data; } @@ -324,34 +376,10 @@ namespace Hurricane { template inline Hurricane::Slot* getSlot( std::string name, Data d ) { -//std::cerr << "getSlot( \"" << name << "\" )" << std::endl; - return new Hurricane::SlotTemplate ( name, d ); + // std::cerr << "getSlot( \"" << name << "\" )" + // << " Data=" << Hurricane::demangle(typeid(d).name()) << std::endl; + return new Hurricane::SlotTemplate( name, d ); } -template -inline Hurricane::Slot* getSlot( std::string name, Data* d ) -{ -//std::cerr << "getSlot( \"" << name << "\" )" << std::endl; - return new Hurricane::SlotTemplate ( name, d ); -} - - -// template -// inline Hurricane::Slot* getSlot( const std::string& name, Data d ) -// { -// //std::cerr << "getSlot( \"" << name << "\" )" << std::endl; -// //std::cerr << " Data = " << typeid(d).name() << std::endl; -// return new Hurricane::SlotTemplate ( name, d ); -// } - - -// template -// inline Hurricane::Slot* getSlot( const std::string& name, Data* d ) -// { -// //std::cerr << "getSlot( \"" << name << "\" )" << std::endl; -// //std::cerr << " Data = " << typeid(d).name() << std::endl; -// return new Hurricane::SlotTemplate ( name, d ); -// } - -#endif // HURRICANE_SLOT_H +#endif // HURRICANE_SLOT_H diff --git a/hurricane/src/viewer/RecordModel.cpp b/hurricane/src/viewer/RecordModel.cpp index bd590b08..330281a2 100644 --- a/hurricane/src/viewer/RecordModel.cpp +++ b/hurricane/src/viewer/RecordModel.cpp @@ -14,12 +14,11 @@ // +-----------------------------------------------------------------+ -#include -#include - -#include "hurricane/Name.h" -#include "hurricane/viewer/Graphics.h" -#include "hurricane/viewer/RecordModel.h" +#include +#include +#include "hurricane/Name.h" +#include "hurricane/viewer/Graphics.h" +#include "hurricane/viewer/RecordModel.h" namespace Hurricane { @@ -44,34 +43,29 @@ namespace Hurricane { bool RecordModel::setSlot ( Slot* slot, Record* record, size_t depth ) { //cerr << " Slot change" << endl; - emit layoutAboutToBeChanged (); - vector< pair >().swap ( _cache ); + vector< pair >().swap( _cache ); - if ( _slot ) { + if (_slot) { delete _slot; - if ( _depth ) delete _record; + if (_depth) delete _record; } _slot = NULL; _record = NULL; _depth = depth; - - if ( slot == NULL ) { - //cerr << " NULL Slot" << endl; - + if (not slot) { emit layoutChanged (); return false; } // Now supplied by argument. - if ( record == NULL ) { + if (not record) { record = slot->getDataRecord (); //cerr << " New record build" << endl; if ( record == NULL ) { //cerr << " Slot " << slot->getDataString() << " has NULL Record" << endl; - delete slot; emit layoutChanged (); return false; @@ -79,20 +73,18 @@ namespace Hurricane { } //cerr << " New Slot [" << depth << "] " << slot->getDataString() << endl; - _slot = slot; _record = record; _depth = depth; - - Record::SlotVector& slotVector = _record->_getSlotVector(); - Record::SlotVector::iterator islot = slotVector.begin(); - for ( ; islot != slotVector.end() ; islot++ ) { - _cache.push_back ( make_pair(QVariant(getString((*islot)->getName()).c_str()) - ,QVariant((*islot)->getDataString().c_str())) ); + for ( Slot* child : _record->_getSlotVector() ) { + //cerr << "ADD slot to _cache " << child->getPData() << endl; + //cerr << " name= \"" << child->getName() << "\"" << endl; + //cerr << " data= \"" << child->getDataString() << "\"" << endl; + _cache.push_back ( make_pair(QVariant(child->getName().c_str()) + ,QVariant(child->getDataString().c_str())) ); } emit layoutChanged (); - return true; }