История изменений
Исправление MOPKOBKA, (текущая версия) :
Через атрибуты как в Java.
Еще пример придумал, вот решил ты использовать сжатые указатели, вместо T* (uint64_t) теперь у тебя uint32_t к примеру.
typedef uint32_t CompressedPtr;
class Cons
{
CompressedPtr car, cdr;
};
Как разыменовать указатель? Нужно ведь базу для смещения знать. Можно сделать сейчас вот такой удобный класс руками, а с помощью рефлексии можно будет его создать автоматически:
class ConsWrapper
{
Cons *cons;
Base *base;
ConsWrapper(Cons *cons, Base *base)
: cons{cons}, base{base}
{}
ConsWrapper car()
{
Cons *cons_car = base->deref_compressed_ptr(cons->car);
return ConsWrapper{cons_car, base};
}
ConsWrapper cdr()
{
Cons *cons_cdr = base->deref_compressed_ptr(cons->cdr);
return ConsWrapper{cons_cdr, base};
}
void set_car(ConsWrapper new_car);
void set_car(CompressedPtr new_car);
void set_cdr(ConsWrapper new_cdr);
void set_cdr(CompressedPtr new_cdr);
};
void main()
{
...
auto x = ConsWrapper{cons, base};
auto y = x.car().car().car();
}
Исправление MOPKOBKA, :
Через атрибуты как в Java.
Еще пример придумал, вот решил ты использовать сжатые указатели, вместо T* (uint64_t) теперь у тебя uint32_t к примеру.
typedef uint32_t CompressedPtr;
class Cons
{
CompressedPtr car, cdr;
};
Как разыменовать указатель? Нужно ведь базу для смещения знать. Можно сделать сейчас вот такой удобный класс руками, а с помощью рефлексии можно будет его создать автоматически:
class ConsWrapper
{
Cons *cons;
Base *base;
ConsWrapper(Cons *cons, Base *base)
: cons{cons}, base{base}
{}
ConsWrapper car()
{
Cons *cons_car = base->deref_compressed_ptr(cons->car);
return ConsWrapper{cons_car, base};
}
ConsWrapper cdr()
{
Cons *cons_cdr = base->deref_compressed_ptr(cons->cdr);
return ConsWrapper{cons_cdr, base};
}
};
void main()
{
...
auto x = ConsWrapper{cons, base};
auto y = x.car().car().car();
}
Исправление MOPKOBKA, :
Через атрибуты как в Java.
Еще пример придумал, вот решил ты использовать сжатые указатели, вместо T* (uint64_t) теперь у тебя uint32_t к примеру.
typedef uint32_t CompressedPtr;
class Cons
{
CompressedPtr car, cdr;
};
Как разыменовать указатель? Нужно ведь базу для смещения знать. Можно сделать сейчас вот такой удобный класс руками, а с помощью рефлексии можно будет его создать автоматически:
class ConsWrapper
{
Cons *cons;
Base *base;
ConsWrapper(Cons *cons, Base *base)
: cons{cons}, base{base}
{}
ConsWrapper car()
{
Cons *cons_car = base->deref_compressed_ptr(cons->car);
return ConsWrapper{cons_car, base};
}
ConsWrapper cdr()
{
Cons *cons_cdr = base->deref_compressed_ptr(cons->car);
return ConsWrapper{cons_cdr, base};
}
};
void main()
{
...
auto x = ConsWrapper{cons, base};
auto y = x.car().car().car();
}
Исправление MOPKOBKA, :
Через атрибуты как в Java.
Еще пример придумал, вот решил ты использовать сжатые указатели, вместо T* (uint64_t) теперь у тебя uint32_t к примеру.
typedef uint32_t CompressedPtr;
class Cons
{
CompressedPtr car, cdr;
};
Как разыменовать указатель? Нужно ведь базу для смещения знать. Можно сделать сейчас вот такой удобный класс руками, а с помощью рефлексии можно будет его создать автоматически:
class ConsWrapper
{
Cons *cons;
Base *base;
ConsWrapper(Cons *cons, Base *base);
ConsWrapper car()
{
Cons *cons_car = base->deref_compressed_ptr(cons->car);
return ConsWrapper{cons_car, base};
}
ConsWrapper cdr()
{
Cons *cons_cdr = base->deref_compressed_ptr(cons->car);
return ConsWrapper{cons_cdr, base};
}
};
void main()
{
...
auto x = ConsWrapper{cons, base};
auto y = x.car().car().car();
}
Исправление MOPKOBKA, :
Через атрибуты как в Java.
Еще пример придумал, вот решил ты использовать сжатые указатели, вместо T* (uint64_t) теперь у тебя uint32_t к примеру.
typedef uint32_t CompressedPtr;
class Cons
{
CompressedPtr car, cdr;
};
Как разыменовать указатель? Нужно ведь базу для смещения знать. Можно сделать сейчас вот такой удобный класс руками, а с помощью рефлексии можно будет его создать автоматически:
class ConsWrapper
{
Cons *cons;
Base *base;
ConsWrapper(Cons *cons, Base *base);
ConsWrapper car()
{
Cons *cons_cdr = base->deref_compressed_ptr(cons->car);
return ConsWrapper{cons_cdr, base};
}
};
void main()
{
...
auto x = ConsWrapper{cons, base};
auto y = x.car().car().car();
}
Исходная версия MOPKOBKA, :
Через атрибуты как в Java.
Еще пример придумал, вот решил ты использовать сжатые указатели, вместо uint64_t теперь у тебя uint32_t к примеру.
typedef uint32_t CompressedPtr;
class Cons
{
CompressedPtr car, cdr;
};
Как разыменовать указатель? Нужно ведь базу для смещения знать. Можно сделать сейчас вот такой удобный класс руками, а с помощью рефлексии можно будет его создать автоматически:
class ConsWrapper
{
Cons *cons;
Base *base;
ConsWrapper(Cons *cons, Base *base);
ConsWrapper car()
{
Cons *cons_cdr = base->deref_compressed_ptr(cons->car);
return ConsWrapper{cons_cdr, base};
}
};
void main()
{
...
auto x = ConsWrapper{cons, base};
auto y = x.car().car().car();
}