1 // Boost string_algo library util.hpp header file ---------------------------// 2 3 // Copyright Pavol Droba 2002-2003. 4 // 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 9 // See http://www.boost.org/ for updates, documentation, and revision history. 10 11 #ifndef BOOST_STRING_UTIL_DETAIL_HPP 12 #define BOOST_STRING_UTIL_DETAIL_HPP 13 14 #include <boost/algorithm/string/config.hpp> 15 #include <functional> 16 #include <boost/range/iterator_range.hpp> 17 18 namespace boost { 19 namespace algorithm { 20 namespace detail { 21 22 // empty container -----------------------------------------------// 23 24 // empty_container 25 /* 26 This class represents always empty container, 27 containing elements of type CharT. 28 29 It is supposed to be used in a const version only 30 */ 31 template< typename CharT > 32 struct empty_container 33 { 34 typedef empty_container<CharT> type; 35 typedef CharT value_type; 36 typedef std::size_t size_type; 37 typedef std::ptrdiff_t difference_type; 38 typedef const value_type& reference; 39 typedef const value_type& const_reference; 40 typedef const value_type* iterator; 41 typedef const value_type* const_iterator; 42 43 44 // Operations beginboost::algorithm::detail::empty_container45 const_iterator begin() const 46 { 47 return reinterpret_cast<const_iterator>(0); 48 } 49 endboost::algorithm::detail::empty_container50 const_iterator end() const 51 { 52 return reinterpret_cast<const_iterator>(0); 53 } 54 emptyboost::algorithm::detail::empty_container55 bool empty() const 56 { 57 return false; 58 } 59 sizeboost::algorithm::detail::empty_container60 size_type size() const 61 { 62 return 0; 63 } 64 }; 65 66 // bounded copy algorithm -----------------------------------------------// 67 68 // Bounded version of the std::copy algorithm 69 template<typename InputIteratorT, typename OutputIteratorT> bounded_copy(InputIteratorT First,InputIteratorT Last,OutputIteratorT DestFirst,OutputIteratorT DestLast)70 inline OutputIteratorT bounded_copy( 71 InputIteratorT First, 72 InputIteratorT Last, 73 OutputIteratorT DestFirst, 74 OutputIteratorT DestLast ) 75 { 76 InputIteratorT InputIt=First; 77 OutputIteratorT OutputIt=DestFirst; 78 for(; InputIt!=Last && OutputIt!=DestLast; InputIt++, OutputIt++ ) 79 { 80 *OutputIt=*InputIt; 81 } 82 83 return OutputIt; 84 } 85 86 // iterator range utilities -----------------------------------------// 87 88 // copy range functor 89 template< 90 typename SeqT, 91 typename IteratorT=BOOST_STRING_TYPENAME SeqT::const_iterator > 92 struct copy_iterator_rangeF : 93 public std::unary_function< iterator_range<IteratorT>, SeqT > 94 { operator ()boost::algorithm::detail::copy_iterator_rangeF95 SeqT operator()( const iterator_range<IteratorT>& Range ) const 96 { 97 return copy_range<SeqT>(Range); 98 } 99 }; 100 101 } // namespace detail 102 } // namespace algorithm 103 } // namespace boost 104 105 106 #endif // BOOST_STRING_UTIL_DETAIL_HPP 107