[Scummvm-cvs-logs] SF.net SVN: scummvm:[38827] scummvm/trunk/engines/sci
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Tue Feb 24 05:30:42 CET 2009
Revision: 38827
http://scummvm.svn.sourceforge.net/scummvm/?rev=38827&view=rev
Author: fingolfin
Date: 2009-02-24 04:30:41 +0000 (Tue, 24 Feb 2009)
Log Message:
-----------
SCI: Turned circular list code into a small class
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/kpathing.cpp
scummvm/trunk/engines/sci/include/list.h
Modified: scummvm/trunk/engines/sci/engine/kpathing.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kpathing.cpp 2009-02-24 04:01:53 UTC (rev 38826)
+++ scummvm/trunk/engines/sci/engine/kpathing.cpp 2009-02-24 04:30:41 UTC (rev 38827)
@@ -103,8 +103,11 @@
// Index
int idx;
- // Vertex list entry
- CLIST_ENTRY(vertex_t) entries;
+ // Vertex circular list entry
+ struct {
+ vertex_t *cle_next; // next element
+ vertex_t *cle_prev; // previous element
+ } entries;
// Dijkstra list entry
LIST_ENTRY(vertex_t) dijkstra;
@@ -116,11 +119,68 @@
vertex_t *path_prev;
};
-typedef CLIST_HEAD(vertices_head, vertex_t) vertices_head_t;
+class CircularVertexList {
+public:
+ vertex_t *_head;
+public:
+ CircularVertexList() : _head(0) {}
+
+ vertex_t *first() {
+ return _head;
+ }
+
+ void insertHead(vertex_t *elm) {
+ if (_head == NULL) {
+ elm->entries.cle_next = elm->entries.cle_prev = elm;
+ } else {
+ elm->entries.cle_next = _head;
+ elm->entries.cle_prev = _head->entries.cle_prev;
+ _head->entries.cle_prev = elm;
+ elm->entries.cle_prev->entries.cle_next = elm;
+ }
+ _head = elm;
+ }
+
+ static void insertAfter(vertex_t *listelm, vertex_t *elm) {
+ elm->entries.cle_prev = listelm;
+ (elm)->entries.cle_next = listelm->entries.cle_next;
+ listelm->entries.cle_next->entries.cle_prev = elm;
+ listelm->entries.cle_next = elm;
+ }
+
+ void remove(vertex_t *elm) {
+ if (elm->entries.cle_next == elm) {
+ _head = NULL;
+ } else {
+ if (_head == elm)
+ _head = elm->entries.cle_next;
+ elm->entries.cle_prev->entries.cle_next = elm->entries.cle_next;
+ elm->entries.cle_next->entries.cle_prev = elm->entries.cle_prev;
+ }
+ }
+
+ bool empty() const {
+ return _head == NULL;
+ }
+};
+
+/* Circular list definitions. */
+
+#define CLIST_FOREACH(var, head, field) \
+ for ((var) = (head)->first(); \
+ (var); \
+ (var) = ((var)->field.cle_next == (head)->first() ? \
+ NULL : (var)->field.cle_next))
+
+/* Circular list access methods. */
+#define CLIST_NEXT(elm, field) ((elm)->field.cle_next)
+#define CLIST_PREV(elm, field) ((elm)->field.cle_prev)
+
+
struct polygon_t {
// Circular list of vertices
- vertices_head_t vertices;
+ CircularVertexList vertices;
// Polygon list entry
LIST_ENTRY(polygon_t) entries;
@@ -408,9 +468,7 @@
// Allocates and initialises a new polygon
// Parameters: (int) type: The SCI polygon type
// Returns : (polygon_t *) A newly allocated polygon
- polygon_t *polygon = (polygon_t*)sci_malloc(sizeof(polygon_t));
-
- CLIST_INIT(&polygon->vertices);
+ polygon_t *polygon = new polygon_t();
polygon->type = type;
return polygon;
@@ -485,7 +543,7 @@
// Computes polygon area
// Parameters: (polygon_t *) polygon: The polygon
// Returns : (int) The area multiplied by two
- vertex_t *first = CLIST_FIRST(&polygon->vertices);
+ vertex_t *first = polygon->vertices.first();
vertex_t *v;
int size = 0;
@@ -512,16 +570,15 @@
// clockwise
if (((area > 0) && (polygon->type == POLY_CONTAINED_ACCESS))
|| ((area < 0) && (polygon->type != POLY_CONTAINED_ACCESS))) {
- vertices_head_t vertices;
// Create a new circular list
- CLIST_INIT(&vertices);
+ CircularVertexList vertices;
- while (!CLIST_EMPTY(&polygon->vertices)) {
+ while (!polygon->vertices.empty()) {
// Put first vertex in new list
- vertex_t *vertex = CLIST_FIRST(&polygon->vertices);
- CLIST_REMOVE(&polygon->vertices, vertex, entries);
- CLIST_INSERT_HEAD(&vertices, vertex, entries);
+ vertex_t *vertex = polygon->vertices.first();
+ polygon->vertices.remove(vertex);
+ vertices.insertHead(vertex);
}
polygon->vertices = vertices;
@@ -727,7 +784,7 @@
LIST_FOREACH(polygon, &s->polygons, entries) {
vertex_t *vertex;
- vertex = CLIST_FIRST(&polygon->vertices);
+ vertex = polygon->vertices.first();
// Check that there is more than one vertex.
if (VERTEX_HAS_EDGES(vertex))
@@ -1067,20 +1124,20 @@
// Check for point being on an edge
LIST_FOREACH(polygon, &s->polygons, entries)
// Skip single-vertex polygons
- if (VERTEX_HAS_EDGES(CLIST_FIRST(&polygon->vertices)))
+ if (VERTEX_HAS_EDGES(polygon->vertices.first()))
CLIST_FOREACH(vertex, &polygon->vertices, entries) {
vertex_t *next = CLIST_NEXT(vertex, entries);
if (between(vertex->v, next->v, v)) {
// Split edge by adding vertex
- CLIST_INSERT_AFTER(vertex, v_new, entries);
+ polygon->vertices.insertAfter(vertex, v_new);
return v_new;
}
}
// Add point as single-vertex polygon
polygon = polygon_new(POLY_BARRED_ACCESS);
- CLIST_INSERT_HEAD(&polygon->vertices, v_new, entries);
+ polygon->vertices.insertHead(v_new);
LIST_INSERT_HEAD(&s->polygons, polygon, entries);
return v_new;
@@ -1100,7 +1157,7 @@
for (i = 0; i < size; i++) {
vertex_t *vertex = vertex_new(read_point(list, is_reg_t, i));
- CLIST_INSERT_HEAD(&poly->vertices, vertex, entries);
+ poly->vertices.insertHead(vertex);
}
fix_vertex_order(poly);
@@ -1112,13 +1169,13 @@
// Frees a polygon and its vertices
// Parameters: (polygon_t *) polygons: The polygon
// Returns : (void)
- while (!CLIST_EMPTY(&polygon->vertices)) {
- vertex_t *vertex = CLIST_FIRST(&polygon->vertices);
- CLIST_REMOVE(&polygon->vertices, vertex, entries);
+ while (!polygon->vertices.empty()) {
+ vertex_t *vertex = polygon->vertices.first();
+ polygon->vertices.remove(vertex);
free(vertex);
}
- free(polygon);
+ delete polygon;
}
static void free_pf_state(pf_state_t *p) {
Modified: scummvm/trunk/engines/sci/include/list.h
===================================================================
--- scummvm/trunk/engines/sci/include/list.h 2009-02-24 04:01:53 UTC (rev 38826)
+++ scummvm/trunk/engines/sci/include/list.h 2009-02-24 04:30:41 UTC (rev 38827)
@@ -103,68 +103,7 @@
#define LIST_FIRST(head) ((head)->lh_first)
#define LIST_NEXT(elm, field) ((elm)->field.le_next)
-/* Circular list definitions. */
-#define CLIST_HEAD(name, type) \
-struct name { \
- type *clh_first; /* first element. */ \
-}
-
-#define CLIST_ENTRY(type) \
-struct { \
- type *cle_next; /* next element. */ \
- type *cle_prev; /* previous element */ \
-}
-
-#define CLIST_INIT(head) do { \
- (head)->clh_first = NULL; \
-} while (0)
-
-#define CLIST_INSERT_HEAD(head, elm, field) do { \
- if ((head)->clh_first == NULL) \
- (elm)->field.cle_next = (elm)->field.cle_prev = (elm); \
- else { \
- (elm)->field.cle_next = (head)->clh_first; \
- (elm)->field.cle_prev = \
- (head)->clh_first->field.cle_prev; \
- (head)->clh_first->field.cle_prev = (elm); \
- (elm)->field.cle_prev->field.cle_next = (elm); \
- } \
- (head)->clh_first = (elm); \
-} while (0)
-
-#define CLIST_INSERT_AFTER(listelm, elm, field) do { \
- (elm)->field.cle_prev = (listelm); \
- (elm)->field.cle_next = (listelm)->field.cle_next; \
- (listelm)->field.cle_next->field.cle_prev = (elm); \
- (listelm)->field.cle_next = (elm); \
-} while (0)
-
-#define CLIST_REMOVE(head, elm, field) do { \
- if ((elm)->field.cle_next == (elm)) \
- (head)->clh_first = NULL; \
- else { \
- if ((head)->clh_first == (elm)) \
- (head)->clh_first = (elm)->field.cle_next; \
- (elm)->field.cle_prev->field.cle_next = \
- (elm)->field.cle_next; \
- (elm)->field.cle_next->field.cle_prev = \
- (elm)->field.cle_prev; \
- } \
-} while (0)
-
-#define CLIST_FOREACH(var, head, field) \
- for ((var) = (head)->clh_first; \
- (var); \
- (var) = ((var)->field.cle_next == (head)->clh_first ? \
- NULL : (var)->field.cle_next))
-
-/* Circular list access methods. */
-#define CLIST_EMPTY(head) ((head)->clh_first == NULL)
-#define CLIST_FIRST(head) ((head)->clh_first)
-#define CLIST_NEXT(elm, field) ((elm)->field.cle_next)
-#define CLIST_PREV(elm, field) ((elm)->field.cle_prev)
-
} // End of namespace Sci
#endif /* !_SCI_LIST_H */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list