From 5a9bf8f95a04140f0ff2c47e30493c7ba3581c41 Mon Sep 17 00:00:00 2001 From: Barak Itkin Date: Fri, 18 May 2012 19:16:20 +0300 Subject: [PATCH] Make functions on point/edge/triangle/mesh return reffed objects --- refine/edge.c | 5 +++-- refine/edge.h | 4 ++-- refine/mesh.c | 8 ++++++-- refine/mesh.h | 2 +- refine/point.c | 25 +++++++++++++++++++------ refine/point.h | 4 ++-- refine/triangle.c | 15 ++++++++------- refine/triangle.h | 2 +- 8 files changed, 42 insertions(+), 23 deletions(-) diff --git a/refine/edge.c b/refine/edge.c index 4744230..ff57bff 100644 --- a/refine/edge.c +++ b/refine/edge.c @@ -44,10 +44,11 @@ p2tr_edge_new (P2trPoint *start, return self; } -void +P2trEdge* p2tr_edge_ref (P2trEdge *self) { ++self->refcount; + return self; } void @@ -122,7 +123,7 @@ P2trMesh* p2tr_edge_get_mesh (P2trEdge *self) { if (self->end != NULL) - return self->end->mesh; + return p2tr_point_get_mesh (self->end); else return NULL; } diff --git a/refine/edge.h b/refine/edge.h index 392483f..0db0e8b 100644 --- a/refine/edge.h +++ b/refine/edge.h @@ -47,7 +47,7 @@ P2trEdge* p2tr_edge_new (P2trPoint *start, P2trPoint *end, gboolean constrained); -void p2tr_edge_ref (P2trEdge *self); +P2trEdge* p2tr_edge_ref (P2trEdge *self); void p2tr_edge_unref (P2trEdge *self); @@ -66,4 +66,4 @@ gdouble p2tr_edge_get_length_squared (P2trEdge* self); gdouble p2tr_edge_angle_between (P2trEdge *e1, P2trEdge *e2); -#endif \ No newline at end of file +#endif diff --git a/refine/mesh.c b/refine/mesh.c index a252ade..2272c6f 100644 --- a/refine/mesh.c +++ b/refine/mesh.c @@ -168,10 +168,11 @@ p2tr_mesh_unref (P2trMesh *self) p2tr_mesh_free (self); } -void +P2trMesh* p2tr_mesh_ref (P2trMesh *self) { ++self->refcount; + return self; } P2trTriangle* @@ -194,7 +195,7 @@ p2tr_mesh_find_point2 (P2trMesh *self, p2tr_hash_set_iter_init (&iter, self->triangles); while (p2tr_hash_set_iter_next (&iter, (gpointer*)&result)) if (p2tr_triangle_contains_point2 (result, pt, u, v) != P2TR_INTRIANGLE_OUT) - return result; + return p2tr_triangle_ref (result); return NULL; } @@ -250,5 +251,8 @@ p2tr_mesh_find_point_local2 (P2trMesh *self, p2tr_hash_set_free (checked_tris); g_queue_clear (&to_check); + if (result != NULL) + p2tr_triangle_ref (result); + return result; } diff --git a/refine/mesh.h b/refine/mesh.h index ed2cd27..e9aca11 100644 --- a/refine/mesh.h +++ b/refine/mesh.h @@ -62,7 +62,7 @@ void p2tr_mesh_destroy (P2trMesh *mesh); void p2tr_mesh_unref (P2trMesh *mesh); -void p2tr_mesh_ref (P2trMesh *mesh); +P2trMesh* p2tr_mesh_ref (P2trMesh *mesh); P2trTriangle* p2tr_mesh_find_point (P2trMesh *self, const P2trVector2 *pt); diff --git a/refine/point.c b/refine/point.c index feee202..efd1569 100644 --- a/refine/point.c +++ b/refine/point.c @@ -71,7 +71,7 @@ p2tr_point_get_edge_to (P2trPoint *start, if (result == NULL) p2tr_exception_programmatic ("Tried to get an edge that doesn't exist!"); else - return result; + return p2tr_edge_ref (result); } void @@ -113,6 +113,7 @@ p2tr_point_edge_ccw (P2trPoint *self, P2trEdge *e) { GList *node; + P2trEdge *result; if (P2TR_EDGE_START(e) != self) p2tr_exception_programmatic ("Not an edge of this point!"); @@ -122,7 +123,8 @@ p2tr_point_edge_ccw (P2trPoint *self, p2tr_exception_programmatic ("Could not find the CCW sibling edge" "because the edge is not present in the outgoing-edges list!"); - return (P2trEdge*) g_list_cyclic_next (self->outgoing_edges, node); + result = (P2trEdge*) g_list_cyclic_next (self->outgoing_edges, node); + return p2tr_edge_ref (result); } P2trEdge* @@ -130,6 +132,7 @@ p2tr_point_edge_cw (P2trPoint* self, P2trEdge *e) { GList *node; + P2trEdge *result; if (P2TR_EDGE_START(e) != self) p2tr_exception_programmatic ("Not an edge of this point!"); @@ -139,7 +142,8 @@ p2tr_point_edge_cw (P2trPoint* self, p2tr_exception_programmatic ("Could not find the CW sibling edge" "because the edge is not present in the outgoing-edges list!"); - return (P2trEdge*) g_list_cyclic_prev (self->outgoing_edges, node); + result = (P2trEdge*) g_list_cyclic_prev (self->outgoing_edges, node); + return p2tr_edge_ref (result); } gboolean @@ -164,10 +168,16 @@ p2tr_point_has_constrained_edge (P2trPoint *self) return FALSE; } -void +/** + * Increase the reference count of the given input point + * @param self - The point to ref + * @return The point given + */ +P2trPoint* p2tr_point_ref (P2trPoint *self) { ++self->refcount; + return self; } void @@ -180,5 +190,8 @@ p2tr_point_unref (P2trPoint *self) P2trMesh* p2tr_point_get_mesh (P2trPoint *self) { - return self->mesh; -} \ No newline at end of file + if (self->mesh) + return p2tr_mesh_ref (self->mesh); + else + return NULL; +} diff --git a/refine/point.h b/refine/point.h index 36ac404..586d9ea 100644 --- a/refine/point.h +++ b/refine/point.h @@ -31,7 +31,7 @@ P2trPoint* p2tr_point_new (const P2trVector2 *c); P2trPoint* p2tr_point_new2 (gdouble x, gdouble y); -void p2tr_point_ref (P2trPoint *self); +P2trPoint* p2tr_point_ref (P2trPoint *self); void p2tr_point_unref (P2trPoint *self); @@ -63,4 +63,4 @@ gboolean p2tr_point_has_constrained_edge (P2trPoint *self); P2trMesh* p2tr_point_get_mesh (P2trPoint *self); -#endif \ No newline at end of file +#endif diff --git a/refine/triangle.c b/refine/triangle.c index ae231b5..b46f41d 100644 --- a/refine/triangle.c +++ b/refine/triangle.c @@ -75,10 +75,11 @@ p2tr_triangle_new (P2trEdge *AB, return self; } -void +P2trTriangle* p2tr_triangle_ref (P2trTriangle *self) { ++self->refcount; + return self; } void @@ -139,11 +140,11 @@ p2tr_triangle_get_opposite_point (P2trTriangle *self, P2trEdge *e) { if (self->edges[0] == e || self->edges[0]->mirror == e) - return self->edges[1]->end; + return p2tr_point_ref (self->edges[1]->end); if (self->edges[1] == e || self->edges[1]->mirror == e) - return self->edges[2]->end; + return p2tr_point_ref (self->edges[2]->end); if (self->edges[2] == e || self->edges[2]->mirror == e) - return self->edges[0]->end; + return p2tr_point_ref (self->edges[0]->end); p2tr_exception_programmatic ("The edge is not in the triangle!"); } @@ -153,11 +154,11 @@ p2tr_triangle_get_opposite_edge (P2trTriangle *self, P2trPoint *p) { if (self->edges[0]->end == p) - return self->edges[2]; + return p2tr_edge_ref (self->edges[2]); if (self->edges[1]->end == p) - return self->edges[0]; + return p2tr_edge_ref (self->edges[0]); if (self->edges[2]->end == p) - return self->edges[1]; + return p2tr_edge_ref (self->edges[1]); p2tr_exception_programmatic ("The point is not in the triangle!"); } diff --git a/refine/triangle.h b/refine/triangle.h index 048c1ae..164f7c8 100644 --- a/refine/triangle.h +++ b/refine/triangle.h @@ -20,7 +20,7 @@ P2trTriangle* p2tr_triangle_new (P2trEdge *AB, P2trEdge *BC, P2trEdge *CA); -void p2tr_triangle_ref (P2trTriangle *self); +P2trTriangle* p2tr_triangle_ref (P2trTriangle *self); void p2tr_triangle_unref (P2trTriangle *self); -- 2.40.0