// #define COMMAND_REGISTRY_EXTRA // #include // #include // #include // #include // #include // #include // static_assert(offsetof(CommandParameterData, options) == 73); // static_assert(offsetof(CommandParameterData, name) == 16); // static_assert(offsetof(CommandParameterData, unk56) == 56); // static_assert(offsetof(CommandRegistry::Overload, unk) == 40); // static_assert(sizeof(CommandRegistry::Overload) == 72); // static_assert(offsetof(CommandRegistry::Signature, alt_symbol) == 96); // static_assert(sizeof(CommandRegistry::Signature) == 120); // /* // void CommandRegistry::registerOverload(std::string const& name, Overload::FactoryFn factory, std::vector&& args) // { // Signature* signature = const_cast(findCommand(name)); // auto& overload = signature->overloads.emplace_back(CommandVersion{}, factory, std::move(args)); // registerOverloadInternal(*signature, overload); // }*/ // extern Logger logger; // CommandRegistry::Overload::Overload(CommandVersion version, // FactoryFn factory, // std::vector&& args) // : version(version) // , factory(factory) // , params(std::forward>(args)) // , unk(255){}; // CommandRegistry::Overload::~Overload(){}; // std::vector CommandRegistry::getEnumNames() { // if (!Global) // return {}; // std::vector results; // for (auto& e : Global->mEnums) // results.push_back(e.name); // return results; // auto packet = Global->serializeAvailableCommands(); // return packet.getEnumNames(); // } // std::vector CommandRegistry::getSoftEnumNames() { // if (!Global) // return {}; // std::vector results; // for (auto& e : Global->mSoftEnums) // results.push_back(e.name); // return results; // auto packet = Global->serializeAvailableCommands(); // return packet.getEnumNames(); // } // std::vector CommandRegistry::getEnumValues(std::string const& name) { // if (!Global) // return {}; // std::vector results; // auto& enums = Global->mEnums; // auto iter = std::find_if(enums.begin(), enums.end(), [&](CommandRegistry::Enum const& r) { return r.name == name; }); // if (iter == enums.end()) // return results; // for (auto& i : iter->values) // results.push_back(Global->mEnumValues.at(std::get<3>(i))); // return results; // auto packet = Global->serializeAvailableCommands(); // return packet.getEnumValues(name); // } // std::vector CommandRegistry::getSoftEnumValues(std::string const& name) { // if (!Global) // return {}; // std::vector results; // auto& enums = Global->mSoftEnums; // auto iter = std::find_if(enums.begin(), enums.end(), [&](CommandRegistry::SoftEnum const& r) { return r.name == name; }); // if (iter != enums.end()) // return iter->list; // return {}; // auto packet = Global->serializeAvailableCommands(); // return packet.getEnumValues(name); // } // std::string CommandRegistry::getCommandFullName(std::string const& name) { // if (!Global) // return ""; // auto sig = Global->findCommand(name); // if (sig) // return sig->name; // return ""; // } // #include
// bool CommandRegistry::unregisterCommand(std::string const& name) { // if (!LL::globalConfig.debugMode) { // logger.error("unregister command is only enabled in debug mode"); // return false; // } // logger.warn("Unregister Command \"{}\"!", name); // try { // auto command = getCommandFullName(name); // if (command.empty()) // return false; // auto alias = getAliases(name); // auto aliasKey = command + "CommandAliases"; // static size_t removeIndex = 0; // auto iter = std::find_if(mEnums.begin(), mEnums.end(), [](Enum const& e) { return e.name == "CommandName"; }); // for (auto i = iter->values.begin(); i != iter->values.end();) { // auto& enumValue = mEnumValues.at(std::get<3>(*i)); // if (enumValue == command || std::find(alias.begin(), alias.end(), enumValue) != alias.end()) { // mEnumValueLookup.erase(enumValue); // i = iter->values.erase(i); // enumValue = fmt::format("removed_{}", removeIndex++); // } else { // ++i; // } // } // auto aliasIter = std::find_if(mEnums.begin(), mEnums.end(), [&aliasKey](Enum const& e) { return e.name == aliasKey; }); // if (aliasIter != mEnums.end()) { // aliasIter->values.clear(); // mEnumLookup.erase(aliasIter->name); // aliasIter->name = fmt::format("removed_{}", removeIndex++); // } // auto sig = mSignatures.find(command); // if (sig == mSignatures.end()) // return false; // { // auto iter = std::remove_if(mCommandSymbols.begin(), mCommandSymbols.end(), // [&](Symbol const& r) { return r == sig->second.main_symbol || r == sig->second.alt_symbol; }); // if (iter != mCommandSymbols.end()) // mCommandSymbols.erase(iter, mCommandSymbols.end()); // } // //{ // // auto iter = std::remove_if(mRules.begin(), mRules.end(), // // [&](ParseRule const& r) { return r.sym == sig->second.main_symbol || r.sym == sig->second.alt_symbol; }); // // if (iter == mRules.end()) // // mRules.erase(iter, mRules.end()); // //}; // { // auto iter = std::remove_if(mFactorizations.begin(), mFactorizations.end(), // [&](Factorization const& r) { return r.sym == sig->second.main_symbol || r.sym == sig->second.alt_symbol; }); // if (iter != mFactorizations.end()) // mFactorizations.erase(iter, mFactorizations.end()); // }; // mSignatures.erase(sig); // mAliases.erase(command); // return true; // } catch (...) { // logger.error("Error in CommandRegistry::unregisterCommand"); // } // return false; // } // inline void CommandRegistry::printAll() const { // logger.error("mRules"); // for (auto& rule : mRules) { // logger.warn("{}", rule.toDebugString()); // } // logger.error("mParseTableMap"); // for (auto& [key, table] : mParseTableMap) { // logger.warn("{}: {}", key, table.toDebugString()); // } // logger.error("mOptionals"); // for (auto& optional : mOptionals) { // logger.warn("{}", optional.toDebugString()); // } // logger.error("mEnums"); // for (auto& en : mEnums) { // logger.warn("{}", en.toDebugString()); // } // logger.error("mFactorizations"); // for (auto& i : mFactorizations) { // logger.warn("{}", i.toDebugString()); // } // logger.error("mCommandSymbols"); // for (auto& i : mCommandSymbols) { // logger.warn("{}", i.toDebugString()); // } // logger.error("mSignatures"); // for (auto& [k, v] : mSignatures) { // logger.warn("{}: {}", k, v.toDebugString()); // } // logger.error("mConstrainedValues"); // for (auto& i : mConstrainedValues) { // logger.warn("{}", i.toDebugString()); // } // } // inline void CommandRegistry::printSize() const { // static auto log = std::unordered_map{ // {"mRules ", ""}, // {"mParseTableMap ", ""}, // {"mOptionals ", ""}, // {"mEnumValues ", ""}, // {"mEnums ", ""}, // {"mFactorizations ", ""}, // {"mPostfixes ", ""}, // {"mEnumLookup ", ""}, // {"mEnumValueLookup ", ""}, // {"mCommandSymbols ", ""}, // {"mSignatures ", ""}, // {"mTypeLookup ", ""}, // {"unk376 ", ""}, // {"mAliases ", ""}, // {"mSemanticConstraints ", ""}, // {"mSemanticConstraintLookup", ""}, // {"mConstrainedValues ", ""}, // {"mConstrainedValueLookup ", ""}, // {"mSoftEnums ", ""}, // {"mSoftEnumLookup ", ""}, // {"mStateStack ", ""}, // {"mEnumsValues ", ""}, // {"mConstrainedValuesValues ", ""}, // }; // auto mEnumsValuesSize = ([&]() -> size_t { // size_t size = 0; // for (auto& i : mEnums) { // size += i.values.size(); // } // return size; // })(); // auto mConstrainedValuesSize = ([&]() -> size_t { // size_t size = 0; // for (auto& i : mConstrainedValues) { // size += i.mConstraints.size(); // } // return size; // })(); // log["mRules "].append(fmt::format(", {:4}", mRules.size())); // log["mParseTableMap "].append(fmt::format(", {:4}", mParseTableMap.size())); // log["mOptionals "].append(fmt::format(", {:4}", mOptionals.size())); // log["mEnumValues "].append(fmt::format(", {:4}", mEnumValues.size())); // log["mEnums "].append(fmt::format(", {:4}", mEnums.size())); // log["mFactorizations "].append(fmt::format(", {:4}", mFactorizations.size())); // log["mPostfixes "].append(fmt::format(", {:4}", mPostfixes.size())); // log["mEnumLookup "].append(fmt::format(", {:4}", mEnumLookup.size())); // log["mEnumValueLookup "].append(fmt::format(", {:4}", mEnumValueLookup.size())); // log["mCommandSymbols "].append(fmt::format(", {:4}", mCommandSymbols.size())); // log["mSignatures "].append(fmt::format(", {:4}", mSignatures.size())); // log["mTypeLookup "].append(fmt::format(", {:4}", mTypeLookup.size())); // log["unk376 "].append(fmt::format(", {:4}", unk376.size())); // log["mAliases "].append(fmt::format(", {:4}", mAliases.size())); // log["mSemanticConstraints "].append(fmt::format(", {:4}", mSemanticConstraints.size())); // log["mSemanticConstraintLookup"].append(fmt::format(", {:4}", mSemanticConstraintLookup.size())); // log["mConstrainedValues "].append(fmt::format(", {:4}", mConstrainedValues.size())); // log["mConstrainedValueLookup "].append(fmt::format(", {:4}", mConstrainedValueLookup.size())); // log["mSoftEnums "].append(fmt::format(", {:4}", mSoftEnums.size())); // log["mSoftEnumLookup "].append(fmt::format(", {:4}", mSoftEnumLookup.size())); // log["mStateStack "].append(fmt::format(", {:4}", mStateStack.size())); // log["mEnumsValues "].append(fmt::format(", {:4}", mEnumsValuesSize)); // log["mConstrainedValuesValues "].append(fmt::format(", {:4}", mConstrainedValuesSize)); // for (auto& [k, v] : log) { // logger.warn("{}{}", k, v); // } // }