CTFE Status

Stefan Koch via Digitalmars-d digitalmars-d at puremagic.com
Sat Feb 4 08:40:27 PST 2017


On Saturday, 4 February 2017 at 16:30:30 UTC, Stefan Koch wrote:
> I can present you a nice snippet that just compiled with newCTFE

int[] makeAndInitArray(int until)
{
   int[] result;
   result.length = until;

   foreach(i; 0 .. until)
   {
     result[i] = i;
   }

   return result;
}


int[] filter(alias filterFn)(int[] arr)
{
   int[] result;
   result.length = arr.length;

   uint resultLength;
   foreach(i;0 .. arr.length)
   {
     auto e = arr[i];
     if (filterFn(e))
     {
       result[resultLength++] = e;
     }
   }

   result.length = resultLength;
   // I cannot remember implementing it but shrinking seems to work
   return result;
}
enum arr_500_000 = makeAndInitArray(500_000);

static assert(arr_500_000.filter!(e => !(e % 3)));
static assert([1,2,3,4,5,6,7,8,9,10,11,12,13].filter!(e => !(e % 
3)) == [3,6,9,12]);


newCTFE takes a quarter of the time, and only half of the memory.
It would go even faster if we did not create the enum arr_500_000 
but instead do that in a function-local variable.

because then the array does not allocate 500_000 expression nodes.




More information about the Digitalmars-d mailing list