#include <iostream>
#include <list>
#include <boost/foreach.hpp>
#include <time.h>
struct Base{
int idLev1;
int idLev2;
Base(int a, int b)
{
idLev1 = a;
idLev2 = b;
}
// just for dynamic cast
virtual ~Base(){}
};
struct DerivedA : public Base
{
DerivedA(): Base(1,1){}
};
struct DerivedB : public Base
{
DerivedB(): Base(2,1){}
};
struct DerivedC : public Base
{
DerivedC(): Base(3,1){}
DerivedC(int a, int b): Base(a,b){}
};
struct DerivedX : public DerivedC
{
DerivedX(): DerivedC(3,2){}
};
struct DerivedY : public DerivedC
{
DerivedY(): DerivedC(3,3){}
};
template<class T>
void findDerived(const std::list<Base*> &base, int& c, double& itime)
{
double tstart, tend;
tstart = (double)clock()/CLOCKS_PER_SEC;
BOOST_FOREACH(Base* x,base)
{
if(dynamic_cast<T>(x)) ++c;
}
tend = (double)clock()/CLOCKS_PER_SEC;
itime += tend - tstart;
}
void findNumber(const std::list<Base*> &base, const int a, const int b, int &c, double& itime)
{
double tstart, tend;
tstart= (double)clock()/CLOCKS_PER_SEC;
BOOST_FOREACH(Base* x,base)
{
if(x->idLev1 == a && x->idLev2 == b) ++c;
}
tend = (double)clock()/CLOCKS_PER_SEC;
itime += tend - tstart;
}
int main() {
std::list <Base*> b;
for (int i = 1; i<1999000; ++i){
if (rand()%2) b.push_back(new DerivedA());
if (rand()%2) b.push_back(new DerivedB());
if (rand()%2) b.push_back(new DerivedC());
if (rand()%2) b.push_back(new DerivedX());
if (rand()%2) b.push_back(new DerivedY());
}
int c=0;int d=0;
double itime1=0; double itime2=0;
std::cout << "Method a\n";
findDerived<DerivedA*>(b, c, itime1);
findDerived<DerivedB*>(b, c, itime1);
findDerived<DerivedC*>(b, c, itime1);
findDerived<DerivedX*>(b, c, itime1);
findDerived<DerivedY*>(b, c, itime1);
std::cout << "Method a\n";
findNumber<DerivedA*>(b, d, itime2);
findNumber<DerivedB*>(b, d, itime2);
findNumber<DerivedC*>(b, d, itime2);
findNumber<DerivedX*>(b, d, itime2);
findNumber<DerivedY*>(b, d, itime2);
std::cout << "Time method a " << itime1 << "count " << c << std::endl;
std::cout << "Time method b " << itime2 << "count " << d << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgojaW5jbHVkZSA8dGltZS5oPgoKCnN0cnVjdCBCYXNlewogaW50IGlkTGV2MTsKIGludCBpZExldjI7CiBCYXNlKGludCBhLCBpbnQgYikKIHsKICAgIGlkTGV2MSA9IGE7CiAgICBpZExldjIgPSBiOwogfQogLy8ganVzdCBmb3IgZHluYW1pYyBjYXN0CiB2aXJ0dWFsIH5CYXNlKCl7fQp9OwoKc3RydWN0IERlcml2ZWRBIDogcHVibGljICBCYXNlCnsKICAgRGVyaXZlZEEoKTogQmFzZSgxLDEpe30KfTsKCnN0cnVjdCBEZXJpdmVkQiA6IHB1YmxpYyAgQmFzZQp7CiAgIERlcml2ZWRCKCk6IEJhc2UoMiwxKXt9Cn07CgpzdHJ1Y3QgRGVyaXZlZEMgOiBwdWJsaWMgIEJhc2UKewogICBEZXJpdmVkQygpOiBCYXNlKDMsMSl7fQogICBEZXJpdmVkQyhpbnQgYSwgaW50IGIpOiBCYXNlKGEsYil7fQp9OwoKc3RydWN0IERlcml2ZWRYIDogcHVibGljICBEZXJpdmVkQwp7CiAgIERlcml2ZWRYKCk6IERlcml2ZWRDKDMsMil7fQp9OwoKc3RydWN0IERlcml2ZWRZIDogcHVibGljICBEZXJpdmVkQwp7CkRlcml2ZWRZKCk6IERlcml2ZWRDKDMsMyl7fQp9OwoKCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgZmluZERlcml2ZWQoY29uc3Qgc3RkOjpsaXN0PEJhc2UqPiAmYmFzZSwgaW50JiBjLCBkb3VibGUmIGl0aW1lKQp7CiAgZG91YmxlIHRzdGFydCwgdGVuZDsKICB0c3RhcnQgPSAoZG91YmxlKWNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUM7CiAgQk9PU1RfRk9SRUFDSChCYXNlKiB4LGJhc2UpCiAgewogIAogICBpZihkeW5hbWljX2Nhc3Q8VD4oeCkpICsrYzsKICAKICB9CgogIHRlbmQgPSAoZG91YmxlKWNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUM7CiAgaXRpbWUgKz0gdGVuZCAtIHRzdGFydDsKCn0KCnZvaWQgZmluZE51bWJlcihjb25zdCBzdGQ6Omxpc3Q8QmFzZSo+ICZiYXNlLCBjb25zdCBpbnQgYSwgY29uc3QgaW50IGIsIGludCAmYywgZG91YmxlJiBpdGltZSkKewogIAogIGRvdWJsZSB0c3RhcnQsIHRlbmQ7CiAgdHN0YXJ0PSAoZG91YmxlKWNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUM7CiAgQk9PU1RfRk9SRUFDSChCYXNlKiB4LGJhc2UpCiAgewogICBpZih4LT5pZExldjEgPT0gYSAmJiB4LT5pZExldjIgPT0gYikgKytjOwogIH0KICB0ZW5kID0gKGRvdWJsZSljbG9jaygpL0NMT0NLU19QRVJfU0VDOwogIGl0aW1lICs9IHRlbmQgLSB0c3RhcnQ7Cgp9CmludCBtYWluKCkgewogICAgICAgIHN0ZDo6bGlzdCA8QmFzZSo+IGI7Cglmb3IgKGludCBpID0gMTsgaTwxOTk5MDAwOyArK2kpewoJIGlmIChyYW5kKCklMikgYi5wdXNoX2JhY2sobmV3IERlcml2ZWRBKCkpOwoJIGlmIChyYW5kKCklMikgYi5wdXNoX2JhY2sobmV3IERlcml2ZWRCKCkpOwoJIGlmIChyYW5kKCklMikgYi5wdXNoX2JhY2sobmV3IERlcml2ZWRDKCkpOwoJIGlmIChyYW5kKCklMikgYi5wdXNoX2JhY2sobmV3IERlcml2ZWRYKCkpOwoJIGlmIChyYW5kKCklMikgYi5wdXNoX2JhY2sobmV3IERlcml2ZWRZKCkpOwogICAgICAgfQoKICAgICAgIGludCBjPTA7aW50IGQ9MDsKICAgICAgIGRvdWJsZSBpdGltZTE9MDsgZG91YmxlIGl0aW1lMj0wOwogICAgICAgc3RkOjpjb3V0IDw8ICJNZXRob2QgYVxuIjsKCiAgICAgICBmaW5kRGVyaXZlZDxEZXJpdmVkQSo+KGIsIGMsIGl0aW1lMSk7CiAgICAgICBmaW5kRGVyaXZlZDxEZXJpdmVkQio+KGIsIGMsIGl0aW1lMSk7CiAgICAgICBmaW5kRGVyaXZlZDxEZXJpdmVkQyo+KGIsIGMsIGl0aW1lMSk7CiAgICAgICBmaW5kRGVyaXZlZDxEZXJpdmVkWCo+KGIsIGMsIGl0aW1lMSk7CiAgICAgICBmaW5kRGVyaXZlZDxEZXJpdmVkWSo+KGIsIGMsIGl0aW1lMSk7CiAgICAgICBzdGQ6OmNvdXQgPDwgIk1ldGhvZCBhXG4iOwogICAgICAgZmluZE51bWJlcjxEZXJpdmVkQSo+KGIsIGQsIGl0aW1lMik7CiAgICAgICBmaW5kTnVtYmVyPERlcml2ZWRCKj4oYiwgZCwgaXRpbWUyKTsKICAgICAgIGZpbmROdW1iZXI8RGVyaXZlZEMqPihiLCBkLCBpdGltZTIpOwogICAgICAgZmluZE51bWJlcjxEZXJpdmVkWCo+KGIsIGQsIGl0aW1lMik7CiAgICAgICBmaW5kTnVtYmVyPERlcml2ZWRZKj4oYiwgZCwgaXRpbWUyKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiVGltZSBtZXRob2QgYSAiIDw8IGl0aW1lMSA8PCAiY291bnQgIiA8PCBjIDw8IHN0ZDo6ZW5kbDsKICAgICAgIHN0ZDo6Y291dCA8PCAiVGltZSBtZXRob2QgYiAiIDw8IGl0aW1lMiA8PCAiY291bnQgIiA8PCBkIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9