diff options
author | Andrej Rode <andrej.rode@ettus.com> | 2017-04-03 18:49:58 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2017-12-22 15:03:45 -0800 |
commit | 53795c74aead4e6021bc788b788f8ed5b4a0166d (patch) | |
tree | 45e4075f3d8ffdee7dff7c72dd665f5c5b0c746c /host/lib/deps/rpclib/include/rpc/dispatcher.inl | |
parent | 6a12add1560545438e1bebc05efbafd05aace4f9 (diff) | |
download | uhd-53795c74aead4e6021bc788b788f8ed5b4a0166d.tar.gz uhd-53795c74aead4e6021bc788b788f8ed5b4a0166d.tar.bz2 uhd-53795c74aead4e6021bc788b788f8ed5b4a0166d.zip |
uhd: add cut-down rpclib source tree and import tool
Diffstat (limited to 'host/lib/deps/rpclib/include/rpc/dispatcher.inl')
-rw-r--r-- | host/lib/deps/rpclib/include/rpc/dispatcher.inl | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/host/lib/deps/rpclib/include/rpc/dispatcher.inl b/host/lib/deps/rpclib/include/rpc/dispatcher.inl new file mode 100644 index 000000000..dc10edcf9 --- /dev/null +++ b/host/lib/deps/rpclib/include/rpc/dispatcher.inl @@ -0,0 +1,74 @@ + +namespace rpc { +namespace detail { + +template <typename F> void dispatcher::bind(std::string const &name, F func) { + bind(name, func, typename detail::func_kind_info<F>::result_kind(), + typename detail::func_kind_info<F>::args_kind()); +} + +template <typename F> +void dispatcher::bind(std::string const &name, F func, + detail::tags::void_result const &, + detail::tags::zero_arg const &) { + funcs_.insert( + std::make_pair(name, [func, name](RPCLIB_MSGPACK::object const &args) { + enforce_arg_count(name, 0, args.via.array.size); + func(); + return rpc::detail::make_unique<RPCLIB_MSGPACK::object_handle>(); + })); +} + +template <typename F> +void dispatcher::bind(std::string const &name, F func, + detail::tags::void_result const &, + detail::tags::nonzero_arg const &) { + using detail::func_traits; + using args_type = typename func_traits<F>::args_type; + + funcs_.insert( + std::make_pair(name, [func, name](RPCLIB_MSGPACK::object const &args) { + constexpr int args_count = std::tuple_size<args_type>::value; + enforce_arg_count(name, args_count, args.via.array.size); + args_type args_real; + args.convert(&args_real); + detail::call(func, args_real); + return rpc::detail::make_unique<RPCLIB_MSGPACK::object_handle>(); + })); +} + +template <typename F> +void dispatcher::bind(std::string const &name, F func, + detail::tags::nonvoid_result const &, + detail::tags::zero_arg const &) { + using detail::func_traits; + + funcs_.insert(std::make_pair(name, [func, + name](RPCLIB_MSGPACK::object const &args) { + enforce_arg_count(name, 0, args.via.array.size); + auto z = rpc::detail::make_unique<RPCLIB_MSGPACK::zone>(); + auto result = RPCLIB_MSGPACK::object(func(), *z); + return rpc::detail::make_unique<RPCLIB_MSGPACK::object_handle>(result, std::move(z)); + })); +} + +template <typename F> +void dispatcher::bind(std::string const &name, F func, + detail::tags::nonvoid_result const &, + detail::tags::nonzero_arg const &) { + using detail::func_traits; + using args_type = typename func_traits<F>::args_type; + + funcs_.insert(std::make_pair(name, [func, + name](RPCLIB_MSGPACK::object const &args) { + constexpr int args_count = std::tuple_size<args_type>::value; + enforce_arg_count(name, args_count, args.via.array.size); + args_type args_real; + args.convert(&args_real); + auto z = rpc::detail::make_unique<RPCLIB_MSGPACK::zone>(); + auto result = RPCLIB_MSGPACK::object(detail::call(func, args_real), *z); + return rpc::detail::make_unique<RPCLIB_MSGPACK::object_handle>(result, std::move(z)); + })); +} +} +} |