So as part of my effort to get D running on GPUs I need to make a "second class" pointer type that I can alter in the backend of LDC to the correct address space. to that end I have made the following

module dcompute.types.pointer;

enum Private = 0;
enum Global = 1;
enum Shared = 2;
enum Constant = 3;
enum Generic = 4;

pure @trusted nothrow @nogc
struct Pointer(uint p, T) if(p <= Generic)
{
    T* ptr;
    ref T opUnary(string op)() if(op=="*")
    {
        return *ptr;
    }
    ref T opIndex(size_t i)
    {
        return *(ptr+i);
    }
    auto opBinary(string op)(ptrdiff_t i) if(op=="+" || op == "-")
    {
         return Pointer!(p, T) (ptr + i);
    }
}

is there anything else that I'm missing that you can do with a raw pointer?

Reply via email to