From 1ace51a98d9b1eaba1205dcf550445ae967f766a Mon Sep 17 00:00:00 2001 From: Jackson Date: Fri, 30 Jul 2021 17:02:05 -0400 Subject: [PATCH] Feature/conditional compilation (#63) * Added examples and conditional compilation --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/main.yml | 7 +- .gitignore | 1 + CMakeLists.txt | 158 +- CMakeSettings.json | 50 - Doxyfile.in | 279 ---- benchmarks/CMakeLists.txt | 90 ++ benchmarks/benchmark.cpp | 548 +++++++ benchmarks/client.hpp | 56 + benchmarks/meson.build | 56 + benchmarks/test_structs.hpp | 353 +++++ dispatch_gen.py | 94 +- docs/annotated.html | 35 +- docs/classes.html | 61 +- ...rpc_1_1client_1_1client__base-members.html | 88 -- docs/classrpc_1_1client_1_1client__base.html | 106 -- ...1client_1_1client__interface-members.html} | 23 +- ...assrpc_1_1client_1_1client__interface.html | 244 +++ ...srpc_1_1details_1_1dyn__array-members.html | 107 -- docs/classrpc_1_1details_1_1dyn__array.html | 737 --------- docs/classrpc_1_1pack__adapter-members.html | 99 ++ docs/classrpc_1_1pack__adapter.html | 337 ++++ docs/classrpc_1_1packed__func-members.html | 42 +- docs/classrpc_1_1packed__func.html | 270 +--- ..._01void_00_01_args_8_8_8_01_4-members.html | 35 +- ...__func_3_01void_00_01_args_8_8_8_01_4.html | 244 +-- ...oid_00_01_args_8_8_8_01_4__coll__graph.map | 4 +- ...oid_00_01_args_8_8_8_01_4__coll__graph.md5 | 2 +- ...oid_00_01_args_8_8_8_01_4__coll__graph.png | Bin 1835 -> 1968 bytes ..._00_01_args_8_8_8_01_4__inherit__graph.map | 4 +- ..._00_01_args_8_8_8_01_4__inherit__graph.md5 | 2 +- ..._00_01_args_8_8_8_01_4__inherit__graph.png | Bin 1835 -> 1968 bytes ...lassrpc_1_1packed__func__base-members.html | 93 -- docs/classrpc_1_1packed__func__base.html | 253 --- ..._1_1packed__func__base__inherit__graph.map | 5 - ..._1_1packed__func__base__inherit__graph.md5 | 1 - ..._1_1packed__func__base__inherit__graph.png | Bin 4330 -> 0 bytes .../classrpc_1_1packed__func__coll__graph.map | 4 +- .../classrpc_1_1packed__func__coll__graph.md5 | 2 +- .../classrpc_1_1packed__func__coll__graph.png | Bin 1819 -> 1923 bytes ...assrpc_1_1packed__func__inherit__graph.map | 4 +- ...assrpc_1_1packed__func__inherit__graph.md5 | 2 +- ...assrpc_1_1packed__func__inherit__graph.png | Bin 1819 -> 1923 bytes docs/classrpc_1_1serial__adapter-members.html | 95 -- docs/classrpc_1_1serial__adapter.html | 543 ------- .../dir_0ca40f09774b0c9b36fedfbb476b8248.html | 21 +- ...r_0ca40f09774b0c9b36fedfbb476b8248_dep.png | Bin 1064 -> 1031 bytes .../dir_3e40ef3ba0a24b7354fd0aad93fc8f99.html | 82 - .../dir_4fef79e7177ba769987a8da36c892c5f.html | 82 - .../dir_50b0903e9f5ba953a5520e285fb8dcb9.html | 82 - .../dir_648be88883574707485053cd5416500c.html | 82 - .../dir_6fb49f783371ee500ce181955d73367a.html | 82 - .../dir_78438178dbd240bdb49047afa5b03de5.html | 82 - .../dir_8448b20300a8755818d7e490faf991f6.html | 82 - .../dir_84688365732d7f584ccc09ea20685c57.html | 82 - .../dir_86715e4555393611b6d104210c25ef02.html | 82 - .../dir_891b89b23345a8257b1812d0f9b3e0c0.html | 82 - .../dir_89cabd9843c25e5f6966dfece8ff060b.html | 82 - .../dir_8f2980731aba7ec7b9fcae5764f196e3.html | 82 - .../dir_cfe66f95dd46c1e43204fa4e6f490088.html | 82 - .../dir_d44c64559bbebec7f509842c48db8b23.html | 15 +- docs/doxygen.css | 113 +- docs/doxygen.png | Bin 3779 -> 0 bytes docs/doxygen.svg | 26 + docs/files.html | 21 +- docs/functions.html | 152 +- docs/functions_func.html | 142 +- docs/functions_type.html | 18 +- ...amespacemembers_vars.html => globals.html} | 57 +- ...acemembers_type.html => globals_defs.html} | 55 +- docs/graph_legend.html | 12 +- docs/graph_legend.png | Bin 14975 -> 13384 bytes docs/hierarchy.html | 32 +- docs/index.html | 14 +- docs/inherit_graph_0.map | 2 +- docs/inherit_graph_0.md5 | 2 +- docs/inherit_graph_0.png | Bin 569 -> 730 bytes docs/inherit_graph_1.map | 2 +- docs/inherit_graph_1.md5 | 2 +- docs/inherit_graph_1.png | Bin 569 -> 717 bytes docs/inherit_graph_10.map | 3 - docs/inherit_graph_10.md5 | 1 - docs/inherit_graph_10.png | Bin 727 -> 0 bytes docs/inherit_graph_2.map | 2 +- docs/inherit_graph_2.md5 | 2 +- docs/inherit_graph_2.png | Bin 694 -> 699 bytes docs/inherit_graph_3.map | 4 +- docs/inherit_graph_3.md5 | 2 +- docs/inherit_graph_3.png | Bin 666 -> 3364 bytes docs/inherit_graph_4.map | 3 - docs/inherit_graph_4.md5 | 1 - docs/inherit_graph_4.png | Bin 697 -> 0 bytes docs/inherit_graph_5.map | 3 - docs/inherit_graph_5.md5 | 1 - docs/inherit_graph_5.png | Bin 671 -> 0 bytes docs/inherit_graph_6.map | 3 - docs/inherit_graph_6.md5 | 1 - docs/inherit_graph_6.png | Bin 685 -> 0 bytes docs/inherit_graph_7.map | 4 - docs/inherit_graph_7.md5 | 1 - docs/inherit_graph_7.png | Bin 1410 -> 0 bytes docs/inherit_graph_8.map | 3 - docs/inherit_graph_8.md5 | 1 - docs/inherit_graph_8.png | Bin 680 -> 0 bytes docs/inherit_graph_9.map | 5 - docs/inherit_graph_9.md5 | 1 - docs/inherit_graph_9.png | Bin 3456 -> 0 bytes docs/inherits.html | 76 +- docs/menu.js | 4 +- docs/menudata.js | 34 +- docs/namespacemembers.html | 73 +- docs/namespacemembers_func.html | 61 +- docs/namespacerpc.html | 112 ++ docs/namespacerpc_1_1client.html | 393 +---- docs/namespacerpc_1_1details.html | 440 +----- docs/namespacerpc_1_1server.html | 267 +--- docs/namespaces.html | 28 +- docs/rpc_8hpp.html | 316 +--- docs/rpc_8hpp__dep__incl.map | 7 +- docs/rpc_8hpp__dep__incl.md5 | 2 +- docs/rpc_8hpp__dep__incl.png | Bin 4030 -> 4981 bytes docs/rpc_8hpp__incl.map | 15 +- docs/rpc_8hpp__incl.md5 | 2 +- docs/rpc_8hpp__incl.png | Bin 8237 -> 9123 bytes docs/rpc_8hpp_source.html | 1378 ++++++----------- docs/rpc__boost__json_8hpp.html | 153 ++ docs/rpc__boost__json_8hpp__incl.map | 13 + docs/rpc__boost__json_8hpp__incl.md5 | 1 + docs/rpc__boost__json_8hpp__incl.png | Bin 0 -> 13415 bytes docs/rpc__boost__json_8hpp_source.html | 365 +++++ docs/rpc__dispatch__helper_8hpp.html | 139 ++ docs/rpc__dispatch__helper_8hpp_source.html | 183 ++- docs/rpc__njson_8hpp.html | 88 +- docs/rpc__njson_8hpp__incl.map | 19 +- docs/rpc__njson_8hpp__incl.md5 | 2 +- docs/rpc__njson_8hpp__incl.png | Bin 15377 -> 12407 bytes docs/rpc__njson_8hpp_source.html | 715 +++------ docs/rpc__rapidjson_8hpp.html | 78 +- docs/rpc__rapidjson_8hpp__incl.map | 23 +- docs/rpc__rapidjson_8hpp__incl.md5 | 2 +- docs/rpc__rapidjson_8hpp__incl.png | Bin 16576 -> 15753 bytes docs/rpc__rapidjson_8hpp_source.html | 766 +++++---- docs/search/all_0.html | 13 +- docs/search/all_0.js | 10 +- docs/search/all_1.html | 13 +- docs/search/all_1.js | 8 +- docs/search/all_2.html | 13 +- docs/search/all_2.js | 8 +- docs/search/all_3.html | 13 +- docs/search/all_3.js | 6 +- docs/search/all_4.html | 13 +- docs/search/all_4.js | 5 +- docs/search/all_5.html | 13 +- docs/search/all_5.js | 29 +- docs/search/all_6.html | 13 +- docs/search/all_6.js | 10 +- docs/search/all_7.js | 6 - docs/search/all_8.html | 36 - docs/search/all_8.js | 5 - docs/search/all_9.html | 36 - docs/search/all_9.js | 4 - docs/search/all_a.html | 36 - docs/search/all_a.js | 12 - docs/search/all_b.html | 36 - docs/search/all_b.js | 11 - docs/search/all_c.html | 36 - docs/search/all_c.js | 12 - docs/search/all_d.html | 36 - docs/search/all_d.js | 5 - docs/search/classes_0.html | 13 +- docs/search/classes_0.js | 2 +- docs/search/classes_1.html | 13 +- docs/search/classes_1.js | 4 +- docs/search/classes_2.html | 36 - docs/search/classes_2.js | 4 - docs/search/classes_3.html | 36 - docs/search/classes_3.js | 6 - docs/search/classes_4.html | 36 - docs/search/classes_4.js | 4 - docs/search/classes_5.html | 36 - docs/search/classes_5.js | 7 - docs/search/classes_6.html | 36 - docs/search/classes_6.js | 4 - docs/search/close.png | Bin 273 -> 0 bytes docs/search/close.svg | 31 + docs/search/{all_7.html => defines_0.html} | 15 +- docs/search/defines_0.js | 16 + docs/search/files_0.html | 13 +- docs/search/files_0.js | 8 +- docs/search/functions_0.html | 13 +- docs/search/functions_0.js | 7 +- docs/search/functions_1.html | 13 +- docs/search/functions_1.js | 7 +- docs/search/functions_2.html | 13 +- docs/search/functions_2.js | 7 +- docs/search/functions_3.html | 13 +- docs/search/functions_3.js | 6 +- docs/search/functions_4.html | 13 +- docs/search/functions_4.js | 3 +- docs/search/functions_5.html | 13 +- docs/search/functions_5.js | 6 +- docs/search/functions_6.html | 13 +- docs/search/functions_6.js | 10 +- docs/search/functions_7.html | 36 - docs/search/functions_7.js | 4 - docs/search/functions_8.html | 36 - docs/search/functions_8.js | 9 - docs/search/functions_9.html | 36 - docs/search/functions_9.js | 4 - docs/search/functions_a.html | 36 - docs/search/functions_a.js | 11 - docs/search/functions_b.html | 36 - docs/search/functions_b.js | 5 - docs/search/mag_sel.png | Bin 465 -> 0 bytes docs/search/mag_sel.svg | 74 + docs/search/namespaces_0.html | 13 +- docs/search/namespaces_0.js | 7 +- docs/search/nomatches.html | 3 +- docs/search/search.css | 104 +- docs/search/search.js | 14 +- docs/search/searchdata.js | 18 +- docs/search/typedefs_0.html | 13 +- docs/search/typedefs_0.js | 2 +- docs/search/typedefs_1.html | 36 - docs/search/typedefs_1.js | 4 - docs/search/typedefs_2.html | 36 - docs/search/typedefs_2.js | 4 - docs/search/variables_0.html | 36 - docs/search/variables_0.js | 4 - docs/search/variables_1.html | 36 - docs/search/variables_1.js | 4 - docs/structrpc_1_1details_1_1bool__pack.html | 95 -- ...trpc_1_1details_1_1has__begin-members.html | 86 - docs/structrpc_1_1details_1_1has__begin.html | 111 -- docs/structrpc_1_1details_1_1has__end.html | 111 -- ...ctrpc_1_1details_1_1has__size-members.html | 86 - docs/structrpc_1_1details_1_1has__size.html | 111 -- ...structrpc_1_1details_1_1is__container.html | 119 -- ...1details_1_1is__container__coll__graph.map | 4 - ...1details_1_1is__container__coll__graph.md5 | 1 - ...1details_1_1is__container__coll__graph.png | Bin 2714 -> 0 bytes ...tails_1_1is__container__inherit__graph.map | 4 - ...tails_1_1is__container__inherit__graph.md5 | 1 - ...tails_1_1is__container__inherit__graph.png | Bin 2714 -> 0 bytes ...trpc_1_1details_1_1ptr__decay-members.html | 86 - docs/structrpc_1_1details_1_1ptr__decay.html | 111 -- examples/CMakeLists.txt | 76 + examples/client/client.cpp | 79 + examples/client/client.hpp | 42 + examples/meson.build | 61 + examples/module/module.cpp | 40 + examples/module/module.hpp | 27 + examples/module/module_client.cpp | 76 + examples/module/module_client.hpp | 60 + examples/server/server.cpp | 138 ++ include/rpc.hpp | 363 +++-- include/rpc_adapters/CMakeLists.txt | 100 +- include/rpc_adapters/meson.build | 46 +- include/rpc_adapters/rpc_boost_json.hpp | 22 +- include/rpc_adapters/rpc_njson.hpp | 16 +- include/rpc_adapters/rpc_rapidjson.hpp | 26 +- include/rpc_dispatch_helper.hpp | 53 +- meson.build | 53 +- meson_options.txt | 10 +- tests/CMakeLists.txt | 138 +- tests/catch2_main.cpp | 3 - tests/meson.build | 59 +- tests/rpc.benchmark.cpp | 783 ---------- tests/rpc.client.hpp | 41 +- tests/rpc.server.cpp | 37 +- tests/rpc.test.cpp | 118 +- tests/test_structs.hpp | 7 +- vs19/.gitignore | 362 ----- vs19/rpc_benchmark/rpc_benchmark.vcxproj | 177 --- .../rpc_benchmark.vcxproj.filters | 48 - vs19/rpc_hpp.sln | 51 - vs19/rpc_server/rpc_server.vcxproj | 168 -- vs19/rpc_server/rpc_server.vcxproj.filters | 45 - vs19/rpc_test/rpc_test.vcxproj | 178 --- vs19/rpc_test/rpc_test.vcxproj.filters | 51 - 280 files changed, 6456 insertions(+), 12224 deletions(-) delete mode 100644 CMakeSettings.json delete mode 100644 Doxyfile.in create mode 100644 benchmarks/CMakeLists.txt create mode 100644 benchmarks/benchmark.cpp create mode 100644 benchmarks/client.hpp create mode 100644 benchmarks/meson.build create mode 100644 benchmarks/test_structs.hpp delete mode 100644 docs/classrpc_1_1client_1_1client__base-members.html delete mode 100644 docs/classrpc_1_1client_1_1client__base.html rename docs/{structrpc_1_1details_1_1has__end-members.html => classrpc_1_1client_1_1client__interface-members.html} (53%) create mode 100644 docs/classrpc_1_1client_1_1client__interface.html delete mode 100644 docs/classrpc_1_1details_1_1dyn__array-members.html delete mode 100644 docs/classrpc_1_1details_1_1dyn__array.html create mode 100644 docs/classrpc_1_1pack__adapter-members.html create mode 100644 docs/classrpc_1_1pack__adapter.html delete mode 100644 docs/classrpc_1_1packed__func__base-members.html delete mode 100644 docs/classrpc_1_1packed__func__base.html delete mode 100644 docs/classrpc_1_1packed__func__base__inherit__graph.map delete mode 100644 docs/classrpc_1_1packed__func__base__inherit__graph.md5 delete mode 100644 docs/classrpc_1_1packed__func__base__inherit__graph.png delete mode 100644 docs/classrpc_1_1serial__adapter-members.html delete mode 100644 docs/classrpc_1_1serial__adapter.html delete mode 100644 docs/dir_3e40ef3ba0a24b7354fd0aad93fc8f99.html delete mode 100644 docs/dir_4fef79e7177ba769987a8da36c892c5f.html delete mode 100644 docs/dir_50b0903e9f5ba953a5520e285fb8dcb9.html delete mode 100644 docs/dir_648be88883574707485053cd5416500c.html delete mode 100644 docs/dir_6fb49f783371ee500ce181955d73367a.html delete mode 100644 docs/dir_78438178dbd240bdb49047afa5b03de5.html delete mode 100644 docs/dir_8448b20300a8755818d7e490faf991f6.html delete mode 100644 docs/dir_84688365732d7f584ccc09ea20685c57.html delete mode 100644 docs/dir_86715e4555393611b6d104210c25ef02.html delete mode 100644 docs/dir_891b89b23345a8257b1812d0f9b3e0c0.html delete mode 100644 docs/dir_89cabd9843c25e5f6966dfece8ff060b.html delete mode 100644 docs/dir_8f2980731aba7ec7b9fcae5764f196e3.html delete mode 100644 docs/dir_cfe66f95dd46c1e43204fa4e6f490088.html delete mode 100644 docs/doxygen.png create mode 100644 docs/doxygen.svg rename docs/{namespacemembers_vars.html => globals.html} (53%) rename docs/{namespacemembers_type.html => globals_defs.html} (54%) delete mode 100644 docs/inherit_graph_10.map delete mode 100644 docs/inherit_graph_10.md5 delete mode 100644 docs/inherit_graph_10.png delete mode 100644 docs/inherit_graph_4.map delete mode 100644 docs/inherit_graph_4.md5 delete mode 100644 docs/inherit_graph_4.png delete mode 100644 docs/inherit_graph_5.map delete mode 100644 docs/inherit_graph_5.md5 delete mode 100644 docs/inherit_graph_5.png delete mode 100644 docs/inherit_graph_6.map delete mode 100644 docs/inherit_graph_6.md5 delete mode 100644 docs/inherit_graph_6.png delete mode 100644 docs/inherit_graph_7.map delete mode 100644 docs/inherit_graph_7.md5 delete mode 100644 docs/inherit_graph_7.png delete mode 100644 docs/inherit_graph_8.map delete mode 100644 docs/inherit_graph_8.md5 delete mode 100644 docs/inherit_graph_8.png delete mode 100644 docs/inherit_graph_9.map delete mode 100644 docs/inherit_graph_9.md5 delete mode 100644 docs/inherit_graph_9.png create mode 100644 docs/namespacerpc.html create mode 100644 docs/rpc__boost__json_8hpp.html create mode 100644 docs/rpc__boost__json_8hpp__incl.map create mode 100644 docs/rpc__boost__json_8hpp__incl.md5 create mode 100644 docs/rpc__boost__json_8hpp__incl.png create mode 100644 docs/rpc__boost__json_8hpp_source.html create mode 100644 docs/rpc__dispatch__helper_8hpp.html delete mode 100644 docs/search/all_7.js delete mode 100644 docs/search/all_8.html delete mode 100644 docs/search/all_8.js delete mode 100644 docs/search/all_9.html delete mode 100644 docs/search/all_9.js delete mode 100644 docs/search/all_a.html delete mode 100644 docs/search/all_a.js delete mode 100644 docs/search/all_b.html delete mode 100644 docs/search/all_b.js delete mode 100644 docs/search/all_c.html delete mode 100644 docs/search/all_c.js delete mode 100644 docs/search/all_d.html delete mode 100644 docs/search/all_d.js delete mode 100644 docs/search/classes_2.html delete mode 100644 docs/search/classes_2.js delete mode 100644 docs/search/classes_3.html delete mode 100644 docs/search/classes_3.js delete mode 100644 docs/search/classes_4.html delete mode 100644 docs/search/classes_4.js delete mode 100644 docs/search/classes_5.html delete mode 100644 docs/search/classes_5.js delete mode 100644 docs/search/classes_6.html delete mode 100644 docs/search/classes_6.js delete mode 100644 docs/search/close.png create mode 100644 docs/search/close.svg rename docs/search/{all_7.html => defines_0.html} (82%) create mode 100644 docs/search/defines_0.js delete mode 100644 docs/search/functions_7.html delete mode 100644 docs/search/functions_7.js delete mode 100644 docs/search/functions_8.html delete mode 100644 docs/search/functions_8.js delete mode 100644 docs/search/functions_9.html delete mode 100644 docs/search/functions_9.js delete mode 100644 docs/search/functions_a.html delete mode 100644 docs/search/functions_a.js delete mode 100644 docs/search/functions_b.html delete mode 100644 docs/search/functions_b.js delete mode 100644 docs/search/mag_sel.png create mode 100644 docs/search/mag_sel.svg delete mode 100644 docs/search/typedefs_1.html delete mode 100644 docs/search/typedefs_1.js delete mode 100644 docs/search/typedefs_2.html delete mode 100644 docs/search/typedefs_2.js delete mode 100644 docs/search/variables_0.html delete mode 100644 docs/search/variables_0.js delete mode 100644 docs/search/variables_1.html delete mode 100644 docs/search/variables_1.js delete mode 100644 docs/structrpc_1_1details_1_1bool__pack.html delete mode 100644 docs/structrpc_1_1details_1_1has__begin-members.html delete mode 100644 docs/structrpc_1_1details_1_1has__begin.html delete mode 100644 docs/structrpc_1_1details_1_1has__end.html delete mode 100644 docs/structrpc_1_1details_1_1has__size-members.html delete mode 100644 docs/structrpc_1_1details_1_1has__size.html delete mode 100644 docs/structrpc_1_1details_1_1is__container.html delete mode 100644 docs/structrpc_1_1details_1_1is__container__coll__graph.map delete mode 100644 docs/structrpc_1_1details_1_1is__container__coll__graph.md5 delete mode 100644 docs/structrpc_1_1details_1_1is__container__coll__graph.png delete mode 100644 docs/structrpc_1_1details_1_1is__container__inherit__graph.map delete mode 100644 docs/structrpc_1_1details_1_1is__container__inherit__graph.md5 delete mode 100644 docs/structrpc_1_1details_1_1is__container__inherit__graph.png delete mode 100644 docs/structrpc_1_1details_1_1ptr__decay-members.html delete mode 100644 docs/structrpc_1_1details_1_1ptr__decay.html create mode 100644 examples/CMakeLists.txt create mode 100644 examples/client/client.cpp create mode 100644 examples/client/client.hpp create mode 100644 examples/meson.build create mode 100644 examples/module/module.cpp create mode 100644 examples/module/module.hpp create mode 100644 examples/module/module_client.cpp create mode 100644 examples/module/module_client.hpp create mode 100644 examples/server/server.cpp delete mode 100644 tests/catch2_main.cpp delete mode 100644 tests/rpc.benchmark.cpp delete mode 100644 vs19/.gitignore delete mode 100644 vs19/rpc_benchmark/rpc_benchmark.vcxproj delete mode 100644 vs19/rpc_benchmark/rpc_benchmark.vcxproj.filters delete mode 100644 vs19/rpc_hpp.sln delete mode 100644 vs19/rpc_server/rpc_server.vcxproj delete mode 100644 vs19/rpc_server/rpc_server.vcxproj.filters delete mode 100644 vs19/rpc_test/rpc_test.vcxproj delete mode 100644 vs19/rpc_test/rpc_test.vcxproj.filters diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 7599b5c2..e365d072 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -69,7 +69,7 @@ jobs: run: | mkdir build cd build - cmake .. -G Ninja -DUSE_CONAN=ON -DBUILD_NJSON_ADAPTER=ON -DBUILD_RAPIDJSON_ADAPTER=ON -DBUILD_BOOST_JSON_ADAPTER=OFF -DCMAKE_BUILD_TYPE=Debug + cmake .. -G Ninja -DBUILD_ADAPTER_BOOST_JSON=ON -DBUILD_ADAPTER_NJSON=ON -DBUILD_ADAPTER_RAPIDJSON=ON -DBUILD_BENCHMARK=ON -DBUILD_EXAMPLES=ON -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=g++ -DDEPENDS_CONAN=ON ninja - name: Perform CodeQL Analysis diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5c56f52e..2d7973b4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -38,9 +38,10 @@ jobs: run: | mkdir build cd build - cmake .. -G Ninja -DUSE_CONAN=ON -DBUILD_NJSON_ADAPTER=ON -DBUILD_RAPIDJSON_ADAPTER=ON -DBUILD_BOOST_JSON_ADAPTER=OFF -DCMAKE_CXX_COMPILER=${{ matrix.compiler }} -DCMAKE_BUILD_TYPE=Debug + cmake .. -G Ninja -DBUILD_ADAPTER_NJSON=ON -DBUILD_ADAPTER_RAPIDJSON=ON -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=${{ matrix.compiler }} -DDEPENDS_CONAN=ON ninja - name: Run unit tests run: | - cd build - tests/bin/rpc_server & ninja test + cd build/tests + ls -l + ./bin/test_server & ctest diff --git a/.gitignore b/.gitignore index 732e38c7..db02506d 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ build/ build-*/ temp/ /vs19/rpc_server/bus.txt +out/ # Cross and Native build files for Meson *_build.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f14f39a..12e7e09a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,18 +1,60 @@ -cmake_minimum_required(VERSION 3.1...3.19) +# 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. + +cmake_minimum_required(VERSION 3.1) project( "rpc.hpp" - VERSION 0.4.1 + VERSION 0.5.1 DESCRIPTION "Simple RPC Header-Only Library" - LANGUAGES CXX) + LANGUAGES CXX +) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +# ==== Build Options ==== + +option(BUILD_ADAPTER_BOOST_JSON "Build the adapter for Boost.JSON" OFF) +option(BUILD_ADAPTER_NJSON "Build the adapter for nlohmann/json" OFF) +option(BUILD_ADAPTER_RAPIDJSON "Build the adapter for rapidjson" OFF) +option(BUILD_BENCHMARK "Build the benchmarking suite" OFF) +option(BUILD_EXAMPLES "Build the examples" OFF) +option(BUILD_TESTING "Build the testing tree" OFF) +option(CODE_COVERAGE "Enable coverage reporting" OFF) +option(DEPENDS_CONAN "Use Conan to manage C/C++ dependencies" OFF) +option(DEPENDS_VCPKG "Use vcpkg to manage C/C++ dependencies" OFF) +option(GENERATE_DOXYGEN "Generate Doxygen documentation from comments" OFF) + +# ==== Machine/Compiler Configs ==== + if(WIN32) set(TARGET_WINDOWS TRUE) if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") @@ -120,42 +162,26 @@ elseif(CXX_CLANG) set(MIN_WARNING -Wall) endif() -include(CTest) -include(Catch) - -option(GENERATE_DOXYGEN "Generate Doxygen documentation from comments" OFF) +# ==== Documentation Generation ==== if(${GENERATE_DOXYGEN}) find_package(Doxygen OPTIONAL_COMPONENTS dot) if(DOXYGEN_FOUND) + set(DOXYGEN_PREDEFINED __cplusplus RPC_HPP_DOXYGEN_GEN) set(DOXYGEN_GENERATE_HTML YES) set(DOXYGEN_GENERATE_LATEX NO) set(DOXYGEN_HTML_OUTPUT "docs") - set(DOXYGEN_EXCLUDE_PATTERNS "*/tests/*") + set(DOXYGEN_EXCLUDE_PATTERNS */tests/* */examples/* */benchmarks/* *.py) set(DOXYGEN_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}") set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "README.md") doxygen_add_docs(docs ${PROJECT_SOURCE_DIR} - COMMENT "Generate doxygen docs for rpc.hpp") + COMMENT "Generate doxygen docs for rpc.hpp") endif() endif() -option(USE_CONAN "Use Conan to manage C/C++ dependencies" OFF) -option(USE_VCPKG "Use vcpkg to manage C/C++ dependencies" OFF) +# ==== Code Coverage ==== -if(${USE_CONAN}) - if(${USE_VCPKG}) - message(FATAL_ERROR "Using both vcpkg and Conan is not supported!") - endif() - - set(CONAN_EXTRA_REQUIRES "") - set(CONAN_EXTRA_OPTIONS "") - include(cmake/Conan.cmake) -endif() - -add_library(coverage_config INTERFACE) - -option(CODE_COVERAGE "Enable coverage reporting" OFF) if(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(coverage_config INTERFACE -O0 -g --coverage) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13) @@ -165,22 +191,76 @@ if(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") endif() endif() -find_package(Threads) +# ==== Dependency Management ==== + +if(${DEPENDS_CONAN}) + if(${DEPENDS_VCPKG}) + message(FATAL_ERROR "Using both vcpkg and Conan is not supported!") + endif() + + set(CONAN_EXTRA_REQUIRES "") + set(CONAN_EXTRA_OPTIONS "") + include(cmake/Conan.cmake) +endif() + +# ==== Target(s) ==== add_library(rpc_hpp INTERFACE) -target_include_directories(rpc_hpp INTERFACE "${PROJECT_SOURCE_DIR}/include") -target_link_libraries(rpc_hpp INTERFACE ${CMAKE_THREAD_LIBS_INIT}) -install(FILES "${PROJECT_SOURCE_DIR}/include/rpc.hpp" - DESTINATION "${CMAKE_INSTALL_PREFIX}/include") +add_library(RpcHpp::rpc_hpp ALIAS rpc_hpp) + +include(GNUInstallDirs) +target_include_directories(rpc_hpp + INTERFACE + $ + $ +) +target_compile_features(rpc_hpp INTERFACE cxx_std_17) -option(BUILD_NJSON_ADAPTER "Build the adapter for nlohmann/json" ON) -option(BUILD_RAPIDJSON_ADAPTER "Build the adapter for rapidjson" ON) -option(BUILD_BOOST_JSON_ADAPTER "Build the adapter for Boost.JSON" OFF) +# ==== Target Installation ==== -add_subdirectory(include/rpc_adapters) +include(CMakePackageConfigHelpers) + +write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/RpcHppConfigVersion.cmake + COMPATIBILITY SameMajorVersion) + +install(TARGETS rpc_hpp + EXPORT rpc_hpp-targets + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(EXPORT rpc_hpp-targets + FILE "RpcHppConfig.cmake" + NAMESPACE RpcHpp:: + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/rpc_hpp) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RpcHppConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/rpc_hpp) +install(FILES include/rpc.hpp include/rpc_dispatch_helper.hpp + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +# ==== Sub-Projects ==== + +if(BUILD_ADAPTER_BOOST_JSON OR BUILD_ADAPTER_NJSON OR BUILD_ADAPTER_RAPIDJSON) + message("Building rpc_adapters...") + add_subdirectory(include/rpc_adapters) +else() + message("Skipping rpc_adapters...") +endif() + +if(BUILD_BENCHMARK) + message("Building benchmarks...") + add_subdirectory(benchmarks) +else() + message("Skipping benchmarks...") +endif() + +if(BUILD_EXAMPLES) + message("Building examples...") + add_subdirectory(examples) +else() + message("Skipping examples...") +endif() -option(BUILD_TESTING "Build the testing tree." ON) if(BUILD_TESTING AND (PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)) - enable_testing() + message("Building tests...") add_subdirectory(tests) +else() + message("Skipping tests...") endif() diff --git a/CMakeSettings.json b/CMakeSettings.json deleted file mode 100644 index 989d95f2..00000000 --- a/CMakeSettings.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "variables": [ - { - "name": "USE_CONAN", - "value": "True", - "type": "BOOL" - }, - { - "name": "BUILD_RAPIDJSON_ADAPTER", - "value": "True", - "type": "BOOL" - }, - { - "name": "GENERATE_DOXYGEN", - "value": "False", - "type": "BOOL" - } - ] - }, - { - "name": "x64-Release", - "generator": "Ninja", - "configurationType": "Release", - "buildRoot": "${projectDir}\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [ - { - "name": "USE_CONAN", - "value": "True", - "type": "BOOL" - } - ] - } - ] -} \ No newline at end of file diff --git a/Doxyfile.in b/Doxyfile.in deleted file mode 100644 index 7397dc35..00000000 --- a/Doxyfile.in +++ /dev/null @@ -1,279 +0,0 @@ -# -# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! -# - -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "@PROJECT_NAME@" -PROJECT_NUMBER = @PROJECT_VERSION@ -PROJECT_BRIEF = "@PROJECT_DESCRIPTION@" -PROJECT_LOGO = -OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_FOLDER@ -CREATE_SUBDIRS = NO -ALLOW_UNICODE_NAMES = NO -OUTPUT_LANGUAGE = English -OUTPUT_TEXT_DIRECTION = None -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = "The $name class" "The $name widget" "The $name file" is provides specifies contains represents a an the -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = YES -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -JAVADOC_BANNER = NO -QT_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 4 -ALIASES = -TCL_SUBST = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -OPTIMIZE_FOR_FORTRAN = NO -OPTIMIZE_OUTPUT_VHDL = NO -OPTIMIZE_OUTPUT_SLICE = NO -EXTENSION_MAPPING = -MARKDOWN_SUPPORT = YES -TOC_INCLUDE_HEADINGS = 5 -AUTOLINK_SUPPORT = YES -BUILTIN_STL_SUPPORT = NO -CPP_CLI_SUPPORT = NO -SIP_SUPPORT = NO -IDL_PROPERTY_SUPPORT = YES -DISTRIBUTE_GROUP_DOC = NO -GROUP_NESTED_COMPOUNDS = NO -SUBGROUPING = YES -INLINE_GROUPED_CLASSES = NO -INLINE_SIMPLE_STRUCTS = NO -TYPEDEF_HIDES_STRUCT = NO -LOOKUP_CACHE_SIZE = 0 -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_PRIV_VIRTUAL = NO -EXTRACT_PACKAGE = NO -EXTRACT_STATIC = NO -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -EXTRACT_ANON_NSPACES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = NO -HIDE_SCOPE_NAMES = NO -HIDE_COMPOUND_REFERENCE= NO -SHOW_INCLUDE_FILES = YES -SHOW_GROUPED_MEMB_INC = NO -FORCE_LOCAL_INCLUDES = NO -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_MEMBERS_CTORS_1ST = NO -SORT_GROUP_NAMES = NO -SORT_BY_SCOPE_NAME = NO -STRICT_PROTO_MATCHING = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_FILES = YES -SHOW_NAMESPACES = YES -FILE_VERSION_FILTER = -LAYOUT_FILE = -CITE_BIB_FILES = -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_AS_ERROR = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -INPUT = @DOXYGEN_INPUT_FOLDER@ -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.idl *.ddl *.odl *.h *.hh *.hxx *.hpp *.h++ *.cs *.d *.php *.php4 *.php5 *.phtml *.inc *.m *.markdown *.md *.mm *.dox *.py *.pyw *.f90 *.f95 *.f03 *.f08 *.f *.for *.tcl *.vhd *.vhdl *.ucf *.qsf *.ice -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = */thirdparty/* */.git/* */.svn/* */.hg/* */CMakeFiles/* */_CPack_Packages/* DartConfiguration.tcl CMakeLists.txt CMakeCache.txt meson.build */catch2/* */nlohmann/* */tests/* -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = * -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -FILTER_SOURCE_PATTERNS = -USE_MDFILE_AS_MAINPAGE = README.md -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -REFERENCES_LINK_SOURCE = YES -SOURCE_TOOLTIPS = YES -USE_HTAGS = NO -VERBATIM_HEADERS = YES -CLANG_ASSISTED_PARSING = NO -CLANG_OPTIONS = -CLANG_DATABASE_PATH = -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_EXTRA_STYLESHEET = -HTML_EXTRA_FILES = -HTML_COLORSTYLE_HUE = 220 -HTML_COLORSTYLE_SAT = 100 -HTML_COLORSTYLE_GAMMA = 80 -HTML_TIMESTAMP = NO -HTML_DYNAMIC_MENUS = YES -HTML_DYNAMIC_SECTIONS = NO -HTML_INDEX_NUM_ENTRIES = 100 -GENERATE_DOCSET = NO -DOCSET_FEEDNAME = "Doxygen generated docs" -DOCSET_BUNDLE_ID = org.doxygen.Project -DOCSET_PUBLISHER_ID = org.doxygen.Publisher -DOCSET_PUBLISHER_NAME = Publisher -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -CHM_INDEX_ENCODING = -BINARY_TOC = NO -TOC_EXPAND = NO -GENERATE_QHP = NO -QCH_FILE = -QHP_NAMESPACE = org.doxygen.Project -QHP_VIRTUAL_FOLDER = doc -QHP_CUST_FILTER_NAME = -QHP_CUST_FILTER_ATTRS = -QHP_SECT_FILTER_ATTRS = -QHG_LOCATION = -GENERATE_ECLIPSEHELP = NO -ECLIPSE_DOC_ID = org.doxygen.Project -DISABLE_INDEX = NO -GENERATE_TREEVIEW = NO -ENUM_VALUES_PER_LINE = 4 -TREEVIEW_WIDTH = 250 -EXT_LINKS_IN_WINDOW = NO -FORMULA_FONTSIZE = 10 -FORMULA_TRANSPARENT = YES -USE_MATHJAX = NO -MATHJAX_FORMAT = HTML-CSS -MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/ -MATHJAX_EXTENSIONS = -MATHJAX_CODEFILE = -SEARCHENGINE = YES -SERVER_BASED_SEARCH = NO -EXTERNAL_SEARCH = NO -SEARCHENGINE_URL = -SEARCHDATA_FILE = searchdata.xml -EXTERNAL_SEARCH_ID = -EXTRA_SEARCH_MAPPINGS = -GENERATE_LATEX = YES -LATEX_OUTPUT = latex -LATEX_CMD_NAME = -MAKEINDEX_CMD_NAME = makeindex -LATEX_MAKEINDEX_CMD = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4 -EXTRA_PACKAGES = -LATEX_HEADER = -LATEX_FOOTER = -LATEX_EXTRA_STYLESHEET = -LATEX_EXTRA_FILES = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -LATEX_SOURCE_CODE = NO -LATEX_BIB_STYLE = plain -LATEX_TIMESTAMP = NO -LATEX_EMOJI_DIRECTORY = -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -RTF_SOURCE_CODE = NO -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_SUBDIR = -MAN_LINKS = NO -GENERATE_XML = NO -XML_OUTPUT = xml -XML_PROGRAMLISTING = YES -XML_NS_MEMB_FILE_SCOPE = NO -GENERATE_DOCBOOK = NO -DOCBOOK_OUTPUT = docbook -DOCBOOK_PROGRAMLISTING = NO -GENERATE_AUTOGEN_DEF = NO -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = _WIN32, MSVC, __cplusplus, __unix__, __linux__ -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -EXTERNAL_PAGES = YES -CLASS_DIAGRAMS = YES -DIA_PATH = -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = YES -DOT_NUM_THREADS = 0 -DOT_FONTNAME = Helvetica -DOT_FONTSIZE = 10 -DOT_FONTPATH = -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -UML_LIMIT_NUM_FIELDS = 10 -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -INTERACTIVE_SVG = NO -DOT_PATH = "@DOT_PATH@" -DOTFILE_DIRS = -MSCFILE_DIRS = -DIAFILE_DIRS = -PLANTUML_JAR_PATH = -PLANTUML_CFG_FILE = -PLANTUML_INCLUDE_PATH = -DOT_GRAPH_MAX_NODES = 50 -MAX_DOT_GRAPH_DEPTH = 0 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = YES -GENERATE_LEGEND = YES -DOT_CLEANUP = YES diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt new file mode 100644 index 00000000..f0f04708 --- /dev/null +++ b/benchmarks/CMakeLists.txt @@ -0,0 +1,90 @@ +# 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. + +cmake_minimum_required(VERSION 3.1) + +project( + "rpc.hpp benchmarks" + LANGUAGES CXX +) + +if(NOT TARGET RpcHpp::rpc_hpp) + message(FATAL_ERROR "RpcHpp::rpc_hpp alias not set. Please generate CMake from the root directory") +endif() + +if(NOT TARGET catch2_lib) + add_library(catch2_lib INTERFACE) + + if(${DEPENDS_CONAN}) + set(CONAN_EXTRA_REQUIRES "catch2/[>2.10.0 <3.0.0]") + run_conan() + target_link_libraries(catch2_lib INTERFACE CONAN_PKG::catch2) + elseif(${DEPENDS_VCPKG}) + find_package(Catch2 CONFIG REQUIRED) + target_link_libraries(catch2_lib INTERFACE Catch2::Catch2) + else() + find_path(catch2_path catch2/catch.hpp) + target_include_directories(catch2_lib SYSTEM INTERFACE catch2_path) + endif() +endif() + +if(NOT TARGET asio_lib) + add_library(asio_lib INTERFACE) + target_compile_definitions(asio_lib INTERFACE ASIO_STANDALONE) + + if(${DEPENDS_CONAN}) + set(CONAN_EXTRA_REQUIRES "asio/[>=1.14.0]") + run_conan() + target_link_libraries(asio_lib INTERFACE CONAN_PKG::asio) + elseif(${DEPENDS_VCPKG}) + find_package(asio CONFIG REQUIRED) + target_link_libraries(asio_lib INTERFACE asio asio::asio) + else() + find_path(asio_path asio.hpp) + target_include_directories(asio_lib SYSTEM INTERFACE asio_path) + endif() +endif() + +add_executable(rpc_benchmark "benchmark.cpp" "client.hpp" "test_structs.hpp") +target_link_libraries(rpc_benchmark PRIVATE rpc_hpp catch2_lib asio_lib) + +if(${BUILD_ADAPTER_BOOST_JSON}) + target_link_libraries(rpc_benchmark PRIVATE boost_json_adapter) +endif() + +if(${BUILD_ADAPTER_NJSON}) + target_link_libraries(rpc_benchmark PRIVATE njson_adapter) +endif() + +if(${BUILD_ADAPTER_RAPIDJSON}) + target_link_libraries(rpc_benchmark PRIVATE rpdjson_adapter) +endif() + +target_compile_options(rpc_benchmark PRIVATE ${FULL_WARNING}) diff --git a/benchmarks/benchmark.cpp b/benchmarks/benchmark.cpp new file mode 100644 index 00000000..ea66cf3e --- /dev/null +++ b/benchmarks/benchmark.cpp @@ -0,0 +1,548 @@ +#define CATCH_CONFIG_ENABLE_BENCHMARKING +#define CATCH_CONFIG_MAIN +#define RPC_HPP_CLIENT_IMPL + +#include "client.hpp" +#include "test_structs.hpp" + +#include + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) +# include + +using rpc::adapters::bjson_adapter; +#endif + +#if defined(RPC_HPP_ENABLE_NJSON) +# include + +using rpc::adapters::njson_adapter; +#endif + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) +# include + +using rpc::adapters::rapidjson_adapter; +#endif + +template +TestClient& GetClient(); + +template<> +TestClient& GetClient() +{ + static TestClient client("127.0.0.1", "5000"); + return client; +} + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) +template<> +TestClient& GetClient() +{ + static TestClient client("127.0.0.1", "5001"); + return client; +} +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) +template<> +TestClient& GetClient() +{ + static TestClient client("127.0.0.1", "5002"); + return client; +} +#endif + +TEST_CASE("By Value (simple)", "[value][simple][cached]") +{ + constexpr uint64_t expected = 10946ULL; + uint64_t test = 1; + + BENCHMARK("rpc.hpp (asio::tcp, njson)") + { + test = GetClient() + .template call_func("Fibonacci", 20) + .get_result() + .value(); + }; + + REQUIRE(expected == test); + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) + test = 1; + + BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") + { + test = GetClient() + .template call_func("Fibonacci", 20) + .get_result() + .value(); + }; + + REQUIRE(expected == test); +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) + test = 1; + + BENCHMARK("rpc.hpp (asio::tcp, Boost.JSON)") + { + test = GetClient() + .template call_func("Fibonacci", 20) + .get_result() + .value(); + }; + + REQUIRE(expected == test); +#endif +} + +TEST_CASE("By Value (complex)", "[value][complex][cached]") +{ + const std::string expected = "467365747274747d315a473a527073796c7e707b85"; + std::string test; + + BENCHMARK("rpc.hpp (asio::tcp, njson)") + { + ComplexObject cx; + cx.flag1 = false; + cx.flag2 = true; + cx.id = 24; + cx.name = "Franklin D. Roosevelt"; + cx.vals = { 0, 1, 4, 6, 7, 8, 11, 15, 17, 22, 25, 26 }; + + test = GetClient() + .template call_func("HashComplex", cx) + .get_result() + .value(); + }; + + REQUIRE_THAT(expected, Catch::Matchers::Equals(test)); + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) + test = ""; + + BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") + { + ComplexObject cx; + cx.flag1 = false; + cx.flag2 = true; + cx.id = 24; + cx.name = "Franklin D. Roosevelt"; + cx.vals = { 0, 1, 4, 6, 7, 8, 11, 15, 17, 22, 25, 26 }; + + test = GetClient() + .template call_func("HashComplex", cx) + .get_result() + .value(); + }; + + REQUIRE_THAT(expected, Catch::Matchers::Equals(test)); +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) + test = ""; + + BENCHMARK("rpc.hpp (asio::tcp, Boost.JSON)") + { + ComplexObject cx; + cx.flag1 = false; + cx.flag2 = true; + cx.id = 24; + cx.name = "Franklin D. Roosevelt"; + cx.vals = { 0, 1, 4, 6, 7, 8, 11, 15, 17, 22, 25, 26 }; + + test = GetClient() + .template call_func("HashComplex", cx) + .get_result() + .value(); + }; + + REQUIRE_THAT(expected, Catch::Matchers::Equals(test)); +#endif +} + +TEST_CASE("By Value (many)", "[value][many][cached]") +{ + constexpr double expected = 3313.695594785; + double test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, njson)") + { + test = GetClient() + .template call_func("StdDev", 55.65, 125.325, 552.125, 12.767, 2599.6, + 1245.125663, 9783.49, 125.12, 553.3333333333, 2266.1) + .get_result() + .value(); + }; + + REQUIRE_THAT(test, Catch::Matchers::WithinRel(expected)); + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) + test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") + { + test = GetClient() + .template call_func("StdDev", 55.65, 125.325, 552.125, 12.767, 2599.6, + 1245.125663, 9783.49, 125.12, 553.3333333333, 2266.1) + .get_result() + .value(); + }; + + REQUIRE_THAT(test, Catch::Matchers::WithinRel(expected)); +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) + test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, Boost.JSON)") + { + test = GetClient() + .template call_func("StdDev", 55.65, 125.325, 552.125, 12.767, 2599.6, + 1245.125663, 9783.49, 125.12, 553.3333333333, 2266.1) + .get_result() + .value(); + }; + + REQUIRE_THAT(test, Catch::Matchers::WithinRel(expected)); +#endif +} + +TEST_CASE("By Reference (simple)", "[ref][simple]") +{ + constexpr uint64_t expected = 10946ULL; + uint64_t test = 0; + + BENCHMARK("rpc.hpp (asio::tcp, njson)") + { + uint64_t num = 20; + test = GetClient().call_func("FibonacciRef", num).template get_arg<0>(); + }; + + REQUIRE(expected == test); + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) + test = 0; + + BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") + { + uint64_t num = 20; + test = GetClient().call_func("FibonacciRef", num).template get_arg<0>(); + }; +#endif + + REQUIRE(expected == test); + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) + test = 0; + + BENCHMARK("rpc.hpp (asio::tcp, Boost.JSON)") + { + uint64_t num = 20; + test = GetClient().call_func("FibonacciRef", num).template get_arg<0>(); + }; + + REQUIRE(expected == test); +#endif +} + +TEST_CASE("By Reference (complex)", "[ref][complex]") +{ + const std::string expected = "467365747274747d315a473a527073796c7e707b85"; + std::string test; + + BENCHMARK("rpc.hpp (asio::tcp, njson)") + { + ComplexObject cx; + cx.flag1 = false; + cx.flag2 = true; + cx.id = 24; + cx.name = "Franklin D. Roosevelt"; + cx.vals = { 0, 1, 4, 6, 7, 8, 11, 15, 17, 22, 25, 26 }; + + test = + GetClient().call_func("HashComplexRef", cx, test).template get_arg<1>(); + }; + + REQUIRE_THAT(expected, Catch::Matchers::Equals(test)); + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) + test = ""; + + BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") + { + ComplexObject cx; + cx.flag1 = false; + cx.flag2 = true; + cx.id = 24; + cx.name = "Franklin D. Roosevelt"; + cx.vals = { 0, 1, 4, 6, 7, 8, 11, 15, 17, 22, 25, 26 }; + + test = GetClient() + .call_func("HashComplexRef", cx, test) + .template get_arg<1>(); + }; + + REQUIRE_THAT(expected, Catch::Matchers::Equals(test)); +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) + test = ""; + + BENCHMARK("rpc.hpp (asio::tcp, Boost.JSON)") + { + ComplexObject cx; + cx.flag1 = false; + cx.flag2 = true; + cx.id = 24; + cx.name = "Franklin D. Roosevelt"; + cx.vals = { 0, 1, 4, 6, 7, 8, 11, 15, 17, 22, 25, 26 }; + + test = + GetClient().call_func("HashComplexRef", cx, test).template get_arg<1>(); + }; + + REQUIRE_THAT(expected, Catch::Matchers::Equals(test)); +#endif +} + +TEST_CASE("By Reference (many)", "[ref][many]") +{ + constexpr double expected = 313.2216436152; + double test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, njson)") + { + double n1 = 55.65; + double n2 = 125.325; + double n3 = 552.125; + double n4 = 12.767; + double n5 = 2599.6; + double n6 = 1245.125663; + double n7 = 9783.49; + double n8 = 125.12; + double n9 = 553.3333333333; + double n10 = 2266.1; + + const auto pack = GetClient().call_func( + "SquareRootRef", n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); + + n1 = pack.template get_arg<0>(); + n2 = pack.template get_arg<1>(); + n3 = pack.template get_arg<2>(); + n4 = pack.template get_arg<3>(); + n5 = pack.template get_arg<4>(); + n6 = pack.template get_arg<5>(); + n7 = pack.template get_arg<6>(); + n8 = pack.template get_arg<7>(); + n9 = pack.template get_arg<8>(); + n10 = pack.template get_arg<9>(); + test = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10; + }; + + REQUIRE_THAT(test, Catch::Matchers::WithinAbs(expected, 0.001)); + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) + test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") + { + double n1 = 55.65; + double n2 = 125.325; + double n3 = 552.125; + double n4 = 12.767; + double n5 = 2599.6; + double n6 = 1245.125663; + double n7 = 9783.49; + double n8 = 125.12; + double n9 = 553.3333333333; + double n10 = 2266.1; + + const auto pack = GetClient().call_func( + "SquareRootRef", n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); + + n1 = pack.template get_arg<0>(); + n2 = pack.template get_arg<1>(); + n3 = pack.template get_arg<2>(); + n4 = pack.template get_arg<3>(); + n5 = pack.template get_arg<4>(); + n6 = pack.template get_arg<5>(); + n7 = pack.template get_arg<6>(); + n8 = pack.template get_arg<7>(); + n9 = pack.template get_arg<8>(); + n10 = pack.template get_arg<9>(); + test = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10; + }; + + REQUIRE_THAT(test, Catch::Matchers::WithinAbs(expected, 0.001)); +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) + test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, Boost.JSON)") + { + double n1 = 55.65; + double n2 = 125.325; + double n3 = 552.125; + double n4 = 12.767; + double n5 = 2599.6; + double n6 = 1245.125663; + double n7 = 9783.49; + double n8 = 125.12; + double n9 = 553.3333333333; + double n10 = 2266.1; + + const auto pack = GetClient().call_func( + "SquareRootRef", n1, n2, n3, n4, n5, n6, n7, n8, n9, n10); + + n1 = pack.template get_arg<0>(); + n2 = pack.template get_arg<1>(); + n3 = pack.template get_arg<2>(); + n4 = pack.template get_arg<3>(); + n5 = pack.template get_arg<4>(); + n6 = pack.template get_arg<5>(); + n7 = pack.template get_arg<6>(); + n8 = pack.template get_arg<7>(); + n9 = pack.template get_arg<8>(); + n10 = pack.template get_arg<9>(); + test = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10; + }; + + REQUIRE_THAT(test, Catch::Matchers::WithinAbs(expected, 0.001)); +#endif +} + +TEST_CASE("With Container", "[container][cached]") +{ + constexpr double expected = 1731.8635996333; + double test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, njson)") + { + const std::vector vec{ 55.65, 125.325, 552.125, 12.767, 2599.6, 1245.125663, + 9783.49, 125.12, 553.3333333333, 2266.1 }; + + test = GetClient() + .template call_func("AverageContainer", vec) + .get_result() + .value(); + }; + + REQUIRE_THAT(test, Catch::Matchers::WithinAbs(expected, 0.001)); + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) + test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") + { + const std::vector vec{ 55.65, 125.325, 552.125, 12.767, 2599.6, 1245.125663, + 9783.49, 125.12, 553.3333333333, 2266.1 }; + + test = GetClient() + .template call_func("AverageContainer", vec) + .get_result() + .value(); + }; +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) + test = 1.0; + + BENCHMARK("rpc.hpp (asio::tcp, Boost.JSON)") + { + const std::vector vec{ 55.65, 125.325, 552.125, 12.767, 2599.6, 1245.125663, + 9783.49, 125.12, 553.3333333333, 2266.1 }; + + test = GetClient() + .template call_func("AverageContainer", vec) + .get_result() + .value(); + }; +#endif +} + +TEST_CASE("Sequential", "[sequential][cached]") +{ + BENCHMARK("rpc.hpp (asio::tcp, njson)") + { + auto vec = GetClient() + .template call_func>("RandInt", 5, 30, 1000) + .get_result() + .value(); + + for (auto& val : vec) + { + val = GetClient() + .template call_func("Fibonacci", val) + .get_result() + .value(); + } + + return GetClient() + .template call_func("AverageContainer", vec) + .get_result() + .value(); + }; + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) + BENCHMARK("rpc.hpp (asio::tcp, rapidjson)") + { + auto vec = GetClient() + .template call_func>("RandInt", 5, 30, 1000) + .get_result() + .value(); + + for (auto& val : vec) + { + val = GetClient() + .template call_func("Fibonacci", val) + .get_result() + .value(); + } + + return GetClient() + .template call_func("AverageContainer", vec) + .get_result() + .value(); + }; +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) + BENCHMARK("rpc.hpp (asio::tcp, bjson)") + { + auto vec = GetClient() + .template call_func>("RandInt", 5, 30, 1000) + .get_result() + .value(); + + for (auto& val : vec) + { + val = GetClient() + .template call_func("Fibonacci", val) + .get_result() + .value(); + } + + return GetClient() + .template call_func("AverageContainer", vec) + .get_result() + .value(); + }; +#endif +} + +TEST_CASE("KillServer", + "[!mayfail][value][simple][cached][ref][complex][sequential][pointer][many][container]") +{ + auto& client = GetClient(); + + try + { + client.call_func("KillServer"); + } + catch (...) + { + } +} diff --git a/benchmarks/client.hpp b/benchmarks/client.hpp new file mode 100644 index 00000000..e6c0031c --- /dev/null +++ b/benchmarks/client.hpp @@ -0,0 +1,56 @@ +#pragma once + +#include + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) +# include + +using rpc::adapters::bjson_adapter; +#endif + +#if defined(RPC_HPP_ENABLE_NJSON) +# include + +using rpc::adapters::njson_adapter; +#endif + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) +# include + +using rpc::adapters::rapidjson_adapter; +#endif + +using asio::ip::tcp; + +template +class TestClient final : public rpc::client_interface +{ +public: + TestClient(const std::string_view host, const std::string_view port) + : m_socket(m_io), m_resolver(m_io) + { + asio::connect(m_socket, m_resolver.resolve(host, port)); + } + + void send(const typename Serial::bytes_t& mesg) override + { + asio::write(m_socket, asio::buffer(mesg, mesg.size())); + } + + [[nodiscard]] typename Serial::bytes_t receive() override + { + const auto numBytes = m_socket.read_some(asio::buffer(m_buffer, 64U * 1024UL)); + return std::string(m_buffer, m_buffer + numBytes); + } + + [[nodiscard]] std::string getIP() const + { + return m_socket.remote_endpoint().address().to_string(); + } + +private: + asio::io_context m_io{}; + tcp::socket m_socket; + tcp::resolver m_resolver; + uint8_t m_buffer[64U * 1024UL]{}; +}; diff --git a/benchmarks/meson.build b/benchmarks/meson.build new file mode 100644 index 00000000..5de0b7bb --- /dev/null +++ b/benchmarks/meson.build @@ -0,0 +1,56 @@ +# 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']) + +bench_dependencies = [rpc_hpp_dep, asio_dep, catch2_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', 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/benchmarks/test_structs.hpp b/benchmarks/test_structs.hpp new file mode 100644 index 00000000..8506c004 --- /dev/null +++ b/benchmarks/test_structs.hpp @@ -0,0 +1,353 @@ +#pragma once + +#if defined(RPC_HPP_ENABLE_NJSON) +# include + +using rpc::adapters::njson; +using rpc::adapters::njson_adapter; +#endif + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) +# include + +using rpc::adapters::rapidjson_adapter; +using rpc::adapters::rapidjson_doc; +using rpc::adapters::rapidjson_val; +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) +# include + +namespace bjson = boost::json; +using rpc::adapters::bjson_adapter; +using rpc::adapters::bjson_obj; +using rpc::adapters::bjson_val; +#endif + +#include +#include +#include +#include +#include + +struct TestMessage +{ + bool flag1{}; + bool flag2{}; + int id{}; + int data[256]{}; + uint8_t data_sz{}; + + [[nodiscard]] bool operator==(const TestMessage& other) const noexcept + { + if (flag1 != other.flag1 || flag2 != other.flag2 || id != other.id + || data_sz != other.data_sz) + { + return false; + } + + return std::memcmp(data, other.data, data_sz) == 0; + } +}; + +struct ComplexObject +{ + int id{}; + std::string name{}; + bool flag1{}; + bool flag2{}; + std::array vals{}; +}; + +#if defined(RPC_HPP_ENABLE_NJSON) +template<> +template<> +inline njson njson_adapter::serialize(const TestMessage& val) +{ + njson obj_j; + obj_j["flag1"] = val.flag1; + obj_j["flag2"] = val.flag2; + obj_j["id"] = val.id; + obj_j["data"] = njson::array(); + obj_j["data_sz"] = val.data_sz; + + for (uint8_t i = 0; i < val.data_sz; ++i) + { + obj_j["data"].push_back(val.data[i]); + } + + return obj_j; +} + +template<> +template<> +inline TestMessage njson_adapter::deserialize(const njson& serial_obj) +{ + TestMessage mesg; + mesg.flag1 = serial_obj["flag1"].get(); + mesg.flag2 = serial_obj["flag2"].get(); + mesg.id = serial_obj["id"].get(); + mesg.data_sz = serial_obj["data_sz"].get(); + std::copy_n(serial_obj["data"].begin(), mesg.data_sz, mesg.data); + return mesg; +} + +template<> +template<> +inline njson njson_adapter::serialize(const ComplexObject& val) +{ + njson obj_j; + obj_j["id"] = val.id; + obj_j["name"] = val.name; + obj_j["flag1"] = val.flag1; + obj_j["flag2"] = val.flag2; + obj_j["vals"] = val.vals; + + return obj_j; +} + +template<> +template<> +inline ComplexObject njson_adapter::deserialize(const njson& serial_obj) +{ + ComplexObject cx; + cx.id = serial_obj["id"].get(); + cx.name = serial_obj["name"].get(); + cx.flag1 = serial_obj["flag1"].get(); + cx.flag2 = serial_obj["flag2"].get(); + const auto& vals = serial_obj["vals"]; + + if (vals.size() > 12) + { + std::copy_n(vals.begin(), 12, cx.vals.begin()); + } + else + { + std::copy(vals.begin(), vals.end(), cx.vals.begin()); + } + + return cx; +} +#endif + +#if defined(RPC_HPP_ENABLE_RAPIDJSON) +template<> +template<> +inline rapidjson_doc rapidjson_adapter::serialize(const TestMessage& val) +{ + rapidjson_doc d; + d.SetObject(); + auto& alloc = d.GetAllocator(); + + rapidjson_val flag1_v; + flag1_v.SetBool(val.flag1); + d.AddMember("flag1", flag1_v, alloc); + + rapidjson_val flag2_v; + flag2_v.SetBool(val.flag2); + d.AddMember("flag2", flag2_v, alloc); + + rapidjson_val id_v; + id_v.SetInt(val.id); + d.AddMember("id", id_v, alloc); + + rapidjson_val data_sz_v; + data_sz_v.SetUint(val.data_sz); + d.AddMember("data_sz", data_sz_v, alloc); + + rapidjson_val data_v; + data_v.SetArray(); + + for (uint8_t i = 0; i < val.data_sz; ++i) + { + data_v.PushBack(val.data[i], alloc); + } + + d.AddMember("data", data_v, alloc); + return d; +} + +template<> +template<> +inline TestMessage rapidjson_adapter::deserialize(const rapidjson_doc& serial_obj) +{ + TestMessage obj; + const auto flag1_v = serial_obj.FindMember("flag1"); + obj.flag1 = flag1_v->value.GetBool(); + + const auto flag2_v = serial_obj.FindMember("flag2"); + obj.flag2 = flag2_v->value.GetBool(); + + const auto id_v = serial_obj.FindMember("id"); + obj.id = id_v->value.GetInt(); + + const auto data_sz_v = serial_obj.FindMember("data_sz"); + obj.data_sz = static_cast(data_sz_v->value.GetUint()); + + const auto data_v = serial_obj.FindMember("data"); + const auto& arr = data_v->value.GetArray(); + + for (unsigned i = 0; i < obj.data_sz; ++i) + { + obj.data[i] = arr[i].GetInt(); + } + + return obj; +} + +template<> +template<> +inline rapidjson_doc rapidjson_adapter::serialize(const ComplexObject& val) +{ + rapidjson_doc d; + d.SetObject(); + auto& alloc = d.GetAllocator(); + + rapidjson_val id_v; + id_v.SetInt(val.id); + d.AddMember("id", id_v, alloc); + + rapidjson_val name_v; + name_v.SetString(val.name.c_str(), alloc); + d.AddMember("name", name_v, alloc); + + rapidjson_val flag1_v; + flag1_v.SetBool(val.flag1); + d.AddMember("flag1", flag1_v, alloc); + + rapidjson_val flag2_v; + flag2_v.SetBool(val.flag2); + d.AddMember("flag2", flag2_v, alloc); + + rapidjson_val vals_v; + vals_v.SetArray(); + + for (uint8_t i = 0; i < 12; ++i) + { + vals_v.PushBack(val.vals[i], alloc); + } + + d.AddMember("vals", vals_v, alloc); + return d; +} + +template<> +template<> +inline ComplexObject rapidjson_adapter::deserialize(const rapidjson_doc& serial_obj) +{ + ComplexObject obj; + + const auto id_v = serial_obj.FindMember("id"); + obj.id = id_v->value.GetInt(); + + const auto name_v = serial_obj.FindMember("name"); + obj.name = std::string(name_v->value.GetString(), name_v->value.GetStringLength()); + + const auto flag1_v = serial_obj.FindMember("flag1"); + obj.flag1 = flag1_v->value.GetBool(); + + const auto flag2_v = serial_obj.FindMember("flag2"); + obj.flag2 = flag2_v->value.GetBool(); + + const auto vals_v = serial_obj.FindMember("vals"); + const auto& arr = vals_v->value.GetArray(); + + for (unsigned i = 0; i < 12; ++i) + { + obj.vals[i] = static_cast(arr[i].GetUint()); + } + + return obj; +} +#endif + +#if defined(RPC_HPP_ENABLE_BOOST_JSON) +template<> +template<> +inline bjson_val bjson_adapter::serialize(const TestMessage& val) +{ + bjson_obj obj_j; + obj_j["flag1"] = val.flag1; + obj_j["flag2"] = val.flag2; + obj_j["id"] = val.id; + obj_j["data"] = bjson::array{}; + auto& data = obj_j["data"].as_array(); + obj_j["data_sz"] = val.data_sz; + + for (uint8_t i = 0; i < val.data_sz; ++i) + { + data.push_back(val.data[i]); + } + + return obj_j; +} + +template<> +template<> +inline TestMessage bjson_adapter::deserialize(const bjson_val& serial_obj) +{ + TestMessage mesg; + mesg.flag1 = serial_obj.at("flag1").get_bool(); + mesg.flag2 = serial_obj.at("flag2").get_bool(); + mesg.id = static_cast(serial_obj.at("id").get_int64()); + mesg.data_sz = static_cast(serial_obj.at("data_sz").get_int64()); + const auto& data = serial_obj.at("data").as_array(); + + for (uint8_t i = 0; i < mesg.data_sz; ++i) + { + mesg.data[i] = static_cast(data[i].get_int64()); + } + + return mesg; +} + +template<> +template<> +inline bjson_val bjson_adapter::serialize(const ComplexObject& val) +{ + bjson_obj obj_j; + obj_j["id"] = val.id; + obj_j["name"] = val.name; + obj_j["flag1"] = val.flag1; + obj_j["flag2"] = val.flag2; + bjson::array arr; + + for (const auto v : val.vals) + { + arr.push_back(v); + } + + obj_j["vals"] = std::move(arr); + + return obj_j; +} + +template<> +template<> +inline ComplexObject bjson_adapter::deserialize(const bjson_val& serial_obj) +{ + ComplexObject cx; + cx.id = static_cast(serial_obj.at("id").get_int64()); + cx.name = serial_obj.at("name").get_string().c_str(); + cx.flag1 = serial_obj.at("flag1").get_bool(); + cx.flag2 = serial_obj.at("flag2").get_bool(); + const auto& vals = serial_obj.at("vals").as_array(); + + if (vals.size() > 12) + { + for (size_t i = 0; i < 12; ++i) + { + cx.vals[i] = static_cast(vals[i].get_int64()); + } + } + else + { + for (size_t i = 0; i < vals.size(); ++i) + { + cx.vals[i] = static_cast(vals[i].get_int64()); + } + } + + return cx; +} +#endif diff --git a/dispatch_gen.py b/dispatch_gen.py index 3e65c144..4420a9b7 100644 --- a/dispatch_gen.py +++ b/dispatch_gen.py @@ -1,15 +1,87 @@ +# 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. + +"""Allows for generating a larger or smaller rpc_dispatch_helper.hpp file as the max number of functions you can attach in one macro call must be known at compile-time.""" + import sys num_iters = 20 fname = "include/rpc_dispatch_helper.hpp" +f_header = """///@file rpc_dispatch_helper.hpp +///@author Jackson Harmer (jharmer95@gmail.com) +///@brief Helper macros for server dispatching of remote function calls +/// +///@copyright +///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. +/// + +""" + if len(sys.argv) > 1: num_iters = int(sys.argv[1]) if len(sys.argv) > 2: fname = str(sys.argv[2]) with open(fname, "w") as f: + f.write(f_header) f.write("#pragma once\n\n") + f.write("#if !defined(RPC_HPP_DOXYGEN_GEN)\n") f.write("#define EXPAND(x) x\n\n") f.write("#define RPC_FE_0(WHAT)\n") @@ -52,32 +124,42 @@ for x in reversed(range(1, num_iters + 1)): f.write(f"RPC_FE2_{x}, ") - f.write("RPC_FE2_0)(ACTION, __VA_ARGS__))\n\n") + f.write("RPC_FE2_0)(ACTION, __VA_ARGS__))\n") + f.write("#endif\n\n") + f.write("///@brief Attaches function (provided by FUNCNAME) to the server dispatch function\n") f.write( - "#define RPC_ATTACH_FUNC(FUNCNAME) if (func_name == #FUNCNAME) { return dispatch_func(FUNCNAME, serial_obj); }\n" + "#define RPC_ATTACH_FUNC(FUNCNAME) if (func_name == #FUNCNAME) { return dispatch_func(FUNCNAME, serial_obj); }\n\n" ) + f.write("///@brief Attaches multiple functions to the server dispatch function\n") f.write( "#define RPC_ATTACH_FUNCS(FUNCNAME, ...) EXPAND(RPC_FOR_EACH(RPC_ATTACH_FUNC, FUNCNAME, __VA_ARGS__))\n\n" ) + f.write("///@brief Attaches function (provided by FUNCNAME) to the server dispatch funciton with server-side caching\n") f.write( - "#define RPC_ATTACH_CACHED_FUNC(FUNCNAME) if (func_name == #FUNCNAME) { return dispatch_cached_func(FUNCNAME, serial_obj); }\n" + "#define RPC_ATTACH_CACHED_FUNC(FUNCNAME) if (func_name == #FUNCNAME) { return dispatch_cached_func(FUNCNAME, serial_obj); }\n\n" ) + f.write("///@brief Attaches multiple functions to the server dispatch function with server-side caching\n") f.write( "#define RPC_ATTACH_CACHED_FUNCS(FUNCNAME, ...) EXPAND(RPC_FOR_EACH(RPC_ATTACH_CACHED_FUNC, FUNCNAME, __VA_ARGS__))\n\n" ) + f.write("///@brief Attaches function (provided by FUNCNAME) to the server dispatch function with a different function name (provided by FUNC_ALIAS)\n") f.write( - "#define RPC_ALIAS_FUNC(FUNCNAME, FUNC_ALIAS) if (func_name == #FUNC_ALIAS) { return dispatch_func(FUNCNAME, serial_obj); }\n" + "#define RPC_ALIAS_FUNC(FUNCNAME, FUNC_ALIAS) if (func_name == #FUNC_ALIAS) { return dispatch_func(FUNCNAME, serial_obj); }\n\n" ) + f.write("///@brief Attaches function (provided by FUNCNAME) to the server dispatch function with multiple different function names\n") f.write( "#define RPC_MULTI_ALIAS_FUNC(FUNCNAME, FUNC_ALIAS,...) EXPAND(RPC_FOR_EACH2(RPC_ALIAS_FUNC, FUNCNAME, FUNC_ALIAS, __VA_ARGS__))\n\n" ) + f.write("///@brief Attaches function (provided by FUNCNAME) to the server dispatch function with a different function name (provided by FUNC_ALIAS) and server-side caching\n") f.write( - "#define RPC_ALIAS_CACHED_FUNC(FUNCNAME, FUNC_ALIAS) if (func_name == #FUNC_ALIAS) { return dispatch_cached_func(FUNCNAME, serial_obj); }\n" + "#define RPC_ALIAS_CACHED_FUNC(FUNCNAME, FUNC_ALIAS) if (func_name == #FUNC_ALIAS) { return dispatch_cached_func(FUNCNAME, serial_obj); }\n\n" ) + f.write("///@brief Attaches function (provided by FUNCNAME) to the server dispatch function with multiple different function names and server-side caching\n") f.write( "#define RPC_MULTI_ALIAS_CACHED_FUNC(FUNCNAME, FUNC_ALIAS,...) EXPAND(RPC_FOR_EACH2(RPC_ALIAS_CACHED_FUNC, FUNCNAME, FUNC_ALIAS, __VA_ARGS__))\n\n" ) + f.write("///@brief Implements the @ref rpc::server::dispatch_impl function for you and attaches the listed functions\n") f.write( - '#define RPC_DEFAULT_DISPATCH(FUNCNAME, ...) EXPAND(template void rpc::server::dispatch_impl(typename Serial::serial_t& bytes) { const auto func_name = details::pack_adapter::get_func_name(serial_obj); RPC_ATTACH_FUNCS(FUNCNAME, __VA_ARGS__) throw std::runtime_error("RPC error: Called function: \"" + func_name + "\" not found!");})\n' + '#define RPC_DEFAULT_DISPATCH(FUNCNAME, ...) EXPAND(template void rpc::server::dispatch_impl(typename Serial::serial_t& serial_obj) { const auto func_name = pack_adapter::get_func_name(serial_obj); RPC_ATTACH_FUNCS(FUNCNAME, __VA_ARGS__) throw std::runtime_error("RPC error: Called function: \"" + func_name + "\" not found!");})\n' ) diff --git a/docs/annotated.html b/docs/annotated.html index be670cba..98c4be01 100644 --- a/docs/annotated.html +++ b/docs/annotated.html @@ -3,7 +3,7 @@ - + rpc.hpp: Class List @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -69,30 +69,19 @@
Here are the classes, structs, unions and interfaces with brief descriptions:
[detail level 123]
- - - - - - - - - - - - - - - - + + + + + + +
 Nrpc
 NclientNamespace containing client-specific functions and classes Server-side code should not need anything from this namespace
 Cclient_basePolymorphic base class for sending and receiving data to/from the server
 NdetailsNamespace for functions/variables that should be used only from within the library. Using anything in this namespace in your project is discouraged
 Cbool_packDummy struct for all_true
 Cdyn_arrayDynamically sized generic array class. Has a fixed max capacity and a dynamic size
 Chas_beginSFINAE struct for checking a type for a 'begin' member function
 Chas_endSFINAE struct for checking a type for a 'end' member function
 Chas_sizeSFINAE struct for checking a type for a 'size' member function
 Cis_containerSFINAE struct to determine if a type is a container
 Cptr_decayStructure to decay arrays to pointers
 Cclient_basePolymorphic base class for sending and receiving data to/from the server
 Cpacked_funcClass reprensenting a function call including its name, result, and parameters
 Cpacked_func< void, Args... >Class reprensenting a function call (with void result) including its name and parameters
 Cpacked_func_basePolymorphic base class for packed_func
 Cserial_adapterTemplate class that provides an interface for going to and from a packed_func and a serial object
 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
 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
 Cclient_interfaceClass defining an interface for calling into an RPC server or module
diff --git a/docs/classes.html b/docs/classes.html index f0576f0d..796c7e62 100644 --- a/docs/classes.html +++ b/docs/classes.html @@ -3,7 +3,7 @@ - + rpc.hpp: Class Index @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -67,52 +67,19 @@
Class Index
-
b | c | d | h | i | p | s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  b  
-
client_base (rpc::client)   has_end (rpc::details)   packed_func< void, Args... > (rpc)   
  d  
-
has_size (rpc::details)   packed_func_base (rpc)   
bool_pack (rpc::details)   
  i  
-
ptr_decay (rpc::details)   
  c  
-
dyn_array (rpc::details)   
  s  
-
  h  
-
is_container (rpc::details)   
client_base (rpc::client)   
  p  
-
serial_adapter (rpc)   
has_begin (rpc::details)   
packed_func (rpc)   
-
b | c | d | h | i | p | s
+
C | P
+
diff --git a/docs/classrpc_1_1client_1_1client__base-members.html b/docs/classrpc_1_1client_1_1client__base-members.html deleted file mode 100644 index b5de4580..00000000 --- a/docs/classrpc_1_1client_1_1client__base-members.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - -rpc.hpp: Member List - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
rpc::client::client_base Member List
-
-
- -

This is the complete list of members for rpc::client::client_base, including all inherited members.

- - - - -
receive()=0 (defined in rpc::client::client_base)rpc::client::client_basepure virtual
send(const std::string &mesg)=0 (defined in rpc::client::client_base)rpc::client::client_basepure virtual
~client_base()=default (defined in rpc::client::client_base)rpc::client::client_basevirtual
- - - - diff --git a/docs/classrpc_1_1client_1_1client__base.html b/docs/classrpc_1_1client_1_1client__base.html deleted file mode 100644 index f159dd83..00000000 --- a/docs/classrpc_1_1client_1_1client__base.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - -rpc.hpp: rpc::client::client_base Class Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
rpc::client::client_base Class Referenceabstract
-
-
- -

Polymorphic base class for sending and receiving data to/from the server. - More...

- -

#include <rpc.hpp>

- - - - - - -

-Public Member Functions

-virtual void send (const std::string &mesg)=0
 
-virtual std::string receive ()=0
 
-

Detailed Description

-

Polymorphic base class for sending and receiving data to/from the server.

-
Note
client_base must be inherited by a client-side class
-

The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/structrpc_1_1details_1_1has__end-members.html b/docs/classrpc_1_1client_1_1client__interface-members.html similarity index 53% rename from docs/structrpc_1_1details_1_1has__end-members.html rename to docs/classrpc_1_1client_1_1client__interface-members.html index c244a527..630891cf 100644 --- a/docs/structrpc_1_1details_1_1has__end-members.html +++ b/docs/classrpc_1_1client_1_1client__interface-members.html @@ -3,7 +3,7 @@ - + rpc.hpp: Member List @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -63,24 +63,25 @@
-
rpc::details::has_end< C > Member List
+
rpc::client::client_interface< Serial > Member List
-

This is the complete list of members for rpc::details::has_end< C >, including all inherited members.

+

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

- + + + +
value (defined in rpc::details::has_end< C >)rpc::details::has_end< C >static
call_func(std::string &&func_name, Args &&... args)rpc::client::client_interface< Serial >inline
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
diff --git a/docs/classrpc_1_1client_1_1client__interface.html b/docs/classrpc_1_1client_1_1client__interface.html new file mode 100644 index 00000000..5f81b342 --- /dev/null +++ b/docs/classrpc_1_1client_1_1client__interface.html @@ -0,0 +1,244 @@ + + + + + + + +rpc.hpp: rpc::client::client_interface< Serial > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
rpc.hpp +  0.5.1 +
+
Simple RPC Header-Only Library
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
rpc::client::client_interface< Serial > Class Template Referenceabstract
+
+
+ +

Class defining an interface for calling into an RPC server or module. + More...

+ +

#include <rpc.hpp>

+ + + + + + +

+Public Member Functions

template<typename R = void, typename... Args>
packed_func< R, Args... > call_func (std::string &&func_name, Args &&... args)
 Sends an RPC call request to a server, waits for a response, then returns the packed_func to get the results. More...
 
+ + + + + + + +

+Protected Member Functions

virtual void send (const typename Serial::bytes_t &bytes)=0
 Sends serialized data to a server or module. More...
 
virtual Serial::bytes_t receive ()=0
 Receives serialized data from a server or module. More...
 
+

Detailed Description

+

template<typename Serial>
+class rpc::client::client_interface< Serial >

+ +

Class defining an interface for calling into an RPC server or module.

+
Template Parameters
+ + +
Serialserial_adapter type that controls how objects are serialized/deserialized
+
+
+

Member Function Documentation

+ +

◆ call_func()

+ +
+
+
+template<typename Serial >
+
+template<typename R = void, typename... Args>
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
packed_func<R, Args...> rpc::client::client_interface< Serial >::call_func (std::string && func_name,
Args &&... args 
)
+
+inline
+
+ +

Sends an RPC call request to a server, waits for a response, then returns the packed_func to get the results.

+
Template Parameters
+ + + +
RReturn type of the remote function to call
ArgsVariadic argument type(s) of the remote function to call
+
+
+
Parameters
+ + + +
func_nameName of the remote function to call
argsArgument(s) for the remote function
+
+
+
Returns
packed_func<R, Args...> packed_func representation of the called function, including results, arguments, AND/OR server error messages
+ +
+
+ +

◆ receive()

+ +
+
+
+template<typename Serial >
+ + + + + +
+ + + + + + + +
virtual Serial::bytes_t rpc::client::client_interface< Serial >::receive ()
+
+protectedpure virtual
+
+ +

Receives serialized data from a server or module.

+
Returns
Serial::bytes_t Received serialized data
+ +
+
+ +

◆ send()

+ +
+
+
+template<typename Serial >
+ + + + + +
+ + + + + + + + +
virtual void rpc::client::client_interface< Serial >::send (const typename Serial::bytes_t & bytes)
+
+protectedpure virtual
+
+ +

Sends serialized data to a server or module.

+
Parameters
+ + +
bytesSerialized data to be sent
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/classrpc_1_1details_1_1dyn__array-members.html b/docs/classrpc_1_1details_1_1dyn__array-members.html deleted file mode 100644 index 4427899c..00000000 --- a/docs/classrpc_1_1details_1_1dyn__array-members.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - -rpc.hpp: Member List - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
rpc::details::dyn_array< T > Member List
-
-
- -

This is the complete list of members for rpc::details::dyn_array< T >, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - -
back()rpc::details::dyn_array< T >inline
back() constrpc::details::dyn_array< T >inline
begin() noexceptrpc::details::dyn_array< T >inline
begin() const noexceptrpc::details::dyn_array< T >inline
capacity() const noexceptrpc::details::dyn_array< T >inline
data() noexceptrpc::details::dyn_array< T >inline
data() const noexceptrpc::details::dyn_array< T >inline
dyn_array(const size_t capacity) noexceptrpc::details::dyn_array< T >inlineexplicit
dyn_array(const dyn_array &other) noexcept (defined in rpc::details::dyn_array< T >)rpc::details::dyn_array< T >inline
dyn_array(dyn_array &&other) noexcept (defined in rpc::details::dyn_array< T >)rpc::details::dyn_array< T >inline
end() noexceptrpc::details::dyn_array< T >inline
end() const noexceptrpc::details::dyn_array< T >inline
front()rpc::details::dyn_array< T >inline
front() constrpc::details::dyn_array< T >inline
operator=(const dyn_array &other) noexcept (defined in rpc::details::dyn_array< T >)rpc::details::dyn_array< T >inline
operator=(dyn_array &&other) noexcept (defined in rpc::details::dyn_array< T >)rpc::details::dyn_array< T >inline
push_back(const T &val)rpc::details::dyn_array< T >inline
push_back(T &&val)rpc::details::dyn_array< T >inline
push_front(const T &val)rpc::details::dyn_array< T >inline
push_front(T &&val)rpc::details::dyn_array< T >inline
size() const noexceptrpc::details::dyn_array< T >inline
~dyn_array() (defined in rpc::details::dyn_array< T >)rpc::details::dyn_array< T >inlinevirtual
- - - - diff --git a/docs/classrpc_1_1details_1_1dyn__array.html b/docs/classrpc_1_1details_1_1dyn__array.html deleted file mode 100644 index 97129827..00000000 --- a/docs/classrpc_1_1details_1_1dyn__array.html +++ /dev/null @@ -1,737 +0,0 @@ - - - - - - - -rpc.hpp: rpc::details::dyn_array< T > Class Template Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
rpc::details::dyn_array< T > Class Template Reference
-
-
- -

Dynamically sized generic array class. Has a fixed max capacity and a dynamic size. - More...

- -

#include <rpc.hpp>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

 dyn_array (const size_t capacity) noexcept
 Construct a new dyn_array object. More...
 
dyn_array (const dyn_array &other) noexcept
 
dyn_array (dyn_array &&other) noexcept
 
-dyn_arrayoperator= (const dyn_array &other) noexcept
 
-dyn_arrayoperator= (dyn_array &&other) noexcept
 
size_t capacity () const noexcept
 Get the max capacity of the array. More...
 
size_t size () const noexcept
 Get the current size of the array. More...
 
void push_back (const T &val)
 Pushes an item to the end of the array via a copy. More...
 
void push_back (T &&val)
 Pushes an item to the end of the array via a move. More...
 
void push_front (const T &val)
 Pushes an item to the beginning of the array via a copy. More...
 
void push_front (T &&val)
 Pushes an item to the beginning of the array via a move. More...
 
T * data () noexcept
 Returns the pointer to the data in the array. More...
 
const T * data () const noexcept
 Returns the pointer to the data in the array. More...
 
T * begin () noexcept
 Returns the pointer to the beginning of the array. More...
 
const T * begin () const noexcept
 Returns the pointer to the beginning of the array. More...
 
T * end () noexcept
 Returns the pointer to one past the end of the array. More...
 
const T * end () const noexcept
 Returns the pointer to one past the end of the array. More...
 
T & front ()
 Returns a reference to the first element in the array. More...
 
const T & front () const
 Returns a reference to the first element in the array. More...
 
T & back ()
 Returns a reference to the last element in the array. More...
 
const T & back () const
 Returns a reference to the last element in the array. More...
 
-

Detailed Description

-

template<typename T>
-class rpc::details::dyn_array< T >

- -

Dynamically sized generic array class. Has a fixed max capacity and a dynamic size.

-
Template Parameters
- - -
TType to hold in array
-
-
-

Constructor & Destructor Documentation

- -

◆ dyn_array()

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - - -
rpc::details::dyn_array< T >::dyn_array (const size_t capacity)
-
-inlineexplicitnoexcept
-
- -

Construct a new dyn_array object.

-
Parameters
- - -
capacityThe maximum possible size for the array, cannot be changed by the user
-
-
- -
-
-

Member Function Documentation

- -

◆ back() [1/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
T& rpc::details::dyn_array< T >::back ()
-
-inline
-
- -

Returns a reference to the last element in the array.

-
Exceptions
- - -
std::runtime_errorThrown if array is empty
-
-
-
Returns
T& Reference to last element of array
- -
-
- -

◆ back() [2/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
const T& rpc::details::dyn_array< T >::back () const
-
-inline
-
- -

Returns a reference to the last element in the array.

-
Exceptions
- - -
std::runtime_errorThrown if array is empty
-
-
-
Returns
const T& Reference to last element of array
- -
-
- -

◆ begin() [1/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
const T* rpc::details::dyn_array< T >::begin () const
-
-inlinenoexcept
-
- -

Returns the pointer to the beginning of the array.

-
Returns
const T* Pointer to beginning of array
- -
-
- -

◆ begin() [2/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
T* rpc::details::dyn_array< T >::begin ()
-
-inlinenoexcept
-
- -

Returns the pointer to the beginning of the array.

-
Returns
T* Pointer to beginning of array
- -
-
- -

◆ capacity()

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
size_t rpc::details::dyn_array< T >::capacity () const
-
-inlinenoexcept
-
- -

Get the max capacity of the array.

-
Returns
size_t The max capacity
- -
-
- -

◆ data() [1/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
const T* rpc::details::dyn_array< T >::data () const
-
-inlinenoexcept
-
- -

Returns the pointer to the data in the array.

-
Returns
const T* Pointer held by array
- -
-
- -

◆ data() [2/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
T* rpc::details::dyn_array< T >::data ()
-
-inlinenoexcept
-
- -

Returns the pointer to the data in the array.

-
Returns
T* Pointer held by array
- -
-
- -

◆ end() [1/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
const T* rpc::details::dyn_array< T >::end () const
-
-inlinenoexcept
-
- -

Returns the pointer to one past the end of the array.

-
Returns
const T* Pointer to one past end of array
- -
-
- -

◆ end() [2/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
T* rpc::details::dyn_array< T >::end ()
-
-inlinenoexcept
-
- -

Returns the pointer to one past the end of the array.

-
Returns
T* Pointer to one past end of array
- -
-
- -

◆ front() [1/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
T& rpc::details::dyn_array< T >::front ()
-
-inline
-
- -

Returns a reference to the first element in the array.

-
Exceptions
- - -
std::runtime_errorThrown if array is empty
-
-
-
Returns
T& Reference to first element of array
- -
-
- -

◆ front() [2/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
const T& rpc::details::dyn_array< T >::front () const
-
-inline
-
- -

Returns a reference to the first element in the array.

-
Exceptions
- - -
std::runtime_errorThrown if array is empty
-
-
-
Returns
const T& Reference to first element of array
- -
-
- -

◆ push_back() [1/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - - -
void rpc::details::dyn_array< T >::push_back (const T & val)
-
-inline
-
- -

Pushes an item to the end of the array via a copy.

-
Parameters
- - -
valValue to push
-
-
- -
-
- -

◆ push_back() [2/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - - -
void rpc::details::dyn_array< T >::push_back (T && val)
-
-inline
-
- -

Pushes an item to the end of the array via a move.

-
Parameters
- - -
valValue to push
-
-
- -
-
- -

◆ push_front() [1/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - - -
void rpc::details::dyn_array< T >::push_front (const T & val)
-
-inline
-
- -

Pushes an item to the beginning of the array via a copy.

-
Parameters
- - -
valValue to push
-
-
- -
-
- -

◆ push_front() [2/2]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - - -
void rpc::details::dyn_array< T >::push_front (T && val)
-
-inline
-
- -

Pushes an item to the beginning of the array via a move.

-
Parameters
- - -
valValue to push
-
-
- -
-
- -

◆ size()

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - -
size_t rpc::details::dyn_array< T >::size () const
-
-inlinenoexcept
-
- -

Get the current size of the array.

-
Returns
size_t The current size
- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/classrpc_1_1pack__adapter-members.html b/docs/classrpc_1_1pack__adapter-members.html new file mode 100644 index 00000000..e04ea569 --- /dev/null +++ b/docs/classrpc_1_1pack__adapter-members.html @@ -0,0 +1,99 @@ + + + + + + + +rpc.hpp: Member List + + + + + + + + + +
+
+ + + + + + +
+
rpc.hpp +  0.5.1 +
+
Simple RPC Header-Only Library
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
rpc::pack_adapter< Serial > Member List
+
+
+ +

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

+ + + + + + + + + + + + + + + + + +
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
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
+ + + + diff --git a/docs/classrpc_1_1pack__adapter.html b/docs/classrpc_1_1pack__adapter.html new file mode 100644 index 00000000..d881a318 --- /dev/null +++ b/docs/classrpc_1_1pack__adapter.html @@ -0,0 +1,337 @@ + + + + + + + +rpc.hpp: rpc::pack_adapter< Serial > Class Template Reference + + + + + + + + + +
+
+ + + + + + +
+
rpc.hpp +  0.5.1 +
+
Simple RPC Header-Only Library
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
rpc::pack_adapter< Serial > Class Template Reference
+
+
+ +

Class collecting several functions for interoperating between serial objects and a packed_func. + More...

+ +

#include <rpc.hpp>

+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+adapters::bjson_val serialize_pack (const packed_func< R, Args... > &pack)
 
+packed_func< R, Args... > deserialize_pack (const adapters::bjson_val &serial_obj)
 
+std::string get_func_name (const adapters::bjson_val &serial_obj)
 
+void set_err_mesg (adapters::bjson_val &serial_obj, std::string &&mesg)
 
+adapters::njson serialize_pack (const packed_func< R, Args... > &pack)
 
+packed_func< R, Args... > deserialize_pack (const adapters::njson &serial_obj)
 
+std::string get_func_name (const adapters::njson &serial_obj)
 
+void set_err_mesg (adapters::njson &serial_obj, std::string &&mesg)
 
+adapters::rapidjson_doc serialize_pack (const packed_func< R, Args... > &pack)
 
+packed_func< R, Args... > deserialize_pack (const adapters::rapidjson_doc &serial_obj)
 
+std::string get_func_name (const adapters::rapidjson_doc &serial_obj)
 
+void set_err_mesg (adapters::rapidjson_doc &serial_obj, std::string &&mesg)
 
+ + + + + + + + + + + + + + + +

+Static Public Member Functions

template<typename R , typename... Args>
static Serial::serial_t serialize_pack (const packed_func< R, Args... > &pack)
 Serializes a packed_func to a serial object. More...
 
template<typename R , typename... Args>
static packed_func< R, Args... > deserialize_pack (const typename Serial::serial_t &serial_obj)
 De-serializes a serial object to a packed_func. More...
 
static std::string get_func_name (const typename Serial::serial_t &serial_obj)
 Extracts the function name of a serialized function call. More...
 
static void set_err_mesg (typename Serial::serial_t &serial_obj, std::string &&mesg)
 Sets the error message for the serialized function call. More...
 
+

Detailed Description

+

template<typename Serial>
+class rpc::pack_adapter< Serial >

+ +

Class collecting several functions for interoperating between serial objects and a packed_func.

+
Template Parameters
+ + +
Serialserial_adapter type that controls how objects are serialized/deserialized
+
+
+

Member Function Documentation

+ +

◆ deserialize_pack()

+ +
+
+
+template<typename Serial >
+
+template<typename R , typename... Args>
+ + + + + +
+ + + + + + + + +
static packed_func<R, Args...> rpc::pack_adapter< Serial >::deserialize_pack (const typename Serial::serial_t & serial_obj)
+
+static
+
+ +

De-serializes a serial object to a packed_func.

+
Template Parameters
+ + + +
RReturn type of the packed_func
ArgsVariadic argument type(s) of the packed_func
+
+
+
Parameters
+ + +
serial_objSerial object to be serialized
+
+
+
Returns
packed_func<R, Args...> resulting packed_func
+ +
+
+ +

◆ get_func_name()

+ +
+
+
+template<typename Serial >
+ + + + + +
+ + + + + + + + +
static std::string rpc::pack_adapter< Serial >::get_func_name (const typename Serial::serial_t & serial_obj)
+
+static
+
+ +

Extracts the function name of a serialized function call.

+
Parameters
+ + +
serial_objSerial object to be parsed
+
+
+
Returns
std::string Name of the contained function
+ +
+
+ +

◆ serialize_pack()

+ +
+
+
+template<typename Serial >
+
+template<typename R , typename... Args>
+ + + + + +
+ + + + + + + + +
static Serial::serial_t rpc::pack_adapter< Serial >::serialize_pack (const packed_func< R, Args... > & pack)
+
+static
+
+ +

Serializes a packed_func to a serial object.

+
Template Parameters
+ + + +
RReturn type of the packed_func
ArgsVariadic argument type(s) of the packed_func
+
+
+
Parameters
+ + +
packpacked_func to be serialized
+
+
+
Returns
Serial::serial_t Serial representation of the packed_func
+ +
+
+ +

◆ set_err_mesg()

+ +
+
+
+template<typename Serial >
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
static void rpc::pack_adapter< Serial >::set_err_mesg (typename Serial::serial_t & serial_obj,
std::string && mesg 
)
+
+static
+
+ +

Sets the error message for the serialized function call.

+
Parameters
+ + + +
serial_objSerial object to be modified
mesgString to set as the error message
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/classrpc_1_1packed__func-members.html b/docs/classrpc_1_1packed__func-members.html index 9a9ee684..cb539547 100644 --- a/docs/classrpc_1_1packed__func-members.html +++ b/docs/classrpc_1_1packed__func-members.html @@ -3,7 +3,7 @@ - + rpc.hpp: Member List @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -63,7 +63,7 @@
@@ -74,34 +74,16 @@

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

- - - - - - - - - - - - - - - - - - - - - - + + + + + +
clear_result() noexceptrpc::packed_func< R, Args >inline
get_arg(size_t arg_index) constrpc::packed_func< R, Args >inline
get_err_mesg() const noexceptrpc::packed_func_baseinline
get_func_name() const noexceptrpc::packed_func_baseinline
get_result() const noexceptrpc::packed_func< R, Args >inline
operator bool() const noexcept (defined in rpc::packed_func< R, Args >)rpc::packed_func< R, Args >inlineexplicit
operator=(const packed_func &)=default (defined in rpc::packed_func< R, Args >)rpc::packed_func< R, Args >
operator=(packed_func &&)=default (defined in rpc::packed_func< R, Args >)rpc::packed_func< R, Args >
packed_func()=delete (defined in rpc::packed_func< R, Args >)rpc::packed_func< R, Args >
packed_func(std::string func_name, std::optional< result_type > result, std::array< std::any, sizeof...(Args)> args)rpc::packed_func< R, Args >inline
packed_func(const packed_func &)=default (defined in rpc::packed_func< R, Args >)rpc::packed_func< R, Args >
packed_func(packed_func &&)=default (defined in rpc::packed_func< R, Args >)rpc::packed_func< R, Args >
packed_func_base()=delete (defined in rpc::packed_func_base)rpc::packed_func_base
packed_func_base(std::string &&func_name)rpc::packed_func_baseinlineexplicit
packed_func_base(const packed_func_base &)=default (defined in rpc::packed_func_base)rpc::packed_func_base
packed_func_base(packed_func_base &&)=default (defined in rpc::packed_func_base)rpc::packed_func_base
result_type typedefrpc::packed_func< R, Args >
set_arg(size_t arg_index, T value)rpc::packed_func< R, Args >inline
set_args(const std::tuple< std::remove_cv_t< std::remove_reference_t< Args >>... > &args)rpc::packed_func< R, Args >inline
set_err_mesg(const std::string &mesg) noexceptrpc::packed_func_baseinline
set_result(R value) noexceptrpc::packed_func< R, Args >inline
~packed_func_base()=default (defined in rpc::packed_func_base)rpc::packed_func_basevirtual
clear_result() &noexceptrpc::packed_func< R, Args >inline
get_result() const noexceptrpc::packed_func< R, Args >inline
operator bool() const noexceptrpc::packed_func< R, Args >inlineexplicit
packed_func(std::string func_name, std::optional< result_t > result, args_t args)rpc::packed_func< R, Args >inline
result_t typedefrpc::packed_func< R, Args >
set_result(R value) &noexceptrpc::packed_func< R, Args >inline
diff --git a/docs/classrpc_1_1packed__func.html b/docs/classrpc_1_1packed__func.html index e0798391..9acb249e 100644 --- a/docs/classrpc_1_1packed__func.html +++ b/docs/classrpc_1_1packed__func.html @@ -3,7 +3,7 @@ - + rpc.hpp: rpc::packed_func< R, Args > Class Template Reference @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -63,7 +63,7 @@
@@ -76,112 +76,70 @@
-

Class reprensenting a function call including its name, result, and parameters. +

Object representing a function call, including the function's name, arguments and result. More...

#include <rpc.hpp>

Inheritance diagram for rpc::packed_func< R, Args >:
-
Inheritance graph
- - - +
Inheritance graph
+ + +
[legend]
Collaboration diagram for rpc::packed_func< R, Args >:
-
Collaboration graph
- - - +
Collaboration graph
+ + +
[legend]
- - - + + +

Public Types

-using result_type = R
 The type of the packed_func's result.
 
+using result_t = R
 Type alias for the return type.
 
- - - - - - - - - - - - + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + +

Public Member Functions

 packed_func (std::string func_name, std::optional< result_type > result, std::array< std::any, sizeof...(Args)> args)
 Construct a new packed_func object. More...
 
packed_func (const packed_func &)=default
 
packed_func (packed_func &&)=default
 
-packed_funcoperator= (const packed_func &)=default
 
-packed_funcoperator= (packed_func &&)=default
 
operator bool () const noexcept
 packed_func (std::string func_name, std::optional< result_t > result, args_t args)
 Constructs a packed_func. More...
 
 operator bool () const noexcept
 Indicates if the packed_func holds a return value and no error occurred. More...
 
std::optional< R > get_result () const noexcept
 Get the result of the function call (if it exists) More...
 Returns the result. More...
 
void set_result (R value) noexcept
 Set the result. More...
 
-void clear_result () noexcept
 Sets the result back to null.
 
template<typename T >
void set_arg (size_t arg_index, T value)
 Set a particular argument. More...
 
void set_args (const std::tuple< std::remove_cv_t< std::remove_reference_t< Args >>... > &args)
 Set all arguments. More...
 
template<typename T >
std::remove_cv_t< std::remove_reference_t< T > > get_arg (size_t arg_index) const
 Get the arg object. More...
 
- Public Member Functions inherited from rpc::packed_func_base
 packed_func_base (std::string &&func_name)
 Construct a new packed_func_base object. More...
 
packed_func_base (const packed_func_base &)=default
 
packed_func_base (packed_func_base &&)=default
 
std::string get_func_name () const noexcept
 Get the function name. More...
 
std::string get_err_mesg () const noexcept
 Get the error message. More...
 
void set_err_mesg (const std::string &mesg) noexcept
 Set the error message. More...
 
void set_result (R value) &noexcept
 Sets the result to a value. More...
 
+void clear_result () &noexcept
 Clears the result stored (sets it back to std::nullopt)
 

Detailed Description

template<typename R, typename... Args>
class rpc::packed_func< R, Args >

-

Class reprensenting a function call including its name, result, and parameters.

+

Object representing a function call, including the function's name, arguments and result.

Template Parameters
- - + +
RThe return type
ArgsThe list of parameter type(s)
RReturn type of the function
ArgsVariadic type(s) of the function's arguments

Constructor & Destructor Documentation

- -

◆ packed_func()

+ +

◆ packed_func()

@@ -200,13 +158,13 @@

- std::optional< result_type >  + std::optional< result_tresult, - std::array< std::any, sizeof...(Args)>  + args_t  args  @@ -222,12 +180,12 @@

-

Construct a new packed_func object.

+

Constructs a packed_func.

Parameters
- - - + + +
func_nameName of the function (case-sensitive)
resultFunction call result (if no result yet, use std::nullopt)
argsList of parameters for the function call
func_nameFunction name
resultReturn value of the function (std::nullopt if not called yet or an error occurred)
argsTuple containing the argument(s)
@@ -235,51 +193,6 @@

Member Function Documentation

- -

◆ get_arg()

- -
-
-
-template<typename R , typename... Args>
-
-template<typename T >
- - - - - -
- - - - - - - - -
std::remove_cv_t<std::remove_reference_t<T> > rpc::packed_func< R, Args >::get_arg (size_t arg_index) const
-
-inline
-
- -

Get the arg object.

-
Template Parameters
- - -
TType to be acquired from the argument list (via std::any_cast)
-
-
-
Parameters
- - -
arg_indexThe index (0 start) of the argument to retrieve
-
-
-
Returns
std::remove_cv_t<std::remove_reference_t<T>> The argument's value
- -
-

◆ get_result()

@@ -305,68 +218,14 @@

-

Get the result of the function call (if it exists)

-
Returns
std::optional<R> If the function has not been called, or resulted in a err0r: std::nullopt, else: the result of the function call
- -

-
- -

◆ set_arg()

- -
-
-
-template<typename R , typename... Args>
-
-template<typename T >
- - - - - -
- - - - - - - - - - - - - - - - - - -
void rpc::packed_func< R, Args >::set_arg (size_t arg_index,
value 
)
-
-inline
-
- -

Set a particular argument.

-
Template Parameters
- - -
TType of the argument to be set
-
-
-
Parameters
- - - -
arg_indexThe index (0 start) of the argument to change
valueThe value to set the argument to
-
-
+

Returns the result.

+
Note
If the result is std::nullopt, an error most likely occurred and the reason can be retrieved from the get_err_mesg() function
+
Returns
std::optional<R> The result of the function call
- -

◆ set_args()

+ +

◆ operator bool()

- -

◆ set_result()

+ +

◆ set_result()

@@ -417,7 +273,7 @@

value) - + & @@ -427,10 +283,10 @@

-

Set the result.

+

Sets the result to a value.

Parameters
- +
valueValue of type R to set as the result
valueThe value to store as the result
@@ -443,9 +299,7 @@

diff --git a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4-members.html b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4-members.html index e629fc83..2ad89952 100644 --- a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4-members.html +++ b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4-members.html @@ -3,7 +3,7 @@ - + rpc.hpp: Member List @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@

- + @@ -63,7 +63,7 @@
@@ -74,31 +74,12 @@

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

- - - - - - - - - - - - - - - - - - - + +
get_arg(size_t arg_index) constrpc::packed_func< void, Args... >inline
get_err_mesg() const noexceptrpc::packed_func_baseinline
get_func_name() const noexceptrpc::packed_func_baseinline
operator bool() const noexcept (defined in rpc::packed_func< void, Args... >)rpc::packed_func< void, Args... >inlineexplicit
operator=(const packed_func &)=default (defined in rpc::packed_func< void, Args... >)rpc::packed_func< void, Args... >
operator=(packed_func &&)=default (defined in rpc::packed_func< void, Args... >)rpc::packed_func< void, Args... >
packed_func()=delete (defined in rpc::packed_func< void, Args... >)rpc::packed_func< void, Args... >
packed_func(std::string func_name, std::array< std::any, sizeof...(Args)> args)rpc::packed_func< void, Args... >inline
packed_func(const packed_func &)=default (defined in rpc::packed_func< void, Args... >)rpc::packed_func< void, Args... >
packed_func(packed_func &&)=default (defined in rpc::packed_func< void, Args... >)rpc::packed_func< void, Args... >
packed_func_base()=delete (defined in rpc::packed_func_base)rpc::packed_func_base
packed_func_base(std::string &&func_name)rpc::packed_func_baseinlineexplicit
packed_func_base(const packed_func_base &)=default (defined in rpc::packed_func_base)rpc::packed_func_base
packed_func_base(packed_func_base &&)=default (defined in rpc::packed_func_base)rpc::packed_func_base
result_type typedefrpc::packed_func< void, Args... >
set_arg(size_t arg_index, T value)rpc::packed_func< void, Args... >inline
set_args(const std::tuple< std::remove_cv_t< std::remove_reference_t< Args >>... > &args)rpc::packed_func< void, Args... >inline
set_err_mesg(const std::string &mesg) noexceptrpc::packed_func_baseinline
~packed_func_base()=default (defined in rpc::packed_func_base)rpc::packed_func_basevirtual
packed_func(std::string func_name, args_t args)rpc::packed_func< void, Args... >inline
result_t typedefrpc::packed_func< void, Args... >
diff --git a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4.html b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4.html index 853593b7..ce70e978 100644 --- a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4.html +++ b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4.html @@ -3,7 +3,7 @@ - + rpc.hpp: rpc::packed_func< void, Args... > Class Template Reference @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@
- + @@ -63,7 +63,7 @@
@@ -76,101 +76,56 @@
-

Class reprensenting a function call (with void result) including its name and parameters. +

Object representing a void returning function call, including the function's name and arguments. More...

#include <rpc.hpp>

Inheritance diagram for rpc::packed_func< void, Args... >:
-
Inheritance graph
- - - +
Inheritance graph
+ + +
[legend]
Collaboration diagram for rpc::packed_func< void, Args... >:
-
Collaboration graph
- - - +
Collaboration graph
+ + +
[legend]
- - - + + +

Public Types

-using result_type = void
 The type of the result (void)
 
+using result_t = void
 Type alias for the return type (void)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +

Public Member Functions

 packed_func (std::string func_name, std::array< std::any, sizeof...(Args)> args)
 Construct a new packed_func object. More...
 
packed_func (const packed_func &)=default
 
packed_func (packed_func &&)=default
 
-packed_funcoperator= (const packed_func &)=default
 
-packed_funcoperator= (packed_func &&)=default
 
operator bool () const noexcept
 
template<typename T >
void set_arg (size_t arg_index, T value)
 Set a particular argument. More...
 
void set_args (const std::tuple< std::remove_cv_t< std::remove_reference_t< Args >>... > &args)
 Set all arguments. More...
 
template<typename T >
std::remove_cv_t< std::remove_reference_t< T > > get_arg (size_t arg_index) const
 Get the arg object. More...
 
- Public Member Functions inherited from rpc::packed_func_base
 packed_func_base (std::string &&func_name)
 Construct a new packed_func_base object. More...
 
packed_func_base (const packed_func_base &)=default
 
packed_func_base (packed_func_base &&)=default
 
std::string get_func_name () const noexcept
 Get the function name. More...
 
std::string get_err_mesg () const noexcept
 Get the error message. More...
 
void set_err_mesg (const std::string &mesg) noexcept
 Set the error message. More...
 
 packed_func (std::string func_name, args_t args)
 Constructs a packed_func. More...
 

Detailed Description

template<typename... Args>
class rpc::packed_func< void, Args... >

-

Class reprensenting a function call (with void result) including its name and parameters.

+

Object representing a void returning function call, including the function's name and arguments.

Template Parameters
- +
ArgsThe list of parameter type(s)
ArgsVariadic type(s) of the function's arguments

Constructor & Destructor Documentation

- -

◆ packed_func()

+ +

◆ packed_func()

@@ -189,7 +144,7 @@

- std::array< std::any, sizeof...(Args)>  + args_t  args  @@ -205,148 +160,11 @@

-

Construct a new packed_func object.

+

Constructs a packed_func.

Parameters
- - -
func_nameName of the function (case-sensitive)
argsList of parameters for the function call
-
-
- -

-
-

Member Function Documentation

- -

◆ get_arg()

- -
-
-
-template<typename... Args>
-
-template<typename T >
- - - - - -
- - - - - - - - -
std::remove_cv_t<std::remove_reference_t<T> > rpc::packed_func< void, Args... >::get_arg (size_t arg_index) const
-
-inline
-
- -

Get the arg object.

-
Template Parameters
- - -
TType to be acquired from the argument list (via std::any_cast)
-
-
-
Parameters
- - -
arg_indexThe index (0 start) of the argument to retrieve
-
-
-
Returns
std::remove_cv_t<std::remove_reference_t<T>> The argument's value
- -
-
- -

◆ set_arg()

- -
-
-
-template<typename... Args>
-
-template<typename T >
- - - - - -
- - - - - - - - - - - - - - - - - - -
void rpc::packed_func< void, Args... >::set_arg (size_t arg_index,
value 
)
-
-inline
-
- -

Set a particular argument.

-
Template Parameters
- - -
TType of the argument to be set
-
-
-
Parameters
- - - -
arg_indexThe index (0 start) of the argument to change
valueThe value to set the argument to
-
-
- -
-
- -

◆ set_args()

- -
-
-
-template<typename... Args>
- - - - - -
- - - - - - - - -
void rpc::packed_func< void, Args... >::set_args (const std::tuple< std::remove_cv_t< std::remove_reference_t< Args >>... > & args)
-
-inline
-
- -

Set all arguments.

-
Parameters
- - + +
argsA tuple containing the list of arguments to set
func_nameFunction name
argsTuple containing the argument(s)
@@ -359,9 +177,7 @@

diff --git a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.map b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.map index 42772685..73b18310 100644 --- a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.map +++ b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.md5 b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.md5 index 4c7fd4c8..1487def5 100644 --- a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.md5 +++ b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.md5 @@ -1 +1 @@ -8b4971ef39a20810a81e7422c057e3ec \ No newline at end of file +5b02f101fe3dfc26c955803025c6a174 \ No newline at end of file diff --git a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.png b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__coll__graph.png index f2eb9686c88993ff06734d8e15f31378001fbc3c..8062f3e8440aa6d0cbd695a3d5bd6826d40b9a25 100644 GIT binary patch literal 1968 zcmb_di8C7r7kAWMw5}9c*D6(QhzemHt+Qc8QPFBEGhh4XF zKEZ|)eJ;#*VlC50Z=Hakuf44m&+(s9MaJgy@CfN?Uj8bvZ)kvaq^k6@3Ukn0K$qX9L)C`YZ+yTLSu1v+jk}*DW~D2Aa|l^t zx;ra3;X2XMjXQ81MOP*>v>F?GC+N*nVU7QKDgMN=FJ}cv;1Lwx$ACVYdQPKXmkUkK zEi5pjy6fza9$*MWph2*LJs(<3W>upZxpc!%=2RT!}XL^ zKVtjuH{@!8FXUz&gEl^({0mg)goMWtIqkj)8iht_rvmd{<-~`rx&*=n3 zubp4wW@fFCfkpV#ZBp(I{^er=k*sWQpdMXzDYv`b#BK%X;7)5cid6Yp%4@>HOS#ZM z9OqIA=Yu5mXn}5lEOh#c&Wq@@Q_7yvwtt( zlf*IwQQ3y2`}toN9D}K@oV-n~3|))Y`W#V*dA`B7_Qu<&8z>kwI-uAiuJN1>NvC}# zXvR-=F+OEQ5Eq{@IWgIY3R~S&H}o3dE|)clZn^WxUPrY@X5>AH0kiP`o(1Smbe^k? zPZjJj-VFcchu{VD205_9RWa~#@aO&CN*}uLH@}Cy8;)N$Dmnn0szq~;(mti zXJ)*vt-Ij5iCk)J}G`(qZal-u%-pDON6Y%%S|kvNqdvLiytcMB z1Ww@3v6PmUj@^qHneR3iQAHrU=p+t5K@RxTjP;~{smZ-pST!nI(wj6rRFur`#4k&mp}<3{1GZ^hge6=XePH2 zdbrfTH9M<(E3fs$nJmE1mi^2Hvc805Xv$K<`BDm}{6t*w^AJj5o> zzPRVw*<^{PlCig~?Ekfej1@!wW2ygN0ScFyT2WD<>4@=xU0Y(%u*1VQkK%>~1_pL_ zcZ(O1nJtCcM?h2-rPz1ICZ1&DgT z>yq^rE?xDXZrfrbFtAo`?aD4>FRVABnOR*9_Ev&DEH}x?Ud`2Zya)X{PV~Qf z!l41Id;w|(FuBV=ygqPL4yOCQsM8?9gS0cYjNrwxi#b2K7L8EjHS{(dWqAhZ9+C;c z#RY-@O~NGZ9eBuvm5-!Z=xvCGfx3V-rnxd7RmQr|{J$g?8UJ-^a!veXICwi1hBXXY z!v6KGMm7zTShrslQTQ3bP^W0;Lmb?c^*VosIN0#HRE~o++*iBN6z*sNhr_|SwFGR` zeKXC7oXVEU35H&|LJPvn$;mBCdCgU4V2NIk5~cr4Xlq?J8?`3u9CV`^QtozGLO;>` zWk_tKyr$J-wwc}inIqsSmZ@4bJ-n7dZs%8Iq3c7p1Ju$Dmlk-DiNh{(+bg8`p2%SO z#ng{GsQ8PuMl9>1c%-Jci{(2bJ`8(SS3+N^or`gWh3}a8uu_@gS-_Bt0q#}LY+=Z! zVDSziFPdVw0OV8Ec|06~mgZm}(m1KFaiQxtZ-JS*FF3GqkktuJX`rN|$~ zDtmnQl&_|sp`k9{oqTu6fP2IwYBncR=w?+^X5a=kXs`XZG{} literal 1835 zcmcJQ`8(SQ9>*zdX-84*NTqQf(^yAK(X@4Igi0kOiq+DoF<+6Ii93;`t$Vbkb**)^ zCa%PN4MNn~syhvXq7f9cNP?CUY0PH(%Nw0 zBcp_Hbw*2BB~7Zr5oyhCT!ct*SsS?2eD#q+L;EU7S$aCY#HEfjDY!hgk{J-S&E zVM9lsw>LKML;g+O$|ma&Y0^<6=V>!_-0gbvm3HJ#`#omd`iD>XQ{~WUn=%2jzk$BpyRvtB)m@XZ zZ0p;%$PT`3RAMv~=;vz*SmTP;&Myi4lT;iT?+VT`(yj21YR)m1Zy5waXY*ONDj+%c zXa3=ZGVOaavDc1frey)`12eThS={kz{Pr=_{&V|awAHUr8W0T6sg8U#H4!kk7n~EB z_w7<-be+aYZp@3p^(Z5_)vh2xKw0((9O9>sTL7KT`n;&du@?l@+Oc~xwvB_B4^dlb zg<;Gkm|8i$QuBsJ&U?<8Ze21e$b{CR{+>RR9u_{6i)^b}dfJNm=Fu>yYl8qF&K?=LlFU_e>{-|W8BbUen_p?yIxvJh5uA}Q!5_IBvP z{QPYg^*}GQCHCMh{aNDQmzHSSx>qbU)zq}okE^pzhp;KjU1pg0u<-DT?@;^d*X?-{ zvE7(pHlQP3WI^2DKFZ@(Dg8OiubFkArmEUS+<7wBd1?Dy!M?q#Nt|TgjJUOEqN>{B zCyNi`6NMB!GRBpvx3F?DQiPOF%NQC6rr zY<8PfCXvW#c%b2bt9Rj=y0Mg`Dj3|21{ELl$C-oB6-{14VB5ju%&+wmpQk9td~a@} z>Ax%F@|u}qX3DLJO|CGLGT~n$zGJl=6j5 z+R~Tims?wkQOxc)f#%t)mCa2p;=$)%PLeQo3V9L3ZWJ>X9YAPxAi(a3Eaof(reQM(mf~NU=qu`ht><{YM!Rlrd z_^y!bG*w4kU>dhPASnOam_PjazvFXSqCkLm_}NZABcV%|WdF=PM3u_Y$Q?Z=+cQ~AJ)TLU)gR6ryv04&60;t+9~-09I$r@*G;QLd>D^#-i2rs2P-End_r7}A0sVml{x+T(L_${CjE*-I>W;?*x*J|^`pKi45CrqXA87gI3mP2m6FQQ zab3ct{uLHEbH^Ae_LWR_AwTs@=X+zLpCy#TP#nM-uhmE{Z-JEb53~-6R~Y7ar=3{u zse;y$DXRa1a-xbZYrZGpXynJ05y!_&VhDlyx)>iRnCcM#NRTjIwX}|M@MOwu5WY@M2hh7+81Dw;Rtlv zP1@xv - - + + diff --git a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.md5 b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.md5 index 4c7fd4c8..1487def5 100644 --- a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.md5 +++ b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.md5 @@ -1 +1 @@ -8b4971ef39a20810a81e7422c057e3ec \ No newline at end of file +5b02f101fe3dfc26c955803025c6a174 \ No newline at end of file diff --git a/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.png b/docs/classrpc_1_1packed__func_3_01void_00_01_args_8_8_8_01_4__inherit__graph.png index f2eb9686c88993ff06734d8e15f31378001fbc3c..8062f3e8440aa6d0cbd695a3d5bd6826d40b9a25 100644 GIT binary patch literal 1968 zcmb_di8C7r7kAWMw5}9c*D6(QhzemHt+Qc8QPFBEGhh4XF zKEZ|)eJ;#*VlC50Z=Hakuf44m&+(s9MaJgy@CfN?Uj8bvZ)kvaq^k6@3Ukn0K$qX9L)C`YZ+yTLSu1v+jk}*DW~D2Aa|l^t zx;ra3;X2XMjXQ81MOP*>v>F?GC+N*nVU7QKDgMN=FJ}cv;1Lwx$ACVYdQPKXmkUkK zEi5pjy6fza9$*MWph2*LJs(<3W>upZxpc!%=2RT!}XL^ zKVtjuH{@!8FXUz&gEl^({0mg)goMWtIqkj)8iht_rvmd{<-~`rx&*=n3 zubp4wW@fFCfkpV#ZBp(I{^er=k*sWQpdMXzDYv`b#BK%X;7)5cid6Yp%4@>HOS#ZM z9OqIA=Yu5mXn}5lEOh#c&Wq@@Q_7yvwtt( zlf*IwQQ3y2`}toN9D}K@oV-n~3|))Y`W#V*dA`B7_Qu<&8z>kwI-uAiuJN1>NvC}# zXvR-=F+OEQ5Eq{@IWgIY3R~S&H}o3dE|)clZn^WxUPrY@X5>AH0kiP`o(1Smbe^k? zPZjJj-VFcchu{VD205_9RWa~#@aO&CN*}uLH@}Cy8;)N$Dmnn0szq~;(mti zXJ)*vt-Ij5iCk)J}G`(qZal-u%-pDON6Y%%S|kvNqdvLiytcMB z1Ww@3v6PmUj@^qHneR3iQAHrU=p+t5K@RxTjP;~{smZ-pST!nI(wj6rRFur`#4k&mp}<3{1GZ^hge6=XePH2 zdbrfTH9M<(E3fs$nJmE1mi^2Hvc805Xv$K<`BDm}{6t*w^AJj5o> zzPRVw*<^{PlCig~?Ekfej1@!wW2ygN0ScFyT2WD<>4@=xU0Y(%u*1VQkK%>~1_pL_ zcZ(O1nJtCcM?h2-rPz1ICZ1&DgT z>yq^rE?xDXZrfrbFtAo`?aD4>FRVABnOR*9_Ev&DEH}x?Ud`2Zya)X{PV~Qf z!l41Id;w|(FuBV=ygqPL4yOCQsM8?9gS0cYjNrwxi#b2K7L8EjHS{(dWqAhZ9+C;c z#RY-@O~NGZ9eBuvm5-!Z=xvCGfx3V-rnxd7RmQr|{J$g?8UJ-^a!veXICwi1hBXXY z!v6KGMm7zTShrslQTQ3bP^W0;Lmb?c^*VosIN0#HRE~o++*iBN6z*sNhr_|SwFGR` zeKXC7oXVEU35H&|LJPvn$;mBCdCgU4V2NIk5~cr4Xlq?J8?`3u9CV`^QtozGLO;>` zWk_tKyr$J-wwc}inIqsSmZ@4bJ-n7dZs%8Iq3c7p1Ju$Dmlk-DiNh{(+bg8`p2%SO z#ng{GsQ8PuMl9>1c%-Jci{(2bJ`8(SS3+N^or`gWh3}a8uu_@gS-_Bt0q#}LY+=Z! zVDSziFPdVw0OV8Ec|06~mgZm}(m1KFaiQxtZ-JS*FF3GqkktuJX`rN|$~ zDtmnQl&_|sp`k9{oqTu6fP2IwYBncR=w?+^X5a=kXs`XZG{} literal 1835 zcmcJQ`8(SQ9>*zdX-84*NTqQf(^yAK(X@4Igi0kOiq+DoF<+6Ii93;`t$Vbkb**)^ zCa%PN4MNn~syhvXq7f9cNP?CUY0PH(%Nw0 zBcp_Hbw*2BB~7Zr5oyhCT!ct*SsS?2eD#q+L;EU7S$aCY#HEfjDY!hgk{J-S&E zVM9lsw>LKML;g+O$|ma&Y0^<6=V>!_-0gbvm3HJ#`#omd`iD>XQ{~WUn=%2jzk$BpyRvtB)m@XZ zZ0p;%$PT`3RAMv~=;vz*SmTP;&Myi4lT;iT?+VT`(yj21YR)m1Zy5waXY*ONDj+%c zXa3=ZGVOaavDc1frey)`12eThS={kz{Pr=_{&V|awAHUr8W0T6sg8U#H4!kk7n~EB z_w7<-be+aYZp@3p^(Z5_)vh2xKw0((9O9>sTL7KT`n;&du@?l@+Oc~xwvB_B4^dlb zg<;Gkm|8i$QuBsJ&U?<8Ze21e$b{CR{+>RR9u_{6i)^b}dfJNm=Fu>yYl8qF&K?=LlFU_e>{-|W8BbUen_p?yIxvJh5uA}Q!5_IBvP z{QPYg^*}GQCHCMh{aNDQmzHSSx>qbU)zq}okE^pzhp;KjU1pg0u<-DT?@;^d*X?-{ zvE7(pHlQP3WI^2DKFZ@(Dg8OiubFkArmEUS+<7wBd1?Dy!M?q#Nt|TgjJUOEqN>{B zCyNi`6NMB!GRBpvx3F?DQiPOF%NQC6rr zY<8PfCXvW#c%b2bt9Rj=y0Mg`Dj3|21{ELl$C-oB6-{14VB5ju%&+wmpQk9td~a@} z>Ax%F@|u}qX3DLJO|CGLGT~n$zGJl=6j5 z+R~Tims?wkQOxc)f#%t)mCa2p;=$)%PLeQo3V9L3ZWJ>X9YAPxAi(a3Eaof(reQM(mf~NU=qu`ht><{YM!Rlrd z_^y!bG*w4kU>dhPASnOam_PjazvFXSqCkLm_}NZABcV%|WdF=PM3u_Y$Q?Z=+cQ~AJ)TLU)gR6ryv04&60;t+9~-09I$r@*G;QLd>D^#-i2rs2P-End_r7}A0sVml{x+T(L_${CjE*-I>W;?*x*J|^`pKi45CrqXA87gI3mP2m6FQQ zab3ct{uLHEbH^Ae_LWR_AwTs@=X+zLpCy#TP#nM-uhmE{Z-JEb53~-6R~Y7ar=3{u zse;y$DXRa1a-xbZYrZGpXynJ05y!_&VhDlyx)>iRnCcM#NRTjIwX}|M@MOwu5WY@M2hh7+81Dw;Rtlv zP1@xv - - - - - - -rpc.hpp: Member List - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
rpc::packed_func_base Member List
-
-
- -

This is the complete list of members for rpc::packed_func_base, including all inherited members.

- - - - - - - - - -
get_err_mesg() const noexceptrpc::packed_func_baseinline
get_func_name() const noexceptrpc::packed_func_baseinline
packed_func_base()=delete (defined in rpc::packed_func_base)rpc::packed_func_base
packed_func_base(std::string &&func_name)rpc::packed_func_baseinlineexplicit
packed_func_base(const packed_func_base &)=default (defined in rpc::packed_func_base)rpc::packed_func_base
packed_func_base(packed_func_base &&)=default (defined in rpc::packed_func_base)rpc::packed_func_base
set_err_mesg(const std::string &mesg) noexceptrpc::packed_func_baseinline
~packed_func_base()=default (defined in rpc::packed_func_base)rpc::packed_func_basevirtual
- - - - diff --git a/docs/classrpc_1_1packed__func__base.html b/docs/classrpc_1_1packed__func__base.html deleted file mode 100644 index 3ba0c6ea..00000000 --- a/docs/classrpc_1_1packed__func__base.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - -rpc.hpp: rpc::packed_func_base Class Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
rpc::packed_func_base Class Reference
-
-
- -

Polymorphic base class for packed_func. - More...

- -

#include <rpc.hpp>

-
-Inheritance diagram for rpc::packed_func_base:
-
-
Inheritance graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - - - -

-Public Member Functions

 packed_func_base (std::string &&func_name)
 Construct a new packed_func_base object. More...
 
packed_func_base (const packed_func_base &)=default
 
packed_func_base (packed_func_base &&)=default
 
std::string get_func_name () const noexcept
 Get the function name. More...
 
std::string get_err_mesg () const noexcept
 Get the error message. More...
 
void set_err_mesg (const std::string &mesg) noexcept
 Set the error message. More...
 
-

Detailed Description

-

Polymorphic base class for packed_func.

-

Constructor & Destructor Documentation

- -

◆ packed_func_base()

- -
-
- - - - - -
- - - - - - - - -
rpc::packed_func_base::packed_func_base (std::string && func_name)
-
-inlineexplicit
-
- -

Construct a new packed_func_base object.

-
Parameters
- - -
func_nameName of the function (case-sensitive)
-
-
- -
-
-

Member Function Documentation

- -

◆ get_err_mesg()

- -
-
- - - - - -
- - - - - - - -
std::string rpc::packed_func_base::get_err_mesg () const
-
-inlinenoexcept
-
- -

Get the error message.

-
Returns
std::string The error message (if any)
- -
-
- -

◆ get_func_name()

- -
-
- - - - - -
- - - - - - - -
std::string rpc::packed_func_base::get_func_name () const
-
-inlinenoexcept
-
- -

Get the function name.

-
Returns
std::string Name of the stored function (case-sensitive)
- -
-
- -

◆ set_err_mesg()

- -
-
- - - - - -
- - - - - - - - -
void rpc::packed_func_base::set_err_mesg (const std::string & mesg)
-
-inlinenoexcept
-
- -

Set the error message.

-
Parameters
- - -
mesgString to set as the error message
-
-
- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/classrpc_1_1packed__func__base__inherit__graph.map b/docs/classrpc_1_1packed__func__base__inherit__graph.map deleted file mode 100644 index 84818b55..00000000 --- a/docs/classrpc_1_1packed__func__base__inherit__graph.map +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/docs/classrpc_1_1packed__func__base__inherit__graph.md5 b/docs/classrpc_1_1packed__func__base__inherit__graph.md5 deleted file mode 100644 index 12a21e82..00000000 --- a/docs/classrpc_1_1packed__func__base__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -9bc94e302e0102443cbc5383250700a2 \ No newline at end of file diff --git a/docs/classrpc_1_1packed__func__base__inherit__graph.png b/docs/classrpc_1_1packed__func__base__inherit__graph.png deleted file mode 100644 index 1535b3b177ae38805a849ae7e9546d73fabdcf98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4330 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 diff --git a/docs/classrpc_1_1packed__func__coll__graph.map b/docs/classrpc_1_1packed__func__coll__graph.map index 1f5a296d..73904174 100644 --- a/docs/classrpc_1_1packed__func__coll__graph.map +++ b/docs/classrpc_1_1packed__func__coll__graph.map @@ -1,4 +1,4 @@ - - + + diff --git a/docs/classrpc_1_1packed__func__coll__graph.md5 b/docs/classrpc_1_1packed__func__coll__graph.md5 index 7496fb72..ff789dbb 100644 --- a/docs/classrpc_1_1packed__func__coll__graph.md5 +++ b/docs/classrpc_1_1packed__func__coll__graph.md5 @@ -1 +1 @@ -7052055974a0e65b6c1e3581f545b7bb \ No newline at end of file +fa7d0564615dd9c5cfd670a6f21879f5 \ No newline at end of file diff --git a/docs/classrpc_1_1packed__func__coll__graph.png b/docs/classrpc_1_1packed__func__coll__graph.png index 53736b0182e1d8b72f0eeb203c9fc4f9046a23e5..8f850c6830f8a66f3b3769263b9d73d92b93e00f 100644 GIT binary patch literal 1923 zcmb_d`BxH%7S^&{FtgIs#C;to_sV6|G>Z_i+?N6a(Zb!`2NllNS zAe!VhgMv$x>oAy=Xqn02h8h~?@XmSfo&JD#?z#7#@7(*t_rrJZmvhY>azyTwoP>nL z5$F{cPjRmjCtl`&xatf+=bN8l5juBtG#n%$%{x-c#~V@#fVyhW%950{EnIRyN(SY|a#!vg^zr;>?oFYZ&q;^c$|v!;a~d%i~RgZvr}Rkk7U^j+FcK5e@Mk-$}YBb^@F! z0C#>HPZ2KHv=P7uvC~hFhwmV2W*eP-w&MDR$L}ilyhH!Y%iKZ#$ameAw#bMJd-&3 ze!!(BN{t~0qBp{uSchBfoFhEvTP}7Dhq@e-j`UBxh}W6`Bv5r)qls#^2ro9E87|9 zCm(O-_9;hhxA+oh_9L9@^zg{pl7dE?aZo~$5N@1~4C(J6=Ag@G482yp+p~;KUnSPT zi_wFq&r0{WQ@20o5Ml)#zMDWb7TNo^%>#0Z@ay&zUQ2F>>E ztJlqQI6Djm#?OQ!`GWXZYk&RAiI>J+ppw8A6?akF;RwX_7M0>+gZj03bZf`<@&bgb z3zX32B_zxw3fFKe-ZQI5HSOp3C(g-h^JpF0O&?Txnhta2l)S}|MuW@j!_LsTYs1Bk zj!D*(zl+Ycr(}@kfIz|+3`U_izU$qi0oy68mX) zE4<1&SZydWjv&6>wEzBr6I05DjXxaq|7CDvw{I~$J)OmZ`w{(bVlX@raFO(o&D-K| zIHYQbQeIx(3UIV4YUgE6PA^>s~xmppk_vwtWz#%P5K$+{u~9Eb?$ zD>CBr^)mxL)$8@SDq0w{{F>yS^1+9J|Lu`$?!P#3?h!%It@Kood_Fs_y@urUWK=)! zrrRLP;&LtU4APQb5p)We=cE0zk|mxo)J4o1j^;nMO|KLaG+0ZIASiW{9c|bwzsuIvk?k+^< Hn`!?5Ah@*J literal 1819 zcmchY`8OMg7RQa&QXR`sTMa?2EuttAL#dP+#8#y!)pQ|bG*lF&grv47t@O|#)>5%0 zni8?qlF@c75k!y_HC>31s8CyZ&z$#udG8N+=brEVob&zl-tWEH-cVOrnUgYNVq&sx zmmt1}tUc62Y01N$lRQp3gyao(SBTg@|E`MeTKu8Gbb~luzE4=49rfbgR+CyY^b|+? zCG)};FL43p$e%xXM~>@NU$gCPwV^df(W<2$*SqZBQGCx-Q89|H|hOvFFj;T7^^#JaQz zy(<03qIC$pSNc-k?(Bd}fk3~Wc^e=3yb9ksNJB$|^OpQ30T|jJ;8-Ak%d7r^{ z!iAW*(%3GHcUy$sqJp~|I%cUe!sw+i0f_I`q|R2{a^n67_bZ%2DkAI{uLoI`>)Qi$ z12{_ftbGV5CV7A5^{SQtLJxb2+AsW5;LN1n3M^EH2jVDXFy}Hd`nk7tR4z29$A-dO!yZf@RqBv{(88FN?sZ+r&n)KBr< z*iVu&(k}weA9yARq0h|p{lCXrpI{u03Id6Xi`zXtSix=Ud6AtBBy#tkNM@Y(EW)3L z!C?J+aoZ1|=LEBRWpZ**USCEG?_i(oQG}N`w3X+2dMfC2OI_XiNtA2=UQ@bOeB^e? z`VK$g&RiF$rY+{7O^A=RHbI63?_>$X$~Bd9+lVvK8YCkP1;(@dd}0FesU6`NHM7=fI6QB<^AY-Vz`~20yIPw`Hs>SS0!_SMwZ{qeD16sd(g;uUU9D3BP?va};hCgyu2ochdl@#V#J`PU&*=u9ojX(`=f)OEf5HVJ_p(!Vxa3wnWe1+y)PiiF5GmS z#5?Kx*t<<-ho?XiH}eS*$7{PqRl=$xuz6vqL9$(Rr_&Ics?K_0LjI`7K@n2o$@HdL zl`(K*r#xCjof;Kz1sQ5q@841RZ5}89nraG*iaN8=9yy&7&&FfDIW1T}gFp*hZb#}f z)a7#6Or@Xc;MqJ1po()=$JYezh{nFLLOS>q$h67)E>}CnG@wV(?wPqOZSh>DeFh+o zN~KLh*i+G?daqKa-Ef15k`G%!H6%Z|NySxAH&%74ub?z7Gcuq>mW;^ZprFhyt=hke zv|43n_Mco6Or{plQy3JJGZ8fyjKngkvxP!YOmyx*>6rp^Z~CyZ*}J>ok)z}i_=6FpB>Dt_s0$f`0qq`PqhG?~Z zb@bAp&Z56#I4Lxik_^w>Fc@ZQLV(mxLrY444ko1!%;4r;#gtiA69XJE?H|M!yQY|N z2XA8{^2c*ADRyJmq>`YSB1v)-*uO>fL~LfP8a94iK7U0)V`EXzg6nD?b753HBd4JZ zUHA`+O#CN9%c@NUaEf{3+cfpo&?OKo3w%lnBz?z2y4pdF{l8mVH?zCFZQB}T3U3YS z;HUp&4gwjsma*oW$_WJKw{NJGDzWvQUq%=V-%5pPpqU#+saNa)QGD$`2g+Z&O6Z~b dgZA2TSaEDK*66RN?T6n^% - - + + diff --git a/docs/classrpc_1_1packed__func__inherit__graph.md5 b/docs/classrpc_1_1packed__func__inherit__graph.md5 index 7496fb72..ff789dbb 100644 --- a/docs/classrpc_1_1packed__func__inherit__graph.md5 +++ b/docs/classrpc_1_1packed__func__inherit__graph.md5 @@ -1 +1 @@ -7052055974a0e65b6c1e3581f545b7bb \ No newline at end of file +fa7d0564615dd9c5cfd670a6f21879f5 \ No newline at end of file diff --git a/docs/classrpc_1_1packed__func__inherit__graph.png b/docs/classrpc_1_1packed__func__inherit__graph.png index 53736b0182e1d8b72f0eeb203c9fc4f9046a23e5..8f850c6830f8a66f3b3769263b9d73d92b93e00f 100644 GIT binary patch literal 1923 zcmb_d`BxH%7S^&{FtgIs#C;to_sV6|G>Z_i+?N6a(Zb!`2NllNS zAe!VhgMv$x>oAy=Xqn02h8h~?@XmSfo&JD#?z#7#@7(*t_rrJZmvhY>azyTwoP>nL z5$F{cPjRmjCtl`&xatf+=bN8l5juBtG#n%$%{x-c#~V@#fVyhW%950{EnIRyN(SY|a#!vg^zr;>?oFYZ&q;^c$|v!;a~d%i~RgZvr}Rkk7U^j+FcK5e@Mk-$}YBb^@F! z0C#>HPZ2KHv=P7uvC~hFhwmV2W*eP-w&MDR$L}ilyhH!Y%iKZ#$ameAw#bMJd-&3 ze!!(BN{t~0qBp{uSchBfoFhEvTP}7Dhq@e-j`UBxh}W6`Bv5r)qls#^2ro9E87|9 zCm(O-_9;hhxA+oh_9L9@^zg{pl7dE?aZo~$5N@1~4C(J6=Ag@G482yp+p~;KUnSPT zi_wFq&r0{WQ@20o5Ml)#zMDWb7TNo^%>#0Z@ay&zUQ2F>>E ztJlqQI6Djm#?OQ!`GWXZYk&RAiI>J+ppw8A6?akF;RwX_7M0>+gZj03bZf`<@&bgb z3zX32B_zxw3fFKe-ZQI5HSOp3C(g-h^JpF0O&?Txnhta2l)S}|MuW@j!_LsTYs1Bk zj!D*(zl+Ycr(}@kfIz|+3`U_izU$qi0oy68mX) zE4<1&SZydWjv&6>wEzBr6I05DjXxaq|7CDvw{I~$J)OmZ`w{(bVlX@raFO(o&D-K| zIHYQbQeIx(3UIV4YUgE6PA^>s~xmppk_vwtWz#%P5K$+{u~9Eb?$ zD>CBr^)mxL)$8@SDq0w{{F>yS^1+9J|Lu`$?!P#3?h!%It@Kood_Fs_y@urUWK=)! zrrRLP;&LtU4APQb5p)We=cE0zk|mxo)J4o1j^;nMO|KLaG+0ZIASiW{9c|bwzsuIvk?k+^< Hn`!?5Ah@*J literal 1819 zcmchY`8OMg7RQa&QXR`sTMa?2EuttAL#dP+#8#y!)pQ|bG*lF&grv47t@O|#)>5%0 zni8?qlF@c75k!y_HC>31s8CyZ&z$#udG8N+=brEVob&zl-tWEH-cVOrnUgYNVq&sx zmmt1}tUc62Y01N$lRQp3gyao(SBTg@|E`MeTKu8Gbb~luzE4=49rfbgR+CyY^b|+? zCG)};FL43p$e%xXM~>@NU$gCPwV^df(W<2$*SqZBQGCx-Q89|H|hOvFFj;T7^^#JaQz zy(<03qIC$pSNc-k?(Bd}fk3~Wc^e=3yb9ksNJB$|^OpQ30T|jJ;8-Ak%d7r^{ z!iAW*(%3GHcUy$sqJp~|I%cUe!sw+i0f_I`q|R2{a^n67_bZ%2DkAI{uLoI`>)Qi$ z12{_ftbGV5CV7A5^{SQtLJxb2+AsW5;LN1n3M^EH2jVDXFy}Hd`nk7tR4z29$A-dO!yZf@RqBv{(88FN?sZ+r&n)KBr< z*iVu&(k}weA9yARq0h|p{lCXrpI{u03Id6Xi`zXtSix=Ud6AtBBy#tkNM@Y(EW)3L z!C?J+aoZ1|=LEBRWpZ**USCEG?_i(oQG}N`w3X+2dMfC2OI_XiNtA2=UQ@bOeB^e? z`VK$g&RiF$rY+{7O^A=RHbI63?_>$X$~Bd9+lVvK8YCkP1;(@dd}0FesU6`NHM7=fI6QB<^AY-Vz`~20yIPw`Hs>SS0!_SMwZ{qeD16sd(g;uUU9D3BP?va};hCgyu2ochdl@#V#J`PU&*=u9ojX(`=f)OEf5HVJ_p(!Vxa3wnWe1+y)PiiF5GmS z#5?Kx*t<<-ho?XiH}eS*$7{PqRl=$xuz6vqL9$(Rr_&Ics?K_0LjI`7K@n2o$@HdL zl`(K*r#xCjof;Kz1sQ5q@841RZ5}89nraG*iaN8=9yy&7&&FfDIW1T}gFp*hZb#}f z)a7#6Or@Xc;MqJ1po()=$JYezh{nFLLOS>q$h67)E>}CnG@wV(?wPqOZSh>DeFh+o zN~KLh*i+G?daqKa-Ef15k`G%!H6%Z|NySxAH&%74ub?z7Gcuq>mW;^ZprFhyt=hke zv|43n_Mco6Or{plQy3JJGZ8fyjKngkvxP!YOmyx*>6rp^Z~CyZ*}J>ok)z}i_=6FpB>Dt_s0$f`0qq`PqhG?~Z zb@bAp&Z56#I4Lxik_^w>Fc@ZQLV(mxLrY444ko1!%;4r;#gtiA69XJE?H|M!yQY|N z2XA8{^2c*ADRyJmq>`YSB1v)-*uO>fL~LfP8a94iK7U0)V`EXzg6nD?b753HBd4JZ zUHA`+O#CN9%c@NUaEf{3+cfpo&?OKo3w%lnBz?z2y4pdF{l8mVH?zCFZQB}T3U3YS z;HUp&4gwjsma*oW$_WJKw{NJGDzWvQUq%=V-%5pPpqU#+saNa)QGD$`2g+Z&O6Z~b dgZA2TSaEDK*66RN?T6n^% - - - - - - -rpc.hpp: Member List - - - - - - - - - - -
-
-
rpc::serial_adapter< Serial > Member List
-
-
- -

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

- - - - - - - - - - - -
extract_func_name(const Serial &obj)rpc::serial_adapter< Serial >static
from_packed_func(const packed_func< R, Args... > &pack)rpc::serial_adapter< Serial >static
from_string(const std::string &str)rpc::serial_adapter< Serial >static
get_num_args(const Serial &obj) (defined in rpc::serial_adapter< Serial >)rpc::serial_adapter< Serial >static
get_value(const Serial &obj)rpc::serial_adapter< Serial >static
make_sub_object(const Serial &obj, unsigned index)rpc::serial_adapter< Serial >static
make_sub_object(const Serial &obj, const std::string &name)rpc::serial_adapter< Serial >static
populate_array(const Serial &obj, Container &container)rpc::serial_adapter< Serial >static
to_packed_func(const Serial &serial_obj)rpc::serial_adapter< Serial >static
to_string(const Serial &serial_obj)rpc::serial_adapter< Serial >static
- - - - diff --git a/docs/classrpc_1_1serial__adapter.html b/docs/classrpc_1_1serial__adapter.html deleted file mode 100644 index f39e1c95..00000000 --- a/docs/classrpc_1_1serial__adapter.html +++ /dev/null @@ -1,543 +0,0 @@ - - - - - - - -rpc.hpp: rpc::serial_adapter< Serial > Class Template Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
rpc::serial_adapter< Serial > Class Template Reference
-
-
- -

Template class that provides an interface for going to and from a packed_func and a serial object. - More...

- -

#include <rpc.hpp>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Member Functions

template<typename R , typename... Args>
static packed_func< R, Args... > to_packed_func (const Serial &serial_obj)
 Converts a serial object into a specific packed_func. More...
 
template<typename R , typename... Args>
static Serial from_packed_func (const packed_func< R, Args... > &pack)
 Converts a packed_func into a serial object. More...
 
static std::string to_string (const Serial &serial_obj)
 Converts a serial object to a readable std::string. More...
 
static Serial from_string (const std::string &str)
 Parses a std::string into a serial object. More...
 
static std::string extract_func_name (const Serial &obj)
 Retrieve the function name from a serial object. More...
 
static Serial make_sub_object (const Serial &obj, unsigned index)
 Creates a serial object from inside another serial object. More...
 
static Serial make_sub_object (const Serial &obj, const std::string &name)
 Creates a serial object from inside another serial object. More...
 
template<typename T >
static T get_value (const Serial &obj)
 Extract a value from a serial object. More...
 
template<typename Container >
static void populate_array (const Serial &obj, Container &container)
 Populate a container with the contents of a serial object. More...
 
-static size_t get_num_args (const Serial &obj)
 
-

Detailed Description

-

template<typename Serial>
-class rpc::serial_adapter< Serial >

- -

Template class that provides an interface for going to and from a packed_func and a serial object.

-
Note
Member functions of serial_adapter are to be implemented by an adapter
-
Template Parameters
- - -
SerialThe serial object type
-
-
-

Member Function Documentation

- -

◆ extract_func_name()

- -
-
-
-template<typename Serial >
- - - - - -
- - - - - - - - -
static std::string rpc::serial_adapter< Serial >::extract_func_name (const Serial & obj)
-
-static
-
- -

Retrieve the function name from a serial object.

-
Parameters
- - -
objThe serial object to retrieve the function name from
-
-
-
Returns
std::string The function name (case-sensitive)
- -
-
- -

◆ from_packed_func()

- -
-
-
-template<typename Serial >
-
-template<typename R , typename... Args>
- - - - - -
- - - - - - - - -
static Serial rpc::serial_adapter< Serial >::from_packed_func (const packed_func< R, Args... > & pack)
-
-static
-
- -

Converts a packed_func into a serial object.

-
Template Parameters
- - - -
RThe result type for the packed_func
ArgsThe list of parameter type(s) for the packed_func
-
-
-
Parameters
- - -
packThe packaged function call to be converted
-
-
-
Returns
Serial The serial object
- -
-
- -

◆ from_string()

- -
-
-
-template<typename Serial >
- - - - - -
- - - - - - - - -
static Serial rpc::serial_adapter< Serial >::from_string (const std::string & str)
-
-static
-
- -

Parses a std::string into a serial object.

-
Parameters
- - -
strThe string to be parsed
-
-
-
Returns
Serial The serial object represented by the string
- -
-
- -

◆ get_value()

- -
-
-
-template<typename Serial >
-
-template<typename T >
- - - - - -
- - - - - - - - -
static T rpc::serial_adapter< Serial >::get_value (const Serial & obj)
-
-static
-
- -

Extract a value from a serial object.

-
Template Parameters
- - -
TThe type of the object to extract
-
-
-
Parameters
- - -
objThe serial object to extract from
-
-
-
Returns
T The extracted type
- -
-
- -

◆ make_sub_object() [1/2]

- -
-
-
-template<typename Serial >
- - - - - -
- - - - - - - - - - - - - - - - - - -
static Serial rpc::serial_adapter< Serial >::make_sub_object (const Serial & obj,
const std::string & name 
)
-
-static
-
- -

Creates a serial object from inside another serial object.

-
Parameters
- - - -
objThe original object to extract the sub-object from
nameThe name of the member of the original object to copy out
-
-
-
Returns
Serial The serial object representing an inner object of the original
- -
-
- -

◆ make_sub_object() [2/2]

- -
-
-
-template<typename Serial >
- - - - - -
- - - - - - - - - - - - - - - - - - -
static Serial rpc::serial_adapter< Serial >::make_sub_object (const Serial & obj,
unsigned index 
)
-
-static
-
- -

Creates a serial object from inside another serial object.

-
Parameters
- - - -
objThe original object to extract the sub-object from
indexThe index of the sub-object, relative to the original object
-
-
-
Returns
Serial The serial object representing an inner object of the original
- -
-
- -

◆ populate_array()

- -
-
-
-template<typename Serial >
-
-template<typename Container >
- - - - - -
- - - - - - - - - - - - - - - - - - -
static void rpc::serial_adapter< Serial >::populate_array (const Serial & obj,
Container & container 
)
-
-static
-
- -

Populate a container with the contents of a serial object.

-
Template Parameters
- - -
ContainerType of container used, must satisfy is_container
-
-
-
Parameters
- - - -
objThe serial object to populate from
containerReference to the container to populate
-
-
- -
-
- -

◆ to_packed_func()

- -
-
-
-template<typename Serial >
-
-template<typename R , typename... Args>
- - - - - -
- - - - - - - - -
static packed_func<R, Args...> rpc::serial_adapter< Serial >::to_packed_func (const Serial & serial_obj)
-
-static
-
- -

Converts a serial object into a specific packed_func.

-
Template Parameters
- - - -
RThe result type for the packed_func
ArgsThe list of paramter type(s) for the packed_func
-
-
-
Parameters
- - -
serial_objThe serial object to be converted
-
-
-
Returns
packed_func<R, Args...> The packaged function call
- -
-
- -

◆ to_string()

- -
-
-
-template<typename Serial >
- - - - - -
- - - - - - - - -
static std::string rpc::serial_adapter< Serial >::to_string (const Serial & serial_obj)
-
-static
-
- -

Converts a serial object to a readable std::string.

-
Parameters
- - -
serial_objThe serial object to be converted
-
-
-
Returns
std::string The string representation of the serial object
- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/docs/dir_0ca40f09774b0c9b36fedfbb476b8248.html b/docs/dir_0ca40f09774b0c9b36fedfbb476b8248.html index 3e0d1bea..b74585de 100644 --- a/docs/dir_0ca40f09774b0c9b36fedfbb476b8248.html +++ b/docs/dir_0ca40f09774b0c9b36fedfbb476b8248.html @@ -3,7 +3,7 @@ - + rpc.hpp: include/rpc_adapters Directory Reference @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@

- + @@ -74,8 +74,8 @@
Directory dependency graph for rpc_adapters:
-
include/rpc_adapters
- +
include/rpc_adapters
+ @@ -83,8 +83,11 @@ + + + - + @@ -93,9 +96,7 @@ diff --git a/docs/dir_0ca40f09774b0c9b36fedfbb476b8248_dep.png b/docs/dir_0ca40f09774b0c9b36fedfbb476b8248_dep.png index a2824f5d20462f7356f81b97a4ce1f313e46e0ce..9d97f2a927781aabb6f3dce690811276131f2c40 100644 GIT binary patch delta 816 zcmV-01JC@Z2!{xeHeS3*L_t(|obBDcPTNo%hVg$YuE1juldr%M47r3XQHOL#Vk{FE z!jz6k+3A!eH-PG)m2w4{P#JRpWpJ0e4XJHxAHT<6&u=ODIL8J*oMRzGCrOed28euU z`vfp-lTQN|lTQN!s+e1Cs$aU3^wF6f}yY-V?NceTem1s2D#Jw1K1D7ti+1|7BA z{cxVcDKIm$D7v)OYVCX?=$_l#Yv(z*2ZI!WL5jd2MPQH`d|+W1v^GZ*$L_nq2e#iI z+CGI*8+>4B*Wd#?-lo!z!!XF)zS8H5wzkvPvL5G+FEjtpV>thywQs^O_`7Z9eVp~U z&fIyg)t$eO2ET%xDtl2~Fa8+fDPwdiSewSQHKqv6qcN^(quV0OQm-~+Sib+?8!EO)lQ9AxlTZT_KD_f?(qHc-(`N zKLaO!1O_PrtHAf~QVjutc{a942@F!54lMm{&-yoOB}kvIx=Iv{E1EBFT;6$}ejZik zDRZt})cOC2AqXaRI3$^m^FGdc+{FB4$K}m)I3$(EHT5~RsnaW%nf><#Ec*pjzwfI+U=Sf$< zPy-f|PXh%ql=ojayuSYA`;cgnx4@>;bDPf>_WJtE*CCN%K3~{$dhYFb-U5rFD_gDB zz7B_u;2x2n7BZZF(7N4jEDVDt&IKK`TrQo)Pm(05{g*o8IJW2KXQvZDw_RLZ*laed uJ>DrW;62=flRpC_9?s0{vF($k4AhS!|OB zNEs|8t=NWug&>j*0WbIfY4jzwvWu_}5Q&o}o2-+Wac;jex9_KkdpT!D=j%Cxn55(T zzHflYQrRbfW+Ria0UVPr0tbJCR5#DytE($JJv}YzTu?##`}?-Ny`6b{uE5UE&uuc9 z*w)rgo@r1~H#Zlyyu4gqU}k2c(ViV0eabrxDyZ9imwOKG!5~FokRmWh5g4QzA6UQd zl{QBa$F94^2R5C~%07iwYkXiRSK|X)+@|Iq_xoPx_BDS#Zfgs^7WQg5YJ8IUn${3Rb2zZH;pT=1?0~wbpHs zNvT(xwyb8XV1G=fvu77QYPAWzFY9YJ*Mx#9^$8-LdK2A=)xIQEncwWcp@wf+*9|9MX9|9DAmV)cwrD_5KbF6KV5*VZ^ z9oYQ4J?zi0m0vChisCFyZ;x@7P-J5m$2+kLrBkH2Y zjf*=^v*#;Mn)7ChELhYRFzxecj+5qQK5ksz=hD8ns%p1IqFyS!f)yd|zNK!fK^@g9 zuq;885fS13!xjmXF#{TtAOaFH&VS)>Jbvr?kSLL}zy^a28xD8v@$sjtLn6d*xNC#K zhO^^23#`{$wd3Q@t`3Ka;2x8p0TwuN{h)PaWyQ|U&g}B?Yf5s%vKN%RUJ-*Ka_L VWXqpbgiZhe002ovPDHLkV1g;!pq2mt diff --git a/docs/dir_3e40ef3ba0a24b7354fd0aad93fc8f99.html b/docs/dir_3e40ef3ba0a24b7354fd0aad93fc8f99.html deleted file mode 100644 index 526bdd0c..00000000 --- a/docs/dir_3e40ef3ba0a24b7354fd0aad93fc8f99.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_benchmark Directory Reference - - - - - - - - - -
-
-

Files

file  rpc_boost_json.hpp [code]
 Implementation of adapting Boost.JSON (https://github.com/boostorg/json)
 
file  rpc_njson.hpp [code]
 Implementation of adapting nlohmann/json (https://github.com/nlohmann/json)
 Implementation of adapting nlohmann's JSON library (https://github.com/nlohmann/json)
 
file  rpc_rapidjson.hpp [code]
 Implementation of adapting rapidjson (https://github.com/Tencent/rapidjson)
- - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
rpc_benchmark Directory Reference
-
-
-
- - - - diff --git a/docs/dir_4fef79e7177ba769987a8da36c892c5f.html b/docs/dir_4fef79e7177ba769987a8da36c892c5f.html deleted file mode 100644 index 4a149ca7..00000000 --- a/docs/dir_4fef79e7177ba769987a8da36c892c5f.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: build Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
build Directory Reference
-
-
-
- - - - diff --git a/docs/dir_50b0903e9f5ba953a5520e285fb8dcb9.html b/docs/dir_50b0903e9f5ba953a5520e285fb8dcb9.html deleted file mode 100644 index 9015657a..00000000 --- a/docs/dir_50b0903e9f5ba953a5520e285fb8dcb9.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_server/x64/Debug Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Debug Directory Reference
-
-
-
- - - - diff --git a/docs/dir_648be88883574707485053cd5416500c.html b/docs/dir_648be88883574707485053cd5416500c.html deleted file mode 100644 index 66ce3bda..00000000 --- a/docs/dir_648be88883574707485053cd5416500c.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_test/x64/Debug Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Debug Directory Reference
-
-
-
- - - - diff --git a/docs/dir_6fb49f783371ee500ce181955d73367a.html b/docs/dir_6fb49f783371ee500ce181955d73367a.html deleted file mode 100644 index dea1012c..00000000 --- a/docs/dir_6fb49f783371ee500ce181955d73367a.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19 Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
vs19 Directory Reference
-
-
-
- - - - diff --git a/docs/dir_78438178dbd240bdb49047afa5b03de5.html b/docs/dir_78438178dbd240bdb49047afa5b03de5.html deleted file mode 100644 index f2e2e148..00000000 --- a/docs/dir_78438178dbd240bdb49047afa5b03de5.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_test/x64 Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
x64 Directory Reference
-
-
-
- - - - diff --git a/docs/dir_8448b20300a8755818d7e490faf991f6.html b/docs/dir_8448b20300a8755818d7e490faf991f6.html deleted file mode 100644 index 9299fed2..00000000 --- a/docs/dir_8448b20300a8755818d7e490faf991f6.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: build/include/rpc_adapters Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
rpc_adapters Directory Reference
-
-
-
- - - - diff --git a/docs/dir_84688365732d7f584ccc09ea20685c57.html b/docs/dir_84688365732d7f584ccc09ea20685c57.html deleted file mode 100644 index 9c7063b7..00000000 --- a/docs/dir_84688365732d7f584ccc09ea20685c57.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_test Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
rpc_test Directory Reference
-
-
-
- - - - diff --git a/docs/dir_86715e4555393611b6d104210c25ef02.html b/docs/dir_86715e4555393611b6d104210c25ef02.html deleted file mode 100644 index ab56d6e4..00000000 --- a/docs/dir_86715e4555393611b6d104210c25ef02.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_server/x64 Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
x64 Directory Reference
-
-
-
- - - - diff --git a/docs/dir_891b89b23345a8257b1812d0f9b3e0c0.html b/docs/dir_891b89b23345a8257b1812d0f9b3e0c0.html deleted file mode 100644 index dfefef93..00000000 --- a/docs/dir_891b89b23345a8257b1812d0f9b3e0c0.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_benchmark/x64/Debug Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Debug Directory Reference
-
-
-
- - - - diff --git a/docs/dir_89cabd9843c25e5f6966dfece8ff060b.html b/docs/dir_89cabd9843c25e5f6966dfece8ff060b.html deleted file mode 100644 index e40d75d0..00000000 --- a/docs/dir_89cabd9843c25e5f6966dfece8ff060b.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_server Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
rpc_server Directory Reference
-
-
-
- - - - diff --git a/docs/dir_8f2980731aba7ec7b9fcae5764f196e3.html b/docs/dir_8f2980731aba7ec7b9fcae5764f196e3.html deleted file mode 100644 index 3dd28c5e..00000000 --- a/docs/dir_8f2980731aba7ec7b9fcae5764f196e3.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: build/include Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
include Directory Reference
-
-
-
- - - - diff --git a/docs/dir_cfe66f95dd46c1e43204fa4e6f490088.html b/docs/dir_cfe66f95dd46c1e43204fa4e6f490088.html deleted file mode 100644 index ab976761..00000000 --- a/docs/dir_cfe66f95dd46c1e43204fa4e6f490088.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -rpc.hpp: vs19/rpc_benchmark/x64 Directory Reference - - - - - - - - - -
-
- - - - - - -
-
rpc.hpp -  0.2.1 -
-
Simple RPC Header-Only Library
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
x64 Directory Reference
-
-
-
- - - - diff --git a/docs/dir_d44c64559bbebec7f509842c48db8b23.html b/docs/dir_d44c64559bbebec7f509842c48db8b23.html index b496fd34..f1751865 100644 --- a/docs/dir_d44c64559bbebec7f509842c48db8b23.html +++ b/docs/dir_d44c64559bbebec7f509842c48db8b23.html @@ -3,7 +3,7 @@ - + rpc.hpp: include Directory Reference @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@
- + @@ -80,13 +80,14 @@ file  rpc.hpp [code]  Header-only library for serialized RPC usage.
  +file  rpc_dispatch_helper.hpp [code] + Helper macros for server dispatching of remote function calls.
diff --git a/docs/doxygen.css b/docs/doxygen.css index 5e35db3f..ffbff022 100644 --- a/docs/doxygen.css +++ b/docs/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.8.18 */ +/* The standard CSS for doxygen 1.9.1 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; @@ -66,7 +66,7 @@ p.startli, p.startdd { margin-top: 2px; } -th p.starttd, p.intertd, p.endtd { +th p.starttd, th p.intertd, th p.endtd { font-size: 100%; font-weight: 700; } @@ -103,30 +103,96 @@ caption { } span.legend { - font-size: 70%; - text-align: center; + font-size: 70%; + text-align: center; } h3.version { - font-size: 90%; - text-align: center; + font-size: 90%; + text-align: center; } -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; } -div.qindex, div.navpath { +div.qindex{ + text-align: center; width: 100%; line-height: 140%; + font-size: 130%; + color: #A0A0A0; } -div.navtab { - margin-right: 15px; +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; } +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + /* @group Link Styling */ a { @@ -143,17 +209,6 @@ a:hover { text-decoration: underline; } -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #FFFFFF; - border: 1px double #869DCA; -} - .contents a.qindexHL:visited { color: #FFFFFF; } @@ -1358,10 +1413,12 @@ dl.citelist dt { font-weight:bold; margin-right:10px; padding:5px; + text-align:right; + width:52px; } dl.citelist dd { - margin:2px 0; + margin:2px 0 2px 72px; padding:5px 0; } @@ -1424,6 +1481,12 @@ div.toc li.level4 { margin-left: 45px; } +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + .PageDocRTL-title div.toc li.level1 { margin-left: 0 !important; margin-right: 0; diff --git a/docs/doxygen.png b/docs/doxygen.png deleted file mode 100644 index 3ff17d807fd8aa003bed8bb2a69e8f0909592fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3779 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 diff --git a/docs/doxygen.svg b/docs/doxygen.svg new file mode 100644 index 00000000..d42dad52 --- /dev/null +++ b/docs/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/files.html b/docs/files.html index 9ae4491e..5af9c599 100644 --- a/docs/files.html +++ b/docs/files.html @@ -3,7 +3,7 @@ - + rpc.hpp: File List @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -71,18 +71,17 @@
[detail level 123]
- - - - + + + + +
  include
  rpc_adapters
 rpc_njson.hppImplementation of adapting nlohmann/json (https://github.com/nlohmann/json)
 rpc_rapidjson.hppImplementation of adapting rapidjson (https://github.com/Tencent/rapidjson)
 rpc.hppHeader-only library for serialized RPC usage
 rpc_dispatch_helper.hpp
 rpc_boost_json.hppImplementation of adapting Boost.JSON (https://github.com/boostorg/json)
 rpc_njson.hppImplementation of adapting nlohmann's JSON library (https://github.com/nlohmann/json)
 rpc_rapidjson.hppImplementation of adapting rapidjson (https://github.com/Tencent/rapidjson)
 rpc.hppHeader-only library for serialized RPC usage
 rpc_dispatch_helper.hppHelper macros for server dispatching of remote function calls
diff --git a/docs/functions.html b/docs/functions.html index c63ba0ad..2c1d70da 100644 --- a/docs/functions.html +++ b/docs/functions.html @@ -3,7 +3,7 @@ - + rpc.hpp: Class Members @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -63,151 +63,53 @@
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- b -

- - -

- c -

diff --git a/docs/functions_func.html b/docs/functions_func.html index a42e6dd3..abe00ec4 100644 --- a/docs/functions_func.html +++ b/docs/functions_func.html @@ -3,7 +3,7 @@ - + rpc.hpp: Class Members - Functions @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -63,143 +63,49 @@
-  - -

- b -

- - -

- c -

diff --git a/docs/functions_type.html b/docs/functions_type.html index bd09a4bb..fc70eeef 100644 --- a/docs/functions_type.html +++ b/docs/functions_type.html @@ -3,7 +3,7 @@ - + rpc.hpp: Class Members - Typedefs @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -64,17 +64,15 @@ diff --git a/docs/namespacemembers_vars.html b/docs/globals.html similarity index 53% rename from docs/namespacemembers_vars.html rename to docs/globals.html index 25880d6d..92b0681b 100644 --- a/docs/namespacemembers_vars.html +++ b/docs/globals.html @@ -3,9 +3,9 @@ - + -rpc.hpp: Namespace Members +rpc.hpp: File Members @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -63,20 +63,51 @@
diff --git a/docs/namespacemembers_type.html b/docs/globals_defs.html similarity index 54% rename from docs/namespacemembers_type.html rename to docs/globals_defs.html index e364ea38..8b81c46c 100644 --- a/docs/namespacemembers_type.html +++ b/docs/globals_defs.html @@ -3,9 +3,9 @@ - + -rpc.hpp: Namespace Members +rpc.hpp: File Members @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -64,19 +64,50 @@
 
diff --git a/docs/graph_legend.html b/docs/graph_legend.html index 9f67484d..85db8806 100644 --- a/docs/graph_legend.html +++ b/docs/graph_legend.html @@ -3,7 +3,7 @@ - + rpc.hpp: Graph Legend @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -130,9 +130,7 @@ diff --git a/docs/graph_legend.png b/docs/graph_legend.png index e303709fb4d0c5c52d75be3eec6277bb45e4a3da..ed2e657209dc1be920610bf0cf4ec23981e4bc82 100644 GIT binary patch literal 13384 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 z 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 F{{R?3;r0Lk literal 14975 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 - + rpc.hpp: Class Hierarchy @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -71,28 +71,18 @@

Go to the graphical class hierarchy

This inheritance list is sorted roughly, but not completely, alphabetically:
[detail level 12]
- - - - - - - - - - - - - - + + + + + +
 Crpc::details::bool_pack<... >Dummy struct for all_true
 Crpc::client::client_basePolymorphic base class for sending and receiving data to/from the server
 Crpc::client::client_basePolymorphic base class for sending and receiving data to/from the server
 Crpc::details::dyn_array< T >Dynamically sized generic array class. Has a fixed max capacity and a dynamic size
 Crpc::details::has_begin< C >SFINAE struct for checking a type for a 'begin' member function
 Crpc::details::has_end< C >SFINAE struct for checking a type for a 'end' member function
 Crpc::details::has_size< C >SFINAE struct for checking a type for a 'size' member function
 Cintegral_constant
 Crpc::details::is_container< C >SFINAE struct to determine if a type is a container
 Crpc::packed_func_basePolymorphic base class for packed_func
 Crpc::packed_func< R, Args >Class reprensenting a function call including its name, result, and parameters
 Crpc::packed_func< void, Args... >Class reprensenting a function call (with void result) including its name and parameters
 Crpc::details::ptr_decay< T >Structure to decay arrays to pointers
 Crpc::serial_adapter< Serial >Template class that provides an interface for going to and from a packed_func and a serial object
 Crpc::client::client_interface< Serial >Class defining an interface for calling into an RPC server or module
 Crpc::client_interface< Serial >Class defining an interface for calling into an RPC server or module
 Crpc::pack_adapter< Serial >Class collecting several functions for interoperating between serial objects and a packed_func
 Cdetails::packed_func_base
 Crpc::packed_func< R, Args >Object representing a function call, including the function's name, arguments and result
 Crpc::packed_func< void, Args... >Object representing a void returning function call, including the function's name and arguments
diff --git a/docs/index.html b/docs/index.html index 54364077..eda2e747 100644 --- a/docs/index.html +++ b/docs/index.html @@ -3,7 +3,7 @@ - + rpc.hpp: Main Page @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@ - + @@ -67,7 +67,7 @@
rpc.hpp Documentation
-

cmake Travis (.com) branch codecov

+

cmake codecov

rpc.hpp

A simple header-only library for supporting remote procedure calls using a variety of extensible features

@@ -102,9 +102,7 @@

diff --git a/docs/inherit_graph_0.map b/docs/inherit_graph_0.map index 1811a344..b9f007bd 100644 --- a/docs/inherit_graph_0.map +++ b/docs/inherit_graph_0.map @@ -1,3 +1,3 @@ - + diff --git a/docs/inherit_graph_0.md5 b/docs/inherit_graph_0.md5 index ed366436..38cecb11 100644 --- a/docs/inherit_graph_0.md5 +++ b/docs/inherit_graph_0.md5 @@ -1 +1 @@ -d61e29a81f12906dd117a6320f77336f \ No newline at end of file +b2162d7413880f487e46b9da0d05483f \ No newline at end of file diff --git a/docs/inherit_graph_0.png b/docs/inherit_graph_0.png index ad24afd679f8f4de4113f9c1155b45ed83d1ba82..736522f2f3a799ff4b72882ceec8089e165d8f76 100644 GIT binary patch delta 724 zcmV;_0xSKw1lk25iBL{Q4GJ0x0000DNk~Le0001y0000q2m$~A00nDJDUl%*e*%w5 zL_t(|ob8+2k?JrEhT|RDppT>vXoNy&1o}w&NFmt=29NMnzRCi94`;Hr9BK30^6jiT zj$;y7@kbqikc?=?57CStq8UF<@P~C>@Ao@ZD1wh=S#GzR{_$g+?fd?GKD&n`gxI!i zT~}CgvW*^(N3VEg$nl#*b>6RbPL1TU)D7k{V{$mQZa^9Zr%->)@VeceXFQ zcdB{ehjQZxo8l@l)X$BWf2)e<1qW#}kMM1`z^!c3cj3%ORPj3-tiCQm+*Nw>T=`-`KIE)fKf2XE~7Y!iQOi%FH zkxV_uneL4E3l5mvU=zDJ=AFKQXng3@`x;-I_!v^Dzo*7rRp4)GkoP0LLJUc{5g%u} z9rq9IslSHgapoNRa=PD>WX(h#awIqMLp0-uXvPoGj316Qi2aB10wLSB&GQUPKE~Pk ze7;;ReM1r=%=5e~Dhn*>cZ)C7Lgq7mh-Ul{&G;dj@#7!Z7c9*OyAZ$t0000+z*$Y>9#Crvo`D>F!VCJ@%J-yel=U=7PFqbjYn z7D7PyYb}5f6B?30K|>NKXh;IZznwA9v)u1@dB5K+^pH-tTrTo>JY*P#ul&^vIZcy{ z<9L`b(kJ6M$}~-@{M8J(@O(b2e+nXfqm**ya}P%l`(Qj5rPSAQWTt)Z?XU-S9W=Ld^4*{*U`PyG*Vl$l*x0fyqiTo>#mfBoPuSsZG zuBE%$DLZup?HOrXVvm}UkhP_>ouj3s?rJlnIpy0U%eNH7Hp{VPB&H)Z#??Nuwv@82 zHtasK%caES>W)#wkhz=Yf7EXv@`*10ReND7rY*oSD%6 z4f!zVqlzJa@kabAXS>&2vI!J4B!Pm4Bv8V9+E&oLlP)xNCE{7Nuc-u3T|M*=4RtB000002uVdwM6N<$g6&-b Ar2qf` diff --git a/docs/inherit_graph_1.map b/docs/inherit_graph_1.map index 1811a344..b9f007bd 100644 --- a/docs/inherit_graph_1.map +++ b/docs/inherit_graph_1.map @@ -1,3 +1,3 @@ - + diff --git a/docs/inherit_graph_1.md5 b/docs/inherit_graph_1.md5 index ed366436..e4edf8c8 100644 --- a/docs/inherit_graph_1.md5 +++ b/docs/inherit_graph_1.md5 @@ -1 +1 @@ -d61e29a81f12906dd117a6320f77336f \ No newline at end of file +f202e2b51d403af5366ed23426723245 \ No newline at end of file diff --git a/docs/inherit_graph_1.png b/docs/inherit_graph_1.png index ad24afd679f8f4de4113f9c1155b45ed83d1ba82..73c00d1749d0ae4d4b8333a0a5a10ea2fd5e2938 100644 GIT binary patch literal 717 zcmeAS@N?(olHy`uVBq!ia0vp^6M@)-g9%8oX8URaDYhhUcNd2LAh=-f^2rPgOii9H zjv*Cu-p;-~@vs7q>sh~B9`a@Kp30gky(+agYL^InJG@!0wO!zc>f1Y?H#!?|+`Qf~ z{d(nl>x8cPn`IfUIv7_&P|S<|LYevJpGU51kU4B%BiH}*dAR-W8oT%3e-}(=IBw$m z*y7S0@0b@~t7M<@YZULl-z?LU{;eSmiUL;6EY|aQlUSpjU2So4LCEITHr+RmgrDSw zaXy&y`JViq^Xp=b1uieT`A3bdzWMs)zk*k~E}uNKGs<(e$>ge|zxCI|{d?RQLp=5 z#yXbLUp80Xd3WOV<|h}<+_^DZ=ggKv;@xk}9iICha(n5#AoS6zQ1eMkT#Zk1oO#X? zKJ(C@6!pqbJJ|^#)9-g&NbhX7i3q-Z_>#<$X-_gf^6z^dvwG$;_XRh%n<|*yIvkP1 zb13$(Tp%^Hu37piACPktB8@G$Vio*$tr z<}A7)k+bZGfi=e@W|5Oucer*YvoCfvPQ1_cEm7LfVOD?jmovdzGQ{$u#7>t_-Tjh# z>qEZ3I^Ko?AM=07wX5B_GAq!WJ(BOoY~7sF1)FPfFT6SFr|~L%%AK-`Jm0;aF1WmF zW}A{VZLyZwDSqE8rzX3^=CHUfm}!fKgkEp{A^-GXr_bdp-)+zSe3gFv_1Ci9vaf|S tE`0xMz+>Wm`X|$b=8tFOF2K-!&i}WUrtH~w6_`F5JYD@<);T3K0RZj;Ut0hG delta 562 zcmV-20?qx+1-S$viBL{Q4GJ0x0000DNk~Le0001_0000b2nGNE0L)oJJdq(3e*x}E zL_t(|ob8+z*$Y>9#Crvo`D>F!VCJ@%J-yel=U=7PFqbjYn z7D7PyYb}5f6B?30K|>NKXh;IZznwA9v)u1@dB5K+^pH-tTrTo>JY*P#ul&^vIZcy{ z<9L`b(kJ6M$}~-@{M8J(@O(b2e+nXfqm**ya}P%l`(Qj5rPSAQWTt)Z?XU-S9W=Ld^4*{*U`PyG*Vl$l*x0fyqiTo>#mfBoPuSsZG zuBE%$DLZup?HOrXVvm}UkhP_>ouj3s?rJlnIpy0U%eNH7Hp{VPB&H)Z#??Nuwv@82 zHtasK%caES>W)#wkhz=Yf7EXv@`*10ReND7rY*oSD%6 z4f!zVqlzJa@kabAXS>&2vI!J4B!Pm4Bv8V9+E&oLlP)xNCE{7Nuc-u3T|M*=4RtB000002uVdwM6N<$g3!|f Am;e9( diff --git a/docs/inherit_graph_10.map b/docs/inherit_graph_10.map deleted file mode 100644 index 00d3fee4..00000000 --- a/docs/inherit_graph_10.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/inherit_graph_10.md5 b/docs/inherit_graph_10.md5 deleted file mode 100644 index 427f34e2..00000000 --- a/docs/inherit_graph_10.md5 +++ /dev/null @@ -1 +0,0 @@ -ce8c7ea3af3cee8957fdf2ce79c17fb6 \ No newline at end of file diff --git a/docs/inherit_graph_10.png b/docs/inherit_graph_10.png deleted file mode 100644 index 3d08d963fbcbe84260233e58b0ca639b68c305d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmV;|0x127P)Y)k7`{kLe zM0}-Sasi#TT#vrb%2x`;`g!Y2(S4<0fSx9T35rjBrk;k7AOEkGF4g6<8-H@z}<+~09Jb`^1&+Xp8tEmuM^cS+x=cD(oExoYN=qnS&p zec9Z4NBY#1ZLyHrxz_5n`jT75Y|Sjp2*T5~O>fbf-4^D0X5TH_sbNYmL{v1jnkOk` zzDKpuqVK?{H@|LgNj>&DdX+s=r&SxdV0q*iICQfxTlW!Lft*{Z1#6|cHFw1wr)IHB zZIs%q^_^QoqW#N)X6_oA2u2!Ea`RK=N{gXwH|N&0LA4~ft@U>#uhzE)Y}^46=7QcC zl-!i{V+JW*1oLT&IAcC%T|>AeAmXE4Qp%NRpIq+tddqG2GxD*5;hr6F`D77DFzu48 zT}HAt-V`PU6OQp)Sc;KXBEklnW#O1|Nx5Cm6rA198CN3Ws}9y&of*MsEK2HN?`&5h ztOdzt1XDU!;npW=cS3yBt-!(zKw{3hPwwa|5mto~Fd6i2uPU~r_mzn4HA}0QvM@2V zQ{dXh-RLV3mW2{9EtncdT+)au5f(A&lE6G57$5?I0U{t6AOeB`A|Mzb0)hb|vimT% z+im1HfDxRJcAD_R&VVTY!_GUw08j!k3=jdq01*%j5COpe5q}mg>;{S=LOB2c002ov JPDHLkV1oP1QNaKJ diff --git a/docs/inherit_graph_2.map b/docs/inherit_graph_2.map index 8781cd30..46537ee4 100644 --- a/docs/inherit_graph_2.map +++ b/docs/inherit_graph_2.map @@ -1,3 +1,3 @@ - + diff --git a/docs/inherit_graph_2.md5 b/docs/inherit_graph_2.md5 index 63a34575..cc41054e 100644 --- a/docs/inherit_graph_2.md5 +++ b/docs/inherit_graph_2.md5 @@ -1 +1 @@ -b6dc907963fe9def7b0a34ed1550b552 \ No newline at end of file +59966011ec015855be33c76882688596 \ No newline at end of file diff --git a/docs/inherit_graph_2.png b/docs/inherit_graph_2.png index 7e0582e215f7e95587457ee9dbca499cb355b841..befdefc8a7a80c8f28dbe52dd49bb8f1a413c557 100644 GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^6M@)-g9%8oX8URaDYhhUcNd2LAh=-f^2rPgOa-1U zjv*Cu-p;;Q*lfVlws5-XCiXWIbtXA(@&GX$UoeNCi*TEidm!vrJ-_XvQ%)b;4@Kl! z`vx=nd_jcHeR{>|T!=@=2Id4uV~JmTb2~=DtDOUI#<2?Ak+IRQg?#&j(<5|Tju=bP-qng zADgpR_ss1}HZRK*(tT;T_fLdSwz4uq^2+Uk=|{QLeqD(PytVh+k<d$U+zBpYQ z>HT+&rT*+UHmgI7qx>Z@o}T$4Sz0F5sTR`vQOtUc^wHPnKTgRGl&dcu#0XSNmVRz#oY{QOk3_S3Y37I(8B9_Bu#e2c~NqR-}(2kwjBd=>tB zTA(oOg3-6dYD-u?_~rI{U01MVnJ;|*OZuFhv!34XzWe@}V| z_kWCx(vPp#*_u6V!}=WwAwq&zj)_{Xf3-Z(-}rs)w3oFXVkhZ7m)gAPN}Tk}v#h@F zoj*rc9ZOrj?4;wBb&;Fz{mn`;vz{UN)bn-Ba)}E$iZ_0Soa@ysKe4&wNbdaz^+gq? zt4)*hd4*hNx=9@@%T$&3dRysMty*)uyU`(M?6$fERS`kRxwZAa-^DsY(jM>Z)OU$}X_8#)no7Z95r7DQ zk_h&aH6H~;0&qML?Dk2>f(n#w z2NT6-p?0_)Y49DxKON)@Zt6EB5o7*pS}o?Uyp6>0B5(r{+ExzDf9ClMnz6hhHOR4O zBY8=c+Zu^Y+zxV*!&=+E5Ml}Ec diff --git a/docs/inherit_graph_3.map b/docs/inherit_graph_3.map index ad6dc463..0d687b0b 100644 --- a/docs/inherit_graph_3.map +++ b/docs/inherit_graph_3.map @@ -1,3 +1,5 @@ - + + + diff --git a/docs/inherit_graph_3.md5 b/docs/inherit_graph_3.md5 index 0227bccd..21164cad 100644 --- a/docs/inherit_graph_3.md5 +++ b/docs/inherit_graph_3.md5 @@ -1 +1 @@ -0a97a7d6fecb543a6605ab81e5c13b8c \ No newline at end of file +aed4b485b92bcf2a612ed0863f6710da \ No newline at end of file diff --git a/docs/inherit_graph_3.png b/docs/inherit_graph_3.png index c49fdcc815d597a5e99e160673d3819516b84363..21527315d4da215db9acbf3165b32a0d9821d050 100644 GIT binary patch literal 3364 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 diff --git a/docs/inherit_graph_4.map b/docs/inherit_graph_4.map deleted file mode 100644 index d9d4793b..00000000 --- a/docs/inherit_graph_4.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/inherit_graph_4.md5 b/docs/inherit_graph_4.md5 deleted file mode 100644 index 3e48ead7..00000000 --- a/docs/inherit_graph_4.md5 +++ /dev/null @@ -1 +0,0 @@ -8e42547dd31da22c9bc62e4349edbcc0 \ No newline at end of file diff --git a/docs/inherit_graph_4.png b/docs/inherit_graph_4.png deleted file mode 100644 index 98412e703770545cfa18fc0857533c278d9fa04b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 697 zcmV;q0!ICbP)0i}4WN%E%o&kC!mrr<(2*%AYdS z+V4xu7A!LZ%dZSn+jU)M0N~Bf(g6T`8i)cwfG7Y2hyp+3*hsf?AUY=-R0m~vyN757x^Q>nw8v|^6G{(4w1uVZob z-an|%zEqzLv7%A;a{k3XaY9n-ijvcLgOWKFNA3ls)ps^3Bwo-foIRleB zh;ra-{?kLTX!+F4$%iqw5Qc`YuM$N`YSEW-?U&}txv^;Y)Sj$0Qkz&`HHD{k`jk4+ zw4PeE{kJ$K%-Qs7`K;+XCAIN=pCSm&6iscV2rZ*iDM4&wIW@qsR6}lzhq0whfH`re z+V%M;O`k&TrfimsOA0Cblbn8PuXI&Jk-LdZt@qs*JE}{qmy;oOonwDax%9vyr_J0k ztPx{QOs(PN9lU9guC0Nu+GuZuSdLzb<_X)HP!Yve2eTC|UW#oQ(kB1`q5u#e3IGA3 z01yN>+RnL_aR4;OIcJW?C;$Y191h%myN(FS00000NkvXXu0mjfNZ>>^ diff --git a/docs/inherit_graph_5.map b/docs/inherit_graph_5.map deleted file mode 100644 index c74160fd..00000000 --- a/docs/inherit_graph_5.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/inherit_graph_5.md5 b/docs/inherit_graph_5.md5 deleted file mode 100644 index 3d8aaa87..00000000 --- a/docs/inherit_graph_5.md5 +++ /dev/null @@ -1 +0,0 @@ -33ab5ce3a63c9c3c1491e7da110f2952 \ No newline at end of file diff --git a/docs/inherit_graph_5.png b/docs/inherit_graph_5.png deleted file mode 100644 index 7a08ffed636e4628a520ba5d211c4065c55d413d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671 zcmV;Q0$}}#P)YX}))X-L1&c#f{jWyM3kkXygo*U|0%Yc&BQa(=X zmQgTw%yctonLhcYQZ4bx&zDo5<7KKRNadg|A{BRPz*J6Zx%T`@x+(3P_Gr<`IgXN(y}I}bSW^`(!=l?xxUKm+=iis_1gHYHEXSw)|?uKlqfMu=b(8*sXdM18c1t0 zBAvg-W3!sc@|w77;glHEc8<|COC`0QJvHp*hUU`5D%ZfJAwQl_&b4vOutqmGE|sID zjFCEyv%jPc?ea*(?6s3G?s{s!(xWTx`uHX)eXfbWX1R5uU((d7Z7sbfv>foI5-`J8 zO;D{+s+9qairLZNx}bgAKp6wf0J8%#!0f;bFgq|qa)LUJV^19bh>-K`!tBE^IOm+( z@ArC&08nJN+mY*iz;i5M1N=Wbumj8v%mA|kGr;V?4F9&=ypo3q%Lo7f002ovPDHLk FV1f=5OZET& diff --git a/docs/inherit_graph_6.map b/docs/inherit_graph_6.map deleted file mode 100644 index 12ddb515..00000000 --- a/docs/inherit_graph_6.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/inherit_graph_6.md5 b/docs/inherit_graph_6.md5 deleted file mode 100644 index 2a129256..00000000 --- a/docs/inherit_graph_6.md5 +++ /dev/null @@ -1 +0,0 @@ -a1523dc87657a1da4e597ea1e375a10a \ No newline at end of file diff --git a/docs/inherit_graph_6.png b/docs/inherit_graph_6.png deleted file mode 100644 index 58a1c3036ae813fff1a4538a977e86f55e573bec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 685 zcmV;e0#f~nP)i_^44MY#j0nr0@pwF{92rxRI+k5b9Se;lxftIASCNNIA z7@lhLDE7a;|P)0@cNW3n{?>bQ40CPa}z#I@gFb6~r%#q#5dhbWZ0f0E( zdpaJEi}r=+_xn8&5uHva{ipy?X1Cid+FZc-7cd5DdSDKS9+(572j+n2fjNEvMLZh+ T7dU0r00000NkvXXu0mjfm|Q{= diff --git a/docs/inherit_graph_7.map b/docs/inherit_graph_7.map deleted file mode 100644 index c6b3fe97..00000000 --- a/docs/inherit_graph_7.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/inherit_graph_7.md5 b/docs/inherit_graph_7.md5 deleted file mode 100644 index 7fdaa08d..00000000 --- a/docs/inherit_graph_7.md5 +++ /dev/null @@ -1 +0,0 @@ -fe4c49bc8ae9e093b4391e4d230bf10a \ No newline at end of file diff --git a/docs/inherit_graph_7.png b/docs/inherit_graph_7.png deleted file mode 100644 index c6d0ad42141c5972c0192e93ee7fbc9e8ceb213c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1410 zcmV-|1%3L7P)1uexiM24zypcb~|?IFmlSK61Eozbi& z{~s8l)$Z)G^YVChb{)rcT^B?|WTlMh0Emc4A0~MsB8xG}6A@XANuG$vViW!ir>CcA zHk;t{Si3ongX!sM6O`CnB;KlROcT#hB!Yh%BZg$vcjtq8KgG92?nBNB{Gdsj7S% z#z~s4!Ev06AJdd1`MB@Yr{RLrV%!Gj@$m^Nm7nn7L4|)qp@B#{>Zt#;wyEiQk>NNF zT-Uw$F`f4UU!f%Gbk6Yn`2jXI-r&`%U(xOM00672-{QuNtA?W^GNYfw<9^pq^diTo zq$J6EgY5si|J%#E-M_DQyLVszcm7K9p2J`MuyRDMBPtgEcR|-1cARKkh}LNm-R?QI zw|~Rt<}RK*d5cb`i%iBruXnDbd{g{=MyB1oy(LGWL$<(Ifjzd zOVaigZPzGa$ArbHf|i;5u*x1*abcf>5_r_U!#<0~ELwh8+{5-0t&5;?qh<(kxvqcAV~|l%R8~Jg@OJ`Eh#y zDZ)R<kviQ7->@XP;oI~Yj&o|+*r^a$g~P)$?Ct%H_wWC`G>eb&=+Pnyg`C#-qTIj# zgVFQLire31`-7@ksL9!E7**p$=8hmq0*t5MdbV{%Nw_H!pc`wPMkR7 zETzPGjv#w}StC#K{)a(9w}t-Oq_74R**8uZVX^qXlPwbnt_#s?NYY6h$3d}p3&r9s ztge28*ROv^t+tEDkN0qLa*Av=gKl@c->eA|bSoa#Zczg`tnGC7ha_=}#3^(BBuhZ5 z#)*np;_NS4zV5puB}qQ)A!yVCQkjR5QRT=!lvNQ++=qKfu0i(tqGYof%+1}#+}v$E zeE1z+y!ZvR+Af|w`x(97InK}1amy}4q#Z=Io9@%H{Y|#tMo~S6bk&P!yNgQ8@)nS? zF@*WHBarA|i`1$rBM-j7gq| z$YOyHUXPBBMi~c@uxho6T#m1E5&@sbL#b36*glZt3xxsz;Najue^g{tzpcknKA%Uu zUPrxNHysL5YD`T{4Qz86O`CnB=g|3P?a1^K@N Q%K!iX07*qoM6N<$f)|z0 - - diff --git a/docs/inherit_graph_8.md5 b/docs/inherit_graph_8.md5 deleted file mode 100644 index c1a4c890..00000000 --- a/docs/inherit_graph_8.md5 +++ /dev/null @@ -1 +0,0 @@ -bc4a27a71bb6977e0a69ca97ea177b7a \ No newline at end of file diff --git a/docs/inherit_graph_8.png b/docs/inherit_graph_8.png deleted file mode 100644 index daf227a6df9701c92c511c1aa0db86f239e218a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmV;Z0$2TsP)1Ar*E z+l@}A)4#ICN$`5T=<#@T69qsothK?ly*LRbp3kSKAOL!EyQDZ~~wn zH~~-(n;35aV+^(a>(jhXiT)+oie6(3TQ@@grkx;_oW;@mC2VEkwq!ovZ?6PU{Vy0!1IKDmB*gE!{Z#4hA-%rZ;lL2E#aLNm-(H+vxX-m};>N8buX3F@`miCeJe2KnR_K5W}IW19q(~)Gpd9-3ziE)l$a*gO4esnUILg_*& zX*aizq-`X|*p(CH9NYdbmfQa~+-j^*qOa68^YJ7Ws-%O7-45j>c3T*~R;Tn0N6q-L z1lNblWBg}YhAh&dme@(a9gnfFVl63)8FnpP@e|p(wv?AuqdPPvr!9w4d!*LYF65TC zLy|Oc0#0OYdFZ*d9VoS&O9o>}VvX(;9kI3?CHBav>yhY=20xYo_3SD!-W#z{WW)~I z=BB&x`Vf z6C966A|kq6F7m1X=*;18SdVXpg^}q>$dj0^H&c}0)BpEUQ O0000 - - - - diff --git a/docs/inherit_graph_9.md5 b/docs/inherit_graph_9.md5 deleted file mode 100644 index ee2e8fba..00000000 --- a/docs/inherit_graph_9.md5 +++ /dev/null @@ -1 +0,0 @@ -2fb569c0af664b9553fd59b427272839 \ No newline at end of file diff --git a/docs/inherit_graph_9.png b/docs/inherit_graph_9.png deleted file mode 100644 index 396a275114eff99bf7de6117f11eeed2a785fd3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3456 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 - + rpc.hpp: Class Hierarchy @@ -22,7 +22,7 @@
rpc.hpp -  0.2.1 +  0.5.1
Simple RPC Header-Only Library
@@ -31,10 +31,10 @@
- + @@ -70,71 +70,33 @@ - - - - - - - - - - -
- - +
+ +
- - +
+ +
- - +
+ +
- - - -
- - - -
- - - -
- - - -
- - - - -
- - - -
- - - - - -
- - +
+ + + +
diff --git a/docs/menu.js b/docs/menu.js index d18a2fe2..2fe2214f 100644 --- a/docs/menu.js +++ b/docs/menu.js @@ -41,9 +41,9 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); if (searchEnabled) { if (serverSide) { - $('#main-menu').append('
  • '); + $('#main-menu').append('
  • '); } else { - $('#main-menu').append('
  • '); + $('#main-menu').append('
  • '); } } $('#main-menu').smartmenus(); diff --git a/docs/menudata.js b/docs/menudata.js index 25f47078..fa82758a 100644 --- a/docs/menudata.js +++ b/docs/menudata.js @@ -28,37 +28,17 @@ var menudata={children:[ {text:"Namespace List",url:"namespaces.html"}, {text:"Namespace Members",url:"namespacemembers.html",children:[ {text:"All",url:"namespacemembers.html"}, -{text:"Functions",url:"namespacemembers_func.html"}, -{text:"Variables",url:"namespacemembers_vars.html"}, -{text:"Typedefs",url:"namespacemembers_type.html"}]}]}, +{text:"Functions",url:"namespacemembers_func.html"}]}]}, {text:"Classes",url:"annotated.html",children:[ {text:"Class List",url:"annotated.html"}, {text:"Class Index",url:"classes.html"}, {text:"Class Hierarchy",url:"inherits.html"}, {text:"Class Members",url:"functions.html",children:[ -{text:"All",url:"functions.html",children:[ -{text:"b",url:"functions.html#index_b"}, -{text:"c",url:"functions.html#index_c"}, -{text:"d",url:"functions.html#index_d"}, -{text:"e",url:"functions.html#index_e"}, -{text:"f",url:"functions.html#index_f"}, -{text:"g",url:"functions.html#index_g"}, -{text:"m",url:"functions.html#index_m"}, -{text:"p",url:"functions.html#index_p"}, -{text:"r",url:"functions.html#index_r"}, -{text:"s",url:"functions.html#index_s"}, -{text:"t",url:"functions.html#index_t"}]}, -{text:"Functions",url:"functions_func.html",children:[ -{text:"b",url:"functions_func.html#index_b"}, -{text:"c",url:"functions_func.html#index_c"}, -{text:"d",url:"functions_func.html#index_d"}, -{text:"e",url:"functions_func.html#index_e"}, -{text:"f",url:"functions_func.html#index_f"}, -{text:"g",url:"functions_func.html#index_g"}, -{text:"m",url:"functions_func.html#index_m"}, -{text:"p",url:"functions_func.html#index_p"}, -{text:"s",url:"functions_func.html#index_s"}, -{text:"t",url:"functions_func.html#index_t"}]}, +{text:"All",url:"functions.html"}, +{text:"Functions",url:"functions_func.html"}, {text:"Typedefs",url:"functions_type.html"}]}]}, {text:"Files",url:"files.html",children:[ -{text:"File List",url:"files.html"}]}]} +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/docs/namespacemembers.html b/docs/namespacemembers.html index f3417ade..113fdb6b 100644 --- a/docs/namespacemembers.html +++ b/docs/namespacemembers.html @@ -3,7 +3,7 @@ - + rpc.hpp: Namespace Members @@ -22,7 +22,7 @@
    rpc.hpp -  0.2.1 +  0.5.1
    Simple RPC Header-Only Library
    @@ -31,10 +31,10 @@ - + @@ -64,73 +64,26 @@
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    diff --git a/docs/namespacemembers_func.html b/docs/namespacemembers_func.html index ec39c53f..28ddbbfe 100644 --- a/docs/namespacemembers_func.html +++ b/docs/namespacemembers_func.html @@ -3,7 +3,7 @@ - + rpc.hpp: Namespace Members @@ -22,7 +22,7 @@
    rpc.hpp -  0.2.1 +  0.5.1
    Simple RPC Header-Only Library
    @@ -31,10 +31,10 @@ - + @@ -64,61 +64,26 @@
     
    diff --git a/docs/namespacerpc.html b/docs/namespacerpc.html new file mode 100644 index 00000000..70682910 --- /dev/null +++ b/docs/namespacerpc.html @@ -0,0 +1,112 @@ + + + + + + + +rpc.hpp: rpc Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    rpc.hpp +  0.5.1 +
    +
    Simple RPC Header-Only Library
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    rpc Namespace Reference
    +
    +
    + +

    Top-level namespace for rpc.hpp classes and functions. +More...

    + + + + + + + + + + + +

    +Namespaces

     client
     Namespace containing functions and classes only relevant to "client-side" implentations.
     
     details
     Namespace for implementation details, should not be used outside of the library.
     
     server
     Namespace containing functions and classes only relevant to "server-side" implentations.
     
    + + + + + + + + + + + + + +

    +Classes

    class  packed_func
     Object representing a function call, including the function's name, arguments and result. More...
     
    class  packed_func< void, Args... >
     Object representing a void returning function call, including the function's name and arguments. More...
     
    class  pack_adapter
     Class collecting several functions for interoperating between serial objects and a packed_func. More...
     
    class  client_interface
     Class defining an interface for calling into an RPC server or module. More...
     
    +

    Detailed Description

    +

    Top-level namespace for rpc.hpp classes and functions.

    +
    + + + + diff --git a/docs/namespacerpc_1_1client.html b/docs/namespacerpc_1_1client.html index 42bb4673..2e315378 100644 --- a/docs/namespacerpc_1_1client.html +++ b/docs/namespacerpc_1_1client.html @@ -3,7 +3,7 @@ - + rpc.hpp: rpc::client Namespace Reference @@ -22,7 +22,7 @@
    rpc.hpp -  0.2.1 +  0.5.1
    Simple RPC Header-Only Library
    @@ -31,10 +31,10 @@ - + @@ -63,400 +63,33 @@
    rpc::client Namespace Reference
    -

    Namespace containing client-specific functions and classes Server-side code should not need anything from this namespace. +

    Namespace containing functions and classes only relevant to "client-side" implentations. More...

    - - + + -

    Classes

    class  client_base
     Polymorphic base class for sending and receiving data to/from the server. More...
    class  client_interface
     Class defining an interface for calling into an RPC server or module. More...
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Functions

    template<typename R , typename... Args>
    packed_func< R, Args... > pack_call (const std::string &func_name, Args &&... args)
     Packages a function call into a packed_func. More...
     
    template<typename Serial , typename R = void, typename... Args>
    Serial serialize_call (const std::string &func_name, Args &&... args)
     Transforms a function call to a serial object. More...
     
    template<typename Serial , typename R = void, typename... Args>
    std::future< Serial > async_serialize_call (const std::string &func_name, Args &&... args)
     Transforms a function call to a serial object (asynchronously) More...
     
    template<typename Serial >
    void send_to_server (const Serial &serial_obj, client_base &client)
     Sends a serialized function call to the server. More...
     
    template<typename Serial >
    Serial get_server_response (client_base &client)
     Gets the server's response to the client call. More...
     
    template<typename Serial , typename R = void, typename... Args>
    packed_func< R, Args... > call (client_base &client, const std::string &func_name, Args &&... args)
     Packages and sends/receives a serialized function call in one easy function. More...
     
    template<typename Serial , typename R = void, typename... Args>
    std::future< packed_func< R, Args... > > async_call (client_base &client, const std::string &func_name, Args &&... args)
     Packages and sends/receives a serialized function call in one easy function (asynchronously) More...
     

    Detailed Description

    -

    Namespace containing client-specific functions and classes Server-side code should not need anything from this namespace.

    -

    Function Documentation

    - -

    ◆ async_call()

    - -
    -
    -
    -template<typename Serial , typename R = void, typename... Args>
    - - - - - - - - - - - - - - - - - - - - - - - - -
    std::future<packed_func<R, Args...> > rpc::client::async_call (client_baseclient,
    const std::string & func_name,
    Args &&... args 
    )
    -
    - -

    Packages and sends/receives a serialized function call in one easy function (asynchronously)

    -
    Template Parameters
    - - - - -
    SerialThe type of serial object
    RThe type of the result for the function call
    ArgsThe list of parameter type(s) for the function call
    -
    -
    -
    Parameters
    - - - - -
    clientThe client object to send/receive to/from
    func_nameThe name of the function to call on the server (case-sensitive)
    argsThe list of parameters for the function call
    -
    -
    -
    Returns
    std::future<packed_func<R, Args...>> Future of the packaged function call with the result and updated parameters
    - -
    -
    - -

    ◆ async_serialize_call()

    - -
    -
    -
    -template<typename Serial , typename R = void, typename... Args>
    - - - - - - - - - - - - - - - - - - -
    std::future<Serial> rpc::client::async_serialize_call (const std::string & func_name,
    Args &&... args 
    )
    -
    - -

    Transforms a function call to a serial object (asynchronously)

    -
    Template Parameters
    - - - - -
    SerialThe type of serial object
    RThe type of the result for the function call
    ArgsThe list of parameter type(s) for the function call
    -
    -
    -
    Parameters
    - - - -
    func_nameThe name of the function to call (case-sensitive)
    argsThe list of parameters for the function call
    -
    -
    -
    Returns
    std::future<Serial> Future of the serial object representing the function call
    - -
    -
    - -

    ◆ call()

    - -
    -
    -
    -template<typename Serial , typename R = void, typename... Args>
    - - - - - - - - - - - - - - - - - - - - - - - - -
    packed_func<R, Args...> rpc::client::call (client_baseclient,
    const std::string & func_name,
    Args &&... args 
    )
    -
    - -

    Packages and sends/receives a serialized function call in one easy function.

    -
    Template Parameters
    - - - - -
    SerialThe type of serial object
    RThe type of the result for the function call
    ArgsThe list of parameter type(s) for the function call
    -
    -
    -
    Parameters
    - - - - -
    clientThe client object to send/receive to/from
    func_nameThe name of the function to call on the server (case-sensitive)
    argsThe list of parameters for the function call
    -
    -
    -
    Returns
    packed_func<R, Args...> A packaged function call with the result and updated parameters
    - -
    -
    - -

    ◆ get_server_response()

    - -
    -
    -
    -template<typename Serial >
    - - - - - - - - -
    Serial rpc::client::get_server_response (client_baseclient)
    -
    - -

    Gets the server's response to the client call.

    -
    Template Parameters
    - - -
    SerialThe type of serial object
    -
    -
    -
    Parameters
    - - -
    clientThe client object to receive from
    -
    -
    -
    Returns
    Serial The received serial object representing the function call result
    - -
    -
    - -

    ◆ pack_call()

    - -
    -
    -
    -template<typename R , typename... Args>
    - - - - - - - - - - - - - - - - - - -
    packed_func<R, Args...> rpc::client::pack_call (const std::string & func_name,
    Args &&... args 
    )
    -
    - -

    Packages a function call into a packed_func.

    -
    Template Parameters
    - - - -
    RThe type of the result for the packed_func
    ArgsThe list of parameter type(s) for the packed_func
    -
    -
    -
    Parameters
    - - - -
    func_nameThe name of the function to call (case-sensitive)
    argsList of arguments to be packaged
    -
    -
    -
    Returns
    packed_func<R, Args...> The packaged function call
    - -
    -
    - -

    ◆ send_to_server()

    - -
    -
    -
    -template<typename Serial >
    - - - - - - - - - - - - - - - - - - -
    void rpc::client::send_to_server (const Serial & serial_obj,
    client_baseclient 
    )
    -
    - -

    Sends a serialized function call to the server.

    -
    Template Parameters
    - - -
    SerialThe type of serial object
    -
    -
    -
    Parameters
    - - - -
    serial_objThe serial object representing the function call
    clientThe client object to send from
    -
    -
    - -
    -
    - -

    ◆ serialize_call()

    - -
    -
    -
    -template<typename Serial , typename R = void, typename... Args>
    - - - - - - - - - - - - - - - - - - -
    Serial rpc::client::serialize_call (const std::string & func_name,
    Args &&... args 
    )
    -
    - -

    Transforms a function call to a serial object.

    -
    Template Parameters
    - - - - -
    SerialThe type of serial object
    RThe type of the result for the function call
    ArgsThe list of parameter type(s) for the function call
    -
    -
    -
    Parameters
    - - - -
    func_nameThe name of the function to call (case-sensitive)
    argsThe list of parameters for the function call
    -
    -
    -
    Returns
    Serial The serial object representing the function call
    - -
    -
    -
    +

    Namespace containing functions and classes only relevant to "client-side" implentations.

    +
    Note
    Is only compiled by defining RPC_HPP_CLIENT_IMPL
    +
    diff --git a/docs/namespacerpc_1_1details.html b/docs/namespacerpc_1_1details.html index c013cad8..86f93f92 100644 --- a/docs/namespacerpc_1_1details.html +++ b/docs/namespacerpc_1_1details.html @@ -3,7 +3,7 @@ - + rpc.hpp: rpc::details Namespace Reference @@ -22,7 +22,7 @@
    rpc.hpp -  0.2.1 +  0.5.1
    Simple RPC Header-Only Library
    @@ -31,10 +31,10 @@ - + @@ -63,445 +63,23 @@
    -
    rpc::details Namespace Reference
    -

    Namespace for functions/variables that should be used only from within the library. Using anything in this namespace in your project is discouraged. +

    Namespace for implementation details, should not be used outside of the library. More...

    - - - - - - - - - - - - - - - - - - - - - - - -

    -Classes

    struct  bool_pack
     Dummy struct for all_true. More...
     
    class  dyn_array
     Dynamically sized generic array class. Has a fixed max capacity and a dynamic size. More...
     
    struct  has_begin
     SFINAE struct for checking a type for a 'begin' member function. More...
     
    struct  has_end
     SFINAE struct for checking a type for a 'end' member function. More...
     
    struct  has_size
     SFINAE struct for checking a type for a 'size' member function. More...
     
    struct  is_container
     SFINAE struct to determine if a type is a container. More...
     
    struct  ptr_decay
     Structure to decay arrays to pointers. More...
     
    - - - - - - - - - -

    -Typedefs

    template<typename T >
    using ptr_decay_t = typename ptr_decay< T >::type
     Helper for ptr_decay struct. More...
     
    template<bool... bs>
    using all_true = std::is_same< bool_pack< bs..., true >, bool_pack< true, bs... > >
     SFINAE struct for checking if all packed bool parameters are true. More...
     
    - - - - - - - - - - - - - - - - - - - - - -

    -Functions

    template<typename F , typename... Ts, size_t... Is>
    void for_each_tuple (const std::tuple< Ts... > &tuple, const F &func, std::index_sequence< Is... >)
     Default implementation of meta-programming function. More...
     
    template<typename F , typename... Ts>
    void for_each_tuple (const std::tuple< Ts... > &tuple, const F &func)
     Meta-programming function to apply a function over each member of a tuple. More...
     
    template<typename Serial , typename Value >
    std::remove_cv_t< std::remove_reference_t< Value > > arg_from_serial (const Serial &obj)
     Retrieves a single argument value from a serial object. More...
     
    template<typename Serial , typename Value >
    std::remove_cv_t< std::remove_reference_t< Value > > args_from_serial (const Serial &obj, unsigned &arg_index)
     Retrieves the argument values from a serial object. More...
     
    template<typename Value , typename R , typename... Args>
    std::remove_cv_t< std::remove_reference_t< Value > > args_from_packed (const packed_func< R, Args... > &pack, unsigned &arg_index)
     Unpacks the argument values from a packed_func. More...
     
    - - - - - - - - - -

    -Variables

    template<typename C >
    constexpr bool is_container_v = is_container<C>::value
     Helper variable for is_container. More...
     
    template<bool... bs>
    constexpr bool all_true_v = all_true<bs...>::value
     Helper for all_true. More...
     

    Detailed Description

    -

    Namespace for functions/variables that should be used only from within the library. Using anything in this namespace in your project is discouraged.

    -

    Typedef Documentation

    - -

    ◆ all_true

    - -
    -
    -
    -template<bool... bs>
    - - - - -
    using rpc::details::all_true = typedef std::is_same<bool_pack<bs..., true>, bool_pack<true, bs...> >
    -
    - -

    SFINAE struct for checking if all packed bool parameters are true.

    -
    Template Parameters
    - - -
    bsPacked bools to check
    -
    -
    - -
    -
    - -

    ◆ ptr_decay_t

    - -
    -
    -
    -template<typename T >
    - - - - -
    using rpc::details::ptr_decay_t = typedef typename ptr_decay<T>::type
    -
    - -

    Helper for ptr_decay struct.

    -
    Template Parameters
    - - -
    TType to decay
    -
    -
    - -
    -
    -

    Function Documentation

    - -

    ◆ arg_from_serial()

    - -
    -
    -
    -template<typename Serial , typename Value >
    - - - - - - - - -
    std::remove_cv_t<std::remove_reference_t<Value> > rpc::details::arg_from_serial (const Serial & obj)
    -
    - -

    Retrieves a single argument value from a serial object.

    -
    Template Parameters
    - - - -
    SerialThe type of serial object
    ValueThe type of the argument to be retrieved
    -
    -
    -
    Parameters
    - - -
    objThe serial object containing the value
    -
    -
    -
    Returns
    std::remove_cv_t<std::remove_reference_t<Value>> The retrieved argument value
    - -
    -
    - -

    ◆ args_from_packed()

    - -
    -
    -
    -template<typename Value , typename R , typename... Args>
    - - - - - - - - - - - - - - - - - - -
    std::remove_cv_t<std::remove_reference_t<Value> > rpc::details::args_from_packed (const packed_func< R, Args... > & pack,
    unsigned & arg_index 
    )
    -
    - -

    Unpacks the argument values from a packed_func.

    -
    Template Parameters
    - - - - -
    ValueThe type of the argument to be unpacked
    RThe type of the result for the packed_func
    ArgsThe list of parameter type(s) for the packed_func
    -
    -
    -
    Parameters
    - - - -
    packThe packaged function call to unpack
    arg_indexThe index of the argument to be unpacked (is iterated in a parameter pack when called from a tuple)
    -
    -
    -
    Returns
    std::remove_cv_t<std::remove_reference_t<Value>> The unpacked argument value
    - -
    -
    - -

    ◆ args_from_serial()

    - -
    -
    -
    -template<typename Serial , typename Value >
    - - - - - - - - - - - - - - - - - - -
    std::remove_cv_t<std::remove_reference_t<Value> > rpc::details::args_from_serial (const Serial & obj,
    unsigned & arg_index 
    )
    -
    - -

    Retrieves the argument values from a serial object.

    -
    Template Parameters
    - - - -
    SerialThe type of serial object
    ValueThe type of the argument to be retrieved
    -
    -
    -
    Parameters
    - - - -
    objThe serial object containing the value
    arg_indexThe index of the argument to be retrieved (is iterated in a parameter pack when called from a tuple)
    -
    -
    -
    Returns
    std::remove_cv_t<std::remove_reference_t<Value>> The retrieved argument value
    - -
    -
    - -

    ◆ for_each_tuple() [1/2]

    - -
    -
    -
    -template<typename F , typename... Ts>
    - - - - - - - - - - - - - - - - - - -
    void rpc::details::for_each_tuple (const std::tuple< Ts... > & tuple,
    const F & func 
    )
    -
    - -

    Meta-programming function to apply a function over each member of a tuple.

    -
    Template Parameters
    - - - -
    FFunction type
    TsTuple types (generic)
    -
    -
    -
    Parameters
    - - - -
    tupleTuple to iterate over
    funcFunction to apply to each value
    -
    -
    - -
    -
    - -

    ◆ for_each_tuple() [2/2]

    - -
    -
    -
    -template<typename F , typename... Ts, size_t... Is>
    - - - - - - - - - - - - - - - - - - - - - - - - -
    void rpc::details::for_each_tuple (const std::tuple< Ts... > & tuple,
    const F & func,
    std::index_sequence< Is... >  
    )
    -
    - -

    Default implementation of meta-programming function.

    -
    Template Parameters
    - - - - -
    FFunction type
    TsTuple types (generic)
    IsIndex sequence to iterate over
    -
    -
    -
    Parameters
    - - - -
    tupleTuple to iterate over
    funcFunction to apply to each value
    -
    -
    - -
    -
    -

    Variable Documentation

    - -

    ◆ all_true_v

    - -
    -
    -
    -template<bool... bs>
    - - - - - -
    - - - - -
    constexpr bool rpc::details::all_true_v = all_true<bs...>::value
    -
    -inlineconstexpr
    -
    - -

    Helper for all_true.

    -
    Template Parameters
    - - -
    bsPacked bools to check
    -
    -
    - -
    -
    - -

    ◆ is_container_v

    - -
    -
    -
    -template<typename C >
    - - - - - -
    - - - - -
    constexpr bool rpc::details::is_container_v = is_container<C>::value
    -
    -inlineconstexpr
    -
    - -

    Helper variable for is_container.

    -
    Template Parameters
    - - -
    CType to check
    -
    -
    - -
    -
    -
    +

    Namespace for implementation details, should not be used outside of the library.

    +
    diff --git a/docs/namespacerpc_1_1server.html b/docs/namespacerpc_1_1server.html index 784eb1f6..98d5f12f 100644 --- a/docs/namespacerpc_1_1server.html +++ b/docs/namespacerpc_1_1server.html @@ -3,7 +3,7 @@ - + rpc.hpp: rpc::server Namespace Reference @@ -22,7 +22,7 @@
    rpc.hpp -  0.2.1 +  0.5.1
    Simple RPC Header-Only Library
    @@ -31,10 +31,10 @@ - + @@ -63,7 +63,7 @@
    @@ -74,139 +74,72 @@
    -

    Namespace for server-specific functions and variables Client-side code should not need to use anything in this namespace. +

    Namespace containing functions and classes only relevant to "server-side" implentations. More...

    - - - - - - - - - - - - - - - - - + - - - - - - - - + + + + + + + + + + + + + + + +

    Functions

    template<typename R , typename... Args>
    packed_func< R, Args... > & convert_func ([[maybe_unused]] std::function< R(Args...)> unused, const packed_func_base &pack)
     Converts a packed_func_base to a specific templated packed_func. More...
     
    template<typename R , typename... Args>
    packed_func< R, Args... > & convert_func ([[maybe_unused]] R(*unused)(Args...), const packed_func_base &pack)
     Converts a packed_func_base to a specific templated packed_func. More...
     
    template<typename Serial , typename R , typename... Args>
    packed_func< R, Args... > create_func ([[maybe_unused]] R(*unused)(Args...), const Serial &obj)
     Create a packed_func object from a serial object. More...
     
    template<typename R , typename... Args>
    void run_callback (std::function< R(Args...)> func, packed_func< R, Args... > &pack)
     Runs the callback function and populates the packed_func with the result and/or updated arguments. More...
     
    template<typename R , typename... Args>
    void run_callback (R(*func)(Args...), packed_func< R, Args... > &pack)
     Runs the callback function and populates the packed_func with the result and/or updated arguments. More...
     Runs the callback function and updates the result (and any changes to mutable arguments) in the packed_func. More...
     
    template<typename Serial >
    void dispatch (Serial &serial_obj)
     Dispatches the function call based on the received serial object. More...
     
    template<typename Serial , typename R , typename... Args>
    void dispatch_func (R(*func)(Args...), Serial &serial_obj)
     Dispatches an individual function (to be called from dispatch) More...
     
    template<typename Serial >
    void dispatch_impl (typename Serial::serial_t &serial_obj)
     Implementation component for the dispatch function. More...
     
    template<typename Serial >
    void dispatch (typename Serial::bytes_t &bytes)
     Parses the received serialized data and determines which function to call. More...
     
    template<typename Serial , typename R , typename... Args>
    void dispatch_cached_func (R(*func)(Args...), typename Serial::serial_t &serial_obj)
     Deserializes the serial object to a packed_func, calls the callback function, then serializes the result back to the serial object, using a server-side cache for performance. More...
     
    template<typename Serial , typename R , typename... Args>
    void dispatch_func (R(*func)(Args...), typename Serial::serial_t &serial_obj)
     Deserializes the serial object to a packed_func, calls the callback function, then serializes the result back to the serial object. More...
     

    Detailed Description

    -

    Namespace for server-specific functions and variables Client-side code should not need to use anything in this namespace.

    +

    Namespace containing functions and classes only relevant to "server-side" implentations.

    +
    Note
    Is only compiled by defining either RPC_HPP_SERVER_IMPL AND/OR RPC_HPP_MODULE_IMPL

    Function Documentation

    - -

    ◆ convert_func() [1/2]

    + +

    ◆ dispatch()

    -template<typename R , typename... Args>
    - - - - - - - - - - - - - - - - - - -
    packed_func<R, Args...>& rpc::server::convert_func ([[maybe_unused] ] R(*)(Args...) unused,
    const packed_func_basepack 
    )
    -
    - -

    Converts a packed_func_base to a specific templated packed_func.

    -
    Template Parameters
    - - - -
    RReturn type for the packed_func
    ArgsList of parameter type(s) for the packed_func
    -
    -
    -
    Parameters
    - - - -
    unusedFunction pointer to derive R and Args from
    packpacked_func_base reference to be converted
    -
    -
    -
    Returns
    packed_func<R, Args...>& A casted reference to a specific packed_func
    - -
    -
    - -

    ◆ convert_func() [2/2]

    - -
    -
    -
    -template<typename R , typename... Args>
    +template<typename Serial >
    - + - - - - - - - - - - + + - -
    packed_func<R, Args...>& rpc::server::convert_func void rpc::server::dispatch ([[maybe_unused] ] std::function< R(Args...)> unused,
    const packed_func_basepack 
    typename Serial::bytes_t & bytes) )
    -

    Converts a packed_func_base to a specific templated packed_func.

    +

    Parses the received serialized data and determines which function to call.

    Template Parameters
    - - +
    RReturn type for the packed_func
    ArgsList of parameter type(s) for the packed_func
    Serialserial_adapter type that controls how objects are serialized/deserialized
    Parameters
    - - +
    unusedFunction object to derive R and Args from
    packpacked_func_base reference to be converted
    bytesData to be parsed into/back out of a serial object
    -
    Returns
    packed_func<R, Args...>& A casted reference to a specific packed_func
    - -

    ◆ create_func()

    + +

    ◆ dispatch_cached_func()

    @@ -214,16 +147,16 @@

    - packed_func<R, Args...> rpc::server::create_func + void rpc::server::dispatch_cached_func ( - [[maybe_unused] ] R(*)(Args...)  - unused, + R(*)(Args...)  + func, - const Serial &  - obj  + typename Serial::serial_t &  + serial_obj  @@ -233,63 +166,28 @@

    -

    Create a packed_func object from a serial object.

    -
    Template Parameters
    - - - - -
    SerialThe type of serial object
    RThe type of the result for the packed_func
    ArgsThe list of parameter type(s) for the packed_func
    -
    -
    -
    Parameters
    - - - -
    unusedFunction pointer to the function to extract R and Args from
    objThe serial object to be converted
    -
    -
    -
    Returns
    packed_func<R, Args...> The packaged function call
    - -

    -
    - -

    ◆ dispatch()

    - -
    -
    -
    -template<typename Serial >
    - - - - - - - - -
    void rpc::server::dispatch (Serial & serial_obj)
    -
    - -

    Dispatches the function call based on the received serial object.

    -
    Note
    This function must be implemented in the server-side code (or by using the macros found in rpc_dispatch_helper.hpp)
    +

    Deserializes the serial object to a packed_func, calls the callback function, then serializes the result back to the serial object, using a server-side cache for performance.

    +
    Note
    This feature is enabled by defining RPC_HPP_ENABLE_SERVER_CACHE
    Template Parameters
    - + + +
    SerialThe type of serial object
    Serialserial_adapter type that controls how objects are serialized/deserialized
    RReturn type of the callback function
    ArgsVariadic argument type(s) for the function
    Parameters
    - + +
    serial_objThe serial object to be used by the function call, will (potentially) be modified by calling the function
    funcpointer to the callback function
    serial_objSerial representing the function call
    - -

    ◆ dispatch_func()

    + +

    ◆ dispatch_func()

    @@ -305,7 +203,7 @@

    - Serial &  + typename Serial::serial_t &  serial_obj  @@ -316,73 +214,62 @@

    -

    Dispatches an individual function (to be called from dispatch)

    +

    Deserializes the serial object to a packed_func, calls the callback function, then serializes the result back to the serial object.

    Template Parameters
    - - - + + +
    SerialThe type of serial object
    RThe return type of the function
    ArgsThe argument list of the function
    Serialserial_adapter type that controls how objects are serialized/deserialized
    RReturn type of the callback function
    ArgsVariadic argument type(s) for the function
    Parameters
    - - + +
    funcPointer to the function
    serial_objSerial object to be used by the function call, will (potentially) be modified by calling the function
    funcpointer to the callback function
    serial_objSerial representing the function call

    - -

    ◆ run_callback() [1/2]

    + +

    ◆ dispatch_impl()

    -template<typename R , typename... Args>
    +template<typename Serial >
    - + - - - - - - - - - - + + - -
    void rpc::server::run_callback void rpc::server::dispatch_impl (R(*)(Args...) func,
    packed_func< R, Args... > & pack 
    typename Serial::serial_t & serial_obj) )
    -

    Runs the callback function and populates the packed_func with the result and/or updated arguments.

    +

    Implementation component for the dispatch function.

    +
    Note
    This function must be implemented in ther server-side code, it is only a declaration in the library itself!
    Template Parameters
    - - +
    RThe type of the result for the function call
    ArgsThe list of parameter type(s) for the function call
    Serialserial_adapter type that controls how objects are serialized/deserialized
    Parameters
    - - +
    funcPointer to the function to call
    packThe packaged function call to get/set result and/or parameters
    serial_objSerial object used to represent the function call
    - -

    ◆ run_callback() [2/2]

    + +

    ◆ run_callback()

    @@ -392,7 +279,7 @@

    void rpc::server::run_callback ( - std::function< R(Args...)>  + R(*)(Args...)  func, @@ -409,18 +296,18 @@

    -

    Runs the callback function and populates the packed_func with the result and/or updated arguments.

    +

    Runs the callback function and updates the result (and any changes to mutable arguments) in the packed_func.

    Template Parameters
    - - + +
    RThe type of the result for the function call
    ArgsThe list of parameter type(s) for the function call
    RReturn type of the callback function
    ArgsVariadic argument type(s) for the function
    Parameters
    - - + +
    funcThe function object to call
    packThe packaged function call to get/set result and/or parameters
    funcpointer to the callback function
    packpacked_func representing the callback
    @@ -430,9 +317,7 @@

    diff --git a/docs/namespaces.html b/docs/namespaces.html index 9873b94d..836371d8 100644 --- a/docs/namespaces.html +++ b/docs/namespaces.html @@ -3,7 +3,7 @@ - + rpc.hpp: Namespace List @@ -22,7 +22,7 @@
    rpc.hpp -  0.2.1 +  0.5.1
    Simple RPC Header-Only Library
    @@ -31,10 +31,10 @@

    - + @@ -68,19 +68,23 @@
    Here is a list of all documented namespaces with brief descriptions:
    -
    [detail level 12]
    - - - - +
    [detail level 123]
     Nrpc
     NclientNamespace containing client-specific functions and classes Server-side code should not need anything from this namespace
     NdetailsNamespace for functions/variables that should be used only from within the library. Using anything in this namespace in your project is discouraged
     NserverNamespace for server-specific functions and variables Client-side code should not need to use anything in this namespace
    + + + + + + + + + +
     NrpcTop-level namespace for rpc.hpp classes and functions
     Nadapters
     NclientNamespace containing functions and classes only relevant to "client-side" implentations
     Cclient_interfaceClass defining an interface for calling into an RPC server or module
     NdetailsNamespace for implementation details, should not be used outside of the library
     NserverNamespace containing functions and classes only relevant to "server-side" implentations
     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
     Cclient_interfaceClass defining an interface for calling into an RPC server or module
    diff --git a/docs/rpc_8hpp.html b/docs/rpc_8hpp.html index fc7696e1..59a661cf 100644 --- a/docs/rpc_8hpp.html +++ b/docs/rpc_8hpp.html @@ -3,7 +3,7 @@ - + rpc.hpp: include/rpc.hpp File Reference @@ -22,7 +22,7 @@
    rpc.hpp -  0.2.1 +  0.5.1
    Simple RPC Header-Only Library
    @@ -31,10 +31,10 @@ - + @@ -70,9 +70,8 @@ +Macros | +Functions
    rpc.hpp File Reference
    @@ -80,34 +79,37 @@

    Header-only library for serialized RPC usage. More...

    -
    #include <any>
    -#include <future>
    +
    #include <cstddef>
    #include <optional>
    #include <string>
    #include <tuple>
    +#include <type_traits>
    #include <utility>
    +#include <unordered_map>
    Include dependency graph for rpc.hpp:
    -
    - - - - - - - - +
    + + + + + + + + +
    This graph shows which files directly or indirectly include this file:
    -
    - - - - +
    + + + + +
    @@ -115,171 +117,82 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + +

    Classes

    struct  rpc::details::has_begin< C >
     SFINAE struct for checking a type for a 'begin' member function. More...
     
    struct  rpc::details::has_end< C >
     SFINAE struct for checking a type for a 'end' member function. More...
     
    struct  rpc::details::has_size< C >
     SFINAE struct for checking a type for a 'size' member function. More...
     
    struct  rpc::details::is_container< C >
     SFINAE struct to determine if a type is a container. More...
     
    struct  rpc::details::ptr_decay< T >
     Structure to decay arrays to pointers. More...
     
    struct  rpc::details::bool_pack<... >
     Dummy struct for all_true. More...
     
    class  rpc::details::dyn_array< T >
     Dynamically sized generic array class. Has a fixed max capacity and a dynamic size. More...
     
    class  rpc::packed_func_base
     Polymorphic base class for packed_func. More...
     
    class  rpc::packed_func< R, Args >
     Class reprensenting a function call including its name, result, and parameters. More...
     Object representing a function call, including the function's name, arguments and result. More...
     
    class  rpc::packed_func< void, Args... >
     Class reprensenting a function call (with void result) including its name and parameters. More...
     Object representing a void returning function call, including the function's name and arguments. More...
     
    class  rpc::serial_adapter< Serial >
     Template class that provides an interface for going to and from a packed_func and a serial object. More...
    class  rpc::pack_adapter< Serial >
     Class collecting several functions for interoperating between serial objects and a packed_func. More...
     
    class  rpc::client::client_base
     Polymorphic base class for sending and receiving data to/from the server. More...
    class  rpc::client::client_interface< Serial >
     Class defining an interface for calling into an RPC server or module. More...
     
    + + + - + - + - +

    Namespaces

     rpc
     Top-level namespace for rpc.hpp classes and functions.
     
     rpc::details
     Namespace for functions/variables that should be used only from within the library. Using anything in this namespace in your project is discouraged.
     Namespace for implementation details, should not be used outside of the library.
     
     rpc::server
     Namespace for server-specific functions and variables Client-side code should not need to use anything in this namespace.
     Namespace containing functions and classes only relevant to "server-side" implentations.
     
     rpc::client
     Namespace containing client-specific functions and classes Server-side code should not need anything from this namespace.
     Namespace containing functions and classes only relevant to "client-side" implentations.
     
    - - - - - - - - - + + + + + + + + + + + + +

    -Typedefs

    template<typename T >
    using rpc::details::ptr_decay_t = typename ptr_decay< T >::type
     Helper for ptr_decay struct. More...
     
    template<bool... bs>
    using rpc::details::all_true = std::is_same< bool_pack< bs..., true >, bool_pack< true, bs... > >
     SFINAE struct for checking if all packed bool parameters are true. More...
     

    +Macros

    +#define RPC_HPP_ENABLE_SERVER_CACHE
     Enables server-side caching abilities.
     
    +#define RPC_HPP_CLIENT_IMPL
     Indicates that rpc.hpp is being consumed by a client translation unit.
     
    +#define RPC_HPP_MODULE_IMPL
     Indicates that rpc.hpp is being consumed by a module (dynamically loaded .dll/.so) translation unit.
     
    +#define RPC_HPP_SERVER_IMPL
     Indicates that rpc.hpp is being consumed by a server translation unit.
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Functions

    template<typename F , typename... Ts, size_t... Is>
    void rpc::details::for_each_tuple (const std::tuple< Ts... > &tuple, const F &func, std::index_sequence< Is... >)
     Default implementation of meta-programming function. More...
     
    template<typename F , typename... Ts>
    void rpc::details::for_each_tuple (const std::tuple< Ts... > &tuple, const F &func)
     Meta-programming function to apply a function over each member of a tuple. More...
     
    template<typename Serial , typename Value >
    Serial rpc::serialize (const Value &val)
     Serializes a generic object to a serial object. More...
     
    template<typename Serial , typename Value >
    Value rpc::deserialize (const Serial &serial_obj)
     De-serializes a serial object to a generic object. More...
     
    template<typename Serial , typename Value >
    std::remove_cv_t< std::remove_reference_t< Value > > rpc::details::arg_from_serial (const Serial &obj)
     Retrieves a single argument value from a serial object. More...
     
    template<typename Serial , typename Value >
    std::remove_cv_t< std::remove_reference_t< Value > > rpc::details::args_from_serial (const Serial &obj, unsigned &arg_index)
     Retrieves the argument values from a serial object. More...
     
    template<typename Value , typename R , typename... Args>
    std::remove_cv_t< std::remove_reference_t< Value > > rpc::details::args_from_packed (const packed_func< R, Args... > &pack, unsigned &arg_index)
     Unpacks the argument values from a packed_func. More...
     
    template<typename R , typename... Args>
    packed_func< R, Args... > & rpc::server::convert_func ([[maybe_unused]] std::function< R(Args...)> unused, const packed_func_base &pack)
     Converts a packed_func_base to a specific templated packed_func. More...
     
    template<typename R , typename... Args>
    packed_func< R, Args... > & rpc::server::convert_func ([[maybe_unused]] R(*unused)(Args...), const packed_func_base &pack)
     Converts a packed_func_base to a specific templated packed_func. More...
     
    template<typename Serial , typename R , typename... Args>
    packed_func< R, Args... > rpc::server::create_func ([[maybe_unused]] R(*unused)(Args...), const Serial &obj)
     Create a packed_func object from a serial object. More...
     
    template<typename R , typename... Args>
    void rpc::server::run_callback (std::function< R(Args...)> func, packed_func< R, Args... > &pack)
     Runs the callback function and populates the packed_func with the result and/or updated arguments. More...
     
    template<typename R , typename... Args>
    void rpc::server::run_callback (R(*func)(Args...), packed_func< R, Args... > &pack)
     Runs the callback function and populates the packed_func with the result and/or updated arguments. More...
     Runs the callback function and updates the result (and any changes to mutable arguments) in the packed_func. More...
     
    template<typename Serial >
    void rpc::server::dispatch (Serial &serial_obj)
     Dispatches the function call based on the received serial object. More...
     
    template<typename Serial , typename R , typename... Args>
    void rpc::server::dispatch_func (R(*func)(Args...), Serial &serial_obj)
     Dispatches an individual function (to be called from dispatch) More...
     
    template<typename R , typename... Args>
    packed_func< R, Args... > rpc::client::pack_call (const std::string &func_name, Args &&... args)
     Packages a function call into a packed_func. More...
     
    template<typename Serial , typename R = void, typename... Args>
    Serial rpc::client::serialize_call (const std::string &func_name, Args &&... args)
     Transforms a function call to a serial object. More...
     
    template<typename Serial , typename R = void, typename... Args>
    std::future< Serial > rpc::client::async_serialize_call (const std::string &func_name, Args &&... args)
     Transforms a function call to a serial object (asynchronously) More...
     
    template<typename Serial >
    void rpc::client::send_to_server (const Serial &serial_obj, client_base &client)
     Sends a serialized function call to the server. More...
     
    template<typename Serial >
    Serial rpc::client::get_server_response (client_base &client)
     Gets the server's response to the client call. More...
     
    template<typename Serial , typename R = void, typename... Args>
    packed_func< R, Args... > rpc::client::call (client_base &client, const std::string &func_name, Args &&... args)
     Packages and sends/receives a serialized function call in one easy function. More...
     
    template<typename Serial , typename R = void, typename... Args>
    std::future< packed_func< R, Args... > > rpc::client::async_call (client_base &client, const std::string &func_name, Args &&... args)
     Packages and sends/receives a serialized function call in one easy function (asynchronously) More...
     
    - - - - - - - - - + + + + + + + + + + + + + + + +

    -Variables

    template<typename C >
    constexpr bool rpc::details::is_container_v = is_container<C>::value
     Helper variable for is_container. More...
     
    template<bool... bs>
    constexpr bool rpc::details::all_true_v = all_true<bs...>::value
     Helper for all_true. More...
     
    template<typename Serial >
    void rpc::server::dispatch_impl (typename Serial::serial_t &serial_obj)
     Implementation component for the dispatch function. More...
     
    template<typename Serial >
    void rpc::server::dispatch (typename Serial::bytes_t &bytes)
     Parses the received serialized data and determines which function to call. More...
     
    template<typename Serial , typename R , typename... Args>
    void rpc::server::dispatch_cached_func (R(*func)(Args...), typename Serial::serial_t &serial_obj)
     Deserializes the serial object to a packed_func, calls the callback function, then serializes the result back to the serial object, using a server-side cache for performance. More...
     
    template<typename Serial , typename R , typename... Args>
    void rpc::server::dispatch_func (R(*func)(Args...), typename Serial::serial_t &serial_obj)
     Deserializes the serial object to a packed_func, calls the callback function, then serializes the result back to the serial object. More...
     

    Detailed Description

    Header-only library for serialized RPC usage.

    Author
    Jackson Harmer (jharm.nosp@m.er95.nosp@m.@gmai.nosp@m.l.co.nosp@m.m)
    -
    Version
    0.2.2
    -
    Date
    11-12-2020
    +
    Version
    0.5.1
    -

    Copyright (c) 2020, Jackson Harmer All rights reserved.

    +

    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. @@ -287,87 +200,10 @@
    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.

    -

    Function Documentation

    - -

    ◆ deserialize()

    - -
    -
    -
    -template<typename Serial , typename Value >
    - - - - - - - - -
    Value rpc::deserialize (const Serial & serial_obj)
    -
    - -

    De-serializes a serial object to a generic object.

    -
    Note
    This template must be instantiated for every custom struct/class that needs to be passed as a result or parameter via RPC
    -
    Template Parameters
    - - - -
    SerialThe type of serial object to use
    ValueThe type of generic object to use
    -
    -
    -
    Parameters
    - - -
    serial_objThe serial object to be de-serialized
    -
    -
    -
    Returns
    Value The de-serialized value
    - -
    -
    - -

    ◆ serialize()

    - -
    -
    -
    -template<typename Serial , typename Value >
    - - - - - - - - -
    Serial rpc::serialize (const Value & val)
    -
    - -

    Serializes a generic object to a serial object.

    -
    Note
    This template must be instantiated for every custom struct/class that needs to be passed as a result or parameter via RPC
    -
    Template Parameters
    - - - -
    SerialThe type of serial object to use
    ValueThe type of generic object to use
    -
    -
    -
    Parameters
    - - -
    valThe object to be serialized
    -
    -
    -
    Returns
    Serial The serialized value
    - -
    -
    -
    + diff --git a/docs/rpc_8hpp__dep__incl.map b/docs/rpc_8hpp__dep__incl.map index 0074a7fd..1e4d36d4 100644 --- a/docs/rpc_8hpp__dep__incl.map +++ b/docs/rpc_8hpp__dep__incl.map @@ -1,5 +1,6 @@ - - - + + + + diff --git a/docs/rpc_8hpp__dep__incl.md5 b/docs/rpc_8hpp__dep__incl.md5 index 233e50b8..8ca5c237 100644 --- a/docs/rpc_8hpp__dep__incl.md5 +++ b/docs/rpc_8hpp__dep__incl.md5 @@ -1 +1 @@ -29fcb6ef89b69591e09e90720a239363 \ No newline at end of file +e25d24605fe77fb95b5c8790a3abe32d \ No newline at end of file diff --git a/docs/rpc_8hpp__dep__incl.png b/docs/rpc_8hpp__dep__incl.png index c3dba766e2fadbc9d8bae4755866e17398af5dbb..50242343e357760d8438dae1532b5dae7934e88d 100644 GIT binary patch literal 4981 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 Vdv*GR0hpsv=xRQM)u`J={tKab#KZsq literal 4030 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