Changes in / [e2f601f:8cd5434]


Ignore:
Files:
3 added
2 deleted
11 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/Makefile.am

    re2f601f r8cd5434  
    5959        concurrency/iofwd.hfa \
    6060        containers/list.hfa \
     61        containers/list2.hfa \
    6162        containers/queueLockFree.hfa \
    6263        containers/stackLockFree.hfa \
  • libcfa/src/concurrency/alarm.hfa

    re2f601f r8cd5434  
    4949        Duration period;                        // if > 0 => period of alarm
    5050
    51         inline dlink(alarm_node_t);
     51        DLISTED_MGD_IMPL_IN(alarm_node_t)
    5252
    5353        union {
     
    6060        enum alarm_type type;           // true if this is not a user defined alarm
    6161};
    62 P9_EMBEDDED( alarm_node_t, dlink(alarm_node_t) )
     62DLISTED_MGD_IMPL_OUT(alarm_node_t)
    6363
    6464void ?{}( alarm_node_t & this, $thread * thrd, Time alarm, Duration period );
     
    6767void ^?{}( alarm_node_t & this );
    6868
    69 typedef dlist(alarm_node_t) alarm_list_t;
     69typedef dlist(alarm_node_t, alarm_node_t) alarm_list_t;
    7070
    7171void insert( alarm_list_t * this, alarm_node_t * n );
  • libcfa/src/concurrency/kernel.cfa

    re2f601f r8cd5434  
    903903        }
    904904
    905         static void crawl_list( cluster * cltr, dlist(processor) & list, unsigned count ) {
     905        static void crawl_list( cluster * cltr, dlist(processor, processor) & list, unsigned count ) {
    906906                /* paranoid */ verify( cltr->stats );
    907907
  • libcfa/src/concurrency/kernel.hfa

    re2f601f r8cd5434  
    107107
    108108        // Link lists fields
    109         inline dlink(processor);
     109        DLISTED_MGD_IMPL_IN(processor)
    110110
    111111        // special init fields
     
    129129#endif
    130130};
    131 P9_EMBEDDED( processor, dlink(processor) )
    132131
    133132void  ?{}(processor & this, const char name[], struct cluster & cltr);
     
    137136static inline void  ?{}(processor & this, struct cluster & cltr) { this{ "Anonymous Processor", cltr}; }
    138137static inline void  ?{}(processor & this, const char name[])     { this{name, *mainCluster}; }
     138
     139DLISTED_MGD_IMPL_OUT(processor)
    139140
    140141//-----------------------------------------------------------------------------
     
    191192
    192193        // List of idle processors
    193         dlist(processor) idles;
     194        dlist(processor, processor) idles;
    194195
    195196        // List of active processors
    196         dlist(processor) actives;
     197        dlist(processor, processor) actives;
    197198};
    198199
  • libcfa/src/concurrency/ready_queue.cfa

    re2f601f r8cd5434  
    552552}
    553553
    554 static void assign_list(unsigned & value, dlist(processor) & list, unsigned count) {
     554static void assign_list(unsigned & value, dlist(processor, processor) & list, unsigned count) {
    555555        processor * it = &list`first;
    556556        for(unsigned i = 0; i < count; i++) {
  • libcfa/src/containers/list.hfa

    re2f601f r8cd5434  
    1818#include <assert.h>
    1919
    20 forall( Decorator &, T & )
    21 struct tytagref {
    22     inline T &;
     20#define __DLISTED_MGD_COMMON(ELEM, NODE, LINKS_FLD) \
     21static inline ELEM& $tempcv_n2e(NODE &node) { \
     22        return node; \
     23} \
     24\
     25static inline NODE& $tempcv_e2n(ELEM &node) { \
     26        return ( NODE & ) node; \
     27} \
     28\
     29static inline ELEM & ?`prev(NODE &node) { \
     30    $dlinks(ELEM) & ls = node.LINKS_FLD; \
     31        $mgd_link(ELEM) * l = &ls.prev; \
     32        ELEM * e = l->elem; \
     33        return *e; \
     34} \
     35\
     36static inline ELEM & ?`next(NODE &node) { \
     37    $dlinks(ELEM) & ls = node.LINKS_FLD; \
     38        $mgd_link(ELEM) * l = &ls.next; \
     39        ELEM * e = l->elem; \
     40        return *e; \
     41} \
     42\
     43static inline $mgd_link(ELEM) & $prev_link(NODE &node) { \
     44    $dlinks(ELEM) & ls = node.LINKS_FLD; \
     45        $mgd_link(ELEM) * l = &ls.prev; \
     46        return *l; \
     47} \
     48\
     49static inline $mgd_link(ELEM) & $next_link(NODE &node) { \
     50    $dlinks(ELEM) & ls = node.LINKS_FLD; \
     51        $mgd_link(ELEM) * l = &ls.next; \
     52        return *l; \
     53}
     54
     55#define __DLISTED_MGD_JUSTEXPL(STRUCT, IN_THELIST, STRUCT_IN_THELIST) \
     56struct STRUCT_IN_THELIST { \
     57        inline STRUCT; \
     58}; \
     59\
     60void ?{}(STRUCT_IN_THELIST &) = void; \
     61\
     62static inline STRUCT_IN_THELIST& ?`IN_THELIST(STRUCT &this) { \
     63        return (STRUCT_IN_THELIST&)this; \
     64}
     65
     66#define __DLISTED_MGD_JUSTIMPL(STRUCT)
     67
     68forall( tE & ) {
     69        struct $mgd_link {
     70                tE *elem;
     71                void *terminator;
     72                _Bool is_terminator;
     73                // will collapse to single pointer with tag bit
     74        };
     75        static inline void ?{}( $mgd_link(tE) &this, tE* elem ) {
     76                (this.elem){ elem };
     77                (this.terminator){ 0p };
     78                (this.is_terminator){ 0 };
     79        }
     80        static inline void ?{}( $mgd_link(tE) &this, void * terminator ) {
     81                (this.elem){ 0p };
     82                (this.terminator){ terminator };
     83                (this.is_terminator){ 1 };
     84        }
     85        static inline void ?=?( $mgd_link(tE) &this, tE* elem ) {
     86                this.elem = elem ;
     87                this.terminator = 0p;
     88                this.is_terminator = 0;
     89        }
     90        static inline void ?=?( $mgd_link(tE) &this, void * terminator ) {
     91                this.elem = 0p;
     92                this.terminator = terminator;
     93                this.is_terminator = 1;
     94        }
     95        struct $dlinks {
     96                // containing item is not listed
     97                // iff
     98                // links have (elem == 0p && terminator == 0p)
     99                $mgd_link(tE) next;
     100                $mgd_link(tE) prev;
     101        };
     102        static inline void ?{}( $dlinks(tE) &this ) {
     103                (this.next){ (tE *)0p };
     104                (this.prev){ (tE *)0p };
     105        }
     106}
     107
     108#define DLISTED_MGD_EXPL_IN(STRUCT, LIST_SUF) \
     109  $dlinks(STRUCT) $links_ ## LIST_SUF;
     110
     111#define DLISTED_MGD_EXPL_OUT(STRUCT, LIST_SUF) \
     112  __DLISTED_MGD_JUSTEXPL(STRUCT, in_##LIST_SUF, STRUCT ## _in_ ## LIST_SUF) \
     113  __DLISTED_MGD_COMMON(STRUCT, STRUCT##_in_##LIST_SUF,  $links_ ## LIST_SUF)
     114
     115#define DLISTED_MGD_IMPL_IN(STRUCT) \
     116  $dlinks(STRUCT) $links;
     117
     118#define DLISTED_MGD_IMPL_OUT(STRUCT) \
     119  __DLISTED_MGD_JUSTIMPL(STRUCT) \
     120  __DLISTED_MGD_COMMON(STRUCT, STRUCT, $links)
     121
     122trait $dlistable(Tnode &, Telem &) {
     123        $mgd_link(Telem) & $prev_link(Tnode &);
     124        $mgd_link(Telem) & $next_link(Tnode &);
     125        Telem& $tempcv_n2e(Tnode &);
     126        Tnode& $tempcv_e2n(Telem &);
     127
     128        Telem& ?`next(Tnode &);
     129        Telem& ?`prev(Tnode &);
    23130};
    24131
    25 trait embedded( tOuter &, tMid &, tInner & ) {
    26     tytagref( tMid, tInner ) ?`inner( tOuter & );
    27 };
    28 
    29 // embedded is reflexive, with no info (void) as the type tag
    30 forall (T &)
    31 static inline tytagref(void, T) ?`inner ( T & this ) { tytagref( void, T ) ret = {this}; return ret; }
    32 
    33 // use this on every case of plan-9 inheritance, to make embedded a closure of plan-9 inheritance
    34 #define P9_EMBEDDED( derived, immedBase ) \
    35 forall( Tbase &, TdiscardPath & | { tytagref( TdiscardPath, Tbase ) ?`inner( immedBase & ); } ) \
    36     static inline tytagref(immedBase, Tbase) ?`inner( derived & this ) { \
    37         immedBase & ib = this; \
    38         Tbase & b = ib`inner; \
    39         tytagref(immedBase, Tbase) result = { b }; \
    40         return result; \
    41     }
    42 
    43 #define EMBEDDED_VIA( OUTER, MID, INNER ) \
    44    (struct { tytagref(MID, INNER) ( * ?`inner ) ( OUTER & ); }){ ?`inner }
    45 
    46 #define DLINK_VIA( TE, TLINK ) \
    47    EMBEDDED_VIA( TE, TLINK, dlink(TE) )
    48 
    49 
    50 // The origin is the position encountered at the start of iteration,
    51 // signifying, "need to advance to the first element," and at the end
    52 // of iteration, signifying, "no more elements."  Normal comsumption of
    53 // an iterator runs ?`moveNext as the first step, and uses the return
    54 // of ?`moveNext as a guard, before dereferencing the iterator.  So
    55 // normal consumption of an iterator does not dereference an iterator
    56 // in origin position.  The value of a pointer (underlying a refence)
    57 // that is exposed publicly as an iteraor, and also a pointer stored
    58 // internally in a link field, is tagged, to indicate "is the origin"
    59 // (internally, is the list-head sentinel node), or untagged, to indicate
    60 // "is a regular node."  Intent is to help a user who dereferences an
    61 // iterator in origin position (which would be an API-use error on their
    62 // part), by failing fast.
    63 
    64 #if defined( __x86_64 )
    65     // Preferred case: tag in the most-significant bit.  Dereference
    66     // has been shown to segfault consistently.  Maintenance should
    67     // list more architectures as "ok" here, to let them use the
    68     // preferred case, when valid.
    69     #define ORIGIN_TAG_BITNO ( 8 * sizeof( size_t ) - 1 )
    70 #else
    71     // Fallback case: tag in the least-significant bit.  Dereference
    72     // will often give an alignment error, but may not, e.g. if
    73     // accessing a char-typed member.  32-bit x86 uses the most-
    74     // significant bit for real room on the heap.
    75     #define ORIGIN_TAG_BITNO 0
    76 #endif
    77 #define ORIGIN_TAG_MASK (((size_t)1) << ORIGIN_TAG_BITNO)
    78 
    79 #define ORIGIN_TAG_SET(p)   ((p) |  ORIGIN_TAG_MASK)
    80 #define ORIGIN_TAG_CLEAR(p) ((p) & ~ORIGIN_TAG_MASK)
    81 #define ORIGIN_TAG_QUERY(p) ((p) &  ORIGIN_TAG_MASK)
    82 
    83 
    84 forall( tE & ) {
    85 
    86     struct dlink{
    87         tE *next;
    88         tE *prev;
    89     };
    90 
    91     static inline void ?{}( dlink(tE) & this ) {
    92         this.next = 0p;
    93         this.prev = 0p;
    94     }
    95 
    96     forall( tLinks & = dlink(tE) )
    97     struct dlist {
    98         inline dlink(tE);
    99     };
    100 
    101     forall( tLinks & | embedded( tE, tLinks, dlink(tE) ) ) {
    102         static inline tE * $get_list_origin_addr( dlist(tE, tLinks) & lst ) {
    103             dlink(tE) & link_from_null = ( * (tE *) 0p )`inner;
    104             ptrdiff_t link_offset = (ptrdiff_t) & link_from_null;
    105             size_t origin_addr = ((size_t) & lst) - link_offset;
    106             size_t preResult = ORIGIN_TAG_SET( origin_addr );
    107             return (tE *)preResult;
    108         }
    109 
    110         static inline void ?{}( dlist(tE, tLinks) & this ) {
    111             tE * listOrigin = $get_list_origin_addr( this );
    112             ( ( dlink(tE) & ) this ){ listOrigin, listOrigin } ;
    113         }
    114     }
    115 
    116 }
    117 
    118 
    119 forall( tE &, tLinks & | embedded( tE, tLinks, dlink(tE) ) ) {
    120 
    121         static inline void insert_after(tE & list_pos, tE &to_insert) {
     132forall (Tnode &, Telem & | $dlistable(Tnode, Telem)) {
     133
     134        // implemented as a sentinel item in an underlying cicrular list
     135        // theList.$links.next is first
     136        // theList.$links.prev is last
     137        // note this allocation preserves prev-next composition as an identity
     138        struct dlist {
     139                $dlinks(Telem) $links;
     140        };
     141
     142        // an empty dlist
     143        // links refer to self, making a tight circle
     144        static inline void ?{}( dlist(Tnode, Telem) & this ) {
     145                $mgd_link(Telem) selfRef = (void *) &this;
     146                ( this.$links ) { selfRef, selfRef };
     147        }
     148
     149        static inline Telem & ?`first( dlist(Tnode, Telem) &l ) {
     150                return * l.$links.next.elem;
     151        }
     152
     153        static inline Telem & ?`last( dlist(Tnode, Telem) &l ) {
     154                return * l.$links.prev.elem;
     155        }
     156
     157        #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__))
     158        static bool $validate_fwd( dlist(Tnode, Telem) & this ) {
     159                Tnode * it = & $tempcv_e2n( this`first );
     160                if (!it) return (& this`last == 0p);
     161
     162                while( $next_link(*it).elem ) {
     163                        it = & $tempcv_e2n( * $next_link(*it).elem );
     164                }
     165
     166                return ( it == & $tempcv_e2n( this`last ) ) &&
     167                           ( $next_link(*it).is_terminator ) &&
     168                           ( ((dlist(Tnode, Telem)*)$next_link(*it).terminator) == &this );
     169        }
     170        static bool $validate_rev( dlist(Tnode, Telem) & this ) {
     171                Tnode * it = & $tempcv_e2n( this`last );
     172                if (!it) return (& this`first == 0p);
     173
     174                while( $prev_link(*it).elem ) {
     175                        it = & $tempcv_e2n( * $prev_link(*it).elem );
     176                }
     177
     178                return ( it == & $tempcv_e2n( this`first ) ) &&
     179                           ( $prev_link(*it).is_terminator ) &&
     180                           ( ((dlist(Tnode, Telem)*)$prev_link(*it).terminator) == &this );
     181        }
     182        static bool validate( dlist(Tnode, Telem) & this ) {
     183                return $validate_fwd(this) && $validate_rev(this);
     184        }
     185        #endif
     186
     187        static inline void insert_after(Tnode &list_pos, Telem &to_insert) {
    122188                verify (&list_pos != 0p);
    123189                verify (&to_insert != 0p);
    124         dlink(tE) & linkToInsert = to_insert`inner;
    125                 verify(linkToInsert.prev == 0p);
    126                 verify(linkToInsert.next == 0p);
    127         tE & list_pos_raw = list_pos;
    128         tE & list_pos_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & list_pos_raw );
    129         dlink(tE) & list_pos_links = list_pos_elem`inner;
    130         asm( "" : : : "memory" );
    131         tE & after_raw = * list_pos_links.next;
    132         tE & after_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & after_raw );
    133                 linkToInsert.prev = & list_pos_raw;
    134                 linkToInsert.next = & after_raw;
    135         dlink(tE) & afterLinks = after_elem`inner;
    136         afterLinks.prev = &to_insert;
    137                 list_pos_links.next = &to_insert;
    138         asm( "" : : : "memory" );
    139         }
    140 
    141         static inline void insert_before(tE & list_pos, tE &to_insert) {
     190                Tnode &singleton_to_insert = $tempcv_e2n(to_insert);
     191                verify($prev_link(singleton_to_insert).elem == 0p);
     192                verify($next_link(singleton_to_insert).elem == 0p);
     193                $prev_link(singleton_to_insert) = & $tempcv_n2e(list_pos);
     194                $next_link(singleton_to_insert) = $next_link(list_pos);
     195                if ($next_link(list_pos).is_terminator) {
     196                        dlist(Tnode, Telem) *list = ( dlist(Tnode, Telem) * ) $next_link(list_pos).terminator;
     197                        $dlinks(Telem) *list_links = & list->$links;
     198                        $mgd_link(Telem) *list_last = & list_links->prev;
     199                        *list_last = &to_insert;
     200                } else {
     201                        Telem *list_pos_next = $next_link(list_pos).elem;
     202                        if (list_pos_next) {
     203                                Tnode & lpn_inlist = $tempcv_e2n(*list_pos_next);
     204                                $prev_link(lpn_inlist) = &to_insert;
     205                        }
     206                }
     207                $next_link(list_pos) = &to_insert;
     208        }
     209
     210        static inline void insert_before(Tnode &list_pos, Telem &to_insert) {
    142211                verify (&list_pos != 0p);
    143212                verify (&to_insert != 0p);
    144         dlink(tE) & linkToInsert = to_insert`inner;
    145                 verify(linkToInsert.next == 0p);
    146                 verify(linkToInsert.prev == 0p);
    147         tE & list_pos_raw = list_pos;
    148         tE & list_pos_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & list_pos_raw );
    149         dlink(tE) & list_pos_links = list_pos_elem`inner;
    150         asm( "" : : : "memory" );
    151         tE & before_raw = * (list_pos_links).prev;
    152         tE & before_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & before_raw );
    153                 linkToInsert.next = & list_pos_raw;
    154                 linkToInsert.prev = & before_raw;
    155         dlink(tE) & beforeLinks = before_elem`inner;
    156         beforeLinks.next = &to_insert;
    157                 (list_pos_links).prev = &to_insert;
    158         asm( "" : : : "memory" );
    159         }
    160 
    161         static inline tE & remove(tE & list_pos) {
    162                 verify (&list_pos != 0p);
    163         tE & list_pos_elem = list_pos;
    164         verify( ! ORIGIN_TAG_QUERY((size_t) & list_pos_elem) );
    165         dlink(tE) & list_pos_links = list_pos_elem`inner;
    166         tE & before_raw = * list_pos_links.prev;
    167         tE & before_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & before_raw );
    168         dlink(tE) & before_links = before_elem`inner;
    169         tE & after_raw = * list_pos_links.next;
    170         tE & after_elem = * (tE *) ORIGIN_TAG_CLEAR( (size_t) & after_raw );
    171         dlink(tE) & after_links = after_elem`inner;
    172         before_links.next = &after_raw;
    173         after_links.prev = &before_raw;
    174         asm( "" : : : "memory" );
    175                 list_pos_links.prev = 0p;
    176                 list_pos_links.next = 0p;
    177         asm( "" : : : "memory" );
    178         return list_pos_elem;
    179         }
    180 
    181     static inline tE & ?`first( dlist(tE, tLinks) &lst ) {
    182         tE * firstPtr = lst.next;
    183         if (ORIGIN_TAG_QUERY((size_t)firstPtr)) firstPtr = 0p;
    184         return *firstPtr;
    185     }
    186     static inline tE & ?`last ( dlist(tE, tLinks) &lst ) {
    187         tE * lastPtr = lst.prev;
    188         if (ORIGIN_TAG_QUERY((size_t)lastPtr)) lastPtr = 0p;
    189         return *lastPtr;
    190     }
    191 
    192     static inline bool ?`isEmpty( dlist(tE, tLinks) & lst ) {
    193         tE * firstPtr = lst.next;
    194         if (ORIGIN_TAG_QUERY((size_t)firstPtr)) firstPtr = 0p;
    195         return firstPtr == 0p;
    196     }
    197 
    198     static inline tE & ?`elems( dlist(tE, tLinks) & lst ) {
    199         tE * origin = $get_list_origin_addr( lst );
    200         return *origin;
    201     }
    202 
    203     static inline bool ?`moveNext( tE && refx ) {
    204         tE && ref_inner = refx;
    205         tE & oldReferent = * (tE*) ORIGIN_TAG_CLEAR( (size_t) & ref_inner );
    206         &ref_inner = oldReferent`inner.next;
    207         return &ref_inner != 0p  &&
    208             ! ORIGIN_TAG_QUERY( (size_t) & ref_inner );
    209     }
    210 
    211     static inline bool ?`movePrev( tE && refx ) {
    212         tE && ref_inner = refx;
    213         tE & oldReferent = * (tE*) ORIGIN_TAG_CLEAR( (size_t) & ref_inner );
    214         &ref_inner = oldReferent`inner.prev;
    215         return &ref_inner != 0p  &&
    216             ! ORIGIN_TAG_QUERY( (size_t) & ref_inner );
    217     }
    218 
    219     static inline bool ?`hasNext( tE & e ) {
    220         return e`moveNext;
    221     }
    222 
    223     static inline bool ?`hasPrev( tE & e ) {
    224         return e`movePrev;
    225     }
    226 
    227     static inline tE & ?`next( tE & e ) {
    228         if( e`moveNext ) return e;
    229         return * 0p;
    230     }
    231 
    232     static inline tE & ?`prev( tE & e ) {
    233         if( e`movePrev ) return e;
    234         return * 0p;
    235     }
    236 
    237     static inline void insert_first( dlist(tE, tLinks) &lst, tE & e ) {
    238         insert_after(lst`elems, e);
    239     }
    240 
    241     static inline void insert_last( dlist(tE, tLinks) &lst, tE & e ) {
    242         insert_before(lst`elems, e);
    243     }
    244 
    245     static inline tE & try_pop_front( dlist(tE, tLinks) &lst ) {
    246         tE & first_inlist = lst`first;
    247         tE & first_item = first_inlist;
    248         if (&first_item) remove(first_inlist);
    249         return first_item;
    250     }
    251 
    252     static inline tE & try_pop_back( dlist(tE, tLinks) &lst ) {
    253         tE & last_inlist = lst`last;
    254         tE & last_item = last_inlist;
    255         if (&last_item) remove(last_inlist);
    256         return last_item;
    257     }
    258 
    259 
    260   #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__))
    261         static bool $validate_fwd( dlist(tE, tLinks) & this ) {
    262         if ( ! & this`first ) return ( (& this`last) == 0p);
    263 
    264         tE & lagElem = *0p;
    265 
    266         while ( tE & it = this`elems; it`moveNext ) {
    267             if (& lagElem == 0p &&  &it != & this`first ) return false;
    268             & lagElem = & it;
    269         }
    270 
    271         if (& lagElem != & this`last) return false;
    272 
    273         // TODO: verify that it is back at this`elems;
    274         return true;
    275         }
    276         static bool $validate_rev( dlist(tE, tLinks) & this ) {
    277         if ( ! & this`last ) return ( (& this`first) == 0p);
    278 
    279         tE & lagElem = *0p;
    280 
    281         while ( tE & it = this`elems; it`movePrev ) {
    282             if (& lagElem == 0p &&  &it != & this`last ) return false;
    283             & lagElem = & it;
    284         }
    285 
    286         if (& lagElem != & this`first) return false;
    287 
    288         // TODO: verify that it is back at this`elems;
    289         return true;
    290         }
    291         static bool validate( dlist(tE, tLinks) & this ) {
    292                 return $validate_fwd(this) && $validate_rev(this);
    293         }
    294   #endif
     213                Tnode &singleton_to_insert = $tempcv_e2n(to_insert);
     214                verify($prev_link(singleton_to_insert).elem == 0p);
     215                verify($next_link(singleton_to_insert).elem == 0p);
     216                $next_link(singleton_to_insert) = & $tempcv_n2e(list_pos);
     217                $prev_link(singleton_to_insert) = $prev_link(list_pos);
     218                if ($prev_link(list_pos).is_terminator) {
     219                        dlist(Tnode, Telem) *list = ( dlist(Tnode, Telem) * ) $prev_link(list_pos).terminator;
     220                        $dlinks(Telem) *list_links = & list->$links;
     221                        $mgd_link(Telem) *list_first = & list_links->next;
     222                        *list_first = &to_insert;
     223                } else {
     224                        Telem *list_pos_prev = $prev_link(list_pos).elem;
     225                        if (list_pos_prev) {
     226                                Tnode & lpp_inlist = $tempcv_e2n(*list_pos_prev);
     227                                $next_link(lpp_inlist) = &to_insert;
     228                        }
     229                }
     230                $prev_link(list_pos) = &to_insert;
     231        }
     232
     233    static inline void insert_first(dlist(Tnode, Telem) &list, Telem &to_insert) {
     234                verify (&list != 0p);
     235                verify (&to_insert != 0p);
     236                Tnode &singleton_to_insert = $tempcv_e2n(to_insert);
     237                verify($prev_link(singleton_to_insert).elem == 0p);
     238                verify($next_link(singleton_to_insert).elem == 0p);
     239
     240                $prev_link(singleton_to_insert) = (void*) &list;
     241                $next_link(singleton_to_insert) = list.$links.next;
     242
     243                $dlinks(Telem) *listLinks = & list.$links;
     244                if (listLinks->next.is_terminator) {
     245                        $mgd_link(Telem) * listPrevReference = & listLinks->prev;
     246                        *listPrevReference = &to_insert;
     247                } else {
     248                        Tnode & next_inlist = $tempcv_e2n(*list.$links.next.elem);
     249                        $prev_link(next_inlist) = &to_insert;
     250                }
     251                $mgd_link(Telem) * listNextReference = & listLinks->next;
     252                *listNextReference = &to_insert;
     253        }
     254
     255    static inline void insert_last(dlist(Tnode, Telem) &list, Telem &to_insert) {
     256                verify (&list != 0p);
     257                verify (&to_insert != 0p);
     258                Tnode &singleton_to_insert = $tempcv_e2n(to_insert);
     259                verify($next_link(singleton_to_insert).elem == 0p);
     260                verify($prev_link(singleton_to_insert).elem == 0p);
     261
     262                $next_link(singleton_to_insert) = (void*) &list;
     263                $prev_link(singleton_to_insert) = list.$links.prev;
     264
     265                $dlinks(Telem) *listLinks = & list.$links;
     266                if (listLinks->prev.is_terminator) {
     267                        $mgd_link(Telem) * listNextReference = & listLinks->next;
     268                        *listNextReference = &to_insert;
     269                } else {
     270                        Tnode & prev_inlist = $tempcv_e2n(*list.$links.prev.elem);
     271                        $next_link(prev_inlist) = &to_insert;
     272                }
     273                $mgd_link(Telem) * listPrevReference = & listLinks->prev;
     274                *listPrevReference = &to_insert;
     275        }
     276
     277    static inline void remove(Tnode &list_pos) {
     278                verify( &list_pos != 0p );
     279
     280                $mgd_link(Telem) &incoming_from_prev = *0p;
     281                $mgd_link(Telem) &incoming_from_next = *0p;
     282
     283                if ( $prev_link(list_pos).is_terminator ) {
     284                        dlist(Tnode, Telem) * tgt_before = ( dlist(Tnode, Telem) * ) $prev_link(list_pos).terminator;
     285                        $dlinks(Telem) * links_before = & tgt_before->$links;
     286                        &incoming_from_prev = & links_before->next;
     287                } else if ($prev_link(list_pos).elem) {
     288                        Telem * tgt_before = $prev_link(list_pos).elem;
     289                        Tnode & list_pos_before = $tempcv_e2n(*tgt_before);
     290                        &incoming_from_prev = & $next_link(list_pos_before);
     291                }
     292
     293                if ( $next_link(list_pos).is_terminator ) {
     294                        dlist(Tnode, Telem) * tgt_after = ( dlist(Tnode, Telem) * ) $next_link(list_pos).terminator;
     295                        $dlinks(Telem) * links_after = & tgt_after->$links;
     296                        &incoming_from_next = & links_after->prev;
     297                } else if ($next_link(list_pos).elem) {
     298                        Telem * tgt_after  = $next_link(list_pos).elem;
     299                        Tnode & list_pos_after  = $tempcv_e2n(*tgt_after );
     300                        &incoming_from_next = & $prev_link(list_pos_after );
     301                }
     302
     303                if (& incoming_from_prev) {
     304                        incoming_from_prev = $next_link(list_pos);
     305                }
     306                if (& incoming_from_next) {
     307                        incoming_from_next = $prev_link(list_pos);
     308                }
     309
     310                $next_link(list_pos) = (Telem*) 0p;
     311                $prev_link(list_pos) = (Telem*) 0p;
     312        }
     313
     314        static inline bool ?`is_empty(dlist(Tnode, Telem) &list) {
     315                verify( &list != 0p );
     316                $dlinks(Telem) *listLinks = & list.$links;
     317                if (listLinks->next.is_terminator) {
     318                        verify(listLinks->prev.is_terminator);
     319                        verify(listLinks->next.terminator);
     320                        verify(listLinks->prev.terminator);
     321                        return true;
     322                } else {
     323                        verify(!listLinks->prev.is_terminator);
     324                        verify(listLinks->next.elem);
     325                        verify(listLinks->prev.elem);
     326                        return false;
     327                }
     328        }
     329
     330        static inline Telem & pop_first(dlist(Tnode, Telem) &list) {
     331                verify( &list != 0p );
     332                verify( !list`is_empty );
     333                $dlinks(Telem) *listLinks = & list.$links;
     334                Telem & first = *listLinks->next.elem;
     335                Tnode & list_pos_first  = $tempcv_e2n( first );
     336                remove(list_pos_first);
     337                return first;
     338        }
     339
     340        static inline Telem & pop_last(dlist(Tnode, Telem) &list) {
     341                verify( &list != 0p );
     342                verify( !list`is_empty );
     343                $dlinks(Telem) *listLinks = & list.$links;
     344                Telem & last = *listLinks->prev.elem;
     345                Tnode & list_pos_last  = $tempcv_e2n( last );
     346                remove(list_pos_last);
     347                return last;
     348        }
    295349
    296350}
  • libcfa/src/executor.cfa

    re2f601f r8cd5434  
    77#include <containers/list.hfa>
    88
    9 forall( T &, TLink& = dlink(T) | embedded(T, TLink, dlink(T)) ) {
     9forall( T & | $dlistable(T, T) ) {
    1010        monitor Buffer {                                                                        // unbounded buffer
    11                 dlist( T, TLink ) queue;                                                // unbounded list of work requests
     11                dlist( T, T ) queue;                                                    // unbounded list of work requests
    1212                condition delay;
    1313        }; // Buffer
    1414
    15         void insert( Buffer(T, TLink) & mutex buf, T * elem ) with(buf) {
    16                 dlist( T, TLink ) * qptr = &queue;                              // workaround https://cforall.uwaterloo.ca/trac/ticket/166
     15        void insert( Buffer(T) & mutex buf, T * elem ) with(buf) {
     16                dlist( T, T ) * qptr = &queue;                                  // workaround https://cforall.uwaterloo.ca/trac/ticket/166
    1717                insert_last( *qptr, *elem );                                    // insert element into buffer
    1818                signal( delay );                                                                // restart
    1919        } // insert
    2020
    21         T * remove( Buffer(T, TLink) & mutex buf ) with(buf) {
    22                 dlist( T, TLink ) * qptr = &queue;                              // workaround https://cforall.uwaterloo.ca/trac/ticket/166
    23                 // if ( (*qptr)`isEmpty ) wait( delay );                // no request to process ? => wait
    24           if ( (*qptr)`isEmpty ) return 0p;                                     // no request to process ? => wait
    25                 return &try_pop_front( *qptr );
     21        T * remove( Buffer(T) & mutex buf ) with(buf) {
     22                dlist( T, T ) * qptr = &queue;                                  // workaround https://cforall.uwaterloo.ca/trac/ticket/166
     23                // if ( (*qptr)`is_empty ) wait( delay );                       // no request to process ? => wait
     24          if ( (*qptr)`is_empty ) return 0p;                            // no request to process ? => wait
     25                return &pop_first( *qptr );
    2626        } // remove
    2727} // forall
     
    2929struct WRequest {                                                                               // client request, no return
    3030        void (* action)( void );
    31         inline dlink(WRequest);
     31        DLISTED_MGD_IMPL_IN(WRequest)
    3232}; // WRequest
    33 P9_EMBEDDED(WRequest, dlink(WRequest))
     33DLISTED_MGD_IMPL_OUT(WRequest)
    3434
    3535void ?{}( WRequest & req ) with(req) { action = 0; }
  • src/Concurrency/Keywords.cc

    re2f601f r8cd5434  
    432432                                new ObjectDecl(
    433433                                        Virtual::concurrentDefaultVTableName(),
    434                                         noStorageClasses,
     434                                        Type::Const,
    435435                                        LinkageSpec::Cforall,
    436436                                        /* bitfieldWidth */ nullptr,
     
    504504                        new ObjectDecl(
    505505                                Virtual::concurrentDefaultVTableName(),
    506                                 Type::StorageClasses( Type::Extern ),
     506                                Type::Const,
    507507                                LinkageSpec::Cforall,
    508508                                /* bitfieldWidth */ nullptr,
  • tests/list/.expect/dlist-insert-remove.txt

    re2f601f r8cd5434  
     1~~~~~~~~~~~~~~~~~ Headless List Tests - insert_after ~~~~~~~~~~~~~~~~
     2
     3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     4Test 1-i:  Modifying Freds on MINE
     5~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     6==== fred by MINE before
     73.14
     8-
     93.14
     10-
     110.5
     12-
     130.5
     14-
     15==== fred by YOURS before
     163.14
     17-
     183.14
     19-
     200.5
     21-
     220.5
     23-
     24==== fred by MINE after
     253.14
     260.5
     27-
     283.14
     29-
     300.5
     31-
     320.5
     333.14
     34-
     35==== fred by YOURS after
     363.14
     37-
     383.14
     39-
     400.5
     41-
     420.5
     43-
     44~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     45Test 2-i.  Modifying Freds on YOURS
     46~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     47==== fred by MINE before
     483.14
     49-
     503.14
     51-
     520.5
     53-
     540.5
     55-
     56==== fred by YOURS before
     573.14
     58-
     593.14
     60-
     610.5
     62-
     630.5
     64-
     65==== fred by MINE after
     663.14
     67-
     683.14
     69-
     700.5
     71-
     720.5
     73-
     74==== fred by YOURS after
     753.14
     760.5
     77-
     783.14
     79-
     800.5
     81-
     820.5
     833.14
     84-
     85~~~~~~~~~~~~~~~~~~~~~~~~~~~
     86Test 3-i.  Modifying Maries
     87~~~~~~~~~~~~~~~~~~~~~~~~~~~
     88==== mary before
     893.14
     90-
     913.14
     92-
     930.5
     94-
     950.5
     96-
     97==== mary after
     983.14
     990.5
     100-
     1013.14
     102-
     1030.5
     104-
     1050.5
     1063.14
     107-
     108
     109~~~~~~~~~~~~~~~~ Headless List Tests - insert_before ~~~~~~~~~~~~~~~~
     110
     111~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     112Test 1-ii:  Modifying Freds on MINE
     113~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     114==== fred by MINE before
     1153.14
     116-
     1173.14
     118-
     1190.5
     120-
     1210.5
     122-
     123==== fred by YOURS before
     1243.14
     125-
     1263.14
     127-
     1280.5
     129-
     1300.5
     131-
     132==== fred by MINE after
     1333.14
     1340.5
     135-
     1363.14
     137-
     1380.5
     139-
     1400.5
     1413.14
     142-
     143==== fred by YOURS after
     1443.14
     145-
     1463.14
     147-
     1480.5
     149-
     1500.5
     151-
     152~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     153Test 2-ii.  Modifying Freds on YOURS
     154~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     155==== fred by MINE before
     1563.14
     157-
     1583.14
     159-
     1600.5
     161-
     1620.5
     163-
     164==== fred by YOURS before
     1653.14
     166-
     1673.14
     168-
     1690.5
     170-
     1710.5
     172-
     173==== fred by MINE after
     1743.14
     175-
     1763.14
     177-
     1780.5
     179-
     1800.5
     181-
     182==== fred by YOURS after
     1833.14
     1840.5
     185-
     1863.14
     187-
     1880.5
     189-
     1900.5
     1913.14
     192-
     193~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     194Test 3-ii.  Modifying Maries
     195~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     196==== mary before
     1973.14
     198-
     1993.14
     200-
     2010.5
     202-
     2030.5
     204-
     205==== mary after
     2063.14
     2070.5
     208-
     2093.14
     210-
     2110.5
     212-
     2130.5
     2143.14
     215-
    1216
    2217~~~~~~~~~~~~~~~~~ Headed List Tests - insert_first ~~~~~~~~~~~~~~~~~~
     
    342557-
    343558
     559~~~~~~~~~~ Element removal tests on Headless List: mid ~~~~~~~~~~
     560
     561~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     562Test 10-i.  Modifying Freds on MINE
     563~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     564==== fred by MINE before
     5651.7
     5662.7
     5673.7
     568-
     5691.7
     570-
     5713.7
     572-
     5733.7
     5742.7
     5751.7
     576-
     577==== fred by YOURS before
     5781.7
     5792.7
     5803.7
     581-
     5821.7
     583-
     5843.7
     585-
     5863.7
     5872.7
     5881.7
     589-
     590==== fred by MINE after
     5911.7
     5923.7
     593-
     5941.7
     595-
     5963.7
     597-
     5983.7
     5991.7
     600-
     601==== fred by YOURS after
     6021.7
     6032.7
     6043.7
     605-
     6061.7
     607-
     6083.7
     609-
     6103.7
     6112.7
     6121.7
     613-
     614==== fred by MINE after
     6152.7
     616-
     6172.7
     618-
     619-
     620-
     621~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     622Test 11-i.  Modifying Freds on YOURS
     623~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     624==== fred by MINE before
     6251.7
     6262.7
     6273.7
     628-
     6291.7
     630-
     6313.7
     632-
     6333.7
     6342.7
     6351.7
     636-
     637==== fred by YOURS before
     6381.7
     6392.7
     6403.7
     641-
     6421.7
     643-
     6443.7
     645-
     6463.7
     6472.7
     6481.7
     649-
     650==== fred by MINE after
     6511.7
     6522.7
     6533.7
     654-
     6551.7
     656-
     6573.7
     658-
     6593.7
     6602.7
     6611.7
     662-
     663==== fred by YOURS after
     6641.7
     6653.7
     666-
     6671.7
     668-
     6693.7
     670-
     6713.7
     6721.7
     673-
     674==== fred by YOURS after
     6752.7
     676-
     6772.7
     678-
     679-
     680-
     681~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     682Test 12-i.  Modifying Maries
     683~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     684==== mary before
     6851.7
     6862.7
     6873.7
     688-
     6891.7
     690-
     6913.7
     692-
     6933.7
     6942.7
     6951.7
     696-
     697==== mary after
     6981.7
     6993.7
     700-
     7011.7
     702-
     7033.7
     704-
     7053.7
     7061.7
     707-
     708==== mary after
     7092.7
     710-
     7112.7
     712-
     713-
     714-
     715
     716~~~~~~~~~~ Element removal tests on Headless List: at first ~~~~~~~~~~
     717
     718~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     719Test 10-ii.  Modifying Freds on MINE
     720~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     721==== fred by MINE before
     7221.7
     7232.7
     7243.7
     725-
     7261.7
     727-
     7283.7
     729-
     7303.7
     7312.7
     7321.7
     733-
     734==== fred by YOURS before
     7351.7
     7362.7
     7373.7
     738-
     7391.7
     740-
     7413.7
     742-
     7433.7
     7442.7
     7451.7
     746-
     747==== fred by MINE after
     7482.7
     7493.7
     750-
     7512.7
     752-
     7533.7
     754-
     7553.7
     7562.7
     757-
     758==== fred by YOURS after
     7591.7
     7602.7
     7613.7
     762-
     7631.7
     764-
     7653.7
     766-
     7673.7
     7682.7
     7691.7
     770-
     771==== fred by MINE after
     7721.7
     773-
     7741.7
     775-
     776-
     777-
     778~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     779Test 11-ii.  Modifying Freds on YOURS
     780~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     781==== fred by MINE before
     7821.7
     7832.7
     7843.7
     785-
     7861.7
     787-
     7883.7
     789-
     7903.7
     7912.7
     7921.7
     793-
     794==== fred by YOURS before
     7951.7
     7962.7
     7973.7
     798-
     7991.7
     800-
     8013.7
     802-
     8033.7
     8042.7
     8051.7
     806-
     807==== fred by MINE after
     8081.7
     8092.7
     8103.7
     811-
     8121.7
     813-
     8143.7
     815-
     8163.7
     8172.7
     8181.7
     819-
     820==== fred by YOURS after
     8212.7
     8223.7
     823-
     8242.7
     825-
     8263.7
     827-
     8283.7
     8292.7
     830-
     831==== fred by YOURS after
     8321.7
     833-
     8341.7
     835-
     836-
     837-
     838~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     839Test 12-ii.  Modifying Maries
     840~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     841==== mary before
     8421.7
     8432.7
     8443.7
     845-
     8461.7
     847-
     8483.7
     849-
     8503.7
     8512.7
     8521.7
     853-
     854==== mary after
     8552.7
     8563.7
     857-
     8582.7
     859-
     8603.7
     861-
     8623.7
     8632.7
     864-
     865==== mary after
     8661.7
     867-
     8681.7
     869-
     870-
     871-
     872
     873~~~~~~~~~~ Element removal tests on Headless List: at last ~~~~~~~~~~
     874
     875~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     876Test 10-iii.  Modifying Freds on MINE
     877~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     878==== fred by MINE before
     8791.7
     8802.7
     8813.7
     882-
     8831.7
     884-
     8853.7
     886-
     8873.7
     8882.7
     8891.7
     890-
     891==== fred by YOURS before
     8921.7
     8932.7
     8943.7
     895-
     8961.7
     897-
     8983.7
     899-
     9003.7
     9012.7
     9021.7
     903-
     904==== fred by MINE after
     9051.7
     9062.7
     907-
     9081.7
     909-
     9102.7
     911-
     9122.7
     9131.7
     914-
     915==== fred by YOURS after
     9161.7
     9172.7
     9183.7
     919-
     9201.7
     921-
     9223.7
     923-
     9243.7
     9252.7
     9261.7
     927-
     928==== fred by MINE after
     9293.7
     930-
     9313.7
     932-
     933-
     934-
     935~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     936Test 11-iii.  Modifying Freds on YOURS
     937~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     938==== fred by MINE before
     9391.7
     9402.7
     9413.7
     942-
     9431.7
     944-
     9453.7
     946-
     9473.7
     9482.7
     9491.7
     950-
     951==== fred by YOURS before
     9521.7
     9532.7
     9543.7
     955-
     9561.7
     957-
     9583.7
     959-
     9603.7
     9612.7
     9621.7
     963-
     964==== fred by MINE after
     9651.7
     9662.7
     9673.7
     968-
     9691.7
     970-
     9713.7
     972-
     9733.7
     9742.7
     9751.7
     976-
     977==== fred by YOURS after
     9781.7
     9792.7
     980-
     9811.7
     982-
     9832.7
     984-
     9852.7
     9861.7
     987-
     988==== fred by YOURS after
     9893.7
     990-
     9913.7
     992-
     993-
     994-
     995~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     996Test 12-iii.  Modifying Maries
     997~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     998==== mary before
     9991.7
     10002.7
     10013.7
     1002-
     10031.7
     1004-
     10053.7
     1006-
     10073.7
     10082.7
     10091.7
     1010-
     1011==== mary after
     10121.7
     10132.7
     1014-
     10151.7
     1016-
     10172.7
     1018-
     10192.7
     10201.7
     1021-
     1022==== mary after
     10233.7
     1024-
     10253.7
     1026-
     1027-
     1028-
     1029
    3441030~~~~~~~~~~ Element removal tests on Headed List: at first ~~~~~~~~~~
    3451031
     
    10921778-
    10931779-
    1094 
    1095 ~~~~~~~~~~~~~~~~~~~ Ease-of-access cases ~~~~~~~~~~~~~~~~~~
    1096 
    1097 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1098 Test 18-i.  Modifying Freds on MINE
    1099 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1100 Not implmented
    1101 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1102 Test 18-ii.  Modifying Freds on YOURS
    1103 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1104 Not implmented
    1105 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1106 Test 18-iii.  Modifying Maries
    1107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1108 accessor_cases done
    1109 try_pop cases done
    1110 origin_mutation cases done
  • tests/list/dlist-insert-remove.cfa

    re2f601f r8cd5434  
    1919struct fred {
    2020        float adatum;
    21         inline struct mine { inline dlink(fred); };
    22         inline struct yours { inline dlink(fred); };
     21        DLISTED_MGD_EXPL_IN(fred, mine)
     22        DLISTED_MGD_EXPL_IN(fred, yours)
    2323};
    24 P9_EMBEDDED(fred, fred.mine)
    25 P9_EMBEDDED(fred, fred.yours)
    26 P9_EMBEDDED(fred.mine, dlink(fred))
    27 P9_EMBEDDED(fred.yours, dlink(fred))
    28 
     24
     25DLISTED_MGD_EXPL_OUT(fred, mine)
     26DLISTED_MGD_EXPL_OUT(fred, yours)
    2927
    3028void ?{}(fred &this, float adatum) {
     
    3533struct mary {
    3634        float anotherdatum;
    37         inline dlink(mary);
     35        DLISTED_MGD_IMPL_IN(mary)
    3836};
    3937
    40 P9_EMBEDDED(mary, dlink(mary))
     38DLISTED_MGD_IMPL_OUT(mary)
    4139
    4240void ?{}(mary &this, float anotherdatum) {
     
    5553////////////////////////////////////////////////////////////
    5654
    57 void printMyFredsFwd(fred & f) {
    58     with( DLINK_VIA( fred, fred.mine ) )
    59         do {
     55void printMyFredsFwd(fred &f) {
     56        while (&f != 0p) {
    6057                sout | f.adatum;
    61         } while (f`moveNext);
    62 }
    63 
    64 void printMyFredsRev(fred & f) {
    65     with( DLINK_VIA( fred, fred.mine ) )
    66         do {
     58                &f = &f`in_mine`next;
     59        }
     60}
     61
     62void printMyFredsRev(fred &f) {
     63        while (&f != 0p) {
    6764                sout | f.adatum;
    68         } while (f`movePrev);
    69 }
    70 
     65                &f = &f`in_mine`prev;
     66        }
     67}
    7168
    7269void printMyFreddies(fred &f1, fred &f2, int isBefore) {
     
    7673                sout | "==== fred by MINE after ";
    7774        }
    78         if (&f1) {
    79                 printMyFredsFwd(f1);    sout | '-';
    80                 printMyFredsRev(f1);    sout | '-';
    81         } else {
    82                 sout | '-'; sout | '-';
     75        printMyFredsFwd(f1);    sout | '-';
     76        printMyFredsRev(f1);    sout | '-';
     77        printMyFredsFwd(f2);    sout | '-';
     78        printMyFredsRev(f2);    sout | '-';
     79}
     80
     81void printYourFredsFwd(fred &f) {
     82        while (&f != 0p) {
     83                sout | f.adatum;
     84                &f = &f`in_yours`next;
    8385        }
    84         if (&f2) {
    85                 printMyFredsFwd(f2);    sout | '-';
    86                 printMyFredsRev(f2);    sout | '-';
    87         } else {
    88                 sout | '-'; sout | '-';
     86}
     87
     88void printYourFredsRev(fred &f) {
     89        while (&f != 0p) {
     90                sout | f.adatum;
     91                &f = &f`in_yours`prev;
    8992        }
    90 }
    91 
    92 void printYourFredsFwd(fred & f) {
    93     with( DLINK_VIA( fred, fred.yours ) )
    94         do {
    95                 sout | f.adatum;
    96         } while (f`moveNext);
    97 }
    98 
    99 void printYourFredsRev(fred & f) {
    100     with( DLINK_VIA( fred, fred.yours ) )
    101         do {
    102                 sout | f.adatum;
    103         } while (f`movePrev);
    10493}
    10594
     
    11099                sout | "==== fred by YOURS after ";
    111100        }
    112         if (&f1) {
    113                 printYourFredsFwd(f1);  sout | '-';
    114                 printYourFredsRev(f1);  sout | '-';
    115         } else {
    116                 sout | '-'; sout | '-';
     101        printYourFredsFwd(f1);  sout | '-';
     102        printYourFredsRev(f1);  sout | '-';
     103        printYourFredsFwd(f2);  sout | '-';
     104        printYourFredsRev(f2);  sout | '-';
     105}
     106
     107void printMariesFwd(mary &m) {
     108        while (&m != 0p) {
     109                sout | m.anotherdatum;
     110                &m = &m`next;
    117111        }
    118         if (&f2) {
    119                 printYourFredsFwd(f2);  sout | '-';
    120                 printYourFredsRev(f2);  sout | '-';
    121         } else {
    122                 sout | '-'; sout | '-';
     112}
     113
     114void printMariesRev(mary &m) {
     115        while (&m != 0p) {
     116                sout | m.anotherdatum;
     117                &m = &m`prev;
    123118        }
    124 }
    125 
    126 void printMariesFwd(mary &m) {
    127         do {
    128                 sout | m.anotherdatum;
    129         } while (m`moveNext);
    130 }
    131 
    132 void printMariesRev(mary &m) {
    133         do {
    134                 sout | m.anotherdatum;
    135         } while (m`movePrev);
    136119}
    137120
     
    142125                sout | "==== mary after ";
    143126        }
    144         if (&m1) {
    145                 printMariesFwd(m1);     sout | '-';
    146                 printMariesRev(m1);     sout | '-';
    147         } else {
    148                 sout | '-'; sout | '-';
    149         }
    150         if (&m2) {
    151                 printMariesFwd(m2);     sout | '-';
    152                 printMariesRev(m2);     sout | '-';
    153         } else {
    154                 sout | '-'; sout | '-';
    155         }
     127        printMariesFwd(m1);     sout | '-';
     128        printMariesRev(m1);     sout | '-';
     129        printMariesFwd(m2);     sout | '-';
     130        printMariesRev(m2);     sout | '-';
    156131}
    157132
     
    178153//  - from list position #2 moving backward (d)
    179154// The expected-output comments are in form a;b;c;d where a::=num,num,num
    180 #if 0
     155
    181156void test__insertafter_singleton_on_singleton__fred_mine () {
    182157        fred f1 = {3.14};
     
    186161        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
    187162
    188         diref(fred, fred.mine) f1_mine = f1`from;
    189         insert_after(f1_mine, f2);
     163        insert_after(f1`in_mine, f2);
    190164
    191165        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    200174        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
    201175
    202         diref(fred, fred.yours) f1_yours = f1`from;
    203         insert_after(f1_yours, f2);
     176        insert_after(f1`in_yours, f2);
    204177
    205178        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    235208        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
    236209
    237         diref(fred, fred.mine) f2_mine = f2`from;
    238         insert_before(f2_mine, f1);
     210        insert_before(f2`in_mine, f1);
    239211
    240212        printMyFreddies(f1, f2, 0);     // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
     
    249221        printYourFreddies(f1, f2, 1);   // 3.14; 3.14; 0.5; 0.5
    250222
    251         diref(fred, fred.yours) f2_yours = f2`from;
    252         insert_before(f2_yours, f1);
     223        insert_before(f2`in_yours, f1);
    253224
    254225        printMyFreddies(f1, f2, 0);     // 3.14; 3.14; 0.5; 0.5 (unmodified)
     
    266237        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    267238}
    268 #endif
     239
    269240////////////////////////////////////////////////////////////
    270241//
     
    279250// All three tests exercise the case of creating an empty container and
    280251// adding two items to it.
     252
    281253void test__insertfirst_two_on_empty__fred_mine() {
    282254
     
    284256        fred f2 = {0.5};
    285257
    286         dlist(fred, fred.mine) lf;
     258        dlist(fred_in_mine, fred) lf;
    287259
    288260        verify(validate(lf));
     
    305277        fred f2 = {0.5};
    306278
    307         dlist(fred, fred.yours) lf;
     279        dlist(fred_in_yours, fred) lf;
    308280
    309281        verify(validate(lf));
     
    320292        printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    321293}
     294
    322295void test__insertfirst_two_on_empty__mary() {
    323296
     
    325298        mary m2 = {0.5};
    326299
    327         dlist(mary) lm;
     300        dlist(mary, mary) lm;
    328301
    329302        verify(validate(lm));
     
    352325        fred f2 = {0.5};
    353326
    354         dlist(fred, fred.mine) lf;
     327        dlist(fred_in_mine, fred) lf;
    355328
    356329        verify(validate(lf));
     
    373346        fred f2 = {0.5};
    374347
    375         dlist(fred, fred.yours) lf;
     348        dlist(fred_in_yours, fred) lf;
    376349
    377350        verify(validate(lf));
     
    394367        mary m2 = {0.5};
    395368
    396         dlist(mary) lm;
     369        dlist(mary, mary) lm;
    397370
    398371        verify(validate(lm));
     
    421394        fred f2 = {0.5};
    422395
    423         dlist(fred, fred.mine) lf;
    424 
    425         assert( & lf`first == 0p );
    426         assert( & lf`last == 0p );
     396        dlist(fred_in_mine, fred) lf;
     397
     398        assert(& lf`first == 0p);
     399        assert(& lf`last == 0p);
    427400
    428401        insert_first(lf, f1);
    429402
    430         assert( & lf`first == & f1 );
    431         assert( & lf`last  == & f1 );
     403        assert(& lf`first == & f1);
     404        assert(& lf`last == & f1);
    432405
    433406        verify(validate(lf));
    434407
    435         with ( DLINK_VIA(fred, fred.mine) ) insert_after(f1, f2);
     408        insert_after(f1`in_mine, f2);
    436409
    437410        verify(validate(lf));
     
    440413        printYourFreddies(f1, f2, 0);   // 3.14; 3.14; 0.5; 0.5 (unmodified)
    441414
    442         assert( & lf`first == & f1 );
    443         assert( & lf`last  == & f2 );
     415        assert(& lf`first == & f1);
     416        assert(& lf`last == & f2);
    444417}
    445418
     
    449422        fred f2 = {0.5};
    450423
    451         dlist(fred, fred.yours) lf;
    452 
    453         assert( & lf`first == 0p );
    454         assert( & lf`last == 0p );
     424        dlist(fred_in_yours, fred) lf;
     425
     426        assert(& lf`first == 0p);
     427        assert(& lf`last == 0p);
    455428
    456429        insert_first(lf, f1);
    457430
    458         assert( & lf`first == & f1 );
    459         assert( & lf`last  == & f1 );
     431        assert(& lf`first == & f1);
     432        assert(& lf`last == & f1);
    460433
    461434        verify(validate(lf));
    462435
    463     with ( DLINK_VIA(fred, fred.yours) ) insert_after(f1, f2);
     436        insert_after(f1`in_yours, f2);
    464437
    465438        verify(validate(lf));
     
    468441        printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    469442
    470         assert( & lf`first == & f1 );
    471         assert( & lf`last  == & f2 );
     443        assert(& lf`first == & f1);
     444        assert(& lf`last == & f2);
    472445}
    473446
     
    477450        mary m2 = {0.5};
    478451
    479         dlist(mary) lm;
    480 
    481         assert( & lm`first == 0p );
    482         assert( & lm`last == 0p );
     452        dlist(mary, mary) lm;
     453
     454        assert(& lm`first == 0p);
     455        assert(& lm`last == 0p);
    483456
    484457        insert_first(lm, m1);
    485458
    486         assert( & lm`first == & m1 );
    487         assert( & lm`last  == & m1 );
     459        assert(& lm`first == & m1);
     460        assert(& lm`last == & m1);
    488461
    489462        verify(validate(lm));
     
    495468        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    496469
    497         assert( & lm`first == & m1 );
    498         assert( & lm`last  == & m2 );
     470        assert(& lm`first == & m1);
     471        assert(& lm`last == & m2);
    499472}
    500473
     
    514487        fred f2 = {0.5};
    515488
    516         dlist(fred, fred.mine) lf;
    517 
    518         assert( & lf`first == 0p );
    519         assert( & lf`last == 0p );
     489        dlist(fred_in_mine, fred) lf;
     490
     491        assert(& lf`first == 0p);
     492        assert(& lf`last == 0p);
    520493
    521494        insert_last(lf, f2);
    522495
    523         assert( & lf`first == & f2 );
    524         assert( & lf`last  == & f2 );
     496        assert(& lf`first == & f2);
     497        assert(& lf`last == & f2);
    525498
    526499        verify(validate(lf));
    527500
    528         with ( DLINK_VIA(fred, fred.mine) ) insert_before(f2, f1);
     501        insert_before(f2`in_mine, f1);
    529502
    530503        verify(validate(lf));
     
    533506        printYourFreddies(f1, f2, 0);   // 3.14; 3.14; 0.5; 0.5 (unmodified)
    534507
    535         assert( & lf`first == & f1 );
    536         assert( & lf`last  == & f2 );
     508        assert(& lf`first == & f1);
     509        assert(& lf`last == & f2);
    537510}
    538511
     
    542515        fred f2 = {0.5};
    543516
    544         dlist(fred, fred.yours) lf;
    545 
    546         assert( & lf`first == 0p );
    547         assert( & lf`last == 0p );
     517        dlist(fred_in_yours, fred) lf;
     518
     519        assert(& lf`first == 0p);
     520        assert(& lf`last == 0p);
    548521
    549522        insert_last(lf, f2);
    550523
    551         assert( & lf`first == & f2 );
    552         assert( & lf`last  == & f2 );
     524        assert(& lf`first == & f2);
     525        assert(& lf`last == & f2);
    553526
    554527        verify(validate(lf));
    555528
    556         with ( DLINK_VIA(fred, fred.yours) )insert_before(f2, f1);
     529        insert_before(f2`in_yours, f1);
    557530
    558531        verify(validate(lf));
     
    561534        printYourFreddies(f1, f2, 0);   // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    562535
    563         assert( & lf`first == & f1 );
    564         assert( & lf`last  == & f2 );
     536        assert(& lf`first == & f1);
     537        assert(& lf`last == & f2);
    565538}
    566539
     
    570543        mary m2 = {0.5};
    571544
    572         dlist(mary) lm;
    573 
    574         assert( & lm`first == 0p );
    575         assert( & lm`last == 0p );
     545        dlist(mary, mary) lm;
     546
     547        assert(& lm`first == 0p);
     548        assert(& lm`last == 0p);
    576549
    577550        insert_last(lm, m2);
    578551
    579         assert( & lm`first == & m2 );
    580         assert( & lm`last  == & m2 );
     552        assert(& lm`first == & m2);
     553        assert(& lm`last == & m2);
    581554
    582555        verify(validate(lm));
     
    588561        printMariatheotokos(m1, m2, 0); // 3.14, 0.5; 3.14; 0.5; 0.5, 3.14 (modified)
    589562
    590         assert( & lm`first == & m1 );
    591         assert( & lm`last  == & m2 );
    592 }
    593 #if 0
     563        assert(& lm`first == & m1);
     564        assert(& lm`last == & m2);
     565}
    594566
    595567////////////////////////////////////////////////////////////
     
    874846//
    875847////////////////////////////////////////////////////////////
    876 #endif
     848
    877849void test__remove_at_head__fred_mine() {
    878850
     
    881853        fred f3 = {3.7};
    882854
    883         dlist(fred, fred.mine) flm;
     855        dlist(fred_in_mine, fred) flm;
    884856        insert_last(flm, f1);
    885857        insert_last(flm, f2);
    886858        insert_last(flm, f3);
    887859
    888         dlist(fred, fred.yours) fly;
     860        dlist(fred_in_yours, fred) fly;
    889861        insert_last(fly, f1);
    890862        insert_last(fly, f2);
     
    897869        verify(validate(flm));
    898870
    899         with( DLINK_VIA(fred, fred.mine) ) remove(f1);
     871        remove(f1`in_mine);
    900872
    901873        verify(validate(fly));
     
    909881
    910882        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    911         // assert(f1.$links_mine.next.is_terminator == false);
    912         // assert(f1.$links_mine.prev.is_terminator == false);
    913 }
    914 
     883        assert(f1.$links_mine.next.is_terminator == false);
     884        assert(f1.$links_mine.prev.is_terminator == false);
     885}
    915886
    916887void test__remove_at_head__fred_yours() {
     
    920891        fred f3 = {3.7};
    921892
    922         dlist(fred, fred.mine) flm;
     893        dlist(fred_in_mine, fred) flm;
    923894        insert_last(flm, f1);
    924895        insert_last(flm, f2);
    925896        insert_last(flm, f3);
    926897
    927         dlist(fred, fred.yours) fly;
     898        dlist(fred_in_yours, fred) fly;
    928899        insert_last(fly, f1);
    929900        insert_last(fly, f2);
     
    936907        verify(validate(flm));
    937908
    938         with( DLINK_VIA(fred, fred.yours) ) remove(f1);
     909        remove(f1`in_yours);
    939910
    940911        verify(validate(fly));
     
    948919
    949920        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    950         // assert(f1.$links_yours.next.is_terminator == false);
    951         // assert(f1.$links_yours.prev.is_terminator == false);
     921        assert(f1.$links_yours.next.is_terminator == false);
     922        assert(f1.$links_yours.prev.is_terminator == false);
    952923}
    953924
     
    958929        mary m3 = {3.7};
    959930
    960         dlist(mary) ml;
     931        dlist(mary, mary) ml;
    961932        insert_last(ml, m1);
    962933        insert_last(ml, m2);
     
    977948
    978949        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    979         // assert(m1.$links.next.is_terminator == false);
    980         // assert(m1.$links.prev.is_terminator == false);
     950        assert(m1.$links.next.is_terminator == false);
     951        assert(m1.$links.prev.is_terminator == false);
    981952}
    982953
     
    997968        fred f3 = {3.7};
    998969
    999         dlist(fred, fred.mine) flm;
     970        dlist(fred_in_mine, fred) flm;
    1000971        insert_last(flm, f1);
    1001972        insert_last(flm, f2);
    1002973        insert_last(flm, f3);
    1003974
    1004         dlist(fred, fred.yours) fly;
     975        dlist(fred_in_yours, fred) fly;
    1005976        insert_last(fly, f1);
    1006977        insert_last(fly, f2);
     
    1013984        verify(validate(flm));
    1014985
    1015         with( DLINK_VIA(fred, fred.mine) ) remove(f3);
     986        remove(f3`in_mine);
    1016987
    1017988        verify(validate(fly));
     
    1025996
    1026997        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    1027         // assert(f3.$links_mine.next.is_terminator == false);
    1028         // assert(f3.$links_mine.prev.is_terminator == false);
     998        assert(f3.$links_mine.next.is_terminator == false);
     999        assert(f3.$links_mine.prev.is_terminator == false);
    10291000}
    10301001
     
    10351006        fred f3 = {3.7};
    10361007
    1037         dlist(fred, fred.mine) flm;
     1008        dlist(fred_in_mine, fred) flm;
    10381009        insert_last(flm, f1);
    10391010        insert_last(flm, f2);
    10401011        insert_last(flm, f3);
    10411012
    1042         dlist(fred, fred.yours) fly;
     1013        dlist(fred_in_yours, fred) fly;
    10431014        insert_last(fly, f1);
    10441015        insert_last(fly, f2);
     
    10511022        verify(validate(flm));
    10521023
    1053         with( DLINK_VIA(fred, fred.yours) ) remove(f3);
     1024        remove(f3`in_yours);
    10541025
    10551026        verify(validate(fly));
     
    10631034
    10641035        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    1065         // assert(f3.$links_yours.next.is_terminator == false);
    1066         // assert(f3.$links_yours.prev.is_terminator == false);
     1036        assert(f3.$links_yours.next.is_terminator == false);
     1037        assert(f3.$links_yours.prev.is_terminator == false);
    10671038}
    10681039
     
    10731044        mary m3 = {3.7};
    10741045
    1075         dlist(mary) ml;
     1046        dlist(mary, mary) ml;
    10761047        insert_last(ml, m1);
    10771048        insert_last(ml, m2);
     
    10921063
    10931064        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    1094         // assert(m3.$links.next.is_terminator == false);
    1095         // assert(m3.$links.prev.is_terminator == false);
     1065        assert(m3.$links.next.is_terminator == false);
     1066        assert(m3.$links.prev.is_terminator == false);
    10961067}
    10971068
     
    11101081        fred f = {0.7};
    11111082
    1112         dlist(fred, fred.mine) flm;
     1083        dlist(fred_in_mine, fred) flm;
    11131084        insert_last(flm, f);
    11141085
    1115         dlist(fred, fred.yours) fly;
     1086        dlist(fred_in_yours, fred) fly;
    11161087        insert_last(fly, f);
    11171088
     
    11221093        verify(validate(flm));
    11231094
    1124         with( DLINK_VIA(fred, fred.mine) ) remove(f);
    1125 
    1126         verify(validate(fly));
    1127         verify(validate(flm));
    1128 
    1129         assert( & flm`first == 0p );
    1130         assert( & flm`last == 0p );
     1095        remove(f`in_mine);
     1096
     1097        verify(validate(fly));
     1098        verify(validate(flm));
     1099
     1100        assert(& flm`first == 0p);
     1101        assert(& flm`last  == 0p);
    11311102
    11321103        printYourFreddies(fly`first, fly`last, 0);   // 0.7; 0.7; 0.7; 0.7 (unmodified)
     
    11361107
    11371108        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    1138         // assert(f.$links_mine.next.is_terminator == false);
    1139         // assert(f.$links_mine.prev.is_terminator == false);
     1109        assert(f.$links_mine.next.is_terminator == false);
     1110        assert(f.$links_mine.prev.is_terminator == false);
    11401111
    11411112        insert_last(flm, f);
     
    11491120        fred f = {0.7};
    11501121
    1151         dlist(fred, fred.mine) flm;
     1122        dlist(fred_in_mine, fred) flm;
    11521123        insert_last(flm, f);
    11531124
    1154         dlist(fred, fred.yours) fly;
     1125        dlist(fred_in_yours, fred) fly;
    11551126        insert_last(fly, f);
    11561127
     
    11611132        verify(validate(flm));
    11621133
    1163         with( DLINK_VIA(fred, fred.yours) ) remove(f);
    1164 
    1165         verify(validate(fly));
    1166         verify(validate(flm));
    1167 
    1168         assert( & fly`first == 0p );
    1169         assert( & fly`last == 0p );
     1134        remove(f`in_yours);
     1135
     1136        verify(validate(fly));
     1137        verify(validate(flm));
     1138
     1139        assert(& fly`first == 0p);
     1140        assert(& fly`last  == 0p);
    11701141
    11711142        printYourFreddies(flm`first, flm`last, 0);   // 0.7; 0.7; 0.7; 0.7 (unmodified)
     
    11751146
    11761147        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    1177         // assert(f.$links_yours.next.is_terminator == false);
    1178         // assert(f.$links_yours.prev.is_terminator == false);
     1148        assert(f.$links_yours.next.is_terminator == false);
     1149        assert(f.$links_yours.prev.is_terminator == false);
    11791150
    11801151        insert_last(fly, f);
     
    11881159        mary m = {0.7};
    11891160
    1190         dlist(mary) ml;
     1161        dlist(mary, mary) ml;
    11911162        insert_last(ml, m);
    11921163
     
    11991170        verify(validate(ml));
    12001171
    1201         assert( & ml`first == 0p );
    1202         assert( & ml`last == 0p );
     1172        assert(& ml`first == 0p);
     1173        assert(& ml`last  == 0p);
    12031174
    12041175        // observe f is solo in mine (now unlisted); in yours, it was just traversed
     
    12061177
    12071178        // TODO: decide on appropriate ovservable outcome (is_listed?) and its itended semantics
    1208         // assert(m.$links.next.is_terminator == false);
    1209         // assert(m.$links.prev.is_terminator == false);
     1179        assert(m.$links.next.is_terminator == false);
     1180        assert(m.$links.prev.is_terminator == false);
    12101181
    12111182        insert_last(ml, m);
     
    12321203        fred f3 = {3.7};
    12331204
    1234         dlist(fred, fred.mine) flm;
     1205        dlist(fred_in_mine, fred) flm;
    12351206        insert_last(flm, f1);
    12361207        insert_last(flm, f2);
    12371208        insert_last(flm, f3);
    12381209
    1239         dlist(fred, fred.yours) fly;
     1210        dlist(fred_in_yours, fred) fly;
    12401211        insert_last(fly, f1);
    12411212        insert_last(fly, f2);
     
    12481219        verify(validate(flm));
    12491220
    1250         fred & popped = try_pop_front(flm);
     1221        fred & popped = pop_first(flm);
    12511222
    12521223        verify(validate(fly));
     
    12681239        fred f3 = {3.7};
    12691240
    1270         dlist(fred, fred.mine) flm;
     1241        dlist(fred_in_mine, fred) flm;
    12711242        insert_last(flm, f1);
    12721243        insert_last(flm, f2);
    12731244        insert_last(flm, f3);
    12741245
    1275         dlist(fred, fred.yours) fly;
     1246        dlist(fred_in_yours, fred) fly;
    12761247        insert_last(fly, f1);
    12771248        insert_last(fly, f2);
     
    12841255        verify(validate(flm));
    12851256
    1286         fred & popped = try_pop_front(fly);
     1257        fred & popped = pop_first(fly);
    12871258
    12881259        verify(validate(fly));
     
    13041275        mary m3 = {3.7};
    13051276
    1306         dlist(mary) ml;
     1277        dlist(mary, mary) ml;
    13071278        insert_last(ml, m1);
    13081279        insert_last(ml, m2);
     
    13131284        verify(validate(ml));
    13141285
    1315         mary & popped = try_pop_front(ml);
     1286        mary & popped = pop_first(ml);
    13161287
    13171288        verify(validate(ml));
     
    13311302        fred f3 = {3.7};
    13321303
    1333         dlist(fred, fred.mine) flm;
     1304        dlist(fred_in_mine, fred) flm;
    13341305        insert_last(flm, f1);
    13351306        insert_last(flm, f2);
    13361307        insert_last(flm, f3);
    13371308
    1338         dlist(fred, fred.yours) fly;
     1309        dlist(fred_in_yours, fred) fly;
    13391310        insert_last(fly, f1);
    13401311        insert_last(fly, f2);
     
    13471318        verify(validate(flm));
    13481319
    1349         fred & popped = try_pop_back(flm);
     1320        fred & popped = pop_last(flm);
    13501321
    13511322        verify(validate(fly));
     
    13671338        fred f3 = {3.7};
    13681339
    1369         dlist(fred, fred.mine) flm;
     1340        dlist(fred_in_mine, fred) flm;
    13701341        insert_last(flm, f1);
    13711342        insert_last(flm, f2);
    13721343        insert_last(flm, f3);
    13731344
    1374         dlist(fred, fred.yours) fly;
     1345        dlist(fred_in_yours, fred) fly;
    13751346        insert_last(fly, f1);
    13761347        insert_last(fly, f2);
     
    13831354        verify(validate(flm));
    13841355
    1385         fred & popped = try_pop_back(fly);
     1356        fred & popped = pop_last(fly);
    13861357
    13871358        verify(validate(fly));
     
    14031374        mary m3 = {3.7};
    14041375
    1405         dlist(mary) ml;
     1376        dlist(mary, mary) ml;
    14061377        insert_last(ml, m1);
    14071378        insert_last(ml, m2);
     
    14121383        verify(validate(ml));
    14131384
    1414         mary & popped = try_pop_back(ml);
     1385        mary & popped = pop_last(ml);
    14151386
    14161387        verify(validate(ml));
     
    14261397////////////////////////////////////////////////////////////
    14271398//
    1428 // Section 4g
    1429 //
    1430 // Test cases of `isEmpty, `hasPrev, `hasNext,
    1431 // try_pop_front, try_pop_back, modifications via `elems
    1432 //
    1433 // Example of call-side user code
    1434 //
    1435 ////////////////////////////////////////////////////////////
    1436 
    1437 void test__accessor_cases__mary() {
    1438 
    1439         mary m1 = {1.7};
    1440         mary m2 = {2.7};
    1441         mary m3 = {3.7};
    1442 
    1443         dlist(mary) ml;                 assert( ml`isEmpty);
    1444 
    1445         insert_last(ml, m1);    assert(!ml`isEmpty);
    1446         insert_last(ml, m2);    assert(!ml`isEmpty);
    1447         insert_last(ml, m3);    assert(!ml`isEmpty);
    1448 
    1449         mary & m1prev = m1`prev;
    1450         mary & m1next = m1`next;
    1451         mary & m2prev = m2`prev;
    1452         mary & m2next = m2`next;
    1453         mary & m3prev = m3`prev;
    1454         mary & m3next = m3`next;
    1455 
    1456         assert (&m1prev == 0p);
    1457         assert (&m1next == &m2);
    1458         assert (&m2prev == &m1);
    1459         assert (&m2next == &m3);
    1460         assert (&m3prev == &m2);
    1461         assert (&m3next == 0p);
    1462 
    1463         assert(!m1`hasPrev);
    1464         assert( m1`hasNext);
    1465         assert( m2`hasPrev);
    1466         assert( m2`hasNext);
    1467         assert( m3`hasPrev);
    1468         assert(!m3`hasNext);
    1469 
    1470         printf("accessor_cases done\n");
    1471 }
    1472 
    1473 void test__try_pop__mary() {
    1474 
    1475         mary m1 = {1.7};
    1476         mary m2 = {2.7};
    1477         mary m3 = {3.7};
    1478 
    1479         dlist(mary) ml;
    1480 
    1481         mary &m1r = *0p;
    1482         mary &m2r = *0p;
    1483         mary &m3r = *0p;
    1484         mary &mxr = *0p;
    1485 
    1486         // queue, back to front
    1487 
    1488         assert( ml`isEmpty);
    1489 
    1490         insert_last(ml, m1);
    1491         insert_last(ml, m2);
    1492         insert_last(ml, m3);
    1493 
    1494         &m1r = & try_pop_front(ml);     assert(!ml`isEmpty);
    1495         &m2r = & try_pop_front(ml);     assert(!ml`isEmpty);
    1496         &m3r = & try_pop_front(ml);     assert( ml`isEmpty);
    1497         &mxr = & try_pop_front(ml);     assert( ml`isEmpty);
    1498 
    1499         assert( &m1r == &m1 );
    1500         assert( &m2r == &m2 );
    1501         assert( &m3r == &m3 );
    1502         assert( &mxr == 0p  );
    1503 
    1504         &m1r = 0p;
    1505         &m2r = 0p;
    1506         &m3r = 0p;
    1507 
    1508         // queue, front to back
    1509 
    1510         assert( ml`isEmpty);
    1511 
    1512         insert_first(ml, m1);
    1513         insert_first(ml, m2);
    1514         insert_first(ml, m3);
    1515 
    1516         &m1r = & try_pop_back(ml);      assert(!ml`isEmpty);
    1517         &m2r = & try_pop_back(ml);      assert(!ml`isEmpty);
    1518         &m3r = & try_pop_back(ml);      assert( ml`isEmpty);
    1519         &mxr = & try_pop_back(ml);      assert( ml`isEmpty);
    1520 
    1521         assert( &m1r == &m1 );
    1522         assert( &m2r == &m2 );
    1523         assert( &m3r == &m3 );
    1524         assert( &mxr == 0p  );
    1525 
    1526         &m1r = 0p;
    1527         &m2r = 0p;
    1528         &m3r = 0p;
    1529 
    1530         // stack at front
    1531 
    1532         assert( ml`isEmpty);
    1533 
    1534         insert_first(ml, m1);
    1535         insert_first(ml, m2);
    1536         insert_first(ml, m3);
    1537 
    1538         &m3r = & try_pop_front(ml);     assert(!ml`isEmpty);
    1539         &m2r = & try_pop_front(ml);     assert(!ml`isEmpty);
    1540         &m1r = & try_pop_front(ml);     assert( ml`isEmpty);
    1541         &mxr = & try_pop_front(ml);     assert( ml`isEmpty);
    1542 
    1543         assert( &m1r == &m1 );
    1544         assert( &m2r == &m2 );
    1545         assert( &m3r == &m3 );
    1546         assert( &mxr == 0p  );
    1547 
    1548         &m1r = 0p;
    1549         &m2r = 0p;
    1550         &m3r = 0p;
    1551 
    1552         // stack at back
    1553 
    1554         assert( ml`isEmpty);
    1555 
    1556         insert_last(ml, m1);
    1557         insert_last(ml, m2);
    1558         insert_last(ml, m3);
    1559 
    1560         &m3r = & try_pop_back(ml);      assert(!ml`isEmpty);
    1561         &m2r = & try_pop_back(ml);      assert(!ml`isEmpty);
    1562         &m1r = & try_pop_back(ml);      assert( ml`isEmpty);
    1563         &mxr = & try_pop_back(ml);      assert( ml`isEmpty);
    1564 
    1565         assert( &m1r == &m1 );
    1566         assert( &m2r == &m2 );
    1567         assert( &m3r == &m3 );
    1568         assert( &mxr == 0p  );
    1569 
    1570         &m1r = 0p;
    1571         &m2r = 0p;
    1572         &m3r = 0p;
    1573 
    1574         printf("try_pop cases done\n");
    1575 }
    1576 
    1577 void test__origin_mutation__mary() {
    1578 
    1579         mary m1 = {1.7};
    1580 
    1581         dlist(mary) ml;
    1582         mary & mlorigin = ml`elems;
    1583 
    1584         // insert before the origin
    1585 
    1586         insert_before( ml`elems, m1 );
    1587         assert( ! ml`isEmpty );
    1588 
    1589         mary & mlfirst = ml`first;
    1590         mary & mllast = ml`last;
    1591 
    1592         assert( &m1 == & mlfirst );
    1593         assert( &m1 == & mllast );
    1594 
    1595         // moveNext after last goes back to origin, &vv
    1596 
    1597         bool canMoveNext = mllast`moveNext;
    1598         bool canMovePrev = mlfirst`movePrev;
    1599 
    1600         assert( ! canMoveNext );
    1601         assert( ! canMovePrev );
    1602 
    1603         assert( &mlorigin == & mlfirst );
    1604         assert( &mlorigin == & mllast );
    1605 
    1606         printf("origin_mutation cases done\n");
    1607 }
    1608 
    1609 ////////////////////////////////////////////////////////////
    1610 //
    16111399// Section 5
    16121400//
     
    16161404
    16171405int main() {
    1618 #if 0
     1406
    16191407        sout | "~~~~~~~~~~~~~~~~~ Headless List Tests - insert_after ~~~~~~~~~~~~~~~~";
    16201408        sout | "";
     
    16531441        sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    16541442        test__insertbefore_singleton_on_singleton__mary();
    1655 #endif
     1443
    16561444        sout | "";
    16571445        sout | "~~~~~~~~~~~~~~~~~ Headed List Tests - insert_first ~~~~~~~~~~~~~~~~~~";
     
    17291517        sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    17301518        test__insertbefore_before_first__mary();
    1731 #if 0
    17321519
    17331520        sout | "";
     
    17871574        sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    17881575        test__remove_at_last__mary();
    1789 #endif
     1576
    17901577        sout | "";
    17911578        sout | "~~~~~~~~~~ Element removal tests on Headed List: at first ~~~~~~~~~~";
     
    18831670        test__pop_last__maries();
    18841671
    1885         sout | "";
    1886         sout | "~~~~~~~~~~~~~~~~~~~ Ease-of-access cases ~~~~~~~~~~~~~~~~~~";
    1887         sout | "";
    1888 
    1889         sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    1890         sout | "Test 18-i.  Modifying Freds on MINE";
    1891         sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    1892         sout | "Not implmented";
    1893 
    1894         sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    1895         sout | "Test 18-ii.  Modifying Freds on YOURS";
    1896         sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    1897         sout | "Not implmented";
    1898 
    1899         sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    1900         sout | "Test 18-iii.  Modifying Maries";
    1901         sout | "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
    1902 
    1903         test__accessor_cases__mary();
    1904         test__try_pop__mary();
    1905         test__origin_mutation__mary();
    1906 
    19071672        return 0;
    19081673}
  • tests/zombies/linked-list-perf/experiment.koad

    re2f601f r8cd5434  
    4949#elif defined IMPL_CFA_MIKE_OLD
    5050
    51         #include "mike-old.hfa"
     51        #include <containers/list.hfa>
    5252        struct S {
    5353                int f[64]; // FIXME: make "is volatile" consistent; given bug #TBD
     
    6767#elif defined IMPL_CFA_MIKE_NEW
    6868
    69         #include <containers/list.hfa>
     69        #include <containers/list2.hfa>
    7070        struct S {
    7171                int f[64]; // FIXME: make "is volatile" consistent; given bug #TBD
Note: See TracChangeset for help on using the changeset viewer.