Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
data_table_sinks.hpp
Go to the documentation of this file.
1
5#pragma once
6#include "data_table_json.hpp"
7#include "display.hpp"
8
10{
11namespace data_table_detail
12{
14 public:
15 delimited_sink(std::ostream& out, char delimiter, delimited_options options)
16 : out_(out), delimiter_(delimiter), options_(std::move(options))
17 {}
18 template <typename Schema>
19 void begin(std::string const&, Schema const& schema, table_metadata const&, data_sink_start)
20 {
21 selection_ = resolve_projection(schema, options_.projection);
22 write_delimited_header(out_, schema, selection_, delimiter_);
23 }
24 template <typename Schema, typename Row> void row(Schema const& schema, Row const& row)
25 {
26 write_delimited_row(out_, schema, row, selection_, delimiter_, options_);
27 }
29 {
30 out_.flush();
31 check_output(out_);
32 }
33
34 private:
35 std::ostream& out_;
36 char delimiter_;
37 delimited_options options_;
38 resolved_projection selection_;
39};
40
42 public:
43 json_sink_adapter(std::ostream& out, data_json_options options) : out_(out), options_(std::move(options)) {}
44 template <typename Schema>
45 void begin(std::string const& title, Schema const& schema, table_metadata const& metadata, data_sink_start start)
46 {
47 selection_ = resolve_projection(schema, {.columns = options_.columns});
48 json_output out{out_};
49 write_json_begin(out, title, schema, metadata, selection_, start);
50 }
51 template <typename Schema, typename Row> void row(Schema const& schema, Row const& row)
52 {
53 json_output out{out_};
54 if (!std::exchange(first_, false)) out.put(',');
55 write_json_row(out, schema, row, selection_);
56 }
57 void finish(table_metadata const& summary)
58 {
59 json_output out{out_};
60 write_json_end(out, &summary);
61 out_.flush();
62 check_output(out_);
63 }
64
65 private:
66 std::ostream& out_;
67 data_json_options options_;
68 resolved_projection selection_;
69 bool first_ = true;
70};
71} // namespace data_table_detail
72
75[[nodiscard]] inline auto csv_sink(std::ostream& out, delimited_options options = {})
76{
77 return data_table_detail::delimited_sink(out, ',', std::move(options));
78}
79
81[[nodiscard]] inline auto tsv_sink(std::ostream& out, delimited_options options = {})
82{
83 return data_table_detail::delimited_sink(out, '\t', std::move(options));
84}
85
88[[nodiscard]] inline auto json_sink(std::ostream& out, data_json_options options = {})
89{
90 return data_table_detail::json_sink_adapter(out, std::move(options));
91}
92
95{
98 std::size_t minimum_column_width = 10;
99 std::optional<std::size_t> wrap_width = std::nullopt;
100 bool show_metadata = true;
102 std::optional<output_policy> policy = std::nullopt;
103};
104
105namespace data_table_detail
106{
107template <typename T> display::formatted_cell terminal_cell(T const& value, data_column_display const& format)
108{
109 if constexpr (optional_traits<T>::optional)
110 {
111 if (value) return terminal_cell(*value, format);
112 return {.text = styled_text{}.append(format.missing), .decimal_exception = true};
113 }
114 else
115 {
116 bool candidate = false;
117 bool exception = false;
118 if constexpr (Real<T>)
119 {
120 candidate = uni20::isfinite(value);
121 exception = !candidate;
122 if constexpr (runtime_real<T>)
123 if (value.is_exact() && format.fractions) candidate = false;
124 }
125 else if constexpr (integer<T>)
126 candidate = true;
127 else if constexpr (half_integer<T>)
128 candidate = !format.fractions;
129 return {.text = styled_text{}.append(cell_text(value, format, false)),
130 .decimal_candidate = candidate,
131 .decimal_exception = exception,
132 .keep_together = Real<T> || integer<T> || half_integer<T>};
133 }
134}
135
137 public:
138 explicit terminal_sink_adapter(data_terminal_options options) : options_(std::move(options)) {}
139 template <typename Schema>
140 void begin(std::string const& title, Schema const& schema, table_metadata const& metadata, data_sink_start)
141 {
142 selection_ = resolve_projection(schema, options_.projection);
143 table_.emplace(title, options_.destination);
144 if (options_.output) table_->output(options_.output, options_.policy.value_or(plain_policy()));
145 if (options_.wrap_width) table_->wrap_width(*options_.wrap_width);
146 for (std::size_t p = 0; p < selection_.indices.size(); ++p)
147 visit_column(schema, selection_.indices[p], [&](auto const& column) {
148 table_->column(column.label(), display::width::fit(options_.minimum_column_width),
149 selection_.display[p].alignment);
150 });
151 this->emit_metadata(metadata);
152 }
153 template <typename Schema, typename Row> void row(Schema const& schema, Row const& row)
154 {
155 std::vector<display::formatted_cell> cells;
156 cells.reserve(selection_.indices.size());
157 visit_selected(schema, row, selection_, [&](auto const&, auto const& value, auto const& format) {
158 cells.push_back(terminal_cell(value, format));
159 });
160 table_->row(std::move(cells));
161 }
162 void finish(table_metadata const& summary) { this->emit_metadata(summary); }
163
164 private:
165 void emit_metadata(table_metadata const& metadata)
166 {
167 if (!options_.show_metadata) return;
168 for (auto const& [key, value] : metadata)
169 {
170 auto text = styled_text{}.append(key + ": " + value);
171 if (options_.output)
172 options_.output(display::event{.destination = options_.destination,
173 .content = std::move(text),
174 .newline = true,
175 .context = {},
176 .where = std::source_location::current()});
177 else
178 display::emit(std::move(text), options_.destination);
179 }
180 }
181 data_terminal_options options_;
182 resolved_projection selection_;
183 std::optional<display::streaming_table> table_;
184};
185} // namespace data_table_detail
186
189[[nodiscard]] inline auto terminal_sink(data_terminal_options options = {})
190{
191 return data_table_detail::terminal_sink_adapter(std::move(options));
192}
193} // namespace uni20::presentation
void finish(table_metadata const &)
Definition data_table_sinks.hpp:28
delimited_sink(std::ostream &out, char delimiter, delimited_options options)
Definition data_table_sinks.hpp:15
void begin(std::string const &, Schema const &schema, table_metadata const &, data_sink_start)
Definition data_table_sinks.hpp:19
void row(Schema const &schema, Row const &row)
Definition data_table_sinks.hpp:24
void begin(std::string const &title, Schema const &schema, table_metadata const &metadata, data_sink_start start)
Definition data_table_sinks.hpp:45
void row(Schema const &schema, Row const &row)
Definition data_table_sinks.hpp:51
void finish(table_metadata const &summary)
Definition data_table_sinks.hpp:57
json_sink_adapter(std::ostream &out, data_json_options options)
Definition data_table_sinks.hpp:43
void finish(table_metadata const &summary)
Definition data_table_sinks.hpp:162
terminal_sink_adapter(data_terminal_options options)
Definition data_table_sinks.hpp:138
void begin(std::string const &title, Schema const &schema, table_metadata const &metadata, data_sink_start)
Definition data_table_sinks.hpp:140
void row(Schema const &schema, Row const &row)
Definition data_table_sinks.hpp:153
A sequence of styled text spans and semantic glyph tokens.
Definition presentation.hpp:216
styled_text & append(std::string_view text, terminal::TerminalStyle style={})
Append a text span.
Definition presentation.cpp:1164
Concept for real scalar types (float, double, etc.).
Definition scalar_concepts.hpp:69
locale_t value
Definition data_table.cpp:49
Precision-preserving JSON snapshots of typed result tables.
presentation::styled_text text
Definition display.cpp:141
constexpr bool isfinite(I const &x) noexcept
Returns whether an integer scalar is finite.
Definition math.hpp:121
Definition qnum.hpp:403
stream
Selects the ordinary display stream for a message.
Definition display.hpp:25
void emit(presentation::styled_text text, stream destination, bool newline, std::source_location where)
Emit styled text through the active display sink.
Definition display.cpp:843
std::function< void(event const &)> sink
Callable that receives display events for final routing and rendering.
Definition display.hpp:126
void visit_selected(Schema const &schema, Row const &row, resolved_projection const &selection, Function &&function)
Definition data_table.hpp:719
void write_json_end(json_output &out, table_metadata const *summary)
Definition data_table_json.hpp:159
void check_output(std::ostream &out)
Definition data_table.cpp:40
resolved_projection resolve_projection(Schema const &schema, table_projection const &options)
Definition data_table.hpp:688
void write_delimited_row(std::ostream &out, Schema const &schema, Row const &row, resolved_projection const &selection, char delimiter, delimited_options const &options)
Definition data_table.hpp:798
void visit_column(Schema const &schema, std::size_t index, Function &&function)
Definition data_table.hpp:681
std::string cell_text(T const &value, data_column_display const &display, bool machine)
Definition data_table.hpp:636
void write_json_begin(json_output &out, std::string const &title, Schema const &schema, table_metadata const &metadata, resolved_projection const &selection, data_sink_start start)
Definition data_table_json.hpp:140
display::formatted_cell terminal_cell(T const &value, data_column_display const &format)
Definition data_table_sinks.hpp:107
void write_json_row(json_output &out, Schema const &schema, Row const &row, resolved_projection const &selection)
Definition data_table_json.hpp:113
void write_delimited_header(std::ostream &out, Schema const &schema, resolved_projection const &selection, char delimiter)
Definition data_table.hpp:783
Definition data_table.cpp:8
auto terminal_sink(data_terminal_options options={})
Stream deferred display formatting through display::streaming_table.
Definition data_table_sinks.hpp:189
output_policy plain_policy()
Build a policy for plain file/log rendering with no ANSI color.
Definition presentation.cpp:1195
auto csv_sink(std::ostream &out, delimited_options options={})
Stream CSV rows to a borrowed stream, flushing on explicit sink/table finish.
Definition data_table_sinks.hpp:75
auto tsv_sink(std::ostream &out, delimited_options options={})
Stream tab-delimited CSV rows to a borrowed stream, flushing on explicit finish.
Definition data_table_sinks.hpp:81
std::map< std::string, std::string > table_metadata
Application metadata is owned text, independent of numerical rows.
Definition data_table.hpp:314
auto json_sink(std::ostream &out, data_json_options options={})
Stream a JSON document.
Definition data_table_sinks.hpp:88
Human-facing display event routed through the active sink.
Definition display.hpp:115
stream destination
Definition display.hpp:116
Already formatted display text with numeric alignment semantics retained by its producer.
Definition display.hpp:103
Column display settings. These never change stored values or default export precision.
Definition data_table.hpp:198
std::string missing
Definition data_table.hpp:201
bool fractions
Definition data_table.hpp:202
Ordered JSON column selection. Empty selects every column; display precision is never applied.
Definition data_table_json.hpp:12
std::vector< std::string > columns
Definition data_table_json.hpp:13
The index of the first row this attachment can emit (zero for full replay).
Definition data_table.hpp:344
std::vector< std::size_t > indices
Definition data_table.hpp:676
Independent terminal projection, widths, and destination using the existing display router.
Definition data_table_sinks.hpp:95
display::sink output
Definition data_table_sinks.hpp:101
bool show_metadata
Definition data_table_sinks.hpp:100
std::size_t minimum_column_width
Definition data_table_sinks.hpp:98
std::optional< std::size_t > wrap_width
Definition data_table_sinks.hpp:99
display::stream destination
Definition data_table_sinks.hpp:97
std::optional< output_policy > policy
Definition data_table_sinks.hpp:102
table_projection projection
Definition data_table_sinks.hpp:96
Delimited output policy, independent of terminal styles and width.
Definition data_table.hpp:763
table_projection projection
Definition data_table.hpp:765
Ordered output columns and independent display overrides. Empty columns selects the full schema.
Definition data_table.hpp:308