static int gt_sort_stream_next(GtNodeStream *ns, GtGenomeNode **gn, GtError *err) { GtSortStream *sort_stream; GtGenomeNode *node, *eofn; int had_err = 0; gt_error_check(err); sort_stream = gt_sort_stream_cast(ns); if (!sort_stream->sorted) { while (!(had_err = gt_node_stream_next(sort_stream->in_stream, &node, err)) && node) { if ((eofn = gt_eof_node_try_cast(node))) gt_genome_node_delete(eofn); /* get rid of EOF nodes */ else gt_array_add(sort_stream->nodes, node); } if (!had_err) { gt_genome_nodes_sort_stable(sort_stream->nodes); sort_stream->sorted = true; } } if (!had_err) { gt_assert(sort_stream->sorted); if (sort_stream->idx < gt_array_size(sort_stream->nodes)) { *gn = *(GtGenomeNode**) gt_array_get(sort_stream->nodes, sort_stream->idx); sort_stream->idx++; /* join region nodes with the same sequence ID */ if (gt_region_node_try_cast(*gn)) { GtRange range_a, range_b; while (sort_stream->idx < gt_array_size(sort_stream->nodes)) { node = *(GtGenomeNode**) gt_array_get(sort_stream->nodes, sort_stream->idx); if (!gt_region_node_try_cast(node) || gt_str_cmp(gt_genome_node_get_seqid(*gn), gt_genome_node_get_seqid(node))) { /* the next node is not a region node with the same ID */ break; } range_a = gt_genome_node_get_range(*gn); range_b = gt_genome_node_get_range(node); range_a = gt_range_join(&range_a, &range_b); gt_genome_node_set_range(*gn, &range_a); gt_genome_node_delete(node); sort_stream->idx++; } } return 0; } } if (!had_err) { gt_array_reset(sort_stream->nodes); *gn = NULL; } return had_err; }
static int stat_stream_next(GtNodeStream *ns, GtGenomeNode **gn, GtError *err) { GtStatStream *stat_stream; int had_err; gt_error_check(err); stat_stream = stat_stream_cast(ns); had_err = gt_node_stream_next(stat_stream->in_stream, gn, err); if (!had_err) { gt_assert(stat_stream->stat_visitor); if (*gn) { if (!gt_eof_node_try_cast(*gn)) /* do not count EOF nodes */ stat_stream->number_of_DAGs++; had_err = gt_genome_node_accept(*gn, stat_stream->stat_visitor, err); gt_assert(!had_err); /* the status visitor is sane */ } } return had_err; }
static int gt_load_stream_next(GtNodeStream *ns, GtGenomeNode **gn, GtError *err) { GtLoadStream *load_stream; GtGenomeNode *node, *eofn; int had_err = 0; gt_error_check(err); load_stream = gt_load_stream_cast(ns); if (!load_stream->full) { while (!(had_err = gt_node_stream_next(load_stream->in_stream, &node, err)) && node) { if ((eofn = gt_eof_node_try_cast(node))) gt_genome_node_delete(eofn); /* get rid of EOF nodes */ else gt_array_add(load_stream->nodes, node); } if (!had_err) { load_stream->full = true; } } if (!had_err) { gt_assert(load_stream->full); if (load_stream->idx < gt_array_size(load_stream->nodes)) { *gn = *(GtGenomeNode**) gt_array_get(load_stream->nodes, load_stream->idx); load_stream->idx++; return 0; } } if (!had_err) { gt_array_reset(load_stream->nodes); *gn = NULL; } return had_err; }