/*
  This file is part of TON Blockchain Library.
  TON Blockchain Library is free software: you can redistribute it and/or modify
  it under the terms of the GNU Lesser General Public License as published by
  the Free Software Foundation, either version 2 of the License, or
  (at your option) any later version.
  TON Blockchain Library 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 Lesser General Public License for more details.
  You should have received a copy of the GNU Lesser General Public License
  along with TON Blockchain Library.  If not, see .
*/
#pragma once
#include "common/refcnt.hpp"
#include "td/utils/buffer.h"
#include "common/bitstring.h"
#include "vm/cells/Cell.h"
#include 
namespace vm {
using td::Ref;
class Hasher {
 public:
  explicit Hasher(int id);
  Hasher(const Hasher&) = delete;
  void append(td::ConstBitPtr data, unsigned size);
  td::BufferSlice finish();
  size_t bytes_per_gas_unit() const;
  static const int SHA256 = 0;
  static const int SHA512 = 1;
  static const int BLAKE2B = 2;
  static const int KECCAK256 = 3;
  static const int KECCAK512 = 4;
  class HasherImpl {
   public:
    virtual ~HasherImpl() = default;
    virtual void append(const unsigned char* data, size_t size) = 0;
    virtual td::BufferSlice finish() = 0;
    virtual std::unique_ptr make_copy() const = 0;
  };
 private:
  int id_ = 0;
  static const unsigned BUF_SIZE = 256;
  unsigned char buf_[BUF_SIZE];
  unsigned buf_ptr_ = 0;
  std::unique_ptr impl_;
};
}