Ignore:
Timestamp:
Apr 30, 2021, 9:23:12 AM (3 months ago)
Author:
Michael Brooks <mlbrooks@…>
Branches:
arm-eh, jacob/cs343-translation, master
Children:
a049412, ad89296, ec1c674
Parents:
63a4b92
Message:

Activated syntax, forall( [N] ).

This implementation desugars in the parser, as forall( ztype(N) ) did in
the preprocessor. Semantic analysis is still required to lock down treating N as a
a traditional type (forbid: N x = 17; vector(N) v;). Deferring that work until
the N--value adapters ( Z(17), z(N) ) are settled.

File:
1 edited

Legend:

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

    r63a4b92 rb9dae14c  
    55
    66// the inverse of Z(-)
    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)
     7#define z(N) sizeof(N)
    118
    129forall( T & ) struct tag {};
     
    1916//
    2017
    21 forall( ztype(Zn), ztype(S), Timmed &, Tbase & ) {
     18forall( [N], [S], Timmed &, Tbase & ) {
    2219    struct arpk {
    23         S strides[z(Zn)];
     20        S strides[z(N)];
    2421    };
    2522
    26     Timmed & ?[?]( arpk(Zn, S, Timmed, Tbase) & a, ptrdiff_t i ) {
     23    Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, ptrdiff_t i ) {
    2724        return (Timmed &) a.strides[i];
    2825    }
    2926
    30     Timmed & ?[?]( arpk(Zn, S, Timmed, Tbase) & a, int i ) {
     27    Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, int i ) {
    3128        return (Timmed &) a.strides[i];
    3229    }
    3330
    34     Timmed & ?[?]( arpk(Zn, S, Timmed, Tbase) & a, size_t i ) {
     31    Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, size_t i ) {
    3532        return (Timmed &) a.strides[i];
    3633    }
    3734
    38     size_t ?`len( arpk(Zn, S, Timmed, Tbase) & a ) {
    39         return z(Zn);
     35    size_t ?`len( arpk(N, S, Timmed, Tbase) & a ) {
     36        return z(N);
    4037    }
    4138
    4239    // workaround #226 (and array relevance thereof demonstrated in mike102/otype-slow-ndims.cfa)
    43     void ?{}( arpk(Zn, S, Timmed, Tbase) & this ) {
    44         void ?{}( S (&inner)[z(Zn)] ) {}
     40    void ?{}( arpk(N, S, Timmed, Tbase) & this ) {
     41        void ?{}( S (&inner)[z(N)] ) {}
    4542        ?{}(this.strides);
    4643    }
    47     void ^?{}( arpk(Zn, S, Timmed, Tbase) & this ) {
    48         void ^?{}( S (&inner)[z(Zn)] ) {}
     44    void ^?{}( arpk(N, S, Timmed, Tbase) & this ) {
     45        void ^?{}( S (&inner)[z(N)] ) {}
    4946        ^?{}(this.strides);
    5047    }
     
    5855Te mkar_( tag(Te) ) {}
    5956
    60 forall( ztype(Zn), ZTags ... , Trslt &, Tatom & | { Trslt mkar_( tag(Tatom), ZTags ); } )
    61 arpk(Zn, Trslt, Trslt, Tatom) mkar_( tag(Tatom), tag(Zn), ZTags ) {}
     57forall( [N], ZTags ... , Trslt &, Tatom & | { Trslt mkar_( tag(Tatom), ZTags ); } )
     58arpk(N, Trslt, Trslt, Tatom) mkar_( tag(Tatom), tag(N), ZTags ) {}
    6259
    6360// based on https://stackoverflow.com/questions/1872220/is-it-possible-to-iterate-over-arguments-in-variadic-macros
     
    123120
    124121// Base
    125 forall( ztype(Zq), ztype(Sq), Tbase & )
    126 tag(arpk(Zq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(Tbase) ) {}
     122forall( [Nq], [Sq], Tbase & )
     123tag(arpk(Nq, Sq, Tbase, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(Tbase) ) {}
    127124
    128125// Rec
    129 forall( ztype(Zq), ztype(Sq), ztype(Z), ztype(S), recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(recq) ); } )
    130 tag(arpk(Z, S, recr, Tbase)) enq_( tag(Tbase), tag(Zq), tag(Sq), tag(arpk(Z, S, recq, Tbase)) ) {}
     126forall( [Nq], [Sq], [N], [S], recq &, recr &, Tbase & | { tag(recr) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(recq) ); } )
     127tag(arpk(N, S, recr, Tbase)) enq_( tag(Tbase), tag(Nq), tag(Sq), tag(arpk(N, S, recq, Tbase)) ) {}
    131128
    132129// Wrapper
    133130struct all_t {} all;
    134 forall( ztype(Z), ztype(S), Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(Z), tag(S), tag(Te) ); } )
    135 result & ?[?]( arpk(Z, S, Te, Tbase) & this, all_t ) {
     131forall( [N], [S], Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(N), tag(S), tag(Te) ); } )
     132result & ?[?]( arpk(N, S, Te, Tbase) & this, all_t ) {
    136133    return (result&) this;
    137134}
Note: See TracChangeset for help on using the changeset viewer.