Skip to content

Commit ddc3823

Browse files
committed
parser: use std::optional<T&> instead of T* in memo lookup return
1 parent 5edefde commit ddc3823

2 files changed

Lines changed: 11 additions & 8 deletions

File tree

‎src/parser/Parser.cpp‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ template<typename Derived> struct PatternV2
133133
if constexpr (seeds_sentinel) {
134134
if (result.has_value()) {
135135
// Safe to hold across grow_lr: memo entries live in a deque.
136-
auto *slot = p.memo_find(start_position, memo_rule_id<Derived>);
137-
ASSERT(slot);
136+
const auto &slot = p.memo_find(start_position, memo_rule_id<Derived>);
137+
ASSERT(slot.has_value());
138138
ASSERT(slot->has_value());
139139
auto &value = *slot;
140140
if (std::holds_alternative<bool>(value->value) && std::get<bool>(value->value)) {
@@ -212,7 +212,8 @@ template<size_t TypeIdx, typename PatternTuple, typename = void> class PatternMa
212212
if (!t.has_value()) { return {}; }
213213
if constexpr (::detail::has_type<typename ResultTypeHead::value_type,
214214
::detail::ValueTypesTuple>{}) {
215-
if (auto *slot = p.memo_find(original_token_position, memo_rule_id<CurrentType>)) {
215+
if (const auto &slot = p.memo_find(original_token_position, memo_rule_id<CurrentType>);
216+
slot.has_value()) {
216217
if (!slot->has_value()) { return {}; }
217218
auto &value = (*slot)->value;
218219
p.token_position() = (*slot)->position;

‎src/parser/Parser.cppm‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,20 @@ class Parser
2525

2626
using MemoSlot = std::optional<CacheValue>;
2727

28-
MemoSlot *memo_find(std::size_t position, std::uint16_t rule)
28+
std::optional<MemoSlot &> memo_find(std::size_t position, std::uint16_t rule)
2929
{
30-
if (position >= m_memo_index.size()) { return nullptr; }
30+
if (position >= m_memo_index.size()) { return std::nullopt; }
3131
for (const auto &[id, slot] : m_memo_index[position]) {
32-
if (id == rule) { return &m_memo_pool[slot]; }
32+
if (id == rule) { return m_memo_pool[slot]; }
3333
}
34-
return nullptr;
34+
return std::nullopt;
3535
}
3636

3737
MemoSlot &memo_insert(std::size_t position, std::uint16_t rule)
3838
{
39-
if (auto *existing = memo_find(position, rule)) { return *existing; }
39+
if (const auto &existing = memo_find(position, rule); existing.has_value()) {
40+
return existing.value();
41+
}
4042
if (position >= m_memo_index.size()) { m_memo_index.resize(position + 1); }
4143
m_memo_pool.emplace_back();
4244
m_memo_index[position].emplace_back(

0 commit comments

Comments
 (0)