FuncDispatcher#

class pandas::FuncDispatcher#

pandas C++ class.

Example#

#include <pandas/pandas.h>
using namespace pandas;

// Use FuncDispatcher
FuncDispatcher obj;
// ... operations ...

Other Methods#

Signature

Return Type

Location

Example

throw IncompatibleFuncArgError( "FuncDispatcher: no registered arm for FuncArg::kind=" + std::to_string(static_cast<int>(arg.kind)) + (arg.source_repr.empty() ? "" : (" (source: " + arg.source_repr + ")")))

throw

pd_func_dispatch.h:489

View

Result call(const FuncArg& arg) const

Result

pd_func_dispatch.h:448

View

FuncDispatcher& on_array(ArrayFn fn) { array_fn_ = std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:444

FuncDispatcher& on_callable(CallableFn fn) { callable_fn_ = std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:438

View

FuncDispatcher& on_callable_list(CallableListFn fn) { callable_list_fn_= std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:439

FuncDispatcher& on_dict(DictFn fn) { dict_fn_ = std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:440

FuncDispatcher& on_index(IndexFn fn) { index_fn_ = std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:443

FuncDispatcher& on_named_agg(NamedAggFn fn) { named_agg_fn_ = std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:441

FuncDispatcher& on_series(SeriesFn fn) { series_fn_ = std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:442

FuncDispatcher& on_string(StringFn fn) { string_fn_ = std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:436

View

FuncDispatcher& on_string_list(StringListFn fn) { string_list_fn_ = std::move(fn)

FuncDispatcher&

pd_func_dispatch.h:437

View

Code Examples#

The following examples are extracted from the test suite.

IncompatibleFuncArgError (pd_test_5_all.cpp:75705)
75695        throw std::runtime_error("f_test_value_error_messages_3 failed");
75696    }
75697    std::cout << " -> tests passed" << std::endl;
75698}
75699
75700// --- f_test_dispatch_sentinels_3.cpp ---
75701
75702namespace f_test_dispatch_sentinels_3_ns {
75703
75704static void dispatch_call_emulator(const std::string& method) {
75705    throw pandas::IncompatibleFuncArgError(
75706        std::string("FuncDispatcher::call: no registered implementation for '") + method + "'");
75707}
75708
75709void case_1_exists_in_pd_exceptions_h() {
75710    std::cout << "----- case_1_exists_in_pd_exceptions_h -----\n";
75711    int local_fail = 0;
75712
75713    bool caught_func = false;
75714    try {
75715        throw pandas::IncompatibleFuncArgError("from pd_exceptions.h");
call (pd_test_2_all.cpp:21645)
21635        std::map<std::string, std::string> dtype_map = {};
21636        std::vector<int> parse_dates = {};
21637        bool parse_dates_bool = false;
21638        bool dayfirst = false;
21639        std::set<int> skiprows_set = {};
21640        std::vector<int> usecols_positions = {};
21641        std::vector<int> header_rows = {};
21642        std::vector<std::string> index_col_list = {};
21643        std::vector<int> index_col_pos_list = {};
21644
21645        pandas::DataFrame call() const {
21646            return pandas::DataFrame::read_csv(
21647                data, sep, header, index_col, index_col_pos,
21648                true, std::nullopt, "", "infer", {}, "", nullptr,
21649                dayfirst, ".", false, "", true, dtype, "",
21650                "utf-8", "strict", "", true, "",
21651                false_values, true, false, false, false,
21652                keep_default_na, lineterminator, true, false,
21653                na_filter, na_values, names,
21654                nrows, on_bad_lines, parse_dates, "\"", 0,
21655                skip_blank_lines, std::nullopt, skipinitialspace,
on_callable (pd_test_func_dispatch_5.cpp:114)
104}
105
106static void test_dispatcher_arms(int& fail) {
107    pandas::FuncDispatcher disp;
108    disp.on_string([](const std::string& name) {
109        return pandas::Result::of_scalar(static_cast<std::int64_t>(name.size()));
110    });
111    disp.on_string_list([](const std::vector<std::string>& names) {
112        return pandas::Result::of_scalar(static_cast<std::int64_t>(names.size()));
113    });
114    disp.on_callable([](const pandas::CallableHandle& h) {
115        pandas::MapCellInput in;
116        in.kind = pandas::MapCellInput::Float;
117        in.f = 0.0;
118        auto cell = h->invoke_cell(in);
119        return pandas::Result::of_scalar(cell.f);
120    });
121
122    auto r1 = disp.call(pandas::FuncArg::from_string_name("sum"));
123    pandas_tests::check(r1.is_scalar(), "string arm returns scalar", fail);
124    pandas_tests::check(std::get<std::int64_t>(r1.value) == 3,
on_string (pd_test_5_all.cpp:113936)
113926    std::cout << "-- case_H3_dispatch_with_axis_param\n";
113927    std::vector<pandas::FuncArg> inputs;  // empty -> empty frame
113928    pandas::Result r = pandas::concat_dispatch(inputs, /*axis=*/1, /*ignore_index=*/false);
113929    bool got = std::holds_alternative<std::unique_ptr<pandas::DataFrame>>(r.value);
113930    pandas_tests::check(got, "case_H3.empty_axis1_returns_dataframe", local_fail);
113931}
113932
113933static void f_concat_dispatch_q3r4s5_case_H4_dispatcher_smoke(int& local_fail) {
113934    std::cout << "-- case_H4_dispatcher_smoke\n";
113935    pandas::FuncDispatcher disp;
113936    disp.on_string([](const std::string& name) -> pandas::Result {
113937        pandas::Result r;
113938        r.value = name + ":seen";
113939        return r;
113940    });
113941    auto fa = pandas::FuncArg::from_string_name("axis0");
113942    pandas::Result r = disp.call(fa);
113943    bool got_str = std::holds_alternative<std::string>(r.value);
113944    pandas_tests::check(got_str, "case_H4.dispatcher_returns_string", local_fail);
113945    if (got_str) {
113946        pandas_tests::check(std::get<std::string>(r.value) == "axis0:seen", "case_H4.value", local_fail);
on_string_list (pd_test_func_dispatch_5.cpp:111)
101    auto fa5 = pandas::FuncArg::from_dict_spec(std::move(dict_specs));
102    pandas_tests::check(fa5.kind == pandas::FuncArgKind::DictSpec,
103                        "from_dict_spec -> DictSpec", fail);
104}
105
106static void test_dispatcher_arms(int& fail) {
107    pandas::FuncDispatcher disp;
108    disp.on_string([](const std::string& name) {
109        return pandas::Result::of_scalar(static_cast<std::int64_t>(name.size()));
110    });
111    disp.on_string_list([](const std::vector<std::string>& names) {
112        return pandas::Result::of_scalar(static_cast<std::int64_t>(names.size()));
113    });
114    disp.on_callable([](const pandas::CallableHandle& h) {
115        pandas::MapCellInput in;
116        in.kind = pandas::MapCellInput::Float;
117        in.f = 0.0;
118        auto cell = h->invoke_cell(in);
119        return pandas::Result::of_scalar(cell.f);
120    });