diff --git a/include/server/api/parameters_parser.hpp b/include/server/api/parameters_parser.hpp index 751235555..87a441567 100644 --- a/include/server/api/parameters_parser.hpp +++ b/include/server/api/parameters_parser.hpp @@ -4,6 +4,10 @@ #include "engine/api/route_parameters.hpp" #include "engine/api/table_parameters.hpp" +#include + +#include + namespace osrm { namespace server @@ -11,25 +15,28 @@ namespace server namespace api { -// Starts parsing and iter and modifies it until iter == end or parsing failed -template -boost::optional parseParameters(std::string::iterator& iter, std::string::iterator end); - -// copy on purpose because we need mutability -template -inline boost::optional parseParameters(std::string options_string) +namespace detail { - auto iter = options_string.begin(); - return parseParameters(iter, options_string.end()); +template using is_parameter_t = std::is_base_of; +} // ns detail + +// Starts parsing and iter and modifies it until iter == end or parsing failed +template ::value, int>::type = 0> +boost::optional parseParameters(std::string::iterator &iter, std::string::iterator end); + +// Copy on purpose because we need mutability +template ::value, int>::type = 0> +boost::optional parseParameters(std::string options_string) +{ + const auto first = options_string.begin(); + const auto last = options_string.end(); + return parseParameters(first, last); } -template<> -boost::optional parseParameters(std::string::iterator& iter, std::string::iterator end); -template<> -boost::optional parseParameters(std::string::iterator& iter, std::string::iterator end); - -} -} -} +} // ns api +} // ns server +} // ns osrm #endif diff --git a/src/server/api/parameters_parser.cpp b/src/server/api/parameters_parser.cpp index 33eb8c7d7..267605b13 100644 --- a/src/server/api/parameters_parser.cpp +++ b/src/server/api/parameters_parser.cpp @@ -3,6 +3,8 @@ #include "server/api/route_parameters_grammar.hpp" #include "server/api/table_parameter_grammar.hpp" +#include + namespace osrm { namespace server @@ -10,37 +12,37 @@ namespace server namespace api { -template<> -boost::optional parseParameters(std::string::iterator& iter, std::string::iterator end) +namespace detail { - RouteParametersGrammar grammar; + +template +boost::optional parseParameters(std::string::iterator &iter, std::string::iterator end) +{ + GrammarT grammar; const auto result = boost::spirit::qi::parse(iter, end, grammar); - boost::optional parameters; + boost::optional parameters; if (result && iter == end) - { parameters = std::move(grammar.parameters); - } return parameters; } +} // ns detail -template<> -boost::optional parseParameters(std::string::iterator& iter, std::string::iterator end) +template <> +boost::optional parseParameters(std::string::iterator &iter, + std::string::iterator end) { - TableParametersGrammar grammar; - const auto result = boost::spirit::qi::parse(iter, end, grammar); - - boost::optional parameters; - if (result && iter == end) - { - parameters = std::move(grammar.parameters); - } - - return parameters; + return detail::parseParameters(iter, end); } -} -} +template <> +boost::optional parseParameters(std::string::iterator &iter, + std::string::iterator end) +{ + return detail::parseParameters(iter, end); } +} // ns api +} // ns server +} // ns osrm