Changeset 2b22e050 for src/libcfa/bits


Ignore:
Timestamp:
May 14, 2018, 8:45:23 AM (8 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
Children:
a0cfa44
Parents:
1dbc8590 (diff), 52df81c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg2:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/bits/containers.h

    r1dbc8590 r2b22e050  
    191191//-----------------------------------------------------------------------------
    192192#ifdef __cforall
    193         trait is_db_node(dtype T) {
    194                 T*& get_next( T& );
    195                 T*& get_prev( T& );
    196         };
    197 #endif
    198 
    199 #ifdef __cforall
    200         forall(dtype TYPE | is_db_node(TYPE))
     193        forall(dtype TYPE | sized(TYPE))
    201194        #define T TYPE
    202 #else
    203         #define T void
     195        #define __getter_t * [T * & next, T * & prev] ( T & )
     196#else
     197        typedef void (*__generit_c_getter_t)();
     198        #define T void
     199        #define __getter_t __generit_c_getter_t
    204200#endif
    205201struct __dllist {
    206202        T * head;
    207 };
    208 #undef T
     203        __getter_t __get;
     204};
     205#undef T
     206#undef __getter_t
    209207
    210208#ifdef __cforall
     
    216214#ifdef __cforall
    217215
    218         forall(dtype T | is_db_node(T))
    219         static inline void ?{}( __dllist(T) & this ) with( this ) {
    220                 head{ NULL };
    221         }
    222 
    223         // forall(dtype T | is_db_node(T) | sized(T))
    224         // static inline void push_front( __dllist(T) & this, T & node ) with( this ) {
    225         //      if ( head ) {
    226         //              get_next( node ) = head;
    227         //              get_prev( node ) = get_prev( *head );
    228         //              // inserted node must be consistent before it is seen
    229         //              // prevent code movement across barrier
    230         //              asm( "" : : : "memory" );
    231         //              get_prev( *head ) = node;
    232         //              T & prev = *get_prev( node );
    233         //              get_next( prev ) = node;
    234         //      }
    235         //      else {
    236         //              get_next( node ) = &node;
    237         //              get_prev( node ) = &node;
    238         //      }
    239 
    240         //      // prevent code movement across barrier
    241         //      asm( "" : : : "memory" );
    242         //      head = val;
    243         // }
    244 
    245         // forall(dtype T | is_db_node(T) | sized(T))
    246         // static inline T * remove( __dllist(T) & this, T & node ) with( this ) {
    247         //      if ( &node == head ) {
    248         //              if ( get_next( *head ) == head ) {
    249         //                      head = NULL;
    250         //              }
    251         //              else {
    252         //                      head = get_next( *head );
    253         //              }
    254         //      }
    255         //      get_prev( *get_next( node ) ) = get_prev( node );
    256         //      get_next( *get_prev( node ) ) = get_next( node );
    257         //      get_next( node ) = NULL;
    258         //      get_prev( node ) = NULL;
    259         // }
     216        forall(dtype T | sized(T))
     217        static inline [void] ?{}( __dllist(T) & this, * [T * & next, T * & prev] ( T & ) __get ) {
     218                this.head{ NULL };
     219                this.__get = __get;
     220        }
     221
     222        #define _next .0
     223        #define _prev .1
     224        forall(dtype T | sized(T))
     225        static inline void push_front( __dllist(T) & this, T & node ) with( this ) {
     226                if ( head ) {
     227                        __get( node )_next = head;
     228                        __get( node )_prev = __get( *head )_prev;
     229                        // inserted node must be consistent before it is seen
     230                        // prevent code movement across barrier
     231                        asm( "" : : : "memory" );
     232                        __get( *head )_prev = &node;
     233                        T & prev = *__get( node )_prev;
     234                        __get( prev )_next = &node;
     235                }
     236                else {
     237                        __get( node )_next = &node;
     238                        __get( node )_prev = &node;
     239                }
     240
     241                // prevent code movement across barrier
     242                asm( "" : : : "memory" );
     243                head = &node;
     244        }
     245
     246        forall(dtype T | sized(T))
     247        static inline void remove( __dllist(T) & this, T & node ) with( this ) {
     248                if ( &node == head ) {
     249                        if ( __get( *head )_next == head ) {
     250                                head = NULL;
     251                        }
     252                        else {
     253                                head = __get( *head )_next;
     254                        }
     255                }
     256                __get( *__get( node )_next )_prev = __get( node )_prev;
     257                __get( *__get( node )_prev )_next = __get( node )_next;
     258                __get( node )_next = NULL;
     259                __get( node )_prev = NULL;
     260        }
     261        #undef _next
     262        #undef _prev
    260263#endif
    261264
Note: See TracChangeset for help on using the changeset viewer.