GtNodeVisitor* gt_cds_check_visitor_new(void) { GtNodeVisitor *nv = gt_node_visitor_create(gt_cds_check_visitor_class()); GtCDSCheckVisitor *v = cds_check_visitor_cast(nv); v->cds_features = gt_hashmap_new(GT_HASH_DIRECT, NULL, NULL); return nv; }
static int cds_check_visitor_feature_node(GtNodeVisitor *nv, GtFeatureNode *fn, GtError *err) { GtCDSCheckVisitor *v = cds_check_visitor_cast(nv); GtFeatureNodeIterator *fni; GtFeatureNode *node; int had_err = 0; gt_error_check(err); gt_assert(v && fn); fni = gt_feature_node_iterator_new(fn); while (!had_err && (node = gt_feature_node_iterator_next(fni))) had_err = check_cds_phases_if_necessary(node, v, false, err); gt_feature_node_iterator_delete(fni); gt_hashmap_reset(v->cds_features); while (v->splitting_is_necessary) { split_cds_features(v->cds_features_to_split, fn); gt_hashmap_reset(v->cds_features_to_split); v->splitting_is_necessary = false; /* perform second pass to correct phases */ fni = gt_feature_node_iterator_new(fn); while (!had_err && (node = gt_feature_node_iterator_next(fni))) had_err = check_cds_phases_if_necessary(node, v, false, err); gt_feature_node_iterator_delete(fni); gt_hashmap_reset(v->cds_features); } return had_err; }
static int cds_check_visitor_feature_node(GtNodeVisitor *nv, GtFeatureNode *fn, GtError *err) { GtCDSCheckVisitor *v = cds_check_visitor_cast(nv); GtFeatureNodeIterator *fni; GtFeatureNode *node; int had_err = 0; gt_error_check(err); gt_assert(v && fn); fni = gt_feature_node_iterator_new(fn); while (!had_err && (node = gt_feature_node_iterator_next(fni))) had_err = check_cds_phases_if_necessary(node, v, err); gt_feature_node_iterator_delete(fni); gt_hashmap_reset(v->cds_features); return had_err; }
static void cds_check_visitor_free(GtNodeVisitor *nv) { GtCDSCheckVisitor *v = cds_check_visitor_cast(nv); gt_hashmap_delete(v->cds_features_to_split); gt_hashmap_delete(v->cds_features); }