using memset withing a pure function

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Aug 14 18:32:21 PDT 2015


On 08/14/2015 06:09 PM, D_Learner wrote:

 > When writting a pure fucntion involving C non pure functions

If you want to live dangerously, you can use assumePure, which is found 
in one of the unittest blocks of std.traits:

import std.traits;

auto assumePure(T)(T t)
if (isFunctionPointer!T || isDelegate!T)
{
     enum attrs = functionAttributes!T | FunctionAttribute.pure_;
     return cast(SetFunctionAttributes!(T, functionLinkage!T, attrs)) t;
}

int i = 0;

void foo()
{
     ++i;    // foo accesses mutable module-level data
}

void bar() pure
{
     auto pureFoo = assumePure(&foo);
     pureFoo();    // <-- pure function is calling impure function
}

void main()
{
     assert(i == 0);
     bar();
     assert(i == 1);    // mutation through a pure function
}

Ali



More information about the Digitalmars-d-learn mailing list