1//
2// RowFormatter.cpp
3//
4// Library: Data
5// Package: DataCore
6// Module: RowFormatter
7//
8// Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
9// and Contributors.
10//
11// SPDX-License-Identifier: BSL-1.0
12//
13
14
15#include "Poco/Data/SimpleRowFormatter.h"
16#include "Poco/Exception.h"
17#include <iomanip>
18
19
20namespace Poco {
21namespace Data {
22
23
24SimpleRowFormatter::SimpleRowFormatter(std::streamsize columnWidth, std::streamsize spacing):
25 _colWidth(columnWidth), _spacing(spacing), _rowCount(0)
26{
27}
28
29
30SimpleRowFormatter::SimpleRowFormatter(const SimpleRowFormatter& other):
31 RowFormatter(other.prefix(), other.postfix()),
32 _colWidth(other._colWidth),
33 _spacing(other._spacing),
34 _rowCount(0)
35{
36}
37
38
39SimpleRowFormatter::~SimpleRowFormatter()
40{
41}
42
43
44SimpleRowFormatter& SimpleRowFormatter::operator = (const SimpleRowFormatter& row)
45{
46 SimpleRowFormatter tmp(row);
47 swap(tmp);
48 return *this;
49}
50
51
52void SimpleRowFormatter::swap(SimpleRowFormatter& other)
53{
54 using std::swap;
55
56 setPrefix(other.prefix());
57 setPostfix(other.postfix());
58 swap(_colWidth, other._colWidth);
59 swap(_spacing, other._spacing);
60}
61
62
63std::string& SimpleRowFormatter::formatNames(const NameVecPtr pNames, std::string& formattedNames)
64{
65 _rowCount = 0;
66
67 std::ostringstream str;
68 std::string line(std::string::size_type(pNames->size()*_colWidth + (pNames->size() - 1)*_spacing), '-');
69 std::string space(static_cast<std::size_t>(_spacing), ' ');
70 NameVec::const_iterator it = pNames->begin();
71 NameVec::const_iterator end = pNames->end();
72 for (; it != end; ++it)
73 {
74 if (it != pNames->begin()) str << space;
75 str << std::left << std::setw(_colWidth) << *it;
76 }
77 str << std::endl << line << std::endl;
78
79 return formattedNames = str.str();
80}
81
82
83std::string& SimpleRowFormatter::formatValues(const ValueVec& vals, std::string& formattedValues)
84{
85 std::ostringstream str;
86 std::string space(static_cast<std::size_t>(_spacing), ' ');
87 ValueVec::const_iterator it = vals.begin();
88 ValueVec::const_iterator end = vals.end();
89 for (; it != end; ++it)
90 {
91 if (it != vals.begin()) str << space;
92 if (it->isNumeric())
93 {
94 str << std::right
95 << std::fixed
96 << std::setprecision(2);
97 }
98 else str << std::left;
99
100 if (!it->isEmpty())
101 str << std::setw(_colWidth) << it->convert<std::string>();
102 else
103 str << std::setw(_colWidth) << "null";
104 }
105 str << std::endl;
106
107 ++_rowCount;
108
109 return formattedValues = str.str();
110}
111
112
113} } // namespace Poco::Data
114