#ifndef wasm_analysis_transfer_function_h
#define wasm_analysis_transfer_function_h
#if __cplusplus >= 202002L
#include <concepts>
#include <iterator>
#include <ranges>
#include "cfg.h"
#include "lattice.h"
#include "support/unique_deferring_queue.h"
namespace wasm::analysis {
template<typename T>
concept BasicBlockInputRange =
std::ranges::input_range<T> &&
std::is_same<std::ranges::range_value_t<T>, const BasicBlock*>::value;
template<typename TxFn, typename L>
concept TransferFunctionImpl = requires(
TxFn& txfn, const CFG& cfg, const BasicBlock& bb, typename L::Element& elem) {
{ txfn.transfer(bb, elem) } noexcept -> BasicBlockInputRange;
};
#define TransferFunction TransferFunctionImpl<L>
}
#else
#define TransferFunction typename
#endif
#endif