summaryrefslogtreecommitdiff
path: root/tiger-compiler/src/overload/over-table.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'tiger-compiler/src/overload/over-table.hxx')
-rw-r--r--tiger-compiler/src/overload/over-table.hxx64
1 files changed, 64 insertions, 0 deletions
diff --git a/tiger-compiler/src/overload/over-table.hxx b/tiger-compiler/src/overload/over-table.hxx
new file mode 100644
index 0000000..de8f98b
--- /dev/null
+++ b/tiger-compiler/src/overload/over-table.hxx
@@ -0,0 +1,64 @@
+/**
+ ** \file overload/over-table.hxx
+ ** \brief Inline methods and template implementations for overload/over-table.hh.
+ */
+
+#pragma once
+
+#include <ostream>
+#include <ranges>
+
+#include <overload/over-table.hh>
+
+namespace overload
+{
+ template <typename T> OverTable<T>::OverTable()
+ {
+ oversymtab_.emplace_back();
+ }
+
+ template <typename T> void OverTable<T>::put(misc::symbol key, T& value)
+ {
+ oversymtab_.back().emplace(key, &value);
+ }
+
+ template <typename T>
+ typename OverTable<T>::range_type OverTable<T>::get(misc::symbol key)
+ {
+ precondition(!oversymtab_.empty());
+ auto& map = oversymtab_.back();
+ return map.equal_range(key);
+ }
+
+ template <typename T> void OverTable<T>::scope_begin()
+ {
+ oversymtab_.emplace_back(oversymtab_.back());
+ }
+
+ template <typename T> void OverTable<T>::scope_end()
+ {
+ precondition(!oversymtab_.empty());
+ oversymtab_.pop_back();
+ }
+
+ template <typename T>
+ std::ostream& OverTable<T>::dump(std::ostream& ostr) const
+ {
+ ostr << "<overTable>\n";
+ for (const auto& m : oversymtab_ | std::views::reverse)
+ {
+ ostr << "<scope>\n";
+ for (const auto& im : m)
+ ostr << im.first << " : " << im->second.size() << '\n';
+ ostr << "</scope>\n";
+ }
+ return ostr << "</overTable>\n";
+ }
+
+ template <typename T>
+ std::ostream& operator<<(std::ostream& ostr, const OverTable<T>& tbl)
+ {
+ return tbl.dump(ostr);
+ }
+
+} // namespace overload