Line data Source code
1 : // Boost string_algo library find_format.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_FIND_FORMAT_DETAIL_HPP
12 : #define BOOST_STRING_FIND_FORMAT_DETAIL_HPP
13 :
14 : #include <boost/algorithm/string/config.hpp>
15 : #include <boost/range/iterator_range_core.hpp>
16 : #include <boost/range/const_iterator.hpp>
17 : #include <boost/range/iterator.hpp>
18 : #include <boost/algorithm/string/detail/find_format_store.hpp>
19 : #include <boost/algorithm/string/detail/replace_storage.hpp>
20 :
21 : namespace boost {
22 : namespace algorithm {
23 : namespace detail {
24 :
25 : // find_format_copy (iterator variant) implementation -------------------------------//
26 :
27 : template<
28 : typename OutputIteratorT,
29 : typename InputT,
30 : typename FormatterT,
31 : typename FindResultT,
32 : typename FormatResultT >
33 : inline OutputIteratorT find_format_copy_impl2(
34 : OutputIteratorT Output,
35 : const InputT& Input,
36 : FormatterT Formatter,
37 : const FindResultT& FindResult,
38 : const FormatResultT& FormatResult )
39 : {
40 : typedef find_format_store<
41 : BOOST_STRING_TYPENAME
42 : range_const_iterator<InputT>::type,
43 : FormatterT,
44 : FormatResultT > store_type;
45 :
46 : // Create store for the find result
47 : store_type M( FindResult, FormatResult, Formatter );
48 :
49 : if ( !M )
50 : {
51 : // Match not found - return original sequence
52 : Output = std::copy( ::boost::begin(Input), ::boost::end(Input), Output );
53 : return Output;
54 : }
55 :
56 : // Copy the beginning of the sequence
57 : Output = std::copy( ::boost::begin(Input), ::boost::begin(M), Output );
58 : // Format find result
59 : // Copy formatted result
60 : Output = std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output );
61 : // Copy the rest of the sequence
62 : Output = std::copy( M.end(), ::boost::end(Input), Output );
63 :
64 : return Output;
65 : }
66 :
67 : template<
68 : typename OutputIteratorT,
69 : typename InputT,
70 : typename FormatterT,
71 : typename FindResultT >
72 : inline OutputIteratorT find_format_copy_impl(
73 : OutputIteratorT Output,
74 : const InputT& Input,
75 : FormatterT Formatter,
76 : const FindResultT& FindResult )
77 : {
78 : if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
79 : return ::boost::algorithm::detail::find_format_copy_impl2(
80 : Output,
81 : Input,
82 : Formatter,
83 : FindResult,
84 : Formatter(FindResult) );
85 : } else {
86 : return std::copy( ::boost::begin(Input), ::boost::end(Input), Output );
87 : }
88 : }
89 :
90 :
91 : // find_format_copy implementation --------------------------------------------------//
92 :
93 : template<
94 : typename InputT,
95 : typename FormatterT,
96 : typename FindResultT,
97 : typename FormatResultT >
98 0 : inline InputT find_format_copy_impl2(
99 : const InputT& Input,
100 : FormatterT Formatter,
101 : const FindResultT& FindResult,
102 : const FormatResultT& FormatResult)
103 : {
104 : typedef find_format_store<
105 : BOOST_STRING_TYPENAME
106 : range_const_iterator<InputT>::type,
107 : FormatterT,
108 : FormatResultT > store_type;
109 :
110 : // Create store for the find result
111 0 : store_type M( FindResult, FormatResult, Formatter );
112 :
113 0 : if ( !M )
114 : {
115 : // Match not found - return original sequence
116 0 : return InputT( Input );
117 : }
118 :
119 0 : InputT Output;
120 : // Copy the beginning of the sequence
121 0 : boost::algorithm::detail::insert( Output, ::boost::end(Output), ::boost::begin(Input), M.begin() );
122 : // Copy formatted result
123 0 : boost::algorithm::detail::insert( Output, ::boost::end(Output), M.format_result() );
124 : // Copy the rest of the sequence
125 0 : boost::algorithm::detail::insert( Output, ::boost::end(Output), M.end(), ::boost::end(Input) );
126 :
127 0 : return Output;
128 : }
129 :
130 : template<
131 : typename InputT,
132 : typename FormatterT,
133 : typename FindResultT >
134 0 : inline InputT find_format_copy_impl(
135 : const InputT& Input,
136 : FormatterT Formatter,
137 : const FindResultT& FindResult)
138 : {
139 0 : if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
140 : return ::boost::algorithm::detail::find_format_copy_impl2(
141 : Input,
142 : Formatter,
143 : FindResult,
144 0 : Formatter(FindResult) );
145 : } else {
146 0 : return Input;
147 : }
148 : }
149 :
150 : // replace implementation ----------------------------------------------------//
151 :
152 : template<
153 : typename InputT,
154 : typename FormatterT,
155 : typename FindResultT,
156 : typename FormatResultT >
157 : inline void find_format_impl2(
158 : InputT& Input,
159 : FormatterT Formatter,
160 : const FindResultT& FindResult,
161 : const FormatResultT& FormatResult)
162 : {
163 : typedef find_format_store<
164 : BOOST_STRING_TYPENAME
165 : range_iterator<InputT>::type,
166 : FormatterT,
167 : FormatResultT > store_type;
168 :
169 : // Create store for the find result
170 : store_type M( FindResult, FormatResult, Formatter );
171 :
172 : if ( !M )
173 : {
174 : // Search not found - return original sequence
175 : return;
176 : }
177 :
178 : // Replace match
179 : ::boost::algorithm::detail::replace( Input, M.begin(), M.end(), M.format_result() );
180 : }
181 :
182 : template<
183 : typename InputT,
184 : typename FormatterT,
185 : typename FindResultT >
186 : inline void find_format_impl(
187 : InputT& Input,
188 : FormatterT Formatter,
189 : const FindResultT& FindResult)
190 : {
191 : if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
192 : ::boost::algorithm::detail::find_format_impl2(
193 : Input,
194 : Formatter,
195 : FindResult,
196 : Formatter(FindResult) );
197 : }
198 : }
199 :
200 : } // namespace detail
201 : } // namespace algorithm
202 : } // namespace boost
203 :
204 : #endif // BOOST_STRING_FIND_FORMAT_DETAIL_HPP
|