Input/Output multiple values from function
Jabari Zakiya
jzakiya at gmail.com
Sun Sep 1 20:42:28 UTC 2019
On Thursday, 29 August 2019 at 10:58:47 UTC, Simen Kjærås wrote:
> On Thursday, 29 August 2019 at 10:39:44 UTC, Jabari Zakiya
> wrote:
>> [...]
>
> 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);
> }
>
>
>> [...]
>
> 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
It still won't compile, with this error.
Error: AliasSeq!(modpg, res_0, restwins, resinvrs) is not an
lvalue and cannot be modified
Here's a gist of the code.
Top functions in code with issues are genPgParameters and selectPG
https://gist.github.com/jzakiya/9227e4810e1bd5b4b31e949d1cbd5c5d
More information about the Digitalmars-d-learn
mailing list