From b991971df9ddcb8cf784cfd2d48328f35dcfde1e Mon Sep 17 00:00:00 2001 From: Jackson Date: Wed, 12 Jan 2022 23:39:04 -0500 Subject: [PATCH 01/20] Cleanup based on best practices and clang-tidy --- CMakeLists.txt | 1 + examples/tcp_server/server.hpp | 2 +- include/rpc.hpp | 54 ++++++++++++++++++---------- include/rpc_adapters/rpc_bitsery.hpp | 50 +++++++++++++++++--------- tests/rpc.server.cpp | 23 ++++++------ 5 files changed, 83 insertions(+), 47 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 67cd5323..946c31f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -162,6 +162,7 @@ elseif(CXX_CLANG) -Wno-documentation -Wno-documentation-unknown-command -Wno-weak-vtables + -Wno-reserved-identifier -Wno-reserved-id-macro -Wno-missing-braces -Wno-covered-switch-default) diff --git a/examples/tcp_server/server.hpp b/examples/tcp_server/server.hpp index 8d8e9b56..bc7a9fd5 100644 --- a/examples/tcp_server/server.hpp +++ b/examples/tcp_server/server.hpp @@ -22,6 +22,6 @@ class RpcServer : public rpc::server_interface void dispatch_impl(rpc::adapters::njson::njson_t& serial_obj) override; asio::io_context& m_io; - std::atomic m_running{ false }; + mutable std::atomic m_running{ false }; uint16_t m_port; }; diff --git a/include/rpc.hpp b/include/rpc.hpp index 4130c1db..31de7a91 100644 --- a/include/rpc.hpp +++ b/include/rpc.hpp @@ -215,8 +215,7 @@ namespace details using expander = int[]; (void)expander{ 0, ( - (void)[](auto&& x, auto&& y) - { + (void)[](auto&& x, auto&& y) { if constexpr ( std::is_reference_v< decltype(x)> && !std::is_const_v>) @@ -241,6 +240,8 @@ namespace details public: using args_t = std::tuple>...>; + virtual ~packed_func_base() = default; + packed_func_base(std::string func_name, args_t args) : m_func_name(std::move(func_name)), m_args(std::move(args)) { @@ -254,7 +255,7 @@ namespace details void set_err_mesg(const std::string& mesg) & { m_err_mesg = mesg; } - virtual explicit operator bool() const { return m_err_mesg.empty(); } + explicit operator bool() const { return is_valid(); } const args_t& get_args() const& { return m_args; } [[nodiscard]] args_t get_args() && { return std::move(m_args); } @@ -274,6 +275,15 @@ namespace details return std::get(std::move(m_args)); } + protected: + // Prevent slicing + packed_func_base(const packed_func_base&) = default; + packed_func_base(packed_func_base&&) noexcept = default; + packed_func_base& operator=(const packed_func_base&) & = default; + packed_func_base& operator=(packed_func_base&&) & noexcept = default; + + [[nodiscard]] virtual bool is_valid() const { return m_err_mesg.empty(); } + private: std::string m_func_name; std::string m_err_mesg{}; @@ -326,16 +336,6 @@ class packed_func final : public details::packed_func_base { } - ///@brief Indicates if the packed_func holds a return value and no error occurred - /// - ///@note If an error occurred, the reason may be retrieved from the get_err_mesg() function - ///@return true A return value exists and no error occurred - ///@return false A return value does not exist AND/OR an error occurred - explicit operator bool() const override - { - return m_result.has_value() && details::packed_func_base::operator bool(); - } - ///@brief Returns the result, throwing with the error message if it does not exist /// ///@return R The result of the function call @@ -369,6 +369,11 @@ class packed_func final : public details::packed_func_base void clear_result() & { m_result = std::nullopt; } private: + [[nodiscard]] bool is_valid() const override + { + return m_result.has_value() && details::packed_func_base::is_valid(); + } + std::optional m_result{ std::nullopt }; }; @@ -449,6 +454,11 @@ inline namespace server using adapter_t = Serial; virtual ~server_interface() = default; + server_interface() = default; + + server_interface(const server_interface&) = delete; + server_interface& operator=(const server_interface&) = delete; + server_interface& operator=(server_interface&&) = delete; ///@brief Runs the callback function and updates the result (and any changes to mutable arguments) in the packed_func /// @@ -552,11 +562,6 @@ inline namespace server serial_obj = pack_adapter::template serialize_pack(pack); } - ///@brief Implementation component for the dispatch function - /// - ///@param serial_obj Serial object used to represent the function call - virtual void dispatch_impl(typename Serial::serial_t& serial_obj) = 0; - ///@brief Parses the received serialized data and determines which function to call /// ///@param bytes Data to be parsed into/back out of a serial object @@ -576,8 +581,13 @@ inline namespace server bytes = Serial::to_bytes(std::move(serial_obj)); } -# if defined(RPC_HPP_SERVER_IMPL) && defined(RPC_HPP_ENABLE_SERVER_CACHE) + protected: + server_interface(server_interface&&) noexcept = default; + private: + virtual void dispatch_impl(typename Serial::serial_t& serial_obj) = 0; + +# if defined(RPC_HPP_SERVER_IMPL) && defined(RPC_HPP_ENABLE_SERVER_CACHE) template static void* get_func_cache_impl(const std::string& func_name) { @@ -608,6 +618,12 @@ inline namespace client { public: virtual ~client_interface() = default; + client_interface() = default; + + client_interface(const client_interface&) = delete; + client_interface(client_interface&&) noexcept = default; + client_interface& operator=(const client_interface&) = delete; + client_interface& operator=(client_interface&&) = delete; ///@brief Sends an RPC call request to a server, waits for a response, then returns the result /// diff --git a/include/rpc_adapters/rpc_bitsery.hpp b/include/rpc_adapters/rpc_bitsery.hpp index aa7a3541..5f304ab4 100644 --- a/include/rpc_adapters/rpc_bitsery.hpp +++ b/include/rpc_adapters/rpc_bitsery.hpp @@ -358,31 +358,37 @@ namespace adapters { if (size < 0x80U) { - bytes.insert(bytes.begin() + index++, static_cast(size)); + assert(index < size); + assert(index <= std::numeric_limits::max()); + + bytes.insert(bytes.begin() + static_cast(index++), + static_cast(size)); } else { if (size < 0x4000U) { - bytes.insert( - bytes.begin() + index++, static_cast((size >> 8) | 0x80U)); - bytes.insert(bytes.begin() + index++, static_cast(size)); + bytes.insert(bytes.begin() + static_cast(index++), + static_cast((size >> 8) | 0x80U)); + + bytes.insert(bytes.begin() + static_cast(index++), + static_cast(size)); } else { assert(size < 0x40000000U); - bytes.insert( - bytes.begin() + index++, static_cast((size >> 24) | 0xC0U)); - bytes.insert(bytes.begin() + index++, static_cast(size >> 16)); + bytes.insert(bytes.begin() + static_cast(index++), + static_cast((size >> 24) | 0xC0U)); - const auto sh = static_cast(size); + bytes.insert(bytes.begin() + static_cast(index++), + static_cast(size >> 16)); - bytes.insert( - bytes.begin() + index++, *reinterpret_cast(&size)); + bytes.insert(bytes.begin() + static_cast(index++), + *reinterpret_cast(&size)); - bytes.insert( - bytes.begin() + index++, *reinterpret_cast(&size) + 1); + bytes.insert(bytes.begin() + static_cast(index++), + *reinterpret_cast(&size) + 1); } } } @@ -484,7 +490,11 @@ inline std::string pack_adapter::get_func_name( { size_t index = 0; const auto len = adapters::bitsery::details::extract_length(serial_obj, index); - return { serial_obj.begin() + index, serial_obj.begin() + index + len }; + + assert(index < serial_obj.size()); + assert(index <= std::numeric_limits::max()); + return { serial_obj.begin() + static_cast(index), + serial_obj.begin() + static_cast(index) + len }; } template<> @@ -504,8 +514,12 @@ inline void pack_adapter::set_err_mesg( if (new_err_len != err_len) { - serial_obj.erase( - serial_obj.begin() + name_sz_len + name_len, serial_obj.begin() + index + err_len); + assert(index < serial_obj.size()); + assert(index <= std::numeric_limits::max()); + + serial_obj.erase(serial_obj.begin() + static_cast(name_sz_len) + + static_cast(name_len), + serial_obj.begin() + static_cast(index) + static_cast(err_len)); index = name_sz_len + name_len; adapters::bitsery::details::write_length(serial_obj, new_err_len, index); @@ -513,7 +527,11 @@ inline void pack_adapter::set_err_mesg( for (unsigned i = 0; i < new_err_len; ++i) { - serial_obj.insert(serial_obj.begin() + index++, mesg[i]); + assert(index < serial_obj.size()); + assert(index <= std::numeric_limits::max()); + + serial_obj.insert(serial_obj.begin() + static_cast(index++), + static_cast(mesg[i])); } } } // namespace rpc diff --git a/tests/rpc.server.cpp b/tests/rpc.server.cpp index fca63d5c..b86c44b5 100644 --- a/tests/rpc.server.cpp +++ b/tests/rpc.server.cpp @@ -88,22 +88,24 @@ static std::condition_variable cv; } // NOTE: This function is only for testing purposes. Obviously you would not want this in a production server! -inline void KillServer() noexcept +void KillServer() noexcept { - std::unique_lock lk{ MUTEX }; - RUNNING = false; - lk.unlock(); + { + auto lk = std::unique_lock{ MUTEX }; + RUNNING = false; + } + cv.notify_one(); } // cached -inline size_t StrLen(const std::string& str) +size_t StrLen(const std::string& str) { return str.size(); } // cached -inline std::vector AddOneToEach(std::vector vec) +std::vector AddOneToEach(std::vector vec) { for (auto& n : vec) { @@ -113,7 +115,7 @@ inline std::vector AddOneToEach(std::vector vec) return vec; } -inline void AddOneToEachRef(std::vector& vec) +void AddOneToEachRef(std::vector& vec) { for (auto& n : vec) { @@ -149,9 +151,8 @@ void FibonacciRef(uint64_t& number) } // cached -inline double StdDev(const double n1, const double n2, const double n3, const double n4, - const double n5, const double n6, const double n7, const double n8, const double n9, - const double n10) +double StdDev(const double n1, const double n2, const double n3, const double n4, const double n5, + const double n6, const double n7, const double n8, const double n9, const double n10) { const auto avg = Average( n1 * n1, n2 * n2, n3 * n3, n4 * n4, n5 * n5, n6 * n6, n7 * n7, n8 * n8, n9 * n9, n10 * n10); @@ -396,7 +397,7 @@ int main(const int argc, char* argv[]) std::cout << "Running Bitsery server on port 5003...\n"; #endif - std::unique_lock lk{ MUTEX }; + auto lk = std::unique_lock{ MUTEX }; cv.wait(lk, [] { return !RUNNING; }); #if defined(RPC_HPP_ENABLE_NJSON) From 5f8b89e98d28b6819179d7cc94142c22201f2ecc Mon Sep 17 00:00:00 2001 From: Jackson Date: Thu, 13 Jan 2022 00:20:38 -0500 Subject: [PATCH 02/20] Fix data race issues by cleaning up server impl --- benchmarks/benchmark.cpp | 8 ++++---- examples/module/module.cpp | 4 ++-- tests/rpc.server.cpp | 29 ++++++++++++----------------- tests/rpc.server.hpp | 9 ++++++--- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/benchmarks/benchmark.cpp b/benchmarks/benchmark.cpp index b1c6040f..e7e62544 100644 --- a/benchmarks/benchmark.cpp +++ b/benchmarks/benchmark.cpp @@ -460,7 +460,7 @@ TEST_CASE("Sequential", "[sequential][cached]") BENCHMARK("rpc.hpp (asio::tcp, njson)") { auto vec = GetClient().template call_func>( - "GenRandInts", 5, 30, 1000); + "GenRandInts", 5, 30, 1'000); for (auto& val : vec) { @@ -475,7 +475,7 @@ TEST_CASE("Sequential", "[sequential][cached]") BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") { auto vec = GetClient().template call_func>( - "GenRandInts", 5, 30, 1000); + "GenRandInts", 5, 30, 1'000); for (auto& val : vec) { @@ -491,7 +491,7 @@ TEST_CASE("Sequential", "[sequential][cached]") BENCHMARK("rpc.hpp (asio::tcp, bjson)") { auto vec = GetClient().template call_func>( - "GenRandInts", 5, 30, 1000); + "GenRandInts", 5, 30, 1'000); for (auto& val : vec) { @@ -507,7 +507,7 @@ TEST_CASE("Sequential", "[sequential][cached]") BENCHMARK("rpc.hpp (asio::tcp, bitsery)") { auto vec = GetClient().template call_func>( - "GenRandInts", 5, 30, 1000); + "GenRandInts", 5, 30, 1'000); for (auto& val : vec) { diff --git a/examples/module/module.cpp b/examples/module/module.cpp index 89c13fe1..89d58365 100644 --- a/examples/module/module.cpp +++ b/examples/module/module.cpp @@ -8,8 +8,6 @@ constexpr auto MODULE_NAME{ "rpc_module" }; -static RpcModule rpc_mod; - inline int Sum(int n1, int n2) { return n1 + n2; @@ -35,6 +33,8 @@ void RpcModule::dispatch_impl(rpc::adapters::njson::njson_t& serial_obj) int RunRemoteFunc(char* const json_str, const size_t json_buf_len) { + static RpcModule rpc_mod{}; + std::string input{ json_str }; rpc_mod.dispatch(input); diff --git a/tests/rpc.server.cpp b/tests/rpc.server.cpp index b86c44b5..a735ea4b 100644 --- a/tests/rpc.server.cpp +++ b/tests/rpc.server.cpp @@ -69,18 +69,14 @@ const uint64_t rpc::adapters::bitsery::config::max_container_size = 100; #include #include -#include #include #include #include -#include #include #include #include -static bool RUNNING = false; -static std::mutex MUTEX; -static std::condition_variable cv; +std::atomic RUNNING{ false }; [[noreturn]] void ThrowError() noexcept(false) { @@ -90,12 +86,7 @@ static std::condition_variable cv; // NOTE: This function is only for testing purposes. Obviously you would not want this in a production server! void KillServer() noexcept { - { - auto lk = std::unique_lock{ MUTEX }; - RUNNING = false; - } - - cv.notify_one(); + RUNNING = false; } // cached @@ -355,6 +346,8 @@ int main(const int argc, char* argv[]) asio::io_context io_context{}; RUNNING = true; + std::vector threads; + #if defined(RPC_HPP_ENABLE_NJSON) TestServer njson_server{ io_context, 5000U }; @@ -375,30 +368,32 @@ int main(const int argc, char* argv[]) LOAD_CACHE(njson_server, CountChars, njson_dump_path); } - std::thread(&TestServer::Run, &njson_server).detach(); + threads.emplace_back(&TestServer::Run, &njson_server); std::cout << "Running njson server on port 5000...\n"; #endif #if defined(RPC_HPP_ENABLE_RAPIDJSON) TestServer rapidjson_server{ io_context, 5001U }; - std::thread(&TestServer::Run, &rapidjson_server).detach(); + threads.emplace_back(&TestServer::Run, &rapidjson_server); std::cout << "Running rapidjson server on port 5001...\n"; #endif #if defined(RPC_HPP_ENABLE_BOOST_JSON) TestServer bjson_server{ io_context, 5002U }; - std::thread(&TestServer::Run, &bjson_server).detach(); + threads.emplace_back(&TestServer::Run, &bjson_server); std::cout << "Running Boost.JSON server on port 5002...\n"; #endif #if defined(RPC_HPP_ENABLE_BITSERY) TestServer bitsery_server{ io_context, 5003U }; - std::thread(&TestServer::Run, &bitsery_server).detach(); + threads.emplace_back(&TestServer::Run, &bitsery_server); std::cout << "Running Bitsery server on port 5003...\n"; #endif - auto lk = std::unique_lock{ MUTEX }; - cv.wait(lk, [] { return !RUNNING; }); + for (auto& th : threads) + { + th.join(); + } #if defined(RPC_HPP_ENABLE_NJSON) DUMP_CACHE(njson_server, SimpleSum, njson_dump_path); diff --git a/tests/rpc.server.hpp b/tests/rpc.server.hpp index 06dba8e0..90bdf79f 100644 --- a/tests/rpc.server.hpp +++ b/tests/rpc.server.hpp @@ -43,6 +43,7 @@ #include #include +#include #include #include #include @@ -55,6 +56,8 @@ using asio::ip::tcp; +extern std::atomic RUNNING; + // Forward declares [[noreturn]] void ThrowError() noexcept(false); void KillServer() noexcept; @@ -112,9 +115,9 @@ class TestServer final : public rpc::server_interface { } - [[noreturn]] void Run() + void Run() { - while (true) + while (RUNNING) { tcp::socket sock = m_accept.accept(); constexpr auto BUFFER_SZ = 64U * 1024UL; @@ -122,7 +125,7 @@ class TestServer final : public rpc::server_interface try { - while (true) + while (RUNNING) { asio::error_code error; const size_t len = sock.read_some(asio::buffer(data.get(), BUFFER_SZ), error); From 3d011ba56c719e4b36b5c818abaed10a7589cab2 Mon Sep 17 00:00:00 2001 From: Jackson Date: Thu, 13 Jan 2022 00:47:22 -0500 Subject: [PATCH 03/20] Update version number and docs --- CMakeLists.txt | 2 +- benchmarks/meson.build | 57 -- docs/annotated.html | 34 +- docs/classes.html | 12 +- ..._1client_1_1client__interface-members.html | 8 +- ...assrpc_1_1client_1_1client__interface.html | 18 +- docs/classrpc_1_1pack__adapter-members.html | 28 +- docs/classrpc_1_1pack__adapter.html | 98 +-- docs/classrpc_1_1packed__func-members.html | 7 +- docs/classrpc_1_1packed__func.html | 74 +- ..._01void_00_01Args_8_8_8_01_4-members.html} | 10 +- ...__func_3_01void_00_01Args_8_8_8_01_4.html} | 30 +- ...oid_00_01Args_8_8_8_01_4__coll__graph.map} | 4 +- ...oid_00_01Args_8_8_8_01_4__coll__graph.md5} | 0 ...void_00_01Args_8_8_8_01_4__coll__graph.png | Bin 0 -> 6845 bytes ..._00_01Args_8_8_8_01_4__inherit__graph.map} | 4 +- ..._00_01Args_8_8_8_01_4__inherit__graph.md5} | 0 ...d_00_01Args_8_8_8_01_4__inherit__graph.png | Bin 0 -> 6845 bytes ...oid_00_01_args_8_8_8_01_4__coll__graph.png | Bin 1968 -> 0 bytes ..._00_01_args_8_8_8_01_4__inherit__graph.png | Bin 1968 -> 0 bytes .../classrpc_1_1packed__func__coll__graph.map | 4 +- .../classrpc_1_1packed__func__coll__graph.png | Bin 1923 -> 6568 bytes ...assrpc_1_1packed__func__inherit__graph.map | 4 +- ...assrpc_1_1packed__func__inherit__graph.png | Bin 1923 -> 6568 bytes ..._1server_1_1server__interface-members.html | 21 +- ...assrpc_1_1server_1_1server__interface.html | 84 +-- .../dir_0ca40f09774b0c9b36fedfbb476b8248.html | 9 +- ...r_0ca40f09774b0c9b36fedfbb476b8248_dep.map | 4 +- ...r_0ca40f09774b0c9b36fedfbb476b8248_dep.png | Bin 1031 -> 2926 bytes .../dir_d44c64559bbebec7f509842c48db8b23.html | 2 +- docs/files.html | 13 +- docs/functions.html | 18 +- docs/functions_func.html | 16 +- docs/functions_type.html | 4 +- docs/globals.html | 29 +- docs/globals_defs.html | 29 +- docs/graph_legend.html | 2 +- docs/graph_legend.png | Bin 13384 -> 23266 bytes docs/hierarchy.html | 22 +- docs/index.html | 154 +++- docs/inherit_graph_0.map | 2 +- docs/inherit_graph_0.md5 | 2 +- docs/inherit_graph_0.png | Bin 730 -> 3512 bytes docs/inherit_graph_1.map | 2 +- docs/inherit_graph_1.md5 | 2 +- docs/inherit_graph_1.png | Bin 717 -> 3474 bytes docs/inherit_graph_10.map | 5 + docs/inherit_graph_10.md5 | 1 + docs/inherit_graph_10.png | Bin 0 -> 10295 bytes docs/inherit_graph_11.map | 3 + docs/inherit_graph_11.md5 | 1 + docs/inherit_graph_11.png | Bin 0 -> 2751 bytes docs/inherit_graph_12.map | 3 + docs/inherit_graph_12.md5 | 1 + docs/inherit_graph_12.png | Bin 0 -> 2893 bytes docs/inherit_graph_13.map | 3 + docs/inherit_graph_13.md5 | 1 + docs/inherit_graph_13.png | Bin 0 -> 2746 bytes docs/inherit_graph_2.map | 2 +- docs/inherit_graph_2.md5 | 2 +- docs/inherit_graph_2.png | Bin 699 -> 3453 bytes docs/inherit_graph_3.map | 4 +- docs/inherit_graph_3.md5 | 2 +- docs/inherit_graph_3.png | Bin 3364 -> 3496 bytes docs/inherit_graph_4.map | 2 +- docs/inherit_graph_4.md5 | 2 +- docs/inherit_graph_4.png | Bin 730 -> 4032 bytes docs/inherit_graph_5.map | 2 +- docs/inherit_graph_5.md5 | 2 +- docs/inherit_graph_5.png | Bin 734 -> 4921 bytes docs/inherit_graph_6.map | 3 + docs/inherit_graph_6.md5 | 1 + docs/inherit_graph_6.png | Bin 0 -> 5184 bytes docs/inherit_graph_7.map | 3 + docs/inherit_graph_7.md5 | 1 + docs/inherit_graph_7.png | Bin 0 -> 2635 bytes docs/inherit_graph_8.map | 3 + docs/inherit_graph_8.md5 | 1 + docs/inherit_graph_8.png | Bin 0 -> 2401 bytes docs/inherit_graph_9.map | 3 + docs/inherit_graph_9.md5 | 1 + docs/inherit_graph_9.png | Bin 0 -> 2424 bytes docs/inherits.html | 82 ++- docs/md_CODE_OF_CONDUCT.html | 134 ++++ docs/md_CONTRIBUTING.html | 361 +++++++++ docs/md_INSTALL.html | 256 +++++++ docs/md_SECURITY.html | 108 +++ docs/menudata.js | 1 + docs/namespacerpc.html | 6 +- docs/namespacerpc_1_1client.html | 2 +- docs/namespacerpc_1_1details.html | 2 +- docs/namespacerpc_1_1server.html | 2 +- docs/namespaces.html | 41 +- docs/pages.html | 84 +++ docs/rpc_8hpp.html | 38 +- docs/rpc_8hpp__dep__incl.map | 9 +- docs/rpc_8hpp__dep__incl.md5 | 2 +- docs/rpc_8hpp__dep__incl.png | Bin 4981 -> 15263 bytes docs/rpc_8hpp__incl.map | 18 +- docs/rpc_8hpp__incl.png | Bin 10995 -> 18444 bytes docs/rpc_8hpp_source.html | 683 ++++++++++-------- docs/rpc__bitsery_8hpp.html | 216 ++++++ docs/rpc__bitsery_8hpp__incl.map | 20 + docs/rpc__bitsery_8hpp__incl.md5 | 1 + docs/rpc__bitsery_8hpp__incl.png | Bin 0 -> 40991 bytes docs/rpc__bitsery_8hpp_source.html | 585 +++++++++++++++ docs/rpc__boost__json_8hpp.html | 56 +- docs/rpc__boost__json_8hpp__incl.map | 24 +- docs/rpc__boost__json_8hpp__incl.png | Bin 16037 -> 26527 bytes docs/rpc__boost__json_8hpp_source.html | 516 ++++++------- docs/rpc__dispatch__helper_8hpp.html | 44 +- docs/rpc__dispatch__helper_8hpp_source.html | 44 +- docs/rpc__njson_8hpp.html | 48 +- docs/rpc__njson_8hpp__incl.map | 22 +- docs/rpc__njson_8hpp__incl.png | Bin 15127 -> 24716 bytes docs/rpc__njson_8hpp_source.html | 360 ++++----- docs/rpc__rapidjson_8hpp.html | 58 +- docs/rpc__rapidjson_8hpp__incl.map | 26 +- docs/rpc__rapidjson_8hpp__incl.png | Bin 18542 -> 28311 bytes docs/rpc__rapidjson_8hpp_source.html | 674 ++++++++--------- docs/search/all_0.js | 3 +- docs/search/all_1.js | 9 +- docs/search/all_2.js | 2 +- docs/search/all_3.js | 3 +- docs/search/all_4.js | 4 +- docs/search/all_5.js | 30 +- docs/search/all_6.js | 10 +- docs/search/{functions_6.html => all_7.html} | 2 +- docs/search/all_7.js | 21 + docs/search/all_8.html | 37 + docs/search/all_8.js | 8 + docs/search/classes_0.js | 2 +- docs/search/classes_1.js | 4 +- docs/search/classes_2.js | 6 +- docs/search/classes_3.html | 37 + docs/search/classes_3.js | 8 + docs/search/classes_4.html | 37 + docs/search/classes_4.js | 4 + docs/search/defines_0.js | 17 +- docs/search/files_0.js | 11 +- docs/search/functions_0.js | 4 +- docs/search/functions_1.js | 9 +- docs/search/functions_2.js | 4 +- docs/search/functions_3.js | 2 +- docs/search/functions_4.js | 3 +- docs/search/functions_5.js | 6 +- docs/search/functions_6.js | 7 - docs/search/namespaces_0.js | 8 +- docs/search/pages_0.html | 37 + docs/search/pages_0.js | 4 + docs/search/pages_1.html | 37 + docs/search/pages_1.js | 4 + docs/search/pages_2.html | 37 + docs/search/pages_2.js | 4 + docs/search/pages_3.html | 37 + docs/search/pages_3.js | 4 + docs/search/searchdata.js | 15 +- docs/search/typedefs_0.js | 2 +- ...ters_1_1bitsery_1_1details_1_1largest.html | 83 +++ ..._1_1largest_3_01T_00_010_01_4-members.html | 84 +++ ...1details_1_1largest_3_01T_00_010_01_4.html | 93 +++ ..._1_1largest_3_01T_00_013_01_4-members.html | 84 +++ ...1details_1_1largest_3_01T_00_013_01_4.html | 93 +++ ..._1_1largest_3_01T_00_014_01_4-members.html | 84 +++ ...1details_1_1largest_3_01T_00_014_01_4.html | 93 +++ ..._1_1largest_3_01T_00_016_01_4-members.html | 84 +++ ...1details_1_1largest_3_01T_00_016_01_4.html | 93 +++ ...ry_1_1details_1_1pack__helper-members.html | 90 +++ ...1_1bitsery_1_1details_1_1pack__helper.html | 116 +++ ...3_01void_00_01Args_8_8_8_01_4-members.html | 89 +++ ..._helper_3_01void_00_01Args_8_8_8_01_4.html | 113 +++ ...vector_3_01uint8__t_01_4_01_4-members.html | 84 +++ ...1std_1_1vector_3_01uint8__t_01_4_01_4.html | 93 +++ examples/meson.build | 64 -- include/rpc.hpp | 4 +- include/rpc_adapters/meson.build | 50 -- include/rpc_adapters/rpc_bitsery.hpp | 2 +- meson.build | 136 ---- meson_options.txt | 7 - tests/meson.build | 56 -- 180 files changed, 5468 insertions(+), 2090 deletions(-) delete mode 100644 benchmarks/meson.build rename docs/{classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4-members.html => classrpc_1_1packed__func_3_01void_00_01Args_8_8_8_01_4-members.html} (78%) rename docs/{classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4.html => classrpc_1_1packed__func_3_01void_00_01Args_8_8_8_01_4.html} (84%) rename docs/{classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.map => classrpc_1_1packed__func_3_01void_00_01Args_8_8_8_01_4__coll__graph.map} (69%) rename docs/{classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.md5 => classrpc_1_1packed__func_3_01void_00_01Args_8_8_8_01_4__coll__graph.md5} (100%) create mode 100644 docs/classrpc_1_1packed__func_3_01void_00_01Args_8_8_8_01_4__coll__graph.png rename docs/{classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.map => classrpc_1_1packed__func_3_01void_00_01Args_8_8_8_01_4__inherit__graph.map} (69%) rename docs/{classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.md5 => classrpc_1_1packed__func_3_01void_00_01Args_8_8_8_01_4__inherit__graph.md5} (100%) create mode 100644 docs/classrpc_1_1packed__func_3_01void_00_01Args_8_8_8_01_4__inherit__graph.png delete mode 100644 docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.png delete mode 100644 docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.png create mode 100644 docs/inherit_graph_10.map create mode 100644 docs/inherit_graph_10.md5 create mode 100644 docs/inherit_graph_10.png create mode 100644 docs/inherit_graph_11.map create mode 100644 docs/inherit_graph_11.md5 create mode 100644 docs/inherit_graph_11.png create mode 100644 docs/inherit_graph_12.map create mode 100644 docs/inherit_graph_12.md5 create mode 100644 docs/inherit_graph_12.png create mode 100644 docs/inherit_graph_13.map create mode 100644 docs/inherit_graph_13.md5 create mode 100644 docs/inherit_graph_13.png create mode 100644 docs/inherit_graph_6.map create mode 100644 docs/inherit_graph_6.md5 create mode 100644 docs/inherit_graph_6.png create mode 100644 docs/inherit_graph_7.map create mode 100644 docs/inherit_graph_7.md5 create mode 100644 docs/inherit_graph_7.png create mode 100644 docs/inherit_graph_8.map create mode 100644 docs/inherit_graph_8.md5 create mode 100644 docs/inherit_graph_8.png create mode 100644 docs/inherit_graph_9.map create mode 100644 docs/inherit_graph_9.md5 create mode 100644 docs/inherit_graph_9.png create mode 100644 docs/md_CODE_OF_CONDUCT.html create mode 100644 docs/md_CONTRIBUTING.html create mode 100644 docs/md_INSTALL.html create mode 100644 docs/md_SECURITY.html create mode 100644 docs/pages.html create mode 100644 docs/rpc__bitsery_8hpp.html create mode 100644 docs/rpc__bitsery_8hpp__incl.map create mode 100644 docs/rpc__bitsery_8hpp__incl.md5 create mode 100644 docs/rpc__bitsery_8hpp__incl.png create mode 100644 docs/rpc__bitsery_8hpp_source.html rename docs/search/{functions_6.html => all_7.html} (95%) create mode 100644 docs/search/all_7.js create mode 100644 docs/search/all_8.html create mode 100644 docs/search/all_8.js create mode 100644 docs/search/classes_3.html create mode 100644 docs/search/classes_3.js create mode 100644 docs/search/classes_4.html create mode 100644 docs/search/classes_4.js delete mode 100644 docs/search/functions_6.js create mode 100644 docs/search/pages_0.html create mode 100644 docs/search/pages_0.js create mode 100644 docs/search/pages_1.html create mode 100644 docs/search/pages_1.js create mode 100644 docs/search/pages_2.html create mode 100644 docs/search/pages_2.js create mode 100644 docs/search/pages_3.html create mode 100644 docs/search/pages_3.js create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest_3_01T_00_010_01_4-members.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest_3_01T_00_010_01_4.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest_3_01T_00_013_01_4-members.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest_3_01T_00_013_01_4.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest_3_01T_00_014_01_4-members.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest_3_01T_00_014_01_4.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest_3_01T_00_016_01_4-members.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1largest_3_01T_00_016_01_4.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1pack__helper-members.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1pack__helper.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1pack__helper_3_01void_00_01Args_8_8_8_01_4-members.html create mode 100644 docs/structrpc_1_1adapters_1_1bitsery_1_1details_1_1pack__helper_3_01void_00_01Args_8_8_8_01_4.html create mode 100644 docs/structstd_1_1hash_3_01std_1_1vector_3_01uint8__t_01_4_01_4-members.html create mode 100644 docs/structstd_1_1hash_3_01std_1_1vector_3_01uint8__t_01_4_01_4.html delete mode 100644 examples/meson.build delete mode 100644 include/rpc_adapters/meson.build delete mode 100644 meson.build delete mode 100644 meson_options.txt delete mode 100644 tests/meson.build diff --git a/CMakeLists.txt b/CMakeLists.txt index 946c31f7..61096511 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ cmake_minimum_required(VERSION 3.16) project( "rpc.hpp" - VERSION 0.6.1 + VERSION 0.6.2 DESCRIPTION "Simple RPC Header-Only Library" LANGUAGES CXX ) diff --git a/benchmarks/meson.build b/benchmarks/meson.build deleted file mode 100644 index c0adb59a..00000000 --- a/benchmarks/meson.build +++ /dev/null @@ -1,57 +0,0 @@ -# BSD 3-Clause License -# -# Copyright (c) 2020-2021, Jackson Harmer -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -asio_dep = dependency('asio') -catch2_dep = dependency('catch2', version : ['>2.10.0', '<3.0.0']) -thread_dep = dependency('threads') - -bench_dependencies = [rpc_hpp_dep, asio_dep, catch2_dep, thread_dep] -bench_defines = [] - -if get_option('build_adapter_boost_json') - bench_dependencies += [boost_json_adapter_dep] - bench_defines += ['-DRPC_HPP_ENABLE_BOOST_JSON'] -endif - -if get_option('build_adapter_njson') - bench_dependencies += [njson_adapter_dep] - bench_defines += ['-DRPC_HPP_ENABLE_NJSON'] -endif - -if get_option('build_adapter_rapidjson') - bench_dependencies += [rapidjson_adapter_dep] - bench_defines += ['-DRPC_HPP_ENABLE_RAPIDJSON'] -endif - -rpc_bench_exe = executable('rpc_benchmark', 'benchmark.cpp', include_directories : '../tests', dependencies : bench_dependencies, install : false, cpp_args : [project_warnings, bench_defines]) - -if get_option('buildtype') in ['debugoptimized', 'release'] - benchmark('rpc_benchmark', rpc_bench_exe, args : ['--benchmark-samples 20'], timeout : 90) -endif diff --git a/docs/annotated.html b/docs/annotated.html index a319094a..780b2969 100644 --- a/docs/annotated.html +++ b/docs/annotated.html @@ -22,7 +22,7 @@
rpc.hpp -  0.6.1 +  0.6.2
Simple RPC Header-Only Library
@@ -68,17 +68,29 @@
Here are the classes, structs, unions and interfaces with brief descriptions:
-
[detail level 123]
+
[detail level 12345]
- - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
 NrpcTop-level namespace for rpc.hpp classes and functions
 NclientNamespace containing functions and classes only relevant to "client-side" implentations
 Cclient_interfaceClass defining an interface for calling into an RPC server or module
 NserverNamespace containing functions and classes only relevant to "server-side" implentations
 Cserver_interfaceClass defining an interface for serving functions via RPC
 Cpacked_funcObject representing a function call, including the function's name, arguments and result
 Cpacked_func< void, Args... >Object representing a void returning function call, including the function's name and arguments
 Cpack_adapterClass collecting several functions for interoperating between serial objects and a packed_func
 Cserver_interfaceClass defining an interface for serving functions via RPC
 Cclient_interfaceClass defining an interface for calling into an RPC server or module
 Nadapters
 Nbitsery
 Ndetails
 Clargest
 Clargest< T, 0 >
 Clargest< T, 3 >
 Clargest< T, 4 >
 Clargest< T, 6 >
 Cpack_helper
 Cpack_helper< void, Args... >
 NclientNamespace containing functions and classes only relevant to "client-side" implentations
 Cclient_interfaceClass defining an interface for calling into an RPC server or module
 NserverNamespace containing functions and classes only relevant to "server-side" implentations
 Cserver_interfaceClass defining an interface for serving functions via RPC
 Cpacked_funcObject representing a function call, including the function's name, arguments and result
 Cpacked_func< void, Args... >Object representing a void returning function call, including the function's name and arguments
 Cpack_adapterClass collecting several functions for interoperating between serial objects and a packed_func
 Cserver_interfaceClass defining an interface for serving functions via RPC
 Cclient_interfaceClass defining an interface for calling into an RPC server or module
 Nstd
 Chash< std::vector< uint8_t > >
diff --git a/docs/classes.html b/docs/classes.html index a54bda22..42a72f28 100644 --- a/docs/classes.html +++ b/docs/classes.html @@ -22,7 +22,7 @@
rpc.hpp -  0.6.1 +  0.6.2
Simple RPC Header-Only Library
@@ -67,14 +67,20 @@
Class Index
-
C | P | S
+
C | H | L | P | S
C
client_interface (rpc::client)
client_interface (rpc)
+
H
+
hash< std::vector< uint8_t > > (std)
+
+
L
+
largest (rpc::adapters::bitsery::details)
largest< T, 0 > (rpc::adapters::bitsery::details)
largest< T, 3 > (rpc::adapters::bitsery::details)
largest< T, 4 > (rpc::adapters::bitsery::details)
largest< T, 6 > (rpc::adapters::bitsery::details)
+
P
-
pack_adapter (rpc)
packed_func (rpc)
packed_func< void, Args... > (rpc)
+
pack_adapter (rpc)
pack_helper (rpc::adapters::bitsery::details)
pack_helper< void, Args... > (rpc::adapters::bitsery::details)
packed_func (rpc)
packed_func< void, Args... > (rpc)
S
server_interface (rpc::server)
server_interface (rpc)
diff --git a/docs/classrpc_1_1client_1_1client__interface-members.html b/docs/classrpc_1_1client_1_1client__interface-members.html index 5a7d4481..4d8586bc 100644 --- a/docs/classrpc_1_1client_1_1client__interface-members.html +++ b/docs/classrpc_1_1client_1_1client__interface-members.html @@ -22,7 +22,7 @@
rpc.hpp -  0.6.1 +  0.6.2
Simple RPC Header-Only Library
@@ -75,6 +75,12 @@

This is the complete list of members for rpc::client::client_interface< Serial >, including all inherited members.

+ + + + + + diff --git a/docs/classrpc_1_1client_1_1client__interface.html b/docs/classrpc_1_1client_1_1client__interface.html index 44f37428..7b28ad65 100644 --- a/docs/classrpc_1_1client_1_1client__interface.html +++ b/docs/classrpc_1_1client_1_1client__interface.html @@ -22,7 +22,7 @@ @@ -83,10 +83,26 @@
call_func(std::string func_name, Args &&... args)rpc::client::client_interface< Serial >inline
call_header_func_impl([[maybe_unused]] R(*func)(Args...), std::string func_name, Args &&... args) (defined in rpc::client::client_interface< Serial >)rpc::client::client_interface< Serial >inline
client_interface()=default (defined in rpc::client::client_interface< Serial >)rpc::client::client_interface< Serial >
client_interface(const client_interface &)=delete (defined in rpc::client::client_interface< Serial >)rpc::client::client_interface< Serial >
client_interface(client_interface &&) noexcept=default (defined in rpc::client::client_interface< Serial >)rpc::client::client_interface< Serial >
operator=(const client_interface &)=delete (defined in rpc::client::client_interface< Serial >)rpc::client::client_interface< Serial >
operator=(client_interface &&)=delete (defined in rpc::client::client_interface< Serial >)rpc::client::client_interface< Serial >
receive()=0rpc::client::client_interface< Serial >protectedpure virtual
send(const typename Serial::bytes_t &bytes)=0rpc::client::client_interface< Serial >protectedpure virtual
~client_interface()=default (defined in rpc::client::client_interface< Serial >)rpc::client::client_interface< Serial >virtual
rpc.hpp -  0.6.1 +  0.6.2
Simple RPC Header-Only Library
+ + + + + + + + + + +

Public Member Functions

client_interface (const client_interface &)=delete
 
client_interface (client_interface &&) noexcept=default
 
+client_interfaceoperator= (const client_interface &)=delete
 
+client_interfaceoperator= (client_interface &&)=delete
 
template<typename R = void, typename... Args>
call_func (std::string func_name, Args &&... args)
 Sends an RPC call request to a server, waits for a response, then returns the result. More...
 
+template<typename R , typename... Args>
call_header_func_impl ([[maybe_unused]] R(*func)(Args...), std::string func_name, Args &&... args)
 
diff --git a/docs/classrpc_1_1pack__adapter-members.html b/docs/classrpc_1_1pack__adapter-members.html index adc56f72..cdf4c43f 100644 --- a/docs/classrpc_1_1pack__adapter-members.html +++ b/docs/classrpc_1_1pack__adapter-members.html @@ -22,7 +22,7 @@ @@ -75,21 +75,25 @@

This is the complete list of members for rpc::pack_adapter< Serial >, including all inherited members.

Protected Member Functions

rpc.hpp -  0.6.1 +  0.6.2
Simple RPC Header-Only Library
- - - - - - - + + + + + + + + + - - - - + + + + + +
deserialize_pack(const typename Serial::serial_t &serial_obj)rpc::pack_adapter< Serial >static
deserialize_pack(const adapters::bjson_val &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
deserialize_pack(const adapters::njson &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
deserialize_pack(const adapters::rapidjson_doc &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
get_func_name(const typename Serial::serial_t &serial_obj)rpc::pack_adapter< Serial >static
get_func_name(const adapters::bjson_val &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
get_func_name(const adapters::njson &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
get_func_name(const adapters::rapidjson_doc &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
deserialize_pack(const adapters::bitsery::bit_buffer &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
deserialize_pack(const adapters::boost_json::value_t &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
deserialize_pack(const adapters::njson::njson_t &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
deserialize_pack(const adapters::rapidjson::doc_t &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
get_func_name(const typename Serial::serial_t &serial_obj)rpc::pack_adapter< Serial >static
get_func_name(const adapters::bitsery::bit_buffer &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
get_func_name(const adapters::boost_json::value_t &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
get_func_name(const adapters::njson::njson_t &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
get_func_name(const adapters::rapidjson::doc_t &serial_obj) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
serialize_pack(const packed_func< R, Args... > &pack)rpc::pack_adapter< Serial >static
serialize_pack(const packed_func< R, Args... > &pack) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
serialize_pack(const packed_func< R, Args... > &pack) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
serialize_pack(const packed_func< R, Args... > &pack) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
set_err_mesg(typename Serial::serial_t &serial_obj, std::string mesg)rpc::pack_adapter< Serial >static
set_err_mesg(adapters::bjson_val &serial_obj, std::string mesg) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
set_err_mesg(adapters::njson &serial_obj, std::string mesg) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
set_err_mesg(adapters::rapidjson_doc &serial_obj, std::string mesg) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
serialize_pack(const packed_func< R, Args... > &pack) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >
set_err_mesg(typename Serial::serial_t &serial_obj, const std::string &mesg)rpc::pack_adapter< Serial >static
set_err_mesg(adapters::bitsery::bit_buffer &serial_obj, const std::string &mesg) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
set_err_mesg(adapters::boost_json::value_t &serial_obj, const std::string &mesg) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
set_err_mesg(adapters::njson::njson_t &serial_obj, const std::string &mesg) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
set_err_mesg(adapters::rapidjson::doc_t &serial_obj, const std::string &mesg) (defined in rpc::pack_adapter< Serial >)rpc::pack_adapter< Serial >inline
@@ -72,10 +72,10 @@
-

This is the complete list of members for rpc::packed_func< void, Args... >, including all inherited members.

+

This is the complete list of members for rpc::packed_func< void, Args... >, including all inherited members.

- - + +
packed_func(std::string func_name, args_t args)rpc::packed_func< void, Args... >inline
result_t typedefrpc::packed_func< void, Args... >
packed_func(std::string func_name, args_t args)rpc::packed_func< void, Args... >inline
result_t typedefrpc::packed_func< void, Args... >