After the processing described in the previous section, we've now got
full details of what we need to output stored in the
profile_container on a symbol-by-symbol basis. To
produce output, we need to replay that data and format it suitably.
opreport first asks the
profile_container for a
symbol_collection (this is also where thresholding
happens).
This is sorted, then a
opreport_formatter is initialised.
This object initialises a set of field formatters as requested. Then
opreport_formatter::output() is called. This
iterates through the (sorted) symbol_collection;
for each entry, the selected fields (as set by the
format_flags options) are output by calling the
field formatters, with the symbol_entry passed in.