#pragma once
#include <liblangutil/EVMVersion.h>
#include <libevmasm/Assembly.h>
#include <libevmasm/GasMeter.h>
#include <array>
#include <map>
#include <vector>
namespace solidity::frontend
{
class ASTNode;
class FunctionDefinition;
struct GasEstimator
{
public:
using GasConsumption = evmasm::GasMeter::GasConsumption;
using ASTGasConsumption = std::map<ASTNode const*, GasConsumption>;
using ASTGasConsumptionSelfAccumulated =
std::map<ASTNode const*, std::array<GasConsumption, 2>>;
explicit GasEstimator(langutil::EVMVersion _evmVersion): m_evmVersion(_evmVersion) {}
GasConsumption functionalEstimation(
evmasm::AssemblyItems const& _items,
std::string const& _signature = ""
) const;
GasConsumption functionalEstimation(
evmasm::AssemblyItems const& _items,
size_t const& _offset,
FunctionDefinition const& _function
) const;
private:
static std::set<ASTNode const*> finestNodesAtLocation(std::vector<ASTNode const*> const& _roots);
langutil::EVMVersion m_evmVersion;
};
}