GtsSegmentClass* pygts_parent_segment_class(void) { static GtsSegmentClass *klass = NULL; GtsObjectClass *super = NULL; if (klass == NULL) { super = GTS_OBJECT_CLASS(gts_segment_class()); GtsObjectClassInfo pygts_parent_segment_info = { "PygtsParentSegment", sizeof(PygtsParentSegment), sizeof(GtsSegmentClass), (GtsObjectClassInitFunc)(super->info.class_init_func), (GtsObjectInitFunc)(super->info.object_init_func), (GtsArgSetFunc) NULL, (GtsArgGetFunc) NULL }; klass = (GtsSegmentClass*)gts_object_class_new(gts_object_class(), &pygts_parent_segment_info); } return klass; }
static void segment_destroy (GtsObject * object) { GtsSegment * segment = GTS_SEGMENT (object); GtsVertex * v1 = segment->v1; GtsVertex * v2 = segment->v2; v1->segments = g_slist_remove (v1->segments, segment); if (!GTS_OBJECT_DESTROYED (v1) && !gts_allow_floating_vertices && v1->segments == NULL) gts_object_destroy (GTS_OBJECT (v1)); v2->segments = g_slist_remove (v2->segments, segment); if (!GTS_OBJECT_DESTROYED (v2) && !gts_allow_floating_vertices && v2->segments == NULL) gts_object_destroy (GTS_OBJECT (v2)); (* GTS_OBJECT_CLASS (gts_segment_class ())->parent_class->destroy) (object); }
/** * gts_edge_class: * * Returns: the #GtsEdgeClass. */ GtsEdgeClass * gts_edge_class (void) { static GtsEdgeClass * klass = NULL; if (klass == NULL) { GtsObjectClassInfo edge_info = { "GtsEdge", sizeof (GtsEdge), sizeof (GtsEdgeClass), (GtsObjectClassInitFunc) edge_class_init, (GtsObjectInitFunc) edge_init, (GtsArgSetFunc) NULL, (GtsArgGetFunc) NULL }; klass = gts_object_class_new (GTS_OBJECT_CLASS (gts_segment_class ()), &edge_info); } return klass; }
static PyObject * new_(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *o; PygtsObject *obj; GtsSegment *tmp; GtsObject *segment=NULL; PyObject *v1_=NULL,*v2_=NULL; PygtsVertex *v1,*v2; guint alloc_gtsobj = TRUE; guint N; /* Parse the args */ if(kwds) { o = PyDict_GetItemString(kwds,"alloc_gtsobj"); if(o==Py_False) { alloc_gtsobj = FALSE; } if(o!=NULL) { PyDict_DelItemString(kwds, "alloc_gtsobj"); } } if(kwds) { Py_INCREF(Py_False); PyDict_SetItemString(kwds,"alloc_gtsobj", Py_False); } /* Allocate the gtsobj (if needed) */ if( alloc_gtsobj ) { /* Parse the args */ if( (N = PyTuple_Size(args)) < 2 ) { PyErr_SetString(PyExc_TypeError,"expected two Vertices"); return NULL; } v1_ = PyTuple_GET_ITEM(args,0); v2_ = PyTuple_GET_ITEM(args,1); /* Convert to PygtsObjects */ if(!pygts_vertex_check(v1_)) { PyErr_SetString(PyExc_TypeError,"expected two Vertices"); return NULL; } if(!pygts_vertex_check(v2_)) { PyErr_SetString(PyExc_TypeError,"expected two Vertices"); return NULL; } v1 = PYGTS_VERTEX(v1_); v2 = PYGTS_VERTEX(v2_); /* Error check */ if(PYGTS_OBJECT(v1)->gtsobj == PYGTS_OBJECT(v2)->gtsobj) { PyErr_SetString(PyExc_ValueError,"Vertices are identical"); return NULL; } /* Create the GtsSegment */ segment = GTS_OBJECT(gts_segment_new(gts_segment_class(), GTS_VERTEX(v1->gtsobj), GTS_VERTEX(v2->gtsobj))); if( segment == NULL ) { PyErr_SetString(PyExc_MemoryError, "could not create Segment"); return NULL; } /* Check for duplicate */ tmp = gts_segment_is_duplicate(GTS_SEGMENT(segment)); if( tmp != NULL ) { gts_object_destroy(segment); segment = GTS_OBJECT(tmp); } /* If corresponding PyObject found in object table, we are done */ if( (obj=(PygtsObject*)g_hash_table_lookup(obj_table,segment)) != NULL ) { Py_INCREF(obj); return (PyObject*)obj; } } /* Chain up */ obj = PYGTS_OBJECT(PygtsObjectType.tp_new(type,args,kwds)); if( alloc_gtsobj ) { obj->gtsobj = segment; pygts_object_register(PYGTS_OBJECT(obj)); } return (PyObject*)obj; }