From b94d6f836b962e1bd405e79ebb54dcb8d03aaa05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Sat, 10 Aug 2019 15:16:19 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@839 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- main.cpp | 30 ++++++++++++++++++++++++------ src_main/core/piobject.cpp | 11 +++++++++++ src_main/core/piobject.h | 34 ++++++++++++++++++++++++++-------- 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/main.cpp b/main.cpp index 7061219c..05b38edb 100644 --- a/main.cpp +++ b/main.cpp @@ -47,7 +47,7 @@ public: }; class TestSnd: public PIObject { - PIOBJECT_SUBCLASS(TestSnd, PIObject) + PIOBJECT(TestSnd) public: EVENT(reinitSpec) EVENT(coeffsChanged) @@ -58,7 +58,22 @@ public: EVENT(playerValuesReceived) EVENT(calculate) EVENT(autostart) - EVENT(syncOff) + EVENT(syncOff); +}; + +class CA: public PIObject { + PIOBJECT(CA) + EVENT(evA) +}; + +class CB: public CA { + PIOBJECT_SUBCLASS(CB, CA) + EVENT(evB) +}; + +class CC: public CB { + PIOBJECT_SUBCLASS(CC, CB) + EVENT(evC) }; #define CONN(sn) CONNECTU(snd, sn, rec, sn) @@ -91,7 +106,7 @@ int main(int argc, char * argv[]) { CONN(syncOff); // 0.6 us on call - for (int j = 0; j < 10; ++j) { + /*for (int j = 0; j < 10; ++j) { tm.reset(); for (int i = 0; i < 10000; ++i) { snd->reinitSpec(); @@ -100,13 +115,16 @@ int main(int argc, char * argv[]) { } double el = tm.elapsed_m(); piCout << el; - } - - //snd->dump(); + }*/ + piCout << "****"; + PIPeer().dump(); + piCout << "----"; delete snd; delete rec; + return 0; + PIString s; s = "gafaffaf"; piCout << s; diff --git a/src_main/core/piobject.cpp b/src_main/core/piobject.cpp index fc3fe209..b31921f6 100755 --- a/src_main/core/piobject.cpp +++ b/src_main/core/piobject.cpp @@ -541,6 +541,7 @@ bool PIObject::isPIObject(const PIObject * o) { void PIObject::dump(const PIString & line_prefix) const { //printf("dump %s \"%s\"\n", className(), name().data()); PICout(PICoutManipulators::AddNewLine) << line_prefix << "class " << className() << " (" << (const void*)this << ", \"" << name() << "\") {"; + PICout(PICoutManipulators::AddNewLine) << line_prefix << " scope: " << scopeList().join(" -> "); PICout(PICoutManipulators::AddNewLine) << line_prefix << " properties {"; PICout(PICoutManipulators::AddNewLine) << line_prefix << " count: " << properties_.size_s(); //printf("dump %d properties\n", properties_.size()); @@ -621,3 +622,13 @@ bool dumpApplicationToFile(const PIString & path) { return true; } #endif + + + + +void PIObject::__MetaData::addScope(const PIString & s) { + if (!scope_list.contains(s)) { + scope_list << s; + scope_id << __string_id(s); + } +} diff --git a/src_main/core/piobject.h b/src_main/core/piobject.h index 4732839a..c70bf33d 100755 --- a/src_main/core/piobject.h +++ b/src_main/core/piobject.h @@ -203,13 +203,11 @@ virtual const char * className() const {return #name;} \ virtual const uint classNameID() const {static uint ret = __string_id(PIStringAscii(#name)); return ret;} \ private: \ - virtual int ptrOffset() const {name * o = (name*)100; return int(llong((PIObject*)o) - llong(o));} - -#define PIOBJECT_PARENT(name) \ - class __##name##_ParentInitializer__ { \ + virtual int ptrOffset() const {name * o = (name*)100; return int(llong((PIObject*)o) - llong(o));} \ + class __BaseInitializer__ { \ public: \ - __##name##_ParentInitializer__() { \ - uint pid = name::__classNameIDS(); \ + __BaseInitializer__() { \ + uint pid = PIObject::__classNameIDS(); \ if (pid == 0) return; \ uint id = __classNameIDS(); \ PIMutexLocker ml(__meta_mutex()); \ @@ -220,11 +218,30 @@ __MetaData & eh(__meta_data()[id]); \ eh.eh_set << ehp.eh_set; \ eh.eh_func << ehp.eh_func; \ + eh.addScope(__classNameS()); \ + } \ + }; \ + __BaseInitializer__ __base_init__; + +#define PIOBJECT_PARENT(name) \ + class __ParentInitializer__ { \ + public: \ + __ParentInitializer__() { \ + uint pid = name::__classNameIDS(); \ + if (pid == 0) return; \ + uint id = __classNameIDS(); \ + PIMutexLocker ml(__meta_mutex()); \ + __meta_data()[pid]; \ + __MetaData & eh(__meta_data()[id]); \ + if (eh.scope_id.contains(pid)) return; \ + __MetaData & ehp(__meta_data()[pid]); \ + eh.eh_set << ehp.eh_set; \ + eh.eh_func << ehp.eh_func; \ eh.scope_list = ehp.scope_list; \ eh.addScope(__classNameS()); \ } \ }; \ - __##name##_ParentInitializer__ __##name##_parent_init__; \ + __ParentInitializer__ __parent_init__; \ public: \ virtual const char * parentClassName() const {return #name;} \ typedef name __Parent__; \ @@ -749,8 +766,9 @@ public: }; struct __MetaData { __MetaData() {scope_list << PIStringAscii("PIObject");} - void addScope(const PIString & s) {if (!scope_list.contains(s)) scope_list << s;} + void addScope(const PIString & s); PIStringList scope_list; + PISet scope_id; PISet eh_set; PIMap eh_func; };