#include <iostream>
#include <chrono>
using namespace std;
typedef std::chrono::high_resolution_clock Clock;
class Dimension
{
public:
Dimension(int _X, int _Y)
{
mX = _X;
mY = _Y;
}
private:
int mX;
int mY;
};
class Image
{
public:
virtual void Draw() = 0;
virtual Dimension GetDimensionInPixels() = 0;
protected:
int dimensionX;
int dimensionY;
};
class PngImage : public Image
{
public:
void Draw()
{
}
Dimension GetDimensionInPixels()
{
return Dimension(dimensionX, dimensionY);
}
};
class BitmapImage : public Image
{
public:
void Draw()
{
}
Dimension GetDimensionInPixels()
{
return Dimension(dimensionX, dimensionY);
}
};
class TiffImage : public Image
{
public:
void Draw()
{
}
Dimension GetDimensionInPixels()
{
return Dimension(dimensionX, dimensionY);
}
};
int main() {
Image* pImage = new TiffImage;
auto then = Clock::now();
// Call Draw 1000 times to make sure perf is visible
for (int i = 0; i < 1000; ++i)
pImage->Draw();
auto now = Clock::now();
cout << "Time taken: "
<< std::chrono::duration_cast<std::chrono::nanoseconds>(now - then).count()
<< " nanoseconds" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrIENsb2NrOwoKY2xhc3MgRGltZW5zaW9uCnsKcHVibGljOgoJRGltZW5zaW9uKGludCBfWCwgaW50IF9ZKQoJewoJCW1YID0gX1g7CgkJbVkgPSBfWTsKCX0KCQpwcml2YXRlOgoJaW50IG1YOwoJaW50IG1ZOwp9OwoKY2xhc3MgSW1hZ2UKewpwdWJsaWM6Cgl2aXJ0dWFsIHZvaWQgRHJhdygpID0gMDsKCXZpcnR1YWwgRGltZW5zaW9uIEdldERpbWVuc2lvbkluUGl4ZWxzKCkgPSAwOwoJCnByb3RlY3RlZDoKCWludCBkaW1lbnNpb25YOwoJaW50IGRpbWVuc2lvblk7Cn07CgpjbGFzcyBQbmdJbWFnZSA6IHB1YmxpYyBJbWFnZQp7CnB1YmxpYzoKCXZvaWQgRHJhdygpCgl7Cgl9CgkKCURpbWVuc2lvbiBHZXREaW1lbnNpb25JblBpeGVscygpCgl7CgkJcmV0dXJuIERpbWVuc2lvbihkaW1lbnNpb25YLCBkaW1lbnNpb25ZKTsKCX0KfTsKCmNsYXNzIEJpdG1hcEltYWdlIDogcHVibGljIEltYWdlCnsKcHVibGljOgoJdm9pZCBEcmF3KCkKCXsKCX0KCQoJRGltZW5zaW9uIEdldERpbWVuc2lvbkluUGl4ZWxzKCkKCXsKCQlyZXR1cm4gRGltZW5zaW9uKGRpbWVuc2lvblgsIGRpbWVuc2lvblkpOwoJfQp9OwoKY2xhc3MgVGlmZkltYWdlIDogcHVibGljIEltYWdlCnsKcHVibGljOgoJdm9pZCBEcmF3KCkKCXsKCX0KCQoJRGltZW5zaW9uIEdldERpbWVuc2lvbkluUGl4ZWxzKCkKCXsKCQlyZXR1cm4gRGltZW5zaW9uKGRpbWVuc2lvblgsIGRpbWVuc2lvblkpOwoJfQp9OwoKaW50IG1haW4oKSB7CgkKCUltYWdlKiBwSW1hZ2UgPSBuZXcgVGlmZkltYWdlOwoJCglhdXRvIHRoZW4gPSBDbG9jazo6bm93KCk7CgkKCS8vIENhbGwgRHJhdyAxMDAwIHRpbWVzIHRvIG1ha2Ugc3VyZSBwZXJmIGlzIHZpc2libGUKCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKQoJCXBJbWFnZS0+RHJhdygpOwoJCglhdXRvIG5vdyA9IENsb2NrOjpub3coKTsKCQoJY291dCA8PCAiVGltZSB0YWtlbjogIiAKICAgICAgICAgICAgICA8PCBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM+KG5vdyAtIHRoZW4pLmNvdW50KCkKICAgICAgICAgICAgICA8PCAiIG5hbm9zZWNvbmRzIiA8PCBlbmRsOwoJCglyZXR1cm4gMDsKfQ==