Input/Output multiple values from function
Simen Kjærås
simen.kjaras at gmail.com
Thu Aug 29 10:58:47 UTC 2019
On Thursday, 29 August 2019 at 10:39:44 UTC, Jabari Zakiya wrote:
> The values modpg, res_0, restwins, and resinvrs are constant
> (immutable) values that are generated at run time. They are
> global/shared and used inside threads.
>
> So this process is initializing them at the start of the
> program, based on the input values to it.
Great - then you can use shared(immutable(uint)[]). You should be
able to convert from immutable(uint[]) to that without issue.
There's a utility function in std.exception called assumeUnique
that can be used for conversion to immutable that may be more
informative than cast(immutable):
shared(uint) modpg;
shared(uint) res_0;
shared(immutable(uint)[]) restwins;
shared(immutable(uint)[]) resinvrs;
auto genPGparameters(int i) {
import std.typecons;
import std.exception;
// Showing both cast and assumeUnique:
return tuple(1u, 2u, cast(immutable)[3u], [4u].assumeUnique);
}
unittest {
import std.meta : AliasSeq;
int pg;
// No need for temporaries:
AliasSeq!(modpg, res_0, restwins, resinvrs) =
genPGparameters(pg);
}
> The compiler only has a problem, it seems, with the arrays and
> not the single values.
Correct - since there are no indirections in a uint, you can
assign directly to a shared(uint) - nobody else will have a
non-shared pointer to that uint, so it's somewhat safe. If you do
the same with uint[], you'll still have a pointer to the same
values, and changing a value that says it's thread-local (no
shared) will change values that is shared with the rest of the
program. There are some issues with the current shared design,
but this is what it's intended to do.
--
Simen
More information about the Digitalmars-d-learn
mailing list