namespace openvino::cc::internal

namespace internal {

// structs

template <typename C, typename T>
struct case_wrapper;

// global functions

template <typename T, typename C>
case_wrapper<C, T> make_case_wrapper(C&& val);

template <template<typename...> class Fn, typename Ctx, typename T, typename Case>
bool match(
    Ctx&& ctx,
    T&& val,
    Case&& cs
    );

template <
    template<typename...> class Fn,
    typename Ctx,
    typename T,
    typename Case,
    typename... Cases
    >
bool match(
    Ctx&& ctx,
    T&& val,
    Case&& cs,
    Cases&&... cases
    );

} // namespace internal