Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F5316633
CSVWriter.hpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Size
4 KB
Referenced Files
None
Subscribers
None
CSVWriter.hpp
View Options
//===-- rosa/support/csv/CSVWriter.hpp --------------------------*- C++ -*-===//
//
// The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file rosa/support/csv/CSVWriter.hpp
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017
///
/// \brief Facitilities to write CSV files.
///
//===----------------------------------------------------------------------===//
#ifndef ROSA_SUPPORT_CSV_CSVWRITER_HPP
#define ROSA_SUPPORT_CSV_CSVWRITER_HPP
#include
<iostream>
#include
<ostream>
#include
<tuple>
namespace
rosa
{
namespace
csv
{
/// Provides facilities to write values into a CSV file.
///
/// The writer emits a comma, the character `,`, between each written values.
/// The resulted stream is a flat CSV file as it consists of onlyone row, no new
/// line is emitted.
///
/// \tparam T type of values to write
template
<
typename
T
>
class
CSVWriter
{
public
:
/// \defgroup CSVWriterTypedefs Typedefs of rosa::csv::CSVWriter
///
/// Useful `typedef`s for writers.
///
///@{
typedef
T
value_type
;
///< Type of values written
typedef
T
&
reference
;
///< Reference to the type written
///@}
/// Creates a new instance.
///
/// \param [in,out] S output stream to write to
///
/// \note The writer operates on non-binary outputs as long as \p S is in
/// good state.
CSVWriter
(
std
::
ostream
&
S
)
:
Str
(
S
.
good
()
&&
!
(
S
.
flags
()
&
std
::
ios
::
binary
)
?
&
S
:
nullptr
),
IsFirst
(
true
)
{}
/// Tells if the last operation was successful.
///
/// \return if the last operation was successful
bool
good
(
void
)
const
noexcept
{
return
Str
!=
nullptr
;
}
/// Writes an entry to the output stream.
///
/// The implementation does anything only if the last operation was
/// successful. If so, \p V is written to \c rosa::csv::CSVWriter::Str.
/// The emitted value is preceded with a comma if the actual call is not the
/// first one for \p this object. Success of the operation is checked at the
/// end.
///
/// \param V value to write
void
write
(
const
T
&
V
)
{
if
(
Str
)
{
if
(
!
IsFirst
)
{
*
Str
<<
','
;
}
else
{
IsFirst
=
false
;
}
*
Str
<<
V
;
if
(
!
Str
->
good
())
{
Str
=
nullptr
;
}
}
}
private
:
std
::
ostream
*
Str
;
///< Output stream to write to.
bool
IsFirst
;
///< Denotes if the next write would be the first one.
};
/// Writes a tuple of values into a CSV file
///
/// \tparam Ts tpyes of values to write
template
<
typename
...
Ts
>
class
CSVTupleWriter
{
public
:
/// Creates a new instance.
///
/// \param [in,out] S output stream to write to
///
/// \note The writer operates on non-binary outputs as long as \p S is in
/// good state.
CSVTupleWriter
(
std
::
ostream
&
S
)
:
Str
(
S
.
good
()
&&
!
(
S
.
flags
()
&
std
::
ios
::
binary
)
?
&
S
:
nullptr
),
IsFirst
(
true
)
{}
/// Tells if the last operation was successful.
///
/// \return if the last operation was successful
bool
good
(
void
)
const
noexcept
{
return
Str
!=
nullptr
;
}
template
<
size_t
i
=
0
>
void
write
(
std
::
tuple
<
Ts
...
>
values
)
{
size_t
size
=
0
;
std
::
cout
<<
"Writing tuple values into file"
<<
std
::
endl
;
std
::
cout
<<
"Tuple has "
;
std
::
cout
<<
std
::
tuple_size
<
decltype
(
values
)
>::
value
;
std
::
cout
<<
" elements."
<<
std
::
endl
;
size
=
std
::
tuple_size
<
decltype
(
values
)
>::
value
;
std
::
cout
<<
std
::
get
<
i
>
(
values
)
<<
std
::
endl
;
if
(
Str
){
if
constexpr
(
i
+
1
!=
sizeof
...(
Ts
)){
*
Str
<<
std
::
get
<
i
>
(
values
)
<<
" ,"
;
write
<
i
+
1
>
(
values
);
}
else
if
constexpr
(
i
+
1
==
sizeof
...(
Ts
)){
*
Str
<<
std
::
get
<
i
>
(
values
)
<<
'\n'
;
}
}
}
private
:
std
::
ostream
*
Str
;
///< Output stream to write to.
bool
IsFirst
;
///< Denotes if the next write would be the first one.
};
/// Writes a value to a CSV file with \c rosa::csv::CSVWriter.
///
/// \see rosa::csv::CSVWriter
///
/// \tparam T type of value to write
///
/// \param [in,out] W object to write with
/// \param V value to write
///
/// \return \p W after writing \p V with it
template
<
typename
T
>
CSVWriter
<
T
>
&
operator
<<
(
CSVWriter
<
T
>
&
W
,
const
T
&
V
)
{
W
.
write
(
V
);
return
W
;
}
}
// End namespace csv
}
// End namespace rosa
#endif
// ROSA_SUPPORT_CSV_CSVWRITER_HPP
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Sun, Apr 12, 5:28 PM (18 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
307589
Default Alt Text
CSVWriter.hpp (4 KB)
Attached To
Mode
R20 SoC_Rosa_repo
Attached
Detach File
Event Timeline
Log In to Comment