// infix_iterator.h // // Lifted from Jerry Coffin's 's prefix_ostream_iterator #pragma once #include #include namespace sp { template > class OstreamFieldIterator { private: std::basic_ostream* m_Os; std::string m_Delimiter; bool m_FirstElem; public: using iterator_category = std::output_iterator_tag; using value_type = void; using difference_type = void; using pointer = void; using reference = void; using char_type = charT; using traits_type = traits; using ostream_type = std::basic_ostream; OstreamFieldIterator(ostream_type& a_Stream) : m_Os(&a_Stream), m_Delimiter(0), m_FirstElem(true) {} OstreamFieldIterator(ostream_type& a_Stream, std::string&& a_Delimiter) : m_Os(&a_Stream), m_Delimiter(std::move(a_Delimiter)), m_FirstElem(true) {} auto& operator=(const T& item) { // Here's the only real change from ostream_iterator: // Normally, the '*m_Os << item;' would come before the 'if'. if (!m_FirstElem && !m_Delimiter.empty()) *m_Os << m_Delimiter; *m_Os << sp::PrintableField(item); m_FirstElem = false; return *this; } auto& operator*() { return *this; } auto& operator++() { return *this; } auto& operator++(int) { return *this; } }; } // namespace sp