Compile time initialization of AA
Ali Çehreli
acehreli at yahoo.com
Fri Mar 23 23:15:24 UTC 2018
On 03/23/2018 03:43 PM, Xavier Bigand wrote:
> I am trying to initialize an global immutable associative array of
> structs, but it doesn't compile.
Current solution is to initialize the AA in a 'static this()' block or
('shared static this()').
> I am getting the following error message : "Error: not an associative
> array initializer".
>
> As I really need to store my data for a compile time purpose if we can't
> do that with AA, I'll use arrays instead.
You can create and use AAs at compile time, which may be an acceptable
use for your case as well:
struct EntryPoint
{
string moduleName;
string functionName;
bool beforeForwarding = false;
}
EntryPoint[string] makeEntryPoints() {
EntryPoint[string] entryPoints = [
"wglDescribePixelFormat":
EntryPoint("opengl32.forward_initialization", "wglDescribePixelFormat")
];
return entryPoints;
}
string useEntryPoints(EntryPoint[string] aa) {
return aa["wglDescribePixelFormat"].moduleName;
}
void main() {
enum s = useEntryPoints(makeEntryPoints());
static const s2 = s;
}
The computations of 's' and 's2' in main are performed at compile time.
If you can getaway with that, great. :) Otherwise, you have to
initialize at runtime in a 'shared static this()' block, which can still
be 'immutable':
// NOTE the addition of 'pure':
EntryPoint[string] makeEntryPoints() pure {
// Same as above...
}
immutable EntryPoint[string] entryPoints;
shared static this() {
// Yes, can initialize immutable:
entryPoints = makeEntryPoints();
}
Ali
More information about the Digitalmars-d-learn
mailing list