#ifndef __TreeSitter__item_set__ #define __TreeSitter__item_set__ #include "item.h" #include "grammar.h" namespace tree_sitter { namespace lr { class ItemSet; typedef std::shared_ptr item_set_ptr; class ItemSet { const std::vector contents; public: ItemSet(const std::vector &items); ItemSet(const std::initializer_list &items); ItemSet(const Item &item, const Grammar &grammar); typedef Item value_type; typedef std::vector::const_iterator const_iterator; const_iterator begin() const; const_iterator end() const; size_t size() const; TransitionMap sym_transitions(const Grammar &grammar) const; TransitionMap char_transitions(const Grammar &grammar) const; bool operator==(const ItemSet &other) const; }; typedef std::shared_ptr item_set_ptr; std::ostream& operator<<(std::ostream &stream, const ItemSet &item_set); } } namespace std { template<> struct hash { size_t operator()(const tree_sitter::lr::ItemSet &item_set) const { size_t result = hash()(item_set.size()); for (auto item : item_set) result ^= hash()(item); return result; } }; } #endif