git-svn-id: svn://db.shs.com.ru/pip@839 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2019-08-10 15:16:19 +00:00
parent 21fdf74ec0
commit b94d6f836b
3 changed files with 61 additions and 14 deletions

View File

@@ -47,7 +47,7 @@ public:
}; };
class TestSnd: public PIObject { class TestSnd: public PIObject {
PIOBJECT_SUBCLASS(TestSnd, PIObject) PIOBJECT(TestSnd)
public: public:
EVENT(reinitSpec) EVENT(reinitSpec)
EVENT(coeffsChanged) EVENT(coeffsChanged)
@@ -58,7 +58,22 @@ public:
EVENT(playerValuesReceived) EVENT(playerValuesReceived)
EVENT(calculate) EVENT(calculate)
EVENT(autostart) 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) #define CONN(sn) CONNECTU(snd, sn, rec, sn)
@@ -91,7 +106,7 @@ int main(int argc, char * argv[]) {
CONN(syncOff); CONN(syncOff);
// 0.6 us on call // 0.6 us on call
for (int j = 0; j < 10; ++j) { /*for (int j = 0; j < 10; ++j) {
tm.reset(); tm.reset();
for (int i = 0; i < 10000; ++i) { for (int i = 0; i < 10000; ++i) {
snd->reinitSpec(); snd->reinitSpec();
@@ -100,13 +115,16 @@ int main(int argc, char * argv[]) {
} }
double el = tm.elapsed_m(); double el = tm.elapsed_m();
piCout << el; piCout << el;
} }*/
piCout << "****";
//snd->dump(); PIPeer().dump();
piCout << "----";
delete snd; delete snd;
delete rec; delete rec;
return 0;
PIString s; PIString s;
s = "gafaffaf"; s = "gafaffaf";
piCout << s; piCout << s;

View File

@@ -541,6 +541,7 @@ bool PIObject::isPIObject(const PIObject * o) {
void PIObject::dump(const PIString & line_prefix) const { void PIObject::dump(const PIString & line_prefix) const {
//printf("dump %s \"%s\"\n", className(), name().data()); //printf("dump %s \"%s\"\n", className(), name().data());
PICout(PICoutManipulators::AddNewLine) << line_prefix << "class " << className() << " (" << (const void*)this << ", \"" << name() << "\") {"; 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 << " properties {";
PICout(PICoutManipulators::AddNewLine) << line_prefix << " count: " << properties_.size_s(); PICout(PICoutManipulators::AddNewLine) << line_prefix << " count: " << properties_.size_s();
//printf("dump %d properties\n", properties_.size()); //printf("dump %d properties\n", properties_.size());
@@ -621,3 +622,13 @@ bool dumpApplicationToFile(const PIString & path) {
return true; return true;
} }
#endif #endif
void PIObject::__MetaData::addScope(const PIString & s) {
if (!scope_list.contains(s)) {
scope_list << s;
scope_id << __string_id(s);
}
}

View File

@@ -203,13 +203,11 @@
virtual const char * className() const {return #name;} \ virtual const char * className() const {return #name;} \
virtual const uint classNameID() const {static uint ret = __string_id(PIStringAscii(#name)); return ret;} \ virtual const uint classNameID() const {static uint ret = __string_id(PIStringAscii(#name)); return ret;} \
private: \ private: \
virtual int ptrOffset() const {name * o = (name*)100; return int(llong((PIObject*)o) - llong(o));} virtual int ptrOffset() const {name * o = (name*)100; return int(llong((PIObject*)o) - llong(o));} \
class __BaseInitializer__ { \
#define PIOBJECT_PARENT(name) \
class __##name##_ParentInitializer__ { \
public: \ public: \
__##name##_ParentInitializer__() { \ __BaseInitializer__() { \
uint pid = name::__classNameIDS(); \ uint pid = PIObject::__classNameIDS(); \
if (pid == 0) return; \ if (pid == 0) return; \
uint id = __classNameIDS(); \ uint id = __classNameIDS(); \
PIMutexLocker ml(__meta_mutex()); \ PIMutexLocker ml(__meta_mutex()); \
@@ -220,11 +218,30 @@
__MetaData & eh(__meta_data()[id]); \ __MetaData & eh(__meta_data()[id]); \
eh.eh_set << ehp.eh_set; \ eh.eh_set << ehp.eh_set; \
eh.eh_func << ehp.eh_func; \ 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.scope_list = ehp.scope_list; \
eh.addScope(__classNameS()); \ eh.addScope(__classNameS()); \
} \ } \
}; \ }; \
__##name##_ParentInitializer__ __##name##_parent_init__; \ __ParentInitializer__ __parent_init__; \
public: \ public: \
virtual const char * parentClassName() const {return #name;} \ virtual const char * parentClassName() const {return #name;} \
typedef name __Parent__; \ typedef name __Parent__; \
@@ -749,8 +766,9 @@ public:
}; };
struct __MetaData { struct __MetaData {
__MetaData() {scope_list << PIStringAscii("PIObject");} __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; PIStringList scope_list;
PISet<uint> scope_id;
PISet<const void * > eh_set; PISet<const void * > eh_set;
PIMap<const void * , __MetaFunc> eh_func; PIMap<const void * , __MetaFunc> eh_func;
}; };