}
}
}
- std::ostream& print(std::ostream& os, bool is_top) const {
+
+ template<typename OutputIt>
+ auto do_format_to(OutputIt out, bool is_top) const {
if (valid()) {
if (iter->is_end()) {
- return os << "END";
+ return fmt::format_to(out, "END");
} else {
- os << index();
+ out = fmt::format_to(out, "{}", index());
}
} else {
if (is_top) {
- return os << "invalid StagedIterator!";
+ return fmt::format_to(out, "invalid StagedIterator!");
} else {
- os << "0!";
+ out = fmt::format_to(out, "0!");
}
}
if constexpr (!IS_BOTTOM) {
- os << ", ";
- return this->_nxt.print(os, false);
+ out = fmt::format_to(out, ", ");
+ return this->_nxt.do_format_to(out, false);
} else {
- return os;
+ return out;
}
}
+
position_t get_pos() const {
if (valid()) {
if constexpr (IS_BOTTOM) {
}
return ret;
}
- friend std::ostream& operator<<(std::ostream& os, const StagedIterator& iter) {
- return iter.print(os, true);
- }
private:
std::optional<iterator_t> iter;
};
using node_to_stage_t = typename _node_to_stage_t<NodeType>::type;
}
+
+template<typename T>
+concept HasDoFormatTo = requires(T x, std::back_insert_iterator<fmt::memory_buffer> out) {
+ { x.do_format_to(out, true) } -> std::same_as<decltype(out)>;
+};
+template <HasDoFormatTo T> struct fmt::formatter<T> : fmt::formatter<std::string_view> {
+ template <typename FormatContext>
+ auto format(const T& staged_iterator, FormatContext& ctx) {
+ return staged_iterator.do_format_to(ctx.out(), true);
+ }
+};