#ifndef TOML11_ACCEPTOR #define TOML11_ACCEPTOR #include #include #include #include "exception.hpp" namespace toml { template struct is_charactor { typedef charT value_type; constexpr static value_type target = c; template::value_type, value_type>::value>::type> constexpr static Iterator invoke(Iterator iter) { return *iter == c ? std::next(iter) : iter; } }; template struct is_in_range { typedef charT value_type; constexpr static value_type upper = up; constexpr static value_type lower = lw; static_assert(lower <= upper, "lower <= upper"); template::value_type, value_type>::value>::type> constexpr static Iterator invoke(Iterator iter) { return (lower <= *iter && *iter <= upper) ? std::next(iter) : iter; } }; template struct is_one_of { typedef typename headT::value_type value_type; static_assert( std::is_same::value_type>::value, "different value_type"); template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { const Iterator tmp = headT::invoke(iter); return (tmp != iter) ? tmp : is_one_of::invoke(iter); } }; template struct is_one_of { typedef typename tailT::value_type value_type; template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { const Iterator tmp = tailT::invoke(iter); return (tmp != iter) ? tmp : iter; } }; // just a wrapper for maybe_ignored template struct is_ignorable { typedef typename condT::value_type value_type; template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { const Iterator tmp = condT::invoke(iter); return (tmp != iter) ? tmp : iter; } }; template struct maybe_ignored : std::false_type{}; template struct maybe_ignored> : std::true_type{}; template struct is_chain_of_impl { typedef typename headT::value_type value_type; static_assert(std::is_same::value_type>::value, "different value_type"); constexpr static bool ignorable = maybe_ignored::value; template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter, Iterator rollback) { const Iterator tmp = headT::invoke(iter); return (tmp == iter && not ignorable) ? rollback : is_chain_of_impl::invoke(tmp, rollback); } }; template struct is_chain_of_impl { typedef typename tailT::value_type value_type; constexpr static bool ignorable = maybe_ignored::value; template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter, Iterator rollback) { const Iterator tmp = tailT::invoke(iter); return (tmp == iter) ? (ignorable ? iter : rollback) : tmp; } }; template struct is_chain_of { typedef typename is_chain_of_impl::value_type value_type; template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { return is_chain_of_impl::invoke(iter, iter); } }; template struct is_repeat_of { typedef typename condT::value_type value_type; template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { const Iterator rollback = iter; Iterator tmp; for(auto i=0ul; i struct is_repeat_of::infinity()> { typedef typename condT::value_type value_type; template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { Iterator tmp = condT::invoke(iter); while(tmp != iter) { iter = tmp; tmp = condT::invoke(iter); } return iter; } }; template struct is_none_of { typedef typename headT::value_type value_type; static_assert( std::is_same::value_type>::value, "different value_type"); template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { const Iterator tmp = headT::invoke(iter); return (tmp != iter) ? iter : is_none_of::invoke(iter); } }; template struct is_none_of { typedef typename tailT::value_type value_type; template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { const Iterator tmp = tailT::invoke(iter); return (tmp != iter) ? iter : std::next(iter); } }; template struct is_not_but { typedef typename notT::value_type value_type; static_assert( std::is_same::value, "different value type"); template::value_type, value_type>::value>::type> static Iterator invoke(Iterator iter) { return (iter != notT::invoke(iter)) ? iter : butT::invoke(iter); } }; template using is_space = is_charactor; template using is_tab = is_charactor; template using is_number = is_in_range; template using is_lowercase = is_in_range; template using is_uppercase = is_in_range; template using is_alphabet = is_one_of, is_uppercase>; template using is_hex = is_one_of, is_in_range, is_in_range>; template using is_whitespace = is_one_of, is_tab>; template using is_newline = is_one_of, is_chain_of, is_charactor>>; 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()>; template using is_comment = is_chain_of< is_charactor, is_repeat_of>, std::numeric_limits::infinity()>, is_newline >; template using is_basic_inline_string_component = is_one_of< is_none_of< is_in_range, is_charactor, is_charactor, is_newline>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor, is_repeat_of, 4>>, is_chain_of, is_charactor, is_repeat_of, 8>> >; template using is_basic_inline_string = is_not_but< is_repeat_of, 3>, // not multiline is_chain_of< is_charactor, is_ignorable, std::numeric_limits::infinity()>>, is_charactor > >; template using is_basic_multiline_string_component = is_one_of< is_none_of< is_in_range, is_repeat_of, 3>, is_charactor>, is_newline, is_chain_of, is_newline>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor>, is_chain_of, is_charactor, is_repeat_of, 4>>, is_chain_of, is_charactor, is_repeat_of, 8>> >; template using is_basic_multiline_string = is_chain_of< is_repeat_of, 3>, is_ignorable, std::numeric_limits::infinity()>>, is_repeat_of, 3> >; template using is_literal_inline_string_component = is_none_of, is_charactor>; template using is_literal_inline_string = is_not_but< is_repeat_of, 3>, is_chain_of< is_charactor, is_ignorable, std::numeric_limits::infinity()>>, is_charactor > >; template using is_literal_multiline_string_component = is_one_of< is_none_of, is_repeat_of, 3>>, is_newline >; template using is_literal_multiline_string = is_chain_of< is_repeat_of, 3>, is_ignorable, std::numeric_limits::infinity()>>, is_repeat_of, 3> >; template using is_sign = is_one_of, is_charactor>; template using is_nonzero_number = is_in_range; template using is_integer_component = is_not_but< is_repeat_of, 2>, is_one_of< is_charactor, is_number > >; template using is_integer = is_chain_of< is_ignorable>, is_one_of< is_charactor, is_chain_of< is_nonzero_number, is_ignorable, std::numeric_limits::infinity()> > > > >; template using is_fractional_part = is_chain_of< is_charactor, is_repeat_of, std::numeric_limits::infinity()> >; template using is_exponent_part = is_chain_of< is_one_of, is_charactor>, is_integer >; template using is_float = is_one_of< is_chain_of< is_integer, is_fractional_part, is_exponent_part >, is_chain_of< is_integer, is_fractional_part >, is_chain_of< is_integer, is_exponent_part > >; template using is_boolean = is_one_of< is_chain_of< is_charactor, is_charactor, is_charactor, is_charactor >, is_chain_of< is_charactor, is_charactor, is_charactor, is_charactor, is_charactor > >; template using is_local_time = is_chain_of< is_repeat_of, 2>, is_charactor, is_repeat_of, 2>, is_charactor, is_repeat_of, 2>, is_ignorable< is_chain_of< is_charactor, is_repeat_of, std::numeric_limits::infinity()> > > >; template using is_local_date = is_chain_of< is_repeat_of, 4>, is_charactor, is_repeat_of, 2>, is_charactor, is_repeat_of, 2> >; template using is_local_date_time = is_chain_of< is_local_date, is_charactor, is_local_time >; template using is_offset = is_one_of< is_charactor, is_chain_of< is_sign, is_repeat_of, 2>, is_charactor, is_repeat_of, 2> > >; template using is_offset_date_time = is_chain_of< is_local_date_time, is_offset >; template using is_elemental_type = is_one_of< is_basic_inline_string, is_basic_multiline_string, is_literal_inline_string, is_literal_multiline_string, is_integer, is_float, is_boolean, is_offset_date_time, is_local_date_time, is_local_date, is_local_time >; template using is_skippable_in_array = is_repeat_of< is_one_of, is_newline, is_comment>, std::numeric_limits::infinity() >; template using is_array_component = is_chain_of< is_ignorable>, is_elemental_type, is_ignorable> >; 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 >; }//toml #endif// TOML11_ACCEPTOR