1 //  Boost string_algo library formatter.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_FORMATTER_DETAIL_HPP
12 #define BOOST_STRING_FORMATTER_DETAIL_HPP
13 
14 
15 #include <boost/range/iterator_range_core.hpp>
16 #include <boost/range/begin.hpp>
17 #include <boost/range/end.hpp>
18 #include <boost/range/const_iterator.hpp>
19 
20 #include <boost/algorithm/string/detail/util.hpp>
21 
22 //  generic replace functors -----------------------------------------------//
23 
24 namespace boost {
25     namespace algorithm {
26         namespace detail {
27 
28 //  const format functor ----------------------------------------------------//
29 
30             // constant format functor
31             template<typename RangeT>
32             struct const_formatF
33             {
34             private:
35                 typedef BOOST_STRING_TYPENAME
36                     range_const_iterator<RangeT>::type format_iterator;
37                 typedef iterator_range<format_iterator> result_type;
38 
39             public:
40                 // Construction
const_formatFboost::algorithm::detail::const_formatF41                 const_formatF(const RangeT& Format) :
42                     m_Format(::boost::begin(Format), ::boost::end(Format)) {}
43 
44                 // Operation
45 #if BOOST_WORKAROUND(BOOST_BORLANDC, BOOST_TESTED_AT(0x564))
46                 template<typename Range2T>
operator ()boost::algorithm::detail::const_formatF47                 result_type& operator()(const Range2T&)
48                 {
49                     return m_Format;
50                 }
51 #endif
52 
53                 template<typename Range2T>
operator ()boost::algorithm::detail::const_formatF54                 const result_type& operator()(const Range2T&) const
55                 {
56                     return m_Format;
57                 }
58 
59             private:
60                 result_type m_Format;
61             };
62 
63 //  identity format functor ----------------------------------------------------//
64 
65             // identity format functor
66             template<typename RangeT>
67             struct identity_formatF
68             {
69                 // Operation
70                 template< typename Range2T >
operator ()boost::algorithm::detail::identity_formatF71                 const RangeT& operator()(const Range2T& Replace) const
72                 {
73                     return RangeT(::boost::begin(Replace), ::boost::end(Replace));
74                 }
75             };
76 
77 //  empty format functor ( used by erase ) ------------------------------------//
78 
79             // empty format functor
80             template< typename CharT >
81             struct empty_formatF
82             {
83                 template< typename ReplaceT >
operator ()boost::algorithm::detail::empty_formatF84                 empty_container<CharT> operator()(const ReplaceT&) const
85                 {
86                     return empty_container<CharT>();
87                 }
88             };
89 
90 //  dissect format functor ----------------------------------------------------//
91 
92             // dissect format functor
93             template<typename FinderT>
94             struct dissect_formatF
95             {
96             public:
97                 // Construction
dissect_formatFboost::algorithm::detail::dissect_formatF98                 dissect_formatF(FinderT Finder) :
99                   m_Finder(Finder) {}
100 
101                   // Operation
102                   template<typename RangeT>
103                   inline iterator_range<
104                       BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type>
operator ()boost::algorithm::detail::dissect_formatF105                   operator()(const RangeT& Replace) const
106                   {
107                       return m_Finder(::boost::begin(Replace), ::boost::end(Replace));
108                   }
109 
110             private:
111                 FinderT m_Finder;
112             };
113 
114 
115         } // namespace detail
116     } // namespace algorithm
117 } // namespace boost
118 
119 #endif  // BOOST_STRING_FORMATTER_DETAIL_HPP
120