Skip to content

Instantly share code, notes, and snippets.

@DrPizza
Last active December 4, 2017 23:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DrPizza/e64763476c2aff6a639152be2bdcb0f5 to your computer and use it in GitHub Desktop.
Save DrPizza/e64763476c2aff6a639152be2bdcb0f5 to your computer and use it in GitHub Desktop.
struct real_gc_base {
virtual ~real_gc_base() {}
};
struct gc : virtual real_gc_base {
};
struct b1 : gc {
};
struct b2 : b1 {
};
struct b3 : b1 {
};
struct d : b2, b3 {
};
union pointer {
struct {
size_t p : 40;
size_t typed_offset : 24;
};
};
struct raw_reference {
real_gc_base* get_base() {
return reinterpret_cast<real_gc_base*>(ptr.p);
}
pointer ptr;
};
template<typename T>
struct reference : raw_reference {
T* operator->() {
return reinterpret_cast<T*>(ptr.p + (ptr.typed_offset * sizeof(void*)));
}
};
struct raw_reference_preferred {
real_gc_base* get_base() {
return dynamic_cast<real_gc_base*>(ptr);
}
void* ptr;
};
template<typename T>
struct reference_preferred : raw_reference_preferred {
T* operator->() {
return static_cast<T*>(ptr);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment