Require a BaseParameters type at compile time via enable_if
This commit is contained in:
		
							parent
							
								
									097771879b
								
							
						
					
					
						commit
						7abb7ed0e1
					
				| @ -4,6 +4,10 @@ | ||||
| #include "engine/api/route_parameters.hpp" | ||||
| #include "engine/api/table_parameters.hpp" | ||||
| 
 | ||||
| #include <boost/optional/optional.hpp> | ||||
| 
 | ||||
| #include <type_traits> | ||||
| 
 | ||||
| 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<typename ParameterT> | ||||
| boost::optional<ParameterT> parseParameters(std::string::iterator& iter, std::string::iterator end); | ||||
| 
 | ||||
| // copy on purpose because we need mutability
 | ||||
| template<typename ParameterT> | ||||
| inline boost::optional<ParameterT> parseParameters(std::string options_string) | ||||
| namespace detail | ||||
| { | ||||
|     auto iter = options_string.begin(); | ||||
|     return parseParameters<ParameterT>(iter, options_string.end()); | ||||
| template <typename T> using is_parameter_t = std::is_base_of<engine::api::BaseParameters, T>; | ||||
| } // ns detail
 | ||||
| 
 | ||||
| // Starts parsing and iter and modifies it until iter == end or parsing failed
 | ||||
| template <typename ParameterT, | ||||
|           typename std::enable_if<detail::is_parameter_t<ParameterT>::value, int>::type = 0> | ||||
| boost::optional<ParameterT> parseParameters(std::string::iterator &iter, std::string::iterator end); | ||||
| 
 | ||||
| // Copy on purpose because we need mutability
 | ||||
| template <typename ParameterT, | ||||
|           typename std::enable_if<detail::is_parameter_t<ParameterT>::value, int>::type = 0> | ||||
| boost::optional<ParameterT> parseParameters(std::string options_string) | ||||
| { | ||||
|     const auto first = options_string.begin(); | ||||
|     const auto last = options_string.end(); | ||||
|     return parseParameters<ParameterT>(first, last); | ||||
| } | ||||
| 
 | ||||
| template<> | ||||
| boost::optional<engine::api::RouteParameters> parseParameters(std::string::iterator& iter, std::string::iterator end); | ||||
| template<> | ||||
| boost::optional<engine::api::TableParameters> parseParameters(std::string::iterator& iter, std::string::iterator end); | ||||
| 
 | ||||
| } | ||||
| } | ||||
| } | ||||
| } // ns api
 | ||||
| } // ns server
 | ||||
| } // ns osrm
 | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -3,6 +3,8 @@ | ||||
| #include "server/api/route_parameters_grammar.hpp" | ||||
| #include "server/api/table_parameter_grammar.hpp" | ||||
| 
 | ||||
| #include <type_traits> | ||||
| 
 | ||||
| namespace osrm | ||||
| { | ||||
| namespace server | ||||
| @ -10,37 +12,37 @@ namespace server | ||||
| namespace api | ||||
| { | ||||
| 
 | ||||
| template<> | ||||
| boost::optional<engine::api::RouteParameters> parseParameters(std::string::iterator& iter, std::string::iterator end) | ||||
| namespace detail | ||||
| { | ||||
|     RouteParametersGrammar grammar; | ||||
| 
 | ||||
| template <typename ParameterT, typename GrammarT> | ||||
| boost::optional<ParameterT> parseParameters(std::string::iterator &iter, std::string::iterator end) | ||||
| { | ||||
|     GrammarT grammar; | ||||
|     const auto result = boost::spirit::qi::parse(iter, end, grammar); | ||||
| 
 | ||||
|     boost::optional<engine::api::RouteParameters> parameters; | ||||
|     boost::optional<ParameterT> parameters; | ||||
|     if (result && iter == end) | ||||
|     { | ||||
|         parameters = std::move(grammar.parameters); | ||||
|     } | ||||
| 
 | ||||
|     return parameters; | ||||
| } | ||||
| } // ns detail
 | ||||
| 
 | ||||
| template<> | ||||
| boost::optional<engine::api::TableParameters> parseParameters(std::string::iterator& iter, std::string::iterator end) | ||||
| template <> | ||||
| boost::optional<engine::api::RouteParameters> parseParameters(std::string::iterator &iter, | ||||
|                                                               std::string::iterator end) | ||||
| { | ||||
|     TableParametersGrammar grammar; | ||||
|     const auto result = boost::spirit::qi::parse(iter, end, grammar); | ||||
| 
 | ||||
|     boost::optional<engine::api::TableParameters> parameters; | ||||
|     if (result && iter == end) | ||||
|     { | ||||
|         parameters = std::move(grammar.parameters); | ||||
|     } | ||||
| 
 | ||||
|     return parameters; | ||||
|     return detail::parseParameters<engine::api::RouteParameters, RouteParametersGrammar>(iter, end); | ||||
| } | ||||
| 
 | ||||
| } | ||||
| } | ||||
| template <> | ||||
| boost::optional<engine::api::TableParameters> parseParameters(std::string::iterator &iter, | ||||
|                                                               std::string::iterator end) | ||||
| { | ||||
|     return detail::parseParameters<engine::api::TableParameters, TableParametersGrammar>(iter, end); | ||||
| } | ||||
| 
 | ||||
| } // ns api
 | ||||
| } // ns server
 | ||||
| } // ns osrm
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user