// Copyright (c) 2025 Joaquin M Lopez Munoz // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // Compliance with Boost.ConceptCheck/C++20 iterator concepts #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include template struct unparens; template struct unparens { typedef T type; }; #define UNPARENS(ParensedArg) typename unparens::type #if !defined(BOOST_NO_CXX20_HDR_CONCEPTS) #include #define STATIC_ASSERT_OUTPUT_ITERATOR(ParensedIt, T) \ static_assert(std::output_iterator); #define STATIC_ASSERT_FORWARD_ITERATOR(ParensedIt) \ static_assert(std::forward_iterator); #define STATIC_ASSERT_RANDOM_ACCESS_ITERATOR(ParensedIt) \ static_assert(std::random_access_iterator); #else #include #include #define STATIC_ASSERT_OUTPUT_ITERATOR(ParensedIt, T) \ BOOST_CONCEPT_ASSERT((boost::OutputIterator)); #define STATIC_ASSERT_FORWARD_ITERATOR(ParensedIt) \ BOOST_CONCEPT_ASSERT((boost::ForwardIterator)); #define STATIC_ASSERT_RANDOM_ACCESS_ITERATOR(ParensedIt) \ BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator)); #endif STATIC_ASSERT_RANDOM_ACCESS_ITERATOR(( BOOST_SPIRIT_CLASSIC_NS::file_iterator<>)); STATIC_ASSERT_RANDOM_ACCESS_ITERATOR(( BOOST_SPIRIT_CLASSIC_NS::fixed_size_queue::iterator)); STATIC_ASSERT_RANDOM_ACCESS_ITERATOR(( BOOST_SPIRIT_CLASSIC_NS::fixed_size_queue::const_iterator)); STATIC_ASSERT_FORWARD_ITERATOR(( BOOST_SPIRIT_CLASSIC_NS::multi_pass>)); STATIC_ASSERT_FORWARD_ITERATOR(( BOOST_SPIRIT_CLASSIC_NS::position_iterator)); STATIC_ASSERT_FORWARD_ITERATOR(( BOOST_SPIRIT_CLASSIC_NS::position_iterator2)); STATIC_ASSERT_OUTPUT_ITERATOR( (boost::spirit::karma::ostream_iterator), char); STATIC_ASSERT_FORWARD_ITERATOR(( boost::spirit::lex::lexertl::lexer< boost::spirit::lex::lexertl::token< std::string::iterator, boost::mpl::vector, boost::mpl::false_>>::iterator_type)); STATIC_ASSERT_FORWARD_ITERATOR(( boost::spirit::istream_iterator)); STATIC_ASSERT_FORWARD_ITERATOR(( boost::spirit::line_pos_iterator>)); STATIC_ASSERT_FORWARD_ITERATOR(( boost::spirit::look_ahead, 10>)); STATIC_ASSERT_FORWARD_ITERATOR(( boost::spirit::multi_pass< std::istream_iterator, boost::spirit::iterator_policies::default_policy< boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::input_iterator, boost::spirit::iterator_policies::fixed_size_queue<10>>>)); STATIC_ASSERT_OUTPUT_ITERATOR( (boost::spirit::ostream_iterator), char);