1#ifndef FPMAS_CSV_OUTPUT_H
2#define FPMAS_CSV_OUTPUT_H
16namespace fpmas {
namespace io {
39 static std::string
to_csv(
const T& data) {
40 std::ostringstream stream;
60 template<
typename... DataField>
63 std::vector<std::string> _headers;
64 std::tuple<std::function<DataField()>...> watchers;
69 template<
int ...>
struct seq {};
70 template<
int N,
int ...S>
struct gens {
72 typedef typename gens<N-1, N-1, S...>::type type;
73 };
template<
int ...S>
struct gens<0, S...>{
typedef seq<S...> type; };
81 std::tuple<std::pair<std::string, std::function<DataField()>>...> csv_fields,
83 _headers = {std::get<S>(csv_fields).first...};
91 std::vector<std::string> _dump_fields(
const seq<S...>) {
92 std::tuple<DataField...> data {std::get<S>(watchers)() ...};
93 std::ostringstream output_str;
94 return {
CsvSerial<
typename std::tuple_element<S,
decltype(data)>::type>::to_csv(std::get<S>(data))...};
104 void dump_csv(
const std::vector<std::string>& data) {
106 for(std::size_t i = 0; i < data.size()-1; i++)
107 output << data[i] <<
",";
108 output << data.back() << std::endl;
126 return _dump_fields(
typename gens<
sizeof...(DataField)>::type());
140 std::pair<std::string, std::function<DataField()>>... csv_fields)
142 build_headers({csv_fields...},
typename gens<
sizeof...(DataField)>::type());
152 template<
typename... DataField>
168 std::pair<std::string, std::function<DataField()>>... csv_fields)
190 template<
typename Operation>
193 Watcher<typename Operation::Type>,
194 typename Operation::Params>
201 std::function<
typename Operation::Type()>,
202 typename Operation::Params>::tuple;
210 const std::string& name,
211 std::function<
typename Operation::Type()> watcher)
224 template<
typename... DataFieldOperation>
257 std::get<0>(csv_fields),
259 typename DataFieldOperation::Single(
262 std::get<1>(csv_fields),
264 std::get<2>(csv_fields))
266 comm(comm), root(root), all_out(
false)
295 std::get<0>(csv_fields),
297 typename DataFieldOperation::All(
300 std::get<1>(csv_fields),
302 std::get<2>(csv_fields))
304 comm(comm), all_out(
true)
321 std::vector<std::string> data_fields = this->
dump_fields();
322 if(all_out || comm.
getRank() == root)
Definition: communication.h:251
virtual int getRank() const =0
Definition: csv_output.h:61
std::vector< std::string > headers()
Definition: csv_output.h:116
CsvOutputBase(api::io::OutputStream &output_stream, std::pair< std::string, std::function< DataField()> >... csv_fields)
Definition: csv_output.h:138
std::vector< std::string > dump_fields()
Definition: csv_output.h:125
void dump_csv(const std::vector< std::string > &data)
Definition: csv_output.h:104
Definition: csv_output.h:153
void dump() override
Definition: csv_output.h:179
CsvOutput(api::io::OutputStream &output_stream, std::pair< std::string, std::function< DataField()> >... csv_fields)
Definition: csv_output.h:166
Definition: csv_output.h:225
void dump() override
Definition: csv_output.h:320
DistributedCsvOutput(api::communication::MpiCommunicator &comm, api::io::OutputStream &output_stream, DistributedCsvField< DataFieldOperation >... csv_fields)
Definition: csv_output.h:287
DistributedCsvOutput(api::communication::MpiCommunicator &comm, int root, api::io::OutputStream &output_stream, DistributedCsvField< DataFieldOperation >... csv_fields)
Definition: csv_output.h:249
api::io::OutputStream & output_stream
Definition: output.h:580
std::function< T()> Watcher
Definition: output.h:103
virtual std::ostream & get()=0
Definition: csv_output.h:31
static std::string to_csv(const T &data)
Definition: csv_output.h:39
Definition: csv_output.h:195
DistributedCsvField(const std::string &name, std::function< typename Operation::Type()> watcher)
Definition: csv_output.h:209