All checks were successful
Linux arm64 / Build (push) Successful in 16s
Reviewed-on: #14 Co-authored-by: Persson-dev <sim16.prib@gmail.com> Co-committed-by: Persson-dev <sim16.prib@gmail.com>
57 lines
1.3 KiB
C++
57 lines
1.3 KiB
C++
// infix_iterator.h
|
|
//
|
|
// Lifted from Jerry Coffin's 's prefix_ostream_iterator
|
|
#pragma once
|
|
|
|
#include <ostream>
|
|
#include <sp/protocol/Field.h>
|
|
|
|
namespace sp {
|
|
|
|
template <class T, class charT = char, class traits = std::char_traits<charT>>
|
|
class OstreamFieldIterator {
|
|
private:
|
|
std::basic_ostream<charT, traits>* 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<charT, traits>;
|
|
|
|
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<T>(item);
|
|
m_FirstElem = false;
|
|
return *this;
|
|
}
|
|
|
|
auto& operator*() {
|
|
return *this;
|
|
}
|
|
|
|
auto& operator++() {
|
|
return *this;
|
|
}
|
|
|
|
auto& operator++(int) {
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
} // namespace sp
|