LibSWOC++ 1.5.14
Solid Wall of C++
Loading...
Searching...
No Matches
Errata.cc
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright Network Geographics 2014
7
8#include <iostream>
9#include <sstream>
10#include <algorithm>
11#include <memory.h>
12#include "swoc/Errata.h"
13#include "swoc/bwf_ex.h"
14#include "swoc/bwf_std.h"
15
16using swoc::MemArena;
17using std::string_view;
18using namespace std::literals;
19using namespace swoc::literals;
20
21namespace swoc { inline namespace SWOC_VERSION_NS {
24namespace {
25std::vector<Errata::Sink::Handle> Sink_List;
26}
27
28string_view
29Errata::Data::localize(string_view src) {
30 auto span = _arena.alloc(src.size()).rebind<char>();
31 memcpy(span.data(), src.data(), src.size());
32 return {span.data(), span.size()};
33}
34
35/* ----------------------------------------------------------------------- */
36// methods for Errata
37
41
43std::array<swoc::TextView, 3> Severity_Names{
44 {"Info", "Warning", "Error"}
45};
46
48
50 this->sink();
51}
52
53Errata &
55 if (_data) {
56 for (auto &f : Sink_List) {
57 (*f)(*this);
58 }
59 this->clear();
60 }
61 return *this;
62}
63
66 if (!_data) {
67 MemArena arena{512}; // POOMA value, seems reasonable.
68 _data = arena.make<Data>(std::move(arena));
69 }
70 return _data;
71}
72
74Errata::alloc(size_t n) {
75 return this->data()->_arena.alloc(n).rebind<char>();
76}
77
78Errata &
79Errata::note_s(std::optional<Severity> severity, std::string_view text) {
80 if (severity.has_value()) {
81 this->update(*severity);
82 }
83 if (!severity.has_value() || *severity >= FILTER_SEVERITY) {
84 auto span = this->alloc(text.size());
85 memcpy(span, text);
86 this->note_localized(TextView(span), severity);
87 }
88 return *this;
89}
90
91Errata &
92Errata::note_localized(std::string_view const &text, std::optional<Severity> severity) {
93 auto d = this->data();
94 auto *n = d->_arena.make<Annotation>(text, severity);
95 d->_notes.append(n);
96 return *this;
97}
98
99Errata &
101 if (that._data) {
102 auto d = this->data();
103 if (that.has_severity()) {
104 this->update(that.severity());
105 }
106 for (auto const &annotation : that) {
107 d->_notes.append(d->_arena.make<Annotation>(d->localize(annotation._text), annotation._severity, annotation._level + 1));
108 }
109 }
110 return *this;
111}
112
113auto
115 if (!_data || !_data->_severity.has_value() || _data->_severity.value() < severity) {
116 this->assign(severity);
117 }
118 return *this;
119}
120
121void
123 Sink_List.push_back(s);
124}
125
127bwformat(BufferWriter &bw, bwf::Spec const &spec, Errata::Severity level) {
128 if (level < Errata::SEVERITY_NAMES.size()) {
129 bwformat(bw, spec, Errata::SEVERITY_NAMES[level]);
130 } else {
131 bwformat(bw, spec, level._raw);
132 }
133 return bw;
134}
135
136BufferWriter &
137bwformat(BufferWriter &bw, bwf::Spec const &, Errata const &errata) {
138 bwf::Format const code_fmt{"[{0:s} {0:d}] "};
139
140 if (errata.has_severity()) {
141 bw.print("{}{}", errata.severity(), errata.severity_glue_text());
142 }
143
144 if (errata.code()) {
145 bw.print(code_fmt, errata.code());
146 }
147
148 bool trailing_p = false;
149 auto glue = errata.annotation_glue_text();
150 auto a_s_glue = errata.annotation_severity_glue_text();
151 auto id_txt = errata.indent_text();
152 for (auto &note : errata) {
153 if (note.text()) {
154 bw.print("{}{}{}{}", swoc::bwf::If(trailing_p, "{}", glue), swoc::bwf::Pattern{int(note.level()), id_txt},
155 swoc::bwf::If(note.has_severity(), "{}{}", note.severity(), a_s_glue), note.text());
156 trailing_p = true;
157 }
158 }
159 if (trailing_p && errata._data->_glue_final_p) {
160 bw.print("{}", glue);
161 }
162 return bw;
163}
164
165std::ostream &
166Errata::write(std::ostream &out) const {
167 std::string tmp;
168 tmp.reserve(1024);
169 bwprint(tmp, "{}", *this);
170 return out << tmp;
171}
172
173std::ostream &
174operator<<(std::ostream &os, Errata const &err) {
175 return err.write(os);
176}
177
178}} // namespace swoc::SWOC_VERSION_NS
SubText< Args... > If(bool flag, TextView const &fmt, Args &&...args)
Definition bwf_ex.h:146
BufferWriter & print(const TextView &fmt, Args &&...args)
Definition bwf_base.h:927
std::shared_ptr< self_type > Handle
Handle type.
Definition Errata.h:634
static Severity FAILURE_SEVERITY
Severity level at which the instance is a failure of some sort.
Definition Errata.h:83
TextView severity_glue_text() const
Definition Errata.h:1286
self_type & sink()
Definition Errata.cc:54
self_type & note(std::string_view text)
Definition Errata.h:1170
self_type & clear()
Definition Errata.h:1085
TextView annotation_glue_text() const
Definition Errata.h:1263
~Errata()
Destructor.
Definition Errata.cc:49
TextView annotation_severity_glue_text() const
Definition Errata.h:1275
self_type & note_localized(std::string_view const &text, std::optional< Severity > severity=std::optional< Severity >{})
Add Annotation with already localized text.
Definition Errata.cc:92
TextView indent_text() const
Definition Errata.h:1297
code_type const & code() const
The code for the top message.
Definition Errata.h:1117
static void register_sink(Sink::Handle const &s)
Register a sink for discarded erratum.
Definition Errata.cc:122
bool has_severity() const
Definition Errata.h:1128
self_type & assign(Severity severity)
Definition Errata.h:1137
Data * _data
Definition Errata.h:679
std::ostream & write(std::ostream &out) const
Definition Errata.cc:166
static Severity DEFAULT_SEVERITY
Severity reported if severity not set.
Definition Errata.h:81
static MemSpan< TextView const > SEVERITY_NAMES
Definition Errata.h:96
self_type & note_s(std::optional< Severity > severity, std::string_view text)
Definition Errata.cc:79
Data * data()
Definition Errata.cc:65
static Severity FILTER_SEVERITY
Definition Errata.h:87
self_type & update(Severity severity)
Definition Errata.cc:114
MemSpan< char > alloc(size_t n)
Definition Errata.cc:74
Errata self_type
Definition Errata.h:162
Severity severity() const
Definition Errata.h:1132
For template deduction guides.
Definition ArenaWriter.cc:9
BufferWriter & bwformat(BufferWriter &w, bwf::Spec const &spec, std::string_view sv)
Definition bw_format.cc:649
std::array< swoc::TextView, 3 > Severity_Names
Default set of severity names.
Definition Errata.cc:43
std::string & bwprint(std::string &s, TextView fmt, Args &&...args)
Definition bwf_base.h:1185
void * memcpy(void *dst, const std::string_view &src)
Implementation class.
Definition Errata.h:168
swoc::MemArena _arena
Annotation text storage.
Definition Errata.h:201
std::string_view localize(std::string_view src)
Definition Errata.cc:29
severity_type _raw
Severity numeric value.
Definition Errata.h:68