From c5ea2cf0d741e7ced6bd32e4a013a21be3755394 Mon Sep 17 00:00:00 2001 From: Niklas Halle Date: Wed, 26 Aug 2020 17:19:19 +0200 Subject: more indirection always helps, right? --- include/Handler.hpp | 14 +++++++++----- src/Handler.cpp | 14 +++----------- src/SimpleHandlers.cpp | 2 +- src/main.cpp | 47 +++++++++++++++++++++++++++-------------------- 4 files changed, 40 insertions(+), 37 deletions(-) diff --git a/include/Handler.hpp b/include/Handler.hpp index 7bbefcd..37f281c 100644 --- a/include/Handler.hpp +++ b/include/Handler.hpp @@ -11,19 +11,23 @@ namespace Handler { typedef crow::json::wvalue json; typedef std::function handler_function; + typedef std::function()> description_function; struct CommandHandler { - CommandHandler(std::string command, handler_function func, std::vector *description, - void *payload = nullptr); + CommandHandler(std::string command, handler_function func, description_function desc, void *payload = nullptr); - CommandHandler(CommandHandler &&o) noexcept; + CommandHandler(CommandHandler &&o) noexcept { + command = std::move(o.command); + func = std::move(o.func); + get_description = std::move(get_description); + payload = o.payload; + }; [[nodiscard]] json exec(std::string const &arguments, std::string const &session) const; std::string command; handler_function func{nullptr}; - // handler does NOT take ownership of the description, you have to delete it - after this object is destroyed - std::vector *description{nullptr}; + description_function get_description{nullptr}; void *payload{nullptr}; }; diff --git a/src/Handler.cpp b/src/Handler.cpp index b5ed9f0..a26ee8a 100644 --- a/src/Handler.cpp +++ b/src/Handler.cpp @@ -15,18 +15,10 @@ std::vector Handler::tokenizeArguments(const std::string &arguments return tokens; } -Handler::CommandHandler::CommandHandler(Handler::CommandHandler &&o) noexcept { - // this is a copy constructor, disguised as a move constructor.. I am sorry - command = o.command; - func = o.func; - description = o.description; // this is the main problem, any "moved" object will point to the same description TODO: maybe smart pointer can help? - payload = o.payload; -} - Handler::json Handler::CommandHandler::exec(const std::string &arguments, const std::string &session) const { return func(arguments, session, payload); } -Handler::CommandHandler::CommandHandler(std::string command, Handler::handler_function func, - std::vector *description, void *payload) - : command{std::move(command)}, func{std::move(func)}, description{description}, payload{payload} {} +Handler::CommandHandler::CommandHandler(std::string command, Handler::handler_function func, description_function desc, + void *payload) + : command{std::move(command)}, func{std::move(func)}, get_description{std::move(desc)}, payload{payload} {} diff --git a/src/SimpleHandlers.cpp b/src/SimpleHandlers.cpp index 5b68125..e4ce4ac 100644 --- a/src/SimpleHandlers.cpp +++ b/src/SimpleHandlers.cpp @@ -38,7 +38,7 @@ Handler::json Handler::helpHandler(std::string const &arguments, std::string con std::vector commandAnnotations; commandAnnotations.emplace_back( - create_annotation(Reply::AnnotationType::command, std::move(*itor.description))); + create_annotation(Reply::AnnotationType::command, std::move(itor.get_description()))); reply_vec.emplace_back(create_text("- ")); reply_vec.emplace_back(create_text(itor.command, std::move(commandAnnotations))); diff --git a/src/main.cpp b/src/main.cpp index fd1be31..8a8e4ba 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,39 +12,49 @@ #include "GetEssen.hpp" #include "SimpleHandlers.hpp" #include "RelationshipHandler.hpp" + /* END Handlers */ int main() { crow::SimpleApp app; - auto createPlainDescriptionFromText = [](std::string const &text) -> std::vector * { - auto reply_vector = new std::vector; - reply_vector->emplace_back(Response::create_text(text)); + auto createPlainDescriptionFromText = [](std::string const &text) -> std::vector { + std::vector reply_vector; + reply_vector.emplace_back(Response::create_text(text)); return reply_vector; }; // command --> handler std::vector commands; commands.emplace_back( - Handler::CommandHandler{"wiki", Handler::wikiHandler, createPlainDescriptionFromText( - "Sends you to Wikipedia!")}); + Handler::CommandHandler{"wiki", Handler::wikiHandler, [createPlainDescriptionFromText]() { + return createPlainDescriptionFromText("Sends you to Wikipedia!"); + }}); commands.emplace_back( - Handler::CommandHandler{"stop", Handler::stopHandler, createPlainDescriptionFromText( - "Stops the bot"), &app}); + Handler::CommandHandler{"stop", Handler::stopHandler, [createPlainDescriptionFromText]() { + return createPlainDescriptionFromText("Stops the bot"); + }, &app}); commands.emplace_back( - Handler::CommandHandler{"mensa", Handler::mensaHandler, createPlainDescriptionFromText( - "{adlershof, nord, sued} Shows the daily menu of the mensa at various places.")}); + Handler::CommandHandler{"mensa", Handler::mensaHandler, [createPlainDescriptionFromText]() { + return createPlainDescriptionFromText( + "{adlershof, nord, sued} Shows the daily menu of the mensa at various places."); + }}); commands.emplace_back( - Handler::CommandHandler{"klinger", Handler::klingerHandler, createPlainDescriptionFromText( - "Greats in french. Bonjour!")}); + Handler::CommandHandler{"klinger", Handler::klingerHandler, [createPlainDescriptionFromText]() { + return createPlainDescriptionFromText("Greats in french. Bonjour!"); + }}); commands.emplace_back( - Handler::CommandHandler{"say", Handler::sayHandler, createPlainDescriptionFromText( - "Say something!")}); + Handler::CommandHandler{"say", Handler::sayHandler, [createPlainDescriptionFromText]() { + return createPlainDescriptionFromText("Say something!"); + }}); commands.emplace_back( - Handler::CommandHandler{"relation", Handler::relationShipHandler, createPlainDescriptionFromText( - "[name1] [name2] Shows the result of an odd astrological religious pseudo-algorithm, based on the fact how much blessing a relationship receives by the glorious N.")}); - commands.emplace_back(Handler::CommandHandler{"help", Handler::helpHandler, createPlainDescriptionFromText( - "This is my holy manual."), &commands}); + Handler::CommandHandler{"relation", Handler::relationShipHandler, [createPlainDescriptionFromText]() { + return createPlainDescriptionFromText( + "[name1] [name2] Shows the result of an odd astrological religious pseudo-algorithm, based on the fact how much blessing a relationship receives by the glorious N."); + }}); + commands.emplace_back(Handler::CommandHandler{"help", Handler::helpHandler, [createPlainDescriptionFromText]() { + return createPlainDescriptionFromText("This is my holy manual."); + }, &commands}); CROW_ROUTE(app, "/") .methods("POST"_method) @@ -78,8 +88,5 @@ int main() { app.port(18080).multithreaded().run(); - for (auto &&it : commands) - delete it.description; - std::cout << "Stopped successfully" << std::endl; } -- cgit v1.2.3-54-g00ecf