Remove dependency on back_insert_iterator

This commit is contained in:
Victor Zverovich
2024-01-03 05:59:48 -08:00
parent c9d233c0a4
commit f2c55f6bb8
3 changed files with 65 additions and 32 deletions

View File

@@ -263,12 +263,16 @@ FMT_END_NAMESPACE
#endif
namespace std {
template <>
struct iterator_traits<fmt::appender> {
template <> struct iterator_traits<fmt::appender> {
using value_type = void;
using iterator_category = std::output_iterator_tag;
using iterator_category = std::output_iterator_tag;
};
}
template <typename Container>
struct iterator_traits<fmt::back_insert_iterator<Container>> {
using value_type = void;
using iterator_category = std::output_iterator_tag;
};
} // namespace std
FMT_BEGIN_NAMESPACE
namespace detail {
@@ -500,6 +504,18 @@ FMT_INLINE void assume(bool condition) {
#endif
}
// Extracts a reference to the container from back_insert_iterator.
template <typename Container>
inline auto get_container(std::back_insert_iterator<Container> it)
-> Container& {
using base = std::back_insert_iterator<Container>;
struct accessor : base {
accessor(base b) : base(b) {}
using base::container;
};
return *accessor(it).container;
}
// An approximation of iterator_t for pre-C++20 systems.
template <typename T>
using iterator_t = decltype(std::begin(std::declval<T&>()));