Pandora
Pandora source code navigator
Loading...
Searching...
No Matches
LArFormattingHelper.cc
Go to the documentation of this file.
1
10
11#include <iomanip>
12
13using namespace pandora;
14
15namespace lar_content
16{
17
18void LArFormattingHelper::SetStyle(const LArFormattingHelper::Style style, std::ostream &stream)
19{
20 LArFormattingHelper::PrintFormatCharacter(static_cast<unsigned int>(style), stream);
21}
22
23//--------------------------------------------------------------------------------------------------------------------------------------
24
25void LArFormattingHelper::SetColor(const LArFormattingHelper::Color color, std::ostream &stream)
26{
27 LArFormattingHelper::PrintFormatCharacter(static_cast<unsigned int>(color), stream);
28}
29
30//--------------------------------------------------------------------------------------------------------------------------------------
31
32void LArFormattingHelper::ResetStyle(std::ostream &stream)
33{
35}
36
37//--------------------------------------------------------------------------------------------------------------------------------------
38
39void LArFormattingHelper::ResetColor(std::ostream &stream)
40{
42}
43
44//--------------------------------------------------------------------------------------------------------------------------------------
45
46void LArFormattingHelper::Reset(std::ostream &stream)
47{
50}
51
52//--------------------------------------------------------------------------------------------------------------------------------------
53
54void LArFormattingHelper::PrintFormatCharacter(const unsigned int code, std::ostream &stream)
55{
56 if (!(stream << LArFormattingHelper::GetFormatCharacter(code)))
57 throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
58}
59
60//--------------------------------------------------------------------------------------------------------------------------------------
61
62std::string LArFormattingHelper::GetFormatCharacter(const unsigned int code)
63{
64 const std::string startFormattingCode("\x1B[");
65 const std::string endFormattingCode("m");
66 return (startFormattingCode + std::to_string(code) + endFormattingCode);
67}
68
69//--------------------------------------------------------------------------------------------------------------------------------------
70
71void LArFormattingHelper::PrintHeader(const std::string &title, const unsigned int width)
72{
74 std::cout << std::endl << std::string(width, '-') << "\r-" << title << std::endl;
76}
77
78//--------------------------------------------------------------------------------------------------------------------------------------
79
80void LArFormattingHelper::PrintRule(const unsigned int width)
81{
83}
84
85//--------------------------------------------------------------------------------------------------------------------------------------
86//--------------------------------------------------------------------------------------------------------------------------------------
87
88LArFormattingHelper::Table::Table(const StringVector &columnTitles, const unsigned int precision) :
89 m_columnTitles(columnTitles),
90 m_precision(precision)
91{
92 m_stringstream.precision(m_precision);
93
94 for (const std::string &title : m_columnTitles)
95 m_widths.push_back(title.length());
96}
97
98//--------------------------------------------------------------------------------------------------------------------------------------
99
101{
102 if (m_columnTitles[m_elements.size() % m_columnTitles.size()] == "")
103 {
104 m_format.push_back("");
105 m_elements.push_back("");
106 }
107}
108
109//--------------------------------------------------------------------------------------------------------------------------------------
110
111bool LArFormattingHelper::Table::IsSeparatorColumn(const unsigned int column) const
112{
113 if (column >= m_columnTitles.size())
114 throw StatusCodeException(STATUS_CODE_OUT_OF_RANGE);
115
116 return (m_columnTitles[column] == "");
117}
118
119//--------------------------------------------------------------------------------------------------------------------------------------
120
122{
123 if (m_widths.empty() || m_elements.empty())
124 throw StatusCodeException(STATUS_CODE_OUT_OF_RANGE);
125
126 const unsigned int currentElementIndex(m_elements.size() - 1);
127 const unsigned int column(currentElementIndex % m_widths.size());
128 m_widths[column] = std::max(static_cast<unsigned int>(m_elements[currentElementIndex].length()), m_widths[column]);
129}
130
131//--------------------------------------------------------------------------------------------------------------------------------------
132
134{
135 if (m_columnTitles.empty())
136 return;
137
138 this->PrintColumnTitles();
139 this->PrintHorizontalLine();
140 this->PrintTableElements();
141}
142
143//--------------------------------------------------------------------------------------------------------------------------------------
144
146{
147 for (unsigned int i = 0, nColumns = m_columnTitles.size(); i < nColumns; ++i)
148 this->PrintTableCell(m_columnTitles[i], LArFormattingHelper::GetFormatCharacter(LArFormattingHelper::BOLD), i);
149}
150
151//--------------------------------------------------------------------------------------------------------------------------------------
152
154{
155 for (unsigned int i = 0, nColumns = m_columnTitles.size(); i < nColumns; ++i)
156 this->PrintTableCell(std::string(m_widths[i], '-'), LArFormattingHelper::GetFormatCharacter(LArFormattingHelper::REGULAR), i);
157}
158
159//--------------------------------------------------------------------------------------------------------------------------------------
160
162{
163 if (m_columnTitles.empty())
164 return;
165
166 const unsigned int nRows((m_elements.size() + m_columnTitles.size() - 1) / m_columnTitles.size());
167 const unsigned int nColumns(m_columnTitles.size());
168 if (nRows * nColumns != m_elements.size())
169 {
170 std::cout << "LArFormattingHelper::Table::PrintTableElements - Error: Number of table elements added doesn't fill a whole row" << std::endl;
171 throw StatusCodeException(STATUS_CODE_OUT_OF_RANGE);
172 }
173
174 for (unsigned int i = 0; i < nRows * nColumns; i++)
175 this->PrintTableCell(m_elements[i], m_format[i], i);
176}
177
178//--------------------------------------------------------------------------------------------------------------------------------------
179
180void LArFormattingHelper::Table::PrintTableCell(const std::string &value, const std::string &format, const unsigned int index) const
181{
182 if (m_columnTitles.empty())
183 return;
184
185 const unsigned int column(index % m_widths.size());
186
187 const std::string separator(this->IsSeparatorColumn(column) ? "" : " ");
188 std::cout << "|" << format << separator << std::setw(m_widths[column]) << std::internal << value << separator
189 << std::resetiosflags(std::ios::adjustfield);
191
192 if (column == m_columnTitles.size() - 1)
193 std::cout << "|" << std::endl;
194}
195
196} // namespace lar_content
void PrintHorizontalLine() const
Print a horizontal line.
void CheckAndSetSeparatorColumn()
Check if the next table cell is in a separator column, if so add a blank element.
std::stringstream m_stringstream
The stringstream to print objects to.
const pandora::StringVector m_columnTitles
The vector of columns titles in the table.
std::vector< unsigned int > m_widths
The widths of each column (in units of number of characters)
void PrintTableCell(const std::string &value, const std::string &format, const unsigned int index) const
Print a table cell.
Table(const pandora::StringVector &columnTitles, const unsigned int precision=3)
Table constructor.
const unsigned int m_precision
The number of significant figures to use when displaying number types.
void UpdateColumnWidth()
Update the width of the last column in which an element was added.
bool IsSeparatorColumn(const unsigned int column) const
If the supplied column is a separator (vertical rule)
void PrintColumnTitles() const
Print the column titles.
void PrintTableElements() const
Print the table elements.
static void Reset(std::ostream &stream=std::cout)
Reset the formatting and text color of the standard output stream.
static void PrintRule(const unsigned int width=140)
Print a horizontal rule.
static void SetStyle(const Style style, std::ostream &stream=std::cout)
Set the format style (to standard output stream)
static void PrintHeader(const std::string &title="", const unsigned int width=140)
Print a header line of a given width.
static std::string GetFormatCharacter(const unsigned int code)
Get a formatting character.
static void ResetStyle(std::ostream &stream=std::cout)
Reset the style of the standard output stream.
static void SetColor(const Color color, std::ostream &stream=std::cout)
Set the text color (of standard output stream)
static void ResetColor(std::ostream &stream=std::cout)
Reset the text color of the standard output stream.
static void PrintFormatCharacter(const unsigned int code, std::ostream &stream=std::cout)
Print a formatting character to the standard output stream.
StatusCodeException class.
std::vector< std::string > StringVector