13 if (tnew < troot) troot = tnew;
14 if (!empty() && tnew <
time()) {
16 while (!empty() && p->
slate > tnew) {
18 while (p->size() > 1) {
22 p->erase(b);
delete b;
40 if (!empty()) p = back();
44 if (!empty() && troot >
timezero()) {
47 while (!empty() && p->
slate < troot) {
50 while (p->size() > 1) {
54 p->erase(b);
delete b;
59 move(b,p,q); push_back(q);
67 if (q->
slate < troot) {
72 move(b,p,pp); push_back(pp);
78 if (!empty()) p = front();
88 SEXP
curtail (SEXP State, SEXP Time, SEXP Troot) {
91 t = *REAL(AS_NUMERIC(Time));
92 t0 = *REAL(AS_NUMERIC(Troot));
93 if (ISNA(t)) t = A.
time();
98 SET_ATTR(out,install(
"class"),mkString(
"gpgen"));
Balls function as pointers.
name_t deme(void) const
view deme
node_t * child(void) const
a child is the owner of a green ball
slate_t & timezero(void)
view/set zero time.
slate_t & time(void)
view/set current time.
node_t * make_node(name_t d=undeme)
void curtail(slate_t tnew, slate_t troot)
Encodes a genealogical node.
name_t deme(void) const
view deme
ball_t * green_ball(void) const
pointer to my green ball
bool holds_own(void) const
void sort(void)
order nodes in order of increasing time
void destroy_node(node_t *p)
remove a dead root node
void swap(ball_t *a, ball_t *b)
swap balls a and b, wherever they lie
void move(ball_t *b, node_t *p, node_t *q)
move ball b from p to q
ball_t * last_ball(void) const
retrieve the last ball
ball_t * first_ball(void) const
retrieve the first ball
SEXP curtail(SEXP State, SEXP Time, SEXP Troot)
curtail the given genealogy
SEXP serial(const TYPE &X)
binary serialization