LINUX.ORG.RU

История изменений

Исправление 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();
}
Уже для Cons много писанины, а если структур много и полей тоже много?

Исправление 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();
}
Уже для Cons много писанины, а если структур много и полей тоже много?

Исправление 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();
}
Уже для Cons много писанины, а если структур много и полей тоже много?

Исправление 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();
}
Уже для Cons много писанины, а если структур много и полей тоже много?

Исправление 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();
}
Уже для Cons много писанины, а если структур много и полей тоже много?

Исходная версия 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();
}
Уже для Cons много писанины, а если структур много и полей тоже много?