[llvm-commits] CVS: llvm-test/MultiSource/Benchmarks/Prolangs-C++/shapes/bjarne.cpp bjarne.h

Chris Lattner lattner at cs.uiuc.edu
Mon Oct 4 13:01:30 PDT 2004



Changes in directory llvm-test/MultiSource/Benchmarks/Prolangs-C++/shapes:

bjarne.cpp added (r1.1)
bjarne.h added (r1.1)
---
Log message:

Initial checkin of all of the source


---
Diffs of the changes:  (+244 -0)

Index: llvm-test/MultiSource/Benchmarks/Prolangs-C++/shapes/bjarne.cpp
diff -c /dev/null llvm-test/MultiSource/Benchmarks/Prolangs-C++/shapes/bjarne.cpp:1.1
*** /dev/null	Mon Oct  4 15:01:25 2004
--- llvm-test/MultiSource/Benchmarks/Prolangs-C++/shapes/bjarne.cpp	Mon Oct  4 15:01:15 2004
***************
*** 0 ****
--- 1,224 ----
+ /* this program is taken from Section 6.4
+    in Bjarne Stroustrup's book "The C++ Programming Language" 2nd Edition. */
+ #include <iostream.h>
+ #include "bjarne.h"
+ 
+ enum color {black='*', white=' '};
+ 
+ char screen[XMAX][YMAX];
+ 
+ void screen_init() {
+     for (int y=0; y<YMAX; y++)
+ 	for (int x=0; x<XMAX; x++)
+ 	    screen[x][y]=white;
+ }
+ 
+ void screen_destroy() {}
+ 
+ inline int on_screen(int a, int b) { // clipping
+     return 0<=a && a<XMAX && 0<=b && b<YMAX;
+ }
+ 
+ void put_point(int a, int b) {
+     if (on_screen(a,b)) screen[a][b] = black;
+ }
+ 
+ void put_line(int x0, int y0, int x1, int y1) {
+     int dx=1;
+     int a = x1-x0;
+     if (a < 0) dx = -1, a = -a;
+ 
+     int dy=1;
+     int b = y1-y0;
+     if (b < 0) dy = -1, b = -b;
+ 
+     int two_a = 2*a;
+     int two_b = 2*b;
+     int xcrit = -b + two_a;
+     int eps = 0;
+     for (;;) {
+ 	put_point(x0,y0);
+ 	if (x0==x1 && y0==y1) break;
+ 	if (eps <= xcrit) x0 += dx, eps += two_b;
+ 	if (eps>=a && a<=b) y0 += dy, eps -= two_a;
+     }
+ }
+ 
+ void screen_clear() { screen_init(); }
+ 
+ void screen_refresh() {
+     for (int y=YMAX-1; 0<=y; y--) {  // top to bottom
+ 	for (int x=0; x<XMAX; x++)   // left to right
+ 	    cout << screen[x][y];
+ 	cout << '\n';
+     }
+ }
+ 
+ struct  shape {
+     static shape *list;
+     shape *next;
+ 
+     shape() { next = list; list = this; }
+ 
+     virtual point *north() const = 0;
+     virtual point *south() const = 0;
+     virtual point *east() const = 0;
+     virtual point *west() const = 0;
+     virtual point *neast() const = 0;
+     virtual point *seast() const = 0;
+     virtual point *nwest() const = 0;
+     virtual point *swest() const = 0;
+ 
+     virtual void draw() = 0;
+     virtual void move(int, int) = 0;
+ };
+ 
+ class line : public shape {
+     point *w,*e;
+ public:
+     point *north() const
+ 	{  point *ret = new point((w->x+e->x)/2,e->y<w->y?w->y:e->y);
+ 	   return ret;
+ 	}
+     point *south() const
+         {  point *ret = new point((w->x+e->x)/2,e->y<w->y?e->y:w->y);
+            return ret;
+         }
+     point *east() const {}
+     point *west() const {}
+     point *neast() const {}
+     point *seast() const {}
+     point *nwest() const {}
+     point *swest() const {}
+ 
+     void move (int a, int b) {
+ 	w->x += a; w->y += b; e->x += a; e->y += b; }
+     void draw () { put_line(w,e); }
+ 
+     line(point *a, point *b) { w = a; e = b; }
+     line(point *a, int l) { w = new point(a->x+l-1,a->y);e = a; }
+ };
+ 
+ class rectangle : public shape {
+ public:
+     point *sw,*ne;
+     point *north() const
+         {  point *ret = new point((sw->x+ne->x)/2,ne->y);
+            return ret;
+         }
+     point *south() const
+         {  point *ret = new point((sw->x+ne->x)/2,sw->y);
+            return ret;
+         }
+     point *east() const {}
+     point *west() const {}
+     point *neast() const {return ne;}
+     point *seast() const {}
+     point *nwest() const {}
+     point *swest() const {return sw;}
+    
+     void move (int a, int b) {
+         sw->x += a; sw->y += b; ne->x += a; ne->y += b; }
+     void draw ();
+ 
+     rectangle(point *, point *);
+ };
+ 
+ rectangle::rectangle(point *a, point *b) {
+     if (a->x <= b->x) {
+ 	if (a->y <= b->y) {
+ 	    sw = a;
+ 	    ne = b;
+ 	}
+ 	else {
+ 	    sw = new point(a->x,b->y);
+ 	    ne = new point(b->x,a->y);
+ 	}
+     }
+     else {
+ 	if (a->y <= b->y) {
+ 	    sw = new point(b->x,a->y);
+ 	    ne = new point(a->x,b->y);
+ 	}
+ 	else {
+ 	    sw = b;
+ 	    ne = a;
+ 	}
+     }
+ }
+ 
+ void rectangle::draw() {
+     point nw(sw->x,ne->y);
+     point se(ne->x,sw->y);
+     put_line(&nw,ne);
+     put_line(ne,&se);
+     put_line(&se,sw);
+     put_line(sw,&nw);
+ }
+ 
+ shape* shape::list = 0;
+ 
+ void shape_refresh() {
+     screen_clear();
+     for (shape *p = shape::list; p; p=p->next) p->draw();
+     screen_refresh();
+ }
+ 
+ void stack(shape *p, const shape *q) { // put p on top of q
+     point *n = q->north();
+     point *s = p->south();
+     p->move(n->x-s->x,n->y-s->y+1);
+ }
+ 
+ class myshape : public rectangle {
+     line *l_eye;
+     line *r_eye;
+     line *mouth;
+ public:
+     myshape(point *a, point *b) : rectangle(a,b) {
+     int ll = neast()->x-swest()->x+1;
+     int hh = neast()->y-swest()->y+1;
+     point *l_eye_point = new point(swest()->x+2,swest()->y+hh*3/4);
+     point *r_eye_point = new point(swest()->x+ll-4,swest()->y+hh*3/4);
+     point *mouth_point = new point(swest()->x+2,swest()->y+hh/4);
+     l_eye = new line(l_eye_point,2);
+     r_eye = new line(r_eye_point,2);
+     mouth = new line(mouth_point,ll-4);
+     }
+ 
+     void draw();
+     void move(int, int);
+ };
+ 
+ void myshape::draw() {
+     rectangle::draw();
+     int a = (swest()->x+neast()->x)/2;
+     int b = (swest()->y+neast()->y)/2;
+     put_point(new point(a,b));
+ }
+ 
+ void myshape::move(int a, int b) {
+     rectangle::move(a,b);
+     l_eye->move(a,b);
+     r_eye->move(a,b);
+     mouth->move(a,b);
+ }
+ 
+ int main() {
+     screen_init();
+     point *point00 = new point(0,0);
+     point *point1010 = new point(10,10);
+     point *point015 = new point(0,15);
+     point *point1510 = new point(15,10);
+     point *point2718 = new point(27,18);
+     shape *p1 = new rectangle(point00,point1010);
+     shape *p2 = new line(point015,17);
+     shape *p3 = new myshape(point1510,point2718);
+     shape_refresh();
+     p3->move(-10,-10);
+     stack(p2,p3);
+     stack(p1,p2);
+     shape_refresh();
+     screen_destroy();
+     return 0;
+ }


Index: llvm-test/MultiSource/Benchmarks/Prolangs-C++/shapes/bjarne.h
diff -c /dev/null llvm-test/MultiSource/Benchmarks/Prolangs-C++/shapes/bjarne.h:1.1
*** /dev/null	Mon Oct  4 15:01:30 2004
--- llvm-test/MultiSource/Benchmarks/Prolangs-C++/shapes/bjarne.h	Mon Oct  4 15:01:15 2004
***************
*** 0 ****
--- 1,20 ----
+ const int XMAX=40;
+ const int YMAX=24;
+ 
+ struct point {
+     int x,y;
+     point() {}
+     point(int a, int b) {x=a; y=b;}
+ };
+ 
+ extern void put_point(int a, int b);
+ inline void put_point(point *p) { put_point(p->x,p->y); }
+ 
+ extern void put_line(int, int, int, int);
+ inline void put_line(point *a, point *b)
+     { put_line(a->x,a->y,b->x,b->y); }
+ 
+ extern void screen_init();
+ extern void screen_destroy();
+ extern void screen_refresh();
+ extern void screen_clear();






More information about the llvm-commits mailing list