Skip to content

Commit dc37846

Browse files
authored
Merge pull request #28 from acd1034/refactor2
Refactor code
2 parents a25b4b9 + a211188 commit dc37846

File tree

1 file changed

+34
-31
lines changed

1 file changed

+34
-31
lines changed

include/strtpl/string_template.hpp

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -194,31 +194,32 @@ namespace strtpl {
194194
throw std::runtime_error(std::move(msg));
195195
}
196196

197-
template <class CharT>
198-
struct string_template {
199-
using char_type = CharT;
200-
201-
std::basic_string_view<CharT> delimiter{};
202-
std::basic_string_view<CharT> idpattern{};
203-
std::basic_string_view<CharT> braceidpattern{};
204-
const std::basic_string_view<CharT> invalid{TYPED_LITERAL(CharT, "()")};
197+
template <class CharT, class ST = std::char_traits<CharT>>
198+
struct basic_string_template {
199+
private:
200+
std::basic_string_view<CharT, ST> delimiter{};
201+
std::basic_string_view<CharT, ST> idpattern{};
202+
std::basic_string_view<CharT, ST> braceidpattern{};
203+
const std::basic_string_view<CharT, ST> invalid{TYPED_LITERAL(CharT, "()")};
205204
std::regex_constants::match_flag_type flags = std::regex_constants::match_default;
206205

207-
string_template() = default;
206+
public:
207+
basic_string_template() = default;
208208
// clang-format off
209-
constexpr string_template(std::basic_string_view<CharT> delim,
210-
std::basic_string_view<CharT> id)
209+
constexpr basic_string_template(std::basic_string_view<CharT, ST> delim,
210+
std::basic_string_view<CharT, ST> id)
211211
: delimiter{delim}, idpattern{id}, braceidpattern{id} {}
212-
constexpr string_template(std::basic_string_view<CharT> delim,
213-
std::basic_string_view<CharT> id,
214-
std::basic_string_view<CharT> bid,
215-
std::regex_constants::match_flag_type f = std::regex_constants::match_default)
212+
constexpr basic_string_template(std::basic_string_view<CharT, ST> delim,
213+
std::basic_string_view<CharT, ST> id,
214+
std::basic_string_view<CharT, ST> bid,
215+
std::regex_constants::match_flag_type f = std::regex_constants::match_default)
216216
: delimiter{delim}, idpattern{id}, braceidpattern{bid}, flags{f} {}
217217
// clang-format on
218218

219219
// clang-format off
220-
template <class ST, class Map>
221-
requires map_with_key_type<Map, std::basic_string_view<CharT, ST>>
220+
template <class Map>
221+
requires map_with_key_type<Map, std::basic_string_view<CharT, ST>> and std::convertible_to<
222+
map_mapped_t<Map, std::basic_string_view<CharT, ST>>, std::basic_string_view<CharT, ST>>
222223
std::basic_string<CharT, ST>
223224
// clang-format on
224225
operator()(std::basic_string_view<CharT, ST> s, const Map& map) const {
@@ -231,20 +232,19 @@ namespace strtpl {
231232
+ invalid + TYPED_LITERAL(CharT, ")");
232233
}()};
233234

234-
const auto convert =
235-
[&delim = delimiter, first = s.begin(),
236-
&map](const std::match_results<typename std::basic_string_view<CharT, ST>::iterator>& mo)
237-
-> std::remove_cvref_t<map_mapped_t<Map, std::basic_string_view<CharT, ST>>> {
235+
using string_view_type = std::basic_string_view<CharT, ST>;
236+
const auto convert = [&delim = delimiter, first = s.begin(), &map](
237+
const std::match_results<typename string_view_type::iterator>& mo) {
238238
if (mo[1].matched) {
239-
std::basic_string_view<CharT, ST> key(std::to_address(mo[1].first),
240-
static_cast<std::size_t>(mo[1].length()));
241-
return at(map, key);
239+
string_view_type key(std::to_address(mo[1].first),
240+
static_cast<std::size_t>(mo[1].length()));
241+
return string_view_type(at(map, key));
242242
} else if (mo[2].matched) {
243-
std::basic_string_view<CharT, ST> key(std::to_address(mo[2].first),
244-
static_cast<std::size_t>(mo[2].length()));
245-
return at(map, key);
243+
string_view_type key(std::to_address(mo[2].first),
244+
static_cast<std::size_t>(mo[2].length()));
245+
return string_view_type(at(map, key));
246246
} else if (mo[3].matched) {
247-
return delim;
247+
return string_view_type(delim.data(), delim.length());
248248
} else if (mo[4].matched) {
249249
_invalid(first, mo.prefix().second);
250250
}
@@ -253,12 +253,15 @@ namespace strtpl {
253253

254254
return regex_replace_fn(s, re, convert, flags);
255255
}
256-
}; // struct string_template
256+
}; // struct basic_string_template
257+
258+
using string_template = basic_string_template<char>;
259+
using wstring_template = basic_string_template<wchar_t>;
257260

258261
inline namespace cpo {
259262
// See https://github.com/python/cpython/blob/971343eb569a3418aa9a0bad9b638cccf1470ef8/Lib/string.py#L57
260-
inline constexpr string_template<char> substitute{"$", "([_a-zA-Z][_a-zA-Z0-9]*)"};
261-
inline constexpr string_template<wchar_t> wsubstitute{L"$", L"([_a-zA-Z][_a-zA-Z0-9]*)"};
263+
inline constexpr string_template substitute{"$", "([_a-zA-Z][_a-zA-Z0-9]*)"};
264+
inline constexpr wstring_template wsubstitute{L"$", L"([_a-zA-Z][_a-zA-Z0-9]*)"};
262265
} // namespace cpo
263266

264267
#undef TYPED_LITERAL

0 commit comments

Comments
 (0)