From a9067eb46b845f70c9282bad59fbe6e8dba0e515 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Fri, 20 Dec 2013 13:57:39 -0800 Subject: Initial commit --- src/csv.h | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/csv.h (limited to 'src/csv.h') diff --git a/src/csv.h b/src/csv.h new file mode 100644 index 0000000..fd46646 --- /dev/null +++ b/src/csv.h @@ -0,0 +1,71 @@ +/* csv.h -- CSV utilities + * Copyright (C) 2013 Galois, Inc. + * + * This library is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this library. If not, see . + * + * To contact Galois, complete the Web form at + * or write to Galois, Inc., 421 Southwest 6th Avenue, Suite 300, Portland, + * Oregon, 97204-1622. */ + +#ifndef PPAML_VREP_AUTOMOBILE_PLUGIN_CSV_H +#define PPAML_VREP_AUTOMOBILE_PLUGIN_CSV_H + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#ifndef HAVE_CXX11_INITIALIZER_LISTS +# include +# include +#endif + +namespace csv { + + // Interface: Any datum which can be converted to a CSV string. + struct Datum { + virtual std::string csvHeader() const = 0; + virtual std::string csv() const = 0; + virtual unsigned int nCols() const = 0; + }; + + /* Converts a sequence of objects to a CSV string. It uses stringstreams + * internally, so all data in the sequence will get converted to strings + * using operator<<; however, no escaping will occur. */ + template + std::string fromContainer(const SequenceContainer &); + +} + +#ifndef HAVE_CXX11_INITIALIZER_LISTS + + /* Without C++11 initializer list syntax, creating containers to pass to + * csv::fromContainer is really ugly. This function makes it substantially + * nicer, at the cost of forcing you to manually specify the length of the + * container (an unfortunate varargs limitation). */ + template + std::list makeList(typename std::list::size_type, ...); + + /* floats get promoted to doubles in a va_list, so they need special + * handling. */ + template<> + std::list makeList(typename std::list::size_type, ...); + +#endif + +#include "csv-inl.h" + +#endif -- cgit v1.2.3