aviutl_exedit_sdk
aviutl_exedit_sdk copied to clipboard
メモリ参照情報の追加
本リクエストでは、拡張編集の内部変数の情報(型とオフセットアドレス)をSDKに含めることを提案します。これにより、SDKとしての機能性が向上するのみならず、現状では各々のプロジェクトに分散している解析情報を本リポジトリに集約する効果が期待されます。
添付されているコードは設計の一案であり、試験的にAulsメモリ参照に含まれる変数情報を記載しています。想定される使用例は以下の通りです。
// 拡張編集 version0.92 のみに対応する例
#include <exedit.hpp>
extern unsigned int g_exedit_base;
void foo() {
const auto objs = *ExEdit::Variables::get092<ExEdit::Variables::sortedObjectTable>(g_exedit_base);
const auto n = *ExEdit::Variables::get092<ExEdit::Variables::sortedObjectTable::length>(g_exedit_base);
// ...
}
// 拡張編集 version0.92 および 0.93rc1 に対応する例
#include <exedit.hpp>
extern unsigned int g_exedit_base;
extern ExEditVersion g_exedit_version;
template<typename Variable>
Variable::reference_type get_variable() {
if (g_exedit_version == ExEditVersion::version092) {
return ExEdit::Variables::get092<Variable>(g_exedit_base);
}
else if (g_exedit_version == ExEditVersion::version093rc1) {
return ExEdit::Variables::get093rc1<Variable>(g_exedit_base);
}
else {
return nullptr;
}
}
void foo() {
const auto objs = *get_variable<ExEdit::Variables::sortedObjectTable>();
// この行はコンパイル不可(0.93rc1のオフセット情報が存在しないため)
// const auto n = *get_variable<ExEdit::Variables::sortedObjectTable::length>();
// ...
}
ご検討のほどよろしくお願い致します。
(2022/4/24 12:05追記)いくつかの誤りを修正しました
アドレスを書いてしまうの、あまりやりたくなかったことでした なんでなのかの言語化はちょっとまだできません 何か私が納得できる実装方法を思いついたら、それをやるかもしれません(逆に言えばこの実装は何かが嫌です)
バージョン名を含む関数がExEdit::Variablesにぶら下がっているのが気持ち悪いかもしれません。
サポート対象をマクロで記述させる案もあります(ヘッダライブラリがstatefulになるのは個人的にあまり好みではないのですが)
#define SUPPORT_EXEDIT092
#define SUPPORT_EXEDIT093rc1
#include <exedit.hpp>
BOOL func_init(AviUtl::FilterPlugin* fp) {
// 非対応バージョンならば runtime_error
ExEdit::Variables::init(fp);
// ...
}
void foo() {
// 解析情報が存在しなければコンパイルエラー
const auto objs = *ExEdit::Variables::get<ExEdit::Variables::sortedObjectTable>();
// 解析情報が存在しなければ nullptr を返す
const auto n_ptr = ExEdit::Variables::get_nullable<ExEdit::Variables::sortedObjectTable::length>();
// いずれも ExEdit::Variables::init() より前に呼び出したら runtime_error
// ...
}