Index: doc/theses/mike_brooks_MMath/benchmarks/list/.gitignore
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/.gitignore	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/.gitignore	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,4 @@
+perfexp--*
+*.d
+results--*.csv
+results-latest.csv
Index: doc/theses/mike_brooks_MMath/benchmarks/list/Makefile
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/Makefile	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/Makefile	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,141 @@
+
+CFA = cfa
+CXX = g++-11
+UXX =  ~/u++/u++-7.0.0/bin/u++
+
+MODE = performance
+RUNARGS=
+
+ifeq "$(MODE)" "performance"
+PERFFLAGS_CFA = -nodebug -O3
+PERFFLAGS_CC  = -DNDEBUG -O3
+else ifeq "$(MODE)" "correctness"
+PERFFLAGS_CFA = -debug -O0 -g
+PERFFLAGS_CC = -O0 -g
+else
+$(error Bad MODE ($(MODE)); should be performance or correctness)
+endif
+
+PERFFLAGS_CXX = $(PERFFLAGS_CC)
+PERFFLAGS_UXX = $(PERFFLAGS_CC)
+
+SHELL = /usr/bin/bash
+
+# function: project an element from a filename that contains a delimited tuple
+# (call proj,-,a-b-c.hfa,3)
+# is
+# c
+define proj
+$(word $(3),$(subst $(1), ,$(basename $(2))))
+endef
+
+# functions: cross two lists, adding given delimiter between
+# (call cross,-,a b c,1 2)
+# is
+# a-1 a-2 b-1 b-2 c-1 c-2
+define cross
+$(foreach x,$(2),$(foreach xs,$(3),$(x)$(1)$(xs)))
+endef
+define cross3
+$(call cross,$(1),$(2),$(call cross,$(1),$(3),$(4)))
+endef
+define cross4
+$(call cross,$(1),$(2),$(call cross3,$(1),$(3),$(4),$(5)))
+endef
+define cross5
+$(call cross,$(1),$(2),$(call cross4,$(1),$(3),$(4),$(5),$(6)))
+endef
+
+OP_MOVEMENTS=stack queue
+OP_POLARITIES=insfirst inslast
+OP_ACCESSORS=allhead inselem remelem
+FX_SOLUTIONS=lq-tailq lq-list cfa-cfa upp-upp cpp-stlref
+
+OPS=$(call cross3,-,$(OP_MOVEMENTS),$(OP_POLARITIES),$(OP_ACCESSORS))
+FXS=$(FX_SOLUTIONS)
+
+all : perfprogs results-latest.csv
+
+# Want to add functional dependency:
+# if current FX_SOLUTION is lq-list then
+# current OP_MOVEMENT must be stack and
+# current OP_POLARITY must be insfirst
+LQ_LIST_INCOMPAT_OP_MOVEMENTS=$(filter-out stack,$(OP_MOVEMENTS))
+LQ_LIST_INCOMPAT_OP_POLARITIES=$(filter-out insfirst,$(OP_POLARITIES))
+LQ_LIST_INCOMPAT_OPS=$(call cross3,-,$(LQ_LIST_INCOMPAT_OP_MOVEMENTS),$(OP_POLARITIES),$(OP_ACCESSORS)) \
+                     $(call cross3,-,$(OP_MOVEMENTS),$(LQ_LIST_INCOMPAT_OP_POLARITIES),$(OP_ACCESSORS))
+INCOMPAT=$(call cross,--,lq-list,$(LQ_LIST_INCOMPAT_OPS))
+define filterFds
+$(filter-out $(INCOMPAT),$(1))
+endef
+
+
+CORES_FULL=$(call cross,--,$(FXS),$(OPS))                # lq-tailq--stack-inslast-allhead
+CORES=$(call filterFds,$(CORES_FULL))                    # lq-tailq--stack-inslast-allhead
+
+
+PERFPROGS=$(call cross,--,perfexp,$(CORES))
+
+perfprogs : $(PERFPROGS)
+
+perfexp--% driver--%.o result--%.1csv : FX=$(call proj,--,$@,2)
+perfexp--% driver--%.o result--%.1csv : FX_COARSE=$(call proj,-,$(FX),1)
+perfexp--% driver--%.o result--%.1csv : OP=$(call proj,--,$@,3)
+perfexp--% driver--%.o result--%.1csv : OP_MOVEMENT=$(call proj,-,$(OP),1)
+perfexp--% driver--%.o result--%.1csv : OP_POLARITY=$(call proj,-,$(OP),2)
+perfexp--% driver--%.o result--%.1csv : OP_ACCESSOR=$(call proj,-,$(OP),3)
+perfexp--% driver--%.o result--%.1csv : OP_DEFINES=-DOP_MOVEMENT=$(OP_MOVEMENT) -DOP_POLARITY=$(OP_POLARITY) -DOP_ACCESSOR=$(OP_ACCESSOR)
+
+perfexp--cfa-% driver--cfa-%.o : COMPILER=$(CFA) $(PERFFLAGS_CFA)
+perfexp--lq-%  driver--lq-%.o  : COMPILER=$(CC)  $(PERFFLAGS_CC)
+perfexp--cpp-% driver--cpp-%.o : COMPILER=$(CXX) $(PERFFLAGS_CXX)
+perfexp--upp-% driver--upp-%.o : COMPILER=$(UXX) $(PERFFLAGS_UXX)
+perfexp--%     driver--%.o     : COMPILER=NO-COMPILER-FOR-$(FX_COARSE)
+
+perfexp--% : driver--%.o observation.o
+	$(COMPILER) $^ -o $@
+
+driver--%.o : driver.c
+	$(COMPILER) -c $< $(OP_DEFINES) -include op-$(OP).h -include fx-$(FX).h -o $@ -MMD 
+
+
+
+
+RUN_NUM_REPS=3
+RUN_REP_IDS=$(shell echo {1..$(RUN_NUM_REPS)})              # 1 2 3
+RUN_REP_EXTS=$(call cross3,,run,$(RUN_REP_IDS),.1csv)       # run1.1csv run2.1cav run3.1csv
+
+RESULT1S=$(call cross,.,$(CORES),$(RUN_REP_EXTS))   # lq-tailq--stack-inslast-allhead.run2.1csv
+
+RESULT1S_SHUFD=$(shell shuf -e $(RESULT1S))
+
+%.1csv : CORE=$(basename $(basename $@))
+%.1csv : REP_ID=$(subst .run,,$(suffix $(basename $@)))
+%.1csv : REP_TIME=$(shell date '+%F %H:%M:%S')
+%.1csv : perfprogs FORCE
+	./perfexp--$(CORE) $(RUNARGS) | xargs -n 1 printf '%s,%s,%s\n' "$(REP_TIME)" "$(REP_ID)" | tee $@
+
+BATCHTIME=$(shell date '+%F--%H-%M-%S')
+
+results--$(BATCHTIME).csv : $(RESULT1S_SHUFD)
+	cat $^ | tee $@
+	rm $^
+
+results-latest.csv : results--$(BATCHTIME).csv
+	rm -f $@
+	ln -s $< $@
+
+
+
+clean :
+	rm -f *.o *.d perfexp--*
+
+# The FORCE business means any target that mentions it is also phony
+# https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html says: To always rebuild a pattern rule consider using a “force target” (see [https://www.gnu.org/software/make/manual/html_node/Force-Targets.html]).
+.PHONY: all perfprogs results-latest.csv clean
+FORCE:
+
+.PRECIOUS: result--%.1csv driver--%.o perfexp--% %.o
+
+
+-include *.d
Index: doc/theses/mike_brooks_MMath/benchmarks/list/_classic.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/_classic.c	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/_classic.c	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,252 @@
+/*
+
+$cfa is the result of building this configuration:
+../cfa-cc/configure --with-target-hosts=host:nodebug
+
+
+Make it fixed duration and report mean time/op.
+
+I want the field of competitors to include
+        STL-reference
+        STL-value
+        u++ intrusive
+        LQ intrusive
+        Something from Boost?
+
+Insert-remove tests
+-------------------
+
+These are the fundamental list operations.
+
+The basic end-managed shapes:
+        First-First stack
+        Last-Last stack
+        First-to-last queue
+        Last-to-first queue
+        Rando Deque
+
+Do the basic shapes, using the head for both operations.
+Repeat the basic shapes, using the head for one operation and an element accessor for the other.
+
+Fix a baseline basic shape 
+  - probably first-first stack
+  - intent: the best and simplest
+Varying the fun operation across insert, remove
+Do the fun operation as item-oriented random middle.
+Do the boring operation (probably) using head-provided accessors
+
+All the above on a subsequent list direction
+
+Probably want to vary
+ - am linking nodes in memory order
+ - random access
+
+
+
+Traversal tests
+---------------
+
+Set up a large bunch of inter-linked nodes.  Walk the list.
+
+Cases
+ - am walking in memory order
+ - am walking doing random access
+
+
+
+Measures of overhead
+--------------------
+
+Example motivations
+- some scenarios need running an RNG each iteration
+  - don't assume I'm getting the same RNG on each platform
+  - don't report time in RNG as a slowdown of the scenario that needs it
+- slowdowns due to random accesses (inevitable cache misses) are the user's fault
+- slowdowns due to memory allocation are the SUT's fault
+- slowdowns due to cache churn because SUT uses more memory than necessary are SUT's fault
+  - these are also unlikely
+  - I haven't designed experiments to catch it
+
+Actual RNG uses
+- for the rando-deque scenario: coin toss to work at head or tail
+- for the insert/remove-at-middle operations: index of item (in master array) to work on next
+    - can be a precomputed master array
+> It almost all generalizes into a precomputed master array
+  - Except: choice of head-oriented at-front/at-back implies different control flow (branch prediction, FP indirection)
+    - While an element-oriented operation is always the same control flow
+    - [control flow within the harness; point is to reveal penalties due to control-flow in SUT]
+
+=====================
+
+Attic of early attempts to give the taxonomy above
+
+
+I want times for the basic operations, as applicable, in their various cases.
+  - head-end-provided insert/remove
+      exercising one end    (stack)
+      exercising both ends  (queue; rando-deque)
+  - item-relative insert/remove
+      in middle/random
+      at a head-managed end
+      at a head-unmanaged end
+  - mashup head-provided insert with item-relative remove, and vice-versa
+  - iterating through
+
+
+Insert          Remove
+Head:First      Head:Same
+Head:First      Head:Opposite
+
+[Insert]
+Head:First
+Head:Last
+Head:Randomly-Either
+Item:First
+Item:Last
+Item:Randomly-Middle
+
+[Remove]
+Head:Same / Head:First
+  ^^ If Insertion does Head:x then Removal does Head:x; else Removal does Head:First
+Head:Opposite / Head:Last
+  ^^ Ditto; not applicable for Randomly-Either
+
+
+*/
+
+
+#include <time.h>
+#include <stdio.h>
+
+#if defined IMPL_LQ
+
+        #include <sys/queue.h>
+        struct S {
+                volatile int f[64];
+                TAILQ_ENTRY(S) x;
+        };
+        TAILQ_HEAD(SL, S);
+
+
+#elif defined IMPL_STL
+
+        #include <list>
+        struct S {
+                volatile int f[64];
+        };
+
+#elif defined IMPL_UPP
+
+        #include <uC++.h>
+        #include <uSequence.h>
+        struct S : public uSeqable {
+                volatile int f[64];
+        };
+
+#elif defined IMPL_CFA
+
+        #include <containers/list.hfa>
+        struct S {
+                int f[64]; // FIXME: make "is volatile" consistent; given bug #TBD
+                inline dlink(S);
+        };
+        P9_EMBEDDED( S, dlink(S) )
+
+#elif defined IMPL_CFA_UPP_PORT
+
+        #include <bits/sequence.hfa>
+        struct S {
+                inline Seqable;
+                int f[64]; // FIXME: make "is volatile" consistent; given bug #TBD
+        };
+	static inline S *& Back( S * n ) {
+		return (S *)Back( (Seqable *)n );
+	}
+	static inline S *& Next( S * n ) {
+		return (S *)Next( (Colable *)n );
+	}
+
+#else
+        #error bad impl
+#endif
+
+
+#define Repeat( op ) for ( volatile unsigned int i = 0; i < NoOfNodes; i += 1 ) { op; }
+
+int main() {
+        enum { NoOfNodes = 1000, Times = 100000 }; // Times supposed to be 100000
+        struct S s[NoOfNodes];
+        clock_t start, end;
+        const char * impl = 0;
+
+    #define STATS
+    #define REPORT do { \
+        double elapsed = ((double) (end - start)) / CLOCKS_PER_SEC; \
+        printf("%s %f sec\n", impl, elapsed); \
+        STATS \
+    } while(0);
+
+    #if defined IMPL_LQ
+    do {
+        struct SL lst;
+        TAILQ_INIT(&lst);
+        start = clock();
+        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+                Repeat( TAILQ_INSERT_TAIL( &lst, &s[i], x ) );
+                Repeat( TAILQ_REMOVE( &lst, TAILQ_FIRST( &lst ), x ) );
+        }
+        end = clock();
+        impl = "LQ, TAILQ";
+        REPORT
+    } while (0);
+    #elif defined IMPL_STL
+    do {
+        std::list<S *> lst;
+        start = clock();
+        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+                Repeat( lst.push_back( &s[i] ) );
+                Repeat( lst.pop_front() );
+        }
+        end = clock();
+        impl = "STL list, pointer";
+        REPORT
+    } while (0);
+    #elif defined IMPL_UPP
+    do {
+        uSequence<S> lst;
+        start = clock();
+        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+                Repeat( lst.addTail( &s[i] ) );
+                Repeat( lst.dropHead() );
+        }
+        end = clock();
+        impl = "u++ intrusive list";
+        REPORT
+    } while (0);
+    #elif defined IMPL_CFA
+    do {
+        dlist(S) lst;
+        start = clock();
+        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+                Repeat( insert_last( lst, s[i] ) );
+                Repeat( remove( lst`first ) );
+        }
+        end = clock();
+        impl = "cfa mike-new intrusive list";
+        REPORT
+    } while (0);
+    #elif defined IMPL_CFA_UPP_PORT
+    do {
+    	Sequence(S) lst;
+        start = clock();
+        for ( volatile unsigned int t = 0; t < Times; t += 1 ) {
+                Repeat( addHead( lst, s[i] ) );
+                Repeat( dropTail( lst ) );
+        }
+        end = clock();
+        impl = "cfa colby intrusive list";
+        REPORT
+    } while (0);
+
+    #endif
+}
Index: doc/theses/mike_brooks_MMath/benchmarks/list/driver.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/driver.c	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/driver.c	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,171 @@
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "observation.h"
+
+typedef struct B_UserItem 
+    BFX_EXTRUSION_DECL(B_UserItem)
+{
+    BFX_INTRUSION(B_UserItem)
+    int userdata[64];
+}
+B_UserItem;
+
+BFX_EXTRUSION_FOLLOWUP(B_UserItem)
+
+#if defined(NDEBUG) || (defined(__cforall) && !defined(__CFA_DEBUG__))
+    enum { DefaultNumNodes = 1000, DefaultExperimentDurSec = 1, DefaultCheckClockFreq = 1000, DefaultExperimentDurOpCount = -1 };
+    #define TRACE(tp)
+#else 
+    enum { DefaultNumNodes = 10, DefaultExperimentDurSec = 1, DefaultCheckClockFreq = 2, DefaultExperimentDurOpCount = 20 };
+    static const char * tp_filter
+    // = "";
+    // = "+ea";
+        = "*";
+    #define TRACE(tp) \
+        if (strcmp("*", tp_filter) == 0 || strchr(tp_filter, tp)) { \
+            printf("%c", tp); \
+            bobs_report(); \
+        }
+#endif
+
+static B_UserItem *ui = NULL;
+
+static BFX_LISTED_ELEM_T(B_UserItem) *listedItems = NULL;
+static BFX_LISTED_ELEM_T(B_UserItem) observedItem;
+
+static BFX_LIST_HEAD_T(B_UserItem) lst;
+
+
+MAYBE_EXTERN_C (
+
+    volatile size_t       bobs_ops_completed      = 0;
+    volatile unsigned int bobs_prog_inserting     = 0;
+    volatile unsigned int bobs_prog_removing      = 0;
+    volatile unsigned int bobs_prog_rollover_flag = 0;
+
+    void bobs_seek(unsigned int i) {
+        observedItem = listedItems[i];
+    }
+
+    void bobs_moveNext() {
+        observedItem = BFX_GET_AFTER(B_UserItem, lst, observedItem);
+    }
+
+    void bobs_movePrev() {
+        observedItem = BFX_GET_BEFORE(B_UserItem, lst, observedItem);
+    }
+
+    int bobs_hasCurrent() {
+        return BFX_IS_VALID_POS(B_UserItem, lst, observedItem);
+    }
+
+    int bobs_getCurrent() {
+        B_UserItem * curUI = BFX_DEREF_POS(B_UserItem, lst, observedItem);
+        return curUI->userdata[17];
+    }
+
+    enum bobs_op_movement_t bobs_op_movement = OP_MOVEMENT;
+    enum bobs_op_polarity_t bobs_op_polarity = OP_POLARITY;
+)
+
+int main(int argc, const char *argv[]) {
+
+
+    const char * usage_args = "[ExperimentDurSec [CheckClockFreq [NumNodes [ExperimentDurOpCount]]]]";
+    const int static_arg_posns = 4;
+
+    unsigned int ExperimentDurSec     = DefaultExperimentDurSec;
+    unsigned int CheckClockFreq       = DefaultCheckClockFreq;
+    unsigned int NumNodes             = DefaultNumNodes;
+    size_t       ExperimentDurOpCount = DefaultExperimentDurOpCount;
+
+    switch ((argc < static_arg_posns) ? argc : static_arg_posns) {
+      case 5: ExperimentDurOpCount = atoi(argv[4]);
+      case 4: NumNodes = atoi(argv[3]);
+      case 3: CheckClockFreq = atoi(argv[2]);
+      case 2: ExperimentDurSec = atoi(argv[1]);
+    }
+
+    if (ExperimentDurSec == 0 || CheckClockFreq == 0 || NumNodes == 0 || ExperimentDurOpCount == 0 ) {
+        printf("usage: %s %s\n", argv[0], usage_args);
+        return -1;
+    }
+
+    ui = (B_UserItem*) malloc( NumNodes * sizeof(B_UserItem) );
+    memset(ui, 0, NumNodes * sizeof(B_UserItem));
+
+    listedItems = (BFX_LISTED_ELEM_T(B_UserItem)*)malloc( NumNodes * sizeof(BFX_LISTED_ELEM_T(B_UserItem)) );
+    memset(listedItems, 0, NumNodes * sizeof(BFX_LISTED_ELEM_T(B_UserItem)));
+
+    for (int i = 0; i < NumNodes; i++) {
+        B_UserItem * curUI = & ui[i];
+        curUI->userdata[17] = i;
+    }
+
+    BFX_INIT(B_UserItem, lst);
+
+    bobs_init(NumNodes);
+
+    // BOP Convention:
+    // Action-number arguments are for the BOP cartridge to interpret.
+    // I.e. the driver assumes no relationship between BOP_INSERT(_,_,xx) and ui[xx].
+    // Logical insert number 0 and remove number n-1 are given with a distinguished hook.
+    // Logical insert numbers [1,n) and remove numbers [0,n-1) are pumped by the basic SUT hooks.
+    // This pattern lets BOP cartridges that measure element-level operations know statically when there is a reference element in the list.
+
+    // Default init/teardown is insert/remove
+    // Cartridges whose SUT insert/remove actions work on empty lists need not provide special-case ones.
+    #ifndef BOP_INIT
+    #define BOP_INIT(lst, ui, iters, i) BOP_INSERT(lst, ui, iters, i)
+    #endif
+    #ifndef BOP_TEARDOWN
+    #define BOP_TEARDOWN(lst, ui, iters, i) BOP_REMOVE(lst, ui, iters, i)
+    #endif
+
+    double elapsed_sec = 0;
+    clock_t start = clock();
+
+    while (elapsed_sec <= (double) ExperimentDurSec && bobs_ops_completed < ExperimentDurOpCount) {
+        for ( int t = 0; t < CheckClockFreq; t += 1 ) {
+            TRACE('a')
+            listedItems[0] =
+                BOP_INIT(lst, ui, listedItems, 0);
+            TRACE('b')
+            for ( bobs_prog_inserting = 1; bobs_prog_inserting < NumNodes; bobs_prog_inserting += 1 ) { 
+                TRACE('-')
+                listedItems[bobs_prog_inserting] =
+                    BOP_INSERT( lst, ui, listedItems, bobs_prog_inserting );
+                TRACE('+')
+            }
+            TRACE('c')
+            for ( bobs_prog_removing = 1; bobs_prog_removing < NumNodes; bobs_prog_removing += 1 ) { 
+                TRACE('-')
+                BOP_REMOVE( lst, ui, listedItems, bobs_prog_removing-1 );
+                TRACE('+')
+            }
+            TRACE('D')
+            BOP_TEARDOWN(lst, ui, listedItems, NumNodes-1);
+            TRACE('d')
+
+            bobs_prog_rollover_flag = 1;
+            TRACE('e')
+            bobs_prog_inserting = 0;
+            bobs_prog_removing = 0;            
+            bobs_ops_completed += NumNodes;
+            TRACE('f')
+            bobs_prog_rollover_flag = 0;
+            TRACE('g')
+        }
+        clock_t end = clock();
+        elapsed_sec = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
+    }
+
+    double mean_op_dur_ns = elapsed_sec / ((double)bobs_ops_completed) * 1000 * 1000 * 1000;
+    printf("%s,%zd,%f,%f\n", argv[0], bobs_ops_completed, elapsed_sec, mean_op_dur_ns);
+
+    free(ui);
+    free(listedItems);
+}
Index: doc/theses/mike_brooks_MMath/benchmarks/list/expect.queue-insfirst.txt
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/expect.queue-insfirst.txt	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/expect.queue-insfirst.txt	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,89 @@
+a       0 +      0/2 +      0/2   (list is empty)
+b       0 +      0/2 +      0/2   (list is empty)
+-       0 +      1/2 +      0/2   | <0> | ... | <0> |
++       0 +      1/2 +      0/2   | 1 <0> | ... | 1 <0> |
+-       0 +      2/2 +      0/2   | <1> 0 | ... | 1 <0> |
++       0 +      2/2 +      0/2   | 2 <1> 0 | ... 2 1 <0> |
+-       0 +      3/2 +      0/2   | <2> 1 0 ... 2 1 <0> |
++       0 +      3/2 +      0/2   | 3 <2> 1 0 ... 2 1 <0> |
+-       0 +      4/2 +      0/2   | <3> 2 1 ... 2 1 <0> |
++       0 +      4/2 +      0/2   | 4 <3> 2 1 ... 2 1 <0> |
+-       0 +      5/2 +      0/2   | <4> 3 2 ... 2 1 <0> |
++       0 +      5/2 +      0/2   | 5 <4> 3 2 ... 2 1 <0> |
+-       0 +      6/2 +      0/2   | <5> 4 3 ... 2 1 <0> |
++       0 +      6/2 +      0/2   | 6 <5> 4 3 ... 2 1 <0> |
+-       0 +      7/2 +      0/2   | <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
++       0 +      7/2 +      0/2   | 7 <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-       0 +      8/2 +      0/2   | <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
++       0 +      8/2 +      0/2   | 8 <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-       0 +      9/2 +      0/2   | <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
++       0 +      9/2 +      0/2   | 9 <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
+c       0 +     10/2 +      0/2   | <9> 8 7 ... 6 5 <4> 3 2 ... 2 1 <0> |
+-       0 +     10/2 +      1/2   | <9> 8 7 ... 7 6 <5> 4 3 ... 3 2 <1> 0 |
++       0 +     10/2 +      1/2   | <9> 8 7 ... 7 6 <5> 4 3 ... 3 2 <1> |
+-       0 +     10/2 +      2/2   | <9> 8 7 ... 7 6 <5> 4 3 ... 4 3 <2> 1 |
++       0 +     10/2 +      2/2   | <9> 8 7 ... 7 6 <5> 4 3 ... 4 3 <2> |
+-       0 +     10/2 +      3/2   | <9> 8 7 ... 8 7 <6> 5 4 ... 5 4 <3> 2 |
++       0 +     10/2 +      3/2   | <9> 8 7 ... 8 7 <6> 5 4 ... 5 4 <3> |
+-       0 +     10/2 +      4/2   | <9> 8 7 ... 6 5 <4> 3 |
++       0 +     10/2 +      4/2   | <9> 8 7 ... 6 5 <4> |
+-       0 +     10/2 +      5/2   | <9> 8 7 ... 7 6 <5> 4 |
++       0 +     10/2 +      5/2   | <9> 8 7 ... 7 6 <5> |
+-       0 +     10/2 +      6/2   | <9> 8 7 ... 8 7 <6> 5 |
++       0 +     10/2 +      6/2   | <9> 8 7 ... 8 7 <6> |
+-       0 +     10/2 +      7/2   | <9> 8 7 ... 9 8 <7> 6 |
++       0 +     10/2 +      7/2   | <9> 8 7 ... 9 8 <7> |
+-       0 +     10/2 +      8/2   | <9> 8 7 ... | 9 <8> 7 |
++       0 +     10/2 +      8/2   | <9> 8 | ... | 9 <8> |
+-       0 +     10/2 +      9/2   | <9> 8 | ... | <9> 8 |
++       0 +     10/2 +      9/2   | <9> | ... | <9> |
+D       0 +     10/2 +     10/2   (list is empty)
+d       0 +     10/2 +     10/2   (list is empty)
+e       0 + ? (rolling over)
+f      10 + ? (rolling over)
+g      10 +      0/2 +      0/2   (list is empty)
+a      10 +      0/2 +      0/2   (list is empty)
+b      10 +      0/2 +      0/2   (list is empty)
+-      10 +      1/2 +      0/2   | <0> | ... | <0> |
++      10 +      1/2 +      0/2   | 1 <0> | ... | 1 <0> |
+-      10 +      2/2 +      0/2   | <1> 0 | ... | 1 <0> |
++      10 +      2/2 +      0/2   | 2 <1> 0 | ... 2 1 <0> |
+-      10 +      3/2 +      0/2   | <2> 1 0 ... 2 1 <0> |
++      10 +      3/2 +      0/2   | 3 <2> 1 0 ... 2 1 <0> |
+-      10 +      4/2 +      0/2   | <3> 2 1 ... 2 1 <0> |
++      10 +      4/2 +      0/2   | 4 <3> 2 1 ... 2 1 <0> |
+-      10 +      5/2 +      0/2   | <4> 3 2 ... 2 1 <0> |
++      10 +      5/2 +      0/2   | 5 <4> 3 2 ... 2 1 <0> |
+-      10 +      6/2 +      0/2   | <5> 4 3 ... 2 1 <0> |
++      10 +      6/2 +      0/2   | 6 <5> 4 3 ... 2 1 <0> |
+-      10 +      7/2 +      0/2   | <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
++      10 +      7/2 +      0/2   | 7 <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-      10 +      8/2 +      0/2   | <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
++      10 +      8/2 +      0/2   | 8 <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-      10 +      9/2 +      0/2   | <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
++      10 +      9/2 +      0/2   | 9 <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
+c      10 +     10/2 +      0/2   | <9> 8 7 ... 6 5 <4> 3 2 ... 2 1 <0> |
+-      10 +     10/2 +      1/2   | <9> 8 7 ... 7 6 <5> 4 3 ... 3 2 <1> 0 |
++      10 +     10/2 +      1/2   | <9> 8 7 ... 7 6 <5> 4 3 ... 3 2 <1> |
+-      10 +     10/2 +      2/2   | <9> 8 7 ... 7 6 <5> 4 3 ... 4 3 <2> 1 |
++      10 +     10/2 +      2/2   | <9> 8 7 ... 7 6 <5> 4 3 ... 4 3 <2> |
+-      10 +     10/2 +      3/2   | <9> 8 7 ... 8 7 <6> 5 4 ... 5 4 <3> 2 |
++      10 +     10/2 +      3/2   | <9> 8 7 ... 8 7 <6> 5 4 ... 5 4 <3> |
+-      10 +     10/2 +      4/2   | <9> 8 7 ... 6 5 <4> 3 |
++      10 +     10/2 +      4/2   | <9> 8 7 ... 6 5 <4> |
+-      10 +     10/2 +      5/2   | <9> 8 7 ... 7 6 <5> 4 |
++      10 +     10/2 +      5/2   | <9> 8 7 ... 7 6 <5> |
+-      10 +     10/2 +      6/2   | <9> 8 7 ... 8 7 <6> 5 |
++      10 +     10/2 +      6/2   | <9> 8 7 ... 8 7 <6> |
+-      10 +     10/2 +      7/2   | <9> 8 7 ... 9 8 <7> 6 |
++      10 +     10/2 +      7/2   | <9> 8 7 ... 9 8 <7> |
+-      10 +     10/2 +      8/2   | <9> 8 7 ... | 9 <8> 7 |
++      10 +     10/2 +      8/2   | <9> 8 | ... | 9 <8> |
+-      10 +     10/2 +      9/2   | <9> 8 | ... | <9> 8 |
++      10 +     10/2 +      9/2   | <9> | ... | <9> |
+D      10 +     10/2 +     10/2   (list is empty)
+d      10 +     10/2 +     10/2   (list is empty)
+e      10 + ? (rolling over)
+f      20 + ? (rolling over)
+g      20 +      0/2 +      0/2   (list is empty)
+
Index: doc/theses/mike_brooks_MMath/benchmarks/list/expect.queue-inslast.txt
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/expect.queue-inslast.txt	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/expect.queue-inslast.txt	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,89 @@
+a       0 +      0/2 +      0/2   (list is empty)
+b       0 +      0/2 +      0/2   (list is empty)
+-       0 +      1/2 +      0/2   | <0> | ... | <0> |
++       0 +      1/2 +      0/2   | <0> 1 | ... | <0> 1 |
+-       0 +      2/2 +      0/2   | <0> 1 | ... | 0 <1> |
++       0 +      2/2 +      0/2   | <0> 1 2 ... | 0 <1> 2 |
+-       0 +      3/2 +      0/2   | <0> 1 2 ... 0 1 <2> |
++       0 +      3/2 +      0/2   | <0> 1 2 ... 0 1 <2> 3 |
+-       0 +      4/2 +      0/2   | <0> 1 2 ... 1 2 <3> |
++       0 +      4/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 |
+-       0 +      5/2 +      0/2   | <0> 1 2 ... 2 3 <4> |
++       0 +      5/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 |
+-       0 +      6/2 +      0/2   | <0> 1 2 ... 3 4 <5> |
++       0 +      6/2 +      0/2   | <0> 1 2 ... 3 4 <5> 6 |
+-       0 +      7/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> |
++       0 +      7/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> 7 |
+-       0 +      8/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> |
++       0 +      8/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> 8 |
+-       0 +      9/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> |
++       0 +      9/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> 9 |
+c       0 +     10/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 7 8 <9> |
+-       0 +     10/2 +      1/2   | 0 <1> 2 3 ... 3 4 <5> 6 7 ... 7 8 <9> |
++       0 +     10/2 +      1/2   | <1> 2 3 ... 3 4 <5> 6 7 ... 7 8 <9> |
+-       0 +     10/2 +      2/2   | 1 <2> 3 4 ... 3 4 <5> 6 7 ... 7 8 <9> |
++       0 +     10/2 +      2/2   | <2> 3 4 ... 3 4 <5> 6 7 ... 7 8 <9> |
+-       0 +     10/2 +      3/2   | 2 <3> 4 5 ... 4 5 <6> 7 8 ... 7 8 <9> |
++       0 +     10/2 +      3/2   | <3> 4 5 ... 4 5 <6> 7 8 ... 7 8 <9> |
+-       0 +     10/2 +      4/2   | 3 <4> 5 6 ... 7 8 <9> |
++       0 +     10/2 +      4/2   | <4> 5 6 ... 7 8 <9> |
+-       0 +     10/2 +      5/2   | 4 <5> 6 7 ... 7 8 <9> |
++       0 +     10/2 +      5/2   | <5> 6 7 ... 7 8 <9> |
+-       0 +     10/2 +      6/2   | 5 <6> 7 8 ... 7 8 <9> |
++       0 +     10/2 +      6/2   | <6> 7 8 ... 7 8 <9> |
+-       0 +     10/2 +      7/2   | 6 <7> 8 9 ... 7 8 <9> |
++       0 +     10/2 +      7/2   | <7> 8 9 ... 7 8 <9> |
+-       0 +     10/2 +      8/2   | 7 <8> 9 | ... 7 8 <9> |
++       0 +     10/2 +      8/2   | <8> 9 | ... | 8 <9> |
+-       0 +     10/2 +      9/2   | 8 <9> | ... | 8 <9> |
++       0 +     10/2 +      9/2   | <9> | ... | <9> |
+D       0 +     10/2 +     10/2   (list is empty)
+d       0 +     10/2 +     10/2   (list is empty)
+e       0 + ? (rolling over)
+f      10 + ? (rolling over)
+g      10 +      0/2 +      0/2   (list is empty)
+a      10 +      0/2 +      0/2   (list is empty)
+b      10 +      0/2 +      0/2   (list is empty)
+-      10 +      1/2 +      0/2   | <0> | ... | <0> |
++      10 +      1/2 +      0/2   | <0> 1 | ... | <0> 1 |
+-      10 +      2/2 +      0/2   | <0> 1 | ... | 0 <1> |
++      10 +      2/2 +      0/2   | <0> 1 2 ... | 0 <1> 2 |
+-      10 +      3/2 +      0/2   | <0> 1 2 ... 0 1 <2> |
++      10 +      3/2 +      0/2   | <0> 1 2 ... 0 1 <2> 3 |
+-      10 +      4/2 +      0/2   | <0> 1 2 ... 1 2 <3> |
++      10 +      4/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 |
+-      10 +      5/2 +      0/2   | <0> 1 2 ... 2 3 <4> |
++      10 +      5/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 |
+-      10 +      6/2 +      0/2   | <0> 1 2 ... 3 4 <5> |
++      10 +      6/2 +      0/2   | <0> 1 2 ... 3 4 <5> 6 |
+-      10 +      7/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> |
++      10 +      7/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> 7 |
+-      10 +      8/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> |
++      10 +      8/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> 8 |
+-      10 +      9/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> |
++      10 +      9/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> 9 |
+c      10 +     10/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 7 8 <9> |
+-      10 +     10/2 +      1/2   | 0 <1> 2 3 ... 3 4 <5> 6 7 ... 7 8 <9> |
++      10 +     10/2 +      1/2   | <1> 2 3 ... 3 4 <5> 6 7 ... 7 8 <9> |
+-      10 +     10/2 +      2/2   | 1 <2> 3 4 ... 3 4 <5> 6 7 ... 7 8 <9> |
++      10 +     10/2 +      2/2   | <2> 3 4 ... 3 4 <5> 6 7 ... 7 8 <9> |
+-      10 +     10/2 +      3/2   | 2 <3> 4 5 ... 4 5 <6> 7 8 ... 7 8 <9> |
++      10 +     10/2 +      3/2   | <3> 4 5 ... 4 5 <6> 7 8 ... 7 8 <9> |
+-      10 +     10/2 +      4/2   | 3 <4> 5 6 ... 7 8 <9> |
++      10 +     10/2 +      4/2   | <4> 5 6 ... 7 8 <9> |
+-      10 +     10/2 +      5/2   | 4 <5> 6 7 ... 7 8 <9> |
++      10 +     10/2 +      5/2   | <5> 6 7 ... 7 8 <9> |
+-      10 +     10/2 +      6/2   | 5 <6> 7 8 ... 7 8 <9> |
++      10 +     10/2 +      6/2   | <6> 7 8 ... 7 8 <9> |
+-      10 +     10/2 +      7/2   | 6 <7> 8 9 ... 7 8 <9> |
++      10 +     10/2 +      7/2   | <7> 8 9 ... 7 8 <9> |
+-      10 +     10/2 +      8/2   | 7 <8> 9 | ... 7 8 <9> |
++      10 +     10/2 +      8/2   | <8> 9 | ... | 8 <9> |
+-      10 +     10/2 +      9/2   | 8 <9> | ... | 8 <9> |
++      10 +     10/2 +      9/2   | <9> | ... | <9> |
+D      10 +     10/2 +     10/2   (list is empty)
+d      10 +     10/2 +     10/2   (list is empty)
+e      10 + ? (rolling over)
+f      20 + ? (rolling over)
+g      20 +      0/2 +      0/2   (list is empty)
+
Index: doc/theses/mike_brooks_MMath/benchmarks/list/expect.stack-insfirst.txt
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/expect.stack-insfirst.txt	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/expect.stack-insfirst.txt	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,89 @@
+a       0 +      0/2 +      0/2   (list is empty)
+b       0 +      0/2 +      0/2   (list is empty)
+-       0 +      1/2 +      0/2   | <0> | ... | <0> |
++       0 +      1/2 +      0/2   | 1 <0> | ... | 1 <0> |
+-       0 +      2/2 +      0/2   | <1> 0 | ... | 1 <0> |
++       0 +      2/2 +      0/2   | 2 <1> 0 | ... 2 1 <0> |
+-       0 +      3/2 +      0/2   | <2> 1 0 ... 2 1 <0> |
++       0 +      3/2 +      0/2   | 3 <2> 1 0 ... 2 1 <0> |
+-       0 +      4/2 +      0/2   | <3> 2 1 ... 2 1 <0> |
++       0 +      4/2 +      0/2   | 4 <3> 2 1 ... 2 1 <0> |
+-       0 +      5/2 +      0/2   | <4> 3 2 ... 2 1 <0> |
++       0 +      5/2 +      0/2   | 5 <4> 3 2 ... 2 1 <0> |
+-       0 +      6/2 +      0/2   | <5> 4 3 ... 2 1 <0> |
++       0 +      6/2 +      0/2   | 6 <5> 4 3 ... 2 1 <0> |
+-       0 +      7/2 +      0/2   | <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
++       0 +      7/2 +      0/2   | 7 <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-       0 +      8/2 +      0/2   | <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
++       0 +      8/2 +      0/2   | 8 <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-       0 +      9/2 +      0/2   | <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
++       0 +      9/2 +      0/2   | 9 <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
+c       0 +     10/2 +      0/2   | <9> 8 7 ... 6 5 <4> 3 2 ... 2 1 <0> |
+-       0 +     10/2 +      1/2   | 9 <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
++       0 +     10/2 +      1/2   | <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
+-       0 +     10/2 +      2/2   | 8 <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
++       0 +     10/2 +      2/2   | <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-       0 +     10/2 +      3/2   | 7 <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
++       0 +     10/2 +      3/2   | <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-       0 +     10/2 +      4/2   | 6 <5> 4 3 ... 2 1 <0> |
++       0 +     10/2 +      4/2   | <5> 4 3 ... 2 1 <0> |
+-       0 +     10/2 +      5/2   | 5 <4> 3 2 ... 2 1 <0> |
++       0 +     10/2 +      5/2   | <4> 3 2 ... 2 1 <0> |
+-       0 +     10/2 +      6/2   | 4 <3> 2 1 ... 2 1 <0> |
++       0 +     10/2 +      6/2   | <3> 2 1 ... 2 1 <0> |
+-       0 +     10/2 +      7/2   | 3 <2> 1 0 ... 2 1 <0> |
++       0 +     10/2 +      7/2   | <2> 1 0 ... 2 1 <0> |
+-       0 +     10/2 +      8/2   | 2 <1> 0 | ... 2 1 <0> |
++       0 +     10/2 +      8/2   | <1> 0 | ... | 1 <0> |
+-       0 +     10/2 +      9/2   | 1 <0> | ... | 1 <0> |
++       0 +     10/2 +      9/2   | <0> | ... | <0> |
+D       0 +     10/2 +     10/2   (list is empty)
+d       0 +     10/2 +     10/2   (list is empty)
+e       0 + ? (rolling over)
+f      10 + ? (rolling over)
+g      10 +      0/2 +      0/2   (list is empty)
+a      10 +      0/2 +      0/2   (list is empty)
+b      10 +      0/2 +      0/2   (list is empty)
+-      10 +      1/2 +      0/2   | <0> | ... | <0> |
++      10 +      1/2 +      0/2   | 1 <0> | ... | 1 <0> |
+-      10 +      2/2 +      0/2   | <1> 0 | ... | 1 <0> |
++      10 +      2/2 +      0/2   | 2 <1> 0 | ... 2 1 <0> |
+-      10 +      3/2 +      0/2   | <2> 1 0 ... 2 1 <0> |
++      10 +      3/2 +      0/2   | 3 <2> 1 0 ... 2 1 <0> |
+-      10 +      4/2 +      0/2   | <3> 2 1 ... 2 1 <0> |
++      10 +      4/2 +      0/2   | 4 <3> 2 1 ... 2 1 <0> |
+-      10 +      5/2 +      0/2   | <4> 3 2 ... 2 1 <0> |
++      10 +      5/2 +      0/2   | 5 <4> 3 2 ... 2 1 <0> |
+-      10 +      6/2 +      0/2   | <5> 4 3 ... 2 1 <0> |
++      10 +      6/2 +      0/2   | 6 <5> 4 3 ... 2 1 <0> |
+-      10 +      7/2 +      0/2   | <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
++      10 +      7/2 +      0/2   | 7 <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-      10 +      8/2 +      0/2   | <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
++      10 +      8/2 +      0/2   | 8 <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-      10 +      9/2 +      0/2   | <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
++      10 +      9/2 +      0/2   | 9 <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
+c      10 +     10/2 +      0/2   | <9> 8 7 ... 6 5 <4> 3 2 ... 2 1 <0> |
+-      10 +     10/2 +      1/2   | 9 <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
++      10 +     10/2 +      1/2   | <8> 7 6 ... 6 5 <4> 3 2 ... 2 1 <0> |
+-      10 +     10/2 +      2/2   | 8 <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
++      10 +     10/2 +      2/2   | <7> 6 5 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-      10 +     10/2 +      3/2   | 7 <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
++      10 +     10/2 +      3/2   | <6> 5 4 ... 5 4 <3> 2 1 ... 2 1 <0> |
+-      10 +     10/2 +      4/2   | 6 <5> 4 3 ... 2 1 <0> |
++      10 +     10/2 +      4/2   | <5> 4 3 ... 2 1 <0> |
+-      10 +     10/2 +      5/2   | 5 <4> 3 2 ... 2 1 <0> |
++      10 +     10/2 +      5/2   | <4> 3 2 ... 2 1 <0> |
+-      10 +     10/2 +      6/2   | 4 <3> 2 1 ... 2 1 <0> |
++      10 +     10/2 +      6/2   | <3> 2 1 ... 2 1 <0> |
+-      10 +     10/2 +      7/2   | 3 <2> 1 0 ... 2 1 <0> |
++      10 +     10/2 +      7/2   | <2> 1 0 ... 2 1 <0> |
+-      10 +     10/2 +      8/2   | 2 <1> 0 | ... 2 1 <0> |
++      10 +     10/2 +      8/2   | <1> 0 | ... | 1 <0> |
+-      10 +     10/2 +      9/2   | 1 <0> | ... | 1 <0> |
++      10 +     10/2 +      9/2   | <0> | ... | <0> |
+D      10 +     10/2 +     10/2   (list is empty)
+d      10 +     10/2 +     10/2   (list is empty)
+e      10 + ? (rolling over)
+f      20 + ? (rolling over)
+g      20 +      0/2 +      0/2   (list is empty)
+
Index: doc/theses/mike_brooks_MMath/benchmarks/list/expect.stack-inslast.txt
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/expect.stack-inslast.txt	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/expect.stack-inslast.txt	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,89 @@
+a       0 +      0/2 +      0/2   (list is empty)
+b       0 +      0/2 +      0/2   (list is empty)
+-       0 +      1/2 +      0/2   | <0> | ... | <0> |
++       0 +      1/2 +      0/2   | <0> 1 | ... | <0> 1 |
+-       0 +      2/2 +      0/2   | <0> 1 | ... | 0 <1> |
++       0 +      2/2 +      0/2   | <0> 1 2 ... | 0 <1> 2 |
+-       0 +      3/2 +      0/2   | <0> 1 2 ... 0 1 <2> |
++       0 +      3/2 +      0/2   | <0> 1 2 ... 0 1 <2> 3 |
+-       0 +      4/2 +      0/2   | <0> 1 2 ... 1 2 <3> |
++       0 +      4/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 |
+-       0 +      5/2 +      0/2   | <0> 1 2 ... 2 3 <4> |
++       0 +      5/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 |
+-       0 +      6/2 +      0/2   | <0> 1 2 ... 3 4 <5> |
++       0 +      6/2 +      0/2   | <0> 1 2 ... 3 4 <5> 6 |
+-       0 +      7/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> |
++       0 +      7/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> 7 |
+-       0 +      8/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> |
++       0 +      8/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> 8 |
+-       0 +      9/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> |
++       0 +      9/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> 9 |
+c       0 +     10/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 7 8 <9> |
+-       0 +     10/2 +      1/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> 9 |
++       0 +     10/2 +      1/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> |
+-       0 +     10/2 +      2/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> 8 |
++       0 +     10/2 +      2/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> |
+-       0 +     10/2 +      3/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> 7 |
++       0 +     10/2 +      3/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> |
+-       0 +     10/2 +      4/2   | <0> 1 2 ... 3 4 <5> 6 |
++       0 +     10/2 +      4/2   | <0> 1 2 ... 3 4 <5> |
+-       0 +     10/2 +      5/2   | <0> 1 2 ... 2 3 <4> 5 |
++       0 +     10/2 +      5/2   | <0> 1 2 ... 2 3 <4> |
+-       0 +     10/2 +      6/2   | <0> 1 2 ... 1 2 <3> 4 |
++       0 +     10/2 +      6/2   | <0> 1 2 ... 1 2 <3> |
+-       0 +     10/2 +      7/2   | <0> 1 2 ... 0 1 <2> 3 |
++       0 +     10/2 +      7/2   | <0> 1 2 ... 0 1 <2> |
+-       0 +     10/2 +      8/2   | <0> 1 2 ... | 0 <1> 2 |
++       0 +     10/2 +      8/2   | <0> 1 | ... | 0 <1> |
+-       0 +     10/2 +      9/2   | <0> 1 | ... | <0> 1 |
++       0 +     10/2 +      9/2   | <0> | ... | <0> |
+D       0 +     10/2 +     10/2   (list is empty)
+d       0 +     10/2 +     10/2   (list is empty)
+e       0 + ? (rolling over)
+f      10 + ? (rolling over)
+g      10 +      0/2 +      0/2   (list is empty)
+a      10 +      0/2 +      0/2   (list is empty)
+b      10 +      0/2 +      0/2   (list is empty)
+-      10 +      1/2 +      0/2   | <0> | ... | <0> |
++      10 +      1/2 +      0/2   | <0> 1 | ... | <0> 1 |
+-      10 +      2/2 +      0/2   | <0> 1 | ... | 0 <1> |
++      10 +      2/2 +      0/2   | <0> 1 2 ... | 0 <1> 2 |
+-      10 +      3/2 +      0/2   | <0> 1 2 ... 0 1 <2> |
++      10 +      3/2 +      0/2   | <0> 1 2 ... 0 1 <2> 3 |
+-      10 +      4/2 +      0/2   | <0> 1 2 ... 1 2 <3> |
++      10 +      4/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 |
+-      10 +      5/2 +      0/2   | <0> 1 2 ... 2 3 <4> |
++      10 +      5/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 |
+-      10 +      6/2 +      0/2   | <0> 1 2 ... 3 4 <5> |
++      10 +      6/2 +      0/2   | <0> 1 2 ... 3 4 <5> 6 |
+-      10 +      7/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> |
++      10 +      7/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> 7 |
+-      10 +      8/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> |
++      10 +      8/2 +      0/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> 8 |
+-      10 +      9/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> |
++      10 +      9/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> 9 |
+c      10 +     10/2 +      0/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 7 8 <9> |
+-      10 +     10/2 +      1/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> 9 |
++      10 +     10/2 +      1/2   | <0> 1 2 ... 2 3 <4> 5 6 ... 6 7 <8> |
+-      10 +     10/2 +      2/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> 8 |
++      10 +     10/2 +      2/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 5 6 <7> |
+-      10 +     10/2 +      3/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> 7 |
++      10 +     10/2 +      3/2   | <0> 1 2 ... 1 2 <3> 4 5 ... 4 5 <6> |
+-      10 +     10/2 +      4/2   | <0> 1 2 ... 3 4 <5> 6 |
++      10 +     10/2 +      4/2   | <0> 1 2 ... 3 4 <5> |
+-      10 +     10/2 +      5/2   | <0> 1 2 ... 2 3 <4> 5 |
++      10 +     10/2 +      5/2   | <0> 1 2 ... 2 3 <4> |
+-      10 +     10/2 +      6/2   | <0> 1 2 ... 1 2 <3> 4 |
++      10 +     10/2 +      6/2   | <0> 1 2 ... 1 2 <3> |
+-      10 +     10/2 +      7/2   | <0> 1 2 ... 0 1 <2> 3 |
++      10 +     10/2 +      7/2   | <0> 1 2 ... 0 1 <2> |
+-      10 +     10/2 +      8/2   | <0> 1 2 ... | 0 <1> 2 |
++      10 +     10/2 +      8/2   | <0> 1 | ... | 0 <1> |
+-      10 +     10/2 +      9/2   | <0> 1 | ... | <0> 1 |
++      10 +     10/2 +      9/2   | <0> | ... | <0> |
+D      10 +     10/2 +     10/2   (list is empty)
+d      10 +     10/2 +     10/2   (list is empty)
+e      10 + ? (rolling over)
+f      20 + ? (rolling over)
+g      20 +      0/2 +      0/2   (list is empty)
+
Index: doc/theses/mike_brooks_MMath/benchmarks/list/fx-cfa-cfa.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/fx-cfa-cfa.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/fx-cfa-cfa.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,21 @@
+#include <containers/list.hfa>
+
+#define BFX_INTRUSION(S)                         inline dlink(S);
+#define BFX_EXTRUSION_DECL(S)
+#define BFX_EXTRUSION_FOLLOWUP(S)                P9_EMBEDDED( S, dlink(S) )
+#define BFX_LIST_HEAD_T(S)                       dlist(S)
+#define BFX_LISTED_ELEM_T(S)                     S*
+
+#define BFX_INSERT_FIRST(S, lst, item)           (insert_first (lst, item), (S*)&(item))
+#define BFX_INSERT_LAST(S, lst, item)            (insert_last  (lst, item), (S*)&(item))
+#define BFX_INSERT_BEFORE(S, lst, item, refIter) (insert_before(*refIter, item), (S*)&(item))
+#define BFX_INSERT_AFTER(S, lst, item, refIter)  (insert_after (*refIter, item), (S*)&(item))
+#define BFX_REMOVE_FIRST(S, lst)                 remove(lst`first)
+#define BFX_REMOVE_LAST(S, lst)                  remove(lst`last)
+#define BFX_REMOVE_HERE(S, lst, refIter)         remove(*refIter)
+#define BFX_INIT(S, lst)
+
+#define BFX_GET_AFTER(S, lst, iter)              (&(*iter)`next)
+#define BFX_GET_BEFORE(S, lst, iter)             (&(*iter)`prev)
+#define BFX_IS_VALID_POS(S, lst, iter)           ((iter)!=NULL)
+#define BFX_DEREF_POS(S, lst, iter)              (iter)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/fx-cpp-stlref.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/fx-cpp-stlref.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/fx-cpp-stlref.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,22 @@
+#include <list>
+using namespace std;
+
+#define BFX_INTRUSION(S)
+#define BFX_EXTRUSION_DECL(S)
+#define BFX_EXTRUSION_FOLLOWUP(S)
+#define BFX_LIST_HEAD_T(S)                       list<S*>
+#define BFX_LISTED_ELEM_T(S)                     list<S*>::iterator
+
+#define BFX_INSERT_FIRST(S, lst, item)           (lst.push_front(&item), lst.begin())
+#define BFX_INSERT_LAST(S, lst, item)            (lst.push_back(&item), BFX_GET_BEFORE(S, lst, lst.end()))
+#define BFX_REMOVE_FIRST(S, lst)                 lst.pop_front()
+#define BFX_REMOVE_LAST(S, lst)                  lst.pop_back()
+#define BFX_INSERT_BEFORE(S, lst, item, refIter) lst.insert(refIter, &item)
+#define BFX_INSERT_AFTER(S, lst, item, refIter)  lst.insert(BFX_GET_AFTER(S, lst, refIter), &item)
+#define BFX_REMOVE_HERE(S, lst, refIter)         lst.erase(refIter)
+#define BFX_INIT(S, lst)
+
+#define BFX_GET_AFTER(S, lst, iter)              ({ list<S*>::iterator answer = (iter); answer++; answer;})
+#define BFX_GET_BEFORE(S, lst, iter)             ({ list<S*>::iterator answer = (iter); if ((answer) == lst.begin()) { answer = lst.end(); } else { answer--; } answer; })
+#define BFX_IS_VALID_POS(S, lst, iter)           ((iter)!=lst.end())
+#define BFX_DEREF_POS(S, lst, iter)              (*iter)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/fx-lq-list.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/fx-lq-list.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/fx-lq-list.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,44 @@
+#include <sys/queue.h>
+#include <assert.h>
+#include <stddef.h>
+
+#define HEADNAME_(S)                             S ## Head
+
+#define BFX_INTRUSION(S)                         LIST_ENTRY(S) xx;
+#define BFX_EXTRUSION_DECL(S)
+#define BFX_EXTRUSION_FOLLOWUP(S)                LIST_HEAD(HEADNAME_(S), S);
+#define BFX_LIST_HEAD_T(S)                       struct HEADNAME_(S)
+#define BFX_LISTED_ELEM_T(S)                     S*
+
+#define BFX_INSERT_FIRST(S, lst, item)           ({LIST_INSERT_HEAD(&lst, &item, xx); &item;})
+#define BFX_INSERT_LAST(S, lst, item)            assert(false&&"unimplemented INSERT_LAST on lq-list")
+#define BFX_INSERT_BEFORE(S, lst, item, refIter) ({LIST_INSERT_BEFORE(refIter, &item, xx); &item;})
+#define BFX_INSERT_AFTER(S, lst, item, refIter)  ({LIST_INSERT_AFTER(refIter, &item, xx); &item;})
+#define BFX_REMOVE_FIRST(S, lst)                 LIST_REMOVE( LIST_FIRST( &lst ), xx )
+#define BFX_REMOVE_LAST(S, lst)                  assert(false&&"unimplemented REMOVE_LAST on lq-list")
+#define BFX_REMOVE_HERE(S, lst, refIter)         LIST_REMOVE( refIter, xx )
+#define BFX_INIT(S, lst)                         LIST_INIT(&lst);
+
+#define BFX_GET_AFTER(S, lst, iter)              LIST_NEXT(iter, xx)
+#define BFX_GET_BEFORE(S, lst, iter)             HACK_UNSUPPORTED_PREV(S, lst, iter, xx)
+#define BFX_IS_VALID_POS(S, lst, iter)           ((iter)!=NULL)
+#define BFX_DEREF_POS(S, lst, iter)              (iter)
+
+#define HACK_UNSUPPORTED_PREV(S, lst, iter, NAME) ({ \
+    S * answer = NULL; \
+    S ** linkAtMe = (iter)->NAME.le_prev; \
+    if ( &(lst) != (BFX_LIST_HEAD_T(S)*)linkAtMe ) { \
+        answer = (S*)( (char*)linkAtMe - offsetof(S, NAME) ); \
+    } \
+    answer; \
+})
+
+#if 0
+void bobs_moveNext() { observedItem = ((observedItem)->xx.le_next); } 
+struct { struct B_UserItem *le_next; struct B_UserItem **le_prev; } xx;
+struct { struct B_UserItem *tqe_next; struct B_UserItem * *tqe_prev; } xx;
+
+void bobs_movePrev() { 
+    observedItem = (*(((struct B_UserItemHead *)((observedItem)->xx.tqe_prev))->tqh_last)); } 
+
+#endif
Index: doc/theses/mike_brooks_MMath/benchmarks/list/fx-lq-tailq.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/fx-lq-tailq.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/fx-lq-tailq.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,23 @@
+#include <sys/queue.h>
+
+#define HEADNAME_(S)                             S ## Head
+
+#define BFX_INTRUSION(S)                         TAILQ_ENTRY(S) xx;
+#define BFX_EXTRUSION_DECL(S)
+#define BFX_EXTRUSION_FOLLOWUP(S)                TAILQ_HEAD(HEADNAME_(S), S);
+#define BFX_LIST_HEAD_T(S)                       struct HEADNAME_(S)
+#define BFX_LISTED_ELEM_T(S)                     S*
+
+#define BFX_INSERT_FIRST(S, lst, item)           ({TAILQ_INSERT_HEAD(&lst, &item, xx); &item;})
+#define BFX_INSERT_LAST(S, lst, item)            ({TAILQ_INSERT_TAIL(&lst, &item, xx); &item;})
+#define BFX_INSERT_BEFORE(S, lst, item, refIter) ({TAILQ_INSERT_BEFORE(refIter, &item, xx); &item;})
+#define BFX_INSERT_AFTER(S, lst, item, refIter)  ({TAILQ_INSERT_AFTER(&lst, refIter, &item, xx); &item;})
+#define BFX_REMOVE_FIRST(S, lst)                 ({ S * first=TAILQ_FIRST( &lst );               TAILQ_REMOVE( &lst, first, xx ); })   // about two steps: see tailq-bug.c
+#define BFX_REMOVE_LAST(S, lst)                  ({ S * last =TAILQ_LAST ( &lst, HEADNAME_(S) ); TAILQ_REMOVE( &lst, last , xx ); })
+#define BFX_REMOVE_HERE(S, lst, refIter)         TAILQ_REMOVE( &lst, refIter, xx )
+#define BFX_INIT(S, lst)                         TAILQ_INIT(&lst);
+
+#define BFX_GET_AFTER(S, lst, iter)              TAILQ_NEXT(iter, xx)
+#define BFX_GET_BEFORE(S, lst, iter)             TAILQ_PREV(iter, HEADNAME_(S), xx)
+#define BFX_IS_VALID_POS(S, lst, iter)           ((iter)!=NULL)
+#define BFX_DEREF_POS(S, lst, iter)              (iter)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/fx-upp-upp.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/fx-upp-upp.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/fx-upp-upp.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,22 @@
+#include <uC++.h>
+#include <uSequence.h>
+
+#define BFX_INTRUSION(S)
+#define BFX_EXTRUSION_DECL(S)                    : public uSeqable
+#define BFX_EXTRUSION_FOLLOWUP(S)
+#define BFX_LIST_HEAD_T(S)                       uSequence<S>
+#define BFX_LISTED_ELEM_T(S)                     S*
+
+#define BFX_INSERT_FIRST(S, lst, item)           lst.addHead(&item)
+#define BFX_INSERT_LAST(S, lst, item)            lst.addTail(&item)
+#define BFX_REMOVE_FIRST(S, lst)                 lst.dropHead()
+#define BFX_REMOVE_LAST(S, lst)                  lst.dropTail()
+#define BFX_INSERT_BEFORE(S, lst, item, refIter) lst.insertBef(&item, refIter)
+#define BFX_INSERT_AFTER(S, lst, item, refIter)  lst.insertAft(refIter, &item)
+#define BFX_REMOVE_HERE(S, lst, refIter)         lst.remove(refIter)
+#define BFX_INIT(S, lst)
+
+#define BFX_GET_AFTER(S, lst, iter)              lst.succ(iter)
+#define BFX_GET_BEFORE(S, lst, iter)             lst.pred(iter)
+#define BFX_IS_VALID_POS(S, lst, iter)           ((iter)!=NULL)
+#define BFX_DEREF_POS(S, lst, iter)              (iter)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/observation.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/observation.c	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/observation.c	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,124 @@
+#include <assert.h>
+
+#ifdef __needExternC
+#error Only compile observation.c (once) in plain C
+#endif
+
+#include <stdio.h>
+#include <sys/param.h>
+
+#include "observation.h"
+
+static int NumNodes;
+
+void bobs_init(int NumNodes_) {
+    // printf("at bobs_init; bobs_ops_completed = %zd\n", bobs_ops_completed);
+
+    // todo: register a signal handler that prints progress info
+    // note function bobs_XXX in driver.c are untested until that's working
+    // to be driven as:
+    //       ./a.out &          # then, very quickly
+    //       kill -s USR2 $!
+
+    NumNodes = NumNodes_;
+}
+
+
+static void printPreds(unsigned int leash) {
+    if (leash==0)
+        return;
+    if (!bobs_hasCurrent()) {
+        printf(" |");
+        return;
+    }
+    int userValue = bobs_getCurrent();
+    bobs_movePrev();
+    printPreds(leash - 1);
+    printf(" %d", userValue);
+}
+static void printSuccs(unsigned int leash) {
+    if (leash==0)
+        return;
+    if (!bobs_hasCurrent()) {
+        printf(" |");
+        return;
+    }
+    int userValue = bobs_getCurrent();
+    printf(" %d", userValue);
+    bobs_moveNext();
+    printSuccs(leash - 1);
+}
+static void explore(int here) {
+    bobs_seek(here);
+    if (!bobs_hasCurrent()) {
+        printf(" <X>");
+        return;
+    }
+    bobs_movePrev();
+    printPreds(2);
+
+    bobs_seek(here);
+    int userValue = bobs_getCurrent();
+    printf(" <%d>", userValue);
+
+    bobs_moveNext();
+    printSuccs(2);
+}
+static void exploreRange(int validFrom, int validTo) {
+    int gapsize = validTo - validFrom;
+    int midpoint = (validTo + validFrom) / 2;
+
+    int listFirstmost, listLastmost;
+    switch(bobs_op_polarity) {
+        case insfirst:
+            listFirstmost = validTo;
+            listLastmost = validFrom;
+            break;
+        case inslast:
+            listFirstmost = validFrom;
+            listLastmost = validTo;
+            break;
+        default:
+            assert(0 && "unsupported bobs_op_movement value");
+    }
+
+    explore(listFirstmost);
+    printf(" ...");
+    if (gapsize > 5) {
+        explore(midpoint);
+        printf(" ...");
+    }
+    explore(listLastmost);
+}
+
+void bobs_report(void) {
+    if (bobs_prog_rollover_flag) {
+        printf("%8zd + ? (rolling over)\n", bobs_ops_completed);
+    } else {
+        printf("%8zd + %6d/2 + %6d/2", bobs_ops_completed, bobs_prog_inserting, bobs_prog_removing);
+
+        int validFrom, validTo;
+        switch(bobs_op_movement) {
+            case stack:
+                validFrom = 0;
+                validTo = MIN((signed)bobs_prog_inserting-1, (signed)NumNodes - (signed)bobs_prog_removing - 1);
+                break;
+            case queue:
+                validFrom = (signed)bobs_prog_removing;
+                validTo = (signed)bobs_prog_inserting-1;
+                break;
+            default:
+                assert(0 && "unsupported bobs_op_movement value");
+        }
+
+        printf("  ");
+
+        if (validTo < validFrom) {
+            printf(" (list is empty)");
+        } else {
+            exploreRange(validFrom, validTo);
+        }
+
+        printf("\n");
+    }
+}
Index: doc/theses/mike_brooks_MMath/benchmarks/list/observation.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/observation.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/observation.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,25 @@
+#include "proglang.h"
+
+MAYBE_EXTERN_C (
+
+    // driver.c defines
+
+    extern enum bobs_op_movement_t { stack, queue } bobs_op_movement;
+    extern enum bobs_op_polarity_t { insfirst, inslast } bobs_op_polarity;
+
+    void bobs_seek(unsigned int);
+    void bobs_moveNext();
+    void bobs_movePrev();
+    int  bobs_hasCurrent();
+    int  bobs_getCurrent();
+
+    extern volatile size_t       bobs_ops_completed;
+    extern volatile unsigned int bobs_prog_inserting;
+    extern volatile unsigned int bobs_prog_removing;
+    extern volatile unsigned int bobs_prog_rollover_flag;
+
+    // observation.c defines
+
+    void bobs_init(int NumNodes);
+    void bobs_report(void);
+)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-allhead.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-allhead.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-allhead.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,6 @@
+// queue:    inserts and removes happen at opposite ends
+// insfirst: elements flow from "first," "head" or "front", to "last", "tail" or "back"
+// allhead:  inserts and removes happen via the api-provided "last"/"tail"/"back"/"first"/"tail"/"front"
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-inselem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-inselem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-inselem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,8 @@
+// queue:    inserts and removes happen at opposite ends
+// insfirst: elements flow from "first," "head" or "front", to "last", "tail" or "back"
+// inselem:  inserts happen via an element-level operation and removes happen via the api-provided "last"/"tail"/"back"
+
+#define BOP_INIT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_BEFORE(B_UserItem, lst, ui[i], iters[i-1])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-remelem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-remelem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-insfirst-remelem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,8 @@
+// queue:    inserts and removes happen at opposite ends
+// insfirst: elements flow from "first," "head" or "front", to "last", "tail" or "back"
+// remelem:  removes happen via an element-level operation and inserts happen via the api-provided "first"/"head"/"front"
+
+#define BOP_TEARDOWN(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_HERE(B_UserItem, lst, iters[i])
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-allhead.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-allhead.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-allhead.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,6 @@
+// queue:    inserts and removes happen at opposite ends
+// inslast:  elements flow from "last", "tail" or "back", to "first," "head" or "front"
+// allhead:  inserts and removes happen via the api-provided "last"/"tail"/"back"/"first"/"tail"/"front"
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-inselem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-inselem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-inselem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,8 @@
+// queue:    inserts and removes happen at opposite ends
+// inslast:  elements flow from "last", "tail" or "back", to "first," "head" or "front"
+// inselem:  inserts happen via an element-level operation and removes happen via the api-provided "first"/"tail"/"front"
+
+#define BOP_INIT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_AFTER(B_UserItem, lst, ui[i], iters[i-1])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-remelem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-remelem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-queue-inslast-remelem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,8 @@
+// queue:    inserts and removes happen at opposite ends
+// inslast:  elements flow from "last", "tail" or "back", to "first," "head" or "front"
+// remelem:  removes happen via an element-level operation and inserts happen via the api-provided "last"/"tail"/"back"
+
+#define BOP_TEARDOWN(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_HERE(B_UserItem, lst, iters[i])
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-allhead.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-allhead.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-allhead.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,6 @@
+// stack:    inserts and removes happen at the same end
+// insfirst: stack's action happens at the end called "first", "head" or "front"
+// allhead:  inserts and removes happen via the api-provided "first"/"head"/"front"
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-inselem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-inselem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-inselem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,8 @@
+// stack:    inserts and removes happen at the same end
+// insfirst: stack's action happens at the end called "first", "head" or "front"
+// inselem:  inserts happen via an element-level operation and removes happen via the api-provided "first"/"head"/"front"
+
+#define BOP_INIT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_BEFORE(B_UserItem, lst, ui[i], iters[i-1])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-remelem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-remelem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-insfirst-remelem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,8 @@
+// stack:    inserts and removes happen at the same end
+// insfirst: stack's action happens at the end called "first", "head" or "front"
+// remelem:  removes happen via an element-level operation and inserts happen via the api-provided "first"/"head"/"front"
+
+#define BOP_TEARDOWN(lst, ui, iters, i) BFX_REMOVE_FIRST(B_UserItem, lst)
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_FIRST(B_UserItem, lst, ui[i])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_HERE(B_UserItem, lst, iters[NumNodes-(i)-1])
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-allhead.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-allhead.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-allhead.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,6 @@
+// stack:    inserts and removes happen at the same end
+// inslast:  stack's action happens at the end called "last", "tail" or "back"
+// allhead:  inserts and removes happen via the api-provided "last"/"tail"/"back"
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-inselem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-inselem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-inselem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,8 @@
+// stack:    inserts and removes happen at the same end
+// inslast:  stack's action happens at the end called "last", "tail" or "back"
+// inselem:  inserts happen via an element-level operation and removes happen via the api-provided "last"/"tail"/"back"
+
+#define BOP_INIT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_AFTER(B_UserItem, lst, ui[i], iters[i-1])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
Index: doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-remelem.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-remelem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/op-stack-inslast-remelem.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,8 @@
+// stack:    inserts and removes happen at the same end
+// inslast:  stack's action happens at the end called "last", "tail" or "back"
+// remelem:  removes happen via an element-level operation and inserts happen via the api-provided "last"/"tail"/"back"
+
+#define BOP_TEARDOWN(lst, ui, iters, i) BFX_REMOVE_LAST(B_UserItem, lst)
+
+#define BOP_INSERT(lst, ui, iters, i) BFX_INSERT_LAST(B_UserItem, lst, ui[i])
+#define BOP_REMOVE(lst, ui, iters, i) BFX_REMOVE_HERE(B_UserItem, lst, iters[NumNodes-(i)-1])
Index: doc/theses/mike_brooks_MMath/benchmarks/list/proglang.h
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/proglang.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/proglang.h	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,13 @@
+#ifdef __cforall
+#define __needExternC
+#endif
+
+#ifdef __cplusplus
+#define __needExternC
+#endif
+
+#ifdef __needExternC
+#define MAYBE_EXTERN_C(...) extern "C" { __VA_ARGS__ }
+#else
+#define MAYBE_EXTERN_C(...) __VA_ARGS__
+#endif
Index: doc/theses/mike_brooks_MMath/benchmarks/list/results-baseline.csv
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/results-baseline.csv	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/results-baseline.csv	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,255 @@
+2023-03-31 19:27:28,4,./perfexp--cfa-cfa--stack-inslast-allhead,423000000,5.005935,11.834362
+2023-03-31 19:27:33,2,./perfexp--lq-tailq--stack-inslast-allhead,334000000,5.003555,14.980704
+2023-03-31 19:27:38,3,./perfexp--lq-tailq--stack-insfirst-inselem,323000000,5.009098,15.508043
+2023-03-31 19:27:43,2,./perfexp--cpp-stlref--stack-insfirst-inselem,163000000,5.016009,30.773061
+2023-03-31 19:27:48,1,./perfexp--cfa-cfa--queue-inslast-remelem,421000000,5.009923,11.900055
+2023-03-31 19:27:53,3,./perfexp--lq-tailq--stack-inslast-allhead,334000000,5.002902,14.978749
+2023-03-31 19:27:58,5,./perfexp--lq-tailq--queue-inslast-allhead,332000000,5.005614,15.077151
+2023-03-31 19:28:03,1,./perfexp--cfa-cfa--queue-insfirst-allhead,396000000,5.000937,12.628629
+2023-03-31 19:28:08,4,./perfexp--upp-upp--queue-insfirst-remelem,256000000,5.011495,19.576152
+2023-03-31 19:28:13,1,./perfexp--lq-tailq--stack-inslast-remelem,378000000,5.001084,13.230381
+2023-03-31 19:28:18,5,./perfexp--lq-tailq--queue-inslast-remelem,374000000,5.006099,13.385291
+2023-03-31 19:28:23,2,./perfexp--upp-upp--queue-insfirst-remelem,333000000,5.005545,15.031667
+2023-03-31 19:28:28,3,./perfexp--upp-upp--queue-insfirst-allhead,266000000,5.014940,18.853158
+2023-03-31 19:28:33,1,./perfexp--cfa-cfa--queue-inslast-inselem,334000000,5.011482,15.004437
+2023-03-31 19:28:38,4,./perfexp--cpp-stlref--queue-insfirst-remelem,163000000,5.030059,30.859258
+2023-03-31 19:28:44,4,./perfexp--lq-tailq--queue-insfirst-inselem,249000000,5.016382,20.146112
+2023-03-31 19:28:49,5,./perfexp--cfa-cfa--queue-inslast-inselem,334000000,5.014301,15.012877
+2023-03-31 19:28:54,3,./perfexp--cfa-cfa--queue-insfirst-remelem,406000000,5.007116,12.332798
+2023-03-31 19:28:59,2,./perfexp--cpp-stlref--stack-inslast-remelem,153000000,5.024482,32.839752
+2023-03-31 19:29:04,2,./perfexp--cpp-stlref--stack-insfirst-allhead,164000000,5.024998,30.640232
+2023-03-31 19:29:09,3,./perfexp--lq-list--stack-insfirst-remelem,347000000,5.009888,14.437718
+2023-03-31 19:29:14,1,./perfexp--upp-upp--queue-inslast-inselem,259000000,5.014481,19.360931
+2023-03-31 19:29:19,1,./perfexp--cpp-stlref--queue-inslast-allhead,160000000,5.005759,31.285994
+2023-03-31 19:29:24,3,./perfexp--cfa-cfa--stack-insfirst-allhead,406000000,5.010349,12.340761
+2023-03-31 19:29:29,1,./perfexp--cpp-stlref--queue-inslast-inselem,167000000,5.007053,29.982353
+2023-03-31 19:29:34,1,./perfexp--cpp-stlref--stack-inslast-inselem,161000000,5.030429,31.244901
+2023-03-31 19:29:39,5,./perfexp--upp-upp--stack-insfirst-allhead,383000000,5.010444,13.082099
+2023-03-31 19:29:44,3,./perfexp--cfa-cfa--queue-inslast-allhead,407000000,5.000017,12.285054
+2023-03-31 19:29:49,5,./perfexp--lq-tailq--stack-insfirst-inselem,318000000,5.006744,15.744478
+2023-03-31 19:29:54,4,./perfexp--upp-upp--queue-inslast-inselem,296000000,5.008677,16.921206
+2023-03-31 19:29:59,1,./perfexp--upp-upp--stack-insfirst-remelem,351000000,5.007612,14.266701
+2023-03-31 19:30:04,3,./perfexp--cpp-stlref--queue-inslast-remelem,153000000,5.004050,32.706209
+2023-03-31 19:30:09,2,./perfexp--cpp-stlref--stack-inslast-allhead,161000000,5.014647,31.146876
+2023-03-31 19:30:14,4,./perfexp--cfa-cfa--stack-insfirst-inselem,349000000,5.001062,14.329691
+2023-03-31 19:30:19,5,./perfexp--upp-upp--stack-insfirst-inselem,454000000,5.001747,11.017064
+2023-03-31 19:30:24,1,./perfexp--cpp-stlref--queue-insfirst-inselem,168000000,5.004676,29.789738
+2023-03-31 19:30:29,4,./perfexp--lq-tailq--stack-insfirst-inselem,335000000,5.009721,14.954391
+2023-03-31 19:30:34,5,./perfexp--lq-list--stack-insfirst-remelem,361000000,5.005113,13.864579
+2023-03-31 19:30:39,3,./perfexp--cpp-stlref--stack-insfirst-remelem,156000000,5.030276,32.245359
+2023-03-31 19:30:44,5,./perfexp--upp-upp--stack-inslast-remelem,266000000,5.002633,18.806891
+2023-03-31 19:30:49,1,./perfexp--lq-tailq--stack-insfirst-remelem,412000000,5.008334,12.156150
+2023-03-31 19:30:54,1,./perfexp--cfa-cfa--stack-insfirst-allhead,446000000,5.010397,11.234074
+2023-03-31 19:30:59,1,./perfexp--lq-tailq--queue-inslast-allhead,331000000,5.006195,15.124456
+2023-03-31 19:31:04,3,./perfexp--cpp-stlref--stack-inslast-inselem,158000000,5.000875,31.651108
+2023-03-31 19:31:09,2,./perfexp--lq-tailq--stack-insfirst-remelem,395000000,5.002754,12.665200
+2023-03-31 19:31:14,3,./perfexp--lq-tailq--queue-inslast-allhead,332000000,5.009016,15.087398
+2023-03-31 19:31:19,5,./perfexp--cpp-stlref--queue-inslast-allhead,164000000,5.021564,30.619293
+2023-03-31 19:31:24,3,./perfexp--cfa-cfa--queue-insfirst-inselem,327000000,5.000717,15.292713
+2023-03-31 19:31:29,3,./perfexp--cpp-stlref--queue-insfirst-remelem,162000000,5.005499,30.898142
+2023-03-31 19:31:35,2,./perfexp--lq-tailq--queue-insfirst-inselem,251000000,5.014907,19.979709
+2023-03-31 19:31:40,2,./perfexp--cfa-cfa--stack-insfirst-remelem,359000000,5.008696,13.951799
+2023-03-31 19:31:45,2,./perfexp--cfa-cfa--queue-insfirst-allhead,393000000,5.008223,12.743570
+2023-03-31 19:31:50,2,./perfexp--cpp-stlref--queue-inslast-remelem,155000000,5.002194,32.272219
+2023-03-31 19:31:55,1,./perfexp--cfa-cfa--stack-inslast-inselem,342000000,5.010768,14.651368
+2023-03-31 19:32:00,3,./perfexp--cfa-cfa--queue-inslast-remelem,413000000,5.003519,12.115058
+2023-03-31 19:32:05,2,./perfexp--cpp-stlref--queue-insfirst-remelem,161000000,5.010848,31.123280
+2023-03-31 19:32:10,4,./perfexp--lq-list--stack-insfirst-inselem,332000000,5.003152,15.069735
+2023-03-31 19:32:15,5,./perfexp--cpp-stlref--queue-insfirst-allhead,167000000,5.005526,29.973210
+2023-03-31 19:32:20,2,./perfexp--cfa-cfa--queue-inslast-remelem,416000000,5.000331,12.020026
+2023-03-31 19:32:25,2,./perfexp--lq-tailq--queue-insfirst-remelem,387000000,5.012051,12.951036
+2023-03-31 19:32:30,5,./perfexp--cfa-cfa--stack-insfirst-remelem,460000000,5.006224,10.883096
+2023-03-31 19:32:35,3,./perfexp--lq-tailq--stack-insfirst-remelem,394000000,5.012655,12.722475
+2023-03-31 19:32:40,3,./perfexp--lq-list--stack-insfirst-inselem,343000000,5.004610,14.590700
+2023-03-31 19:32:45,1,./perfexp--cfa-cfa--stack-inslast-allhead,393000000,5.008128,12.743328
+2023-03-31 19:32:50,2,./perfexp--cpp-stlref--queue-insfirst-inselem,171000000,5.021168,29.363556
+2023-03-31 19:32:55,2,./perfexp--lq-tailq--queue-inslast-remelem,388000000,5.009349,12.910693
+2023-03-31 19:33:00,5,./perfexp--lq-tailq--queue-insfirst-allhead,352000000,5.005131,14.219122
+2023-03-31 19:33:05,4,./perfexp--cpp-stlref--queue-inslast-remelem,155000000,5.000605,32.261968
+2023-03-31 19:33:10,1,./perfexp--upp-upp--stack-inslast-remelem,323000000,5.003378,15.490334
+2023-03-31 19:33:15,3,./perfexp--cfa-cfa--queue-insfirst-allhead,394000000,5.005338,12.703904
+2023-03-31 19:33:20,2,./perfexp--upp-upp--stack-inslast-remelem,279000000,5.001427,17.926262
+2023-03-31 19:33:25,2,./perfexp--cpp-stlref--stack-inslast-inselem,163000000,5.017870,30.784479
+2023-03-31 19:33:30,4,./perfexp--cfa-cfa--queue-inslast-allhead,400000000,5.011259,12.528148
+2023-03-31 19:33:35,1,./perfexp--lq-tailq--stack-inslast-inselem,344000000,5.001120,14.538140
+2023-03-31 19:33:40,4,./perfexp--upp-upp--stack-insfirst-remelem,348000000,5.006679,14.387009
+2023-03-31 19:33:45,2,./perfexp--lq-tailq--queue-insfirst-allhead,352000000,5.010992,14.235773
+2023-03-31 19:33:50,5,./perfexp--upp-upp--stack-insfirst-remelem,348000000,5.005135,14.382572
+2023-03-31 19:33:55,1,./perfexp--lq-tailq--stack-inslast-allhead,334000000,5.009346,14.998042
+2023-03-31 19:34:00,1,./perfexp--upp-upp--queue-insfirst-allhead,341000000,5.011735,14.697170
+2023-03-31 19:34:05,4,./perfexp--lq-tailq--queue-insfirst-allhead,352000000,5.010510,14.234403
+2023-03-31 19:34:10,3,./perfexp--cfa-cfa--stack-inslast-allhead,413000000,5.006185,12.121513
+2023-03-31 19:34:15,5,./perfexp--cpp-stlref--stack-insfirst-inselem,160000000,5.003600,31.272500
+2023-03-31 19:34:20,1,./perfexp--cfa-cfa--stack-inslast-remelem,388000000,5.004709,12.898735
+2023-03-31 19:34:25,5,./perfexp--cfa-cfa--queue-insfirst-remelem,380000000,5.005723,13.172955
+2023-03-31 19:34:30,5,./perfexp--cfa-cfa--stack-inslast-inselem,312000000,5.016162,16.077442
+2023-03-31 19:34:35,4,./perfexp--cfa-cfa--stack-inslast-inselem,311000000,5.000238,16.077936
+2023-03-31 19:34:40,3,./perfexp--lq-tailq--queue-inslast-remelem,383000000,5.000160,13.055248
+2023-03-31 19:34:45,1,./perfexp--cpp-stlref--stack-insfirst-inselem,162000000,5.016531,30.966241
+2023-03-31 19:34:50,5,./perfexp--lq-tailq--stack-inslast-inselem,362000000,5.013412,13.849204
+2023-03-31 19:34:55,3,./perfexp--lq-tailq--queue-insfirst-allhead,353000000,5.013478,14.202487
+2023-03-31 19:35:00,2,./perfexp--lq-list--stack-insfirst-remelem,360000000,5.006919,13.908108
+2023-03-31 19:35:05,4,./perfexp--cpp-stlref--stack-insfirst-allhead,159000000,5.014886,31.540164
+2023-03-31 19:35:10,5,./perfexp--cpp-stlref--stack-insfirst-remelem,156000000,5.031944,32.256051
+2023-03-31 19:35:15,3,./perfexp--lq-tailq--stack-inslast-remelem,430000000,5.005769,11.641323
+2023-03-31 19:35:21,3,./perfexp--cpp-stlref--queue-insfirst-inselem,170000000,5.005500,29.444118
+2023-03-31 19:35:26,4,./perfexp--cpp-stlref--queue-insfirst-inselem,156000000,5.024919,32.211019
+2023-03-31 19:35:31,4,./perfexp--upp-upp--stack-insfirst-inselem,434000000,5.009101,11.541707
+2023-03-31 19:35:36,3,./perfexp--lq-tailq--queue-inslast-inselem,382000000,5.000708,13.090859
+2023-03-31 19:35:41,3,./perfexp--upp-upp--queue-inslast-remelem,330000000,5.010637,15.183748
+2023-03-31 19:35:46,2,./perfexp--upp-upp--stack-inslast-allhead,375000000,5.003878,13.343675
+2023-03-31 19:35:51,4,./perfexp--cpp-stlref--stack-insfirst-inselem,163000000,5.023950,30.821779
+2023-03-31 19:35:56,3,./perfexp--upp-upp--stack-inslast-remelem,352000000,5.005380,14.219830
+2023-03-31 19:36:01,5,./perfexp--lq-tailq--queue-insfirst-inselem,263000000,5.016375,19.073669
+2023-03-31 19:36:06,3,./perfexp--upp-upp--queue-inslast-allhead,352000000,5.012660,14.240511
+2023-03-31 19:36:11,1,./perfexp--upp-upp--queue-inslast-allhead,363000000,5.012098,13.807433
+2023-03-31 19:36:16,1,./perfexp--cpp-stlref--queue-insfirst-allhead,170000000,5.011107,29.477100
+2023-03-31 19:36:21,5,./perfexp--upp-upp--queue-insfirst-allhead,340000000,5.011021,14.738297
+2023-03-31 19:36:26,1,./perfexp--lq-list--stack-insfirst-remelem,398000000,5.007591,12.581887
+2023-03-31 19:36:31,5,./perfexp--lq-tailq--stack-insfirst-allhead,349000000,5.011451,14.359458
+2023-03-31 19:36:36,5,./perfexp--cfa-cfa--queue-inslast-remelem,406000000,5.011487,12.343564
+2023-03-31 19:36:41,1,./perfexp--upp-upp--stack-insfirst-inselem,383000000,5.003979,13.065219
+2023-03-31 19:36:46,3,./perfexp--upp-upp--stack-insfirst-allhead,389000000,5.012141,12.884681
+2023-03-31 19:36:51,2,./perfexp--cpp-stlref--queue-inslast-allhead,164000000,5.015379,30.581579
+2023-03-31 19:36:56,4,./perfexp--lq-tailq--queue-inslast-inselem,383000000,5.001909,13.059815
+2023-03-31 19:37:01,4,./perfexp--cpp-stlref--stack-insfirst-remelem,155000000,5.022849,32.405477
+2023-03-31 19:37:06,4,./perfexp--lq-tailq--queue-inslast-allhead,331000000,5.010896,15.138659
+2023-03-31 19:37:11,4,./perfexp--lq-tailq--stack-inslast-remelem,419000000,5.006098,11.947728
+2023-03-31 19:37:16,1,./perfexp--cpp-stlref--stack-inslast-allhead,158000000,5.015832,31.745772
+2023-03-31 19:37:21,4,./perfexp--lq-tailq--stack-inslast-inselem,345000000,5.012906,14.530162
+2023-03-31 19:37:26,4,./perfexp--lq-tailq--stack-insfirst-remelem,386000000,5.009408,12.977741
+2023-03-31 19:37:31,5,./perfexp--cfa-cfa--stack-inslast-allhead,393000000,5.003769,12.732237
+2023-03-31 19:37:36,2,./perfexp--lq-tailq--stack-inslast-remelem,371000000,5.001841,13.482051
+2023-03-31 19:37:41,1,./perfexp--upp-upp--stack-insfirst-allhead,389000000,5.006327,12.869735
+2023-03-31 19:37:46,1,./perfexp--cfa-cfa--stack-insfirst-remelem,459000000,5.003980,10.901917
+2023-03-31 19:37:51,4,./perfexp--cfa-cfa--queue-insfirst-remelem,364000000,5.012720,13.771209
+2023-03-31 19:37:56,2,./perfexp--cfa-cfa--queue-inslast-allhead,406000000,5.010192,12.340374
+2023-03-31 19:38:01,4,./perfexp--upp-upp--queue-inslast-allhead,356000000,5.008926,14.070017
+2023-03-31 19:38:06,3,./perfexp--cfa-cfa--queue-inslast-inselem,334000000,5.002321,14.977009
+2023-03-31 19:38:11,2,./perfexp--cpp-stlref--stack-insfirst-remelem,154000000,5.013800,32.557143
+2023-03-31 19:38:16,2,./perfexp--upp-upp--stack-insfirst-remelem,335000000,5.001526,14.929928
+2023-03-31 19:38:21,3,./perfexp--lq-list--stack-insfirst-allhead,369000000,5.004733,13.562962
+2023-03-31 19:38:26,4,./perfexp--upp-upp--queue-inslast-remelem,330000000,5.012977,15.190839
+2023-03-31 19:38:31,3,./perfexp--upp-upp--stack-insfirst-inselem,460000000,5.009253,10.889680
+2023-03-31 19:38:36,1,./perfexp--lq-list--stack-insfirst-allhead,368000000,5.003663,13.596910
+2023-03-31 19:38:41,4,./perfexp--lq-tailq--queue-insfirst-remelem,384000000,5.002042,13.026151
+2023-03-31 19:38:46,2,./perfexp--upp-upp--queue-insfirst-allhead,341000000,5.013226,14.701543
+2023-03-31 19:38:52,3,./perfexp--upp-upp--queue-inslast-inselem,309000000,5.001450,16.185922
+2023-03-31 19:38:57,1,./perfexp--upp-upp--stack-inslast-inselem,337000000,5.012126,14.872777
+2023-03-31 19:39:02,2,./perfexp--lq-tailq--queue-inslast-inselem,371000000,5.000054,13.477235
+2023-03-31 19:39:07,4,./perfexp--upp-upp--stack-inslast-inselem,344000000,5.005446,14.550715
+2023-03-31 19:39:12,5,./perfexp--upp-upp--stack-inslast-allhead,368000000,5.002693,13.594274
+2023-03-31 19:39:17,4,./perfexp--upp-upp--stack-inslast-allhead,367000000,5.003154,13.632572
+2023-03-31 19:39:22,5,./perfexp--cpp-stlref--queue-inslast-remelem,160000000,5.000525,31.253281
+2023-03-31 19:39:27,4,./perfexp--cpp-stlref--stack-inslast-remelem,151000000,5.029519,33.308073
+2023-03-31 19:39:32,2,./perfexp--lq-tailq--stack-insfirst-inselem,325000000,5.004893,15.399671
+2023-03-31 19:39:37,1,./perfexp--lq-tailq--queue-insfirst-allhead,352000000,5.013295,14.242315
+2023-03-31 19:39:42,1,./perfexp--upp-upp--queue-insfirst-remelem,283000000,5.003731,17.681028
+2023-03-31 19:39:47,1,./perfexp--lq-tailq--queue-inslast-remelem,367000000,5.005815,13.639823
+2023-03-31 19:39:52,2,./perfexp--cfa-cfa--queue-insfirst-inselem,327000000,5.005983,15.308817
+2023-03-31 19:39:57,5,./perfexp--cfa-cfa--stack-inslast-remelem,410000000,5.009717,12.218822
+2023-03-31 19:40:02,1,./perfexp--cfa-cfa--queue-insfirst-inselem,328000000,5.011560,15.279146
+2023-03-31 19:40:07,2,./perfexp--upp-upp--stack-insfirst-inselem,385000000,5.007537,13.006590
+2023-03-31 19:40:12,2,./perfexp--upp-upp--stack-inslast-inselem,338000000,5.004590,14.806479
+2023-03-31 19:40:17,3,./perfexp--upp-upp--stack-insfirst-remelem,274000000,5.017259,18.311164
+2023-03-31 19:40:22,4,./perfexp--lq-tailq--stack-inslast-allhead,335000000,5.014199,14.967758
+2023-03-31 19:40:27,2,./perfexp--cfa-cfa--stack-insfirst-allhead,414000000,5.005415,12.090374
+2023-03-31 19:40:32,1,./perfexp--cfa-cfa--queue-inslast-allhead,406000000,5.011412,12.343379
+2023-03-31 19:40:37,3,./perfexp--cfa-cfa--stack-insfirst-remelem,414000000,5.002421,12.083143
+2023-03-31 19:40:42,5,./perfexp--upp-upp--queue-insfirst-remelem,331000000,5.000905,15.108474
+2023-03-31 19:40:47,3,./perfexp--cfa-cfa--stack-inslast-inselem,335000000,5.007672,14.948275
+2023-03-31 19:40:52,5,./perfexp--cpp-stlref--queue-insfirst-remelem,161000000,5.009848,31.117068
+2023-03-31 19:40:57,3,./perfexp--cfa-cfa--stack-insfirst-inselem,349000000,5.007873,14.349206
+2023-03-31 19:41:02,5,./perfexp--cfa-cfa--stack-insfirst-allhead,355000000,5.000800,14.086761
+2023-03-31 19:41:07,1,./perfexp--cpp-stlref--stack-inslast-remelem,150000000,5.024945,33.499633
+2023-03-31 19:41:12,5,./perfexp--lq-tailq--stack-inslast-allhead,334000000,5.007218,14.991671
+2023-03-31 19:41:17,3,./perfexp--upp-upp--stack-inslast-inselem,332000000,5.000084,15.060494
+2023-03-31 19:41:22,2,./perfexp--lq-list--stack-insfirst-allhead,369000000,5.007658,13.570889
+2023-03-31 19:41:27,1,./perfexp--cpp-stlref--stack-insfirst-remelem,154000000,5.006973,32.512812
+2023-03-31 19:41:32,1,./perfexp--upp-upp--queue-inslast-remelem,330000000,5.006795,15.172106
+2023-03-31 19:41:37,1,./perfexp--lq-tailq--stack-insfirst-inselem,349000000,5.007185,14.347235
+2023-03-31 19:41:42,2,./perfexp--upp-upp--stack-insfirst-allhead,389000000,5.000245,12.854100
+2023-03-31 19:41:47,2,./perfexp--cpp-stlref--queue-insfirst-allhead,162000000,5.017882,30.974580
+2023-03-31 19:41:52,4,./perfexp--lq-list--stack-insfirst-remelem,326000000,5.012917,15.377046
+2023-03-31 19:41:57,4,./perfexp--cfa-cfa--stack-insfirst-remelem,351000000,5.009336,14.271613
+2023-03-31 19:42:02,1,./perfexp--lq-tailq--stack-insfirst-allhead,319000000,5.005023,15.689727
+2023-03-31 19:42:07,1,./perfexp--lq-list--stack-insfirst-inselem,344000000,5.001258,14.538541
+2023-03-31 19:42:12,5,./perfexp--cpp-stlref--stack-inslast-inselem,162000000,5.026040,31.024938
+2023-03-31 19:42:17,2,./perfexp--lq-list--stack-insfirst-inselem,353000000,5.006230,14.181955
+2023-03-31 19:42:22,2,./perfexp--cpp-stlref--queue-inslast-inselem,165000000,5.000936,30.308703
+2023-03-31 19:42:27,3,./perfexp--cpp-stlref--stack-inslast-remelem,150000000,5.002665,33.351100
+2023-03-31 19:42:32,4,./perfexp--cfa-cfa--stack-inslast-remelem,391000000,5.000185,12.788197
+2023-03-31 19:42:37,5,./perfexp--cpp-stlref--stack-inslast-remelem,151000000,5.013932,33.204848
+2023-03-31 19:42:42,1,./perfexp--cpp-stlref--stack-insfirst-allhead,165000000,5.026076,30.461067
+2023-03-31 19:42:47,2,./perfexp--upp-upp--queue-inslast-allhead,351000000,5.010960,14.276239
+2023-03-31 19:42:52,4,./perfexp--upp-upp--stack-insfirst-allhead,389000000,5.012561,12.885761
+2023-03-31 19:42:57,4,./perfexp--lq-tailq--queue-inslast-remelem,420000000,5.007035,11.921512
+2023-03-31 19:43:02,2,./perfexp--upp-upp--queue-insfirst-inselem,341000000,5.002662,14.670563
+2023-03-31 19:43:08,3,./perfexp--lq-tailq--stack-insfirst-allhead,307000000,5.013358,16.330156
+2023-03-31 19:43:13,5,./perfexp--cfa-cfa--queue-inslast-allhead,408000000,5.010175,12.279841
+2023-03-31 19:43:18,5,./perfexp--cfa-cfa--queue-insfirst-inselem,331000000,5.001587,15.110535
+2023-03-31 19:43:23,5,./perfexp--cfa-cfa--stack-insfirst-inselem,327000000,5.001593,15.295391
+2023-03-31 19:43:28,5,./perfexp--cpp-stlref--queue-inslast-inselem,169000000,5.004995,29.615355
+2023-03-31 19:43:33,3,./perfexp--cfa-cfa--stack-inslast-remelem,393000000,5.011401,12.751656
+2023-03-31 19:43:38,4,./perfexp--cfa-cfa--stack-insfirst-allhead,405000000,5.011151,12.373212
+2023-03-31 19:43:43,4,./perfexp--cfa-cfa--queue-insfirst-allhead,391000000,5.000233,12.788320
+2023-03-31 19:43:48,2,./perfexp--cfa-cfa--stack-inslast-allhead,393000000,5.004816,12.734901
+2023-03-31 19:43:53,3,./perfexp--lq-tailq--stack-inslast-inselem,347000000,5.004281,14.421559
+2023-03-31 19:43:58,1,./perfexp--cfa-cfa--queue-insfirst-remelem,414000000,5.002075,12.082307
+2023-03-31 19:44:03,1,./perfexp--lq-tailq--queue-insfirst-remelem,384000000,5.001617,13.025044
+2023-03-31 19:44:08,1,./perfexp--lq-tailq--queue-insfirst-inselem,260000000,5.002907,19.241950
+2023-03-31 19:44:13,5,./perfexp--cpp-stlref--queue-insfirst-inselem,165000000,5.000270,30.304667
+2023-03-31 19:44:18,2,./perfexp--cfa-cfa--queue-insfirst-remelem,366000000,5.007116,13.680645
+2023-03-31 19:44:23,5,./perfexp--cfa-cfa--queue-insfirst-allhead,393000000,5.001893,12.727463
+2023-03-31 19:44:28,4,./perfexp--upp-upp--queue-insfirst-allhead,341000000,5.014534,14.705378
+2023-03-31 19:44:33,3,./perfexp--cpp-stlref--stack-insfirst-inselem,159000000,5.026323,31.612094
+2023-03-31 19:44:38,1,./perfexp--upp-upp--queue-insfirst-inselem,304000000,5.014708,16.495750
+2023-03-31 19:44:43,3,./perfexp--cpp-stlref--stack-insfirst-allhead,161000000,5.007517,31.102590
+2023-03-31 19:44:48,2,./perfexp--cfa-cfa--queue-inslast-inselem,333000000,5.002851,15.023577
+2023-03-31 19:44:53,4,./perfexp--cpp-stlref--queue-inslast-inselem,167000000,5.017522,30.045042
+2023-03-31 19:44:58,3,./perfexp--cpp-stlref--queue-inslast-inselem,169000000,5.013245,29.664172
+2023-03-31 19:45:03,2,./perfexp--cfa-cfa--stack-inslast-inselem,330000000,5.012513,15.189433
+2023-03-31 19:45:08,3,./perfexp--lq-tailq--queue-insfirst-inselem,249000000,5.008581,20.114783
+2023-03-31 19:45:13,1,./perfexp--upp-upp--stack-inslast-allhead,370000000,5.001887,13.518614
+2023-03-31 19:45:18,3,./perfexp--cpp-stlref--stack-inslast-allhead,159000000,5.004614,31.475560
+2023-03-31 19:45:23,2,./perfexp--cfa-cfa--stack-inslast-remelem,394000000,5.001945,12.695292
+2023-03-31 19:45:28,5,./perfexp--lq-list--stack-insfirst-allhead,368000000,5.010090,13.614375
+2023-03-31 19:45:33,4,./perfexp--cfa-cfa--queue-inslast-inselem,333000000,5.004838,15.029544
+2023-03-31 19:45:38,1,./perfexp--cpp-stlref--queue-insfirst-remelem,162000000,5.029978,31.049247
+2023-03-31 19:45:43,5,./perfexp--upp-upp--queue-inslast-allhead,357000000,5.012482,14.040566
+2023-03-31 19:45:48,3,./perfexp--upp-upp--stack-inslast-allhead,369000000,5.009770,13.576612
+2023-03-31 19:45:53,5,./perfexp--cpp-stlref--stack-insfirst-allhead,163000000,5.027071,30.840926
+2023-03-31 19:45:58,2,./perfexp--upp-upp--queue-inslast-remelem,336000000,5.003322,14.890839
+2023-03-31 19:46:03,5,./perfexp--lq-tailq--stack-insfirst-remelem,393000000,5.006863,12.740109
+2023-03-31 19:46:08,2,./perfexp--upp-upp--queue-inslast-inselem,311000000,5.009328,16.107164
+2023-03-31 19:46:13,5,./perfexp--upp-upp--stack-inslast-inselem,337000000,5.003462,14.847068
+2023-03-31 19:46:18,4,./perfexp--cfa-cfa--queue-insfirst-inselem,328000000,5.005560,15.260854
+2023-03-31 19:46:23,5,./perfexp--lq-tailq--queue-insfirst-remelem,388000000,5.005267,12.900173
+2023-03-31 19:46:28,4,./perfexp--upp-upp--queue-insfirst-inselem,341000000,5.000952,14.665548
+2023-03-31 19:46:33,3,./perfexp--upp-upp--queue-insfirst-remelem,329000000,5.008783,15.224264
+2023-03-31 19:46:38,2,./perfexp--lq-tailq--stack-inslast-inselem,344000000,5.008000,14.558140
+2023-03-31 19:46:43,2,./perfexp--lq-tailq--stack-insfirst-allhead,340000000,5.009734,14.734512
+2023-03-31 19:46:48,4,./perfexp--cpp-stlref--stack-inslast-inselem,162000000,5.019440,30.984198
+2023-03-31 19:46:53,2,./perfexp--lq-tailq--queue-inslast-allhead,332000000,5.009297,15.088244
+2023-03-31 19:46:58,5,./perfexp--upp-upp--queue-insfirst-inselem,342000000,5.003095,14.628933
+2023-03-31 19:47:03,5,./perfexp--upp-upp--queue-inslast-remelem,335000000,5.012318,14.962143
+2023-03-31 19:47:08,3,./perfexp--cpp-stlref--queue-inslast-allhead,163000000,5.009047,30.730350
+2023-03-31 19:47:14,4,./perfexp--cpp-stlref--stack-inslast-allhead,161000000,5.023260,31.200373
+2023-03-31 19:47:19,5,./perfexp--lq-tailq--queue-inslast-inselem,381000000,5.003106,13.131512
+2023-03-31 19:47:24,2,./perfexp--cfa-cfa--stack-insfirst-inselem,345000000,5.006899,14.512751
+2023-03-31 19:47:29,4,./perfexp--cpp-stlref--queue-insfirst-allhead,172000000,5.016629,29.166448
+2023-03-31 19:47:34,4,./perfexp--cpp-stlref--queue-inslast-allhead,160000000,5.029070,31.431687
+2023-03-31 19:47:39,5,./perfexp--lq-tailq--stack-inslast-remelem,426000000,5.011093,11.763129
+2023-03-31 19:47:44,3,./perfexp--upp-upp--queue-insfirst-inselem,327000000,5.011050,15.324312
+2023-03-31 19:47:49,4,./perfexp--lq-list--stack-insfirst-allhead,367000000,5.002129,13.629779
+2023-03-31 19:47:54,1,./perfexp--cfa-cfa--stack-insfirst-inselem,346000000,5.013616,14.490220
+2023-03-31 19:47:59,5,./perfexp--upp-upp--queue-inslast-inselem,321000000,5.014042,15.620069
+2023-03-31 19:48:04,4,./perfexp--cfa-cfa--queue-inslast-remelem,406000000,5.006074,12.330232
+2023-03-31 19:48:09,5,./perfexp--cpp-stlref--stack-inslast-allhead,157000000,5.021947,31.986924
+2023-03-31 19:48:14,3,./perfexp--lq-tailq--queue-insfirst-remelem,388000000,5.006783,12.904080
+2023-03-31 19:48:19,4,./perfexp--upp-upp--stack-inslast-remelem,266000000,5.014546,18.851677
+2023-03-31 19:48:24,4,./perfexp--lq-tailq--stack-insfirst-allhead,310000000,5.000707,16.131313
+2023-03-31 19:48:29,5,./perfexp--lq-list--stack-insfirst-inselem,338000000,5.012455,14.829749
+2023-03-31 19:48:34,3,./perfexp--cpp-stlref--queue-insfirst-allhead,170000000,5.007810,29.457706
+2023-03-31 19:48:39,1,./perfexp--lq-tailq--queue-inslast-inselem,374000000,5.000982,13.371610
+2023-03-31 19:48:44,1,./perfexp--cpp-stlref--queue-inslast-remelem,163000000,5.028949,30.852448
Index: doc/theses/mike_brooks_MMath/benchmarks/list/tailq-bug.c
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/tailq-bug.c	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/tailq-bug.c	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,118 @@
+/*
+
+There is a right way and a wrong way to remove the last element of a tailq.
+The right way does it in two steps.
+This fact is undocumented anywhere and never asked on SO.
+
+When the TAILQ_REMOVE is in an intermediate state of removal, it proceeds with a subsequent step starting from its "remove this guy" argument.
+So "remove this guy" must be fully evaluated to a concrete node (call by value).
+If you try to do it with nested expressions, this subsequent call of "from which guy again?" performs an evaluation of TAILQ_LAST in the intermediate state (call by name), which gives the wrong value.
+Everything then gets trashed.
+
+The actual/expected annotations are for the symptom that led me to the test.
+  actual means without -DFIXIT
+  expected obtains with -DFIXIT
+Other outputs are unannotated, but we can easily see things getting trashed in them too.
+
+*/
+
+
+#include <sys/queue.h>
+#include <stdio.h>
+
+#ifdef FIXIT
+#define MY_TAILQ_REMOVE_LAST(headp, TYPE, HEADNAME, NAME) ({\
+    struct TYPE * last = TAILQ_LAST(headp, HEADNAME); \
+    TAILQ_REMOVE(headp, last, NAME); \
+})
+#else
+#define MY_TAILQ_REMOVE_LAST(headp, TYPE, HEADNAME, NAME) \
+    TAILQ_REMOVE(headp, TAILQ_LAST(headp, HEADNAME), NAME)
+#endif
+
+int main () {
+
+struct req {
+  int pri, rqr;
+  TAILQ_ENTRY(req) x;
+};
+
+TAILQ_HEAD(reql, req);
+
+struct reql reqs = TAILQ_HEAD_INITIALIZER(reqs);
+TAILQ_INIT(&reqs);
+
+struct req
+  r1 = {1, 42},
+  r2 = {2, 42};
+
+struct req *cur;
+/*
+  (Irrelevant to the bug, not a problem:)
+  You can't navigate next/prev for unlisted elements (it crashes).
+  So I only show them for listed ones.
+*/
+
+printf("r1@%p, r2@%p\n", &r1, &r2);
+
+printf("reqs.first = %p\n", TAILQ_FIRST(&reqs));
+printf("reqs.last = %p\n", TAILQ_LAST(&reqs, reql));
+printf("reqs =");
+TAILQ_FOREACH(cur, &reqs, x)
+    printf(" %p", cur);
+printf("\n");
+
+
+TAILQ_INSERT_TAIL(&reqs, &r1, x);
+
+printf("-\n");
+printf("r1.next=%p\n", TAILQ_NEXT(&r1, x));             // a&e: (nil)   is last
+printf("r1.prev=%p\n", TAILQ_PREV(&r1, reql, x));       // a&e: (nil)   is first
+
+printf("reqs.first = %p\n", TAILQ_FIRST(&reqs));
+printf("reqs.last = %p\n", TAILQ_LAST(&reqs, reql));
+printf("reqs =");
+TAILQ_FOREACH(cur, &reqs, x)
+    printf(" %p", cur);
+printf("\n");
+
+TAILQ_INSERT_TAIL(&reqs, &r2, x);
+
+printf("-\n");
+printf("r1.next=%p\n", TAILQ_NEXT(&r1, x));             // a&e: @r2     has succ
+printf("r1.prev=%p\n", TAILQ_PREV(&r1, reql, x));       // a&e: (nil)   is first
+printf("r2.next=%p\n", TAILQ_NEXT(&r2, x));             // a&e: (nil)   is last
+printf("r2.prev=%p\n", TAILQ_PREV(&r2, reql, x));       // a&e: @r1     has pred
+
+printf("reqs.first = %p\n", TAILQ_FIRST(&reqs));
+printf("reqs.last = %p\n", TAILQ_LAST(&reqs, reql));
+printf("reqs =");
+TAILQ_FOREACH(cur, &reqs, x)
+    printf(" %p", cur);
+printf("\n");
+
+MY_TAILQ_REMOVE_LAST(&reqs, req, reql, x);
+
+printf("-\n");
+printf("r1.next=%p\n", TAILQ_NEXT(&r1, x));             //   e: (nil)   is last;   a: @r2
+printf("r1.prev=%p\n", TAILQ_PREV(&r1, reql, x));       //   e: (nil)   is first;  a: @r2
+
+printf("reqs.first = %p\n", TAILQ_FIRST(&reqs));
+printf("reqs.last = %p\n", TAILQ_LAST(&reqs, reql));
+printf("reqs =");
+TAILQ_FOREACH(cur, &reqs, x)
+    printf(" %p", cur);
+printf("\n");
+
+MY_TAILQ_REMOVE_LAST(&reqs, req, reql, x);
+
+printf("-\n");
+
+printf("reqs.first = %p\n", TAILQ_FIRST(&reqs));
+printf("reqs.last = %p\n", TAILQ_LAST(&reqs, reql));
+printf("reqs =");                                       //   e: (none);  a: @
+TAILQ_FOREACH(cur, &reqs, x)
+    printf(" %p", cur);
+printf("\n");
+
+}
Index: doc/theses/mike_brooks_MMath/benchmarks/list/test-correctness-regenerate-expected.sh
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/test-correctness-regenerate-expected.sh	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/test-correctness-regenerate-expected.sh	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,24 @@
+echo Should you make? Clean?
+
+# example uses:
+# ./test-correctness-regenerate-expected
+# ./test-correctness-regenerate-expected -overwrite
+# ./test-correctness-regenerate-expected cfa-cfa allhead
+# ./test-correctness-regenerate-expected -overwrite cfa-cfa allhead
+
+if [[ "$1" == "-overwrite" ]]
+then
+   suffix=''
+   oracle_fx=${2:-cfa-cfa}
+   oracle_accessor=${3:-allhead}
+else
+   suffix='.proposed'
+   oracle_fx=${1:-cfa-cfa}
+   oracle_accessor=${2:-allhead}
+fi
+
+for casegroup in stack-insfirst stack-inslast queue-insfirst queue-inslast
+do
+  program=perfexp--$oracle_fx--$casegroup-$oracle_accessor
+  ./$program | sed 's|^\./perfexp--.*||g' > expect.$casegroup$suffix.txt
+done
Index: doc/theses/mike_brooks_MMath/benchmarks/list/test-correctness.sh
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/list/test-correctness.sh	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
+++ doc/theses/mike_brooks_MMath/benchmarks/list/test-correctness.sh	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -0,0 +1,20 @@
+echo Should you make clean?
+
+# Accept by eyeball when all you see is
+#   - (irrelevant) performance numbers being reported and 
+#   - any u++ "allocated but not freed" warnings that you can live with.
+# Reject when you see lines of trace messages, like what's in the "expect" files.
+
+function test1 {
+    echo + diff "<($1)" $2
+    diff <($1) $2
+}
+export -f test1
+
+make perfprogs -j 8 CFA=$cfa MODE=correctness
+
+for casegroup in stack-insfirst stack-inslast queue-insfirst queue-inslast
+do
+  export casegroup
+  ls perfexp--*$casegroup* | xargs -n 1 -I {} bash -c 'test1 "./$@" expect.$casegroup.txt' _ {}
+done
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 3d08cea8e646cc3328264630ab810c966ae90d92)
+++ src/Parser/parser.yy	(revision 75bd04167baa9a632e38de1b399820effd017b4c)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar 29 17:56:42 2023
-// Update Count     : 6325
+// Last Modified On : Thu Mar 30 21:28:25 2023
+// Update Count     : 6328
 //
 
@@ -1651,5 +1651,5 @@
 		// Called first: create header for WaitForStmt.
 		{ $$ = build_waitfor( new WaitForStmt(), $1, $2, maybe_build_compound( $3 ) ); }
-	| wor_waitfor_clause wor when_clause_opt waitfor statement	%prec THEN
+	| wor_waitfor_clause wor when_clause_opt waitfor statement
 		{ $$ = build_waitfor( $1, $3, $4, maybe_build_compound( $5 ) ); }
 	| wor_waitfor_clause wor when_clause_opt ELSE statement
@@ -1695,5 +1695,5 @@
 	wand_waituntil_clause
 		{ printf( "wor_waituntil_clause 1\n" ); $$ = nullptr; }
-	| wor_waituntil_clause wor wor_waituntil_clause		%prec THEN
+	| wor_waituntil_clause wor wand_waituntil_clause
 		{ printf( "wor_waituntil_clause 2\n" ); $$ = nullptr; }
 	| wor_waituntil_clause wor when_clause_opt ELSE statement
