Skip to content

Commit 1018979

Browse files
committed
citnames: use iterators for event database read
1 parent acc3d78 commit 1018979

File tree

3 files changed

+100
-16
lines changed

3 files changed

+100
-16
lines changed

source/citnames/source/Application.cc

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -162,22 +162,16 @@ namespace {
162162
}
163163

164164
size_t transform(cs::semantic::Build &build, const db::EventsDatabaseReader::Ptr& events, std::list<cs::Entry> &output) {
165-
size_t count = 0;
166-
for (auto event = events->next(); event.has_value(); event = events->next()) {
167-
event.value()
168-
.and_then<cs::semantic::SemanticPtr>([&build](const auto &event) {
169-
return build.recognize(*event);
165+
for (const auto &event : *events) {
166+
const auto entries = build.recognize(event)
167+
.map<std::list<cs::Entry>>([](const auto &semantic) -> std::list<cs::Entry> {
168+
const auto candidate = dynamic_cast<const cs::semantic::CompilerCall *>(semantic.get());
169+
return (candidate != nullptr) ? candidate->into_entries() : std::list<cs::Entry>();
170170
})
171-
.on_success([&output, &count](const auto &semantic) {
172-
auto candidate = dynamic_cast<const cs::semantic::CompilerCall *>(semantic.get());
173-
if (candidate != nullptr) {
174-
auto entries = candidate->into_entries();
175-
count += entries.size();
176-
std::copy(entries.begin(), entries.end(), std::back_inserter(output));
177-
}
178-
});
171+
.unwrap_or({});
172+
std::copy(entries.begin(), entries.end(), std::back_inserter(output));
179173
}
180-
return count;
174+
return output.size();
181175
}
182176
}
183177

source/intercept/source/collect/db/EventsDatabaseReader.cc

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ namespace ic::collect::db {
4848
, file_(std::move(file))
4949
{ }
5050

51+
EventsDatabaseReader::Iterator EventsDatabaseReader::begin() noexcept {
52+
return EventsDatabaseReader::Iterator(*this, false);
53+
}
54+
55+
EventsDatabaseReader::Iterator EventsDatabaseReader::end() noexcept {
56+
return EventsDatabaseReader::Iterator(*this, true);
57+
}
5158

5259
std::optional<rust::Result<EventPtr>> EventsDatabaseReader::next() noexcept {
5360
const auto line = next_line();
@@ -57,7 +64,7 @@ namespace ic::collect::db {
5764
return from_json(line);
5865
});
5966
}
60-
return std::optional<rust::Result<EventPtr>>();
67+
return {};
6168
}
6269

6370
std::optional<rust::Result<std::string>> EventsDatabaseReader::next_line() noexcept {
@@ -88,4 +95,56 @@ namespace ic::collect::db {
8895
}
8996
return rust::Ok(event);
9097
}
98+
99+
EventsDatabaseReader::Iterator::Iterator(EventsDatabaseReader &reader, bool end) noexcept
100+
: reader_(reader)
101+
{
102+
if (!end) {
103+
auto candidate = reader_.next();
104+
while (candidate) {
105+
if (candidate.value().is_ok()) {
106+
current = candidate.value().unwrap();
107+
break;
108+
}
109+
candidate = reader_.next();
110+
}
111+
}
112+
}
113+
114+
const EventsDatabaseReader::Iterator::value_type &EventsDatabaseReader::Iterator::operator*() const {
115+
return current.operator*();
116+
}
117+
118+
EventsDatabaseReader::Iterator::pointer EventsDatabaseReader::Iterator::operator->() const {
119+
return current.operator->();
120+
}
121+
122+
EventsDatabaseReader::Iterator &EventsDatabaseReader::Iterator::operator++() {
123+
if (current) {
124+
current = nullptr;
125+
auto candidate = reader_.next();
126+
while (candidate) {
127+
if (candidate.value().is_ok()) {
128+
current = candidate.value().unwrap();
129+
break;
130+
}
131+
candidate = reader_.next();
132+
}
133+
}
134+
return *this;
135+
}
136+
137+
EventsDatabaseReader::Iterator EventsDatabaseReader::Iterator::operator++(int) {
138+
auto result(*this);
139+
this->operator++();
140+
return result;
141+
}
142+
143+
bool operator==(const EventsDatabaseReader::Iterator &lhs, const EventsDatabaseReader::Iterator &rhs) {
144+
return (&lhs.reader_ == &rhs.reader_) && (lhs.current == rhs.current);
145+
}
146+
147+
bool operator!=(const EventsDatabaseReader::Iterator &lhs, const EventsDatabaseReader::Iterator &rhs) {
148+
return !(lhs == rhs);
149+
}
91150
}

source/intercept/source/collect/db/EventsDatabaseReader.h

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,19 @@ namespace ic::collect::db {
3636

3737
class EventsDatabaseReader {
3838
public:
39+
class Iterator;
40+
friend class Iterator;
41+
3942
using Ptr = std::shared_ptr<EventsDatabaseReader>;
4043
using StreamPtr = std::unique_ptr<std::istream>;
4144

4245
[[nodiscard]] static rust::Result<EventsDatabaseReader::Ptr> from(const fs::path &path);
4346

44-
[[nodiscard]] std::optional<rust::Result<EventPtr>> next() noexcept;
47+
[[nodiscard]] Iterator begin() noexcept;
48+
[[nodiscard]] Iterator end() noexcept;
4549

4650
private:
51+
[[nodiscard]] std::optional<rust::Result<EventPtr>> next() noexcept;
4752
[[nodiscard]] std::optional<rust::Result<std::string>> next_line() noexcept;
4853
[[nodiscard]] rust::Result<EventPtr> from_json(const std::string &) noexcept;
4954

@@ -57,4 +62,30 @@ namespace ic::collect::db {
5762
fs::path path_;
5863
StreamPtr file_;
5964
};
65+
66+
class EventsDatabaseReader::Iterator {
67+
public:
68+
using value_type = rpc::Event;
69+
using difference_type = std::ptrdiff_t;
70+
using reference = const value_type &;
71+
using pointer = const value_type *;
72+
using iterator_category = std::forward_iterator_tag;
73+
74+
explicit Iterator(EventsDatabaseReader &reader, bool end) noexcept;
75+
76+
reference operator*() const;
77+
pointer operator->() const;
78+
79+
Iterator &operator++();
80+
Iterator operator++(int);
81+
82+
NON_DEFAULT_CONSTRUCTABLE(Iterator)
83+
84+
friend bool operator==(const Iterator &lhs, const Iterator &rhs);
85+
friend bool operator!=(const Iterator &lhs, const Iterator &rhs);
86+
87+
private:
88+
EventsDatabaseReader &reader_;
89+
EventPtr current;
90+
};
6091
}

0 commit comments

Comments
 (0)