write once type?

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Apr 20 20:15:02 UTC 2021


On Tue, Apr 20, 2021 at 03:56:33PM -0400, Steven Schveighoffer via Digitalmars-d-learn wrote:
[...]
> I'm wondering if anyone has a "Write once" type, that is, a type that
> allows you to write it exactly once, and is treated like
> initialization on first setting (i.e. allows writing to previously
> unused const data).

Maybe a const class?  The reference is null until you initialize it by
allocating a new object and initializing it in the ctor.

But sounds like you want a value type instead. Technically, allocating a
const class involves the GC assigning some region of memory to the
class, initializing it, then casting it to const. So I'd imagine that
the by-value equivalent would require a const cast somewhere, probably
in a @trusted block if you want it to work with @safe.

Which means that probably you'll need a @trusted cast somewhere in your
implementation.  So perhaps something like this:

	struct WriteOnce(T) {
		const T payload;
		const bool isSet;

		void opAssign(U : T)(U data)
		in (!isSet)
		{
			assert(!isSet);
			@trusted() {
				*(cast()&payload) = data;
				*(cast()&isSet) = true;
			}();
		}
	}


T

-- 
Prosperity breeds contempt, and poverty breeds consent. -- Suck.com


More information about the Digitalmars-d-learn mailing list