Skip to content

Instantly share code, notes, and snippets.

View cleak's full-sized avatar

Caleb Leak cleak

View GitHub Profile
typedef void(VoidMemberFn)(void*);
VoidMemberFn* fn = (VoidMemberFn*)GetVTable<BaseType>(my_obj_ptr)[1];
// ... sometime later
fn(my_obj_ptr);
template <typename T>
void** GetVTable(T* obj) {
return *((void***)obj);
}
class BouncyBall : public GameObject {
void Update() override {
// ...
}
void PhysicsUpdate() override {
// ...
}
};
class SceneManager {
public:
SceneManager() {
null_vtable_ = GetVtable(&null_object_);
}
void Add(SceneObject* obj) {
SceneObject_VTable* vtable = GetVtable(obj);
if (vtable->update != null_vtable_->update) {
class SceneObject {
public:
virtual ~SceneObject() {}
virtual void Update() {}
virtual void LateUpdate() {}
virtual void PhysicsUpdate() {}
virtual void DrawImmediate() {}
};
struct SceneObject_VTable {
typedef void (UpdateFn)(void*);
struct CompareUpdateFns {
bool operator()(const std::pair<UpdateFn*, void*>& a,
const std::pair<UpdateFn*, void*>& b) const {
if (a.first == b.first) {
return a.second < b.second;
}
return a.first < b.first;
}
class IncrementerBase {
public:
IncrementerBase() {
my_num = rand();
}
virtual ~IncrementerBase() {}
virtual void Increment() {}
int my_num;
};
GenericGreeter_VTable* GetVTable(GenericGreeter* obj) {
GenericGreeter_VTable** vtable_ptr = (GenericGreeter_VTable**)obj;
return *(vtable_ptr);
}
typedef void (GreetFn)(void*, const char* name);
struct GenericGreeter_VTable {
GreetFn* greet;
GreetFn* dismiss;
};
class GenericGreeter {
public:
virtual void Greet(const char* name) {
cout << "Hi " << name << "." << endl;
}
virtual void Dismiss(const char* name) {
cout << "Bye " << name << "." << endl;
}
};