Read Once then reset/init value?

Simen Kjærås simen.kjaras at gmail.com
Wed Oct 30 12:59:48 UTC 2019


On Wednesday, 30 October 2019 at 11:53:42 UTC, Jacob Carlborg 
wrote:
> On 2019-10-30 00:28, Simen Kjærås wrote:
>
>> Something like this?
>> 
>> T readOnce(T)(ref T value) {
>>      auto tmp = value;
>>      value = T.init;
>>      return tmp;
>> } unittest {
>>      int i = 3;
>>      assert(i.readOnce == 3);
>>      assert(i == 0);
>> }
>
> Perhaps better to encapsulate it in a struct to avoid someone 
> accessing the value directly.

Quite possibly, but the post was somewhat low on details, and 
encapsulating it like that does put certain limits on how it can 
be used, so it's not necessarily the best idea.

FWIW, here's one possible way to do it with a struct:

struct Readonce(T, T defaultValue = T.init) {
     private T value;

     alias get this;

     T get() {
         auto tmp = value;
         value = defaultValue;
         return tmp;
     }

     void get(T newValue) {
         value = newValue;
     }

     this(T newValue) {
         value = newValue;
     }
}

unittest {
     Readonce!(int, -1) a = 3;
     assert(a == 3);
     assert(a == -1);

     a = 3;
     assert(a == 3);
     assert(a == -1);
}

--
   Simen


More information about the Digitalmars-d-learn mailing list