Skip to content

Commit

Permalink
Implement fmt::format_to into std::vector<char>
Browse files Browse the repository at this point in the history
Signed-off-by: Vladislav Shchapov <vladislav@shchapov.ru>
  • Loading branch information
phprus committed Oct 21, 2024
1 parent e9eaa27 commit e5bbf88
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion include/fmt/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -1971,12 +1971,26 @@ template <typename T = char> class counting_buffer : public buffer<T> {
template <typename T>
struct is_back_insert_iterator<basic_appender<T>> : std::true_type {};


template <typename T, typename It, typename = void>
struct has_container_append : std::false_type {};
template <typename T, typename It>
struct has_container_append<T, It, void_t<decltype( std::declval<T>().append(std::declval<It>(), std::declval<It>()) )>>
: std::true_type {};


// An optimized version of std::copy with the output value type (T).
template <typename T, typename It,
FMT_ENABLE_IF(has_container_append<T, It>::value)>
FMT_CONSTEXPR20 void copy_container_append(T& container, It begin, It end) {
container.append(begin, end);
}

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

Expand Down

0 comments on commit e5bbf88

Please sign in to comment.