From e35e620812a075a4b34489b53ee0c6f09caccb5d Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Fri, 5 May 2017 18:54:09 +0900 Subject: [PATCH] add acceptor for array and inline table --- tests/test_acceptor.cpp | 40 +++++++++- toml/acceptor.hpp | 163 ++++++++++++++++++++++++++++++---------- 2 files changed, 161 insertions(+), 42 deletions(-) diff --git a/tests/test_acceptor.cpp b/tests/test_acceptor.cpp index 5c65b53..c24b0cf 100644 --- a/tests/test_acceptor.cpp +++ b/tests/test_acceptor.cpp @@ -380,6 +380,8 @@ BOOST_AUTO_TEST_CASE(test_array) { using is_valid = toml::is_array; { + const std::string arr0("[]"); + BOOST_CHECK(is_valid::invoke(arr0.cbegin()) == arr0.cend()); const std::string arr1("[1,2,3]"); BOOST_CHECK(is_valid::invoke(arr1.cbegin()) == arr1.cend()); const std::string arr2("[ 1,2,3 ]"); @@ -390,12 +392,48 @@ BOOST_AUTO_TEST_CASE(test_array) BOOST_CHECK(is_valid::invoke(arr4.cbegin()) == arr4.cend()); const std::string arr5("[ 1, 2, 3,]"); BOOST_CHECK(is_valid::invoke(arr5.cbegin()) == arr5.cend()); + const std::string arr6("[ 1 , 2 , 3 ,]"); + BOOST_CHECK(is_valid::invoke(arr6.cbegin()) == arr6.cend()); } { const std::string arr1("[\"red\", \"yellow\", \"green\"]"); BOOST_CHECK(is_valid::invoke(arr1.cbegin()) == arr1.cend()); const std::string arr2("[\"]\", \"#\", \" \"]"); BOOST_CHECK(is_valid::invoke(arr2.cbegin()) == arr2.cend()); + const std::string arr3("[[1, 2, 3], ['a', 'b', 'c']]"); + BOOST_CHECK(is_valid::invoke(arr3.cbegin()) == arr3.cend()); + const std::string arr4("[{hoge = 1}, {piyo = 'a'}, {fuga = [1,2,3]}]"); + BOOST_CHECK(is_valid::invoke(arr4.cbegin()) == arr4.cend()); + } + { + const std::string arr1("[1,\n2,#comment\n3]"); + BOOST_CHECK(is_valid::invoke(arr1.cbegin()) == arr1.cend()); + const std::string arr2("[1,\n2,#comment\r\n3]"); + BOOST_CHECK(is_valid::invoke(arr2.cbegin()) == arr2.cend()); + } +} + + +BOOST_AUTO_TEST_CASE(test_table) +{ + using is_valid = toml::is_inline_table; + { + const std::string tab0("{}"); + BOOST_CHECK(is_valid::invoke(tab0.cbegin()) == tab0.cend()); + const std::string tab1("{hoge=1,piyo=2,fuga=3}"); + BOOST_CHECK(is_valid::invoke(tab1.cbegin()) == tab1.cend()); + const std::string tab2("{hoge=1, piyo=2, fuga=3}"); + BOOST_CHECK(is_valid::invoke(tab2.cbegin()) == tab2.cend()); + const std::string tab3("{ hoge=1, piyo=2, fuga=3 }"); + BOOST_CHECK(is_valid::invoke(tab3.cbegin()) == tab3.cend()); + const std::string tab4("{ hoge = 1, piyo = 2, fuga = 3 }"); + BOOST_CHECK(is_valid::invoke(tab4.cbegin()) == tab4.cend()); + const std::string tab5("{hoge = 1, piyo = 2, fuga = 3}"); + BOOST_CHECK(is_valid::invoke(tab5.cbegin()) == tab5.cend()); + const std::string tab6("{hoge = 1, piyo = 2, fuga = 3,}"); + BOOST_CHECK(is_valid::invoke(tab6.cbegin()) == tab6.cend()); + const std::string tab7("{hoge = 1, piyo = 2, fuga = 3, }"); + BOOST_CHECK(is_valid::invoke(tab7.cbegin()) == tab7.cend()); } } @@ -403,5 +441,3 @@ BOOST_AUTO_TEST_CASE(test_array) - - diff --git a/toml/acceptor.hpp b/toml/acceptor.hpp index 572463f..3c2f0e2 100644 --- a/toml/acceptor.hpp +++ b/toml/acceptor.hpp @@ -144,6 +144,8 @@ struct is_chain_of } }; +constexpr inline std::size_t repeat_infinite(){return 0ul;} + template struct is_repeat_of { @@ -167,8 +169,7 @@ struct is_repeat_of }; template -struct is_repeat_of::infinity()> +struct is_repeat_of { typedef typename condT::value_type value_type; @@ -261,14 +262,12 @@ template using is_barekey_component = is_one_of, is_number, is_charactor, is_charactor>; template -using is_barekey = is_repeat_of, - std::numeric_limits::infinity()>; +using is_barekey = is_repeat_of, repeat_infinite()>; template using is_comment = is_chain_of< is_charactor, - is_repeat_of>, - std::numeric_limits::infinity()>, + is_repeat_of>, repeat_infinite()>, is_newline >; @@ -296,7 +295,7 @@ using is_basic_inline_string = is_chain_of< is_charactor, is_ignorable, - std::numeric_limits::infinity()>>, + repeat_infinite()>>, is_charactor > >; @@ -325,7 +324,7 @@ using is_basic_multiline_string = is_chain_of< is_repeat_of, 3>, is_ignorable, - std::numeric_limits::infinity()>>, + repeat_infinite()>>, is_repeat_of, 3> >; @@ -340,7 +339,7 @@ using is_literal_inline_string = is_chain_of< is_charactor, is_ignorable, - std::numeric_limits::infinity()>>, + repeat_infinite()>>, is_charactor > >; @@ -358,7 +357,7 @@ using is_literal_multiline_string = is_chain_of< is_repeat_of, 3>, is_ignorable, - std::numeric_limits::infinity()>>, + repeat_infinite()>>, is_repeat_of, 3> >; @@ -384,7 +383,7 @@ using is_integer = is_chain_of< is_nonzero_number, is_ignorable, - std::numeric_limits::infinity()> + repeat_infinite()> > > > @@ -394,8 +393,7 @@ template using is_fractional_part = is_chain_of< is_charactor, - is_repeat_of, - std::numeric_limits::infinity()> + is_repeat_of, repeat_infinite()> >; template using is_exponent_part = @@ -450,8 +448,7 @@ using is_local_time = is_ignorable< is_chain_of< is_charactor, - is_repeat_of, - std::numeric_limits::infinity()> + is_repeat_of, repeat_infinite()> > > >; @@ -494,7 +491,7 @@ using is_offset_date_time = >; template -using is_elemental_type = +using is_fundamental_type = is_one_of< is_basic_inline_string, is_basic_multiline_string, @@ -513,36 +510,122 @@ template using is_skippable_in_array = is_repeat_of< is_one_of, is_newline, is_comment>, - std::numeric_limits::infinity() + repeat_infinite() >; template -using is_array_component = - is_chain_of< - is_ignorable>, - is_elemental_type, - is_ignorable> +struct is_inline_table; + +template +using is_key = + is_one_of< + is_barekey, + is_basic_inline_string, + is_literal_inline_string >; template -using is_array = - is_chain_of< - is_charactor, - is_ignorable< - is_repeat_of< - is_chain_of, is_charactor>, - std::numeric_limits::infinity() - > - >, - is_ignorable< - is_chain_of< - is_array_component, - is_ignorable> - > - >, - is_ignorable>, - is_charactor - >; +using is_skippable_in_inline_table = + is_repeat_of, repeat_infinite()>; + + +template +struct is_array +{ + typedef charT value_type; + + template::value_type, + value_type>::value>::type> + static Iterator invoke(Iterator iter) + { + typedef is_one_of, + is_array, is_inline_table> is_component; + + typedef is_chain_of< + is_charactor, + is_ignorable< + is_repeat_of< + is_chain_of< + is_ignorable>, + is_component, + is_ignorable>, + is_charactor + >, + repeat_infinite() + > + >, + is_ignorable< + is_chain_of< + is_ignorable>, + is_component, + is_ignorable>, + is_ignorable> + > + >, + is_ignorable>, + is_charactor + > entity; + return entity::invoke(iter); + } +}; + +template +struct is_inline_table +{ + typedef charT value_type; + + template::value_type, + value_type>::value>::type> + static Iterator invoke(Iterator iter) + { + typedef is_one_of, + is_array, is_inline_table> is_component; + typedef is_chain_of< + is_ignorable>, + is_key, + is_ignorable>, + is_charactor, + is_ignorable< + is_repeat_of< + is_chain_of< + is_ignorable>, + is_inline_key_value_pair, + is_ignorable>, + is_charactor + >, + repeat_infinite() + > + >, + is_ignorable< + is_chain_of< + is_ignorable>, + is_inline_key_value_pair, + is_ignorable>, + is_ignorable> + > + >, + is_ignorable>, + is_charactor + > entity; + return entity::invoke(iter); + } +}; + + + + + + + }//toml #endif// TOML11_ACCEPTOR