diff --git a/src/apps/glteapot/FPS.cpp b/src/apps/glteapot/FPS.cpp index 9fb81e788b..91baa8fde6 100644 --- a/src/apps/glteapot/FPS.cpp +++ b/src/apps/glteapot/FPS.cpp @@ -18,20 +18,20 @@ void FPS::drawChar(GLfloat x, GLfloat y, GLint number) { static bool numbers[13][7] = { - { true, true, true, true, true, true, false }, /* 0 */ - { false, true, true, false, false, false, false }, /* 1 */ - { true, true, false, true, true, false, true }, /* 2 */ - { true, true, true, true, false, false, true }, /* 3 */ - { false, true, true, false, false, true, true }, /* 4 */ - { true, false, true, true, false, true, true }, /* 5 */ - { true, false, true, true, true, true, true }, /* 6 */ - { true, true, true, false, false, false, false }, /* 7 */ - { true, true, true, true, true, true, true }, /* 8 */ - { true, true, true, false, false, true, true }, /* 9 */ + {true, true, true, true, true, true, false}, /* 0 */ + {false, true, true, false, false, false, false},/* 1 */ + {true, true, false, true, true, false, true}, /* 2 */ + {true, true, true, true, false, false, true}, /* 3 */ + {false, true, true, false, false, true, true}, /* 4 */ + {true, false, true, true, false, true, true}, /* 5 */ + {true, false, true, true, true, true, true}, /* 6 */ + {true, true, true, false, false, false, false}, /* 7 */ + {true, true, true, true, true, true, true}, /* 8 */ + {true, true, true, false, false, true, true}, /* 9 */ - { true, false, false, false, true, true, true }, /* F */ - { true, true, false, false, true, true, true }, /* P */ - { true, false, true, true, false, true, true }, /* S */ + {true, false, false, false, true, true, true}, /* F */ + {true, true, false, false, true, true, true}, /* P */ + {true, false, true, true, false, true, true}, /* S */ }; static GLfloat gap = 0.03; diff --git a/src/apps/glteapot/FPS.h b/src/apps/glteapot/FPS.h index 671778c2ca..c1d34a8a45 100644 --- a/src/apps/glteapot/FPS.h +++ b/src/apps/glteapot/FPS.h @@ -5,16 +5,14 @@ #include -class FPS -{ -public: - FPS(); - ~FPS(); +class FPS { + public: + FPS(); + ~FPS(); + + static void drawCounter(GLfloat frameRate); - static void drawCounter( GLfloat frameRate ); - -private: - static void drawChar( GLfloat x, GLfloat y, GLint number ); - + private: + static void drawChar(GLfloat x, GLfloat y, GLint number); }; diff --git a/src/apps/glteapot/GLObject.cpp b/src/apps/glteapot/GLObject.cpp index d6a2beb9e7..62ae9dee01 100644 --- a/src/apps/glteapot/GLObject.cpp +++ b/src/apps/glteapot/GLObject.cpp @@ -3,22 +3,17 @@ This file may be used under the terms of the Be Sample Code License. */ -#include -#include - -#include - #include "GLObject.h" +#include +#include +#include #include "glob.h" struct material { - float ambient[3],diffuse[3],specular[3]; + float ambient[3], diffuse[3], specular[3]; }; -float *colors[] = -{ - NULL,white,yellow,blue,red,green -}; +float *colors[] = {NULL, white, yellow, blue, red, green}; material materials[] = { // Null @@ -61,25 +56,34 @@ material materials[] = { #define USE_QUAD_STRIPS 1 -extern long setEvent(sem_id event); +extern long setEvent(sem_id event); + GLObject::GLObject(ObjectView *ov) + : rotX(0), + rotY(0), + lastRotX(0), + lastRotY(0), + spinX(2), + spinY(2), + x(0), + y(0), + z(-2.0), + color(4), + solidity(0), + changed(false), + objView(ov) { - rotX = rotY = lastRotX = lastRotY = 0; - spinX = spinY = 2; - x = y = 0; - z = -2.0; - color = 4; - solidity = 0; - changed = false; - objView = ov; }; + GLObject::~GLObject() { }; -void GLObject::MenuInvoked(BPoint point) + +void +GLObject::MenuInvoked(BPoint point) { BPopUpMenu *m = new BPopUpMenu("Object",false,false); BMenuItem *i; @@ -126,7 +130,9 @@ void GLObject::MenuInvoked(BPoint point) setEvent(objView->drawEvent); }; -bool GLObject::SpinIt() + +bool +GLObject::SpinIt() { rotX += spinX; rotY += spinY; @@ -138,7 +144,9 @@ bool GLObject::SpinIt() return c; }; -void GLObject::Draw(bool forID, float IDcolor[]) + +void +GLObject::Draw(bool forID, float IDcolor[]) { glPushMatrix(); glTranslatef(x, y, z); @@ -156,6 +164,7 @@ void GLObject::Draw(bool forID, float IDcolor[]) changed = false; }; + TriangleObject::TriangleObject(ObjectView *ov, char *filename) : GLObject(ov), points(100,100), @@ -247,6 +256,7 @@ TriangleObject::TriangleObject(ObjectView *ov, char *filename) fclose(f); }; + TriangleObject::~TriangleObject() { for (int i=0;i points; -BufferArray triangles; -BufferArray qs; + public: + TriangleObject(ObjectView *ov, char *filename); + virtual ~TriangleObject(); + + virtual void DoDrawing(bool forID); - TriangleObject(ObjectView *ov, char *filename); -virtual ~TriangleObject(); - -virtual void DoDrawing(bool forID); + BufferArray points; + BufferArray triangles; + BufferArray qs; }; + +#endif // GL_OBJECT_H diff --git a/src/apps/glteapot/ObjectView.cpp b/src/apps/glteapot/ObjectView.cpp index 881064c310..0f8d6e1842 100644 --- a/src/apps/glteapot/ObjectView.cpp +++ b/src/apps/glteapot/ObjectView.cpp @@ -3,16 +3,17 @@ This file may be used under the terms of the Be Sample Code License. */ +#include "ObjectView.h" + #include #include #include #include -#include "ObjectView.h" -#include "ResScroll.h" -#include "GLObject.h" #include "FPS.h" +#include "GLObject.h" +#include "ResScroll.h" #define teapotData "teapot.data" char teapotPath[PATH_MAX]; @@ -35,22 +36,26 @@ float red[3] = {1.0,0.0,0.0}; float *bgColor = black; + struct light { float *ambient; float *diffuse; float *specular; }; + light lights[] = { - {NULL,NULL,NULL}, - {dimWhite,white,white}, - {dimWhite,yellow,yellow}, - {dimWhite,red,red}, - {dimWhite,blue,blue}, - {dimWhite,green,green} + {NULL, NULL, NULL}, + {dimWhite, white, white}, + {dimWhite, yellow, yellow}, + {dimWhite, red, red}, + {dimWhite, blue, blue}, + {dimWhite, green, green} }; -long signalEvent(sem_id event) + +long +signalEvent(sem_id event) { long c; get_sem_count(event,&c); @@ -60,7 +65,9 @@ long signalEvent(sem_id event) return 0; }; -long setEvent(sem_id event) + +long +setEvent(sem_id event) { long c; get_sem_count(event,&c); @@ -71,7 +78,8 @@ long setEvent(sem_id event) }; -long waitEvent(sem_id event) +long +waitEvent(sem_id event) { acquire_sem(event); @@ -83,7 +91,9 @@ long waitEvent(sem_id event) return 0; }; -long simonThread(ObjectView *ov) + +long +simonThread(ObjectView *ov) { int noPause=0; while (acquire_sem_etc(ov->quittingSem,1,B_TIMEOUT,0) == B_NO_ERROR) { @@ -101,6 +111,7 @@ long simonThread(ObjectView *ov) return 0; }; + ObjectView::ObjectView(BRect r, char *name, ulong resizingMode, ulong options) : BGLView(r,name,resizingMode,0,options) { @@ -130,13 +141,16 @@ ObjectView::ObjectView(BRect r, char *name, ulong resizingMode, ulong options) objListLock.Unlock(); }; + ObjectView::~ObjectView() { delete_sem(quittingSem); delete_sem(drawEvent); }; -void ObjectView::AttachedToWindow() + +void +ObjectView::AttachedToWindow() { float position[] = {0.0, 3.0, 3.0, 0.0}; float position1[] = {-3.0, -3.0, 3.0, 0.0}; @@ -204,7 +218,9 @@ void ObjectView::AttachedToWindow() setEvent(drawEvent); }; -void ObjectView::DetachedFromWindow() + +void +ObjectView::DetachedFromWindow() { BGLView::DetachedFromWindow(); @@ -224,7 +240,9 @@ void ObjectView::DetachedFromWindow() while (locks--) Window()->Lock(); }; -void ObjectView::Pulse() + +void +ObjectView::Pulse() { Window()->Lock(); BRect p = Parent()->Bounds(); @@ -237,7 +255,9 @@ void ObjectView::Pulse() Window()->Unlock(); }; -void ObjectView::MessageReceived(BMessage *msg) + +void +ObjectView::MessageReceived(BMessage *msg) { BMenuItem *i; bool *b; @@ -320,7 +340,9 @@ void ObjectView::MessageReceived(BMessage *msg) }; }; -int ObjectView::ObjectAtPoint(BPoint p) + +int +ObjectView::ObjectAtPoint(BPoint p) { LockGL(); glShadeModel(GL_FLAT); @@ -347,7 +369,9 @@ int ObjectView::ObjectAtPoint(BPoint p) return objNum; }; -void ObjectView::MouseDown(BPoint p) + +void +ObjectView::MouseDown(BPoint p) { BPoint op=p,np=p; BRect bounds = Bounds(); @@ -441,7 +465,9 @@ void ObjectView::MouseDown(BPoint p) setEvent(drawEvent); }; -void ObjectView::FrameResized(float w, float h) + +void +ObjectView::FrameResized(float w, float h) { LockGL(); @@ -481,7 +507,9 @@ void ObjectView::FrameResized(float w, float h) setEvent(drawEvent); } -bool ObjectView::RepositionView() + +bool +ObjectView::RepositionView() { if (!(persp != lastPersp) && !(lastObjectDistance != objectDistance) && @@ -516,7 +544,9 @@ bool ObjectView::RepositionView() return true; }; -void ObjectView::EnforceState() + +void +ObjectView::EnforceState() { glShadeModel(gouraud?GL_SMOOTH:GL_FLAT); if (zbuf) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); @@ -542,7 +572,9 @@ void ObjectView::EnforceState() }; }; -bool ObjectView::SpinIt() + +bool +ObjectView::SpinIt() { bool changed = false; @@ -615,7 +647,9 @@ bool ObjectView::SpinIt() return changed; }; -void ObjectView::DrawFrame(bool noPause) + +void +ObjectView::DrawFrame(bool noPause) { LockGL(); glClear(GL_COLOR_BUFFER_BIT|(zbuf?GL_DEPTH_BUFFER_BIT:0)); diff --git a/src/apps/glteapot/ObjectView.h b/src/apps/glteapot/ObjectView.h index 5d9f3fe8e2..c9905c81c8 100644 --- a/src/apps/glteapot/ObjectView.h +++ b/src/apps/glteapot/ObjectView.h @@ -3,8 +3,8 @@ This file may be used under the terms of the Be Sample Code License. */ -#ifndef ObjectView_h -#define ObjectView_h +#ifndef OBJECT_VIEW_H +#define OBJECT_VIEW_H #include #include @@ -33,47 +33,49 @@ enum lights { #define HISTSIZE 10 class ResScroll; + class ObjectView : public BGLView { -public: -sem_id drawEvent; -sem_id quittingSem; -thread_id drawThread; -ResScroll * resScroll; + public: + ObjectView(BRect r, char *name, + ulong resizingMode, ulong options); + ~ObjectView(); -BList objects; -BLocker objListLock; + virtual void MouseDown(BPoint p); + virtual void MessageReceived(BMessage *msg); + virtual void AttachedToWindow(); + virtual void DetachedFromWindow(); + virtual void FrameResized(float width, float height); + bool SpinIt(); + int ObjectAtPoint(BPoint p); + virtual void DrawFrame(bool noPause); + virtual void Pulse(); + void EnforceState(); + bool RepositionView(); -float yxRatio,lastYXRatio; -uint64 lastFrame; -float fpsHistory[HISTSIZE]; -int32 histEntries,oldestEntry; -bool fps; -bool gouraud, lastGouraud; -bool zbuf,lastZbuf; -bool culling,lastCulling; -bool lighting,lastLighting; -bool filled,lastFilled; -bool persp,lastPersp; -bool lastTextured,textured; -bool lastFog,fog; -bool forceRedraw; -float objectDistance,lastObjectDistance; + sem_id drawEvent; + sem_id quittingSem; + thread_id drawThread; + ResScroll * resScroll; + + BList objects; + BLocker objListLock; + + float yxRatio,lastYXRatio; + uint64 lastFrame; + float fpsHistory[HISTSIZE]; + int32 histEntries,oldestEntry; + bool fps; + bool gouraud, lastGouraud; + bool zbuf,lastZbuf; + bool culling,lastCulling; + bool lighting,lastLighting; + bool filled,lastFilled; + bool persp,lastPersp; + bool lastTextured,textured; + bool lastFog,fog; + bool forceRedraw; + float objectDistance,lastObjectDistance; - ObjectView(BRect r, char *name, - ulong resizingMode, ulong options); - ~ObjectView(); - -virtual void MouseDown(BPoint p); -virtual void MessageReceived(BMessage *msg); -virtual void AttachedToWindow(); -virtual void DetachedFromWindow(); -virtual void FrameResized(float width, float height); - bool SpinIt(); - int ObjectAtPoint(BPoint p); -virtual void DrawFrame(bool noPause); -virtual void Pulse(); - void EnforceState(); - bool RepositionView(); }; -#endif +#endif // OBJECT_VIEW_H diff --git a/src/apps/glteapot/ResScroll.h b/src/apps/glteapot/ResScroll.h index d072b8072a..f3f56d9b77 100644 --- a/src/apps/glteapot/ResScroll.h +++ b/src/apps/glteapot/ResScroll.h @@ -3,21 +3,20 @@ This file may be used under the terms of the Be Sample Code License. */ -#ifndef ResScroll_h -#define ResScroll_h +#ifndef RESSCROLL_H +#define RESSCROLL_H #include class ObjectView; class ResScroll : public BScrollBar { -public: - ObjectView * objectView; - - ResScroll(BRect r, const char *name, - ObjectView *target, orientation posture); -virtual void ValueChanged(float value); - + public: + ObjectView * objectView; + + ResScroll(BRect r, const char *name, + ObjectView *target, orientation posture); + virtual void ValueChanged(float value); }; #endif diff --git a/src/apps/glteapot/error.cpp b/src/apps/glteapot/error.cpp index 59e628aec9..9454188f48 100644 --- a/src/apps/glteapot/error.cpp +++ b/src/apps/glteapot/error.cpp @@ -5,7 +5,8 @@ #include "error.h" -void fatalerror(char *s) +void +fatalerror(char *s) { printf("FATAL ERROR: %s\n",s); }; diff --git a/src/apps/glteapot/error.h b/src/apps/glteapot/error.h index 36c09913a2..621f452544 100644 --- a/src/apps/glteapot/error.h +++ b/src/apps/glteapot/error.h @@ -3,8 +3,8 @@ This file may be used under the terms of the Be Sample Code License. */ -#ifndef error_h -#define error_h +#ifndef ERROR_H +#define ERROR_H #include @@ -28,4 +28,4 @@ extern void fatalerror(char *); #endif //DEBUGGING -#endif +#endif // ERROR_H diff --git a/src/apps/glteapot/teapot.h b/src/apps/glteapot/teapot.h index b6077ffc72..07ef2fc3fa 100644 --- a/src/apps/glteapot/teapot.h +++ b/src/apps/glteapot/teapot.h @@ -3,7 +3,7 @@ This file may be used under the terms of the Be Sample Code License. */ -#include "GL/gl.h" +#include void auxSolidTeapot(GLdouble scale); void auxWireTeapot(GLdouble scale); diff --git a/src/apps/glteapot/teapot_main.cpp b/src/apps/glteapot/teapot_main.cpp index 4bad660ab3..068f6fd569 100644 --- a/src/apps/glteapot/teapot_main.cpp +++ b/src/apps/glteapot/teapot_main.cpp @@ -3,42 +3,48 @@ This file may be used under the terms of the Be Sample Code License. */ -#include #include +#include #include "ObjectView.h" -class QuitWindow : public BDirectWindow -{ -public: - QuitWindow(BRect r, char *name, window_type wt, ulong something); - - virtual bool QuitRequested(); - virtual void DirectConnected( direct_buffer_info *info ); - ObjectView *bgl; +class QuitWindow : public BDirectWindow { + public: + QuitWindow(BRect r, char *name, window_type wt, ulong something); + + virtual bool QuitRequested(); + virtual void DirectConnected( direct_buffer_info *info ); + ObjectView *bgl; }; + QuitWindow::QuitWindow(BRect r, char *name, window_type wt, ulong something) : BDirectWindow(r,name,wt,something) { } -bool QuitWindow::QuitRequested() + +bool +QuitWindow::QuitRequested() { -printf( "closing \n" ); + printf("closing \n"); bgl->EnableDirectMode( false ); be_app->PostMessage(B_QUIT_REQUESTED); return true; }; -void QuitWindow::DirectConnected( direct_buffer_info *info ) + +void +QuitWindow::DirectConnected(direct_buffer_info *info) { - if( bgl ) + if (bgl) bgl->DirectConnected( info ); bgl->EnableDirectMode( true ); } -int main(int argc, char **argv) + +int +main(int argc, char **argv) { GLenum type = BGL_RGB | BGL_DEPTH | BGL_DOUBLE; //GLenum type = BGL_RGB | BGL_DEPTH | BGL_SINGLE; diff --git a/src/apps/glteapot/util.h b/src/apps/glteapot/util.h index ca5ca3bd2e..e3cf34e7d3 100644 --- a/src/apps/glteapot/util.h +++ b/src/apps/glteapot/util.h @@ -3,15 +3,14 @@ This file may be used under the terms of the Be Sample Code License. */ -#ifndef list_h -#define list_h +#ifndef UTIL_H +#define UTIL_H #include #include "error.h" template -struct LispNode -{ +struct LispNode { contents *car; LispNode *cdr; @@ -31,89 +30,100 @@ struct LispNode template -struct LispList -{ - LispNode *first; +struct LispList { + LispNode *first; - /* -------- List creation --------------- */ - /* Create an empty list */ - inline LispList() - { first = 0; } + /* -------- List creation --------------- */ + /* Create an empty list */ + inline LispList() + { + first = 0; + } - /* Create a list pointing to the specified node */ - inline LispList(LispNode *_first) - { first = _first; } + /* Create a list pointing to the specified node */ + inline LispList(LispNode *_first) + { + first = _first; + } - /* ?? */ - inline LispList(LispList &init) - { first = init.first; } + /* ?? */ + inline LispList(LispList &init) + { + first = init.first; + } - /* ---------- List queries ------------- */ - inline int is_empty() - { return first == 0; } + /* ---------- List queries ------------- */ + inline int is_empty() + { + return first == 0; + } /* Determines if a thing is on the list */ - inline int is_present(contents *element) - { - for (LispNode *node = first; node; node = node->cdr) - if (node->car == element) - return 1; - return 0; - } + inline int is_present(contents *element) + { + for (LispNode *node = first; node; node = node->cdr) + if (node->car == element) + return 1; + return 0; + } /* Returns the length of the list */ - inline int count() - { - int n = 0; - for (LispNode *node = first; node; node = node->cdr) - n++; - return n; - } + inline int count() + { + int n = 0; + for (LispNode *node = first; node; node = node->cdr) + n++; + return n; + } - /* ----------- Adding "nodes" to the list ------------ */ - /* Add a specified node to the head of the list. */ - inline void add_head(LispNode *new_element) - { - new_element->cdr = first; - first = new_element; - } + /* ----------- Adding "nodes" to the list ------------ */ + /* Add a specified node to the head of the list. */ + inline void add_head(LispNode *new_element) + { + new_element->cdr = first; + first = new_element; + } - /* Add a specified node anywhere on the list */ - inline void add(LispNode *new_element) - { - add_head (new_element); - } + /* Add a specified node anywhere on the list */ + inline void add(LispNode *new_element) + { + add_head (new_element); + } inline void add_tail(LispNode *new_element) { LispNode** pred = &first; - while( *pred ) + while(*pred) pred = &(*pred)->cdr; *pred = new_element; new_element->cdr = 0; } - /* ----------- Adding "contents" to the list ------------ */ - /* ----- (Which in my opinion is far more useful) ------ */ - /* Create new node pointing to thing, & add to head of list. */ - inline void add_head_new(contents *new_element) - { - first = new LispNode(new_element, first); - } - inline void add_head(contents *new_element) - { add_head_new(new_element); } + /* ----------- Adding "contents" to the list ------------ */ + /* ----- (Which in my opinion is far more useful) ------ */ + /* Create new node pointing to thing, & add to head of list. */ + inline void add_head_new(contents *new_element) + { + first = new LispNode(new_element, first); + } + inline void add_head(contents *new_element) + { + add_head_new(new_element); + } - /* Create new node pointing to thing, & add to end of list. */ - inline void add_tail_new(contents *new_element) - { - LispNode< contents > **pred = &first; - while (*pred) - pred = &(*pred)->cdr; - *pred = new LispNode< contents >(new_element); - } - inline void add_tail(contents *new_element) - { add_tail_new(new_element); } + /* Create new node pointing to thing, & add to end of list. */ + inline void add_tail_new(contents *new_element) + { + LispNode< contents > **pred = &first; + while (*pred) + pred = &(*pred)->cdr; + *pred = new LispNode< contents >(new_element); + } + inline void add_tail(contents *new_element) + { + add_tail_new(new_element); + } /* Create new node pointing to thing, & add anywhere on list */ inline void add_new(contents *new_element) @@ -226,156 +236,162 @@ struct LispList } #endif - /* Take the first thing off the list */ - inline contents *get_head() - { - contents *c = 0; - if(first) - { - c = first->car; - delete rem_head(); - } - return c; - } - - /* Take something off the list */ - inline contents *get() - { return(get_head()); } + /* Take the first thing off the list */ + inline contents *get_head() + { + contents *c = 0; + if(first) { + c = first->car; + delete rem_head(); + } + return c; + } + + /* Take something off the list */ + inline contents *get() + { + return(get_head()); + } - /* XXX inline contents *get_tail() { } */ + /* XXX inline contents *get_tail() { } */ - /* -------- Stack simulation (by j.h.) ------------ */ - /* Put a thing onto the head of the list */ - inline void push( contents *c ) - { put_head( c ); } + /* -------- Stack simulation (by j.h.) ------------ */ + /* Put a thing onto the head of the list */ + inline void push(contents *c) + { + put_head(c); + } - /* Remove a thing from the head of the list */ - inline contents *pop() - { return(get_head()); } + /* Remove a thing from the head of the list */ + inline contents *pop() + { + return(get_head()); + } - /* Pop everything off the stack. Empty the stack/list. */ - inline void pop_all() - { rem_del_all(); } + /* Pop everything off the stack. Empty the stack/list. */ + inline void pop_all() + { + rem_del_all(); + } /* ----------- list/list manipulations ------------ */ - /* Add all elements present on another list to this list also. */ - inline void add_new(LispList other) - { - for (LispNode *n = other.first; n; n = n->cdr) - add_new(n->car); - } - inline void add_new_once(LispList other) - { - for (LispNode *n = other.first; n; n = n->cdr) - add_new_once(n->car); - } + /* Add all elements present on another list to this list also. */ + inline void add_new(LispList other) + { + for (LispNode *n = other.first; n; n = n->cdr) + add_new(n->car); + } + inline void add_new_once(LispList other) + { + for (LispNode *n = other.first; n; n = n->cdr) + add_new_once(n->car); + } - /* Remove and delete all nodes whose contents are also present - in a different list (set disjunction). */ - inline void rem_del(LispList other) - { - for (LispNode *n = other.first; n; n = n->cdr) - rem_del(n->car); - } + /* Remove and delete all nodes whose contents are also present + in a different list (set disjunction). */ + inline void rem_del(LispList other) + { + for (LispNode *n = other.first; n; n = n->cdr) + rem_del(n->car); + } }; template struct DoubleLinkedNode { - thetype *next,*prev; - - DoubleLinkedNode() { next = prev = NULL; }; - - void insert_after(thetype *n) - { - if (next != NULL) - next->prev = n; - n->next = next; - n->prev = (thetype*)this; - next = n; - }; - - void insert_before(thetype *n) - { - prev->next = n; - n->next = (thetype*)this; - n->prev = prev; - prev = n; - }; - - void remove() - { - assert(prev != NULL); - prev->next = next; - if (next != NULL) - next->prev = prev; - }; + thetype *next,*prev; + + DoubleLinkedNode() { next = prev = NULL; }; + + void insert_after(thetype *n) + { + if (next != NULL) + next->prev = n; + n->next = next; + n->prev = (thetype*)this; + next = n; + }; + + void insert_before(thetype *n) + { + prev->next = n; + n->next = (thetype*)this; + n->prev = prev; + prev = n; + }; + + void remove() + { + assert(prev != NULL); + prev->next = next; + if (next != NULL) + next->prev = prev; + }; }; template struct DoubleLinkedList : public DoubleLinkedNode { - DoubleLinkedList() : DoubleLinkedNode() {}; - - void insert(thetype *n) - { - insert_after(n); - }; - - void add(thetype *n) - { - insert_after(n); - }; + DoubleLinkedList() : DoubleLinkedNode() {}; + + void insert(thetype *n) + { + insert_after(n); + }; + + void add(thetype *n) + { + insert_after(n); + }; }; template -struct BufferArray -{ - T * items; - int num_items; - int num_slots; - int slot_inc; - - void resize(int i) - { - items = (T*)realloc(items,sizeof(T)*i); - num_slots = i; - }; - - T & operator [](int index) - { - assert(index < num_items); - return items[index]; - }; +struct BufferArray { + T * items; + int num_items; + int num_slots; + int slot_inc; - T & get(int index) - { - assert(index < num_items); - return items[index]; - }; - - void add(T &item) - { - if (num_items == num_slots) - resize(num_slots+slot_inc); - memcpy(items+num_items,&item,sizeof(item)); - num_items++; - }; - - BufferArray(int start_slots, int _slot_inc) - { - num_slots = start_slots; - slot_inc = _slot_inc; - assert(slot_inc > 0); - num_items = 0; - items = (T*)malloc(sizeof(T)*num_slots); - }; + void resize(int i) + { + items = (T*)realloc(items,sizeof(T)*i); + num_slots = i; + }; - ~BufferArray() - { - free(items); - }; + T & operator [](int index) + { + assert(index < num_items); + return items[index]; + }; + + T & get(int index) + { + assert(index < num_items); + return items[index]; + }; + + void add(T &item) + { + if (num_items == num_slots) + resize(num_slots+slot_inc); + memcpy(items+num_items,&item,sizeof(item)); + num_items++; + }; + + BufferArray(int start_slots, int _slot_inc) + { + num_slots = start_slots; + slot_inc = _slot_inc; + assert(slot_inc > 0); + num_items = 0; + items = (T*)malloc(sizeof(T)*num_slots); + }; + + ~BufferArray() + { + free(items); + }; }; -#endif +#endif // UTIL_H