geode/docs/InterfaceHistory.md

198 lines
5 KiB
Markdown
Raw Normal View History

2022-07-30 12:24:03 -04:00
# History of Interface Classes
### 1a07998694824abc492eb6b9d98591d0c0dc26e5
This version had the problem that you could only hook a single class inside a mod container, and it only supported virtual functions
Also the first version of the interface / cackit classes
```cpp
class: public $EditorUI {
void undoLastAction() override {
std::cout << "We have " << cac_this->getSelectedObjects()->count() << " objects elected\n";
$EditorUI::undoLastAction();
}
} MyEditorUIHook;
```
### 781465559ec779e295d1b25a511bbe1d277dd702
This version allowed for multiple classes, though the classes still needed to be inside the same source file and between the two macros `CAC_HOOKS` and `END_CAC_HOOKS`
My personal second least favorite
```cpp
CAC_HOOKS
class: public $EditorUI {
void undoLastAction() override {
std::cout << "Undo!\n";
}
} MyEditorUIHook;
END_CAC_HOOKS
```
### e577a57317681332d4974e1e299159c2f6e307af
This version is the first one that utilized the CRTP system, which eventually became the heart of the interface classes
```cpp
CAC_HOOKS
class EditorUIHook: public $EditorUI<EditorUIHook> {
void undoLastAction() override {
std::cout << "Undo!\n";
}
} MyEditorUIHook;
END_CAC_HOOKS
```
### 4c10edc67ac8893136dbc97df30fe04996d69001
This version ditched the the macros that put the hooks inside an anonymous function for a static global variable approach. `APPLY_HOOKS` macro is exactly that.
```cpp
class EditorUIHook: public $EditorUI<EditorUIHook> {
public:
void undoLastAction() override {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
} MyEditorUIHook;
APPLY_HOOKS();
```
### c9f090d539b6b74742f2bab793c4cc88991f981a
This version removed the CRTP system, not needing to get the address of the virtual with the derived
```cpp
class: public $EditorUI {
public:
void undoLastAction() override {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
} MyEditorUIHook;
APPLY_HOOKS();
```
### 37c7ec8df248a02254de6d84daecca444a484384
This version removed the need for the public storage access, for the same reason as above
```cpp
class: public $EditorUI {
void undoLastAction() override {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
} MyEditorUIHook;
APPLY_HOOKS();
```
### de5eee71b18aa50c225a76667861610049c00b21
This version brang back both CRTP system (but this time wrapped inside a macro) and the public access. Now it also supported all types of functions, and not just virtual functions
```cpp
class REDIRECT($EditorUI) {
public:
void undoLastAction() {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
} MyEditorUIHook;
APPLY_HOOKS();
```
### f18c2f73ae1e1cc1662dbcbe54f36e657a699723
This version renamed the macros to the more Geode familiar syntax with the $ prefixes
```cpp
class $redirect(EditorUI) {
public:
void undoLastAction() {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
} MyEditorUIHook;
$apply();
```
### 4027f1e82a1461fad30ef6e51b6dfc1b887479a8
This version ditched redirect for implement because I was dumb and I misinterpreted something and all
IIRC it was related to the constructors
My personal least favorite
```cpp
class $implement(EditorUI, MyEditorUIHook) {
public:
void undoLastAction(CCObject* p0) {
std::cout << "Undo!" << std::endl;
$EditorUI::undoLastAction(p0);
}
} endImplement(MyEditorUIHook);
$apply();
```
### b32b9f0783b9079269685260ca7188d557f9307e
Thankfully this version reverted that while fixing the problem too
```cpp
class $redirect(EditorUI) {
public:
void undoLastAction() {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
} MyEditorUIHook;
$apply();
```
### 7531b2ae915447df8eb9ce825ee7755303396812
This version removed the need for the `$apply` macro
```cpp
class $redirect(EditorUI) {
public:
void undoLastAction() {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
} MyEditorUIHook;
```
### e6ec14774b94f8b5cdc30a246ed48d46674bce95
This version removed the need for both the variable initializer and the public specifier, using some macro stuff
My personal second favorite
```cpp
class $redirect(EditorUI) {
void undoLastAction() {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
};
```
### f361adca95c6e3c07e0fde654fd7c8c1a59d3b2f
This version combined the two macros to create the ultimate macro `$`
My personal favorite
```cpp
class $(EditorUI) {
void undoLastAction() {
std::cout << "Undo!\n";
$EditorUI::undoLastAction();
}
};
```
### de74c1ffa4a3a7f72ac2394fbfb4a1262fbe470b
This version allowed for the creation of fields, which let you effectively add extra fields to classes
You can access them with the special c++ operator ->*
```cpp
class $(EditorUI) {
member_t<int> number_of_undos;
void undoLastAction() {
std::cout << "You have pressed undo " << ++this->*number_of_undos << " times!\n";
$EditorUI::undoLastAction();
}
};
```
### 5f5bead640bc2a52c087f41c49c3354073809f46
This version added the ability to use the `$orig` macro to call the original function, instead of needing to type it out manually.
```cpp
class $(EditorUI) {
void undoLastAction() {
std::cout << "Undo!\n";
$orig();
}
};
```