summaryrefslogtreecommitdiff
path: root/tiger-compiler/lib/misc/map.hxx
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
commit967be9e750221ab2ab783f95df79bb26d290a45e (patch)
tree6802900a5e975f9f68b169f0f503f040056d6952 /tiger-compiler/lib/misc/map.hxx
add: added projectsHEADmain
Diffstat (limited to 'tiger-compiler/lib/misc/map.hxx')
-rw-r--r--tiger-compiler/lib/misc/map.hxx176
1 files changed, 176 insertions, 0 deletions
diff --git a/tiger-compiler/lib/misc/map.hxx b/tiger-compiler/lib/misc/map.hxx
new file mode 100644
index 0000000..fb429ac
--- /dev/null
+++ b/tiger-compiler/lib/misc/map.hxx
@@ -0,0 +1,176 @@
+/** -*- C++ -*-
+ ** \file misc/map.hxx
+ ** \brief Implementation of misc::map.
+ */
+
+#pragma once
+
+#include <iostream>
+#include <sstream>
+
+#include <boost/lexical_cast.hpp>
+
+#include <misc/contract.hh>
+#include <misc/indent.hh>
+#include <misc/map.hh>
+
+namespace misc
+{
+ template <class T, class N> map<T, N>* map<T, N>::clone() const
+ {
+ return new map<T, N>(*this);
+ }
+
+ template <class T, class N>
+ typename map<T, N>::const_iterator map<T, N>::find(const T& t) const
+ {
+ return map_.find(t);
+ }
+
+ template <class T, class N>
+ typename map<T, N>::iterator map<T, N>::find(const T& t)
+ {
+ return map_.find(t);
+ }
+
+ template <class T, class N>
+ typename map<T, N>::iterator map<T, N>::xfind(const T& t)
+ {
+ if (auto&& ires = find(t); ires != map_.end())
+ return ires;
+ else
+ throw std::range_error(std::string("map: no mapping for ")
+ + boost::lexical_cast<std::string>(t));
+ }
+
+ template <class T, class N>
+ typename map<T, N>::const_iterator map<T, N>::xfind(const T& t) const
+ {
+ if (const auto&& ires = find(t); ires != map_.end())
+ return ires;
+ else
+ throw std::range_error(std::string("map: no mapping for ")
+ + boost::lexical_cast<std::string>(t));
+ }
+
+ template <class T, class N>
+ typename map<T, N>::key_compare map<T, N>::key_comp() const
+ {
+ return map_.key_comp();
+ }
+
+ template <class T, class N> N map<T, N>::operator()(const T& t) const
+ {
+ return xfind(t)->second;
+ }
+
+ template <class T, class N>
+ template <typename Container>
+ requires ConstIterableType<Container, T>
+ std::vector<N> map<T, N>::operator()(const Container& ts) const
+ {
+ std::vector<N> res;
+ for (const T& t : ts)
+ res.emplace_back(operator()(t));
+ return res;
+ }
+
+ template <class T, class N>
+ std::ostream& map<T, N>::print(std::ostream& ostr) const
+ {
+ for (const value_type& p : *this)
+ ostr << p.first << " -> " << p.second << misc::iendl;
+ return ostr;
+ }
+
+ template <class T, class N> N map<T, N>::operator[](const T& t) const
+ {
+ return operator()(t);
+ }
+
+ template <class T, class N> N& map<T, N>::operator[](const T& t)
+ {
+ return map_[t];
+ }
+
+ template <class T, class N> typename map<T, N>::iterator map<T, N>::begin()
+ {
+ return map_.begin();
+ }
+
+ template <class T, class N> typename map<T, N>::iterator map<T, N>::end()
+ {
+ return map_.end();
+ }
+
+ template <class T, class N>
+ typename map<T, N>::const_iterator map<T, N>::begin() const
+ {
+ return map_.begin();
+ }
+
+ template <class T, class N>
+ typename map<T, N>::const_iterator map<T, N>::end() const
+ {
+ return map_.end();
+ }
+
+ template <class T, class N>
+ typename map<T, N>::iterator map<T, N>::lower_bound(const T& k)
+ {
+ return map_.lower_bound(k);
+ }
+
+ template <class T, class N>
+ typename map<T, N>::const_iterator map<T, N>::lower_bound(const T& k) const
+ {
+ return map_.lower_bound(k);
+ }
+
+ template <class T, class N>
+ std::pair<typename map<T, N>::iterator, bool>
+ map<T, N>::insert(const std::pair<const T, N>& x)
+ {
+ return map_.insert(x);
+ }
+
+ template <class T, class N> void map<T, N>::insert(const map& other)
+ {
+ map_.insert(other.begin(), other.end());
+ }
+
+ template <class T, class N>
+ template <class... Args>
+ std::pair<typename map<T, N>::iterator, bool>
+ map<T, N>::emplace(Args&&... args)
+ {
+ return map_.emplace(std::forward<Args>(args)...);
+ }
+
+ template <class T, class N> bool map<T, N>::empty() const
+ {
+ return map_.empty();
+ }
+
+ template <class T, class N> size_t map<T, N>::size() const
+ {
+ return map_.size();
+ }
+
+ template <class T, class N> N map<T, N>::take(const T& t)
+ {
+ auto ires = xfind(t);
+ N elt = ires->second;
+ map_.erase(ires);
+ return elt;
+ }
+
+ template <class T, class N> void map<T, N>::clear() { map_.clear(); }
+
+ template <class T, class N>
+ std::ostream& operator<<(std::ostream& ostr, const map<T, N>& m)
+ {
+ return m.print(ostr);
+ }
+
+} // namespace misc