/** ** \file overload/over-table.hxx ** \brief Inline methods and template implementations for overload/over-table.hh. */ #pragma once #include #include #include namespace overload { template OverTable::OverTable() { oversymtab_.emplace_back(); } template void OverTable::put(misc::symbol key, T& value) { oversymtab_.back().emplace(key, &value); } template typename OverTable::range_type OverTable::get(misc::symbol key) { precondition(!oversymtab_.empty()); auto& map = oversymtab_.back(); return map.equal_range(key); } template void OverTable::scope_begin() { oversymtab_.emplace_back(oversymtab_.back()); } template void OverTable::scope_end() { precondition(!oversymtab_.empty()); oversymtab_.pop_back(); } template std::ostream& OverTable::dump(std::ostream& ostr) const { ostr << "\n"; for (const auto& m : oversymtab_ | std::views::reverse) { ostr << "\n"; for (const auto& im : m) ostr << im.first << " : " << im->second.size() << '\n'; ostr << "\n"; } return ostr << "\n"; } template std::ostream& operator<<(std::ostream& ostr, const OverTable& tbl) { return tbl.dump(ostr); } } // namespace overload