// Copyright 2025 Oliver Theimer
#pragma once

#include <cstddef>
#include "./bbdd_node.hpp"
#include "./bbdd_types.hpp"

struct merge_key {
  bbdd_node_t *f, *g;
  bbdd_op_t op;

  bool operator==(const merge_key &key) const {
    return f->cvo_lvl.pv == key.f->cvo_lvl.pv &&
           f->cvo_lvl.sv == key.f->cvo_lvl.sv &&
           f->neq_child == key.f->neq_child && f->eq_child == key.f->eq_child &&
           g->cvo_lvl.pv == key.g->cvo_lvl.pv &&
           g->cvo_lvl.sv == key.g->cvo_lvl.sv &&
           g->neq_child == key.g->neq_child && g->eq_child == key.g->eq_child &&
           op == key.op;
  }
};

struct merge_hash {
  std::size_t operator()(const merge_key &k) const {
    return std::hash<int>()(k.f->index) ^ (std::hash<int>()(k.g->index) << 1) ^
           (std::hash<char>()(k.op) << 2);
  }
};
