Most of the time,
x::mime::newline_iter
's
output iterator is a
x::mime::bodystart_iter
which is an output iterator over a sequence of
int
s.
x::mime::bodystart_iter
's template parameter
is an output iterator class. It iterates over the same sequence as
x::mime::bodystart_iter
iterates over,
unchanged, except that the first time that
x::mime::bodystart_iter
iterates over two
x::mime::newline_start
/x::mime::newline_end
tuples in a row,
x::mime::bodystart_iter
adds an
x::mime::body_start
value to the output sequence,
after the second tuple. This marks the start of a MIME document's
body, following the first empty line:
#include <x/mime/newlineiter.H> #include <x/mime/bodystartiter.H> #include <vector> #include <iterator> #include <iostream> int main() { std::vector<int> seq; typedef std::back_insert_iterator<std::vector<int>> ins_iter_t; typedef x::mime::bodystart_iter<ins_iter_t> bodystart_iter_t; typedef x::mime::newline_iter<bodystart_iter_t> newline_iter_t; auto iter=std::copy(std::istreambuf_iterator<char>(std::cin), std::istreambuf_iterator<char>(), newline_iter_t::create (bodystart_iter_t::create (ins_iter_t(seq)))); iter.get()->eof(); ins_iter_t value=iter.get()->iter.get()->iter; for (int c:seq) { if (x::mime::nontoken(c)) std::cout << (char)c; else std::cout << '<' << c << '>'; } std::cout << std::endl << std::flush; return 0; }
Instantiating a x::mime::bodystart_iter
results
in an output iterator, but x::mime::bodystart_iter
gets instantiated by create
() like a
reference-counted object
(because, internally, it is).
Like
x::mime::newline_iter
,
the output iterator's
get
() method returns a reference to the
underlying reference-counted method, with an
iter
class member giving the current value of the
underlying output iterator.
In this example, std::copy
returns the new value
of the output iterator, newline_iter_t
, a.k.a.
x::mime::newline_iter<bodystart_iter_t>
.
Its get()->iter
returns its underlying
output iterator, bodystart_iter_t
,
a.k.a.
x::mime::bodystart_iter<ins_iter_t>
,
and its own get()->iter
returns the underlying
ins_iter_t
. Sample output from this example:
$ cat bodystart.txt
Subject: test
test
$ ./bodystart <bodystart.txt
Subject: test<256>
<257><256>
<257><258>test<256>
<257><-1>
x::mime::body_start
, or 258
gets inserted into the output sequence after the second consecutive
newline sequence, marking the start the MIME section's body.
If two consecutive newline sequences do not appear in the sequence,
a x::mime::body_start
still gets inserted into the
output sequence before the x::mime::eof
:
$ cat bodystart.txt
Subject: test
$ ./bodystart <bodystart.txt
Subject: test<256>
<257><258><-1>