Ignore:
File:
1 edited

Legend:

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

    r705e612 r14a61b5  
    191191//-----------------------------------------------------------------------------
    192192#ifdef __cforall
    193         forall(dtype TYPE | sized(TYPE))
     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))
    194201        #define T TYPE
    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
     202#else
     203        #define T void
    200204#endif
    201205struct __dllist {
    202206        T * head;
    203         __getter_t __get;
    204 };
    205 #undef T
    206 #undef __getter_t
     207};
     208#undef T
    207209
    208210#ifdef __cforall
     
    214216#ifdef __cforall
    215217
    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
     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        // }
    263260#endif
    264261
Note: See TracChangeset for help on using the changeset viewer.