Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/containers/array.hfa

    r63f42a8 rc7625e0  
    55
    66// the inverse of Z(-)
    7 #define z(N) sizeof(N)
     7#define z(Zn) sizeof(Zn)
     8
     9// if you're expecting a Z(n), say so, by asking for a ztype, instead of dtype or otype
     10#define ztype(Zn) Zn & | sized(Zn)
    811
    912forall( T & ) struct tag {};
     
    1619//
    1720
    18 forall( [N], S & | sized(S), Timmed &, Tbase & ) {
     21forall( ztype(Zn), ztype(S), Timmed &, Tbase & ) {
    1922    struct arpk {
    20         S strides[z(N)];
     23        S strides[z(Zn)];
    2124    };
    2225
    23     // About the choice of integral types offered as subscript overloads:
    24     // Intent is to cover these use cases:
    25     //    float foo( ptrdiff_t i ) { return a[i]; }           // i : ptrdiff_t
    26     //    forall( [N] ) ... for( i; N ) { total += a[i]; }    // i : typeof( sizeof(42) )
    27     //    for( i; 5 ) { total += a[i]; }                      // i : int
    28     // It gets complicated by:
    29     // -  CFA does overloading on concrete types, like int and unsigned int, not on typedefed
    30     //    types like size_t.  So trying to overload on ptrdiff_t vs int works in 64-bit mode
    31     //    but not in 32-bit mode.
    32     // -  Given bug of Trac #247, CFA gives sizeof expressions type unsigned long int, when it
    33     //    should give them type size_t.
    34     //   
    35     //                          gcc -m32         cfa -m32 given bug         gcc -m64
    36     // ptrdiff_t                int              int                        long int
    37     // size_t                   unsigned int     unsigned int               unsigned long int
    38     // typeof( sizeof(42) )     unsigned int     unsigned long int          unsigned long int
    39     // int                      int              int                        int
    40 
    41     static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, int i ) {
     26    Timmed & ?[?]( arpk(Zn, S, Timmed, Tbase) & a, ptrdiff_t i ) {
    4227        return (Timmed &) a.strides[i];
    4328    }
    4429
    45     static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, unsigned int i ) {
    46         return (Timmed &) a.strides[i];
    47     }
    48 
    49     static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, long int i ) {
    50         return (Timmed &) a.strides[i];
    51     }
    52 
    53     static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, unsigned long int i ) {
    54         return (Timmed &) a.strides[i];
    55     }
    56 
    57     static inline size_t ?`len( arpk(N, S, Timmed, Tbase) & a ) {
    58         return z(N);
     30    size_t ?`len( arpk(Zn, S, Timmed, Tbase) & a ) {
     31        return z(Zn);
    5932    }
    6033
    6134    // workaround #226 (and array relevance thereof demonstrated in mike102/otype-slow-ndims.cfa)
    62     static inline void ?{}( arpk(N, S, Timmed, Tbase) & this ) {
    63         void ?{}( S (&inner)[z(N)] ) {}
     35    void ?{}( arpk(Zn, S, Timmed, Tbase) & this ) {
     36        void ?{}( S (&inner)[z(Zn)] ) {}
    6437        ?{}(this.strides);
    6538    }
    66     static inline void ^?{}( arpk(N, S, Timmed, Tbase) & this ) {
    67         void ^?{}( S (&inner)[z(N)] ) {}
     39    void ^?{}( arpk(Zn, S, Timmed, Tbase) & this ) {
     40        void ^?{}( S (&inner)[z(Zn)] ) {}
    6841        ^?{}(this.strides);
    6942    }
     
    7548
    7649forall( Te )
    77 static inline Te mkar_( tag(Te) ) {}
     50Te mkar_( tag(Te) ) {}
    7851
    79 forall( [N], ZTags ... , Trslt &, Tatom & | { Trslt mkar_( tag(Tatom), ZTags ); } )
    80 static inline arpk(N, Trslt, Trslt, Tatom) mkar_( tag(Tatom), tag(N), ZTags ) {}
     52forall( ztype(Zn), ZTags ... , Trslt &, Tatom & | { Trslt mkar_( tag(Tatom), ZTags ); } )
     53arpk(Zn, Trslt, Trslt, Tatom) mkar_( tag(Tatom), tag(Zn), ZTags ) {}
    8154
    8255// based on https://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros
     
    10780// Core -[[-,-,-]] operator
    10881
    109 #ifdef TRY_BROKEN_DESIRED_MD_SUBSCRIPT
     82// Desired form.  One definition with recursion on IxBC (worked until Jan 2021, see trac #__TODO__)
     83// forall( TA &, TB &, TC &, IxAB, IxBC ... | { TB & ?[?]( TA &, IxAB ); TC & ?[?]( TB &, IxBC ); } )
     84// TC & ?[?]( TA & this, IxAB ab, IxBC bc ) {
     85//     return this[ab][bc];
     86// }
    11087
    111 // Desired form.  One definition with recursion on IxBC (worked until Jan 2021, see trac #__TODO__)
    112 
    113 forall( TA &, TB &, TC &, IxAB, IxBC ... | { TB & ?[?]( TA &, IxAB ); TC & ?[?]( TB &, IxBC ); } )
    114 static inline TC & ?[?]( TA & this, IxAB ab, IxBC bc ) {
     88// Workaround form.  Listing all possibilities up to 4 dims.
     89forall( TA &, TB &, IxAB | { TB & ?[?]( TA &, IxAB ); }
     90            , TC &, IxBC | { TC & ?[?]( TB &, IxBC ); } )
     91TC & ?[?]( TA & this, IxAB ab, IxBC bc ) {
    11592    return this[ab][bc];
    11693}
    117 
    118 #else
    119 
    120 // Workaround form.  Listing all possibilities up to 4 dims.
    121 
    122 forall( TA &, TB &, TC &, IxAB_0, IxBC | { TB & ?[?]( TA &, IxAB_0 ); TC & ?[?]( TB &, IxBC ); } )
    123 static inline TC & ?[?]( TA & this, IxAB_0 ab, IxBC bc ) {
    124     return this[ab][bc];
     94forall( TA &, TB &, IxAB | { TB & ?[?]( TA &, IxAB ); }
     95            , TC &, IxBC | { TC & ?[?]( TB &, IxBC ); }
     96            , TD &, IxCD | { TD & ?[?]( TC &, IxCD ); } )
     97TD & ?[?]( TA & this, IxAB ab, IxBC bc, IxCD cd ) {
     98    return this[ab][bc][cd];
     99}
     100forall( TA &, TB &, IxAB | { TB & ?[?]( TA &, IxAB ); }
     101            , TC &, IxBC | { TC & ?[?]( TB &, IxBC ); }
     102            , TD &, IxCD | { TD & ?[?]( TC &, IxCD ); }
     103            , TE &, IxDE | { TE & ?[?]( TD &, IxDE ); } )
     104TE & ?[?]( TA & this, IxAB ab, IxBC bc, IxCD cd, IxDE de ) {
     105    return this[ab][bc][cd][de];
    125106}
    126107
    127 forall( TA &, TB &, TC &, IxAB_0, IxAB_1, IxBC | { TB & ?[?]( TA &, IxAB_0, IxAB_1 ); TC & ?[?]( TB &, IxBC ); } )
    128 static inline TC & ?[?]( TA & this, IxAB_0 ab0, IxAB_1 ab1, IxBC bc ) {
    129     return this[[ab0,ab1]][bc];
     108// Adapters for "indexed by ptrdiff_t" implies "indexed by [this other integral type]"
     109// Work around restriction that assertions underlying -[[-,-,-]] must match excatly
     110forall( C &, E & | { E & ?[?]( C &, ptrdiff_t ); } ) {
     111
     112    // Targeted to support:  for( i; z(N) ) ... a[[ ..., i, ... ]]
     113    E & ?[?]( C & this, size_t i ) {
     114        return this[ (ptrdiff_t) i ];
     115    }
     116
     117    // Targeted to support:  for( i; 5 ) ... a[[ ..., i, ... ]]
     118    E & ?[?]( C & this, int i ) {
     119        return this[ (ptrdiff_t) i ];
     120    }
    130121}
    131 
    132 forall( TA &, TB &, TC &, IxAB_0, IxAB_1, IxAB_2, IxBC | { TB & ?[?]( TA &, IxAB_0, IxAB_1, IxAB_2 ); TC & ?[?]( TB &, IxBC ); } )
    133 static inline TC & ?[?]( TA & this, IxAB_0 ab0, IxAB_1 ab1, IxAB_2 ab2, IxBC bc ) {
    134     return this[[ab0,ab1,ab2]][bc];
    135 }
    136 
    137 #endif
    138122
    139123//
     
    142126
    143127// Base
    144 forall( [Nq], Sq & | sized(Sq), Tbase & )
    145 static inline tag(arpk(Nq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(Tbase) ) {}
     128forall( ztype(Zq), ztype(Sq), Tbase & )
     129tag(arpk(Zq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(Tbase) ) {}
    146130
    147131// Rec
    148 forall( [Nq], Sq & | sized(Sq), [N], S & | sized(S), recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(recq) ); } )
    149 static inline tag(arpk(N, S, recr, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(arpk(N, S, recq, Tbase)) ) {}
     132forall( ztype(Zq), ztype(Sq), ztype(Z), ztype(S), recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(recq) ); } )
     133tag(arpk(Z, S, recr, Tbase)) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(arpk(Z, S, recq, Tbase)) ) {}
    150134
    151135// Wrapper
    152136struct all_t {} all;
    153 forall( [N], S & | sized(S), Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(N), tag(S), tag(Te) ); } )
    154 static inline result & ?[?]( arpk(N, S, Te, Tbase) & this, all_t ) {
     137forall( ztype(Z), ztype(S), Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(Z), tag(S), tag(Te) ); } )
     138result & ?[?]( arpk(Z, S, Te, Tbase) & this, all_t ) {
    155139    return (result&) this;
    156140}
Note: See TracChangeset for help on using the changeset viewer.