14 if (tnew < troot) troot = tnew;
15 if (!empty() && tnew <
time()) {
17 while (!empty() && p->
slate > tnew) {
19 while (p->size() > 1) {
23 p->erase(b);
delete b;
41 if (!empty()) p = back();
45 if (!empty() && troot >
timezero()) {
48 while (!empty() && p->
slate < troot) {
51 while (p->size() > 1) {
55 p->erase(b);
delete b;
60 move(b,p,q); push_back(q);
68 if (q->
slate < troot) {
73 move(b,p,pp); push_back(pp);
79 if (!empty()) p = front();
89 SEXP
curtail (SEXP State, SEXP Time, SEXP Troot) {
92 t = *REAL(AS_NUMERIC(Time));
93 t0 = *REAL(AS_NUMERIC(Troot));
94 if (ISNA(t)) t = A.
time();
99 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