Listing 3
#include <iostream> #include <vector> #include <list> using namespace std; #include "timeit.hpp" struct Point { int mx, my; Point() { mx = 0; my = 0; }; Point(int x, int y) { mx = x; my = y; }; Point Plus(const Point& x) { return Point(x.mx + mx, x.my + my); }; void Draw() const { cout << "x: " << mx << " y: " << my; }; void MoveTo(const Point& x) { mx = x.mx; my = x.my; }; }; #include "shapes.hpp" struct Circle { Circle() { mSize = 0; }; void Draw() const { /* noop */ }; void MoveTo(const Point& x) { mCenter.MoveTo(x); Draw(); }; void MoveBy(const Point& x) { MoveTo(GetPos().Plus(x)); }; Point GetPos() const { return mCenter; }; void SetSize(int x) { mSize = x; }; int GetSize() const { return mSize; }; Point mCenter; int mSize; }; struct AbcDrawable { virtual void Draw() const = 0; }; struct AbcPosition { virtual Point GetPos() const = 0; }; struct AbcMoveable { virtual void MoveTo(const Point& x) = 0; virtual void MoveBy(const Point& x) = 0; }; struct AbcSizeable { virtual void SetSize(int x) = 0; virtual int GetSize() const = 0; }; struct AbcShape : public AbcDrawable, public AbcPosition, public AbcMoveable, public AbcSizeable { }; struct NaiveCircle : public AbcShape { NaiveCircle() { mSize = 0; }; void Draw() const { /* noop */ }; void MoveTo(const Point& x) { mCenter.MoveTo(x); Draw(); }; void MoveBy(const Point& x) { MoveTo(GetPos().Plus(x)); }; Point GetPos() const { return mCenter; }; void SetSize(int x) { mSize = x; }; int GetSize() const { return mSize; }; Point mCenter; int mSize; }; template<typename T> void RunTest(T x, const char* s) { const int ITERS = 5000000; Point pt(0, 0); cout << "sizeof(" << s << ") = " << sizeof(T) << endl; cout << "timing " << ITERS << " calls to " << s << "::MoveBy() ... "; TimeIt t; x.MoveTo(pt); for (int i=0; i < ITERS; i++) { x.MoveBy(Point(i, i)); } }; int main() { Circle c1; NaiveCircle c2; RunTest<IShape>(c1, "IShape"); RunTest<AbcShape&>(c2, "AbcShape&"); RunTest<IMoveable>(c1, "IMoveable"); RunTest<AbcMoveable&>(c2, "AbcMoveable&"); RunTest<Circle&>(c1, "Circle&"); RunTest<NaiveCircle&>(c2, "NaiveCircle&"); RunTest<Circle>(c1, "Circle"); RunTest<NaiveCircle>(c2, "NaiveCircle"); cin.get(); return 0; }