inline typename range_value<SequenceSequenceT>::type join( const SequenceSequenceT& Input, const Range1T& Separator) { // Define working types typedef typename range_value<SequenceSequenceT>::type ResultT; typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; // Parse input InputIteratorT itBegin=::boost::begin(Input); InputIteratorT itEnd=::boost::end(Input); // Construct container to hold the result ResultT Result; // Append first element if(itBegin!=itEnd) { detail::insert(Result, ::boost::end(Result), *itBegin); ++itBegin; } for(;itBegin!=itEnd; ++itBegin) { // Add separator detail::insert(Result, ::boost::end(Result), as_literal(Separator)); // Add element detail::insert(Result, ::boost::end(Result), *itBegin); } return Result; }
inline detail::is_any_ofF< BOOST_STRING_TYPENAME range_value<RangeT>::type> is_any_of( const RangeT& Set ) { return detail::is_any_ofF< BOOST_STRING_TYPENAME range_value<RangeT>::type>(as_literal(Set)); }
inline detail::const_formatF< iterator_range< BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> > const_formatter(const RangeT& Format) { return detail::const_formatF< iterator_range< BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >(as_literal(Format)); }
inline detail::last_finderF< BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type, PredicateT> last_finder( const RangeT& Search, PredicateT Comp ) { return detail::last_finderF< BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type, PredicateT>( as_literal(Search), Comp ) ; }
inline detail::last_finderF< BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type, is_equal> last_finder( const RangeT& Search ) { return detail::last_finderF< BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type, is_equal>( as_literal(Search), is_equal() ); }
inline typename range_value<SequenceSequenceT>::type join_if_regex( const SequenceSequenceT& Input, const Range1T& Separator, const basic_regex<CharT, RegexTraitsT>& Rx, match_flag_type Flags=match_default ) { // Define working types typedef typename range_value<SequenceSequenceT>::type ResultT; typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; // Parse input InputIteratorT itBegin=::boost::begin(Input); InputIteratorT itEnd=::boost::end(Input); // Construct container to hold the result ResultT Result; // Roll to the first element that will be added while( itBegin!=itEnd && !regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin; // Add this element if(itBegin!=itEnd) { detail::insert(Result, ::boost::end(Result), *itBegin); ++itBegin; } for(;itBegin!=itEnd; ++itBegin) { if(regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) { // Add separator detail::insert(Result, ::boost::end(Result), as_literal(Separator)); // Add element detail::insert(Result, ::boost::end(Result), *itBegin); } } return Result; }
inline SequenceSequenceT& iter_find( SequenceSequenceT& Result, RangeT& Input, FinderT Finder ) { function_requires< FinderConcept<FinderT, BOOST_STRING_TYPENAME range_iterator<RangeT>::type> >(); iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input)); typedef BOOST_STRING_TYPENAME range_iterator<RangeT>::type input_iterator_type; typedef find_iterator<input_iterator_type> find_iterator_type; typedef detail::copy_iterator_rangeF< BOOST_STRING_TYPENAME range_value<SequenceSequenceT>::type, input_iterator_type> copy_range_type; input_iterator_type InputEnd=end(lit_input); typedef transform_iterator<copy_range_type, find_iterator_type> transform_iter_type; transform_iter_type itBegin= make_transform_iterator( find_iterator_type( begin(lit_input), InputEnd, Finder ), copy_range_type()); transform_iter_type itEnd= make_transform_iterator( find_iterator_type(), copy_range_type()); SequenceSequenceT Tmp(itBegin, itEnd); Result.swap(Tmp); return Result; }
inline typename range_value<SequenceSequenceT>::type join_if( const SequenceSequenceT& Input, const Range1T& Separator, PredicateT Pred) { // Define working types typedef typename range_value<SequenceSequenceT>::type ResultT; typedef typename range_const_iterator<SequenceSequenceT>::type InputIteratorT; // Parse input InputIteratorT itBegin=::boost::begin(Input); InputIteratorT itEnd=::boost::end(Input); // Construct container to hold the result ResultT Result; // Roll to the first element that will be added while(itBegin!=itEnd && !Pred(*itBegin)) ++itBegin; // Add this element if(itBegin!=itEnd) { detail::insert(Result, ::boost::end(Result), *itBegin); ++itBegin; } for(;itBegin!=itEnd; ++itBegin) { if(Pred(*itBegin)) { // Add separator detail::insert(Result, ::boost::end(Result), as_literal(Separator)); // Add element detail::insert(Result, ::boost::end(Result), *itBegin); } } return Result; }
inline bool starts_with( const Range1T& Input, const Range2T& Test, PredicateT Comp) { iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input)); iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test)); typedef BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type Iterator1T; typedef BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type Iterator2T; Iterator1T InputEnd=end(lit_input); Iterator2T TestEnd=end(lit_test); Iterator1T it=begin(lit_input); Iterator2T pit=begin(lit_test); for(; it!=InputEnd && pit!=TestEnd; ++it,++pit) { if( !(Comp(*it,*pit)) ) return false; } return pit==TestEnd; }
inline iterator_range< BOOST_STRING_TYPENAME range_iterator<RangeT>::type> find( RangeT& Input, const FinderT& Finder) { iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input)); return Finder(begin(lit_input),end(lit_input)); }
split_iterator( RangeT& Col, FinderT Finder ) : detail::find_iterator_base<IteratorT>(Finder,0), m_bEof(false) { iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col)); m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col)); m_Next=::boost::begin(lit_col); m_End=::boost::end(lit_col); increment(); }
inline iterator_range< BOOST_STRING_TYPENAME range_iterator<RangeT>::type > find_regex( RangeT& Input, const basic_regex<CharT, RegexTraitsT>& Rx, match_flag_type Flags=match_default ) { iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input)); return regex_finder(Rx,Flags)( ::boost::begin(lit_input), ::boost::end(lit_input) ); }
inline OutputIteratorT trim_left_copy_if( OutputIteratorT Output, const RangeT& Input, PredicateT IsSpace) { iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(as_literal(Input)); std::copy( ::boost::algorithm::detail::trim_begin( ::boost::begin(lit_range), ::boost::end(lit_range), IsSpace ), ::boost::end(lit_range), Output); return Output; }
inline bool all( const RangeT& Input, PredicateT Pred) { iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(as_literal(Input)); typedef BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type Iterator1T; Iterator1T InputEnd=end(lit_input); for( Iterator1T It=begin(lit_input); It!=InputEnd; ++It) { if (!Pred(*It)) return false; } return true; }
inline bool lexicographical_compare( const Range1T& Arg1, const Range2T& Arg2, PredicateT Pred) { iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_arg1(as_literal(Arg1)); iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_arg2(as_literal(Arg2)); return std::lexicographical_compare( begin(lit_arg1), end(lit_arg1), begin(lit_arg2), end(lit_arg2), Pred); }
inline bool contains( const Range1T& Input, const Range2T& Test, PredicateT Comp) { iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input)); iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test)); if (empty(lit_test)) { // Empty range is contained always return true; } // Use the temporary variable to make VACPP happy bool bResult=(first_finder(lit_test,Comp)(begin(lit_input), end(lit_input))); return bResult; }
inline bool ends_with( const Range1T& Input, const Range2T& Test, PredicateT Comp) { iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input)); iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test)); typedef BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type Iterator1T; typedef BOOST_STRING_TYPENAME boost::detail:: iterator_traits<Iterator1T>::iterator_category category; return detail:: ends_with_iter_select( begin(lit_input), end(lit_input), begin(lit_test), end(lit_test), Comp, category()); }