www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 15134] New: std.parallelism taskPool.amap fails to compile

https://issues.dlang.org/show_bug.cgi?id=15134

          Issue ID: 15134
           Summary: std.parallelism taskPool.amap fails to compile with
                    array of structs or Tuples with named members
           Product: D
           Version: D2
          Hardware: x86
                OS: Windows
            Status: NEW
          Severity: blocker
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: jayn prismnet.com

This code result in the compile error. Commenting out the taskPool.amap line
builds ok. Similar error for Tuples with named members substituted for the
struct definitions of TR, TI, TO.  Some analysis was done by Ali Cehreli in
this thread, which also has the Tuple implementation:
http://forum.dlang.org/post/mujsqv$tlk$1 digitalmars.com


import std.algorithm, std.parallelism, std.range;
import std.typecons;
import std.meta;
import std.stdio;

// define some input measurement sample tuples and output metric tuples
struct TR { long raw;}
struct TI {long L1I_MISS; long L1D_MISS; }
struct TO { TR L1_MISS; }

// various metric definitions
// using Tuples with defined names for each member, and use the names here in
the metrics.
TR met_l1_miss ( ref TI m){ TR rv;  rv.raw = m.L1I_MISS+m.L1D_MISS; return rv;
}

// a convenience to use all the metrics above as a list
alias Metrics = AliasSeq!(met_l1_miss);

void main(string[] argv)
{
    auto samples = iota(100);
    auto meas = new TI[samples.length];
    auto results = new TO[samples.length];

    // Initialize some values for the measured samples
    foreach(i, ref m; meas){
        m.L1D_MISS= 100+i; m.L1I_MISS=100-i;
    }

    ref TI getTerm(int i)
    {
        return meas[i];
    }

    // compute the metric results for the above measured sample values in
parallel
    taskPool.amap!(Metrics)(std.algorithm.map!getTerm(samples),results);

    TR rv1 = met_l1_miss( meas[1]);

    writeln("measurements:", meas[1]);
    writeln("rv1:", rv1);
    writeln("results:", results[1]);

}

Severity    Code    Description    Project    File    Line
Error        Error: static assert  "Wrong buffer type."       
C:\D\dmd2\src\phobos\std\parallelism.d    1668
Error        instantiated from here: amap!(MapResult!(getTerm, Result), TO[])  
     d:\visd\dmapbug\dmapbug\main.d    35

--
Oct 01 2015