Changeset 1665ee5


Ignore:
Timestamp:
Sep 11, 2024, 4:49:07 PM (2 months ago)
Author:
Michael Brooks <mlbrooks@…>
Branches:
master
Children:
05f8761
Parents:
6325bd4
Message:

Add uArray delayed-initialization equivalent to CFA array

Files:
6 edited

Legend:

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

    r6325bd4 r1665ee5  
    156156//      other two.  This solution offers ?{}() that needs only ?{}(), and similar for ^?{}.
    157157
     158// skip initializing elements
     159//   array(float, 5) x = { delay_init };
     160struct delay_init_t {} delay_init;
     161forall( [N], S & | sized(S), Timmed &, Tbase & )
     162static inline void ?{}( arpk( N, S, Timmed, Tbase ) & this, delay_init_t ) {
     163        void ?{}( S (&)[N] ) {}
     164        ?{}(this.strides);
     165}
     166
     167// call default ctor on elements
     168//   array(float, 5) x;
    158169forall( [N], S & | sized(S), Timmed &, Tbase & | { void ?{}( Timmed & ); } )
    159170static inline void ?{}( arpk( N, S, Timmed, Tbase ) & this ) { 
    160         void ?{}( S (&)[N] ) {}
    161         ?{}(this.strides);
    162 
     171        ?{}( this, delay_init );
    163172        for (i; N) ?{}( (Timmed &)this.strides[i] );
    164173}
     
    173182        }
    174183}
     184
    175185
    176186//
  • tests/array-collections/.expect/array-raii-c.txt

    r6325bd4 r1665ee5  
    7070dtor 1
    7171dtor 0
    72 === uninit
     72=== uninit ( uNoCtor[] )
    7373 [1]
    7474before ctors
  • tests/array-collections/.expect/array-raii-cfa.txt

    r6325bd4 r1665ee5  
    7070dtor 1
    7171dtor 0
    72 === uninit
     72=== uninit ( uNoCtor[] )
    7373 [1]
    7474before ctors
     
    108108dtor 101
    109109dtor 100
     110=== uninit alt ( uArray )
     111 [1]
     112before ctors
     113ctor 0
     114ctor 999
     115ctor 888
     116ctor 3
     117ctor 4
     118func 0
     119func 999
     120func 888
     121func 3
     122func 4
     123dtor 4
     124dtor 3
     125dtor 888
     126dtor 999
     127dtor 0
     128 [2]
     129before ctors
     130ctor 100
     131ctor 101
     132ctor 102
     133ctor 110
     134ctor 999
     135ctor 888
     136func 100 at (0, 0)
     137func 101 at (0, 1)
     138func 102 at (0, 2)
     139func 110 at (1, 0)
     140func 999 at (1, 1)
     141func 888 at (1, 2)
     142dtor 888
     143dtor 999
     144dtor 110
     145dtor 102
     146dtor 101
     147dtor 100
     148=== uC++ cheat sheet
     149ctor 0
     150ctor 1
     151ctor 2
     152ctor 3
     153ctor 4
     1540
     1551
     1562
     1573
     1584
     159dtor 4
     160dtor 3
     161dtor 2
     162dtor 1
     163dtor 0
  • tests/array-collections/array-raii-c.cfa

    r6325bd4 r1665ee5  
    2020
    2121#include "array-raii.hfa"
     22
     23void test_extras() {}
  • tests/array-collections/array-raii-cfa.cfa

    r6325bd4 r1665ee5  
    1616// CFA array means like `array(float, 17) x;`
    1717
     18
     19#include <fstream.hfa>
    1820#include <collections/array.hfa>
    1921
     
    2224
    2325#include "array-raii.hfa"
     26
     27void test_uninit_alt() {
     28    printf(" [1]\n");
     29    {
     30        array(thing, 5) a = { delay_init };
     31        printf("before ctors\n");
     32        for(i; 5) {
     33            if (i == 1)
     34                (a[i]){};  // no need for `emplace` bc no-arg ctor call means elem's real ctor
     35            else if (i == 2)
     36                (a[i]){888};
     37            else
     38                (a[i]){i};
     39        }
     40        for(i; 5) printf("func %d\n", a[i].mem);
     41    }
     42    printf(" [2]\n");
     43    {
     44        array(thing, 2, 3) a = { delay_init };
     45        printf("before ctors\n");
     46        for(i; 2) for(j; 3) {
     47            if (i == 1 && j == 1)
     48                (a[i][j]){};
     49            else if (i == 1 && j == 2)
     50                (a[i][j]){888};
     51            else
     52                (a[i][j]){100 + 10 * i + j};
     53        }
     54        for(i; 2) for(j; 3) {
     55            printf("func %d at (%d, %d)\n", a[i][j].mem, i, j);
     56        }
     57    }
     58}
     59
     60void test_uCxxCheatSheet() {
     61    struct S {
     62        int i;
     63    };
     64    void ?{}( S & s, int i ) { s.i = i; sout | "ctor" | s.i; }
     65    void ^?{}( S & s ) { sout | "dtor" | s.i; }
     66//  int main() {
     67        enum { N = 5 };
     68        array(S, N) s = { delay_init };   // no constructor calls
     69        for ( i; N ) s[i]{ i };
     70        for ( i; N ) sout | s[i].i;
     71//  }
     72}
     73
     74void test_extras() {
     75
     76    printf("=== uninit alt ( uArray )\n");
     77    test_uninit_alt();
     78
     79    printf("=== uC++ cheat sheet\n");
     80    test_uCxxCheatSheet();
     81}
  • tests/array-collections/array-raii.hfa

    r6325bd4 r1665ee5  
    118118}
    119119
     120struct thing { int mem; };
     121void ?{}( thing & this, int i ) {
     122    (this.mem){ i };
     123    printf("ctor %d\n", this.mem);
     124}
     125void ?{}( thing & this ) {
     126    (this){ 999 };
     127}
     128void ^?{}( thing & this ) {
     129    printf("dtor %d\n", this.mem);
     130}
     131
    120132// Array of uninits sees explicit ctor calls (only), and implied dtor calls
    121133void test_uninit() {
    122     struct thing { int mem; };
    123     void ?{}( thing & this, int i ) {
    124         (this.mem){ i };
    125         printf("ctor %d\n", this.mem);
    126     }
    127     void ?{}( thing & this ) {
    128         (this){ 999 };
    129     }
    130     void ^?{}( thing & this ) {
    131         printf("dtor %d\n", this.mem);
    132     }
    133134    printf(" [1]\n");
    134135    {
     
    163164}
    164165
     166void test_extras();
     167
    165168int main() {
    166169    printf("=== builtins\n");
     
    170173    test_custom();
    171174
    172     printf("=== uninit\n");
     175    printf("=== uninit ( uNoCtor[] )\n");
    173176    test_uninit();
     177
     178    test_extras();
    174179}
Note: See TracChangeset for help on using the changeset viewer.