#ifndef HYBRID_HLLC_RUSANOV_EULERIAN_COMPOSITE_SOLVER_V2_HPP
#define HYBRID_HLLC_RUSANOV_EULERIAN_COMPOSITE_SOLVER_V2_HPP

#include <mesh/MeshVariant.hpp>
#include <scheme/DiscreteFunctionVariant.hpp>
#include <scheme/IBoundaryConditionDescriptor.hpp>
#include <scheme/RusanovEulerianCompositeSolverTools.hpp>

#include <memory>
#include <vector>

// double compute_dt(const std::shared_ptr<const DiscreteFunctionVariant>& u_v,
//                  const std::shared_ptr<const DiscreteFunctionVariant>& c_v);

std::tuple<std::shared_ptr<const DiscreteFunctionVariant>,
           std::shared_ptr<const DiscreteFunctionVariant>,
           std::shared_ptr<const DiscreteFunctionVariant>>
hybridHLLcRusanovEulerianCompositeSolver_v2(
  const std::shared_ptr<const DiscreteFunctionVariant>& rho,
  const std::shared_ptr<const DiscreteFunctionVariant>& u,
  const std::shared_ptr<const DiscreteFunctionVariant>& E,
  const double& gamma,
  const std::shared_ptr<const DiscreteFunctionVariant>& c,
  const std::shared_ptr<const DiscreteFunctionVariant>& p,
  // const size_t& degree,
  const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list,
  const double& dt,
  const bool check = false);

#endif   // HYBRID_HLLC_RUSANOV_EULERIAN_COMPOSITE_SOLVER_V2_HPP