Require a BaseParameters type at compile time via enable_if
This commit is contained in:
		
							parent
							
								
									566505fd0f
								
							
						
					
					
						commit
						d3a2c1c41c
					
				@ -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