csv_grammar: make csv_white_space_skipper a primitive_parser
This commit is contained in:
parent
ccf579f450
commit
5d1fd56cef
2 changed files with 29 additions and 11 deletions
|
@ -35,21 +35,39 @@ using csv_value = std::string;
|
|||
using csv_line = std::vector<csv_value>;
|
||||
using csv_data = std::vector<csv_line>;
|
||||
|
||||
template <typename Iterator>
|
||||
struct csv_white_space_skipper : qi::grammar<Iterator>
|
||||
struct csv_white_space_skipper : qi::primitive_parser<csv_white_space_skipper>
|
||||
{
|
||||
csv_white_space_skipper()
|
||||
: csv_white_space_skipper::base_type(skip)
|
||||
template <typename Context, typename Iterator>
|
||||
struct attribute
|
||||
{
|
||||
using namespace qi;
|
||||
qi::lit_type lit;
|
||||
skip = +lit(' ')
|
||||
;
|
||||
typedef qi::unused_type type;
|
||||
};
|
||||
|
||||
template <typename Iterator, typename Context
|
||||
, typename Skipper, typename Attribute>
|
||||
bool parse(Iterator& first, Iterator const& last
|
||||
, Context& /*context*/, Skipper const& skipper
|
||||
, Attribute& /*attr*/) const
|
||||
{
|
||||
qi::skip_over(first, last, skipper);
|
||||
if (first != last && *first == ' ')
|
||||
{
|
||||
while (++first != last && *first == ' ')
|
||||
;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename Context>
|
||||
qi::info what(Context& /*context*/) const
|
||||
{
|
||||
return qi::info("csv_white_space_skipper");
|
||||
}
|
||||
qi::rule<Iterator> skip;
|
||||
};
|
||||
|
||||
template <typename Iterator, typename Skipper = csv_white_space_skipper<Iterator> >
|
||||
|
||||
template <typename Iterator, typename Skipper = csv_white_space_skipper>
|
||||
struct csv_line_grammar : qi::grammar<Iterator, csv_line(char, char), Skipper>
|
||||
{
|
||||
csv_line_grammar()
|
||||
|
|
|
@ -47,7 +47,7 @@ namespace csv_utils
|
|||
{
|
||||
|
||||
static const mapnik::csv_line_grammar<char const*> line_g;
|
||||
static const mapnik::csv_white_space_skipper<char const*> skipper;
|
||||
static const mapnik::csv_white_space_skipper skipper{};
|
||||
|
||||
template <typename Iterator>
|
||||
static mapnik::csv_line parse_line(Iterator start, Iterator end, char separator, char quote, std::size_t num_columns)
|
||||
|
|
Loading…
Add table
Reference in a new issue