split is_array to fixed_type_array and array_of_some_type

This commit is contained in:
ToruNiina
2017-05-07 14:08:42 +09:00
parent 7355c76ed0
commit 77f59a2e94
2 changed files with 45 additions and 28 deletions

View File

@@ -411,6 +411,14 @@ BOOST_AUTO_TEST_CASE(test_array)
const std::string arr2("[#c\n1,\n2,#comment\r\n3]"); const std::string arr2("[#c\n1,\n2,#comment\r\n3]");
BOOST_CHECK(is_valid::invoke(arr2.cbegin()) == arr2.cend()); BOOST_CHECK(is_valid::invoke(arr2.cbegin()) == arr2.cend());
} }
{
const std::string invalid("[1, 3.14, 'string']");
BOOST_CHECK(is_valid::invoke(invalid.cbegin()) == invalid.cbegin());
const std::string valid("[[1,2,3], [3.14, 2.71, 1.414], ['foo', 'bar']]");
BOOST_CHECK(is_valid::invoke(valid.cbegin()) == valid.cend());
}
} }
BOOST_AUTO_TEST_CASE(test_inline_table) BOOST_AUTO_TEST_CASE(test_inline_table)

View File

@@ -547,6 +547,34 @@ using is_key =
is_literal_inline_string<charT> is_literal_inline_string<charT>
>; >;
template<typename charT, typename is_array_component>
using is_fixed_type_array =
is_chain_of<
is_charactor<charT, '['>,
is_ignorable<
is_repeat_of<
is_chain_of<
is_ignorable<is_skippable_in_array<charT>>,
is_array_component,
is_ignorable<is_skippable_in_array<charT>>,
is_charactor<charT, ','>
>,
repeat_infinite()
>
>,
is_ignorable<
is_chain_of<
is_ignorable<is_skippable_in_array<charT>>,
is_array_component,
is_ignorable<is_skippable_in_array<charT>>,
is_ignorable<is_charactor<charT, ','>>
>
>,
is_ignorable<is_skippable_in_array<charT>>,
is_charactor<charT, ']'>
>;
template<typename charT> template<typename charT>
struct is_array struct is_array
{ {
@@ -557,34 +585,15 @@ struct is_array
value_type>::value>::type> value_type>::value>::type>
static Iterator invoke(Iterator iter) static Iterator invoke(Iterator iter)
{ {
typedef is_one_of<is_fundamental_type<charT>, return is_one_of<
is_array<charT>, is_inline_table<charT>> is_component; is_fixed_type_array<charT, is_boolean<charT>>,
is_fixed_type_array<charT, is_integer<charT>>,
typedef is_chain_of< is_fixed_type_array<charT, is_float<charT>>,
is_charactor<charT, '['>, is_fixed_type_array<charT, is_string<charT>>,
is_ignorable< is_fixed_type_array<charT, is_datetime<charT>>,
is_repeat_of< is_fixed_type_array<charT, is_array<charT>>,
is_chain_of< is_fixed_type_array<charT, is_inline_table<charT>>
is_ignorable<is_skippable_in_array<charT>>, >::invoke(iter);
is_component,
is_ignorable<is_skippable_in_array<charT>>,
is_charactor<charT, ','>
>,
repeat_infinite()
>
>,
is_ignorable<
is_chain_of<
is_ignorable<is_skippable_in_array<charT>>,
is_component,
is_ignorable<is_skippable_in_array<charT>>,
is_ignorable<is_charactor<charT, ','>>
>
>,
is_ignorable<is_skippable_in_array<charT>>,
is_charactor<charT, ']'>
> entity;
return entity::invoke(iter);
} }
}; };