#pragma once
#include "dolfinx/geometry/BoundingBoxTree.h"
#include <cmath>

#pragma once
#include "nanobind_helpers.h"

#pragma once
#include "rust/cxx.h"

namespace dolfinx_access {
    struct FunctionInfo;

    typedef geometry::BoundingBoxTree<double> BBTree_f64;
    extern void drop_Function_f64(Function_f64* f);

    extern int32_t cell_Mesh_f64(std::shared_ptr<const mesh::Mesh<double>> mesh,
                                 const std::array<double, 3>& x);

    extern int32_t cell_FunctionSpace_f64(FunctionSpace<double> const* v,
                                          const std::array<double, 3>& x);

    extern int32_t cell_Function_f64(Function_f64 const* f, const std::array<double, 3>& x);

    extern double eval_Function_f64_cell(Function_f64 const* f, const std::array<double, 3>& x,
                                         int32_t cell);

    extern double eval_Function_f64(Function_f64 const* f, const std::array<double, 3>& x);

    extern std::array<double, 6> eval_Function_f64_cell_6(Function_f64 const* f,
                                                          const std::array<double, 3 * 6>& x,
                                                          int32_t cell_index);

    FunctionInfo info_Function_f64(Function_f64 const* f);

    std::array<double, 3 * 3> cell_coords_Function_f64_triangle(Function_f64 const* f,
                                                                int32_t cell);

    rust::Slice<const double> data_Function_f64(Function_f64 const* f);

    rust::Slice<double> data_mut_Function_f64(Function_f64* f);

    void check_compat_Function_f64(Function_f64 const* f, Function_f64 const* g);

    Function_f64* similar_Function_f64(Function_f64 const* f);

    Function_f64* clone_Function_f64(Function_f64 const* f);

} // namespace dolfinx_access
