/* This file is part of cpp-ethereum. cpp-ethereum is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. cpp-ethereum is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with cpp-ethereum. If not, see . */ /** * @file ExpressionClasses.h * @author Christian * @date 2015 * Container for equivalence classes of expressions for use in common subexpression elimination. */ #pragma once #include #include #include namespace dev { namespace eth { class AssemblyItem; /** * Collection of classes of equivalent expressions that can also determine the class of an expression. * Identifiers are contiguously assigned to new classes starting from zero. */ class ExpressionClasses { public: using Id = unsigned; using Ids = std::vector; struct Expression { Id id; AssemblyItem const* item; Ids arguments; bool operator<(Expression const& _other) const; }; /// Retrieves the id of the expression equivalence class resulting from the given item applied to the /// given classes, might also create a new one. Id find(AssemblyItem const& _item, Ids const& _arguments = {}); /// @returns the canonical representative of an expression class. Expression const& representative(Id _id) const { return m_representatives.at(_id); } /// @returns the number of classes. Id size() const { return m_representatives.size(); } private: /// Tries to simplify the given expression. /// @returns its class if it possible or Id(-1) otherwise. /// @param _secondRun is set to true for the second run where arguments of commutative expressions are reversed Id tryToSimplify(Expression const& _expr, bool _secondRun = false); /// Expression equivalence class representatives - we only store one item of an equivalence. std::vector m_representatives; std::vector> m_spareAssemblyItem; }; } }