Skip to content

Commit

Permalink
Cleanup iterator handling
Browse files Browse the repository at this point in the history
  • Loading branch information
vitaut committed Jan 11, 2024
1 parent c534053 commit e5e94fe
Showing 1 changed file with 20 additions and 18 deletions.
38 changes: 20 additions & 18 deletions include/fmt/format.h
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,21 @@ FMT_INLINE void assume(bool condition) {
#endif
}

template <typename Char, typename InputIt, typename OutputIt>
template <typename Char, typename InputIt>
auto copy_str(InputIt begin, InputIt end, appender out) -> appender {
get_container(out).append(begin, end);
return out;
}

template <typename Char, typename InputIt, typename OutputIt,
FMT_ENABLE_IF(is_back_insert_iterator<OutputIt>::value)>
auto copy_str(InputIt begin, InputIt end, OutputIt out) -> OutputIt {
get_container(out).append(begin, end);
return out;
}

template <typename Char, typename InputIt, typename OutputIt,
FMT_ENABLE_IF(!is_back_insert_iterator<OutputIt>::value)>
FMT_CONSTEXPR auto copy_str(InputIt begin, InputIt end, OutputIt out)
-> OutputIt {
while (begin != end) *out++ = static_cast<Char>(*begin++);
Expand All @@ -532,19 +546,6 @@ FMT_CONSTEXPR auto copy_str(T* begin, T* end, U* out) -> U* {
return out + size;
}

template <typename Char, typename InputIt>
auto copy_str(InputIt begin, InputIt end, appender out) -> appender {
get_container(out).append(begin, end);
return out;
}
template <typename Char, typename InputIt>
auto copy_str(InputIt begin, InputIt end,
std::back_insert_iterator<std::string> out)
-> std::back_insert_iterator<std::string> {
get_container(out).append(begin, end);
return out;
}

template <typename Char, typename R, typename OutputIt>
FMT_CONSTEXPR auto copy_str(R&& rng, OutputIt out) -> OutputIt {
return detail::copy_str<Char>(rng.begin(), rng.end(), out);
Expand All @@ -567,14 +568,15 @@ inline auto get_data(Container& c) -> typename Container::value_type* {

// Attempts to reserve space for n extra characters in the output range.
// Returns a pointer to the reserved range or a reference to it.
template <typename Container, FMT_ENABLE_IF(is_contiguous<Container>::value)>
template <typename OutputIt,
FMT_ENABLE_IF(is_back_insert_iterator<OutputIt>::value&&
is_contiguous<typename OutputIt::container>::value)>
#if FMT_CLANG_VERSION >= 307 && !FMT_ICC_VERSION
__attribute__((no_sanitize("undefined")))
#endif
inline auto
reserve(std::back_insert_iterator<Container> it, size_t n) ->
typename Container::value_type* {
Container& c = get_container(it);
reserve(OutputIt it, size_t n) -> typename OutputIt::value_type* {
auto& c = get_container(it);
size_t size = c.size();
c.resize(size + n);
return get_data(c) + size;
Expand Down

0 comments on commit e5e94fe

Please sign in to comment.