mirror of
https://github.com/matrix-construct/construct
synced 2024-09-27 19:28:52 +02:00
ircd::json: Move vector static grammars outside function; apply visibility.
This commit is contained in:
parent
1b90964630
commit
d870385e6c
1 changed files with 66 additions and 47 deletions
113
ircd/json.cc
113
ircd/json.cc
|
@ -2256,6 +2256,36 @@ const
|
||||||
// json/vector.h
|
// json/vector.h
|
||||||
//
|
//
|
||||||
|
|
||||||
|
namespace ircd::json
|
||||||
|
{
|
||||||
|
using vector_rule = parser::rule<string_view>;
|
||||||
|
|
||||||
|
[[gnu::visibility("internal")]] extern const vector_rule vector_object;
|
||||||
|
[[gnu::visibility("internal")]] extern const vector_rule vector_next_parse;
|
||||||
|
[[gnu::visibility("internal")]] extern const vector_rule vector_begin_parse;
|
||||||
|
}
|
||||||
|
|
||||||
|
decltype(ircd::json::vector_object)
|
||||||
|
ircd::json::vector_object
|
||||||
|
{
|
||||||
|
raw[parser.object(0)]
|
||||||
|
,"vector object"
|
||||||
|
};
|
||||||
|
|
||||||
|
decltype(ircd::json::vector_next_parse)
|
||||||
|
ircd::json::vector_next_parse
|
||||||
|
{
|
||||||
|
expect[eoi | (vector_object >> -parser.ws)]
|
||||||
|
,"next object vector element or end"
|
||||||
|
};
|
||||||
|
|
||||||
|
decltype(ircd::json::vector_begin_parse)
|
||||||
|
ircd::json::vector_begin_parse
|
||||||
|
{
|
||||||
|
expect[-parser.ws >> (eoi | (vector_object >> -parser.ws))]
|
||||||
|
,"object vector element"
|
||||||
|
};
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ircd::json::operator!(const vector &v)
|
ircd::json::operator!(const vector &v)
|
||||||
{
|
{
|
||||||
|
@ -2341,6 +2371,35 @@ const
|
||||||
for(; it != end() && i; ++it, i--);
|
for(; it != end() && i; ++it, i--);
|
||||||
return it;
|
return it;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ircd::json::vector::const_iterator
|
||||||
|
ircd::json::vector::begin()
|
||||||
|
const try
|
||||||
|
{
|
||||||
|
const_iterator ret
|
||||||
|
{
|
||||||
|
string_view::begin(), string_view::end()
|
||||||
|
};
|
||||||
|
|
||||||
|
string_view &state(ret.state);
|
||||||
|
qi::parse(ret.start, ret.stop, vector_begin_parse, state);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
catch(const qi::expectation_failure<const char *> &e)
|
||||||
|
{
|
||||||
|
throw expectation_failure<parse_error>
|
||||||
|
{
|
||||||
|
e, string_view::data(), error_show_max
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::json::vector::const_iterator
|
||||||
|
ircd::json::vector::end()
|
||||||
|
const
|
||||||
|
{
|
||||||
|
return { string_view::end(), string_view::end() };
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// vector::const_iterator
|
// vector::const_iterator
|
||||||
//
|
//
|
||||||
|
@ -2381,19 +2440,18 @@ ircd::json::operator>(const vector::const_iterator &a, const vector::const_itera
|
||||||
return a.state > b.state;
|
return a.state > b.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// vector::const_iterator::const_iterator
|
||||||
|
//
|
||||||
|
|
||||||
ircd::json::vector::const_iterator &
|
ircd::json::vector::const_iterator &
|
||||||
ircd::json::vector::const_iterator::operator++()
|
ircd::json::vector::const_iterator::operator++()
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
static const parser::rule<string_view> parse_next
|
|
||||||
{
|
|
||||||
raw[parser.object(0)] | qi::eoi
|
|
||||||
,"next vector element or end"
|
|
||||||
};
|
|
||||||
|
|
||||||
string_view state;
|
this->state = {};
|
||||||
qi::parse(start, stop, eps > parse_next, state);
|
string_view &state(this->state);
|
||||||
this->state = state;
|
qi::parse(start, stop, vector_next_parse, state);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
catch(const qi::expectation_failure<const char *> &e)
|
catch(const qi::expectation_failure<const char *> &e)
|
||||||
|
@ -2404,45 +2462,6 @@ catch(const qi::expectation_failure<const char *> &e)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
ircd::json::vector::const_iterator
|
|
||||||
ircd::json::vector::begin()
|
|
||||||
const try
|
|
||||||
{
|
|
||||||
static const parser::rule<string_view> parse_begin
|
|
||||||
{
|
|
||||||
raw[parser.object(0)]
|
|
||||||
,"object vector element"
|
|
||||||
};
|
|
||||||
|
|
||||||
const_iterator ret
|
|
||||||
{
|
|
||||||
string_view::begin(), string_view::end()
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!string_view{*this}.empty())
|
|
||||||
{
|
|
||||||
string_view state;
|
|
||||||
qi::parse(ret.start, ret.stop, eps > parse_begin, state);
|
|
||||||
ret.state = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
catch(const qi::expectation_failure<const char *> &e)
|
|
||||||
{
|
|
||||||
throw expectation_failure<parse_error>
|
|
||||||
{
|
|
||||||
e, string_view::data(), error_show_max
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
ircd::json::vector::const_iterator
|
|
||||||
ircd::json::vector::end()
|
|
||||||
const
|
|
||||||
{
|
|
||||||
return { string_view::end(), string_view::end() };
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// json/object.h
|
// json/object.h
|
||||||
|
|
Loading…
Reference in a new issue