From ef7efddeef5f7ce086c1a53dd6ee0eb2e9727e86 Mon Sep 17 00:00:00 2001 From: Joud Kandeel Date: Wed, 1 Apr 2026 20:47:40 +0200 Subject: [PATCH] added docs --- doc/html/_assert_8hpp_source.html | 124 + doc/html/_coroutine_scheduler_8hpp.html | 133 + doc/html/_coroutine_scheduler_8hpp.js | 5 + .../_coroutine_scheduler_8hpp_source.html | 151 + doc/html/_file_input_stream_8hpp_source.html | 163 + doc/html/_file_output_stream_8hpp_source.html | 160 + doc/html/_function_container_8hpp_source.html | 197 + .../_g_l_graphics_context_8hpp_source.html | 121 + doc/html/_g_l_renderer_8hpp_source.html | 138 + doc/html/_graphics_context_8hpp_source.html | 133 + doc/html/_i_event_8hpp_source.html | 167 + doc/html/_input_stream_8hpp_source.html | 131 + doc/html/_logger_8hpp_source.html | 226 + doc/html/_logger_sinks_8hpp_source.html | 150 + .../_memory_input_stream_8hpp_source.html | 141 + doc/html/_output_stream_8hpp_source.html | 131 + doc/html/_platform_8hpp_source.html | 123 + doc/html/_q_event_bus_8hpp.html | 136 + doc/html/_q_event_bus_8hpp.js | 5 + doc/html/_q_event_bus_8hpp_source.html | 260 + doc/html/_renderer_8hpp_source.html | 118 + doc/html/_thread_8hpp.html | 136 + doc/html/_thread_8hpp.js | 8 + doc/html/_thread_8hpp_source.html | 252 + doc/html/_thread_impl_8hpp.html | 128 + doc/html/_thread_impl_8hpp.js | 4 + doc/html/_thread_impl_8hpp_source.html | 151 + doc/html/_thread_manager_8hpp.html | 133 + doc/html/_thread_manager_8hpp.js | 5 + doc/html/_thread_manager_8hpp_source.html | 230 + .../_virtual_file_system_8hpp_source.html | 199 + doc/html/annotated.html | 145 + doc/html/annotated_dup.js | 37 + doc/html/bug.html | 112 + doc/html/class_example_class-members.html | 110 + doc/html/class_example_class.html | 188 + doc/html/class_example_class.js | 4 + doc/html/classbasic__json-members.html | 163 + doc/html/classbasic__json.html | 332 + doc/html/classbasic__json.png | Bin 0 -> 2405 bytes ...yte__container__with__subtype-members.html | 121 + .../classbyte__container__with__subtype.html | 429 + .../classbyte__container__with__subtype.png | Bin 0 -> 811 bytes .../classdetail_1_1json__ref-members.html | 121 + doc/html/classdetail_1_1json__ref.html | 148 + doc/html/classes.html | 147 + doc/html/classjson__pointer.html | 123 + ...ssmce_1_1_coroutine_scheduler-members.html | 113 + .../classmce_1_1_coroutine_scheduler.html | 215 + doc/html/classmce_1_1_coroutine_scheduler.js | 8 + ...lassmce_1_1_file_input_stream-members.html | 121 + doc/html/classmce_1_1_file_input_stream.html | 333 + doc/html/classmce_1_1_file_input_stream.js | 10 + doc/html/classmce_1_1_file_input_stream.png | Bin 0 -> 554 bytes ...assmce_1_1_file_output_stream-members.html | 119 + doc/html/classmce_1_1_file_output_stream.html | 373 + doc/html/classmce_1_1_file_output_stream.js | 11 + doc/html/classmce_1_1_file_output_stream.png | Bin 0 -> 646 bytes doc/html/classmce_1_1_file_sink-members.html | 111 + doc/html/classmce_1_1_file_sink.html | 165 + doc/html/classmce_1_1_file_sink.png | Bin 0 -> 526 bytes ...assmce_1_1_function_container-members.html | 115 + doc/html/classmce_1_1_function_container.html | 399 + doc/html/classmce_1_1_function_container.js | 10 + ...smce_1_1_g_l_graphics_context-members.html | 114 + .../classmce_1_1_g_l_graphics_context.html | 169 + .../classmce_1_1_g_l_graphics_context.png | Bin 0 -> 686 bytes .../classmce_1_1_g_l_renderer-members.html | 112 + doc/html/classmce_1_1_g_l_renderer.html | 161 + doc/html/classmce_1_1_g_l_renderer.png | Bin 0 -> 513 bytes ...classmce_1_1_graphics_context-members.html | 112 + doc/html/classmce_1_1_graphics_context.html | 143 + doc/html/classmce_1_1_graphics_context.png | Bin 0 -> 692 bytes .../classmce_1_1_input_stream-members.html | 113 + doc/html/classmce_1_1_input_stream.html | 271 + doc/html/classmce_1_1_input_stream.js | 7 + doc/html/classmce_1_1_input_stream.png | Bin 0 -> 941 bytes doc/html/classmce_1_1_logger-members.html | 120 + doc/html/classmce_1_1_logger.html | 156 + .../classmce_1_1_logger_sink-members.html | 110 + doc/html/classmce_1_1_logger_sink.html | 132 + doc/html/classmce_1_1_logger_sink.png | Bin 0 -> 766 bytes ...ssmce_1_1_memory_input_stream-members.html | 115 + .../classmce_1_1_memory_input_stream.html | 351 + doc/html/classmce_1_1_memory_input_stream.js | 9 + doc/html/classmce_1_1_memory_input_stream.png | Bin 0 -> 669 bytes .../classmce_1_1_output_stream-members.html | 113 + doc/html/classmce_1_1_output_stream.html | 267 + doc/html/classmce_1_1_output_stream.js | 7 + doc/html/classmce_1_1_output_stream.png | Bin 0 -> 653 bytes .../classmce_1_1_q_event_bus-members.html | 119 + doc/html/classmce_1_1_q_event_bus.html | 395 + doc/html/classmce_1_1_q_event_bus.js | 11 + doc/html/classmce_1_1_renderer-members.html | 110 + doc/html/classmce_1_1_renderer.html | 132 + doc/html/classmce_1_1_renderer.png | Bin 0 -> 516 bytes .../classmce_1_1_stdout_sink-members.html | 110 + doc/html/classmce_1_1_stdout_sink.html | 163 + doc/html/classmce_1_1_stdout_sink.png | Bin 0 -> 544 bytes doc/html/classmce_1_1_thread-members.html | 115 + doc/html/classmce_1_1_thread.html | 310 + doc/html/classmce_1_1_thread.js | 9 + .../classmce_1_1_thread_impl-members.html | 112 + doc/html/classmce_1_1_thread_impl.html | 206 + doc/html/classmce_1_1_thread_impl.js | 6 + .../classmce_1_1_thread_manager-members.html | 118 + doc/html/classmce_1_1_thread_manager.html | 419 + doc/html/classmce_1_1_thread_manager.js | 14 + ...ssmce_1_1_virtual_file_system-members.html | 118 + .../classmce_1_1_virtual_file_system.html | 289 + doc/html/classmce_1_1_virtual_file_system.js | 15 + doc/html/clipboard.js | 61 + doc/html/cookie.js | 58 + doc/html/deprecated.html | 110 + .../dir_26891a649404ec89e7d5863c163240e9.html | 119 + .../dir_26891a649404ec89e7d5863c163240e9.js | 5 + .../dir_4ab6b4cc6a7edbff49100e9123df213f.html | 119 + .../dir_4ab6b4cc6a7edbff49100e9123df213f.js | 5 + .../dir_5533e7f136d8aec169f8a924fe5a6516.html | 122 + .../dir_5533e7f136d8aec169f8a924fe5a6516.js | 8 + .../dir_64f7452aef2cdad98d34a70f5ea329e2.html | 123 + .../dir_64f7452aef2cdad98d34a70f5ea329e2.js | 6 + .../dir_c6310732a22f63c0c2fc5595561e68f1.html | 131 + .../dir_c6310732a22f63c0c2fc5595561e68f1.js | 11 + .../dir_f0b8d3380d5649deec2d780f35ec3ac5.html | 124 + .../dir_f0b8d3380d5649deec2d780f35ec3ac5.js | 7 + doc/html/doxygen.css | 2540 ++ doc/html/doxygen.svg | 28 + doc/html/doxygen_crawl.html | 242 + doc/html/dynsections.js | 191 + doc/html/example_8hpp.html | 134 + doc/html/example_8hpp_source.html | 119 + doc/html/examples.html | 108 + doc/html/examples.js | 4 + doc/html/examples_2example1_8cpp-example.html | 107 + doc/html/files.html | 137 + doc/html/files_dup.js | 7 + doc/html/functions.html | 259 + doc/html/functions_enum.html | 105 + doc/html/functions_eval.html | 108 + doc/html/functions_func.html | 214 + doc/html/functions_type.html | 106 + doc/html/functions_vars.html | 122 + doc/html/group___example_group.html | 123 + doc/html/group___example_group.js | 6 + doc/html/hierarchy.html | 143 + doc/html/hierarchy.js | 44 + doc/html/index.html | 106 + doc/html/jquery.js | 204 + doc/html/json_8hpp_source.html | 22206 ++++++++++++++++ doc/html/logo channel.png | Bin 0 -> 62562 bytes doc/html/menu.js | 131 + doc/html/menudata.js | 77 + doc/html/namespacedetail.html | 1542 ++ doc/html/navtree.css | 327 + doc/html/navtree.js | 901 + doc/html/navtreedata.js | 59 + doc/html/navtreeindex0.js | 195 + doc/html/pages.html | 112 + doc/html/requirements.html | 129 + doc/html/search/all_0.js | 9 + doc/html/search/all_1.js | 5 + doc/html/search/all_10.js | 11 + doc/html/search/all_11.js | 21 + doc/html/search/all_12.js | 5 + doc/html/search/all_13.js | 6 + doc/html/search/all_14.js | 7 + doc/html/search/all_15.js | 8 + doc/html/search/all_16.js | 17 + doc/html/search/all_17.js | 8 + doc/html/search/all_2.js | 13 + doc/html/search/all_3.js | 4 + doc/html/search/all_4.js | 6 + doc/html/search/all_5.js | 12 + doc/html/search/all_6.js | 11 + doc/html/search/all_7.js | 4 + doc/html/search/all_8.js | 9 + doc/html/search/all_9.js | 9 + doc/html/search/all_a.js | 5 + doc/html/search/all_b.js | 5 + doc/html/search/all_c.js | 7 + doc/html/search/all_d.js | 8 + doc/html/search/all_e.js | 6 + doc/html/search/all_f.js | 8 + doc/html/search/classes_0.js | 5 + doc/html/search/classes_1.js | 4 + doc/html/search/classes_10.js | 4 + doc/html/search/classes_11.js | 10 + doc/html/search/classes_12.js | 19 + doc/html/search/classes_13.js | 13 + doc/html/search/classes_14.js | 8 + doc/html/search/classes_2.js | 7 + doc/html/search/classes_3.js | 6 + doc/html/search/classes_4.js | 5 + doc/html/search/classes_5.js | 6 + doc/html/search/classes_6.js | 4 + doc/html/search/classes_7.js | 4 + doc/html/search/classes_8.js | 4 + doc/html/search/classes_9.js | 4 + doc/html/search/classes_a.js | 5 + doc/html/search/classes_b.js | 14 + doc/html/search/classes_c.js | 5 + doc/html/search/classes_d.js | 12 + doc/html/search/classes_e.js | 9 + doc/html/search/classes_f.js | 4 + doc/html/search/enums_0.js | 4 + doc/html/search/enums_1.js | 4 + doc/html/search/enums_2.js | 4 + doc/html/search/enums_3.js | 4 + doc/html/search/enums_4.js | 4 + doc/html/search/enums_5.js | 4 + doc/html/search/enumvalues_0.js | 4 + doc/html/search/enumvalues_1.js | 4 + doc/html/search/enumvalues_2.js | 4 + doc/html/search/enumvalues_3.js | 4 + doc/html/search/enumvalues_4.js | 4 + doc/html/search/enumvalues_5.js | 7 + doc/html/search/enumvalues_6.js | 9 + doc/html/search/enumvalues_7.js | 4 + doc/html/search/enumvalues_8.js | 4 + doc/html/search/enumvalues_9.js | 4 + doc/html/search/enumvalues_a.js | 7 + doc/html/search/enumvalues_b.js | 4 + doc/html/search/enumvalues_c.js | 8 + doc/html/search/enumvalues_d.js | 4 + doc/html/search/files_0.js | 4 + doc/html/search/files_1.js | 4 + doc/html/search/files_2.js | 4 + doc/html/search/files_3.js | 6 + doc/html/search/functions_0.js | 7 + doc/html/search/functions_1.js | 4 + doc/html/search/functions_10.js | 8 + doc/html/search/functions_11.js | 17 + doc/html/search/functions_12.js | 14 + doc/html/search/functions_13.js | 4 + doc/html/search/functions_14.js | 4 + doc/html/search/functions_15.js | 11 + doc/html/search/functions_16.js | 8 + doc/html/search/functions_2.js | 8 + doc/html/search/functions_3.js | 6 + doc/html/search/functions_4.js | 7 + doc/html/search/functions_5.js | 4 + doc/html/search/functions_6.js | 5 + doc/html/search/functions_7.js | 5 + doc/html/search/functions_8.js | 5 + doc/html/search/functions_9.js | 7 + doc/html/search/functions_a.js | 7 + doc/html/search/functions_b.js | 7 + doc/html/search/functions_c.js | 11 + doc/html/search/functions_d.js | 6 + doc/html/search/functions_e.js | 8 + doc/html/search/functions_f.js | 9 + doc/html/search/groups_0.js | 4 + doc/html/search/groups_1.js | 4 + doc/html/search/namespaces_0.js | 5 + doc/html/search/pages_0.js | 4 + doc/html/search/pages_1.js | 4 + doc/html/search/pages_2.js | 4 + doc/html/search/pages_3.js | 4 + doc/html/search/pages_4.js | 4 + doc/html/search/pages_5.js | 5 + doc/html/search/related_0.js | 4 + doc/html/search/search.css | 377 + doc/html/search/search.js | 708 + doc/html/search/searchdata.js | 42 + doc/html/search/typedefs_0.js | 4 + doc/html/search/typedefs_1.js | 4 + doc/html/search/variables_0.js | 4 + doc/html/search/variables_1.js | 5 + doc/html/search/variables_2.js | 6 + doc/html/search/variables_3.js | 6 + doc/html/search/variables_4.js | 4 + doc/html/search/variables_5.js | 4 + doc/html/search/variables_6.js | 4 + doc/html/search/variables_7.js | 4 + doc/html/search/variables_8.js | 4 + doc/html/search/variables_9.js | 4 + doc/html/search/variables_a.js | 5 + doc/html/search/variables_b.js | 4 + doc/html/search/variables_c.js | 5 + doc/html/search/variables_d.js | 4 + doc/html/structadl__serializer-members.html | 111 + doc/html/structadl__serializer.html | 247 + ...1_1actual__object__comparator-members.html | 111 + ...tdetail_1_1actual__object__comparator.html | 144 + doc/html/structdetail_1_1char__traits.html | 122 + doc/html/structdetail_1_1char__traits.png | Bin 0 -> 637 bytes ...traits_3_01signed_01char_01_4-members.html | 113 + ..._1char__traits_3_01signed_01char_01_4.html | 139 + ...1_1char__traits_3_01signed_01char_01_4.png | Bin 0 -> 1093 bytes ...aits_3_01unsigned_01char_01_4-members.html | 113 + ...char__traits_3_01unsigned_01char_01_4.html | 139 + ...1char__traits_3_01unsigned_01char_01_4.png | Bin 0 -> 1125 bytes doc/html/structdetail_1_1conjunction.html | 122 + doc/html/structdetail_1_1conjunction.png | Bin 0 -> 604 bytes ...onjunction_3_01_b_00_01_bn_8_8_8_01_4.html | 122 + ...conjunction_3_01_b_00_01_bn_8_8_8_01_4.png | Bin 0 -> 1005 bytes ...ructdetail_1_1conjunction_3_01_b_01_4.html | 122 + ...tructdetail_1_1conjunction_3_01_b_01_4.png | Bin 0 -> 797 bytes .../structdetail_1_1detector-members.html | 110 + doc/html/structdetail_1_1detector.html | 124 + ...0_01_op_00_01_args_8_8_8_01_4-members.html | 110 + ...4_01_4_00_01_op_00_01_args_8_8_8_01_4.html | 124 + doc/html/structdetail_1_1has__from__json.html | 122 + doc/html/structdetail_1_1has__from__json.png | Bin 0 -> 1006 bytes ...asic_c539cc270c7761d4d170d3ccbc682abe.html | 110 + ...asic_fce8b8f93d45fb838eee91b696633019.html | 160 + ...basic_fce8b8f93d45fb838eee91b696633019.png | Bin 0 -> 1205 bytes .../structdetail_1_1has__key__compare.html | 122 + .../structdetail_1_1has__key__compare.png | Bin 0 -> 1240 bytes ...tail_1_1has__non__default__from__json.html | 122 + ...etail_1_1has__non__default__from__json.png | Bin 0 -> 1107 bytes ..._t_3_2d17f33a54f009ebd0a99d19cdccdb1f.html | 160 + ...__t_3_2d17f33a54f009ebd0a99d19cdccdb1f.png | Bin 0 -> 1401 bytes ..._t_3_aba36cbb7813fd17d441db00ab087ca5.html | 110 + doc/html/structdetail_1_1has__to__json.html | 122 + doc/html/structdetail_1_1has__to__json.png | Bin 0 -> 990 bytes ...ic__j28a68f7ad118503a2d1e9663db2d9323.html | 160 + ...sic__j28a68f7ad118503a2d1e9663db2d9323.png | Bin 0 -> 1191 bytes ...ic__j503889e5c318926621b30ae5ed02bfe4.html | 110 + ...ctdetail_1_1integer__sequence-members.html | 110 + .../structdetail_1_1integer__sequence.html | 127 + doc/html/structdetail_1_1is__basic__json.html | 122 + doc/html/structdetail_1_1is__basic__json.png | Bin 0 -> 740 bytes ..._n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.html | 122 + ...n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.png | Bin 0 -> 1448 bytes ...uctdetail_1_1is__basic__json__context.html | 122 + ...ructdetail_1_1is__basic__json__context.png | Bin 0 -> 2204 bytes ..._1_1is__compatible__array__type__impl.html | 125 + ...l_1_1is__compatible__array__type__impl.png | Bin 0 -> 2120 bytes ...ay_ty5a05c25fff6f823ac88824a10a386dcf.html | 0 ...etail_1_1is__compatible__object__type.html | 125 + ...detail_1_1is__compatible__object__type.png | Bin 0 -> 1991 bytes ...1_1is__compatible__object__type__impl.html | 125 + ..._1_1is__compatible__object__type__impl.png | Bin 0 -> 2220 bytes ...ject_c9788cfc69b1e1eda6ea05aee660649a.html | 163 + ...bject_c9788cfc69b1e1eda6ea05aee660649a.png | Bin 0 -> 2191 bytes ...ject_c9e009318704dfde4a68cc4f322bd23d.html | 110 + ...1is__compatible__string__type-members.html | 109 + ...etail_1_1is__compatible__string__type.html | 149 + .../structdetail_1_1is__complete__type.html | 122 + .../structdetail_1_1is__complete__type.png | Bin 0 -> 797 bytes ...ltype_07void_07sizeof_07_t_08_08_08_4.html | 122 + ...cltype_07void_07sizeof_07_t_08_08_08_4.png | Bin 0 -> 1431 bytes .../structdetail_1_1is__constructible.html | 122 + .../structdetail_1_1is__constructible.png | Bin 0 -> 840 bytes ...td_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html | 126 + ...std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png | Bin 0 -> 4478 bytes ...1std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html | 126 + ...01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png | Bin 0 -> 3796 bytes ...td_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html | 126 + ...std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png | Bin 0 -> 4375 bytes ...1std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html | 126 + ...01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png | Bin 0 -> 3764 bytes ...il_1_1is__constructible__object__type.html | 125 + ...ail_1_1is__constructible__object__type.png | Bin 0 -> 2015 bytes ...is__constructible__object__type__impl.html | 125 + ...1is__constructible__object__type__impl.png | Bin 0 -> 2312 bytes ...ble_o47d3f1d858163de67321be81dde3c5a8.html | 110 + ...ble_oe3af2486927b63ecadb7a7d2ea385f2a.html | 175 + ...ible_oe3af2486927b63ecadb7a7d2ea385f2a.png | Bin 0 -> 2166 bytes ...__constructible__string__type-members.html | 110 + ...il_1_1is__constructible__string__type.html | 158 + ...tdetail_1_1is__default__constructible.html | 122 + ...ctdetail_1_1is__default__constructible.png | Bin 0 -> 819 bytes ...td_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html | 126 + ...std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png | Bin 0 -> 3607 bytes ...1std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html | 126 + ...01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png | Bin 0 -> 3234 bytes ...td_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html | 126 + ...std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png | Bin 0 -> 3505 bytes ...1std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html | 126 + ...01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png | Bin 0 -> 3141 bytes .../structdetail_1_1is__detected__lazy.html | 122 + .../structdetail_1_1is__detected__lazy.png | Bin 0 -> 841 bytes .../structdetail_1_1is__getable-members.html | 109 + doc/html/structdetail_1_1is__getable.html | 122 + .../structdetail_1_1is__iterator__traits.html | 122 + .../structdetail_1_1is__iterator__traits.png | Bin 0 -> 774 bytes ...ator__traits_3_01_t_01_4_01_4-members.html | 109 + ...3_01iterator__traits_3_01_t_01_4_01_4.html | 158 + ..._3_01iterator__traits_3_01_t_01_4_01_4.png | Bin 0 -> 766 bytes doc/html/structdetail_1_1is__json__ref.html | 122 + doc/html/structdetail_1_1is__json__ref.png | Bin 0 -> 734 bytes ...n__ref_3_01json__ref_3_01_t_01_4_01_4.html | 122 + ...on__ref_3_01json__ref_3_01_t_01_4_01_4.png | Bin 0 -> 987 bytes .../structdetail_1_1is__range-members.html | 109 + doc/html/structdetail_1_1is__range.html | 122 + .../structdetail_1_1iterator__traits.html | 116 + ...ointer_3_01_t_01_4_1_1value_01_4_01_4.html | 125 + ...pointer_3_01_t_01_4_1_1value_01_4_01_4.png | Bin 0 -> 1156 bytes ..._01_t_01_4_1_1value_01_4_01_4-members.html | 113 + ...object_3_01_t_01_4_1_1value_01_4_01_4.html | 130 + doc/html/structdetail_1_1iterator__types.html | 116 + ..._00_064dac4a14931e9e3b7bc8e1311de4a39.html | 130 + ..._00_0e94592c78302fc510e0aa24e9e691b9b.html | 113 + .../structdetail_1_1make__void-members.html | 109 + doc/html/structdetail_1_1make__void.html | 122 + doc/html/structdetail_1_1negation.html | 122 + doc/html/structdetail_1_1negation.png | Bin 0 -> 802 bytes .../structdetail_1_1nonesuch-members.html | 114 + doc/html/structdetail_1_1nonesuch.html | 128 + .../structdetail_1_1position__t-members.html | 112 + doc/html/structdetail_1_1position__t.html | 142 + doc/html/structdetail_1_1priority__tag.html | 116 + ...uctdetail_1_1priority__tag_3_010_01_4.html | 116 + ...structdetail_1_1static__const-members.html | 109 + doc/html/structdetail_1_1static__const.html | 122 + doc/html/structjson__sax-members.html | 132 + doc/html/structjson__sax.html | 648 + ..._coroutine_scheduler_1_1_task-members.html | 111 + ...tmce_1_1_coroutine_scheduler_1_1_task.html | 177 + ...uctmce_1_1_coroutine_scheduler_1_1_task.js | 6 + doc/html/structmce_1_1_i_event-members.html | 110 + doc/html/structmce_1_1_i_event.html | 133 + doc/html/structmce_1_1_i_event.png | Bin 0 -> 1183 bytes ...uctmce_1_1_subscription_token-members.html | 110 + .../structmce_1_1_subscription_token.html | 183 + doc/html/structmce_1_1_subscription_token.js | 5 + .../structmce_1_1_thread_func-members.html | 110 + doc/html/structmce_1_1_thread_func.html | 175 + doc/html/structmce_1_1_thread_func.js | 5 + doc/html/structmce_1_1_thread_func.png | Bin 0 -> 1663 bytes .../structmce_1_1_thread_functor-members.html | 112 + doc/html/structmce_1_1_thread_functor.html | 225 + doc/html/structmce_1_1_thread_functor.js | 6 + doc/html/structmce_1_1_thread_functor.png | Bin 0 -> 635 bytes ...hread_manager_1_1_thread_info-members.html | 113 + ...ce_1_1_thread_manager_1_1_thread_info.html | 142 + ...tmce_1_1_thread_manager_1_1_thread_info.js | 7 + ...mce_1_1_thread_member_functor-members.html | 113 + .../structmce_1_1_thread_member_functor.html | 234 + .../structmce_1_1_thread_member_functor.js | 7 + .../structmce_1_1_thread_member_functor.png | Bin 0 -> 715 bytes ...read_member_functor_with_args-members.html | 114 + ...e_1_1_thread_member_functor_with_args.html | 243 + ...mce_1_1_thread_member_functor_with_args.js | 8 + ...ce_1_1_thread_member_functor_with_args.png | Bin 0 -> 953 bytes ...irtual_file_system_1_1_config-members.html | 111 + ...ce_1_1_virtual_file_system_1_1_config.html | 176 + ...tmce_1_1_virtual_file_system_1_1_config.js | 6 + ...ce_1_1event_1_1_logger_output-members.html | 115 + .../structmce_1_1event_1_1_logger_output.html | 181 + .../structmce_1_1event_1_1_logger_output.png | Bin 0 -> 617 bytes ..._1_1event_1_1_thread_finished-members.html | 112 + ...tructmce_1_1event_1_1_thread_finished.html | 165 + ...structmce_1_1event_1_1_thread_finished.png | Bin 0 -> 625 bytes ...e_1_1event_1_1_thread_started-members.html | 113 + ...structmce_1_1event_1_1_thread_started.html | 167 + .../structmce_1_1event_1_1_thread_started.png | Bin 0 -> 618 bytes doc/html/structordered__map.html | 123 + doc/html/structstring__t__helper-members.html | 109 + doc/html/structstring__t__helper.html | 122 + ..._s_i_c___j_s_o_n___t_p_l_01_4-members.html | 109 + ..._n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.html | 122 + doc/html/tabs.css | 1 + doc/html/todo.html | 112 + doc/html/topics.html | 110 + doc/html/topics.js | 4 + ...rtual_file_system_1_1_version-members.html | 113 + ...e_1_1_virtual_file_system_1_1_version.html | 219 + ...mce_1_1_virtual_file_system_1_1_version.js | 5 + 462 files changed, 63596 insertions(+) create mode 100644 doc/html/_assert_8hpp_source.html create mode 100644 doc/html/_coroutine_scheduler_8hpp.html create mode 100644 doc/html/_coroutine_scheduler_8hpp.js create mode 100644 doc/html/_coroutine_scheduler_8hpp_source.html create mode 100644 doc/html/_file_input_stream_8hpp_source.html create mode 100644 doc/html/_file_output_stream_8hpp_source.html create mode 100644 doc/html/_function_container_8hpp_source.html create mode 100644 doc/html/_g_l_graphics_context_8hpp_source.html create mode 100644 doc/html/_g_l_renderer_8hpp_source.html create mode 100644 doc/html/_graphics_context_8hpp_source.html create mode 100644 doc/html/_i_event_8hpp_source.html create mode 100644 doc/html/_input_stream_8hpp_source.html create mode 100644 doc/html/_logger_8hpp_source.html create mode 100644 doc/html/_logger_sinks_8hpp_source.html create mode 100644 doc/html/_memory_input_stream_8hpp_source.html create mode 100644 doc/html/_output_stream_8hpp_source.html create mode 100644 doc/html/_platform_8hpp_source.html create mode 100644 doc/html/_q_event_bus_8hpp.html create mode 100644 doc/html/_q_event_bus_8hpp.js create mode 100644 doc/html/_q_event_bus_8hpp_source.html create mode 100644 doc/html/_renderer_8hpp_source.html create mode 100644 doc/html/_thread_8hpp.html create mode 100644 doc/html/_thread_8hpp.js create mode 100644 doc/html/_thread_8hpp_source.html create mode 100644 doc/html/_thread_impl_8hpp.html create mode 100644 doc/html/_thread_impl_8hpp.js create mode 100644 doc/html/_thread_impl_8hpp_source.html create mode 100644 doc/html/_thread_manager_8hpp.html create mode 100644 doc/html/_thread_manager_8hpp.js create mode 100644 doc/html/_thread_manager_8hpp_source.html create mode 100644 doc/html/_virtual_file_system_8hpp_source.html create mode 100644 doc/html/annotated.html create mode 100644 doc/html/annotated_dup.js create mode 100644 doc/html/bug.html create mode 100644 doc/html/class_example_class-members.html create mode 100644 doc/html/class_example_class.html create mode 100644 doc/html/class_example_class.js create mode 100644 doc/html/classbasic__json-members.html create mode 100644 doc/html/classbasic__json.html create mode 100644 doc/html/classbasic__json.png create mode 100644 doc/html/classbyte__container__with__subtype-members.html create mode 100644 doc/html/classbyte__container__with__subtype.html create mode 100644 doc/html/classbyte__container__with__subtype.png create mode 100644 doc/html/classdetail_1_1json__ref-members.html create mode 100644 doc/html/classdetail_1_1json__ref.html create mode 100644 doc/html/classes.html create mode 100644 doc/html/classjson__pointer.html create mode 100644 doc/html/classmce_1_1_coroutine_scheduler-members.html create mode 100644 doc/html/classmce_1_1_coroutine_scheduler.html create mode 100644 doc/html/classmce_1_1_coroutine_scheduler.js create mode 100644 doc/html/classmce_1_1_file_input_stream-members.html create mode 100644 doc/html/classmce_1_1_file_input_stream.html create mode 100644 doc/html/classmce_1_1_file_input_stream.js create mode 100644 doc/html/classmce_1_1_file_input_stream.png create mode 100644 doc/html/classmce_1_1_file_output_stream-members.html create mode 100644 doc/html/classmce_1_1_file_output_stream.html create mode 100644 doc/html/classmce_1_1_file_output_stream.js create mode 100644 doc/html/classmce_1_1_file_output_stream.png create mode 100644 doc/html/classmce_1_1_file_sink-members.html create mode 100644 doc/html/classmce_1_1_file_sink.html create mode 100644 doc/html/classmce_1_1_file_sink.png create mode 100644 doc/html/classmce_1_1_function_container-members.html create mode 100644 doc/html/classmce_1_1_function_container.html create mode 100644 doc/html/classmce_1_1_function_container.js create mode 100644 doc/html/classmce_1_1_g_l_graphics_context-members.html create mode 100644 doc/html/classmce_1_1_g_l_graphics_context.html create mode 100644 doc/html/classmce_1_1_g_l_graphics_context.png create mode 100644 doc/html/classmce_1_1_g_l_renderer-members.html create mode 100644 doc/html/classmce_1_1_g_l_renderer.html create mode 100644 doc/html/classmce_1_1_g_l_renderer.png create mode 100644 doc/html/classmce_1_1_graphics_context-members.html create mode 100644 doc/html/classmce_1_1_graphics_context.html create mode 100644 doc/html/classmce_1_1_graphics_context.png create mode 100644 doc/html/classmce_1_1_input_stream-members.html create mode 100644 doc/html/classmce_1_1_input_stream.html create mode 100644 doc/html/classmce_1_1_input_stream.js create mode 100644 doc/html/classmce_1_1_input_stream.png create mode 100644 doc/html/classmce_1_1_logger-members.html create mode 100644 doc/html/classmce_1_1_logger.html create mode 100644 doc/html/classmce_1_1_logger_sink-members.html create mode 100644 doc/html/classmce_1_1_logger_sink.html create mode 100644 doc/html/classmce_1_1_logger_sink.png create mode 100644 doc/html/classmce_1_1_memory_input_stream-members.html create mode 100644 doc/html/classmce_1_1_memory_input_stream.html create mode 100644 doc/html/classmce_1_1_memory_input_stream.js create mode 100644 doc/html/classmce_1_1_memory_input_stream.png create mode 100644 doc/html/classmce_1_1_output_stream-members.html create mode 100644 doc/html/classmce_1_1_output_stream.html create mode 100644 doc/html/classmce_1_1_output_stream.js create mode 100644 doc/html/classmce_1_1_output_stream.png create mode 100644 doc/html/classmce_1_1_q_event_bus-members.html create mode 100644 doc/html/classmce_1_1_q_event_bus.html create mode 100644 doc/html/classmce_1_1_q_event_bus.js create mode 100644 doc/html/classmce_1_1_renderer-members.html create mode 100644 doc/html/classmce_1_1_renderer.html create mode 100644 doc/html/classmce_1_1_renderer.png create mode 100644 doc/html/classmce_1_1_stdout_sink-members.html create mode 100644 doc/html/classmce_1_1_stdout_sink.html create mode 100644 doc/html/classmce_1_1_stdout_sink.png create mode 100644 doc/html/classmce_1_1_thread-members.html create mode 100644 doc/html/classmce_1_1_thread.html create mode 100644 doc/html/classmce_1_1_thread.js create mode 100644 doc/html/classmce_1_1_thread_impl-members.html create mode 100644 doc/html/classmce_1_1_thread_impl.html create mode 100644 doc/html/classmce_1_1_thread_impl.js create mode 100644 doc/html/classmce_1_1_thread_manager-members.html create mode 100644 doc/html/classmce_1_1_thread_manager.html create mode 100644 doc/html/classmce_1_1_thread_manager.js create mode 100644 doc/html/classmce_1_1_virtual_file_system-members.html create mode 100644 doc/html/classmce_1_1_virtual_file_system.html create mode 100644 doc/html/classmce_1_1_virtual_file_system.js create mode 100644 doc/html/clipboard.js create mode 100644 doc/html/cookie.js create mode 100644 doc/html/deprecated.html create mode 100644 doc/html/dir_26891a649404ec89e7d5863c163240e9.html create mode 100644 doc/html/dir_26891a649404ec89e7d5863c163240e9.js create mode 100644 doc/html/dir_4ab6b4cc6a7edbff49100e9123df213f.html create mode 100644 doc/html/dir_4ab6b4cc6a7edbff49100e9123df213f.js create mode 100644 doc/html/dir_5533e7f136d8aec169f8a924fe5a6516.html create mode 100644 doc/html/dir_5533e7f136d8aec169f8a924fe5a6516.js create mode 100644 doc/html/dir_64f7452aef2cdad98d34a70f5ea329e2.html create mode 100644 doc/html/dir_64f7452aef2cdad98d34a70f5ea329e2.js create mode 100644 doc/html/dir_c6310732a22f63c0c2fc5595561e68f1.html create mode 100644 doc/html/dir_c6310732a22f63c0c2fc5595561e68f1.js create mode 100644 doc/html/dir_f0b8d3380d5649deec2d780f35ec3ac5.html create mode 100644 doc/html/dir_f0b8d3380d5649deec2d780f35ec3ac5.js create mode 100644 doc/html/doxygen.css create mode 100644 doc/html/doxygen.svg create mode 100644 doc/html/doxygen_crawl.html create mode 100644 doc/html/dynsections.js create mode 100644 doc/html/example_8hpp.html create mode 100644 doc/html/example_8hpp_source.html create mode 100644 doc/html/examples.html create mode 100644 doc/html/examples.js create mode 100644 doc/html/examples_2example1_8cpp-example.html create mode 100644 doc/html/files.html create mode 100644 doc/html/files_dup.js create mode 100644 doc/html/functions.html create mode 100644 doc/html/functions_enum.html create mode 100644 doc/html/functions_eval.html create mode 100644 doc/html/functions_func.html create mode 100644 doc/html/functions_type.html create mode 100644 doc/html/functions_vars.html create mode 100644 doc/html/group___example_group.html create mode 100644 doc/html/group___example_group.js create mode 100644 doc/html/hierarchy.html create mode 100644 doc/html/hierarchy.js create mode 100644 doc/html/index.html create mode 100644 doc/html/jquery.js create mode 100644 doc/html/json_8hpp_source.html create mode 100644 doc/html/logo channel.png create mode 100644 doc/html/menu.js create mode 100644 doc/html/menudata.js create mode 100644 doc/html/namespacedetail.html create mode 100644 doc/html/navtree.css create mode 100644 doc/html/navtree.js create mode 100644 doc/html/navtreedata.js create mode 100644 doc/html/navtreeindex0.js create mode 100644 doc/html/pages.html create mode 100644 doc/html/requirements.html create mode 100644 doc/html/search/all_0.js create mode 100644 doc/html/search/all_1.js create mode 100644 doc/html/search/all_10.js create mode 100644 doc/html/search/all_11.js create mode 100644 doc/html/search/all_12.js create mode 100644 doc/html/search/all_13.js create mode 100644 doc/html/search/all_14.js create mode 100644 doc/html/search/all_15.js create mode 100644 doc/html/search/all_16.js create mode 100644 doc/html/search/all_17.js create mode 100644 doc/html/search/all_2.js create mode 100644 doc/html/search/all_3.js create mode 100644 doc/html/search/all_4.js create mode 100644 doc/html/search/all_5.js create mode 100644 doc/html/search/all_6.js create mode 100644 doc/html/search/all_7.js create mode 100644 doc/html/search/all_8.js create mode 100644 doc/html/search/all_9.js create mode 100644 doc/html/search/all_a.js create mode 100644 doc/html/search/all_b.js create mode 100644 doc/html/search/all_c.js create mode 100644 doc/html/search/all_d.js create mode 100644 doc/html/search/all_e.js create mode 100644 doc/html/search/all_f.js create mode 100644 doc/html/search/classes_0.js create mode 100644 doc/html/search/classes_1.js create mode 100644 doc/html/search/classes_10.js create mode 100644 doc/html/search/classes_11.js create mode 100644 doc/html/search/classes_12.js create mode 100644 doc/html/search/classes_13.js create mode 100644 doc/html/search/classes_14.js create mode 100644 doc/html/search/classes_2.js create mode 100644 doc/html/search/classes_3.js create mode 100644 doc/html/search/classes_4.js create mode 100644 doc/html/search/classes_5.js create mode 100644 doc/html/search/classes_6.js create mode 100644 doc/html/search/classes_7.js create mode 100644 doc/html/search/classes_8.js create mode 100644 doc/html/search/classes_9.js create mode 100644 doc/html/search/classes_a.js create mode 100644 doc/html/search/classes_b.js create mode 100644 doc/html/search/classes_c.js create mode 100644 doc/html/search/classes_d.js create mode 100644 doc/html/search/classes_e.js create mode 100644 doc/html/search/classes_f.js create mode 100644 doc/html/search/enums_0.js create mode 100644 doc/html/search/enums_1.js create mode 100644 doc/html/search/enums_2.js create mode 100644 doc/html/search/enums_3.js create mode 100644 doc/html/search/enums_4.js create mode 100644 doc/html/search/enums_5.js create mode 100644 doc/html/search/enumvalues_0.js create mode 100644 doc/html/search/enumvalues_1.js create mode 100644 doc/html/search/enumvalues_2.js create mode 100644 doc/html/search/enumvalues_3.js create mode 100644 doc/html/search/enumvalues_4.js create mode 100644 doc/html/search/enumvalues_5.js create mode 100644 doc/html/search/enumvalues_6.js create mode 100644 doc/html/search/enumvalues_7.js create mode 100644 doc/html/search/enumvalues_8.js create mode 100644 doc/html/search/enumvalues_9.js create mode 100644 doc/html/search/enumvalues_a.js create mode 100644 doc/html/search/enumvalues_b.js create mode 100644 doc/html/search/enumvalues_c.js create mode 100644 doc/html/search/enumvalues_d.js create mode 100644 doc/html/search/files_0.js create mode 100644 doc/html/search/files_1.js create mode 100644 doc/html/search/files_2.js create mode 100644 doc/html/search/files_3.js create mode 100644 doc/html/search/functions_0.js create mode 100644 doc/html/search/functions_1.js create mode 100644 doc/html/search/functions_10.js create mode 100644 doc/html/search/functions_11.js create mode 100644 doc/html/search/functions_12.js create mode 100644 doc/html/search/functions_13.js create mode 100644 doc/html/search/functions_14.js create mode 100644 doc/html/search/functions_15.js create mode 100644 doc/html/search/functions_16.js create mode 100644 doc/html/search/functions_2.js create mode 100644 doc/html/search/functions_3.js create mode 100644 doc/html/search/functions_4.js create mode 100644 doc/html/search/functions_5.js create mode 100644 doc/html/search/functions_6.js create mode 100644 doc/html/search/functions_7.js create mode 100644 doc/html/search/functions_8.js create mode 100644 doc/html/search/functions_9.js create mode 100644 doc/html/search/functions_a.js create mode 100644 doc/html/search/functions_b.js create mode 100644 doc/html/search/functions_c.js create mode 100644 doc/html/search/functions_d.js create mode 100644 doc/html/search/functions_e.js create mode 100644 doc/html/search/functions_f.js create mode 100644 doc/html/search/groups_0.js create mode 100644 doc/html/search/groups_1.js create mode 100644 doc/html/search/namespaces_0.js create mode 100644 doc/html/search/pages_0.js create mode 100644 doc/html/search/pages_1.js create mode 100644 doc/html/search/pages_2.js create mode 100644 doc/html/search/pages_3.js create mode 100644 doc/html/search/pages_4.js create mode 100644 doc/html/search/pages_5.js create mode 100644 doc/html/search/related_0.js create mode 100644 doc/html/search/search.css create mode 100644 doc/html/search/search.js create mode 100644 doc/html/search/searchdata.js create mode 100644 doc/html/search/typedefs_0.js create mode 100644 doc/html/search/typedefs_1.js create mode 100644 doc/html/search/variables_0.js create mode 100644 doc/html/search/variables_1.js create mode 100644 doc/html/search/variables_2.js create mode 100644 doc/html/search/variables_3.js create mode 100644 doc/html/search/variables_4.js create mode 100644 doc/html/search/variables_5.js create mode 100644 doc/html/search/variables_6.js create mode 100644 doc/html/search/variables_7.js create mode 100644 doc/html/search/variables_8.js create mode 100644 doc/html/search/variables_9.js create mode 100644 doc/html/search/variables_a.js create mode 100644 doc/html/search/variables_b.js create mode 100644 doc/html/search/variables_c.js create mode 100644 doc/html/search/variables_d.js create mode 100644 doc/html/structadl__serializer-members.html create mode 100644 doc/html/structadl__serializer.html create mode 100644 doc/html/structdetail_1_1actual__object__comparator-members.html create mode 100644 doc/html/structdetail_1_1actual__object__comparator.html create mode 100644 doc/html/structdetail_1_1char__traits.html create mode 100644 doc/html/structdetail_1_1char__traits.png create mode 100644 doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4-members.html create mode 100644 doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4.html create mode 100644 doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4.png create mode 100644 doc/html/structdetail_1_1char__traits_3_01unsigned_01char_01_4-members.html create mode 100644 doc/html/structdetail_1_1char__traits_3_01unsigned_01char_01_4.html create mode 100644 doc/html/structdetail_1_1char__traits_3_01unsigned_01char_01_4.png create mode 100644 doc/html/structdetail_1_1conjunction.html create mode 100644 doc/html/structdetail_1_1conjunction.png create mode 100644 doc/html/structdetail_1_1conjunction_3_01_b_00_01_bn_8_8_8_01_4.html create mode 100644 doc/html/structdetail_1_1conjunction_3_01_b_00_01_bn_8_8_8_01_4.png create mode 100644 doc/html/structdetail_1_1conjunction_3_01_b_01_4.html create mode 100644 doc/html/structdetail_1_1conjunction_3_01_b_01_4.png create mode 100644 doc/html/structdetail_1_1detector-members.html create mode 100644 doc/html/structdetail_1_1detector.html create mode 100644 doc/html/structdetail_1_1detector_3_01_default_00_01void__t_3_01_op_3_01_args_8_8_8_01_4_01_4_00_01_op_00_01_args_8_8_8_01_4-members.html create mode 100644 doc/html/structdetail_1_1detector_3_01_default_00_01void__t_3_01_op_3_01_args_8_8_8_01_4_01_4_00_01_op_00_01_args_8_8_8_01_4.html create mode 100644 doc/html/structdetail_1_1has__from__json.html create mode 100644 doc/html/structdetail_1_1has__from__json.png create mode 100644 doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_c539cc270c7761d4d170d3ccbc682abe.html create mode 100644 doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_fce8b8f93d45fb838eee91b696633019.html create mode 100644 doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_fce8b8f93d45fb838eee91b696633019.png create mode 100644 doc/html/structdetail_1_1has__key__compare.html create mode 100644 doc/html/structdetail_1_1has__key__compare.png create mode 100644 doc/html/structdetail_1_1has__non__default__from__json.html create mode 100644 doc/html/structdetail_1_1has__non__default__from__json.png create mode 100644 doc/html/structdetail_1_1has__non__default__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_2d17f33a54f009ebd0a99d19cdccdb1f.html create mode 100644 doc/html/structdetail_1_1has__non__default__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_2d17f33a54f009ebd0a99d19cdccdb1f.png create mode 100644 doc/html/structdetail_1_1has__non__default__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_aba36cbb7813fd17d441db00ab087ca5.html create mode 100644 doc/html/structdetail_1_1has__to__json.html create mode 100644 doc/html/structdetail_1_1has__to__json.png create mode 100644 doc/html/structdetail_1_1has__to__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic__j28a68f7ad118503a2d1e9663db2d9323.html create mode 100644 doc/html/structdetail_1_1has__to__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic__j28a68f7ad118503a2d1e9663db2d9323.png create mode 100644 doc/html/structdetail_1_1has__to__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic__j503889e5c318926621b30ae5ed02bfe4.html create mode 100644 doc/html/structdetail_1_1integer__sequence-members.html create mode 100644 doc/html/structdetail_1_1integer__sequence.html create mode 100644 doc/html/structdetail_1_1is__basic__json.html create mode 100644 doc/html/structdetail_1_1is__basic__json.png create mode 100644 doc/html/structdetail_1_1is__basic__json_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.html create mode 100644 doc/html/structdetail_1_1is__basic__json_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.png create mode 100644 doc/html/structdetail_1_1is__basic__json__context.html create mode 100644 doc/html/structdetail_1_1is__basic__json__context.png create mode 100644 doc/html/structdetail_1_1is__compatible__array__type__impl.html create mode 100644 doc/html/structdetail_1_1is__compatible__array__type__impl.png create mode 100644 doc/html/structdetail_1_1is__compatible__array__type__impl_3_01_basic_json_type_00_01_compatible_array_ty5a05c25fff6f823ac88824a10a386dcf.html create mode 100644 doc/html/structdetail_1_1is__compatible__object__type.html create mode 100644 doc/html/structdetail_1_1is__compatible__object__type.png create mode 100644 doc/html/structdetail_1_1is__compatible__object__type__impl.html create mode 100644 doc/html/structdetail_1_1is__compatible__object__type__impl.png create mode 100644 doc/html/structdetail_1_1is__compatible__object__type__impl_3_01_basic_json_type_00_01_compatible_object_c9788cfc69b1e1eda6ea05aee660649a.html create mode 100644 doc/html/structdetail_1_1is__compatible__object__type__impl_3_01_basic_json_type_00_01_compatible_object_c9788cfc69b1e1eda6ea05aee660649a.png create mode 100644 doc/html/structdetail_1_1is__compatible__object__type__impl_3_01_basic_json_type_00_01_compatible_object_c9e009318704dfde4a68cc4f322bd23d.html create mode 100644 doc/html/structdetail_1_1is__compatible__string__type-members.html create mode 100644 doc/html/structdetail_1_1is__compatible__string__type.html create mode 100644 doc/html/structdetail_1_1is__complete__type.html create mode 100644 doc/html/structdetail_1_1is__complete__type.png create mode 100644 doc/html/structdetail_1_1is__complete__type_3_01_t_00_01decltype_07void_07sizeof_07_t_08_08_08_4.html create mode 100644 doc/html/structdetail_1_1is__complete__type_3_01_t_00_01decltype_07void_07sizeof_07_t_08_08_08_4.png create mode 100644 doc/html/structdetail_1_1is__constructible.html create mode 100644 doc/html/structdetail_1_1is__constructible.png create mode 100644 doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__constructible__object__type.html create mode 100644 doc/html/structdetail_1_1is__constructible__object__type.png create mode 100644 doc/html/structdetail_1_1is__constructible__object__type__impl.html create mode 100644 doc/html/structdetail_1_1is__constructible__object__type__impl.png create mode 100644 doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_o47d3f1d858163de67321be81dde3c5a8.html create mode 100644 doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_oe3af2486927b63ecadb7a7d2ea385f2a.html create mode 100644 doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_oe3af2486927b63ecadb7a7d2ea385f2a.png create mode 100644 doc/html/structdetail_1_1is__constructible__string__type-members.html create mode 100644 doc/html/structdetail_1_1is__constructible__string__type.html create mode 100644 doc/html/structdetail_1_1is__default__constructible.html create mode 100644 doc/html/structdetail_1_1is__default__constructible.png create mode 100644 doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__default__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__default__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__default__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__default__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__detected__lazy.html create mode 100644 doc/html/structdetail_1_1is__detected__lazy.png create mode 100644 doc/html/structdetail_1_1is__getable-members.html create mode 100644 doc/html/structdetail_1_1is__getable.html create mode 100644 doc/html/structdetail_1_1is__iterator__traits.html create mode 100644 doc/html/structdetail_1_1is__iterator__traits.png create mode 100644 doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4-members.html create mode 100644 doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__json__ref.html create mode 100644 doc/html/structdetail_1_1is__json__ref.png create mode 100644 doc/html/structdetail_1_1is__json__ref_3_01json__ref_3_01_t_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1is__json__ref_3_01json__ref_3_01_t_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1is__range-members.html create mode 100644 doc/html/structdetail_1_1is__range.html create mode 100644 doc/html/structdetail_1_1iterator__traits.html create mode 100644 doc/html/structdetail_1_1iterator__traits_3_01_t_00_01enable__if__t_3_01_9std_1_1is__pointer_3_01_t_01_4_1_1value_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1iterator__traits_3_01_t_00_01enable__if__t_3_01_9std_1_1is__pointer_3_01_t_01_4_1_1value_01_4_01_4.png create mode 100644 doc/html/structdetail_1_1iterator__traits_3_01_t_01_5_00_01enable__if__t_3_01std_1_1is__object_3_01_t_01_4_1_1value_01_4_01_4-members.html create mode 100644 doc/html/structdetail_1_1iterator__traits_3_01_t_01_5_00_01enable__if__t_3_01std_1_1is__object_3_01_t_01_4_1_1value_01_4_01_4.html create mode 100644 doc/html/structdetail_1_1iterator__types.html create mode 100644 doc/html/structdetail_1_1iterator__types_3_01_it_00_01void__t_3_01typename_01_it_1_1difference__type_00_064dac4a14931e9e3b7bc8e1311de4a39.html create mode 100644 doc/html/structdetail_1_1iterator__types_3_01_it_00_01void__t_3_01typename_01_it_1_1difference__type_00_0e94592c78302fc510e0aa24e9e691b9b.html create mode 100644 doc/html/structdetail_1_1make__void-members.html create mode 100644 doc/html/structdetail_1_1make__void.html create mode 100644 doc/html/structdetail_1_1negation.html create mode 100644 doc/html/structdetail_1_1negation.png create mode 100644 doc/html/structdetail_1_1nonesuch-members.html create mode 100644 doc/html/structdetail_1_1nonesuch.html create mode 100644 doc/html/structdetail_1_1position__t-members.html create mode 100644 doc/html/structdetail_1_1position__t.html create mode 100644 doc/html/structdetail_1_1priority__tag.html create mode 100644 doc/html/structdetail_1_1priority__tag_3_010_01_4.html create mode 100644 doc/html/structdetail_1_1static__const-members.html create mode 100644 doc/html/structdetail_1_1static__const.html create mode 100644 doc/html/structjson__sax-members.html create mode 100644 doc/html/structjson__sax.html create mode 100644 doc/html/structmce_1_1_coroutine_scheduler_1_1_task-members.html create mode 100644 doc/html/structmce_1_1_coroutine_scheduler_1_1_task.html create mode 100644 doc/html/structmce_1_1_coroutine_scheduler_1_1_task.js create mode 100644 doc/html/structmce_1_1_i_event-members.html create mode 100644 doc/html/structmce_1_1_i_event.html create mode 100644 doc/html/structmce_1_1_i_event.png create mode 100644 doc/html/structmce_1_1_subscription_token-members.html create mode 100644 doc/html/structmce_1_1_subscription_token.html create mode 100644 doc/html/structmce_1_1_subscription_token.js create mode 100644 doc/html/structmce_1_1_thread_func-members.html create mode 100644 doc/html/structmce_1_1_thread_func.html create mode 100644 doc/html/structmce_1_1_thread_func.js create mode 100644 doc/html/structmce_1_1_thread_func.png create mode 100644 doc/html/structmce_1_1_thread_functor-members.html create mode 100644 doc/html/structmce_1_1_thread_functor.html create mode 100644 doc/html/structmce_1_1_thread_functor.js create mode 100644 doc/html/structmce_1_1_thread_functor.png create mode 100644 doc/html/structmce_1_1_thread_manager_1_1_thread_info-members.html create mode 100644 doc/html/structmce_1_1_thread_manager_1_1_thread_info.html create mode 100644 doc/html/structmce_1_1_thread_manager_1_1_thread_info.js create mode 100644 doc/html/structmce_1_1_thread_member_functor-members.html create mode 100644 doc/html/structmce_1_1_thread_member_functor.html create mode 100644 doc/html/structmce_1_1_thread_member_functor.js create mode 100644 doc/html/structmce_1_1_thread_member_functor.png create mode 100644 doc/html/structmce_1_1_thread_member_functor_with_args-members.html create mode 100644 doc/html/structmce_1_1_thread_member_functor_with_args.html create mode 100644 doc/html/structmce_1_1_thread_member_functor_with_args.js create mode 100644 doc/html/structmce_1_1_thread_member_functor_with_args.png create mode 100644 doc/html/structmce_1_1_virtual_file_system_1_1_config-members.html create mode 100644 doc/html/structmce_1_1_virtual_file_system_1_1_config.html create mode 100644 doc/html/structmce_1_1_virtual_file_system_1_1_config.js create mode 100644 doc/html/structmce_1_1event_1_1_logger_output-members.html create mode 100644 doc/html/structmce_1_1event_1_1_logger_output.html create mode 100644 doc/html/structmce_1_1event_1_1_logger_output.png create mode 100644 doc/html/structmce_1_1event_1_1_thread_finished-members.html create mode 100644 doc/html/structmce_1_1event_1_1_thread_finished.html create mode 100644 doc/html/structmce_1_1event_1_1_thread_finished.png create mode 100644 doc/html/structmce_1_1event_1_1_thread_started-members.html create mode 100644 doc/html/structmce_1_1event_1_1_thread_started.html create mode 100644 doc/html/structmce_1_1event_1_1_thread_started.png create mode 100644 doc/html/structordered__map.html create mode 100644 doc/html/structstring__t__helper-members.html create mode 100644 doc/html/structstring__t__helper.html create mode 100644 doc/html/structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4-members.html create mode 100644 doc/html/structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.html create mode 100644 doc/html/tabs.css create mode 100644 doc/html/todo.html create mode 100644 doc/html/topics.html create mode 100644 doc/html/topics.js create mode 100644 doc/html/unionmce_1_1_virtual_file_system_1_1_version-members.html create mode 100644 doc/html/unionmce_1_1_virtual_file_system_1_1_version.html create mode 100644 doc/html/unionmce_1_1_virtual_file_system_1_1_version.js diff --git a/doc/html/_assert_8hpp_source.html b/doc/html/_assert_8hpp_source.html new file mode 100644 index 0000000..66a53e4 --- /dev/null +++ b/doc/html/_assert_8hpp_source.html @@ -0,0 +1,124 @@ + + + + + + + +Minecraft Community Edition: Common/Assert.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Assert.hpp
+
+
+
1#pragma once
+
2
+
3#include "IO/Logger.hpp"
+
4#include "Platform.hpp"
+
5
+
6#ifndef NDEBUG
+
7#ifdef MCE_PLATFORM_WINDOWS
+
8#define MCE_DEBUGBREAK() __debugbreak()
+
9#elif defined(MCE_PLATFORM_MACOS) || defined(MCE_PLATFORM_LINUX)
+
10#include <signal.h>
+
11#define MCE_DEBUGBREAK() raise(SIGTRAP)
+
12#endif
+
13
+
14#define MCE_ASSERT(check, ...) { if (!(check)) { MCE_ERROR(__VA_ARGS__); MCE_DEBUGBREAK(); } }
+
15#else
+
16#define MCE_DEBUGBREAK()
+
17#define MCE_ASSERT(...)
+
18#endif
+
+
+
+ + + + diff --git a/doc/html/_coroutine_scheduler_8hpp.html b/doc/html/_coroutine_scheduler_8hpp.html new file mode 100644 index 0000000..2a2b315 --- /dev/null +++ b/doc/html/_coroutine_scheduler_8hpp.html @@ -0,0 +1,133 @@ + + + + + + + +Minecraft Community Edition: Core/CoroutineScheduler.hpp File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
CoroutineScheduler.hpp File Reference
+
+
+ +

Simple coroutine scheduler that runs periodic callbacks using SFML time utilities. +More...

+
#include <mutex>
+#include <SFML/System/Clock.hpp>
+#include <SFML/System/Time.hpp>
+#include <EASTL/functional.h>
+#include <EASTL/vector.h>
+
+

Go to the source code of this file.

+ + + + + + +

+Classes

class  mce::CoroutineScheduler
 Coroutine scheduler that manages periodic tasks. More...
struct  mce::CoroutineScheduler::Task
 Represents a single scheduled task. More...
+

Detailed Description

+

Simple coroutine scheduler that runs periodic callbacks using SFML time utilities.

+
+
+ +
+ + + + diff --git a/doc/html/_coroutine_scheduler_8hpp.js b/doc/html/_coroutine_scheduler_8hpp.js new file mode 100644 index 0000000..5ddb44f --- /dev/null +++ b/doc/html/_coroutine_scheduler_8hpp.js @@ -0,0 +1,5 @@ +var _coroutine_scheduler_8hpp = +[ + [ "mce::CoroutineScheduler", "classmce_1_1_coroutine_scheduler.html", "classmce_1_1_coroutine_scheduler" ], + [ "mce::CoroutineScheduler::Task", "structmce_1_1_coroutine_scheduler_1_1_task.html", "structmce_1_1_coroutine_scheduler_1_1_task" ] +]; \ No newline at end of file diff --git a/doc/html/_coroutine_scheduler_8hpp_source.html b/doc/html/_coroutine_scheduler_8hpp_source.html new file mode 100644 index 0000000..0aa8411 --- /dev/null +++ b/doc/html/_coroutine_scheduler_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +Minecraft Community Edition: Core/CoroutineScheduler.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
CoroutineScheduler.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2#include <mutex>
+
3#include <SFML/System/Clock.hpp>
+
4#include <SFML/System/Time.hpp>
+
5#include <EASTL/functional.h>
+
6#include <EASTL/vector.h>
+
7
+
12
+
13namespace mce {
+
+ +
32 public:
+
39 using Callback = eastl::function<sf::Time()>;
+
40
+
44 CoroutineScheduler() = default;
+ +
46
+
+
53 struct Task {
+ +
55 sf::Time interval;
+
56 sf::Clock clock;
+
57 };
+
+
58
+
66 void addTask(Callback cb);
+
67
+
76 void processTasks();
+
77 private:
+
78 std::mutex tasksMutex;
+
79 eastl::vector<Task> vecTasks;
+
80
+
81 sf::Clock clock;
+
82 };
+
+
83}
+
84
+
CoroutineScheduler()=default
Default constructor.
+
void processTasks()
Process all scheduled tasks.
Definition CoroutineScheduler.cpp:20
+
void addTask(Callback cb)
Add a task to the scheduler.
Definition CoroutineScheduler.cpp:10
+
eastl::function< sf::Time()> Callback
Callback type invoked by scheduled tasks.
Definition CoroutineScheduler.hpp:39
+
Represents a single scheduled task.
Definition CoroutineScheduler.hpp:53
+
sf::Clock clock
Definition CoroutineScheduler.hpp:56
+
Callback callback
Definition CoroutineScheduler.hpp:54
+
sf::Time interval
Definition CoroutineScheduler.hpp:55
+
+
+
+ + + + diff --git a/doc/html/_file_input_stream_8hpp_source.html b/doc/html/_file_input_stream_8hpp_source.html new file mode 100644 index 0000000..fd55a32 --- /dev/null +++ b/doc/html/_file_input_stream_8hpp_source.html @@ -0,0 +1,163 @@ + + + + + + + +Minecraft Community Edition: IO/Stream/FileInputStream.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
FileInputStream.hpp
+
+
+
1#pragma once
+
2
+
3#include "..\..\Common\Platform.hpp"
+
4#include <fstream>
+
5
+
6#include "InputStream.hpp"
+
7
+
8#include <EASTL/string_view.h>
+
9
+
10#ifdef MCE_PLATFORM_WINDOWS
+
11#ifdef INVALID_FILE_SIZE
+
12#undef INVALID_FILE_SIZE
+
13#endif
+
14#endif
+
15
+
16namespace mce {
+
+
17 class FileInputStream final : public InputStream {
+
18 public:
+
19 FileInputStream();
+
20 ~FileInputStream();
+
25 //explicit FileInputStream(eastl::string_view file);
+
26
+
31 bool open(const std::string& file);
+
32
+
36 bool isOpen() const;
+
37
+
41 void close();
+
42
+
49 size_t read(void* buffer, size_t size) override;
+
50
+
56 size_t seek(size_t position) override;
+
57
+
61 size_t tell() override;
+
62
+
66 size_t getSize() override;
+
67
+
68 static inline constexpr size_t FILE_NOT_FOUND = 0;
+
69 static inline constexpr size_t INVALID_FILE_SIZE = ~(0);
+
70 static inline constexpr size_t INVALID_FILE_POSITION = ~(0);
+
71 private:
+
72#ifdef MCE_PLATFORM_WINDOWS
+
73 void* __ptr64 hFile = nullptr;
+
74#elif defined(MCE_PLATFORM_LINUX) || defined(MCE_PLATFORM_MACOS)
+
75 std::FILE* file;
+
76#endif
+
77 };
+
+
78}
+
bool isOpen() const
+
size_t getSize() override
+
bool open(const std::string &file)
Constructs the stream and opens a file.
+
size_t tell() override
+
size_t read(void *buffer, size_t size) override
Reads from the input stream.
+
size_t seek(size_t position) override
Changes the current position the stream is reading.
+
void close()
Closes the file.
+
Definition InputStream.hpp:6
+
+
+
+ + + + diff --git a/doc/html/_file_output_stream_8hpp_source.html b/doc/html/_file_output_stream_8hpp_source.html new file mode 100644 index 0000000..dcbe44f --- /dev/null +++ b/doc/html/_file_output_stream_8hpp_source.html @@ -0,0 +1,160 @@ + + + + + + + +Minecraft Community Edition: IO/Stream/FileOutputStream.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
FileOutputStream.hpp
+
+
+
1#pragma once
+
2#include "..\..\Common\Platform.hpp"
+
3#include "OutputStream.hpp"
+
4#ifdef MCE_PLATFORM_WINDOWS
+
5#undef INVALID_FILE_SIZE
+
6#endif
+
7
+
8#include <string>
+
9#include <cstdio>
+
10
+
11namespace mce {
+
+
18 class FileOutputStream final : public OutputStream {
+
19 public:
+
23 FileOutputStream() = default;
+
24
+
30 bool open(const std::string& file);
+
31
+
36 bool isOpen() const;
+
37
+
41 void close();
+
42
+
49 size_t write(const void* buffer, size_t size) override;
+
50
+
56 size_t seek(size_t position) override;
+
57
+
62 size_t tell() override;
+
63
+
68 size_t getSize() override;
+
69
+
76 static inline constexpr size_t INVALID_FILE_SIZE = ~(0);
+
77
+
81 static inline constexpr size_t INVALID_FILE_POSITION = ~(0);
+
82
+
83 private:
+
84#ifdef MCE_PLATFORM_WINDOWS
+
91 void* hFile = nullptr;
+
92#elif defined(MCE_PLATFORM_LINUX) || defined(MCE_PLATFORM_MACOS)
+
96 std::FILE* file = nullptr;
+
97#endif
+
98 };
+
+
99}
+
FileOutputStream()=default
Default constructor.
+
static constexpr size_t INVALID_FILE_SIZE
Constant indicating an invalid file size/position.
Definition FileOutputStream.hpp:76
+
size_t getSize() override
Get the total size of the underlying file in bytes.
+
void close()
Close the file and release any resources.
+
static constexpr size_t INVALID_FILE_POSITION
Constant indicating an invalid file position.
Definition FileOutputStream.hpp:81
+
size_t seek(size_t position) override
Change the current write position in the file.
+
size_t tell() override
Get the current write position in the file.
+
size_t write(const void *buffer, size_t size) override
Write bytes to the file.
+
bool open(const std::string &file)
Opens a file for writing (creates/truncates by default).
+
bool isOpen() const
Query whether the underlying file handle is open.
+
Definition OutputStream.hpp:6
+
+
+
+ + + + diff --git a/doc/html/_function_container_8hpp_source.html b/doc/html/_function_container_8hpp_source.html new file mode 100644 index 0000000..23f5fd5 --- /dev/null +++ b/doc/html/_function_container_8hpp_source.html @@ -0,0 +1,197 @@ + + + + + + + +Minecraft Community Edition: Core/FunctionContainer.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
FunctionContainer.hpp
+
+
+
1#pragma once
+
2#include "EASTL/initializer_list.h"
+
3#include "EASTL/string.h"
+
4#include "EASTL/any.h"
+
5#include "EASTL/unordered_map.h"
+
6#include "EASTL/functional.h"
+
7#include "..\IO\Logger.hpp"
+
8#include <source_location>
+
9
+
10namespace mce {
+
+ +
33 public:
+
37 FunctionContainer() = default;
+
38
+
47 FunctionContainer(QEventBus& qBus, std::initializer_list<std::pair<eastl::string, eastl::any>> initlist);
+
48
+
60 template<typename Functor>
+
61 void addFunction(const eastl::string& name, Functor functor);
+
62
+
78 template<typename Return, typename... Arguments>
+
79 Return callFunction(const eastl::string& name, Arguments&&... args);
+
80
+
87 bool findFunction(const eastl::string& name);
+
88
+
102 template<typename Return, typename... Arguments>
+
103 eastl::function<Return(Arguments...)> operator[](const eastl::string& name);
+
104
+
116 template<typename Return, typename... Arguments>
+
117 eastl::function<Return(Arguments...)> getFunction(const eastl::string& name);
+
118 private:
+
120 eastl::unordered_map<eastl::string, eastl::any> functions;
+
121 QEventBus& qBus;
+
122 };
+
+
123
+
124 // Template implementations
+
130 template<typename Functor>
+
+
131 inline void FunctionContainer::addFunction(const eastl::string& name, Functor functor) {
+
132 FunctionContainer::functions[name] = functor;
+
133 }
+
+
134
+
140 template<typename Return, typename ...Arguments>
+
+
141 inline Return FunctionContainer::callFunction(const eastl::string& name, Arguments && ...args) {
+
142 if (FunctionContainer::functions.find(name) != FunctionContainer::functions.end()) {
+
143 auto& func = FunctionContainer::functions[name];
+
144 auto castedFunc = eastl::any_cast<eastl::function<Return(Arguments...)>>(func);
+
145 return castedFunc(eastl::forward<Arguments>(args)...);
+
146 }
+
147 else {
+
148 MCE_ERROR("Function \"{}\" not found! File:", name);
+
149 }
+
150 }
+
+
151
+
157 template<typename Return, typename ...Arguments>
+
+
158 inline eastl::function<Return(Arguments...)> FunctionContainer::operator[](const eastl::string& name) {
+
159 if (FunctionContainer::functions.find(name) != FunctionContainer::functions.end()) {
+
160 return eastl::any_cast<eastl::function<Return(Arguments...)>>(FunctionContainer::functions[name]);
+
161 }
+
162 else {
+
163 MCE_ERROR("Function \"{}\" not found! File:", name);
+
164 return nullptr;
+
165 }
+
166 }
+
+
167
+
173 template<typename Return, typename ...Arguments>
+
+
174 inline eastl::function<Return(Arguments...)> FunctionContainer::getFunction(const eastl::string& name) {
+
175 if (FunctionContainer::functions.find(name) != FunctionContainer::functions.end()) {
+
176 return eastl::any_cast<eastl::function<Return(Arguments...)>>(FunctionContainer::functions[name]);
+
177 }
+
178 else {
+
179 MCE_ERROR("Function \"{}\" not found! File:", name);
+
180 return nullptr;
+
181 }
+
182 }
+
+
183}
+
Return callFunction(const eastl::string &name, Arguments &&... args)
Call a stored function by name with the provided arguments.
Definition FunctionContainer.hpp:141
+
eastl::function< Return(Arguments...)> getFunction(const eastl::string &name)
Retrieve a stored function as an eastl::function.
Definition FunctionContainer.hpp:174
+
eastl::function< Return(Arguments...)> operator[](const eastl::string &name)
Retrieve a stored function as an eastl::function via operator[].
Definition FunctionContainer.hpp:158
+
void addFunction(const eastl::string &name, Functor functor)
Add a function to the container.
Definition FunctionContainer.hpp:131
+
FunctionContainer()=default
Default constructor.
+
bool findFunction(const eastl::string &name)
Check whether a function with the given name exists in the container.
Definition FunctionContainer.cpp:10
+
Thread-safe event bus.
Definition QEventBus.hpp:58
+
+
+
+ + + + diff --git a/doc/html/_g_l_graphics_context_8hpp_source.html b/doc/html/_g_l_graphics_context_8hpp_source.html new file mode 100644 index 0000000..955beb7 --- /dev/null +++ b/doc/html/_g_l_graphics_context_8hpp_source.html @@ -0,0 +1,121 @@ + + + + + + + +Minecraft Community Edition: Graphics/OpenGL/GLGraphicsContext.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GLGraphicsContext.hpp
+
+
+
1#pragma once
+
2#include "Graphics/GraphicsContext.hpp"
+
3
+
4namespace mce {
+
+
5 class GLGraphicsContext final : public GraphicsContext {
+
6 public:
+
7 GLGraphicsContext();
+
8 ~GLGraphicsContext() override;
+
9
+
10 eastl::unique_ptr<Renderer> createRenderer(sf::Window& window) override;
+
11 };
+
+
12}
+
Definition GraphicsContext.hpp:11
+
+
+
+ + + + diff --git a/doc/html/_g_l_renderer_8hpp_source.html b/doc/html/_g_l_renderer_8hpp_source.html new file mode 100644 index 0000000..64ccce3 --- /dev/null +++ b/doc/html/_g_l_renderer_8hpp_source.html @@ -0,0 +1,138 @@ + + + + + + + +Minecraft Community Edition: Graphics/OpenGL/GLRenderer.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GLRenderer.hpp
+
+
+
1#pragma once
+
2
+
3#include <cstdint>
+
4
+
5#include "Graphics/Renderer.hpp"
+
6
+
7namespace sf {
+
8 class Window;
+
9}
+
10
+
11namespace mce {
+
+
12 class GLRenderer final : public Renderer {
+
13 public:
+
14 GLRenderer(sf::Window& window);
+
15 ~GLRenderer() override;
+
16
+
17 void renderFrame() override;
+
18 private:
+
19 static void logIfFailed(uint32_t shader);
+
20
+
21 sf::Window& window;
+
22
+
23 uint32_t vao = 0;
+
24
+
25 uint32_t vbo = 0;
+
26 uint32_t colorVbo = 0;
+
27 uint32_t program = 0;
+
28 };
+
+
29}
+
Definition Renderer.hpp:4
+
+
+
+ + + + diff --git a/doc/html/_graphics_context_8hpp_source.html b/doc/html/_graphics_context_8hpp_source.html new file mode 100644 index 0000000..d690cee --- /dev/null +++ b/doc/html/_graphics_context_8hpp_source.html @@ -0,0 +1,133 @@ + + + + + + + +Minecraft Community Edition: Graphics/GraphicsContext.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
GraphicsContext.hpp
+
+
+
1#pragma once
+
2#include "EASTL/unique_ptr.h"
+
3
+
4namespace sf {
+
5 class Window;
+
6}
+
7
+
8namespace mce {
+
9 class Renderer;
+
10
+
+ +
12 public:
+
13 enum class API {
+
14 OpenGL,
+
15 Vulkan,
+
16 };
+
17
+
18 virtual ~GraphicsContext();
+
19 virtual eastl::unique_ptr<Renderer> createRenderer(sf::Window& window) = 0;
+
20
+
21 static eastl::unique_ptr<GraphicsContext> create(API api);
+
22 };
+
+
23}
+
Definition GraphicsContext.hpp:11
+
Definition Renderer.hpp:4
+
+
+
+ + + + diff --git a/doc/html/_i_event_8hpp_source.html b/doc/html/_i_event_8hpp_source.html new file mode 100644 index 0000000..2fc01aa --- /dev/null +++ b/doc/html/_i_event_8hpp_source.html @@ -0,0 +1,167 @@ + + + + + + + +Minecraft Community Edition: Core/IEvent.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
IEvent.hpp
+
+
+
1#pragma once
+
2#include <source_location>
+
3
+
4#include <EASTL/optional.h>
+
5#include <EASTL/shared_ptr.h>
+
6#include <EASTL/string.h>
+
7#include "..\Common\Platform.hpp"
+
8#ifdef MCE_PLATFORM_WINDOWS
+
9#undef ERROR
+
10#endif
+
11
+
12namespace mce {
+
13 class Thread;
+
+
14 struct IEvent {
+
15 virtual ~IEvent() = default;
+
16 [[nodiscard]] virtual const char const* name() const = 0;
+
17 };
+
+
18
+
19 namespace event {
+
+
20 struct LoggerOutput : IEvent {
+
21 enum class Severity {
+
22 INFO,
+
23 WARN,
+
24 ERROR,
+
25 DEBUG,
+
26 FATAL //Maybe
+
27 };
+
28 Severity severity;
+
29 std::string msg;
+
30 eastl::optional<std::source_location> location;
+
31
+
32 explicit LoggerOutput(Severity s = Severity::INFO, const std::string m = "", eastl::optional<std::source_location> loc = eastl::nullopt)
+
33 : severity(s), msg(m), location(loc) {}
+
34
+
35 [[nodiscard]] virtual const char const* name() const override { return "mce.core.event.logger_output"; }
+
36 };
+
+
37
+
+
38 struct ThreadFinished : IEvent {
+
39 ThreadFinished(Thread* ptr) : thread(ptr) {}
+
40 Thread* thread;
+
41 virtual const char const* name() const override { return "mce.core.event.thread_finished"; }
+
42 };
+
+
43
+
+
44 struct ThreadStarted : IEvent {
+
45 ThreadStarted(Thread const* p, const eastl::string& n) : threadPtr(p), threadName(n) {}
+
46 Thread const* threadPtr;
+
47 const eastl::string threadName;
+
48 virtual const char const* name() const override { return "mce.core.event.thread_started"; }
+
49 };
+
+
50 }
+
51}
+
Lightweight high-level thread wrapper.
Definition Thread.hpp:134
+
Definition IEvent.hpp:14
+
+
+
+ + + + diff --git a/doc/html/_input_stream_8hpp_source.html b/doc/html/_input_stream_8hpp_source.html new file mode 100644 index 0000000..9febc51 --- /dev/null +++ b/doc/html/_input_stream_8hpp_source.html @@ -0,0 +1,131 @@ + + + + + + + +Minecraft Community Edition: IO/Stream/InputStream.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
InputStream.hpp
+
+
+
1#pragma once
+
2
+
3#include <cstdint>
+
4
+
5namespace mce {
+
+
6 class InputStream {
+
7 public:
+
8 virtual ~InputStream() = 0;
+
9
+
16 virtual size_t read(void* buffer, size_t size) = 0;
+
17
+
23 virtual size_t seek(size_t position) = 0;
+
24
+
28 virtual size_t tell() = 0;
+
29
+
33 virtual size_t getSize() = 0;
+
34 };
+
+
35}
+
Definition InputStream.hpp:6
+
virtual size_t tell()=0
+
virtual size_t seek(size_t position)=0
Changes the current position the stream is reading.
+
virtual size_t read(void *buffer, size_t size)=0
Reads from the input stream.
+
virtual size_t getSize()=0
+
+
+
+ + + + diff --git a/doc/html/_logger_8hpp_source.html b/doc/html/_logger_8hpp_source.html new file mode 100644 index 0000000..4109e54 --- /dev/null +++ b/doc/html/_logger_8hpp_source.html @@ -0,0 +1,226 @@ + + + + + + + +Minecraft Community Edition: IO/Logger.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Logger.hpp
+
+
+
1#pragma once
+
2
+
3#include <sstream>
+
4#include <string>
+
5#include <format>
+
6#include <source_location>
+
7
+
8#include "EASTL/shared_ptr.h"
+
9#include "EASTL/vector.h"
+
10
+
11#include "Core/QEventBus.hpp"
+
12#include "Core/IEvent.hpp"
+
13
+
14#define MCE_LOGGER_SET_QEVENTBUS 0
+
15
+
16#ifndef NDEBUG
+
17#define MCE_INFO(...) mce::Logger::getGlobalLogger(qBus).info(__VA_ARGS__)
+
18#define MCE_WARN(...) mce::Logger::getGlobalLogger(qBus).warn(__VA_ARGS__)
+
19#define MCE_ERROR(...) mce::Logger::getGlobalLogger(qBus).error(__VA_ARGS__)
+
20#define MCE_DEBUG(...) mce::Logger::getGlobalLogger(qBus).debug(__VA_ARGS__)
+
21#define MCE_INFO_TRACE(...) mce::Logger::getGlobalLogger(qBus).info_trace(std::source_location::current(), __VA_ARGS__)
+
22#define MCE_WARN_TRACE(...) mce::Logger::getGlobalLogger(qBus).warn_trace(std::source_location::current(), __VA_ARGS__)
+
23#define MCE_ERROR_TRACE(...) mce::Logger::getGlobalLogger(qBus).error_trace(std::source_location::current(), __VA_ARGS__)
+
24#define MCE_DEBUG_TRACE(...) mce::Logger::getGlobalLogger(qBus).debug_trace(std::source_location::current(), __VA_ARGS__)
+
25#else
+
26#define MCE_INFO(...)
+
27#define MCE_WARN(...)
+
28#define MCE_ERROR(...)
+
29#define MCE_DEBUG(...)
+
30#define MCE_INFO_TRACE(...)
+
31#define MCE_WARN_TRACE(...)
+
32#define MCE_ERROR_TRACE(...)
+
33#define MCE_DEBUG_TRACE(...)
+
34#endif
+
35
+
36namespace mce {
+
37 class LoggerSink;
+
38
+
39 enum class LogLevel {
+
40 INFO,
+
41 WARN,
+
42 ERROR,
+
43 DEBUG,
+
44 };
+
45
+
+
46 class Logger {
+
47 public:
+
48 explicit Logger(QEventBus& qBus, std::string_view name, bool createStdoutSink = true);
+
49
+
50 void addSink(const eastl::shared_ptr<LoggerSink>& sink);
+
51 void log(LogLevel level, std::string_view message, eastl::optional<std::source_location> location = eastl::nullopt);
+
52
+
53 template <typename... Args>
+
54 void info(std::format_string<Args...> format, Args&&... args) {
+
55 log(LogLevel::INFO, std::format(format, std::forward<Args>(args)...));
+
56 }
+
57
+
58 template <typename... Args>
+
59 void warn(std::format_string<Args...> format, Args&&... args) {
+
60 log(LogLevel::WARN, std::format(format, std::forward<Args>(args)...));
+
61 }
+
62
+
63 template <typename... Args>
+
64 void error(std::format_string<Args...> format, Args&&... args) {
+
65 log(LogLevel::ERROR, std::format(format, std::forward<Args>(args)...));
+
66 }
+
67
+
68 template <typename... Args>
+
69 void debug(std::format_string<Args...> format, Args&&... args) {
+
70 log(LogLevel::DEBUG, std::format(format, std::forward<Args>(args)...));
+
71 }
+
72
+
73 template <typename... Args>
+
74 void info_trace(const std::source_location& location, std::format_string<Args...> format, Args&&... args) {
+
75 log(LogLevel::INFO, std::format(format, std::forward<Args>(args)...), location);
+
76 }
+
77
+
78 template <typename... Args>
+
79 void warn_trace(const std::source_location& location, std::format_string<Args...> format, Args&&... args) {
+
80 log(LogLevel::WARN, std::format(format, std::forward<Args>(args)...), location);
+
81 }
+
82
+
83 template <typename... Args>
+
84 void error_trace(const std::source_location& location, std::format_string<Args...> format, Args&&... args) {
+
85 log(LogLevel::ERROR, std::format(format, std::forward<Args>(args)...), location);
+
86 }
+
87
+
88 template <typename... Args>
+
89 void debug_trace(const std::source_location& location, std::format_string<Args...> format, Args&&... args) {
+
90 log(LogLevel::DEBUG, std::format(format, std::forward<Args>(args)...), location);
+
91 }
+
92
+
93 //static QEventBus& getGlobalEventBus();
+
94 static Logger& getGlobalLogger(QEventBus& qBus);
+
95 private:
+
96 /*class LoggerEventBus : public QEventBus {
+
97 public:
+
98 LoggerEventBus();
+
99 };*/
+
100
+
101 void logCallback(const event::LoggerOutput& e);
+
102 static std::string getFormattedSource(const std::source_location& location);
+
103
+
104 static std::string GetFormattedTime();
+
105 const size_t MAX_LOG_EVENTS = 10000;
+
106 std::string name;
+
107
+
108 eastl::vector<eastl::shared_ptr<LoggerSink>> sinks;
+
109 QEventBus& qBus;
+
110
+
111 SubscriptionToken busSubscription;
+
112 };
+
+
113}
+
Thread-safe event bus.
+
Definition LoggerSinks.hpp:16
+
Thread-safe event bus.
Definition QEventBus.hpp:58
+
Token object that controls the lifetime of an event subscription.
Definition QEventBus.hpp:27
+
Definition IEvent.hpp:20
+
+
+
+ + + + diff --git a/doc/html/_logger_sinks_8hpp_source.html b/doc/html/_logger_sinks_8hpp_source.html new file mode 100644 index 0000000..2b06c28 --- /dev/null +++ b/doc/html/_logger_sinks_8hpp_source.html @@ -0,0 +1,150 @@ + + + + + + + +Minecraft Community Edition: IO/LoggerSinks.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
LoggerSinks.hpp
+
+
+
1#pragma once
+
2
+
3#include <fstream>
+
4#include <string>
+
5#include <string_view>
+
6
+
7#include <EABase/config/eacompilertraits.h>
+
8// Overriding literal operators is deprecated in C++17
+
9// EASTL still does this in some headers
+
10EA_DISABLE_GCC_WARNING(-Wdeprecated-literal-operator)
+
11#include <EASTL/string_view.h>
+
12
+
13namespace mce {
+
14 enum class LogLevel;
+
15
+
+
16 class LoggerSink {
+
17 public:
+
18 virtual ~LoggerSink() = default;
+
19 virtual void log(std::string_view prettyMessage, std::string_view basicMessage) = 0;
+
20 };
+
+
21
+
+
22 class StdoutSink final : public LoggerSink {
+
23 public:
+
24 void log(std::string_view prettyMessage, std::string_view basicMessage) override;
+
25 };
+
+
26
+
+
27 class FileSink final : public LoggerSink {
+
28 public:
+
29 explicit FileSink(std::string_view filename);
+
30
+
31 void log(std::string_view prettyMessage, std::string_view basicMessage) override;
+
32 private:
+
33 std::string filename;
+
34 std::ofstream file;
+
35 };
+
+
36}
+
Definition LoggerSinks.hpp:16
+
Definition LoggerSinks.hpp:22
+
+
+
+ + + + diff --git a/doc/html/_memory_input_stream_8hpp_source.html b/doc/html/_memory_input_stream_8hpp_source.html new file mode 100644 index 0000000..f2fa98b --- /dev/null +++ b/doc/html/_memory_input_stream_8hpp_source.html @@ -0,0 +1,141 @@ + + + + + + + +Minecraft Community Edition: IO/Stream/MemoryInputStream.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
MemoryInputStream.hpp
+
+
+
1#pragma once
+
2#include "InputStream.hpp"
+
3
+
4namespace mce {
+
+
13 class MemoryInputStream final : public InputStream {
+
14 public:
+
20 MemoryInputStream(const void* data, size_t size);
+
21
+
28 virtual size_t read(void* buffer, size_t size) override;
+
29
+
42 size_t readString(char*& buffer, size_t& size);
+
43
+
49 virtual size_t seek(size_t position) override;
+
50
+
55 virtual size_t tell() override;
+
56
+
61 virtual size_t getSize() override;
+
62
+
63 private:
+
67 const char* data = nullptr;
+
68
+
72 size_t size;
+
73
+
77 size_t offset; // the reading position
+
78 };
+
+
79}
+
Definition InputStream.hpp:6
+
virtual size_t read(void *buffer, size_t size) override
Read bytes from the memory buffer into the provided buffer.
Definition MemoryInputStream.cpp:12
+
virtual size_t getSize() override
Get the total size of the memory buffer.
Definition MemoryInputStream.cpp:47
+
virtual size_t tell() override
Get the current read position in the buffer.
Definition MemoryInputStream.cpp:41
+
virtual size_t seek(size_t position) override
Seek to an absolute position in the memory buffer.
Definition MemoryInputStream.cpp:34
+
MemoryInputStream(const void *data, size_t size)
Construct a memory input stream over existing data.
Definition MemoryInputStream.cpp:8
+
size_t readString(char *&buffer, size_t &size)
Read a NUL-terminated string from the stream.
Definition MemoryInputStream.cpp:24
+
+
+
+ + + + diff --git a/doc/html/_output_stream_8hpp_source.html b/doc/html/_output_stream_8hpp_source.html new file mode 100644 index 0000000..42d2e5e --- /dev/null +++ b/doc/html/_output_stream_8hpp_source.html @@ -0,0 +1,131 @@ + + + + + + + +Minecraft Community Edition: IO/Stream/OutputStream.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
OutputStream.hpp
+
+
+
1#pragma once
+
2
+
3#include <cstdint>
+
4
+
5namespace mce {
+
+ +
7 public:
+
8 virtual ~OutputStream() = 0;
+
9
+
15 virtual size_t write(const void* buffer, size_t size) = 0;
+
16
+
22 virtual size_t seek(size_t position) = 0;
+
23
+
27 virtual size_t tell() = 0;
+
28
+
32 virtual size_t getSize() = 0;
+
33 };
+
+
34}
+
Definition OutputStream.hpp:6
+
virtual size_t getSize()=0
+
virtual size_t write(const void *buffer, size_t size)=0
+
virtual size_t tell()=0
+
virtual size_t seek(size_t position)=0
Changes the current position the stream is at.
+
+
+
+ + + + diff --git a/doc/html/_platform_8hpp_source.html b/doc/html/_platform_8hpp_source.html new file mode 100644 index 0000000..0222e6c --- /dev/null +++ b/doc/html/_platform_8hpp_source.html @@ -0,0 +1,123 @@ + + + + + + + +Minecraft Community Edition: Common/Platform.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Platform.hpp
+
+
+
1#pragma once
+
2
+
3#ifdef _WIN32
+
4#ifdef _WIN64
+
5#define MCE_PLATFORM_WINDOWS
+
6#else
+
7#error "x86 is not supported"
+
8#endif
+
9#elif defined(__APPLE__) || defined(__MACH__)
+
10#define MCE_PLATFORM_MACOS
+
11#elif defined(__linux__)
+
12#define MCE_PLATFORM_LINUX
+
13#else
+
14#error "Unsupported platform"
+
15#endif
+
16
+
17
+
+
+
+ + + + diff --git a/doc/html/_q_event_bus_8hpp.html b/doc/html/_q_event_bus_8hpp.html new file mode 100644 index 0000000..0dc8669 --- /dev/null +++ b/doc/html/_q_event_bus_8hpp.html @@ -0,0 +1,136 @@ + + + + + + + +Minecraft Community Edition: Core/QEventBus.hpp File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
QEventBus.hpp File Reference
+
+
+ +

Thread-safe event bus. +More...

+
#include <EASTL/functional.h>
+#include <EASTL/unordered_map.h>
+#include <EASTL/vector.h>
+#include <EASTL/queue.h>
+#include <EASTL/unique_ptr.h>
+#include <typeindex>
+#include <mutex>
+#include "IEvent.hpp"
+
+

Go to the source code of this file.

+ + + + + + +

+Classes

struct  mce::SubscriptionToken
 Token object that controls the lifetime of an event subscription. More...
class  mce::QEventBus
 Thread-safe event bus. More...
+

Detailed Description

+

Thread-safe event bus.

+
+
+ +
+ + + + diff --git a/doc/html/_q_event_bus_8hpp.js b/doc/html/_q_event_bus_8hpp.js new file mode 100644 index 0000000..cd86e0e --- /dev/null +++ b/doc/html/_q_event_bus_8hpp.js @@ -0,0 +1,5 @@ +var _q_event_bus_8hpp = +[ + [ "mce::SubscriptionToken", "structmce_1_1_subscription_token.html", "structmce_1_1_subscription_token" ], + [ "mce::QEventBus", "classmce_1_1_q_event_bus.html", "classmce_1_1_q_event_bus" ] +]; \ No newline at end of file diff --git a/doc/html/_q_event_bus_8hpp_source.html b/doc/html/_q_event_bus_8hpp_source.html new file mode 100644 index 0000000..56f818f --- /dev/null +++ b/doc/html/_q_event_bus_8hpp_source.html @@ -0,0 +1,260 @@ + + + + + + + +Minecraft Community Edition: Core/QEventBus.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
QEventBus.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2#include <EASTL/functional.h>
+
3#include <EASTL/unordered_map.h>
+
4#include <EASTL/vector.h>
+
5#include <EASTL/queue.h>
+
6#include <EASTL/unique_ptr.h>
+
7#include <typeindex>
+
8#include <mutex>
+
9#include "IEvent.hpp"
+
10
+
15
+
16namespace mce {
+
17
+
+ +
33 eastl::function<void()> unsubscribe;
+
34
+ +
41 };
+
+
42
+
+
58 class QEventBus {
+
59 public:
+
60 QEventBus(const std::string_view& eventNamespace);
+
61
+
68 template<typename EventType>
+
69 using Handler = eastl::function<void(const EventType&)>;
+
70
+
81 template<typename EventType>
+ +
83
+
93 template<typename EventType>
+
94 void subscribe(Handler<EventType> handler);
+
95
+
105 template<typename EventType>
+
106 void post(EventType&& event);
+
107
+
114 void process();
+
115
+
122 void runAsync();
+
123
+
131 void stop();
+
132
+
133 size_t getQueueSize() const;
+
140 ~QEventBus();
+
141
+
142 const std::string_view& getNamespace() const;
+
143 private:
+
152 void dispatch(const IEvent& e);
+
153
+
154
+
155 struct TypeIndexHash {
+
156 size_t operator()(const std::type_index& t) const noexcept {
+
157 return t.hash_code();
+
158 }
+
159 };
+
160
+
161 struct TypeIndexEqual {
+
162 bool operator()(const std::type_index& a, const std::type_index& b) const noexcept {
+
163 return a == b;
+
164 }
+
165 };
+
174 eastl::unordered_map<
+
175 std::type_index,
+
176 eastl::vector<eastl::function<void(const IEvent&)>>,
+
177 TypeIndexHash,
+
178 TypeIndexEqual
+
179 > handlers;
+
187 eastl::queue<eastl::unique_ptr<IEvent>> queue;
+
188
+
192 std::mutex mutex;
+
193
+
197 std::mutex queueMutex;
+
198
+
202 std::condition_variable conditionalVariable;
+
203
+
207 std::atomic_bool bIsRunning = false;
+
208
+
212 std::thread thread;
+
213
+
214 const std::string_view eventNamespace;
+
215 };
+
+
216 template<typename EventType>
+
+ +
218 std::lock_guard<std::mutex> lock(QEventBus::mutex);
+
219
+
220 auto& handlers = QEventBus::handlers[typeid(EventType)];
+
221
+
222 handlers.emplace_back([handler](const IEvent& e) {
+
223 handler(static_cast<const EventType&>(e));
+
224 });
+
225
+
226 auto it = eastl::prev(handlers.end());
+
227 std::type_index typeIdx = std::type_index(typeid(EventType));
+
228
+
229 return SubscriptionToken{ [this, typeIdx, it]() {
+
230 std::lock_guard<std::mutex> lock(QEventBus::mutex);
+
231 auto mapIt = QEventBus::handlers.find(typeIdx);
+
232 if (mapIt != QEventBus::handlers.end()) {
+
233 auto& vec = mapIt->second;
+
234
+
235 vec.erase(it);
+
236
+
237 if (vec.empty()) {
+
238 QEventBus::handlers.erase(mapIt);
+
239 }
+
240 }
+
241 }
+
242 };
+
243 }
+
+
244
+
245 template<typename EventType>
+
+ +
247 std::lock_guard<std::mutex> lock(QEventBus::mutex);
+
248
+
249 // Simply store the handler � no token or RAII logic.
+
250 auto& handlers = QEventBus::handlers[typeid(EventType)];
+
251 handlers.emplace_back([handler](const IEvent& e) {
+
252 handler(static_cast<const EventType&>(e));
+
253 });
+
254 }
+
+
255
+
256 template<typename EventType>
+
+
257 inline void QEventBus::post(EventType&& event) {
+
258 // Create an owned copy / move of the event on the heap
+
259 using Decayed = std::decay_t<EventType>;
+
260 auto ptr = eastl::make_unique<Decayed>(eastl::forward<EventType>(event));
+
261 {
+
262 std::lock_guard<std::mutex> lock(QEventBus::queueMutex);
+
263 QEventBus::queue.push(eastl::move(ptr));
+
264 }
+
265 QEventBus::conditionalVariable.notify_one();
+
266 }
+
+
267}
+
~QEventBus()
Destructor.
Definition QEventBus.cpp:47
+
void stop()
Stop asynchronous processing and join the worker thread.
Definition QEventBus.cpp:37
+
void post(EventType &&event)
Post an event instance to the bus for later processing.
Definition QEventBus.hpp:257
+
void runAsync()
Start asynchronous processing of queued events.
Definition QEventBus.cpp:18
+
void process()
Process and dispatch all currently queued events.
Definition QEventBus.cpp:5
+
eastl::function< void(const EventType &)> Handler
Alias for an event handler function.
Definition QEventBus.hpp:69
+
SubscriptionToken subscribeRAII(Handler< EventType > handler)
Subscribe a handler to EventType and receive a RAII token.
Definition QEventBus.hpp:217
+
void subscribe(Handler< EventType > handler)
Subscribe a handler to EventType without RAII token.
Definition QEventBus.hpp:246
+
Definition IEvent.hpp:14
+
Token object that controls the lifetime of an event subscription.
Definition QEventBus.hpp:27
+
eastl::function< void()> unsubscribe
Callable invoked to perform the unsubscribe action.
Definition QEventBus.hpp:33
+
~SubscriptionToken()
Destructor.
Definition QEventBus.hpp:40
+
+
+
+ + + + diff --git a/doc/html/_renderer_8hpp_source.html b/doc/html/_renderer_8hpp_source.html new file mode 100644 index 0000000..a5fa0cd --- /dev/null +++ b/doc/html/_renderer_8hpp_source.html @@ -0,0 +1,118 @@ + + + + + + + +Minecraft Community Edition: Graphics/Renderer.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Renderer.hpp
+
+
+
1#pragma once
+
2
+
3namespace mce {
+
+
4 class Renderer {
+
5 public:
+
6 virtual ~Renderer();
+
7 virtual void renderFrame() = 0;
+
8 };
+
+
9}
+
Definition Renderer.hpp:4
+
+
+
+ + + + diff --git a/doc/html/_thread_8hpp.html b/doc/html/_thread_8hpp.html new file mode 100644 index 0000000..f721a39 --- /dev/null +++ b/doc/html/_thread_8hpp.html @@ -0,0 +1,136 @@ + + + + + + + +Minecraft Community Edition: Core/Thread.hpp File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Thread.hpp File Reference
+
+
+ +

High-level Thread wrapper and callable adapters used by the project. +More...

+
#include "QEventBus.hpp"
+
+

Go to the source code of this file.

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

+Classes

struct  mce::ThreadFunc
 Abstract type-erased callable interface used as a thread entry point. More...
struct  mce::ThreadFunctor< F >
 Adapter that wraps a generic functor/lambda. More...
struct  mce::ThreadMemberFunctor< C >
 Adapter that wraps a member function without extra arguments. More...
struct  mce::ThreadMemberFunctorWithArgs< C, Args >
 Adapter that wraps a member function with arbitrary arguments. More...
class  mce::Thread
 Lightweight high-level thread wrapper. More...
+

Detailed Description

+

High-level Thread wrapper and callable adapters used by the project.

+

Contains type-erased callable adapters (ThreadFunc and derivatives) and the Thread class which holds a platform-specific implementation pointer (ThreadImpl) and a QEventBus reference for posting lifecycle events.

+
+
+ +
+ + + + diff --git a/doc/html/_thread_8hpp.js b/doc/html/_thread_8hpp.js new file mode 100644 index 0000000..bd0dffa --- /dev/null +++ b/doc/html/_thread_8hpp.js @@ -0,0 +1,8 @@ +var _thread_8hpp = +[ + [ "mce::ThreadFunc", "structmce_1_1_thread_func.html", "structmce_1_1_thread_func" ], + [ "mce::ThreadFunctor< F >", "structmce_1_1_thread_functor.html", "structmce_1_1_thread_functor" ], + [ "mce::ThreadMemberFunctor< C >", "structmce_1_1_thread_member_functor.html", "structmce_1_1_thread_member_functor" ], + [ "mce::ThreadMemberFunctorWithArgs< C, Args >", "structmce_1_1_thread_member_functor_with_args.html", "structmce_1_1_thread_member_functor_with_args" ], + [ "mce::Thread", "classmce_1_1_thread.html", "classmce_1_1_thread" ] +]; \ No newline at end of file diff --git a/doc/html/_thread_8hpp_source.html b/doc/html/_thread_8hpp_source.html new file mode 100644 index 0000000..bbc64f5 --- /dev/null +++ b/doc/html/_thread_8hpp_source.html @@ -0,0 +1,252 @@ + + + + + + + +Minecraft Community Edition: Core/Thread.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Thread.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2#include "QEventBus.hpp"
+
3
+
12
+
13namespace mce {
+
14 class ThreadImpl;
+
15
+
+
22 struct ThreadFunc {
+
26 virtual ~ThreadFunc() {}
+
27
+
33 virtual void run() = 0;
+
34 };
+
+
35
+
40 template<typename F>
+
+ + +
47
+
51 virtual void run() override { functor(); };
+
52
+ +
55 };
+
+
56
+
61 template<typename C>
+
+ +
68 ThreadMemberFunctor(void(C::* function)(), C* object) : functor(function), object(object) {}
+
69
+
76 virtual void run() override { functor(); };
+
77
+
79 void(C::* functor)();
+
80
+ +
83 };
+
+
84
+
90 template<typename C, typename... Args>
+
+ +
98 ThreadMemberFunctorWithArgs(void(C::* function)(Args...), C* object, Args&&... args) : functor(functor), object(object) {}
+
99
+
+
103 virtual void run() override {
+
104 call(std::index_sequence_for<Args...>{});
+
105 }
+
+
106
+
108 void(C::* functor)(Args...);
+
109
+ +
112
+
114 std::tuple<Args...> args;
+
115 private:
+
120 template <std::size_t... I>
+
121 void call(std::index_sequence<I...>) {
+
122 (object->*functor)(std::get<I>(args)...);
+
123 }
+
124 };
+
+
125
+
+
134 class Thread {
+
135 public:
+
142 template<typename F>
+
143 Thread(QEventBus& qBus, F function);
+
144
+
152 template<typename C>
+
153 Thread(QEventBus& qBus, void(C::* function)(), C* object);
+
154
+
164 template<typename C, typename... Args>
+
165 Thread(QEventBus& qBus, void(C::* function)(), C* object, Args&&... args);
+
166
+
170 ~Thread();
+
171
+
175 void launch();
+
176
+
180 void wait();
+
181
+
182 private:
+
183 friend class ThreadImpl;
+
184
+
191 void run();
+
192
+
194 ThreadImpl* pImpl;//pointer to implementation
+
195
+
197 ThreadFunc* entryPoint;
+
198
+
200 QEventBus& qBus;
+
201 };
+
+
202 template<typename F>
+
+
203 inline Thread::Thread(QEventBus& qBus, F function) :
+
204 pImpl(nullptr),
+
205 entryPoint(new ThreadFunctor<F>(function)),
+
206 qBus(qBus) {
+
207
+
208 }
+
+
209 template<typename C>
+
+
210 inline Thread::Thread(QEventBus& qBus, void(C::* function)(), C* object) :
+
211 pImpl(nullptr),
+
212 entryPoint(new ThreadMemberFunctor<C>(function, object)),
+
213 qBus(qBus) {
+
214
+
215 }
+
+
216 template<typename C, typename ...Args>
+
+
217 inline Thread::Thread(QEventBus& qBus, void(C::* function)(), C* object, Args && ...args) :
+
218 pImpl(nullptr),
+
219 entryPoint(new ThreadMemberFunctorWithArgs<C>(function, object)),
+
220 qBus(qBus) {
+
221
+
222 }
+
+
223}
+
Thread-safe event bus.
+
Thread-safe event bus.
Definition QEventBus.hpp:58
+
void launch()
Start execution of the stored callable on a new thread.
Definition Thread.cpp:10
+
void wait()
Block until the thread has finished executing.
Definition Thread.cpp:17
+
Thread(QEventBus &qBus, F function)
Construct a Thread from a generic callable (lambda, functor, function pointer).
Definition Thread.hpp:203
+
~Thread()
Destructor; cleans up stored callable and implementation pointer.
Definition Thread.cpp:5
+
Platform-specific thread implementation.
Definition ThreadImpl.hpp:32
+
Abstract type-erased callable interface used as a thread entry point.
Definition Thread.hpp:22
+
virtual ~ThreadFunc()
Virtual destructor to allow safe deletion via base pointer.
Definition Thread.hpp:26
+
virtual void run()=0
Execute the wrapped callable.
+
Adapter that wraps a generic functor/lambda.
Definition Thread.hpp:41
+
virtual void run() override
Invoke the stored functor.
Definition Thread.hpp:51
+
F functor
The stored functor instance.
Definition Thread.hpp:54
+
ThreadFunctor(F functor)
Construct the adapter with the provided functor.
Definition Thread.hpp:46
+
Adapter that wraps a member function without extra arguments.
Definition Thread.hpp:62
+
ThreadMemberFunctor(void(C::*function)(), C *object)
Construct with member function pointer and target object.
Definition Thread.hpp:68
+
void(C::* functor)()
Pointer to the member function to invoke.
Definition Thread.hpp:79
+
virtual void run() override
Invoke the stored member function on the stored object.
Definition Thread.hpp:76
+
C * object
Pointer to the object instance used when invoking the member function.
Definition Thread.hpp:82
+
Adapter that wraps a member function with arbitrary arguments.
Definition Thread.hpp:91
+
void(C::* functor)(Args...)
Pointer to the member function to invoke.
Definition Thread.hpp:108
+
C * object
Pointer to the object instance used when invoking the member function.
Definition Thread.hpp:111
+
std::tuple< Args... > args
Tuple holding the arguments to forward to the member function.
Definition Thread.hpp:114
+
ThreadMemberFunctorWithArgs(void(C::*function)(Args...), C *object, Args &&... args)
Construct with member function pointer, target object and arguments.
Definition Thread.hpp:98
+
virtual void run() override
Invoke the stored member function forwarding the stored arguments.
Definition Thread.hpp:103
+
+
+
+ + + + diff --git a/doc/html/_thread_impl_8hpp.html b/doc/html/_thread_impl_8hpp.html new file mode 100644 index 0000000..355973c --- /dev/null +++ b/doc/html/_thread_impl_8hpp.html @@ -0,0 +1,128 @@ + + + + + + + +Minecraft Community Edition: Core/ThreadImpl.hpp File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
ThreadImpl.hpp File Reference
+
+
+ +

Platform-specific implementation details for mce::Thread. +More...

+
#include "..\Common\Platform.hpp"
+
+

Go to the source code of this file.

+ + + + +

+Classes

class  mce::ThreadImpl
 Platform-specific thread implementation. More...
+

Detailed Description

+

Platform-specific implementation details for mce::Thread.

+

Contains the PIMPL-like backing class used by mce::Thread to manage platform thread handles and lifecycle operations.

+
+
+ +
+ + + + diff --git a/doc/html/_thread_impl_8hpp.js b/doc/html/_thread_impl_8hpp.js new file mode 100644 index 0000000..c4766f5 --- /dev/null +++ b/doc/html/_thread_impl_8hpp.js @@ -0,0 +1,4 @@ +var _thread_impl_8hpp = +[ + [ "mce::ThreadImpl", "classmce_1_1_thread_impl.html", "classmce_1_1_thread_impl" ] +]; \ No newline at end of file diff --git a/doc/html/_thread_impl_8hpp_source.html b/doc/html/_thread_impl_8hpp_source.html new file mode 100644 index 0000000..03ad163 --- /dev/null +++ b/doc/html/_thread_impl_8hpp_source.html @@ -0,0 +1,151 @@ + + + + + + + +Minecraft Community Edition: Core/ThreadImpl.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
ThreadImpl.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2#include "..\Common\Platform.hpp"
+
3#if defined(MCE_PLATFORM_LINUX) || defined(MCE_PLATFORM_MACOS)
+
4#include <pthread.h>
+
5#endif
+
6
+
14
+
15namespace mce {
+
22 class Thread;
+
23
+
+
32 class ThreadImpl {
+
33 public:
+ +
42
+
43#ifdef MCE_PLATFORM_WINDOWS
+ +
52#endif
+
53
+
60 void wait();
+
61
+
70 void terminate();
+
71
+
72
+
73 bool isRunning() const;
+
74 private:
+
75
+
84 static unsigned int __stdcall entryPoint(void* userData);
+
85
+
86#ifdef MCE_PLATFORM_WINDOWS
+
93 void* hThread;
+
94
+
100 unsigned int threadID;
+
101#elif defined(MCE_PLATFORM_LINUX) || defined(MCE_PLATFORM_MACOS)
+
107 pthread_t thread;
+
108
+
116 bool isActive;
+
117#endif
+
118 };
+
+
119}
+
Lightweight high-level thread wrapper.
Definition Thread.hpp:134
+
void wait()
Block until the associated thread exits.
+
ThreadImpl(Thread *owner)
Construct a ThreadImpl bound to its owner.
+
void terminate()
Request termination of the associated thread.
+
+
+
+ + + + diff --git a/doc/html/_thread_manager_8hpp.html b/doc/html/_thread_manager_8hpp.html new file mode 100644 index 0000000..19793c1 --- /dev/null +++ b/doc/html/_thread_manager_8hpp.html @@ -0,0 +1,133 @@ + + + + + + + +Minecraft Community Edition: Core/ThreadManager.hpp File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
ThreadManager.hpp File Reference
+
+
+ +

Manages lifecycle and bookkeeping for mce::Thread instances. +More...

+
#include "Thread.hpp"
+#include <EASTL/unique_ptr.h>
+#include <EASTL/string.h>
+#include <SFML/System.hpp>
+#include "IEvent.hpp"
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  mce::ThreadManager
struct  mce::ThreadManager::ThreadInfo
 Metadata stored per managed thread. More...
+

Detailed Description

+

Manages lifecycle and bookkeeping for mce::Thread instances.

+

ThreadManager provides thread creation helpers, launching, waiting and statistics. It stores owned Thread instances and a map of Thread -> ThreadInfo for monitoring start/end times and finished state.

+
+
+ +
+ + + + diff --git a/doc/html/_thread_manager_8hpp.js b/doc/html/_thread_manager_8hpp.js new file mode 100644 index 0000000..e689a9b --- /dev/null +++ b/doc/html/_thread_manager_8hpp.js @@ -0,0 +1,5 @@ +var _thread_manager_8hpp = +[ + [ "mce::ThreadManager", "classmce_1_1_thread_manager.html", "classmce_1_1_thread_manager" ], + [ "mce::ThreadManager::ThreadInfo", "structmce_1_1_thread_manager_1_1_thread_info.html", "structmce_1_1_thread_manager_1_1_thread_info" ] +]; \ No newline at end of file diff --git a/doc/html/_thread_manager_8hpp_source.html b/doc/html/_thread_manager_8hpp_source.html new file mode 100644 index 0000000..6fb43b5 --- /dev/null +++ b/doc/html/_thread_manager_8hpp_source.html @@ -0,0 +1,230 @@ + + + + + + + +Minecraft Community Edition: Core/ThreadManager.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
ThreadManager.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2#include "Thread.hpp"
+
3#include <EASTL/unique_ptr.h>
+
4#include <EASTL/string.h>
+
5#include <SFML/System.hpp>
+
6#include "IEvent.hpp"
+
7
+
16
+
17namespace mce {
+
18
+
+ +
20 public:
+
+
27 struct ThreadInfo {
+ +
31 eastl::string name;
+
33 std::chrono::steady_clock::time_point startTime, endTime;
+
35 bool finished = false;
+
36 };
+
+
37
+
45 explicit ThreadManager(QEventBus& qBus);
+
46
+ +
49
+
61 template<typename F>
+
62 Thread* createThread(const eastl::string& name, F func);
+
63
+
74 template<typename C>
+
75 Thread* createThread(const eastl::string& name, void(C::* func)(), C* object);
+
76
+
83 void launch(Thread* th);
+
84
+
92 void launch(const eastl::string& name);
+
93
+
99 void waitAll();
+
100
+
107 void cleanupFinished();
+
108
+
115 void printStats();
+
116
+
121 size_t activeCount() const;
+
122
+
123 private:
+
124
+
132 void onThreadFinished(const event::ThreadFinished& e);
+
133
+
139 void cleanupFinishedUnlocked();
+
140 private:
+
142 mutable std::mutex mutex;
+
144 eastl::unordered_map<Thread*, ThreadInfo> threads;
+
146 eastl::vector<eastl::unique_ptr<Thread>> threadStorage;
+
148 QEventBus& qBus;
+
149 };
+
+
150 template<typename F>
+
+
151 inline Thread* ThreadManager::createThread(const eastl::string& name, F func) {
+
152 auto thread = eastl::make_unique<Thread>(qBus, [this, func, name]() {
+
153 qBus.post(event::ThreadStarted{ nullptr, name });
+
154 func();
+
155 });
+
156
+
157 Thread* rawThread = thread.get();
+
158
+
159 std::lock_guard<std::mutex> lock(mutex);
+
160 ThreadInfo ti;
+
161 ti.startTime = std::chrono::steady_clock::now();
+
162 ti.name = name;
+
163 ti.thread = rawThread;
+
164 ti.endTime = {};
+
165 ti.finished = false;
+
166 threads.emplace(rawThread, ti);
+
167
+
168 threadStorage.push_back(eastl::move(thread));
+
169 return rawThread;
+
170 }
+
+
171 template<typename C>
+
+
172 inline Thread* ThreadManager::createThread(const eastl::string& name, void(C::* func)(), C* object) {
+
173 qBus.post(event::ThreadStarted{ nullptr, name });
+
174 auto thread = eastl::make_unique<Thread>(
+
175 qBus,
+
176 func,
+
177 object
+
178 );
+
179
+
180 Thread* rawThread = thread.get();
+
181 {
+
182 std::lock_guard<std::mutex> lock(mutex);
+
183 threads.emplace(rawThread, ThreadInfo{
+
184 thread,
+
185 name,
+
186 std::chrono::steady_clock::now(),
+
187 {},
+
188 false
+
189 });
+
190 }
+
191
+
192 threadStorage.push_back(eastl::move(thread));
+
193 return rawThread;
+
194 }
+
+
195}
+
High-level Thread wrapper and callable adapters used by the project.
+
Thread-safe event bus.
Definition QEventBus.hpp:58
+
Lightweight high-level thread wrapper.
Definition Thread.hpp:134
+
void printStats()
Print statistics (e.g. runtime durations) for managed threads.
Definition ThreadManager.cpp:52
+
~ThreadManager()
Destructor cleans up managed threads and subscriptions.
Definition ThreadManager.cpp:14
+
Thread * createThread(const eastl::string &name, F func)
Create (and store) a Thread from a generic callable.
Definition ThreadManager.hpp:151
+
size_t activeCount() const
Count of currently active (non-finished) threads.
Definition ThreadManager.cpp:62
+
ThreadManager(QEventBus &qBus)
Construct a ThreadManager bound to a QEventBus.
Definition ThreadManager.cpp:5
+
void cleanupFinished()
Remove and cleanup finished threads from internal storage.
Definition ThreadManager.cpp:47
+
void waitAll()
Block until all managed threads have finished executing.
Definition ThreadManager.cpp:39
+
void launch(Thread *th)
Launch a previously created Thread instance.
Definition ThreadManager.cpp:17
+
Metadata stored per managed thread.
Definition ThreadManager.hpp:27
+
bool finished
True when the thread has finished execution.
Definition ThreadManager.hpp:35
+
Thread * thread
Non-owning pointer to the tracked Thread.
Definition ThreadManager.hpp:29
+
std::chrono::steady_clock::time_point startTime
Time point when the thread was started.
Definition ThreadManager.hpp:33
+
eastl::string name
Human readable thread name.
Definition ThreadManager.hpp:31
+
Definition IEvent.hpp:38
+
Definition IEvent.hpp:44
+
+
+
+ + + + diff --git a/doc/html/_virtual_file_system_8hpp_source.html b/doc/html/_virtual_file_system_8hpp_source.html new file mode 100644 index 0000000..ad912f8 --- /dev/null +++ b/doc/html/_virtual_file_system_8hpp_source.html @@ -0,0 +1,199 @@ + + + + + + + +Minecraft Community Edition: IO/VirtualFileSystem.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
VirtualFileSystem.hpp
+
+
+
1#pragma once
+
2#include <EASTL/string.h>
+
3#include <EASTL/unordered_map.h>
+
4#include <EASTL/vector.h>
+
5#define JSON_NOEXCEPTION
+
6#include "nlohmann/json.hpp"
+
7#include "Stream/FileInputStream.hpp"
+
8
+
9namespace mce {
+
+ +
18 public:
+ +
+
23 enum FileBinaryType : unsigned char {
+
24 NONE = 0,
+ + + +
28 };
+
+
29
+
+
36 union Version {
+
37
+
44 static Version makeVersion(unsigned char major, unsigned char minor, unsigned char patch);
+
45
+
46 struct {
+
47 unsigned char major, minor, patch;
+
48 };
+
49
+
50 unsigned int quad;
+
51 };
+
+
52
+
+
56 struct Config {
+
57 bool useStreamInput = false;
+ +
59 Version version = { 0 };
+
60 };
+
+
61
+
66 Config& getConfig();
+
67
+
74 bool getFile(const eastl::string_view& fileTag, eastl::vector<char>& bytes);
+
75
+
82 bool buildJSONMappingFile(const std::string& fileInName, const std::string& fileOutName);
+
83
+
89 bool loadFile(const std::string& fileName);
+
90 private:
+
91#ifdef _DEBUG
+
97 bool loadJSONMappingFile(const std::string& fileName);
+
98#else
+
104 bool loadVirtualFileSystem(const std::string& fileName);
+
105#endif
+
109 struct File {
+
110 std::string path;
+
111 size_t start, end;
+
112
+
113 size_t size;
+
114 };
+
115
+
121 eastl::unordered_map<eastl::string, File> files;
+
122
+
123 Config cfg;
+
124#ifdef _DEBUG
+
125 nlohmann::json data;
+
126#else
+
127 FileInputStream fileInStream;
+
133 char* binary;
+
134#endif
+
135 };
+
+
136}
+
VirtualFileSystem manages a collection of files referenced by tags.
Definition VirtualFileSystem.hpp:17
+
FileBinaryType
Types of virtual file collections that can be stored in a VFS file.
Definition VirtualFileSystem.hpp:23
+
@ SOURCE_FILE
Definition VirtualFileSystem.hpp:26
+
@ ASSETS_FILE
Definition VirtualFileSystem.hpp:25
+
@ WORLD_FILE
Definition VirtualFileSystem.hpp:27
+
@ NONE
Definition VirtualFileSystem.hpp:24
+
bool buildJSONMappingFile(const std::string &fileInName, const std::string &fileOutName)
Build a binary VFS file from a JSON mapping.
Definition VirtualFileSystem.cpp:184
+
bool getFile(const eastl::string_view &fileTag, eastl::vector< char > &bytes)
Retrieve a file's bytes identified by its tag.
Definition VirtualFileSystem.cpp:108
+
bool loadFile(const std::string &fileName)
Load the virtual file system from a file.
Definition VirtualFileSystem.cpp:300
+
Config & getConfig()
Access the runtime configuration.
Definition VirtualFileSystem.cpp:89
+
Configuration for how the VirtualFileSystem should operate.
Definition VirtualFileSystem.hpp:56
+
FileBinaryType fileType
Definition VirtualFileSystem.hpp:58
+
Version version
Definition VirtualFileSystem.hpp:59
+
bool useStreamInput
Definition VirtualFileSystem.hpp:57
+
Version information for the virtual file system format.
Definition VirtualFileSystem.hpp:36
+
unsigned char patch
Definition VirtualFileSystem.hpp:47
+
static Version makeVersion(unsigned char major, unsigned char minor, unsigned char patch)
Create a Version from components.
Definition VirtualFileSystem.cpp:37
+
unsigned int quad
Definition VirtualFileSystem.hpp:50
+
+
+
+ + + + diff --git a/doc/html/annotated.html b/doc/html/annotated.html new file mode 100644 index 0000000..a79a599 --- /dev/null +++ b/doc/html/annotated.html @@ -0,0 +1,145 @@ + + + + + + + +Minecraft Community Edition: Class List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Nmce
 Nevent
 CLoggerOutput
 CThreadFinished
 CThreadStarted
 CCoroutineSchedulerCoroutine scheduler that manages periodic tasks
 CTaskRepresents a single scheduled task
 CFunctionContainerContainer for storing and invoking named functions
 CIEvent
 CSubscriptionTokenToken object that controls the lifetime of an event subscription
 CQEventBusThread-safe event bus
 CThreadFuncAbstract type-erased callable interface used as a thread entry point
 CThreadFunctorAdapter that wraps a generic functor/lambda
 CThreadMemberFunctorAdapter that wraps a member function without extra arguments
 CThreadMemberFunctorWithArgsAdapter that wraps a member function with arbitrary arguments
 CThreadLightweight high-level thread wrapper
 CThreadImplPlatform-specific thread implementation
 CThreadManager
 CThreadInfoMetadata stored per managed thread
 CGraphicsContext
 CRenderer
 CLogger
 CLoggerSink
 CStdoutSink
 CFileSink
 CVirtualFileSystemVirtualFileSystem manages a collection of files referenced by tags
 CVersionVersion information for the virtual file system format
 CConfigConfiguration for how the VirtualFileSystem should operate
 CGLGraphicsContext
 CGLRenderer
 CFileInputStream
 CFileOutputStreamPlatform-independent file output stream implementation
 CInputStream
 CMemoryInputStreamMemory-backed input stream
 COutputStream
 CExampleClassThis is an example class showing Doxygen tags
+
+
+
+
+ + + + diff --git a/doc/html/annotated_dup.js b/doc/html/annotated_dup.js new file mode 100644 index 0000000..2377212 --- /dev/null +++ b/doc/html/annotated_dup.js @@ -0,0 +1,37 @@ +var annotated_dup = +[ + [ "mce", null, [ + [ "event", null, [ + [ "LoggerOutput", "structmce_1_1event_1_1_logger_output.html", null ], + [ "ThreadFinished", "structmce_1_1event_1_1_thread_finished.html", null ], + [ "ThreadStarted", "structmce_1_1event_1_1_thread_started.html", null ] + ] ], + [ "CoroutineScheduler", "classmce_1_1_coroutine_scheduler.html", "classmce_1_1_coroutine_scheduler" ], + [ "FunctionContainer", "classmce_1_1_function_container.html", "classmce_1_1_function_container" ], + [ "IEvent", "structmce_1_1_i_event.html", null ], + [ "SubscriptionToken", "structmce_1_1_subscription_token.html", "structmce_1_1_subscription_token" ], + [ "QEventBus", "classmce_1_1_q_event_bus.html", "classmce_1_1_q_event_bus" ], + [ "ThreadFunc", "structmce_1_1_thread_func.html", "structmce_1_1_thread_func" ], + [ "ThreadFunctor", "structmce_1_1_thread_functor.html", "structmce_1_1_thread_functor" ], + [ "ThreadMemberFunctor", "structmce_1_1_thread_member_functor.html", "structmce_1_1_thread_member_functor" ], + [ "ThreadMemberFunctorWithArgs", "structmce_1_1_thread_member_functor_with_args.html", "structmce_1_1_thread_member_functor_with_args" ], + [ "Thread", "classmce_1_1_thread.html", "classmce_1_1_thread" ], + [ "ThreadImpl", "classmce_1_1_thread_impl.html", "classmce_1_1_thread_impl" ], + [ "ThreadManager", "classmce_1_1_thread_manager.html", "classmce_1_1_thread_manager" ], + [ "GraphicsContext", "classmce_1_1_graphics_context.html", null ], + [ "Renderer", "classmce_1_1_renderer.html", null ], + [ "Logger", "classmce_1_1_logger.html", null ], + [ "LoggerSink", "classmce_1_1_logger_sink.html", null ], + [ "StdoutSink", "classmce_1_1_stdout_sink.html", null ], + [ "FileSink", "classmce_1_1_file_sink.html", null ], + [ "VirtualFileSystem", "classmce_1_1_virtual_file_system.html", "classmce_1_1_virtual_file_system" ], + [ "GLGraphicsContext", "classmce_1_1_g_l_graphics_context.html", null ], + [ "GLRenderer", "classmce_1_1_g_l_renderer.html", null ], + [ "FileInputStream", "classmce_1_1_file_input_stream.html", "classmce_1_1_file_input_stream" ], + [ "FileOutputStream", "classmce_1_1_file_output_stream.html", "classmce_1_1_file_output_stream" ], + [ "InputStream", "classmce_1_1_input_stream.html", "classmce_1_1_input_stream" ], + [ "MemoryInputStream", "classmce_1_1_memory_input_stream.html", "classmce_1_1_memory_input_stream" ], + [ "OutputStream", "classmce_1_1_output_stream.html", "classmce_1_1_output_stream" ] + ] ], + [ "ExampleClass", "class_example_class.html", "class_example_class" ] +]; \ No newline at end of file diff --git a/doc/html/bug.html b/doc/html/bug.html new file mode 100644 index 0000000..164ed3d --- /dev/null +++ b/doc/html/bug.html @@ -0,0 +1,112 @@ + + + + + + + +Minecraft Community Edition: Bug List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Bug List
+
+
+
+
File example.hpp
+

There may be edge cases not handled.

+

+
+
+
+
+
+
+ + + + diff --git a/doc/html/class_example_class-members.html b/doc/html/class_example_class-members.html new file mode 100644 index 0000000..b8795f4 --- /dev/null +++ b/doc/html/class_example_class-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
ExampleClass Member List
+
+
+ +

This is the complete list of members for ExampleClass, including all inherited members.

+ + + +
add(int a, int b)ExampleClass
subtract(int a, int b) (defined in ExampleClass)ExampleClass
+
+
+ + + + diff --git a/doc/html/class_example_class.html b/doc/html/class_example_class.html new file mode 100644 index 0000000..8a73655 --- /dev/null +++ b/doc/html/class_example_class.html @@ -0,0 +1,188 @@ + + + + + + + +Minecraft Community Edition: ExampleClass Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
ExampleClass Class Reference
+
+
+ +

This is an example class showing Doxygen tags. + More...

+ +

#include <example.hpp>

+ + + + + +

+Public Member Functions

int add (int a, int b)
 Adds two integers.
+int subtract (int a, int b)
+

Detailed Description

+

This is an example class showing Doxygen tags.

+

It demonstrates usage of notes, warnings, todos, etc.

+

Member Function Documentation

+ +

◆ add()

+ +
+
+ + + + + + + + + + + +
int ExampleClass::add (int a,
int b )
+
+ +

Adds two integers.

+

This function demonstrates

Parameters
+ + +
+
+
+

return, and

Exceptions
+ + +
tags.
+
+
+
Parameters
+ + + +
aFirst integer to add.
bSecond integer to add.
+
+
+
Returns
Sum of a and b.
+
Precondition
Both a and b should be positive.
+
Postcondition
Result is always greater than or equal to a and b.
+
Exceptions
+ + +
std::overflow_errorif sum exceeds max int.
+
+
+
See also
subtract()
int result = ExampleClass().add(1,2);
+
This is an example class showing Doxygen tags.
Definition example.hpp:23
+
int add(int a, int b)
Adds two integers.
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/class_example_class.js b/doc/html/class_example_class.js new file mode 100644 index 0000000..57f9516 --- /dev/null +++ b/doc/html/class_example_class.js @@ -0,0 +1,4 @@ +var class_example_class = +[ + [ "add", "class_example_class.html#a9d2ee12372f2f25050ffd0283a7c6a8d", null ] +]; \ No newline at end of file diff --git a/doc/html/classbasic__json-members.html b/doc/html/classbasic__json-members.html new file mode 100644 index 0000000..a78ad85 --- /dev/null +++ b/doc/html/classbasic__json-members.html @@ -0,0 +1,163 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass > Member List
+
+
+ +

This is the complete list of members for basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
::nlohmann::detail::binary_reader (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
::nlohmann::detail::binary_writer (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
::nlohmann::detail::exception (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
::nlohmann::detail::iter_impl (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
::nlohmann::detail::json_sax_dom_callback_parser (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
::nlohmann::detail::json_sax_dom_parser (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
::nlohmann::detail::parser (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
::nlohmann::json_pointer (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
allocator_type typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
AllocatorType< basic_json > (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
AllocatorType< std::pair< const StringType, basic_json > > (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
assignment (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
basic_json (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
bjdata_version_t typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
cbor_tag_handler_t typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
const_iterator typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
const_pointer typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
const_reference typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
const_reverse_iterator typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
default_object_comparator_t (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
detail::external_constructor (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >friend
difference_type typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
error_handler_t typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
https (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
initializer_list_t typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
input_format_t typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
invalid_iterator typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
iterator typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
json_pointer typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
json_sax_t typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
json_serializer typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
m_data (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
objects (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >static
other_error typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
out_of_range typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
parse_error typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
Pointer (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
pointer typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
reference typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
result (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
result (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
reverse_iterator typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
size_type typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
type (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
type_error typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
value_t typedef (defined in basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >)basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >
+
+
+ + + + diff --git a/doc/html/classbasic__json.html b/doc/html/classbasic__json.html new file mode 100644 index 0000000..d314a96 --- /dev/null +++ b/doc/html/classbasic__json.html @@ -0,0 +1,332 @@ + + + + + + + +Minecraft Community Edition: basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass > Class Template Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass > Class Template Reference
+
+
+ +

namespace for Niels Lohmann + More...

+
+Inheritance diagram for basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >:
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Types

+using value_t = detail::value_t
+using json_pointer = ::nlohmann::json_pointer<StringType>
+template<typename T, typename SFINAE>
using json_serializer = JSONSerializer<T, SFINAE>
+using error_handler_t = detail::error_handler_t
+using cbor_tag_handler_t = detail::cbor_tag_handler_t
+using bjdata_version_t = detail::bjdata_version_t
+using initializer_list_t = std::initializer_list<detail::json_ref<basic_json>>
+using input_format_t = detail::input_format_t
+using json_sax_t = json_sax<basic_json>
using parse_error
+using invalid_iterator = detail::invalid_iterator
+using type_error = detail::type_error
+using out_of_range = detail::out_of_range
+using other_error = detail::other_error
using reference
+using const_reference = const value_type&
+using difference_type = std::ptrdiff_t
+using size_type = std::size_t
+using allocator_type = AllocatorType<basic_json>
+using pointer = typename std::allocator_traits<allocator_type>::pointer
+using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer
+using iterator = iter_impl<basic_json>
+using const_iterator = iter_impl<const basic_json>
+using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>
+using const_reverse_iterator = json_reverse_iterator<typename basic_json::const_iterator>
+ + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+*JSON Pointer
+*SAX interface type
+**brief returns the allocator associated with the container *sa https: static allocator_type get_allocator() { return allocator_type()
+*brief returns version information on the library *sa https: JSON_HEDLEY_WARN_UNUSED_RESULT static basic_json meta() { basic_json result
result ["copyright"] = "(C) 2013-2026 Niels Lohmann"
+return result
***name JSON value data types *The data types to store a JSON value These types are derived from *the template arguments passed to class ref basic_json **brief a type for an object *sa https: using object_t = ObjectType<StringType
+***name JSON value data types *The data types to store a JSON value These types are derived from *the template arguments passed to class ref basic_json **brief a type for an object *sa default_object_comparator_t
+***name JSON value data types *The data types to store a JSON value These types are derived from *the template arguments passed to class ref basic_json **brief a type for an object *sa AllocatorType< std::pair< const StringType, basic_json > >
+*brief a type for an array *sa https: using array_t = ArrayType<basic_json
+*brief a type for an array *sa AllocatorType< basic_json >
+*brief a type for a string *sa https: using string_t = StringType
+*brief a type for a boolean *sa https: using boolean_t = BooleanType
+*brief a type for a number *(integer) *@sa https brief a type for a number *(unsigned) *@sa https brief a type for a number *(floating-point) *@sa https brief a type for a packed binary type *sa https: using binary_t = nlohmann::byte_container_with_subtype<BinaryType>
+*brief object key comparator type *sa https: using object_comparator_t = detail::actual_object_comparator_t<basic_json>
+***brief parser event types *sa https: using parse_event_t = detail::parse_event_t
+*brief per element parser callback type *sa https: using parser_callback_t = detail::parser_callback_t<basic_json>
+***name constructors and destructors *Constructors of class ref basic_json copy move constructor copy * assignment
+***name constructors and destructors *Constructors of class ref basic_json copy move constructor copy static functions creating and the destructor *data m_data = {}
+ + +

+Static Public Attributes

+***name constructors and destructors *Constructors of class ref basic_json copy move constructor copy static functions creating objects
+ + + + + + + + + + + + + + + + + + +

+Friends

+template<detail::value_t>
struct detail::external_constructor
+template<typename>
class ::nlohmann::json_pointer
+template<typename BasicJsonType, typename InputType>
class ::nlohmann::detail::parser
+template<typename BasicJsonType>
class ::nlohmann::detail::iter_impl
+template<typename BasicJsonType, typename CharType>
class ::nlohmann::detail::binary_writer
+template<typename BasicJsonType, typename InputType, typename SAX>
class ::nlohmann::detail::binary_reader
+template<typename BasicJsonType, typename InputAdapterType>
class ::nlohmann::detail::json_sax_dom_parser
+template<typename BasicJsonType, typename InputAdapterType>
class ::nlohmann::detail::json_sax_dom_callback_parser
+class ::nlohmann::detail::exception
+

Detailed Description

+
template<template< typename U, typename V, typename... Args > class ObjectType = std::map, template< typename U, typename... Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator, template< typename T, typename SFINAE=void > class JSONSerializer = adl_serializer, class BinaryType = std::vector<std::uint8_t>, class CustomBaseClass = void>
+class basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >

namespace for Niels Lohmann

+

a class to store JSON values

See also
https://json.nlohmann.me/api/basic_json/
+
+https://github.com/nlohmann
+
Since
version 1.0.0
+

a class to store JSON values

+
Since
version 1.0.0
+

Member Typedef Documentation

+ +

◆ parse_error

+ +
+
+
+template<template< typename U, typename V, typename... Args > class ObjectType = std::map, template< typename U, typename... Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator, template< typename T, typename SFINAE=void > class JSONSerializer = adl_serializer, class BinaryType = std::vector<std::uint8_t>, class CustomBaseClass = void>
+ + + + +
using basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >::parse_error
+
+Initial value:
{
+
+ +
general exception of the basic_json class
Definition json.hpp:4489
+
exception indicating a parse error
Definition json.hpp:4589
+
+
+
+ +

◆ reference

+ +
+
+
+template<template< typename U, typename V, typename... Args > class ObjectType = std::map, template< typename U, typename... Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator, template< typename T, typename SFINAE=void > class JSONSerializer = adl_serializer, class BinaryType = std::vector<std::uint8_t>, class CustomBaseClass = void>
+ + + + +
using basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >::reference
+
+Initial value:
{
+
+
* the type of elements in a basic_json container
+
using value_type = basic_json value_type&
+
+
+
+

Member Data Documentation

+ +

◆ https

+ +
+
+
+template<template< typename U, typename V, typename... Args > class ObjectType = std::map, template< typename U, typename... Args > class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template< typename U > class AllocatorType = std::allocator, template< typename T, typename SFINAE=void > class JSONSerializer = adl_serializer, class BinaryType = std::vector<std::uint8_t>, class CustomBaseClass = void>
+ + + + +
* * * name JSON value data types* The data types to store a JSON value These types are derived from* the template arguments passed to class ref basic_json* * brief a type for an object* sa basic_json< ObjectType, ArrayType, StringType, BooleanType, NumberIntegerType, NumberUnsignedType, NumberFloatType, AllocatorType, JSONSerializer, BinaryType, CustomBaseClass >::https
+
+Initial value:
{
+
+
* @brief default object key comparator type
+
* The actual object key comparator type (@ref object_comparator_t) may be
+
* different.
+
* @sa https:
+
+
+
+
+
+
using default_object_comparator_t = std::less<StringType>
+
+
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/classbasic__json.png b/doc/html/classbasic__json.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa5af2296a907b4f23bd9ec3b896d2311318c09 GIT binary patch literal 2405 zcmd5;{Xf%dA73P;#Br-rsW={5s(I+aL>VVx6j~lP!_k@3%y5K-#);CA=9!gfmF=ui z9*)_t4V~%~LTwmE6DAL5B&M{R-QTUd*L_~E`~Cy&>xb|4zTV%@=Y4%%pU-uDzTZr5 zPgiZN9abi72*6KwMKuENHpC%3&w_xpYCzR)1HS9u!=0UcF0PT5y-pZw%65i^c=jq%=c&6q zjLqHi!t8LD{Nr)pYz;M|_4*;^v_fxp^LvGe@6Bmf5blZE*G)CxTKW2>=5GA`&PZTF zp1vusJ(Z%Kgj8lG^>1iXru?lFwOB|^u^Bu_2#i%=D=idtHvYZP9a{92e zicTy+g2X8S-f zt-U`>z1;7h%M`(QkJ2_%WefB0SpH0~fD}FZz^D)O+vVQzv5Ee6A*YPl7t?$~0wT-D!{2n|A_c-U1)n|syta0Om^?=OjjGx3VLu*aG zC3R*pH}&nx?A}}Ja&R{VSt-F>0i+64QnIJ8buqAskPw9&rknHpcKq9O#S~WAwYmAK zq3YLcLZ$vCgQ)2`3mnOm@x$wq&gSc;%CJd*vj#lE4W%rW_#0KBw8vO`#R}7@Unme& z)@|~(0tGGsqrU?@Qk02IQW~5XBQgc+HBgPQW8Y9r!UxdqZE$26WAu<0U5yf9g->;;(a{x$9 zX$TxQz!9Vi0uI|6K-LI!%80L~3sQ3g-E^dCC{;mLm)*XIh62$lZPi+VSV3!)FM&uw zYX8qdl>feWcumn})~-nV{w3hv0aHSaG*kp6;tP1p0_$RH0p>9)9q(nt4^sh6(Vf

gV0&F14iC7F;)H;n}^$phFWtTHjz&bDJg*F&$`@UvCHlQ7Xz?#AVy!mXm_PUMi_ zEO!qAb__%WV`Y>RqT(lr-eBkC&oOz0W5o^@TmYXPN)8k9u|d{^Y|Y-uwr zQ%aY99-v|d($Ir+-XT<7{iVugV>-Anv?cTjjixy7j943zw8hhS<@e8}}XQA8&xxql01 zOZ3n`8>CTC{@$mav9o@^nz(BlR(gX(n6HH6dTyfg#LLjtW zl!9ih>NPd+BpIkXWyB(RI*l;1wrcCR=TQAc*#Oi-w1bOVD2hi*IV2{PYu`S1m9RfB zF<@5s=7iX$*QSqXxf1Bhn`x@*A?-$=s&A*-wZ#jHm{1IscSQQCnJvxsMMlb9XZwSZ z0;wW4w{L;h#-rf~Cfb#zSP%~iuckCRr&a4xK$67>gb&I+p)DTfT@Z~b?(1G?PtyswKT vpn + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +

+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
byte_container_with_subtype< BinaryType > Member List
+
+
+ +

This is the complete list of members for byte_container_with_subtype< BinaryType >, including all inherited members.

+ + + + + + + + + + + + + + +
byte_container_with_subtype() noexcept(noexcept(container_type()))byte_container_with_subtype< BinaryType >inline
byte_container_with_subtype(const container_type &b) noexcept(noexcept(container_type(b)))byte_container_with_subtype< BinaryType >inline
byte_container_with_subtype(container_type &&b) noexcept(noexcept(container_type(std::move(b))))byte_container_with_subtype< BinaryType >inline
byte_container_with_subtype(const container_type &b, subtype_type subtype_) noexcept(noexcept(container_type(b)))byte_container_with_subtype< BinaryType >inline
byte_container_with_subtype(container_type &&b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b))))byte_container_with_subtype< BinaryType >inline
clear_subtype() noexceptbyte_container_with_subtype< BinaryType >inline
container_type typedef (defined in byte_container_with_subtype< BinaryType >)byte_container_with_subtype< BinaryType >
has_subtype() const noexceptbyte_container_with_subtype< BinaryType >inline
operator!=(const byte_container_with_subtype &rhs) const (defined in byte_container_with_subtype< BinaryType >)byte_container_with_subtype< BinaryType >inline
operator==(const byte_container_with_subtype &rhs) const (defined in byte_container_with_subtype< BinaryType >)byte_container_with_subtype< BinaryType >inline
set_subtype(subtype_type subtype_) noexceptbyte_container_with_subtype< BinaryType >inline
subtype() const noexceptbyte_container_with_subtype< BinaryType >inline
subtype_type typedef (defined in byte_container_with_subtype< BinaryType >)byte_container_with_subtype< BinaryType >
+
+
+ + + + diff --git a/doc/html/classbyte__container__with__subtype.html b/doc/html/classbyte__container__with__subtype.html new file mode 100644 index 0000000..5de1682 --- /dev/null +++ b/doc/html/classbyte__container__with__subtype.html @@ -0,0 +1,429 @@ + + + + + + + +Minecraft Community Edition: byte_container_with_subtype< BinaryType > Class Template Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
byte_container_with_subtype< BinaryType > Class Template Reference
+
+
+ +

an internal type for a backed binary type + More...

+ +

#include <json.hpp>

+
+Inheritance diagram for byte_container_with_subtype< BinaryType >:
+
+
+ +
+ + + + +

+Public Types

+using container_type = BinaryType
+using subtype_type = std::uint64_t
+ + + + + + + + + + + + + + + + +

+Public Member Functions

 byte_container_with_subtype () noexcept(noexcept(container_type()))
 byte_container_with_subtype (const container_type &b) noexcept(noexcept(container_type(b)))
 byte_container_with_subtype (container_type &&b) noexcept(noexcept(container_type(std::move(b))))
 byte_container_with_subtype (const container_type &b, subtype_type subtype_) noexcept(noexcept(container_type(b)))
 byte_container_with_subtype (container_type &&b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b))))
+bool operator== (const byte_container_with_subtype &rhs) const
+bool operator!= (const byte_container_with_subtype &rhs) const
void set_subtype (subtype_type subtype_) noexcept
 sets the binary subtype
constexpr subtype_type subtype () const noexcept
 return the binary subtype
constexpr bool has_subtype () const noexcept
 return whether the value has a subtype
void clear_subtype () noexcept
 clears the binary subtype
+

Detailed Description

+
template<typename BinaryType>
+class byte_container_with_subtype< BinaryType >

an internal type for a backed binary type

+
See also
https://json.nlohmann.me/api/byte_container_with_subtype/
+

Constructor & Destructor Documentation

+ +

◆ byte_container_with_subtype() [1/5]

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + +
byte_container_with_subtype< BinaryType >::byte_container_with_subtype ()
+
+inlinenoexcept
+
+
+ +

◆ byte_container_with_subtype() [2/5]

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + +
byte_container_with_subtype< BinaryType >::byte_container_with_subtype (const container_type & b)
+
+inlinenoexcept
+
+
+ +

◆ byte_container_with_subtype() [3/5]

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + +
byte_container_with_subtype< BinaryType >::byte_container_with_subtype (container_type && b)
+
+inlinenoexcept
+
+
+ +

◆ byte_container_with_subtype() [4/5]

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + + + + + +
byte_container_with_subtype< BinaryType >::byte_container_with_subtype (const container_type & b,
subtype_type subtype_ )
+
+inlinenoexcept
+
+
+ +

◆ byte_container_with_subtype() [5/5]

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + + + + + +
byte_container_with_subtype< BinaryType >::byte_container_with_subtype (container_type && b,
subtype_type subtype_ )
+
+inlinenoexcept
+
+
+

Member Function Documentation

+ +

◆ clear_subtype()

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + +
void byte_container_with_subtype< BinaryType >::clear_subtype ()
+
+inlinenoexcept
+
+
+ +

◆ has_subtype()

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + +
bool byte_container_with_subtype< BinaryType >::has_subtype () const
+
+inlineconstexprnoexcept
+
+ +

return whether the value has a subtype

+
See also
https://json.nlohmann.me/api/byte_container_with_subtype/has_subtype/
+ +
+
+ +

◆ set_subtype()

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + +
void byte_container_with_subtype< BinaryType >::set_subtype (subtype_type subtype_)
+
+inlinenoexcept
+
+
+ +

◆ subtype()

+ +
+
+
+template<typename BinaryType>
+ + + + + +
+ + + + + + + +
subtype_type byte_container_with_subtype< BinaryType >::subtype () const
+
+inlineconstexprnoexcept
+
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/classbyte__container__with__subtype.png b/doc/html/classbyte__container__with__subtype.png new file mode 100644 index 0000000000000000000000000000000000000000..ed56fd4cd7192fb76fa8b929e8979711ed370929 GIT binary patch literal 811 zcmeAS@N?(olHy`uVBq!ia0y~yVB`d{12~w0q^(22T_7bL;1lBd|Nnm=^Y!c3Jv}|k zEetdZB&MHv@!-J&p!lnEc{_n}oFzei!3;n?7??B7zQVx3w9V7SF{Fa=?cCc%hZT5S zrcZzO@4xtUPlIU;)_Kc!`fQfVt?AS`>?pKeW2s2CWq`+}MV>QQPNt|O3aL!C?L4y8 zGX9*(&c(M5d43YD66^ftJZX1TYMtH8BUkfY$4#%_x%c1hjjPJ%%6r;{=qqewTFG^N zrpq_wlkKm5)++g|y*T6fk^d@!tCM}(t~tNH{AAnGW0OxkPF2|z!=d8zIHSYk)4{4_ zA^FSddi+I^PcGZvwf6YrQ7I7pUFD?uOIr^ghZ?m`$qxRroRey{`W#a6P&4M7tS~c2 zG0;mhOq1b5Q7vObsu1Im>47s?8qSIdxFrfPESlNu$>5PDq{gT)6X=r$kWUyU&1@lB z@JRJUNKmMpoa8y9WeLcDNs~;4Bu`k{%)Xxaf41i(pUWFPF0IJkz5j8vIjiTc_4Z1N zp3A?KtDLi(C!eHnQ6OGVU)j&(_1#?pXBV#Z;k_VpTfynZ>-npbx%d3cDSYmzuJSBC z@8+dCzUEY+=vT{D+syrXC8nvqF86noil9t;*UV#Yk6$|ECiHmvbCqMAtZFN*-c6WM z**lrD_`UjW`HJ_iYcG7bcTL^tz>lwb#R93Zk4>a$JyzgC07-vCRk?Z ztxDv574XT3b^FgFQr+{8ge6}VtJ+X@H@nkC_pWB=T@i`2sl|^hq_3N8{pZ*8_L+-) z(_yozibUwUlvVak%vvqZiZZfJC=ueMfsdEBbzd)$L9n + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
detail::json_ref< BasicJsonType > Member List
+
+
+ +

This is the complete list of members for detail::json_ref< BasicJsonType >, including all inherited members.

+ + + + + + + + + + + + + + +
json_ref(value_type &&value) (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >inline
json_ref(const value_type &value) (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >inline
json_ref(std::initializer_list< json_ref > init) (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >inline
json_ref(Args &&... args) (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >inline
json_ref(json_ref &&) noexcept=default (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >
json_ref(const json_ref &)=delete (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >
moved_or_copied() const (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >inline
operator*() const (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >inline
operator->() const (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >inline
operator=(const json_ref &)=delete (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >
operator=(json_ref &&)=delete (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >
value_type typedef (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >
~json_ref()=default (defined in detail::json_ref< BasicJsonType >)detail::json_ref< BasicJsonType >
+
+
+ + + + diff --git a/doc/html/classdetail_1_1json__ref.html b/doc/html/classdetail_1_1json__ref.html new file mode 100644 index 0000000..b8c77e6 --- /dev/null +++ b/doc/html/classdetail_1_1json__ref.html @@ -0,0 +1,148 @@ + + + + + + + +Minecraft Community Edition: detail::json_ref< BasicJsonType > Class Template Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
detail::json_ref< BasicJsonType > Class Template Reference
+
+
+ + + +

+Public Types

+using value_type = BasicJsonType
+ + + + + + + + + + + + + +

+Public Member Functions

json_ref (value_type &&value)
json_ref (const value_type &value)
json_ref (std::initializer_list< json_ref > init)
+template<class... Args, enable_if_t< std::is_constructible< value_type, Args... >::value, int > = 0>
 json_ref (Args &&... args)
json_ref (json_ref &&) noexcept=default
json_ref (const json_ref &)=delete
+json_ref & operator= (const json_ref &)=delete
+json_ref & operator= (json_ref &&)=delete
+value_type moved_or_copied () const
+value_type const & operator* () const
+value_type const * operator-> () const
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/classes.html b/doc/html/classes.html new file mode 100644 index 0000000..a309bbe --- /dev/null +++ b/doc/html/classes.html @@ -0,0 +1,147 @@ + + + + + + + +Minecraft Community Edition: Class Index + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
C | E | F | G | I | L | M | O | Q | R | S | T | V
+ +
+
+
+ + + + diff --git a/doc/html/classjson__pointer.html b/doc/html/classjson__pointer.html new file mode 100644 index 0000000..6ccc5f9 --- /dev/null +++ b/doc/html/classjson__pointer.html @@ -0,0 +1,123 @@ + + + + + + + +Minecraft Community Edition: json_pointer< RefStringType > Class Template Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
json_pointer< RefStringType > Class Template Reference
+
+
+ +

JSON Pointer defines a string syntax for identifying a specific value within a JSON document. + More...

+

Detailed Description

+
template<typename RefStringType>
+class json_pointer< RefStringType >

JSON Pointer defines a string syntax for identifying a specific value within a JSON document.

+
See also
https://json.nlohmann.me/api/json_pointer/
+

The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_coroutine_scheduler-members.html b/doc/html/classmce_1_1_coroutine_scheduler-members.html new file mode 100644 index 0000000..3fe3e7d --- /dev/null +++ b/doc/html/classmce_1_1_coroutine_scheduler-members.html @@ -0,0 +1,113 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::CoroutineScheduler Member List
+
+
+ +

This is the complete list of members for mce::CoroutineScheduler, including all inherited members.

+ + + + + + +
addTask(Callback cb)mce::CoroutineScheduler
Callback typedefmce::CoroutineScheduler
CoroutineScheduler()=defaultmce::CoroutineScheduler
processTasks()mce::CoroutineScheduler
~CoroutineScheduler() (defined in mce::CoroutineScheduler)mce::CoroutineScheduler
+
+
+ + + + diff --git a/doc/html/classmce_1_1_coroutine_scheduler.html b/doc/html/classmce_1_1_coroutine_scheduler.html new file mode 100644 index 0000000..48b4a95 --- /dev/null +++ b/doc/html/classmce_1_1_coroutine_scheduler.html @@ -0,0 +1,215 @@ + + + + + + + +Minecraft Community Edition: mce::CoroutineScheduler Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::CoroutineScheduler Class Reference
+
+
+ +

Coroutine scheduler that manages periodic tasks. + More...

+ +

#include <CoroutineScheduler.hpp>

+ + + + +

+Classes

struct  Task
 Represents a single scheduled task. More...
+ + + +

+Public Types

using Callback = eastl::function<sf::Time()>
 Callback type invoked by scheduled tasks.
+ + + + + + + +

+Public Member Functions

CoroutineScheduler ()=default
 Default constructor.
void addTask (Callback cb)
 Add a task to the scheduler.
void processTasks ()
 Process all scheduled tasks.
+

Detailed Description

+

Coroutine scheduler that manages periodic tasks.

+

The scheduler stores tasks that each have their own clock and interval. Each task's callback should return an sf::Time representing the time to wait until the next invocation. When a task's clock has elapsed at least its interval the callback is invoked and the returned sf::Time is used as the new interval.

+

example usage:

+

addTask([]() -> sf::Time {

+

return sf::seconds(1);

+

}

+

Member Typedef Documentation

+ +

◆ Callback

+ +
+
+ + + + +
using mce::CoroutineScheduler::Callback = eastl::function<sf::Time()>
+
+ +

Callback type invoked by scheduled tasks.

+
Returns
An sf::Time that indicates how long to wait until the next invocation of this callback.
+ +
+
+

Member Function Documentation

+ +

◆ addTask()

+ +
+
+ + + + + + + +
void mce::CoroutineScheduler::addTask (Callback cb)
+
+ +

Add a task to the scheduler.

+
Parameters
+ + +
cbThe callback to schedule. The callback is invoked immediately to obtain the initial interval.
+
+
+

The callback should return an sf::Time specifying how long to wait until the next invocation. The task's clock is restarted when added.

+ +
+
+ +

◆ processTasks()

+ +
+
+ + + + + + + +
void mce::CoroutineScheduler::processTasks ()
+
+ +

Process all scheduled tasks.

+

This should be called periodically (for example once per frame). For each task if its clock has elapsed at least its interval, the task's callback is invoked, the returned sf::Time is used as the new interval, and the task clock is restarted.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_coroutine_scheduler.js b/doc/html/classmce_1_1_coroutine_scheduler.js new file mode 100644 index 0000000..d8a7bc0 --- /dev/null +++ b/doc/html/classmce_1_1_coroutine_scheduler.js @@ -0,0 +1,8 @@ +var classmce_1_1_coroutine_scheduler = +[ + [ "Task", "structmce_1_1_coroutine_scheduler_1_1_task.html", "structmce_1_1_coroutine_scheduler_1_1_task" ], + [ "Callback", "classmce_1_1_coroutine_scheduler.html#acd70e48944e7dadad6ec0514f587432a", null ], + [ "CoroutineScheduler", "classmce_1_1_coroutine_scheduler.html#a08b0a86a4940c34b5db26acefa3e316c", null ], + [ "addTask", "classmce_1_1_coroutine_scheduler.html#a4720b9b79d6dc3182f531837d364453d", null ], + [ "processTasks", "classmce_1_1_coroutine_scheduler.html#a172c9650e9b298a3e2e03ff0e9571dfb", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_file_input_stream-members.html b/doc/html/classmce_1_1_file_input_stream-members.html new file mode 100644 index 0000000..b213b98 --- /dev/null +++ b/doc/html/classmce_1_1_file_input_stream-members.html @@ -0,0 +1,121 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::FileInputStream Member List
+
+
+ +

This is the complete list of members for mce::FileInputStream, including all inherited members.

+ + + + + + + + + + + + + + +
close()mce::FileInputStream
FILE_NOT_FOUND (defined in mce::FileInputStream)mce::FileInputStreaminlinestatic
FileInputStream() (defined in mce::FileInputStream)mce::FileInputStream
getSize() overridemce::FileInputStreamvirtual
INVALID_FILE_POSITION (defined in mce::FileInputStream)mce::FileInputStreaminlinestatic
INVALID_FILE_SIZE (defined in mce::FileInputStream)mce::FileInputStreaminlinestatic
isOpen() constmce::FileInputStream
open(const std::string &file)mce::FileInputStream
read(void *buffer, size_t size) overridemce::FileInputStreamvirtual
seek(size_t position) overridemce::FileInputStreamvirtual
tell() overridemce::FileInputStreamvirtual
~FileInputStream() (defined in mce::FileInputStream)mce::FileInputStream
~InputStream()=0 (defined in mce::InputStream)mce::InputStreampure virtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_file_input_stream.html b/doc/html/classmce_1_1_file_input_stream.html new file mode 100644 index 0000000..0411b16 --- /dev/null +++ b/doc/html/classmce_1_1_file_input_stream.html @@ -0,0 +1,333 @@ + + + + + + + +Minecraft Community Edition: mce::FileInputStream Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::FileInputStream Class Referencefinal
+
+
+
+Inheritance diagram for mce::FileInputStream:
+
+
+ + +mce::InputStream + +
+ + + + + + + + + + + + + +

+Public Member Functions

bool open (const std::string &file)
 Constructs the stream and opens a file.
bool isOpen () const
+void close ()
 Closes the file.
size_t read (void *buffer, size_t size) override
 Reads from the input stream.
size_t seek (size_t position) override
 Changes the current position the stream is reading.
size_t tell () override
size_t getSize () override
+ + + + +

+Static Public Attributes

+static constexpr size_t FILE_NOT_FOUND = 0
+static constexpr size_t INVALID_FILE_SIZE = ~(0)
+static constexpr size_t INVALID_FILE_POSITION = ~(0)
+

Member Function Documentation

+ +

◆ getSize()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::FileInputStream::getSize ()
+
+overridevirtual
+
+
Returns
The size of the stream in bytes
+ +

Implements mce::InputStream.

+ +
+
+ +

◆ isOpen()

+ +
+
+ + + + + + + +
bool mce::FileInputStream::isOpen () const
+
+
Returns
True if the file was successfully opened
+ +
+
+ +

◆ open()

+ +
+
+ + + + + + + +
bool mce::FileInputStream::open (const std::string & file)
+
+ +

Constructs the stream and opens a file.

+
Parameters
+ + +
fileThe path (absolute or relative) to the file
+
+
+

Opens a file to read from

Parameters
+ + +
fileThe path (absolute or relative) to the file
+
+
+ +
+
+ +

◆ read()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
size_t mce::FileInputStream::read (void * buffer,
size_t size )
+
+overridevirtual
+
+ +

Reads from the input stream.

+
Parameters
+ + + +
bufferThe buffer to read the bytes into
sizeThe amount of bytes to read
+
+
+
Returns
The amount of bytes written
+ +

Implements mce::InputStream.

+ +
+
+ +

◆ seek()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::FileInputStream::seek (size_t position)
+
+overridevirtual
+
+ +

Changes the current position the stream is reading.

+
Parameters
+ + +
positionThe position to seek the input stream to
+
+
+
Returns
The position the input stream is at now
+ +

Implements mce::InputStream.

+ +
+
+ +

◆ tell()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::FileInputStream::tell ()
+
+overridevirtual
+
+
Returns
The current position the stream is at
+ +

Implements mce::InputStream.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_file_input_stream.js b/doc/html/classmce_1_1_file_input_stream.js new file mode 100644 index 0000000..ea6f648 --- /dev/null +++ b/doc/html/classmce_1_1_file_input_stream.js @@ -0,0 +1,10 @@ +var classmce_1_1_file_input_stream = +[ + [ "close", "classmce_1_1_file_input_stream.html#abe975adc14ec46da5085aa396bf6bb17", null ], + [ "getSize", "classmce_1_1_file_input_stream.html#a271ddb30e8c58bbb759c03a6970277e1", null ], + [ "isOpen", "classmce_1_1_file_input_stream.html#a26a715bb8bb53cb3cb1b1de6059af07a", null ], + [ "open", "classmce_1_1_file_input_stream.html#a3eb6e463ae37bd285915c3b41fd5f53e", null ], + [ "read", "classmce_1_1_file_input_stream.html#a6bf0dffd4568ef1638aed7aafa2ecd00", null ], + [ "seek", "classmce_1_1_file_input_stream.html#a8a46a90250858695bf282ed1fc601cc8", null ], + [ "tell", "classmce_1_1_file_input_stream.html#a3f974238eeb105b85e455145cc85518a", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_file_input_stream.png b/doc/html/classmce_1_1_file_input_stream.png new file mode 100644 index 0000000000000000000000000000000000000000..68ef5fb464fb1c7ac259730b777248a636f9ef18 GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^4L}^g!3-py-Rr#uq@)9ULR|m<{|{uIJM~plZsBqZ z1I+@7>1SR%c<=xyUUA58D^QNJB*-tA0mugfbEer>7#JA0db&7yN)y7qc*= z{dR5Gb5xFD+Zl$ASl#;_vHl_Yx87Cz7l&BKnxs^OvnsT)PFVW7@ad}yell9WY-A5b ziZ;lkvHr?va$e~hF6d^gBF}W?*)4_%+Pdp@FVdQ&MBb@02@%=vH$=8 literal 0 HcmV?d00001 diff --git a/doc/html/classmce_1_1_file_output_stream-members.html b/doc/html/classmce_1_1_file_output_stream-members.html new file mode 100644 index 0000000..4bb169b --- /dev/null +++ b/doc/html/classmce_1_1_file_output_stream-members.html @@ -0,0 +1,119 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::FileOutputStream Member List
+
+
+ +

This is the complete list of members for mce::FileOutputStream, including all inherited members.

+ + + + + + + + + + + + +
close()mce::FileOutputStream
FileOutputStream()=defaultmce::FileOutputStream
getSize() overridemce::FileOutputStreamvirtual
INVALID_FILE_POSITIONmce::FileOutputStreaminlinestatic
INVALID_FILE_SIZEmce::FileOutputStreaminlinestatic
isOpen() constmce::FileOutputStream
open(const std::string &file)mce::FileOutputStream
seek(size_t position) overridemce::FileOutputStreamvirtual
tell() overridemce::FileOutputStreamvirtual
write(const void *buffer, size_t size) overridemce::FileOutputStreamvirtual
~OutputStream()=0 (defined in mce::OutputStream)mce::OutputStreampure virtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_file_output_stream.html b/doc/html/classmce_1_1_file_output_stream.html new file mode 100644 index 0000000..1624363 --- /dev/null +++ b/doc/html/classmce_1_1_file_output_stream.html @@ -0,0 +1,373 @@ + + + + + + + +Minecraft Community Edition: mce::FileOutputStream Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::FileOutputStream Class Referencefinal
+
+
+ +

Platform-independent file output stream implementation. + More...

+ +

#include <FileOutputStream.hpp>

+
+Inheritance diagram for mce::FileOutputStream:
+
+
+ + +mce::OutputStream + +
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

FileOutputStream ()=default
 Default constructor.
bool open (const std::string &file)
 Opens a file for writing (creates/truncates by default).
bool isOpen () const
 Query whether the underlying file handle is open.
+void close ()
 Close the file and release any resources.
size_t write (const void *buffer, size_t size) override
 Write bytes to the file.
size_t seek (size_t position) override
 Change the current write position in the file.
size_t tell () override
 Get the current write position in the file.
size_t getSize () override
 Get the total size of the underlying file in bytes.
+ + + + + +

+Static Public Attributes

static constexpr size_t INVALID_FILE_SIZE = ~(0)
 Constant indicating an invalid file size/position.
+static constexpr size_t INVALID_FILE_POSITION = ~(0)
 Constant indicating an invalid file position.
+

Detailed Description

+

Platform-independent file output stream implementation.

+

Provides a concrete OutputStream that writes data to a file using the platform native file handle or FILE* depending on the platform.

+

Member Function Documentation

+ +

◆ getSize()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::FileOutputStream::getSize ()
+
+overridevirtual
+
+ +

Get the total size of the underlying file in bytes.

+
Returns
File size in bytes or INVALID_FILE_SIZE on error.
+ +

Implements mce::OutputStream.

+ +
+
+ +

◆ isOpen()

+ +
+
+ + + + + + + +
bool mce::FileOutputStream::isOpen () const
+
+ +

Query whether the underlying file handle is open.

+
Returns
True when the file is open and ready for writing.
+ +
+
+ +

◆ open()

+ +
+
+ + + + + + + +
bool mce::FileOutputStream::open (const std::string & file)
+
+ +

Opens a file for writing (creates/truncates by default).

+
Parameters
+ + +
filePath (absolute or relative) to the file to open.
+
+
+
Returns
True if the file was successfully opened.
+ +
+
+ +

◆ seek()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::FileOutputStream::seek (size_t position)
+
+overridevirtual
+
+ +

Change the current write position in the file.

+
Parameters
+ + +
positionThe absolute position (in bytes) to seek to.
+
+
+
Returns
The new position in the file after seeking.
+ +

Implements mce::OutputStream.

+ +
+
+ +

◆ tell()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::FileOutputStream::tell ()
+
+overridevirtual
+
+ +

Get the current write position in the file.

+
Returns
Current position in bytes from the start of the file.
+ +

Implements mce::OutputStream.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
size_t mce::FileOutputStream::write (const void * buffer,
size_t size )
+
+overridevirtual
+
+ +

Write bytes to the file.

+
Parameters
+ + + +
bufferPointer to the data to write.
sizeNumber of bytes to write from buffer.
+
+
+
Returns
Number of bytes actually written.
+ +

Implements mce::OutputStream.

+ +
+
+

Member Data Documentation

+ +

◆ INVALID_FILE_SIZE

+ +
+
+ + + + + +
+ + + + +
size_t mce::FileOutputStream::INVALID_FILE_SIZE = ~(0)
+
+inlinestaticconstexpr
+
+ +

Constant indicating an invalid file size/position.

+

This value is returned by getSize() or tell() when the operation fails.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_file_output_stream.js b/doc/html/classmce_1_1_file_output_stream.js new file mode 100644 index 0000000..b54c6c7 --- /dev/null +++ b/doc/html/classmce_1_1_file_output_stream.js @@ -0,0 +1,11 @@ +var classmce_1_1_file_output_stream = +[ + [ "FileOutputStream", "classmce_1_1_file_output_stream.html#a0ab5f8d7e010b94a072bc13b52e5dd1c", null ], + [ "close", "classmce_1_1_file_output_stream.html#a695bf4b8e186fcd40a666487e4e4b8f1", null ], + [ "getSize", "classmce_1_1_file_output_stream.html#a4160ad51b9d0d867e45bba2a3a4d30db", null ], + [ "isOpen", "classmce_1_1_file_output_stream.html#ae17a2bca1876c50cb5725b41551dd43b", null ], + [ "open", "classmce_1_1_file_output_stream.html#acc1a4e675eba02a8dad17a6acd1d4265", null ], + [ "seek", "classmce_1_1_file_output_stream.html#aa198c5d7ebede14fa06d0de7a05a2028", null ], + [ "tell", "classmce_1_1_file_output_stream.html#aa6659c362021935717bbfc176075877a", null ], + [ "write", "classmce_1_1_file_output_stream.html#ac6e82fc9655a7a1dfd3d981519f18583", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_file_output_stream.png b/doc/html/classmce_1_1_file_output_stream.png new file mode 100644 index 0000000000000000000000000000000000000000..138dc2ef60fb24a44c3db6b8c74a49fc1e17678b GIT binary patch literal 646 zcmeAS@N?(olHy`uVBq!ia0vp^T|gYb!3-on{*jdjQqloFA+G=b{|7S9o%*UNw{W?I zfo6fk^fNCWJa_;UuQ=ql6)4A9666=m0OW&#In(Sb3=B+yo-U3d6^w7^9_%};z~j>H zxa!aU_&u3T2Q4;uPvMT*nZ#vy%qC`X+{EH@)f_Wb$^#ZmSP~Az*Ndl=)VxtXxvrM? z=yNmoNx`;mmWOBCx@o-nETy_NWi-UQ7_+miZ>Gr3!lvSEXLIE{TIUlxm)Z{Ki_Oim7mg_B0jA*;1L_+ zf!IbShB#vJe?HZvQ@#mI>Nvs2B_b%e-a%0CW0dnwtv@f$Uz_=MaYxD9Yz;f^-8zfT zv_D>%6)<02W2Nq%zAXPWiyvK*4ar^p_4nGB8f<6h=Or%Q?rS~8*sC|&>h;@YR#UQ- z-v{z7aTbp?FO7V;{cYWYAT4fE76Yv uU0m+H_T2z-b60&D)b+Qxfj-)Hf&bfy!n`?*;$MI%hQZU-&t;ucLK6UmX(T`Z literal 0 HcmV?d00001 diff --git a/doc/html/classmce_1_1_file_sink-members.html b/doc/html/classmce_1_1_file_sink-members.html new file mode 100644 index 0000000..706ade4 --- /dev/null +++ b/doc/html/classmce_1_1_file_sink-members.html @@ -0,0 +1,111 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::FileSink Member List
+
+
+ +

This is the complete list of members for mce::FileSink, including all inherited members.

+ + + + +
FileSink(std::string_view filename) (defined in mce::FileSink)mce::FileSinkexplicit
log(std::string_view prettyMessage, std::string_view basicMessage) override (defined in mce::FileSink)mce::FileSinkvirtual
~LoggerSink()=default (defined in mce::LoggerSink)mce::LoggerSinkvirtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_file_sink.html b/doc/html/classmce_1_1_file_sink.html new file mode 100644 index 0000000..678b1f1 --- /dev/null +++ b/doc/html/classmce_1_1_file_sink.html @@ -0,0 +1,165 @@ + + + + + + + +Minecraft Community Edition: mce::FileSink Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::FileSink Class Referencefinal
+
+
+
+Inheritance diagram for mce::FileSink:
+
+
+ + +mce::LoggerSink + +
+ + + + +

+Public Member Functions

FileSink (std::string_view filename)
void log (std::string_view prettyMessage, std::string_view basicMessage) override
+

Member Function Documentation

+ +

◆ log()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void mce::FileSink::log (std::string_view prettyMessage,
std::string_view basicMessage )
+
+overridevirtual
+
+ +

Implements mce::LoggerSink.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_file_sink.png b/doc/html/classmce_1_1_file_sink.png new file mode 100644 index 0000000000000000000000000000000000000000..0d627fc548a0ebc4c001477b475f4f4eb4762bb5 GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^nLr%C!3-pIHCN{XDd_;85ZC|z{{xxlPJPvsTe#f9 zK(jz%`k5CG9y|bwR~+)&3Y6n43GxeO0P?}WoN4wI1_s8No-U3d6^w7^=B{s6;A!P= zKl0`O|3|MUZ1*Z%w^Q+S)5kSIyX*q2zKa?jvvBQDv2^TqnG{zmtvTU|aO>Zok8fYr zdusZzN-z0PBsVcL^5}{mR#R=RrW`Ol^YORBdp&DuP2Z=SsZj;bgO?S2Ztq(0CC@)C zZ0qtw!MQ69m*1TAc-9pD@3t@RuaJQdUcTNg(c=!Uw0)(zFB4OufU)l!*c=*HEVbo zmSsp~-cDP%Y+~63l`A%v{J-5(Vr+=+W?_ia6=JB^>cQ~fDo`LCA@Gz-u|?BKKyc;) zS0TZVud+Se#owCU-TOUtmb1%~CH|h*lB(rKNA;n(Jsgq1S=oZ+|R%&TdsQ{FRbs++I6?ytFRa*FI%iG`l?!~Lh8 zP`Ua|l0VdC*YCC^)#qPz=p|*$XWV+vO-U(EcTz`3xV;z9F_OQS8S}$`-QKM;2N-h< Mp00i_>zopr01}1q!T + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::FunctionContainer Member List
+
+
+ +

This is the complete list of members for mce::FunctionContainer, including all inherited members.

+ + + + + + + + +
addFunction(const eastl::string &name, Functor functor)mce::FunctionContainerinline
callFunction(const eastl::string &name, Arguments &&... args)mce::FunctionContainerinline
findFunction(const eastl::string &name)mce::FunctionContainer
FunctionContainer()=defaultmce::FunctionContainer
FunctionContainer(QEventBus &qBus, std::initializer_list< std::pair< eastl::string, eastl::any > > initlist)mce::FunctionContainer
getFunction(const eastl::string &name)mce::FunctionContainerinline
operator[](const eastl::string &name)mce::FunctionContainerinline
+
+
+ + + + diff --git a/doc/html/classmce_1_1_function_container.html b/doc/html/classmce_1_1_function_container.html new file mode 100644 index 0000000..6173142 --- /dev/null +++ b/doc/html/classmce_1_1_function_container.html @@ -0,0 +1,399 @@ + + + + + + + +Minecraft Community Edition: mce::FunctionContainer Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::FunctionContainer Class Reference
+
+
+ +

Container for storing and invoking named functions. + More...

+ +

#include <FunctionContainer.hpp>

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

+Public Member Functions

FunctionContainer ()=default
 Default constructor.
 FunctionContainer (QEventBus &qBus, std::initializer_list< std::pair< eastl::string, eastl::any > > initlist)
 Construct the container with an initializer list of name/value pairs.
template<typename Functor>
void addFunction (const eastl::string &name, Functor functor)
 Add a function to the container.
template<typename Return, typename... Arguments>
Return callFunction (const eastl::string &name, Arguments &&... args)
 Call a stored function by name with the provided arguments.
bool findFunction (const eastl::string &name)
 Check whether a function with the given name exists in the container.
template<typename Return, typename... Arguments>
eastl::function< Return(Arguments...)> operator[] (const eastl::string &name)
 Retrieve a stored function as an eastl::function via operator[].
template<typename Return, typename... Arguments>
eastl::function< Return(Arguments...)> getFunction (const eastl::string &name)
 Retrieve a stored function as an eastl::function.
+

Detailed Description

+

Container for storing and invoking named functions.

+

This class allows storing callables (wrapped as eastl::any) associated with string keys. Functions can be retrieved, cast to the expected signature, and invoked. The API supports adding functions, calling them by name, checking for existence, and retrieving a stored function as an eastl::function object.

+

A usage example: FunctionContainer fc = { { "foo", eastl::function<int(int)>([](int value) -> int{ return value + 1; }) } }; if(fc.findFunction("foo") fc.callFunction<int, int>("foo", 1);

+

Constructor & Destructor Documentation

+ +

◆ FunctionContainer()

+ +
+
+ + + + + + + + + + + +
mce::FunctionContainer::FunctionContainer (QEventBus & qBus,
std::initializer_list< std::pair< eastl::string, eastl::any > > initlist )
+
+ +

Construct the container with an initializer list of name/value pairs.

+

The initializer list should contain pairs of function name and eastl::any containing the callable.

+
Parameters
+ + +
initlistInitializer list of pairs (name, callable-as-eastl::any).
+
+
+ +
+
+

Member Function Documentation

+ +

◆ addFunction()

+ +
+
+
+template<typename Functor>
+ + + + + +
+ + + + + + + + + + + +
void mce::FunctionContainer::addFunction (const eastl::string & name,
Functor functor )
+
+inline
+
+ +

Add a function to the container.

+

Add a function implementation.

+

The callable will be stored in the internal map under the provided name. The callable is stored as an eastl::any and should be retrievable later by using the same signature when casting.

+
Template Parameters
+ + +
FunctorType of the callable being stored.
+
+
+
Parameters
+ + + +
nameThe name under which the function will be stored.
functorThe callable to store.
+
+
+

See addFunction documentation above.

+ +
+
+ +

◆ callFunction()

+ +
+
+
+template<typename Return, typename ... Arguments>
+ + + + + +
+ + + + + + + + + + + +
Return mce::FunctionContainer::callFunction (const eastl::string & name,
Arguments &&... args )
+
+inline
+
+ +

Call a stored function by name with the provided arguments.

+

Call a stored function implementation.

+

The template parameters specify the expected return type and argument types of the stored function. If the named function exists it will be cast to eastl::function<Return(Arguments...)> and invoked. If the function is not found an error is logged via MCE_ERROR and behavior is undefined for the returned value.

+
Template Parameters
+ + + +
ReturnThe expected return type of the function.
ArgumentsThe expected argument types of the function.
+
+
+
Parameters
+ + + +
nameThe name of the function to call.
argsArguments to forward to the function.
+
+
+
Returns
Return The value returned by the invoked function.
+

See callFunction documentation above.

+ +
+
+ +

◆ findFunction()

+ +
+
+ + + + + + + +
bool mce::FunctionContainer::findFunction (const eastl::string & name)
+
+ +

Check whether a function with the given name exists in the container.

+
Parameters
+ + +
nameThe name to check for.
+
+
+
Returns
true if a function with the given name exists, false otherwise.
+ +
+
+ +

◆ getFunction()

+ +
+
+
+template<typename Return, typename ... Arguments>
+ + + + + +
+ + + + + + + +
eastl::function< Return(Arguments...)> mce::FunctionContainer::getFunction (const eastl::string & name)
+
+inline
+
+ +

Retrieve a stored function as an eastl::function.

+

getFunction implementation to retrieve stored function.

+

Same behavior as operator[] but provided with an explicit named method.

+
Template Parameters
+ + + +
ReturnThe return type of the function.
ArgumentsThe argument types of the function.
+
+
+
Parameters
+ + +
nameThe name of the stored function.
+
+
+
Returns
eastl::function<Return(Arguments...)> The callable if found; a null function otherwise.
+

See getFunction documentation above.

+ +
+
+ +

◆ operator[]()

+ +
+
+
+template<typename Return, typename ... Arguments>
+ + + + + +
+ + + + + + + +
eastl::function< Return(Arguments...)> mce::FunctionContainer::operator[] (const eastl::string & name)
+
+inline
+
+ +

Retrieve a stored function as an eastl::function via operator[].

+

operator[] implementation to retrieve stored function.

+

The template specifies the expected signature of the function stored under the given name. If no function exists an error is logged and a null function is returned.

+
Template Parameters
+ + + +
ReturnThe return type of the function.
ArgumentsThe argument types of the function.
+
+
+
Parameters
+ + +
nameThe name of the stored function.
+
+
+
Returns
eastl::function<Return(Arguments...)> The callable if found; a null function otherwise.
+

See operator[] documentation above.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_function_container.js b/doc/html/classmce_1_1_function_container.js new file mode 100644 index 0000000..3cbed14 --- /dev/null +++ b/doc/html/classmce_1_1_function_container.js @@ -0,0 +1,10 @@ +var classmce_1_1_function_container = +[ + [ "FunctionContainer", "classmce_1_1_function_container.html#ad88b85713ffa87b60972a43be7da9517", null ], + [ "FunctionContainer", "classmce_1_1_function_container.html#a56021097f6d60531a37b7c6158b88ec7", null ], + [ "addFunction", "classmce_1_1_function_container.html#abaabfec7793c0a261354f592f20062ce", null ], + [ "callFunction", "classmce_1_1_function_container.html#a302e97f87b554bbaac24ca5d7f884385", null ], + [ "findFunction", "classmce_1_1_function_container.html#aeb8c83b9b780a1990007da8e8e5f3133", null ], + [ "getFunction", "classmce_1_1_function_container.html#a3d754d6d89dc40e1bb7c178941687b16", null ], + [ "operator[]", "classmce_1_1_function_container.html#ab0271b06ab337b65ae2a4ac79c80c55c", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_g_l_graphics_context-members.html b/doc/html/classmce_1_1_g_l_graphics_context-members.html new file mode 100644 index 0000000..a4742d2 --- /dev/null +++ b/doc/html/classmce_1_1_g_l_graphics_context-members.html @@ -0,0 +1,114 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::GLGraphicsContext Member List
+
+
+ +

This is the complete list of members for mce::GLGraphicsContext, including all inherited members.

+ + + + + + + +
API enum name (defined in mce::GraphicsContext)mce::GraphicsContext
create(API api) (defined in mce::GraphicsContext)mce::GraphicsContextstatic
createRenderer(sf::Window &window) override (defined in mce::GLGraphicsContext)mce::GLGraphicsContextvirtual
GLGraphicsContext() (defined in mce::GLGraphicsContext)mce::GLGraphicsContext
~GLGraphicsContext() override (defined in mce::GLGraphicsContext)mce::GLGraphicsContext
~GraphicsContext() (defined in mce::GraphicsContext)mce::GraphicsContextvirtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_g_l_graphics_context.html b/doc/html/classmce_1_1_g_l_graphics_context.html new file mode 100644 index 0000000..0ff469b --- /dev/null +++ b/doc/html/classmce_1_1_g_l_graphics_context.html @@ -0,0 +1,169 @@ + + + + + + + +Minecraft Community Edition: mce::GLGraphicsContext Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::GLGraphicsContext Class Referencefinal
+
+
+
+Inheritance diagram for mce::GLGraphicsContext:
+
+
+ + +mce::GraphicsContext + +
+ + + +

+Public Member Functions

eastl::unique_ptr< RenderercreateRenderer (sf::Window &window) override
+ + + + + +

+Additional Inherited Members

Public Types inherited from mce::GraphicsContext
enum class  API { OpenGL +, Vulkan + }
Static Public Member Functions inherited from mce::GraphicsContext
+static eastl::unique_ptr< GraphicsContextcreate (API api)
+

Member Function Documentation

+ +

◆ createRenderer()

+ +
+
+ + + + + +
+ + + + + + + +
eastl::unique_ptr< Renderer > mce::GLGraphicsContext::createRenderer (sf::Window & window)
+
+overridevirtual
+
+ +

Implements mce::GraphicsContext.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_g_l_graphics_context.png b/doc/html/classmce_1_1_g_l_graphics_context.png new file mode 100644 index 0000000000000000000000000000000000000000..2183d04b5dc5549c1df557a43ee3081614dd3602 GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^(||aDgBeJk$*ZXZQqloFA+G=b{|7S9o%*UNw{W?I zfo6fk^fNCWJa_;UuQ=ql6)4A9666=m0OW&#In(Sb3=B+`o-U3d6^w7^Ca(Xiz|q=2 zL+8)`_?qz5q5=0eE{&{tpL%lTTBcfu$o)#s=X@7761aUmYxNojmXU5v_a0>sa3&dK$Z?Bx26Ob1JFpKD{&0_C6nN%HjW3>CCCWl{3Xk zj%d|gjpNmIGu}Pz)vQfYu{~dnKCOzn6_9$z`{FXOKYO<@PcyP+-eq=?WjgD-e4(xJ zi8H_VrkQ?9k9d4=&!s=*TYr7o6(uasK22lm9oJ@4ORco|)4n_viEn22E?<=6zq3g z@OO*)wZ|J(ug{C{UnRTK>}Z!C3&VaUZiYQvIt(AQHZUAmeSnE!J$?cEhN(ebzd1W+ zR+_Vl8E+16JbLEMRPom@`jQRKpE=`JS`{;Q*NvIa-X7L+JMV3r2NGLdQ9M07;$>B~ zuh+9{-6_p;^R`Z^5}3H9+d%vKb63$V$)dY=tz!#Z!a2=g?Y2|da*vkITrn+jgX=5H zlR+J^bDv%=me?@mrewjcPPG{}3&Wp0^j-8#TW53U;>c`u@oNFATa8 zK3l^}yWF=t$^PcIEob<8v!0zyij7Np={M!ACfB`rPZ#AJ+$dZ<`>XTKqL*_kZr=N@ zU;q5M(uNr`_x?I>fA!3n_>crc + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::GLRenderer Member List
+
+
+ +

This is the complete list of members for mce::GLRenderer, including all inherited members.

+ + + + + +
GLRenderer(sf::Window &window) (defined in mce::GLRenderer)mce::GLRenderer
renderFrame() override (defined in mce::GLRenderer)mce::GLRenderervirtual
~GLRenderer() override (defined in mce::GLRenderer)mce::GLRenderer
~Renderer() (defined in mce::Renderer)mce::Renderervirtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_g_l_renderer.html b/doc/html/classmce_1_1_g_l_renderer.html new file mode 100644 index 0000000..7a68a7e --- /dev/null +++ b/doc/html/classmce_1_1_g_l_renderer.html @@ -0,0 +1,161 @@ + + + + + + + +Minecraft Community Edition: mce::GLRenderer Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::GLRenderer Class Referencefinal
+
+
+
+Inheritance diagram for mce::GLRenderer:
+
+
+ + +mce::Renderer + +
+ + + + +

+Public Member Functions

GLRenderer (sf::Window &window)
void renderFrame () override
+

Member Function Documentation

+ +

◆ renderFrame()

+ +
+
+ + + + + +
+ + + + + + + +
void mce::GLRenderer::renderFrame ()
+
+overridevirtual
+
+ +

Implements mce::Renderer.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_g_l_renderer.png b/doc/html/classmce_1_1_g_l_renderer.png new file mode 100644 index 0000000000000000000000000000000000000000..af71b004fe74d1e6d4aefb9cd2844ae2771c6827 GIT binary patch literal 513 zcmeAS@N?(olHy`uVBq!ia0vp^c|aV%!3-qNf88Jgq@)9ULR|m<{|{uIJM~plZsBqZ z1I+@7>1SR%c<=xyUUA58D^QNJB*-tA0mugfbEer>7#J9PJY5_^Dj46+eb~oj$kEcC zx#{8G`9JP#-Q5}%eqFiOFvjRm;%W9NKctsVG4j_?vGnd#KB-V^>UYh4lFSziuStI5 zh5p9%U6a2)vwgc)@b>w}-R$}4uLXtINcPls-7X4QV(c!ddt+b5!GrY|=lb5&+qGTV z%dpMKD)#Wrw;8Va2l>*o4gWoT*S7uhT + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::GraphicsContext Member List
+
+
+ +

This is the complete list of members for mce::GraphicsContext, including all inherited members.

+ + + + + +
API enum name (defined in mce::GraphicsContext)mce::GraphicsContext
create(API api) (defined in mce::GraphicsContext)mce::GraphicsContextstatic
createRenderer(sf::Window &window)=0 (defined in mce::GraphicsContext)mce::GraphicsContextpure virtual
~GraphicsContext() (defined in mce::GraphicsContext)mce::GraphicsContextvirtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_graphics_context.html b/doc/html/classmce_1_1_graphics_context.html new file mode 100644 index 0000000..f6ab755 --- /dev/null +++ b/doc/html/classmce_1_1_graphics_context.html @@ -0,0 +1,143 @@ + + + + + + + +Minecraft Community Edition: mce::GraphicsContext Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::GraphicsContext Class Referenceabstract
+
+
+
+Inheritance diagram for mce::GraphicsContext:
+
+
+ + +mce::GLGraphicsContext + +
+ + + +

+Public Types

enum class  API { OpenGL +, Vulkan + }
+ + +

+Public Member Functions

+virtual eastl::unique_ptr< RenderercreateRenderer (sf::Window &window)=0
+ + +

+Static Public Member Functions

+static eastl::unique_ptr< GraphicsContextcreate (API api)
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_graphics_context.png b/doc/html/classmce_1_1_graphics_context.png new file mode 100644 index 0000000000000000000000000000000000000000..6fef0c4e361abc051f57699b023779788003f1eb GIT binary patch literal 692 zcmeAS@N?(olHy`uVBq!ia0vp^(||aDgBeJk$*ZXZQqloFA+G=b{|7S9o%*UNw{W?I zfo6fk^fNCWJa_;UuQ=ql6)4A9666=m0OW&#In(Sb3=B;6o-U3d6^w7^zV3Uhz|+dl zzVg#=`;Xf=S!SQUCY$PZW}Wuj2@kyOc=G-!EuHdBcv8oSJT4tU!SzhuE=N}TZ;Xpo zQZicQ(|;|~!~U{ueMhOqdF8OmXNvQamQFuD^Ht1}xYhfrcgik%zE(1132$KD@xPTb z#Y&D?J?h#onbr5IY-ZQlieAOJ-;F-6in?}j&5o&y{B(arXR_-&E>kPXO`0AfzGJWF z)wkeqC~FVs`MF7cLARv^OvuSbczrVLcN!!yYajh7VeJ1%B~wC_493 z%@#<=DNcR@45~?Av^IEL($){F`WNT?-DlF=Q(rRXwtX>vdb6{%!d~ChyH@R_ANMWS z6V_`=_HNbjTEA9wrGHu5RIgi(shbo}z1?B2zia{T>kryx#w(P3H%!U?Xd3ugB>!&6 z)-?y`E!pLfYvLNQX8GF014eo2hhD0co&3VN*N8tqXls08>1>N#SIdeLd)W(HP4}$0 zzx}0}U)QfZ;n2*l>u&nxsPDGd-Rzt^t1?OFnd-E+E_dgxdhj(;x|F+b?u}b(WKZpy zcCGX3_ha=xugZ&g)~!0A5IYB L)z4*}Q$iB}x$8iI literal 0 HcmV?d00001 diff --git a/doc/html/classmce_1_1_input_stream-members.html b/doc/html/classmce_1_1_input_stream-members.html new file mode 100644 index 0000000..61a1988 --- /dev/null +++ b/doc/html/classmce_1_1_input_stream-members.html @@ -0,0 +1,113 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::InputStream Member List
+
+
+ +

This is the complete list of members for mce::InputStream, including all inherited members.

+ + + + + + +
getSize()=0mce::InputStreampure virtual
read(void *buffer, size_t size)=0mce::InputStreampure virtual
seek(size_t position)=0mce::InputStreampure virtual
tell()=0mce::InputStreampure virtual
~InputStream()=0 (defined in mce::InputStream)mce::InputStreampure virtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_input_stream.html b/doc/html/classmce_1_1_input_stream.html new file mode 100644 index 0000000..ba1d06d --- /dev/null +++ b/doc/html/classmce_1_1_input_stream.html @@ -0,0 +1,271 @@ + + + + + + + +Minecraft Community Edition: mce::InputStream Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::InputStream Class Referenceabstract
+
+
+
+Inheritance diagram for mce::InputStream:
+
+
+ + +mce::FileInputStream +mce::MemoryInputStream + +
+ + + + + + + + +

+Public Member Functions

virtual size_t read (void *buffer, size_t size)=0
 Reads from the input stream.
virtual size_t seek (size_t position)=0
 Changes the current position the stream is reading.
virtual size_t tell ()=0
virtual size_t getSize ()=0
+

Member Function Documentation

+ +

◆ getSize()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t mce::InputStream::getSize ()
+
+pure virtual
+
+
Returns
The size of the stream in bytes
+ +

Implemented in mce::FileInputStream, and mce::MemoryInputStream.

+ +
+
+ +

◆ read()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
virtual size_t mce::InputStream::read (void * buffer,
size_t size )
+
+pure virtual
+
+ +

Reads from the input stream.

+
Parameters
+ + + +
bufferThe buffer to read the bytes into
sizeThe amount of bytes to read
+
+
+
Returns
The amount of bytes written
+ +

Implemented in mce::FileInputStream, and mce::MemoryInputStream.

+ +
+
+ +

◆ seek()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t mce::InputStream::seek (size_t position)
+
+pure virtual
+
+ +

Changes the current position the stream is reading.

+
Parameters
+ + +
positionThe position to seek the input stream to
+
+
+
Returns
The position the input stream is at now
+ +

Implemented in mce::FileInputStream, and mce::MemoryInputStream.

+ +
+
+ +

◆ tell()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t mce::InputStream::tell ()
+
+pure virtual
+
+
Returns
The current position the stream is at
+ +

Implemented in mce::FileInputStream, and mce::MemoryInputStream.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_input_stream.js b/doc/html/classmce_1_1_input_stream.js new file mode 100644 index 0000000..ac3867d --- /dev/null +++ b/doc/html/classmce_1_1_input_stream.js @@ -0,0 +1,7 @@ +var classmce_1_1_input_stream = +[ + [ "getSize", "classmce_1_1_input_stream.html#a661d85973a2683a217252c36f47da682", null ], + [ "read", "classmce_1_1_input_stream.html#a548e3aeadfb9222019bcb59a39848d9e", null ], + [ "seek", "classmce_1_1_input_stream.html#a4c7ee56f44922aa52b608d44cbc4235c", null ], + [ "tell", "classmce_1_1_input_stream.html#a38cee7380aef36c4db0287e38609b4d7", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_input_stream.png b/doc/html/classmce_1_1_input_stream.png new file mode 100644 index 0000000000000000000000000000000000000000..c77a4d54fa0d7c60ea1d2f69210fea49cf30d6a3 GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0y~yV6*|U12~w0_qX>P{qn|a z@jlhLleXP`DEzcn`XKkGSK9q`-=9T4Ej4TF^}Ks3o9&(XsnsbuPuGea?Avp0QYKLE zq&-i|c9vNE{Uu=Gd--dcZLWj7{`qb34<;yWTdn-`X4!-(>9-yCxzEd$_d)gn$V(^g zPcY{>T;RsAuanz>>4TjnzrwMnlfE%HEwO2kuzz<+&Y@)ryMWqNMi$RX2FD;dhY3Kg z%2N#PPqoVFr=J#;G5DR7m(T#3;&FU9HM<1#Ux?Xv_| z&$_%=W#vNUeEYD^d8IGg=Pdr5*Rv-qWHU>T_r0ilpL(A$UEQABwbt&$=84iZA6k6@6sZ8Pl29KFu>-|Gc*HN$#4;v*tHv1+5N` z;A{MGBHOs!NOyjWe)aydzhmM;)1Bk0&C2ibZQk0qPjS6?_Tn%5_QXHAJAM0|%qr#G zzgFHlvTSSB9M`LlqOZsFhdq@Y z$p2I~cTeiRDe9iyjfzQ2#lhy>yCk&`A*aiQheP;kGzM0bXFn OV(@hJb6Mw<&;$UvsLc%k literal 0 HcmV?d00001 diff --git a/doc/html/classmce_1_1_logger-members.html b/doc/html/classmce_1_1_logger-members.html new file mode 100644 index 0000000..17ec3a7 --- /dev/null +++ b/doc/html/classmce_1_1_logger-members.html @@ -0,0 +1,120 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::Logger Member List
+
+
+ +

This is the complete list of members for mce::Logger, including all inherited members.

+ + + + + + + + + + + + + +
addSink(const eastl::shared_ptr< LoggerSink > &sink) (defined in mce::Logger)mce::Logger
debug(std::format_string< Args... > format, Args &&... args) (defined in mce::Logger)mce::Loggerinline
debug_trace(const std::source_location &location, std::format_string< Args... > format, Args &&... args) (defined in mce::Logger)mce::Loggerinline
error(std::format_string< Args... > format, Args &&... args) (defined in mce::Logger)mce::Loggerinline
error_trace(const std::source_location &location, std::format_string< Args... > format, Args &&... args) (defined in mce::Logger)mce::Loggerinline
getGlobalLogger(QEventBus &qBus) (defined in mce::Logger)mce::Loggerstatic
info(std::format_string< Args... > format, Args &&... args) (defined in mce::Logger)mce::Loggerinline
info_trace(const std::source_location &location, std::format_string< Args... > format, Args &&... args) (defined in mce::Logger)mce::Loggerinline
log(LogLevel level, std::string_view message, eastl::optional< std::source_location > location=eastl::nullopt) (defined in mce::Logger)mce::Logger
Logger(QEventBus &qBus, std::string_view name, bool createStdoutSink=true) (defined in mce::Logger)mce::Loggerexplicit
warn(std::format_string< Args... > format, Args &&... args) (defined in mce::Logger)mce::Loggerinline
warn_trace(const std::source_location &location, std::format_string< Args... > format, Args &&... args) (defined in mce::Logger)mce::Loggerinline
+
+
+ + + + diff --git a/doc/html/classmce_1_1_logger.html b/doc/html/classmce_1_1_logger.html new file mode 100644 index 0000000..21354b9 --- /dev/null +++ b/doc/html/classmce_1_1_logger.html @@ -0,0 +1,156 @@ + + + + + + + +Minecraft Community Edition: mce::Logger Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::Logger Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Logger (QEventBus &qBus, std::string_view name, bool createStdoutSink=true)
+void addSink (const eastl::shared_ptr< LoggerSink > &sink)
+void log (LogLevel level, std::string_view message, eastl::optional< std::source_location > location=eastl::nullopt)
+template<typename... Args>
void info (std::format_string< Args... > format, Args &&... args)
+template<typename... Args>
void warn (std::format_string< Args... > format, Args &&... args)
+template<typename... Args>
void error (std::format_string< Args... > format, Args &&... args)
+template<typename... Args>
void debug (std::format_string< Args... > format, Args &&... args)
+template<typename... Args>
void info_trace (const std::source_location &location, std::format_string< Args... > format, Args &&... args)
+template<typename... Args>
void warn_trace (const std::source_location &location, std::format_string< Args... > format, Args &&... args)
+template<typename... Args>
void error_trace (const std::source_location &location, std::format_string< Args... > format, Args &&... args)
+template<typename... Args>
void debug_trace (const std::source_location &location, std::format_string< Args... > format, Args &&... args)
+ + +

+Static Public Member Functions

+static Logger & getGlobalLogger (QEventBus &qBus)
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_logger_sink-members.html b/doc/html/classmce_1_1_logger_sink-members.html new file mode 100644 index 0000000..073907a --- /dev/null +++ b/doc/html/classmce_1_1_logger_sink-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::LoggerSink Member List
+
+
+ +

This is the complete list of members for mce::LoggerSink, including all inherited members.

+ + + +
log(std::string_view prettyMessage, std::string_view basicMessage)=0 (defined in mce::LoggerSink)mce::LoggerSinkpure virtual
~LoggerSink()=default (defined in mce::LoggerSink)mce::LoggerSinkvirtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_logger_sink.html b/doc/html/classmce_1_1_logger_sink.html new file mode 100644 index 0000000..456034f --- /dev/null +++ b/doc/html/classmce_1_1_logger_sink.html @@ -0,0 +1,132 @@ + + + + + + + +Minecraft Community Edition: mce::LoggerSink Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::LoggerSink Class Referenceabstract
+
+
+
+Inheritance diagram for mce::LoggerSink:
+
+
+ + +mce::FileSink +mce::StdoutSink + +
+ + + +

+Public Member Functions

+virtual void log (std::string_view prettyMessage, std::string_view basicMessage)=0
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_logger_sink.png b/doc/html/classmce_1_1_logger_sink.png new file mode 100644 index 0000000000000000000000000000000000000000..714423f0b5588e8712d83ae6deb289a8992538f8 GIT binary patch literal 766 zcmVsNr!7=~f!0zhvDRn-od z96(Dx{?uesoKN|lxd~41 z!w~;}5Y})?0MMH$x1UXzOV%Xwi+x!$sfM2{A_@caCQiI0lC9jzJ89;a#o0IpKyS9> zLT%WWTNaTx%Uh#|PUzS?=HMxpt41vuX)&PfQNrj+h+49Wgn8J7RJGUt}D|u{Qu+_`(91 z9KdBv4xk+-2XGma189fI0bIu90NP=40GBa2fOeQ1z-4YD=bUqA8J%5s?Mw-yWBPN|%xC3FfBnB~)FyJ% zuobzT%xk$JUght~)MVF&ko>;+&Z%cLmy+C(T<@LYBa?iuMDM;z=7O9Ln`WOj$%XOg zopbJ-POR6iC|Aps4m*#$46bG_tz0gW?dkByE#yLyByV9~mRGKlt1#@Usb@YQ7kmoa zGCh^)ek_;fDhykYt7Sg6avRTF8nKwg!EL#lt1h>bc}FhWdqug86h{lnUalCCkG?He zFDQ#z7)#V@D + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::MemoryInputStream Member List
+
+
+ +

This is the complete list of members for mce::MemoryInputStream, including all inherited members.

+ + + + + + + + +
getSize() overridemce::MemoryInputStreamvirtual
MemoryInputStream(const void *data, size_t size)mce::MemoryInputStream
read(void *buffer, size_t size) overridemce::MemoryInputStreamvirtual
readString(char *&buffer, size_t &size)mce::MemoryInputStream
seek(size_t position) overridemce::MemoryInputStreamvirtual
tell() overridemce::MemoryInputStreamvirtual
~InputStream()=0 (defined in mce::InputStream)mce::InputStreampure virtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_memory_input_stream.html b/doc/html/classmce_1_1_memory_input_stream.html new file mode 100644 index 0000000..9f7f5fa --- /dev/null +++ b/doc/html/classmce_1_1_memory_input_stream.html @@ -0,0 +1,351 @@ + + + + + + + +Minecraft Community Edition: mce::MemoryInputStream Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::MemoryInputStream Class Referencefinal
+
+
+ +

Memory-backed input stream. + More...

+ +

#include <MemoryInputStream.hpp>

+
+Inheritance diagram for mce::MemoryInputStream:
+
+
+ + +mce::InputStream + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 MemoryInputStream (const void *data, size_t size)
 Construct a memory input stream over existing data.
virtual size_t read (void *buffer, size_t size) override
 Read bytes from the memory buffer into the provided buffer.
size_t readString (char *&buffer, size_t &size)
 Read a NUL-terminated string from the stream.
virtual size_t seek (size_t position) override
 Seek to an absolute position in the memory buffer.
virtual size_t tell () override
 Get the current read position in the buffer.
virtual size_t getSize () override
 Get the total size of the memory buffer.
+

Detailed Description

+

Memory-backed input stream.

+

Provides a read-only InputStream view over an existing memory buffer. The stream does not take ownership of the provided memory; the caller is responsible for ensuring the lifetime of the memory buffer exceeds the lifetime of the MemoryInputStream instance.

+

Constructor & Destructor Documentation

+ +

◆ MemoryInputStream()

+ +
+
+ + + + + + + + + + + +
mce::MemoryInputStream::MemoryInputStream (const void * data,
size_t size )
+
+ +

Construct a memory input stream over existing data.

+
Parameters
+ + + +
dataPointer to the memory buffer to read from. Must not be nullptr unless size is zero.
sizeSize of the buffer in bytes.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ getSize()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::MemoryInputStream::getSize ()
+
+overridevirtual
+
+ +

Get the total size of the memory buffer.

+
Returns
Size of the buffer in bytes.
+ +

Implements mce::InputStream.

+ +
+
+ +

◆ read()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
size_t mce::MemoryInputStream::read (void * buffer,
size_t size )
+
+overridevirtual
+
+ +

Read bytes from the memory buffer into the provided buffer.

+
Parameters
+ + + +
bufferDestination buffer to receive data.
sizeMaximum number of bytes to read from the stream.
+
+
+
Returns
Number of bytes actually read.
+ +

Implements mce::InputStream.

+ +
+
+ +

◆ readString()

+ +
+
+ + + + + + + + + + + +
size_t mce::MemoryInputStream::readString (char *& buffer,
size_t & size )
+
+ +

Read a NUL-terminated string from the stream.

+

The function does not allocate new memory for the string. Instead it returns a pointer into the original memory buffer via the buffer reference parameter. The returned pointer is valid only while the original memory and this stream remain valid.

+
Parameters
+ + + +
bufferReference to a char* which will be set to point to the string inside the memory buffer.
sizeReference to a size_t which will be set to the length of the string (excluding the terminating NUL).
+
+
+
Returns
Number of bytes consumed from the stream, including the terminating NULL byte.
+ +
+
+ +

◆ seek()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::MemoryInputStream::seek (size_t position)
+
+overridevirtual
+
+ +

Seek to an absolute position in the memory buffer.

+
Parameters
+ + +
positionAbsolute position in bytes from the start of the buffer.
+
+
+
Returns
The new position after seeking.
+ +

Implements mce::InputStream.

+ +
+
+ +

◆ tell()

+ +
+
+ + + + + +
+ + + + + + + +
size_t mce::MemoryInputStream::tell ()
+
+overridevirtual
+
+ +

Get the current read position in the buffer.

+
Returns
Current position in bytes from the start of the buffer.
+ +

Implements mce::InputStream.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_memory_input_stream.js b/doc/html/classmce_1_1_memory_input_stream.js new file mode 100644 index 0000000..6241a0a --- /dev/null +++ b/doc/html/classmce_1_1_memory_input_stream.js @@ -0,0 +1,9 @@ +var classmce_1_1_memory_input_stream = +[ + [ "MemoryInputStream", "classmce_1_1_memory_input_stream.html#a6f8edd8bbe3b0fe735cce8f43f2a41b4", null ], + [ "getSize", "classmce_1_1_memory_input_stream.html#a220e82b4a2096923f91b02058a354c1a", null ], + [ "read", "classmce_1_1_memory_input_stream.html#a11da8b6c2f59d0a5987bf06b93245bb1", null ], + [ "readString", "classmce_1_1_memory_input_stream.html#ac3771e7c4a9f8bb4a6e10581683fb97b", null ], + [ "seek", "classmce_1_1_memory_input_stream.html#a30df68220fde1b86deee930444e729d1", null ], + [ "tell", "classmce_1_1_memory_input_stream.html#a229ade412a4c8843a77d68b5a99814c0", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_memory_input_stream.png b/doc/html/classmce_1_1_memory_input_stream.png new file mode 100644 index 0000000000000000000000000000000000000000..7a9e2ccb1d55e75954b979fb8acf077ebd795780 GIT binary patch literal 669 zcmV;O0%HA%P)gE5}NT**Kq{KtZ->x5o3%?f=H4J;$|di z!_7$2##d&6BnNEm;r;g^g(N@oE3>^zBT1UMG7EW{eGN2ZgS0f~3T==3s5AShQ4Y^l zNpj4k**<5gQ-$=YLy>e$tdGrbtxA#;uGcJo&Y7BB8;0c8GAK!s1I%XWWZy6=Th4Ju z_=(xzq)+y`HmjEWakFBk)~q{t1GB*~CCLf5&DzV=3Ty9ar@Pl*ZM{+7nUUlT{{Cx= zB!{>eN!s{Ff6+_|#MMC216%=RvgA|i86vycZK0x5K6 z`qFLs(Uh9s&nZh+XnQ;|bj(qroGcfu%=Rj&rwUpm58Nx(>AONPrVd5P^p4$#s%W!j z`E!oV`_P${=?$aT%aw~&tY+y1re^7^=1yIPv=w8st5BRXy%70g+%)UXZrk0PRYz@h zGWt>dM$FBMvDMaI>}GG4)8=M_qGPl6x^#uwcD + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::OutputStream Member List
+
+
+ +

This is the complete list of members for mce::OutputStream, including all inherited members.

+ + + + + + +
getSize()=0mce::OutputStreampure virtual
seek(size_t position)=0mce::OutputStreampure virtual
tell()=0mce::OutputStreampure virtual
write(const void *buffer, size_t size)=0mce::OutputStreampure virtual
~OutputStream()=0 (defined in mce::OutputStream)mce::OutputStreampure virtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_output_stream.html b/doc/html/classmce_1_1_output_stream.html new file mode 100644 index 0000000..234c251 --- /dev/null +++ b/doc/html/classmce_1_1_output_stream.html @@ -0,0 +1,267 @@ + + + + + + + +Minecraft Community Edition: mce::OutputStream Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::OutputStream Class Referenceabstract
+
+
+
+Inheritance diagram for mce::OutputStream:
+
+
+ + +mce::FileOutputStream + +
+ + + + + + + +

+Public Member Functions

virtual size_t write (const void *buffer, size_t size)=0
virtual size_t seek (size_t position)=0
 Changes the current position the stream is at.
virtual size_t tell ()=0
virtual size_t getSize ()=0
+

Member Function Documentation

+ +

◆ getSize()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t mce::OutputStream::getSize ()
+
+pure virtual
+
+
Returns
The size of the stream in bytes
+ +

Implemented in mce::FileOutputStream.

+ +
+
+ +

◆ seek()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t mce::OutputStream::seek (size_t position)
+
+pure virtual
+
+ +

Changes the current position the stream is at.

+
Parameters
+ + +
positionThe position to seek the output stream to
+
+
+
Returns
The position the output stream is at now
+ +

Implemented in mce::FileOutputStream.

+ +
+
+ +

◆ tell()

+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t mce::OutputStream::tell ()
+
+pure virtual
+
+
Returns
The current position the stream is at
+ +

Implemented in mce::FileOutputStream.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
virtual size_t mce::OutputStream::write (const void * buffer,
size_t size )
+
+pure virtual
+
+
Parameters
+ + + +
bufferThe data to write
sizeHow many bytes to write
+
+
+
Returns
How many bytes were written
+ +

Implemented in mce::FileOutputStream.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_output_stream.js b/doc/html/classmce_1_1_output_stream.js new file mode 100644 index 0000000..89062af --- /dev/null +++ b/doc/html/classmce_1_1_output_stream.js @@ -0,0 +1,7 @@ +var classmce_1_1_output_stream = +[ + [ "getSize", "classmce_1_1_output_stream.html#a4b19dae8e434c51a7d79058994c035c7", null ], + [ "seek", "classmce_1_1_output_stream.html#af2b439b646d1c6262fa2fb5e5025c0f4", null ], + [ "tell", "classmce_1_1_output_stream.html#a738833d8f02a3442f2cd317bd64bb0c4", null ], + [ "write", "classmce_1_1_output_stream.html#a549f1ca23e39341f9a3cc23927644d81", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_output_stream.png b/doc/html/classmce_1_1_output_stream.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa8f418b270f2e6912e855765685263607569eb GIT binary patch literal 653 zcmeAS@N?(olHy`uVBq!ia0vp^T|gYb!3-on{*jdjQqloFA+G=b{|7S9o%*UNw{W?I zfo6fk^fNCWJa_;UuQ=ql6)4A9666=m0OW&#In(Sb3=B*Xo-U3d6^w7^9^`whz~j>H zxa!&e{S~)GnhPi8E_%bbHpZ}3B3W*o=X#B$Q%qZwJhe3fRW!AL_?6wM<=6f$Ub3>5 z=j`*i7q>NL?~X2RNwVt?Jk{~dcE7)~v}ynL*VXSn=f2EfJ3Zg^bE8|0=Q`PiISYTM zt&>(v`#fXQyVq%l1x`Hj{`A&Bdw1^fL(Wq&3}&ooeqbJ0voOx}<21R4w{0D7hQ8Go ziQiW27Gg3><$m459SslJb}C6~p9}QsdZ*;2^QUfYmE{(toYY&qfAXyRUQDv)twKJEopug@ldl`M?_Awl!a*_O(3HeH`#kD(2)V&$Vad>fJx4TBo

)tra_dplid_O!F__PaXWbC0Z!Z>01^ztmGbs?n$X<9Q>b1}><_+aV>o*8q@&qOv22WQ%mvv4FO#mzOFwX!0 literal 0 HcmV?d00001 diff --git a/doc/html/classmce_1_1_q_event_bus-members.html b/doc/html/classmce_1_1_q_event_bus-members.html new file mode 100644 index 0000000..a540456 --- /dev/null +++ b/doc/html/classmce_1_1_q_event_bus-members.html @@ -0,0 +1,119 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +

+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::QEventBus Member List
+
+
+ +

This is the complete list of members for mce::QEventBus, including all inherited members.

+ + + + + + + + + + + + +
getNamespace() const (defined in mce::QEventBus)mce::QEventBus
getQueueSize() const (defined in mce::QEventBus)mce::QEventBus
Handler typedefmce::QEventBus
post(EventType &&event)mce::QEventBusinline
process()mce::QEventBus
QEventBus(const std::string_view &eventNamespace) (defined in mce::QEventBus)mce::QEventBus
runAsync()mce::QEventBus
stop()mce::QEventBus
subscribe(Handler< EventType > handler)mce::QEventBusinline
subscribeRAII(Handler< EventType > handler)mce::QEventBusinline
~QEventBus()mce::QEventBus
+
+
+ + + + diff --git a/doc/html/classmce_1_1_q_event_bus.html b/doc/html/classmce_1_1_q_event_bus.html new file mode 100644 index 0000000..2b9d6ed --- /dev/null +++ b/doc/html/classmce_1_1_q_event_bus.html @@ -0,0 +1,395 @@ + + + + + + + +Minecraft Community Edition: mce::QEventBus Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::QEventBus Class Reference
+
+
+ +

Thread-safe event bus. + More...

+ +

#include <QEventBus.hpp>

+ + + + + +

+Public Types

template<typename EventType>
using Handler = eastl::function<void(const EventType&)>
 Alias for an event handler function.
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

QEventBus (const std::string_view &eventNamespace)
template<typename EventType>
SubscriptionToken subscribeRAII (Handler< EventType > handler)
 Subscribe a handler to EventType and receive a RAII token.
template<typename EventType>
void subscribe (Handler< EventType > handler)
 Subscribe a handler to EventType without RAII token.
template<typename EventType>
void post (EventType &&event)
 Post an event instance to the bus for later processing.
void process ()
 Process and dispatch all currently queued events.
void runAsync ()
 Start asynchronous processing of queued events.
void stop ()
 Stop asynchronous processing and join the worker thread.
+size_t getQueueSize () const
 ~QEventBus ()
 Destructor.
+const std::string_view & getNamespace () const
+

Detailed Description

+

Thread-safe event bus.

+

QEventBus allows subscribing handlers to event types, posting events to a queue, and dispatching queued events to all registered handlers. It supports both synchronous processing via process() and asynchronous processing via runAsync()/stop().

+

Handlers are stored per event type (std::type_index of the concrete event) and receive events by const-reference to the concrete event type.

+
Note
All public subscribe/post/process operations are designed to be thread-safe, but handlers themselves are invoked on the processing thread/context and must be safe to execute there.
+

Member Typedef Documentation

+ +

◆ Handler

+ +
+
+
+template<typename EventType>
+ + + + +
using mce::QEventBus::Handler = eastl::function<void(const EventType&)>
+
+ +

Alias for an event handler function.

+
Template Parameters
+ + +
EventTypeConcrete event type handled by the function.
+
+
+

The handler receives a const reference to the event instance.

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ ~QEventBus()

+ +
+
+ + + + + + + +
mce::QEventBus::~QEventBus ()
+
+ +

Destructor.

+

Ensures asynchronous processing is stopped and resources are cleaned up. Any remaining queued events will be destroyed.

+ +
+
+

Member Function Documentation

+ +

◆ post()

+ +
+
+
+template<typename EventType>
+ + + + + +
+ + + + + + + +
void mce::QEventBus::post (EventType && event)
+
+inline
+
+ +

Post an event instance to the bus for later processing.

+
Template Parameters
+ + +
EventTypeThe concrete event type being posted.
+
+
+
Parameters
+ + +
eventThe event instance to enqueue (moved or copied as needed).
+
+
+

The event is stored as a heap-allocated IEvent-derived instance and will be dispatched during process() or by the asynchronous thread if runAsync() is active.

+ +
+
+ +

◆ process()

+ +
+
+ + + + + + + +
void mce::QEventBus::process ()
+
+ +

Process and dispatch all currently queued events.

+

This method will dequeue all pending events and invoke their registered handlers synchronously in the caller's thread.

+ +
+
+ +

◆ runAsync()

+ +
+
+ + + + + + + +
void mce::QEventBus::runAsync ()
+
+ +

Start asynchronous processing of queued events.

+

This creates a background thread that waits for posted events and calls dispatch on them as they arrive.

+ +
+
+ +

◆ stop()

+ +
+
+ + + + + + + +
void mce::QEventBus::stop ()
+
+ +

Stop asynchronous processing and join the worker thread.

+

Blocks until the background processing thread has exited. After stop() returns, it is safe to destroy the QEventBus or call runAsync() again.

+ +
+
+ +

◆ subscribe()

+ +
+
+
+template<typename EventType>
+ + + + + +
+ + + + + + + +
void mce::QEventBus::subscribe (Handler< EventType > handler)
+
+inline
+
+ +

Subscribe a handler to EventType without RAII token.

+
Template Parameters
+ + +
EventTypeThe event type to subscribe to.
+
+
+
Parameters
+ + +
handlerThe handler called when an EventType is dispatched.
+
+
+

Use this if you do not need automated unsubscription. To remove the handler manually you must extend this class or implement additional removal logic.

+ +
+
+ +

◆ subscribeRAII()

+ +
+
+
+template<typename EventType>
+ + + + + +
+ + + + + + + +
SubscriptionToken mce::QEventBus::subscribeRAII (Handler< EventType > handler)
+
+inline
+
+ +

Subscribe a handler to EventType and receive a RAII token.

+
Template Parameters
+ + +
EventTypeThe event type to subscribe to.
+
+
+
Parameters
+ + +
handlerThe handler called when an EventType is dispatched.
+
+
+
Returns
SubscriptionToken RAII object that will unsubscribe on destruction.
+

The returned token ensures the handler is removed when the token is destroyed. The unsubscribe action captured in the token is safe to call from any thread.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_q_event_bus.js b/doc/html/classmce_1_1_q_event_bus.js new file mode 100644 index 0000000..2bebdce --- /dev/null +++ b/doc/html/classmce_1_1_q_event_bus.js @@ -0,0 +1,11 @@ +var classmce_1_1_q_event_bus = +[ + [ "Handler", "classmce_1_1_q_event_bus.html#a7f5a80e3f10f95ab433dd04942778e5b", null ], + [ "~QEventBus", "classmce_1_1_q_event_bus.html#a030f589e472aa12873a6302677878d67", null ], + [ "post", "classmce_1_1_q_event_bus.html#a13302d26ca2e8b91e075e5430ea9ce97", null ], + [ "process", "classmce_1_1_q_event_bus.html#a37196ad021d476479362bfe51ffc1b59", null ], + [ "runAsync", "classmce_1_1_q_event_bus.html#a292b5d677b6dc2b483339e5ff6fc8497", null ], + [ "stop", "classmce_1_1_q_event_bus.html#a06db1890efe5587da99b9d45b6436b88", null ], + [ "subscribe", "classmce_1_1_q_event_bus.html#ae4a067bd3f491f948307f688acabd905", null ], + [ "subscribeRAII", "classmce_1_1_q_event_bus.html#a8a47e0ac9ec1cb0430c19ab9aae2bc21", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_renderer-members.html b/doc/html/classmce_1_1_renderer-members.html new file mode 100644 index 0000000..4d062b2 --- /dev/null +++ b/doc/html/classmce_1_1_renderer-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::Renderer Member List
+
+
+ +

This is the complete list of members for mce::Renderer, including all inherited members.

+ + + +
renderFrame()=0 (defined in mce::Renderer)mce::Rendererpure virtual
~Renderer() (defined in mce::Renderer)mce::Renderervirtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_renderer.html b/doc/html/classmce_1_1_renderer.html new file mode 100644 index 0000000..6a8bf6e --- /dev/null +++ b/doc/html/classmce_1_1_renderer.html @@ -0,0 +1,132 @@ + + + + + + + +Minecraft Community Edition: mce::Renderer Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::Renderer Class Referenceabstract
+
+
+
+Inheritance diagram for mce::Renderer:
+
+
+ + +mce::GLRenderer + +
+ + + +

+Public Member Functions

+virtual void renderFrame ()=0
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_renderer.png b/doc/html/classmce_1_1_renderer.png new file mode 100644 index 0000000000000000000000000000000000000000..1c95441e8988f20c6d1cc403d238ff2b176d60fc GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^c|aV%!3-qNf88Jgq@)9ULR|m<{|{uIJM~plZsBqZ z1I+@7>1SR%c<=xyUUA58D^QNJB*-tA0mugfbEer>7#JA)JzX3_Dj46+y_k2{fWuW^ z!S&C7aed!85^q#jTc?ByUVfKw_ zpZTNN7ia!`OSSU0`NG@TuWx?Z!8wiR*#4urmRy%+Ztjs8OuwZJ(3HB%#mt(AnY4esIF*Ig>>0P+x-yWa8>vx>Vsju(vd$djG^?c^? znLlG?=HB#rxb5HN>_YeR$3=y8BzxZ%+@9N1vdrx2!#?M)3A|->m*@KD#+@>`v?n%v zmZ8rXzwZ{id3RsF9>iyA5#1fX@%Ot~+h2ztz1*Amytv<3dE@0hHM^_oD`wOgzuk4s zv2=E&*b}qOA3uBd%(V3DOitsw^tez->GBumn4aht!mFVdQ&MBb@0F3_d At^fc4 literal 0 HcmV?d00001 diff --git a/doc/html/classmce_1_1_stdout_sink-members.html b/doc/html/classmce_1_1_stdout_sink-members.html new file mode 100644 index 0000000..c1f7315 --- /dev/null +++ b/doc/html/classmce_1_1_stdout_sink-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::StdoutSink Member List
+
+
+ +

This is the complete list of members for mce::StdoutSink, including all inherited members.

+ + + +
log(std::string_view prettyMessage, std::string_view basicMessage) override (defined in mce::StdoutSink)mce::StdoutSinkvirtual
~LoggerSink()=default (defined in mce::LoggerSink)mce::LoggerSinkvirtual
+
+
+ + + + diff --git a/doc/html/classmce_1_1_stdout_sink.html b/doc/html/classmce_1_1_stdout_sink.html new file mode 100644 index 0000000..659a440 --- /dev/null +++ b/doc/html/classmce_1_1_stdout_sink.html @@ -0,0 +1,163 @@ + + + + + + + +Minecraft Community Edition: mce::StdoutSink Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::StdoutSink Class Referencefinal
+
+
+
+Inheritance diagram for mce::StdoutSink:
+
+
+ + +mce::LoggerSink + +
+ + + +

+Public Member Functions

void log (std::string_view prettyMessage, std::string_view basicMessage) override
+

Member Function Documentation

+ +

◆ log()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void mce::StdoutSink::log (std::string_view prettyMessage,
std::string_view basicMessage )
+
+overridevirtual
+
+ +

Implements mce::LoggerSink.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_stdout_sink.png b/doc/html/classmce_1_1_stdout_sink.png new file mode 100644 index 0000000000000000000000000000000000000000..b29203d1b19a583a7734647c215af6af2543d834 GIT binary patch literal 544 zcmV+*0^j|KP)&q41^~W3Hkmf-V*X-w{GcrR}n%%45rD{UlN=0ikx$vB4m=BphY6d zs6LI9Nb-)-_A>tQ?SDzdXUq;MJqKUTvaA-2zfYBs9xC8^ndEI+0W4*fUJ@b1yEI9g%@XnYd&lMqg=Sz~;3hl}HZIk4+*1rZxM)jqnoO7Nb z0Qj{Y05C<yR@aubq!Rbl>Pj7Rn{c$4+b>A9 z!uw)ekoK0lq?3*~BYBn^r#FH}vUTcJaTeougetA-y)o9RZhEhEQITKD^)wO@`I{C= iL?o&&C8d + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::Thread Member List
+
+
+ +

This is the complete list of members for mce::Thread, including all inherited members.

+ + + + + + + + +
launch()mce::Thread
Thread(QEventBus &qBus, F function)mce::Threadinline
Thread(QEventBus &qBus, void(C::*function)(), C *object)mce::Threadinline
Thread(QEventBus &qBus, void(C::*function)(), C *object, Args &&... args)mce::Threadinline
ThreadImpl (defined in mce::Thread)mce::Threadfriend
wait()mce::Thread
~Thread()mce::Thread
+
+
+ + + + diff --git a/doc/html/classmce_1_1_thread.html b/doc/html/classmce_1_1_thread.html new file mode 100644 index 0000000..2ac90f7 --- /dev/null +++ b/doc/html/classmce_1_1_thread.html @@ -0,0 +1,310 @@ + + + + + + + +Minecraft Community Edition: mce::Thread Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::Thread Class Reference
+
+
+ +

Lightweight high-level thread wrapper. + More...

+ +

#include <Thread.hpp>

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

+Public Member Functions

template<typename F>
 Thread (QEventBus &qBus, F function)
 Construct a Thread from a generic callable (lambda, functor, function pointer).
template<typename C>
 Thread (QEventBus &qBus, void(C::*function)(), C *object)
 Construct a Thread that will call a parameterless member function.
template<typename C, typename... Args>
 Thread (QEventBus &qBus, void(C::*function)(), C *object, Args &&... args)
 Construct a Thread that will call a member function with arguments.
~Thread ()
 Destructor; cleans up stored callable and implementation pointer.
+void launch ()
 Start execution of the stored callable on a new thread.
+void wait ()
 Block until the thread has finished executing.
+ + +

+Friends

+class ThreadImpl
+

Detailed Description

+

Lightweight high-level thread wrapper.

+

Stores a pointer to a platform-specific implementation (ThreadImpl) and a type-erased callable adapter (ThreadFunc) representing the entry point. Use the constructors to create a Thread from lambdas, functors, member functions, or member functions with arguments.

+

Constructor & Destructor Documentation

+ +

◆ Thread() [1/3]

+ +
+
+
+template<typename F>
+ + + + + +
+ + + + + + + + + + + +
mce::Thread::Thread (QEventBus & qBus,
F function )
+
+inline
+
+ +

Construct a Thread from a generic callable (lambda, functor, function pointer).

+
Template Parameters
+ + +
FType of the callable.
+
+
+
Parameters
+ + + +
qBusReference to the QEventBus used for thread lifecycle events.
functionThe callable to execute when the thread runs.
+
+
+ +
+
+ +

◆ Thread() [2/3]

+ +
+
+
+template<typename C>
+ + + + + +
+ + + + + + + + + + + + + + + + +
mce::Thread::Thread (QEventBus & qBus,
void(C::* function )(),
C * object )
+
+inline
+
+ +

Construct a Thread that will call a parameterless member function.

+
Template Parameters
+ + +
CClass type owning the member function.
+
+
+
Parameters
+ + + + +
qBusReference to the QEventBus used for thread lifecycle events.
functionPointer to the member function to invoke.
objectPointer to the object instance on which to invoke the member function.
+
+
+ +
+
+ +

◆ Thread() [3/3]

+ +
+
+
+template<typename C, typename ... Args>
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
mce::Thread::Thread (QEventBus & qBus,
void(C::* function )(),
C * object,
Args &&... args )
+
+inline
+
+ +

Construct a Thread that will call a member function with arguments.

+
Template Parameters
+ + + +
CClass type owning the member function.
ArgsTypes of the arguments to forward when invoking the member function.
+
+
+
Parameters
+ + + + + +
qBusReference to the QEventBus used for thread lifecycle events.
functionPointer to the member function to invoke.
objectPointer to the object instance on which to invoke the member function.
argsArguments to forward to the member function when the thread runs.
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_thread.js b/doc/html/classmce_1_1_thread.js new file mode 100644 index 0000000..257c9f3 --- /dev/null +++ b/doc/html/classmce_1_1_thread.js @@ -0,0 +1,9 @@ +var classmce_1_1_thread = +[ + [ "Thread", "classmce_1_1_thread.html#a90e3636f9c64c36a6935a849445b17c1", null ], + [ "Thread", "classmce_1_1_thread.html#a35eebc21874cf98c954d0f06f5fa8cb3", null ], + [ "Thread", "classmce_1_1_thread.html#ad96edc70278355f33805f7826bcea466", null ], + [ "~Thread", "classmce_1_1_thread.html#ad53fb135e59203bea7469f8ec3bde46b", null ], + [ "launch", "classmce_1_1_thread.html#a6857a0007eb44e985a11b76e8b2ab81d", null ], + [ "wait", "classmce_1_1_thread.html#a7167ced2613ce6e9e3ae0ee942277c87", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_thread_impl-members.html b/doc/html/classmce_1_1_thread_impl-members.html new file mode 100644 index 0000000..0776e95 --- /dev/null +++ b/doc/html/classmce_1_1_thread_impl-members.html @@ -0,0 +1,112 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::ThreadImpl Member List
+
+
+ +

This is the complete list of members for mce::ThreadImpl, including all inherited members.

+ + + + + +
isRunning() const (defined in mce::ThreadImpl)mce::ThreadImpl
terminate()mce::ThreadImpl
ThreadImpl(Thread *owner)mce::ThreadImpl
wait()mce::ThreadImpl
+
+
+ + + + diff --git a/doc/html/classmce_1_1_thread_impl.html b/doc/html/classmce_1_1_thread_impl.html new file mode 100644 index 0000000..79b9037 --- /dev/null +++ b/doc/html/classmce_1_1_thread_impl.html @@ -0,0 +1,206 @@ + + + + + + + +Minecraft Community Edition: mce::ThreadImpl Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::ThreadImpl Class Reference
+
+
+ +

Platform-specific thread implementation. + More...

+ +

#include <ThreadImpl.hpp>

+ + + + + + + + + +

+Public Member Functions

 ThreadImpl (Thread *owner)
 Construct a ThreadImpl bound to its owner.
void wait ()
 Block until the associated thread exits.
void terminate ()
 Request termination of the associated thread.
+bool isRunning () const
+

Detailed Description

+

Platform-specific thread implementation.

+

This class encapsulates native thread handles and provides a small interface for the Thread wrapper to control thread lifetime.

+

It is intentionally non-copyable (implicitly, due to native handles).

+

Constructor & Destructor Documentation

+ +

◆ ThreadImpl()

+ +
+
+ + + + + + + +
mce::ThreadImpl::ThreadImpl (Thread * owner)
+
+ +

Construct a ThreadImpl bound to its owner.

+
Parameters
+ + +
ownerPointer to the high-level Thread object that owns this implementation.
+
+
+

The owner is stored by reference only for use inside the static entryPoint function to call back into Thread::run() or equivalent.

+ +
+
+

Member Function Documentation

+ +

◆ terminate()

+ +
+
+ + + + + + + +
void mce::ThreadImpl::terminate ()
+
+ +

Request termination of the associated thread.

+

Implementations may signal the thread to stop or forcibly terminate the native thread handle depending on platform support and usage.

+
Note
Prefer cooperative shutdown via shared flags when possible.
+ +
+
+ +

◆ wait()

+ +
+
+ + + + + + + +
void mce::ThreadImpl::wait ()
+
+ +

Block until the associated thread exits.

+

On success this method returns after the remote thread has terminated. Behavior and error handling are platform-specific.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_thread_impl.js b/doc/html/classmce_1_1_thread_impl.js new file mode 100644 index 0000000..bc441a9 --- /dev/null +++ b/doc/html/classmce_1_1_thread_impl.js @@ -0,0 +1,6 @@ +var classmce_1_1_thread_impl = +[ + [ "ThreadImpl", "classmce_1_1_thread_impl.html#a671887ec3998eab1d2f0262a85a3b087", null ], + [ "terminate", "classmce_1_1_thread_impl.html#ae003bae531fde909b1cb13d6159b1fcb", null ], + [ "wait", "classmce_1_1_thread_impl.html#a2608abc24e2f18be8e25eb3a4265cdda", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_thread_manager-members.html b/doc/html/classmce_1_1_thread_manager-members.html new file mode 100644 index 0000000..8c11cf1 --- /dev/null +++ b/doc/html/classmce_1_1_thread_manager-members.html @@ -0,0 +1,118 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::ThreadManager Member List
+
+
+ +

This is the complete list of members for mce::ThreadManager, including all inherited members.

+ + + + + + + + + + + +
activeCount() constmce::ThreadManager
cleanupFinished()mce::ThreadManager
createThread(const eastl::string &name, F func)mce::ThreadManagerinline
createThread(const eastl::string &name, void(C::*func)(), C *object)mce::ThreadManagerinline
launch(Thread *th)mce::ThreadManager
launch(const eastl::string &name)mce::ThreadManager
printStats()mce::ThreadManager
ThreadManager(QEventBus &qBus)mce::ThreadManagerexplicit
waitAll()mce::ThreadManager
~ThreadManager()mce::ThreadManager
+
+
+ + + + diff --git a/doc/html/classmce_1_1_thread_manager.html b/doc/html/classmce_1_1_thread_manager.html new file mode 100644 index 0000000..208ffa8 --- /dev/null +++ b/doc/html/classmce_1_1_thread_manager.html @@ -0,0 +1,419 @@ + + + + + + + +Minecraft Community Edition: mce::ThreadManager Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::ThreadManager Class Reference
+
+
+ + + + +

+Classes

struct  ThreadInfo
 Metadata stored per managed thread. More...
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ThreadManager (QEventBus &qBus)
 Construct a ThreadManager bound to a QEventBus.
~ThreadManager ()
 Destructor cleans up managed threads and subscriptions.
template<typename F>
ThreadcreateThread (const eastl::string &name, F func)
 Create (and store) a Thread from a generic callable.
template<typename C>
ThreadcreateThread (const eastl::string &name, void(C::*func)(), C *object)
 Create (and store) a Thread for a member function on an object.
void launch (Thread *th)
 Launch a previously created Thread instance.
void launch (const eastl::string &name)
 Convenience: launches the thread with the given name.
void waitAll ()
 Block until all managed threads have finished executing.
void cleanupFinished ()
 Remove and cleanup finished threads from internal storage.
void printStats ()
 Print statistics (e.g. runtime durations) for managed threads.
size_t activeCount () const
 Count of currently active (non-finished) threads.
+

Constructor & Destructor Documentation

+ +

◆ ThreadManager()

+ +
+
+ + + + + +
+ + + + + + + +
mce::ThreadManager::ThreadManager (QEventBus & qBus)
+
+explicit
+
+ +

Construct a ThreadManager bound to a QEventBus.

+
Parameters
+ + +
qBusReference to the application's QEventBus used to post thread events.
+
+
+

The ThreadManager subscribes to thread lifecycle events on qBus to maintain accurate bookkeeping.

+ +
+
+

Member Function Documentation

+ +

◆ activeCount()

+ +
+
+ + + + + + + +
size_t mce::ThreadManager::activeCount () const
+
+ +

Count of currently active (non-finished) threads.

+
Returns
Number of active threads being tracked.
+ +
+
+ +

◆ cleanupFinished()

+ +
+
+ + + + + + + +
void mce::ThreadManager::cleanupFinished ()
+
+ +

Remove and cleanup finished threads from internal storage.

+

This method may be used regularly to free resources held for threads that have already completed.

+ +
+
+ +

◆ createThread() [1/2]

+ +
+
+
+template<typename F>
+ + + + + +
+ + + + + + + + + + + +
Thread * mce::ThreadManager::createThread (const eastl::string & name,
F func )
+
+inline
+
+ +

Create (and store) a Thread from a generic callable.

+
Template Parameters
+ + +
FCallable type (lambda, functor or function pointer).
+
+
+
Parameters
+ + + +
nameHuman readable name for the thread.
funcCallable to execute when the thread runs.
+
+
+
Returns
Pointer to the created Thread (owned by ThreadManager).
+

The returned Thread pointer is non-owning; ThreadManager retains ownership in its internal storage (threadStorage). The thread is created but not launched — call launch() to start it.

+ +
+
+ +

◆ createThread() [2/2]

+ +
+
+
+template<typename C>
+ + + + + +
+ + + + + + + + + + + + + + + + +
Thread * mce::ThreadManager::createThread (const eastl::string & name,
void(C::* func )(),
C * object )
+
+inline
+
+ +

Create (and store) a Thread for a member function on an object.

+
Template Parameters
+ + +
CClass type of the target object.
+
+
+
Parameters
+ + + + +
nameHuman readable name for the thread.
funcPointer to the member function to call.
objectPointer to the object instance on which to call the member function.
+
+
+
Returns
Pointer to the created Thread (owned by ThreadManager).
+

Creates a Thread adapter that will call (object->*func)() when executed.

+ +
+
+ +

◆ launch() [1/2]

+ +
+
+ + + + + + + +
void mce::ThreadManager::launch (const eastl::string & name)
+
+ +

Convenience: launches the thread with the given name.

+
Parameters
+ + +
nameName of the thread to launch.
+
+
+

Finds the Thread associated with name and launches it. If multiple threads share the same name behavior depends on underlying container order.

+ +
+
+ +

◆ launch() [2/2]

+ +
+
+ + + + + + + +
void mce::ThreadManager::launch (Thread * th)
+
+ +

Launch a previously created Thread instance.

+
Parameters
+ + +
thPointer to the Thread returned from createThread().
+
+
+

This will call Thread::launch() on the provided Thread pointer.

+ +
+
+ +

◆ printStats()

+ +
+
+ + + + + + + +
void mce::ThreadManager::printStats ()
+
+ +

Print statistics (e.g. runtime durations) for managed threads.

+

Implementations should format and output info about active/finished threads using the project's logging facilities.

+ +
+
+ +

◆ waitAll()

+ +
+
+ + + + + + + +
void mce::ThreadManager::waitAll ()
+
+ +

Block until all managed threads have finished executing.

+

Joins/waits any active threads tracked by this manager.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_thread_manager.js b/doc/html/classmce_1_1_thread_manager.js new file mode 100644 index 0000000..09b1fb9 --- /dev/null +++ b/doc/html/classmce_1_1_thread_manager.js @@ -0,0 +1,14 @@ +var classmce_1_1_thread_manager = +[ + [ "ThreadInfo", "structmce_1_1_thread_manager_1_1_thread_info.html", "structmce_1_1_thread_manager_1_1_thread_info" ], + [ "ThreadManager", "classmce_1_1_thread_manager.html#a44af86c56b28fdcb5aeadfee871d3773", null ], + [ "~ThreadManager", "classmce_1_1_thread_manager.html#a10b8efbe312127af02418c3942b0e7b6", null ], + [ "activeCount", "classmce_1_1_thread_manager.html#a43beb921636d53a6efd22d4ef8982165", null ], + [ "cleanupFinished", "classmce_1_1_thread_manager.html#a72319f5b2505aa6e0fe75cfdc1231032", null ], + [ "createThread", "classmce_1_1_thread_manager.html#a3cfaaa1edb1dd0ded4a99553972cd93c", null ], + [ "createThread", "classmce_1_1_thread_manager.html#a07cbeefe7d5b5d4845e0b2f1e59fef21", null ], + [ "launch", "classmce_1_1_thread_manager.html#ad5e09cdd0695f8587b041a618284b018", null ], + [ "launch", "classmce_1_1_thread_manager.html#ab500bf731fff307e4e7a06928b865167", null ], + [ "printStats", "classmce_1_1_thread_manager.html#a0739a1906bf371bf8a729ab0d0ce4929", null ], + [ "waitAll", "classmce_1_1_thread_manager.html#a7b58969244f296e97a21656b563cf231", null ] +]; \ No newline at end of file diff --git a/doc/html/classmce_1_1_virtual_file_system-members.html b/doc/html/classmce_1_1_virtual_file_system-members.html new file mode 100644 index 0000000..0557376 --- /dev/null +++ b/doc/html/classmce_1_1_virtual_file_system-members.html @@ -0,0 +1,118 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::VirtualFileSystem Member List
+
+
+ +

This is the complete list of members for mce::VirtualFileSystem, including all inherited members.

+ + + + + + + + + + + +
ASSETS_FILE enum valuemce::VirtualFileSystem
buildJSONMappingFile(const std::string &fileInName, const std::string &fileOutName)mce::VirtualFileSystem
FileBinaryType enum namemce::VirtualFileSystem
getConfig()mce::VirtualFileSystem
getFile(const eastl::string_view &fileTag, eastl::vector< char > &bytes)mce::VirtualFileSystem
loadFile(const std::string &fileName)mce::VirtualFileSystem
NONE enum valuemce::VirtualFileSystem
SOURCE_FILE enum valuemce::VirtualFileSystem
WORLD_FILE enum valuemce::VirtualFileSystem
~VirtualFileSystem() (defined in mce::VirtualFileSystem)mce::VirtualFileSystem
+
+
+ + + + diff --git a/doc/html/classmce_1_1_virtual_file_system.html b/doc/html/classmce_1_1_virtual_file_system.html new file mode 100644 index 0000000..2cb4293 --- /dev/null +++ b/doc/html/classmce_1_1_virtual_file_system.html @@ -0,0 +1,289 @@ + + + + + + + +Minecraft Community Edition: mce::VirtualFileSystem Class Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
mce::VirtualFileSystem Class Reference
+
+
+ +

VirtualFileSystem manages a collection of files referenced by tags. + More...

+ +

#include <VirtualFileSystem.hpp>

+ + + + + + +

+Classes

union  Version
 Version information for the virtual file system format. More...
struct  Config
 Configuration for how the VirtualFileSystem should operate. More...
+ + + +

+Public Types

enum  FileBinaryType : unsigned char { NONE = 0 +, ASSETS_FILE = 1 +, SOURCE_FILE = 2 +, WORLD_FILE = 4 + }
 Types of virtual file collections that can be stored in a VFS file. More...
+ + + + + + + + + +

+Public Member Functions

ConfiggetConfig ()
 Access the runtime configuration.
bool getFile (const eastl::string_view &fileTag, eastl::vector< char > &bytes)
 Retrieve a file's bytes identified by its tag.
bool buildJSONMappingFile (const std::string &fileInName, const std::string &fileOutName)
 Build a binary VFS file from a JSON mapping.
bool loadFile (const std::string &fileName)
 Load the virtual file system from a file.
+

Detailed Description

+

VirtualFileSystem manages a collection of files referenced by tags.

+

The virtual file system can be built from a JSON mapping (debug mode) or from a binary VFS file (release). It supports loading file contents either via stream input or by keeping the virtual file contents in memory.

+

Member Enumeration Documentation

+ +

◆ FileBinaryType

+ +
+
+ + + + +
enum mce::VirtualFileSystem::FileBinaryType : unsigned char
+
+ +

Types of virtual file collections that can be stored in a VFS file.

+ + + + + +
Enumerator
NONE 

No file type specified.

+
ASSETS_FILE 

Assets bundle.

+
SOURCE_FILE 

Source files bundle.

+
WORLD_FILE 

World data bundle.

+
+ +
+
+

Member Function Documentation

+ +

◆ buildJSONMappingFile()

+ +
+
+ + + + + + + + + + + +
bool mce::VirtualFileSystem::buildJSONMappingFile (const std::string & fileInName,
const std::string & fileOutName )
+
+ +

Build a binary VFS file from a JSON mapping.

+
Parameters
+ + + +
fileInNamePath to the input JSON mapping file.
fileOutNamePath where the resulting binary VFS should be written.
+
+
+
Returns
True if the output file was successfully created.
+ +
+
+ +

◆ getConfig()

+ +
+
+ + + + + + + +
VirtualFileSystem::Config & mce::VirtualFileSystem::getConfig ()
+
+ +

Access the runtime configuration.

+
Returns
Reference to the VFS configuration.
+ +
+
+ +

◆ getFile()

+ +
+
+ + + + + + + + + + + +
bool mce::VirtualFileSystem::getFile (const eastl::string_view & fileTag,
eastl::vector< char > & bytes )
+
+ +

Retrieve a file's bytes identified by its tag.

+
Parameters
+ + + +
fileTagTag identifying the file in the VFS.
bytesOutput vector which will be filled with file data.
+
+
+
Returns
True if the file was found and bytes were successfully loaded.
+ +
+
+ +

◆ loadFile()

+ +
+
+ + + + + + + +
bool mce::VirtualFileSystem::loadFile (const std::string & fileName)
+
+ +

Load the virtual file system from a file.

+
Parameters
+ + +
fileNameBase file name (without extension) to load.
+
+
+
Returns
True if the VFS data was successfully loaded.
+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/doc/html/classmce_1_1_virtual_file_system.js b/doc/html/classmce_1_1_virtual_file_system.js new file mode 100644 index 0000000..a4282d6 --- /dev/null +++ b/doc/html/classmce_1_1_virtual_file_system.js @@ -0,0 +1,15 @@ +var classmce_1_1_virtual_file_system = +[ + [ "Version", "unionmce_1_1_virtual_file_system_1_1_version.html", "unionmce_1_1_virtual_file_system_1_1_version" ], + [ "Config", "structmce_1_1_virtual_file_system_1_1_config.html", "structmce_1_1_virtual_file_system_1_1_config" ], + [ "FileBinaryType", "classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726", [ + [ "NONE", "classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726af4117d29bc8623330732b880e03c422b", null ], + [ "ASSETS_FILE", "classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a9f4b2e54fa9d67e203bf38f78d0ff067", null ], + [ "SOURCE_FILE", "classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a7c98cab84fc00353d5d242cfa5c257d4", null ], + [ "WORLD_FILE", "classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726ad7dc87fe0ad41cd2d441e509c81ea486", null ] + ] ], + [ "buildJSONMappingFile", "classmce_1_1_virtual_file_system.html#a7dd599ce69981b9e8efc4bf01d7c4c06", null ], + [ "getConfig", "classmce_1_1_virtual_file_system.html#af593de4f0ffc1a84a66ed160cbc26fe2", null ], + [ "getFile", "classmce_1_1_virtual_file_system.html#a8f65e6706de32cdbe5c68f6e7053222a", null ], + [ "loadFile", "classmce_1_1_virtual_file_system.html#ae5c0d15aed23eb8651abcce2190fb7ac", null ] +]; \ No newline at end of file diff --git a/doc/html/clipboard.js b/doc/html/clipboard.js new file mode 100644 index 0000000..9da9f3c --- /dev/null +++ b/doc/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/doc/html/cookie.js b/doc/html/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/doc/html/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/doc/html/deprecated.html b/doc/html/deprecated.html new file mode 100644 index 0000000..41aa959 --- /dev/null +++ b/doc/html/deprecated.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Deprecated List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Deprecated List
+
+
+
+
File example.hpp
+
This example will be replaced in later versions.
+
+
+
+
+
+ + + + diff --git a/doc/html/dir_26891a649404ec89e7d5863c163240e9.html b/doc/html/dir_26891a649404ec89e7d5863c163240e9.html new file mode 100644 index 0000000..161a533 --- /dev/null +++ b/doc/html/dir_26891a649404ec89e7d5863c163240e9.html @@ -0,0 +1,119 @@ + + + + + + + +Minecraft Community Edition: Graphics/OpenGL Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
OpenGL Directory Reference
+
+
+ + + + +

+Files

 
GLGraphicsContext.hpp
 
GLRenderer.hpp
+
+
+ +
+ + + + diff --git a/doc/html/dir_26891a649404ec89e7d5863c163240e9.js b/doc/html/dir_26891a649404ec89e7d5863c163240e9.js new file mode 100644 index 0000000..496bfd7 --- /dev/null +++ b/doc/html/dir_26891a649404ec89e7d5863c163240e9.js @@ -0,0 +1,5 @@ +var dir_26891a649404ec89e7d5863c163240e9 = +[ + [ "GLGraphicsContext.hpp", "_g_l_graphics_context_8hpp_source.html", null ], + [ "GLRenderer.hpp", "_g_l_renderer_8hpp_source.html", null ] +]; \ No newline at end of file diff --git a/doc/html/dir_4ab6b4cc6a7edbff49100e9123df213f.html b/doc/html/dir_4ab6b4cc6a7edbff49100e9123df213f.html new file mode 100644 index 0000000..576ff34 --- /dev/null +++ b/doc/html/dir_4ab6b4cc6a7edbff49100e9123df213f.html @@ -0,0 +1,119 @@ + + + + + + + +Minecraft Community Edition: Common Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Common Directory Reference
+
+
+ + + + +

+Files

 
Assert.hpp
 
Platform.hpp
+
+
+ +
+ + + + diff --git a/doc/html/dir_4ab6b4cc6a7edbff49100e9123df213f.js b/doc/html/dir_4ab6b4cc6a7edbff49100e9123df213f.js new file mode 100644 index 0000000..a0521af --- /dev/null +++ b/doc/html/dir_4ab6b4cc6a7edbff49100e9123df213f.js @@ -0,0 +1,5 @@ +var dir_4ab6b4cc6a7edbff49100e9123df213f = +[ + [ "Assert.hpp", "_assert_8hpp_source.html", null ], + [ "Platform.hpp", "_platform_8hpp_source.html", null ] +]; \ No newline at end of file diff --git a/doc/html/dir_5533e7f136d8aec169f8a924fe5a6516.html b/doc/html/dir_5533e7f136d8aec169f8a924fe5a6516.html new file mode 100644 index 0000000..1920402 --- /dev/null +++ b/doc/html/dir_5533e7f136d8aec169f8a924fe5a6516.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: IO/Stream Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Stream Directory Reference
+
+
+ + + + + + + +

+Files

 
FileInputStream.hpp
 
FileOutputStream.hpp
 
InputStream.hpp
 
MemoryInputStream.hpp
 
OutputStream.hpp
+
+
+ +
+ + + + diff --git a/doc/html/dir_5533e7f136d8aec169f8a924fe5a6516.js b/doc/html/dir_5533e7f136d8aec169f8a924fe5a6516.js new file mode 100644 index 0000000..eb2dd4c --- /dev/null +++ b/doc/html/dir_5533e7f136d8aec169f8a924fe5a6516.js @@ -0,0 +1,8 @@ +var dir_5533e7f136d8aec169f8a924fe5a6516 = +[ + [ "FileInputStream.hpp", "_file_input_stream_8hpp_source.html", null ], + [ "FileOutputStream.hpp", "_file_output_stream_8hpp_source.html", null ], + [ "InputStream.hpp", "_input_stream_8hpp_source.html", null ], + [ "MemoryInputStream.hpp", "_memory_input_stream_8hpp_source.html", null ], + [ "OutputStream.hpp", "_output_stream_8hpp_source.html", null ] +]; \ No newline at end of file diff --git a/doc/html/dir_64f7452aef2cdad98d34a70f5ea329e2.html b/doc/html/dir_64f7452aef2cdad98d34a70f5ea329e2.html new file mode 100644 index 0000000..0304c77 --- /dev/null +++ b/doc/html/dir_64f7452aef2cdad98d34a70f5ea329e2.html @@ -0,0 +1,123 @@ + + + + + + + +Minecraft Community Edition: Graphics Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Graphics Directory Reference
+
+
+ + + +

+Directories

 
OpenGL
+ + + +

+Files

 
GraphicsContext.hpp
 
Renderer.hpp
+
+
+ +
+ + + + diff --git a/doc/html/dir_64f7452aef2cdad98d34a70f5ea329e2.js b/doc/html/dir_64f7452aef2cdad98d34a70f5ea329e2.js new file mode 100644 index 0000000..68f05ba --- /dev/null +++ b/doc/html/dir_64f7452aef2cdad98d34a70f5ea329e2.js @@ -0,0 +1,6 @@ +var dir_64f7452aef2cdad98d34a70f5ea329e2 = +[ + [ "OpenGL", "dir_26891a649404ec89e7d5863c163240e9.html", "dir_26891a649404ec89e7d5863c163240e9" ], + [ "GraphicsContext.hpp", "_graphics_context_8hpp_source.html", null ], + [ "Renderer.hpp", "_renderer_8hpp_source.html", null ] +]; \ No newline at end of file diff --git a/doc/html/dir_c6310732a22f63c0c2fc5595561e68f1.html b/doc/html/dir_c6310732a22f63c0c2fc5595561e68f1.html new file mode 100644 index 0000000..874bd42 --- /dev/null +++ b/doc/html/dir_c6310732a22f63c0c2fc5595561e68f1.html @@ -0,0 +1,131 @@ + + + + + + + +Minecraft Community Edition: Core Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Core Directory Reference
+
+
+ + + + + + + + + + + + + + + + +

+Files

 
CoroutineScheduler.hpp
 Simple coroutine scheduler that runs periodic callbacks using SFML time utilities.
 
example.hpp
 Example of using all common Doxygen tags.
 
FunctionContainer.hpp
 
IEvent.hpp
 
QEventBus.hpp
 Thread-safe event bus.
 
Thread.hpp
 High-level Thread wrapper and callable adapters used by the project.
 
ThreadImpl.hpp
 Platform-specific implementation details for mce::Thread.
 
ThreadManager.hpp
 Manages lifecycle and bookkeeping for mce::Thread instances.
+
+
+ +
+ + + + diff --git a/doc/html/dir_c6310732a22f63c0c2fc5595561e68f1.js b/doc/html/dir_c6310732a22f63c0c2fc5595561e68f1.js new file mode 100644 index 0000000..9ed8cc4 --- /dev/null +++ b/doc/html/dir_c6310732a22f63c0c2fc5595561e68f1.js @@ -0,0 +1,11 @@ +var dir_c6310732a22f63c0c2fc5595561e68f1 = +[ + [ "CoroutineScheduler.hpp", "_coroutine_scheduler_8hpp.html", "_coroutine_scheduler_8hpp" ], + [ "example.hpp", "example_8hpp.html", null ], + [ "FunctionContainer.hpp", "_function_container_8hpp_source.html", null ], + [ "IEvent.hpp", "_i_event_8hpp_source.html", null ], + [ "QEventBus.hpp", "_q_event_bus_8hpp.html", "_q_event_bus_8hpp" ], + [ "Thread.hpp", "_thread_8hpp.html", "_thread_8hpp" ], + [ "ThreadImpl.hpp", "_thread_impl_8hpp.html", "_thread_impl_8hpp" ], + [ "ThreadManager.hpp", "_thread_manager_8hpp.html", "_thread_manager_8hpp" ] +]; \ No newline at end of file diff --git a/doc/html/dir_f0b8d3380d5649deec2d780f35ec3ac5.html b/doc/html/dir_f0b8d3380d5649deec2d780f35ec3ac5.html new file mode 100644 index 0000000..03e0f86 --- /dev/null +++ b/doc/html/dir_f0b8d3380d5649deec2d780f35ec3ac5.html @@ -0,0 +1,124 @@ + + + + + + + +Minecraft Community Edition: IO Directory Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
IO Directory Reference
+
+
+ + + +

+Directories

 
Stream
+ + + + +

+Files

 
Logger.hpp
 
LoggerSinks.hpp
 
VirtualFileSystem.hpp
+
+
+ +
+ + + + diff --git a/doc/html/dir_f0b8d3380d5649deec2d780f35ec3ac5.js b/doc/html/dir_f0b8d3380d5649deec2d780f35ec3ac5.js new file mode 100644 index 0000000..37df4bd --- /dev/null +++ b/doc/html/dir_f0b8d3380d5649deec2d780f35ec3ac5.js @@ -0,0 +1,7 @@ +var dir_f0b8d3380d5649deec2d780f35ec3ac5 = +[ + [ "Stream", "dir_5533e7f136d8aec169f8a924fe5a6516.html", "dir_5533e7f136d8aec169f8a924fe5a6516" ], + [ "Logger.hpp", "_logger_8hpp_source.html", null ], + [ "LoggerSinks.hpp", "_logger_sinks_8hpp_source.html", null ], + [ "VirtualFileSystem.hpp", "_virtual_file_system_8hpp_source.html", null ] +]; \ No newline at end of file diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css new file mode 100644 index 0000000..4542163 --- /dev/null +++ b/doc/html/doxygen.css @@ -0,0 +1,2540 @@ +/* The standard CSS for doxygen 1.16.1*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #110C43; +--page-visited-link-color: #110C43; +--page-external-link-color: #0C082F; + +/* index */ +--index-odd-item-bg-color: #F0EFFB; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F2F1FC; +--header-separator-color: #877EE6; +--group-header-separator-color: #AFAAEE; +--group-header-color: #0D0934; + +--footer-foreground-color: #080621; +--footer-logo-width: 75px; +--citation-label-color: #0C082F; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #877EE6; + +--blockquote-background-color: #EDECFB; +--blockquote-border-color: #4033D8; + +--scrollbar-thumb-color: #877EE6; +--scrollbar-background-color: #F2F1FC; + +--icon-background-color: #281D9D; +--icon-foreground-color: white; +--icon-folder-open-fill-color: #877EE6; +--icon-folder-fill-color: #ADA7EE; +--icon-folder-border-color: #17115A; +--icon-doc-fill-color: #ADA7EE; +--icon-doc-border-color: #17115A; + +/* brief member declaration list */ +--memdecl-background-color: #F2F1FC; +--memdecl-foreground-color: #555; +--memdecl-template-color: #17115A; +--memdecl-border-color: #A6A0ED; + +/* detailed member list */ +--memdef-border-color: #5448DC; +--memdef-title-background-color: #C2BEF2; +--memdef-proto-background-color: #DAD7F7; +--memdef-proto-text-color: #060419; +--memdef-param-name-color: #602020; +--memdef-template-color: #17115A; + +/* tables */ +--table-cell-border-color: #090725; +--table-header-background-color: #0E0A38; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #281D9D; +--label-left-top-border-color: #1D1573; +--label-right-bottom-border-color: #877EE6; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F2F1FC; +--nav-foreground-color: #0D0A35; +--nav-border-color: #877EE6; +--nav-breadcrumb-separator-color: #877EE6; +--nav-breadcrumb-active-bg: #DAD7F7; +--nav-breadcrumb-color: #0D0934; +--nav-splitbar-bg-color: #B4AFEF; +--nav-splitbar-handle-color: #4033D8; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #07051E; +--nav-menu-button-color: #0D0A35; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-active-bg: #B4AFEF; +--nav-menu-active-color: #4033D8; +--nav-arrow-color: #6D63E1; +--nav-arrow-selected-color: #3426CC; + +/* sync icon */ +--sync-icon-border-color: #877EE6; +--sync-icon-background-color: #F2F1FC; +--sync-icon-selected-background-color: #DAD7F7; +--sync-icon-color: #877EE6; +--sync-icon-selected-color: #241B8F; + +/* table of contents */ +--toc-background-color: #E8E7FA; +--toc-border-color: #ADA7EE; +--toc-header-color: #17115A; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-active-color: black; +--search-filter-background-color: rgba(255,255,255,.7); +--search-filter-backdrop-filter: blur(4px); +--search-filter-foreground-color: black; +--search-filter-border-color: rgba(150,150,150,.4); +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #110C43; +--search-results-foreground-color: #140E4F; +--search-results-background-color: rgba(255,255,255,.8); +--search-results-backdrop-filter: blur(4px); +--search-results-border-color: rgba(150,150,150,.4); +--search-box-border-color: #6D63E1; +--search-close-icon-bg-color: #A0A0A0; +--search-close-icon-fg-color: white; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: black; +--fragment-background-color: #F7F7FD; +--fragment-border-color: #877EE6; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #17115A; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #17115A; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--fragment-highlight-filter: -3; +--tooltip-foreground-color: black; +--tooltip-background-color: rgba(255,255,255,0.8); +--tooltip-arrow-background-color: white; +--tooltip-border-color: rgba(150,150,150,0.7); +--tooltip-backdrop-filter: blur(3px); +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #17115A; +--tooltip-shadow: 0 4px 8px 0 rgba(0,0,0,.25); +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +--satisfies-color-hl: #b61825; +--satisfies-color-bg: #f8d1cc; +--verifies-color-hl: #b61825; +--verifies-color-bg: #f8d1cc; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #3426CC; +--page-visited-link-color: #3426CC; +--page-external-link-color: #4C3FDA; + +/* index */ +--index-odd-item-bg-color: #000002; +--index-even-item-bg-color: black; +--index-header-color: #877EE6; +--index-separator-color: #0C082F; + +/* header */ +--header-background-color: #000001; +--header-separator-color: #010107; +--group-header-separator-color: #04020F; +--group-header-color: #3426CC; + +--footer-foreground-color: #20177D; +--footer-logo-width: 60px; +--citation-label-color: #3426CC; +--glow-color: cyan; + +--title-background-color: #000001; +--title-separator-color: #050313; + +--blockquote-background-color: #010005; +--blockquote-border-color: #07051E; + +--scrollbar-thumb-color: #090623; +--scrollbar-background-color: #000001; + +--icon-background-color: #0C082F; +--icon-foreground-color: #877EE6; +--icon-folder-open-fill-color: #17115A; +--icon-folder-fill-color: #1D1573; +--icon-folder-border-color: #877EE6; +--icon-doc-fill-color: #241B8F; +--icon-doc-border-color: #877EE6; + +/* brief member declaration list */ +--memdecl-background-color: #000002; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #2C20AC; +--memdecl-border-color: #050416; + +/* detailed member list */ +--memdef-border-color: #050416; +--memdef-title-background-color: #03020E; +--memdef-proto-background-color: #03020C; +--memdef-proto-text-color: #4235D8; +--memdef-param-name-color: #D28757; +--memdef-template-color: #2C20AC; + +/* tables */ +--table-cell-border-color: #07051E; +--table-header-background-color: #07051E; +--table-header-foreground-color: #877EE6; + +/* labels */ +--label-background-color: #0D0934; +--label-left-top-border-color: #17115A; +--label-right-bottom-border-color: #07051E; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #010005; +--nav-foreground-color: #0D0A35; +--nav-border-color: #050313; +--nav-breadcrumb-separator-color: #050313; +--nav-breadcrumb-active-bg: #04020F; +--nav-breadcrumb-color: #3426CC; +--nav-splitbar-bg-color: #07051E; +--nav-splitbar-handle-color: #17115A; +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #6D63E1; +--nav-menu-button-color: #6D63E1; +--nav-menu-background-color: #000000; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-active-bg: #04020F; +--nav-menu-active-color: #9088E8; +--nav-arrow-color: #17115A; +--nav-arrow-selected-color: #241B8F; + +/* sync icon */ +--sync-icon-border-color: #050313; +--sync-icon-background-color: #010005; +--sync-icon-selected-background-color: #04020F; +--sync-icon-color: #17115A; +--sync-icon-selected-color: #1D1573; + +/* table of contents */ +--toc-background-color: #020108; +--toc-border-color: #040313; +--toc-header-color: #4C3FDA; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-active-color: #F5F5F5; +--search-filter-background-color: #010005; +--search-filter-foreground-color: #3426CC; +--search-filter-backdrop-filter: none; +--search-filter-border-color: #2C20AC; +--search-filter-highlight-text-color: #786EE3; +--search-filter-highlight-bg-color: #07051E; +--search-results-background-color: black; +--search-results-foreground-color: #3426CC; +--search-results-backdrop-filter: none; +--search-results-border-color: #0C082F; +--search-box-border-color: #0C082F; +--search-close-icon-bg-color: #909090; +--search-close-icon-fg-color: black; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #000001; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--fragment-highlight-filter: 5; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-arrow-background-color: #202020; +--tooltip-backdrop-filter: none; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; + +/** font-family */ +--font-family-normal: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +--satisfies-color-hl: #ad2617; +--satisfies-color-bg: #2e1917; +--verifies-color-hl: #ad2617; +--verifies-color-bg: #2e1917; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +body.resizing { + user-select: none; + -webkit-user-select: none; +} + +#doc-content { + scrollbar-width: thin; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 160%; + font-weight: 400; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + box-shadow: 12px 0 var(--page-background-color), + -12px 0 var(--page-background-color), + 12px 1px var(--group-header-separator-color), + -12px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +td h2.groupheader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; + margin-bottom: 0px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + margin-right: 6px; + padding-right: 6px; + text-align: right; + line-height: 110%; + background-color: var(--nav-background-color); +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + padding-right: 6px; + padding-left: 6px; + border-radius: 0 6px 6px 0; + background-color: var(--nav-menu-active-bg); +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.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.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +span.label a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.el, a.el:visited, a.code, a.code:visited, a.line, a.line:visited { + color: var(--page-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--page-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +div.embeddoc { + font-family: var(--font-family-monospace); + padding-left: 10px; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style: none; + padding-left: 40px; + margin: 0; +} + +ul.check li { + position: relative; +} + +li.unchecked::before, li.checked::before { + position: absolute; + left: -18px; + top: 0; +} + +li.unchecked::before { + content: "â˜"; +} + +li.checked::before { + content: "☑"; +} + +ul.check li > p { + display: inline; +} + +ul.check li > p:not(:first-child) { + display: block; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +span.tt { + white-space: pre; + font-family: var(--font-family-monospace); + background-color: var(--fragment-background-color); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .4; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: wrap; + word-break: break-all; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -62px; + padding-left: 62px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + display: inline-block; + width: 12px; + height: 12px; + margin-left: 4px; + margin-right: 1px; +} + +span.foldnone { + display: inline-block; + position: relative; + cursor: pointer; + user-select: none; +} + +span.fold.plus, span.fold.minus { + width: 10px; + height: 10px; + background-color: var(--fragment-background-color); + position: relative; + border: 1px solid var(--fold-line-color); + margin-right: 1px; +} + +span.fold.plus::before, span.fold.minus::before { + content: ''; + position: absolute; + background-color: var(--fold-line-color); +} + +span.fold.plus::before { + width: 2px; + height: 6px; + top: 2px; + left: 4px; +} + +span.fold.plus::after { + content: ''; + position: absolute; + width: 6px; + height: 2px; + top: 4px; + left: 2px; + background-color: var(--fold-line-color); +} + +span.fold.minus::before { + width: 6px; + height: 2px; + top: 4px; + left: 2px; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 110%; + font-weight: 500; + margin-left: 0px; + margin-top: 0em; + margin-bottom: 6px; + padding-top: 8px; + padding-bottom: 4px; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 12px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + border: none; + margin-top: 16px; + margin-bottom: 16px; + height: 1px; + box-shadow: 13px 0 var(--page-background-color), + -13px 0 var(--page-background-color), + 13px 1px var(--group-header-separator-color), + -13px 1px var(--group-header-separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight { + padding-top: 2px; + padding-bottom: 2px; +} + +.memTemplParams { + padding-left: 10px; + padding-top: 5px; +} + +.memItemLeft, .memItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +tr[class^='memdesc'] { + box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,.075); +} + +.mdescLeft { + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.mdescRight { + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; + border-left: 1px solid var(--memdecl-border-color); + border-right: 1px solid var(--memdecl-border-color); +} + +td.ititle { + border: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; + padding-left: 10px; +} + +tr:not(:first-child) > td.ititle { + border-top: 0; + border-radius: 0; +} + +.memItemLeft { + white-space: nowrap; + border-left: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-left: 10px; + transition: none; + vertical-align: top; + text-align: right; +} + +.memItemRight { + width: 100%; + border-right: 1px solid var(--memdecl-border-color); + border-bottom: 1px solid var(--memdecl-border-color); + padding-right: 10px; + transition: none; + vertical-align: bottom; +} + +tr.heading + tr[class^='memitem'] td.memItemLeft, +tr.groupHeader + tr[class^='memitem'] td.memItemLeft, +tr.inherit_header + tr[class^='memitem'] td.memItemLeft { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memItemRight, +tr.groupHeader + tr[class^='memitem'] td.memItemRight, +tr.inherit_header + tr[class^='memitem'] td.memItemRight { + border-top: 1px solid var(--memdecl-border-color); + border-top-right-radius: 4px; +} + +tr.heading + tr[class^='memitem'] td.memTemplParams, +tr.heading + tr td.ititle, +tr.groupHeader + tr[class^='memitem'] td.memTemplParams, +tr.groupHeader + tr td.ititle, +tr.inherit_header + tr[class^='memitem'] td.memTemplParams { + border-top: 1px solid var(--memdecl-border-color); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemLeft, +table.memberdecls tr:last-child td.mdescLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemLeft, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescLeft, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescLeft { + border-bottom-left-radius: 4px; +} + +table.memberdecls tr:last-child td.memItemRight, +table.memberdecls tr:last-child td.mdescRight, +table.memberdecls tr[class^='memitem']:has(+ tr.groupHeader) td.memItemRight, +table.memberdecls tr[class^='memitem']:has(+ tr.inherit_header) td.memItemRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.groupHeader) td.mdescRight, +table.memberdecls tr[class^='memdesc']:has(+ tr.inherit_header) td.mdescRight { + border-bottom-right-radius: 4px; +} + +tr.template .memItemLeft, tr.template .memItemRight { + border-top: none; + padding-top: 0; +} + + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-color: var(--memdef-proto-background-color); + line-height: 1.25; + font-family: var(--font-family-monospace); + font-weight: 500; + font-size: 16px; + float:left; + box-shadow: 0 10px 0 -1px var(--memdef-proto-background-color), + 0 2px 8px 0 rgba(0,0,0,.075); + position: relative; +} + +.memtitle:after { + content: ''; + display: block; + background: var(--memdef-proto-background-color); + height: 10px; + bottom: -10px; + left: 0px; + right: -14px; + position: absolute; + border-top-right-radius: 6px; +} + +.permalink +{ + font-family: var(--font-family-monospace); + font-weight: 500; + line-height: 1.25; + font-size: 16px; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-family: var(--font-family-monospace); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + display: table !important; + width: 100%; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + border-radius: 4px; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-family: var(--font-family-monospace); + font-size: 13px; + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + background-color: var(--memdef-proto-background-color); + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-background-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 14px; + transition: opacity 0.3s ease; +} + +span.arrowhead { + position: relative; + padding: 0; + margin: 0 0 0 2px; + display: inline-block; + width: 5px; + height: 5px; + border-right: 2px solid var(--nav-arrow-color); + border-bottom: 2px solid var(--nav-arrow-color); + transform: rotate(-45deg); + transition: transform 0.3s ease; +} + +span.arrowhead.opened { + transform: rotate(45deg); +} + +.selected span.arrowhead { + border-right: 2px solid var(--nav-arrow-selected-color); + border-bottom: 2px solid var(--nav-arrow-selected-color); +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfolder { + width: 24px; + height: 18px; + margin-top: 6px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.icondoc { + width: 24px; + height: 18px; + margin-top: 3px; + vertical-align:top; + display: inline-block; + position: relative; +} + +.folder-icon { + width: 16px; + height: 11px; + background-color: var(--icon-folder-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 0 2px 2px 2px; + position: relative; + box-sizing: content-box; +} + +.folder-icon::after { + content: ''; + position: absolute; + top: 2px; + left: -1px; + width: 16px; + height: 7px; + background-color: var(--icon-folder-open-fill-color); + border: 1px solid var(--icon-folder-border-color); + border-radius: 7px 7px 2px 2px; + transform-origin: top left; + opacity: 0; + transition: all 0.3s linear; +} + +.folder-icon::before { + content: ''; + position: absolute; + top: -3px; + left: -1px; + width: 6px; + height: 2px; + background-color: var(--icon-folder-fill-color); + border-top: 1px solid var(--icon-folder-border-color); + border-left: 1px solid var(--icon-folder-border-color); + border-right: 1px solid var(--icon-folder-border-color); + border-radius: 2px 2px 0 0; +} + +.folder-icon.open::after { + top: 3px; + opacity: 1; +} + +.doc-icon { + left: 6px; + width: 12px; + height: 16px; + background-color: var(--icon-doc-border-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: relative; + display: inline-block; +} +.doc-icon::before { + content: ""; + left: 1px; + top: 1px; + width: 10px; + height: 14px; + background-color: var(--icon-doc-fill-color); + clip-path: polygon(0 0, 66% 0, 100% 25%, 100% 100%, 0 100%); + position: absolute; + box-sizing: border-box; +} +.doc-icon::after { + content: ""; + left: 7px; + top: 0px; + width: 3px; + height: 3px; + background-color: transparent; + position: absolute; + border: 1px solid var(--icon-doc-border-color); +} + + + + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +span.dynarrow { + position: relative; + display: inline-block; + width: 12px; + bottom: 1px; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + +/* style requirements page */ + +div.req_title { + text-decoration-line: underline; + text-decoration-style: solid; + text-decoration-color: var(--table-cell-border-color); + text-decoration-thickness: 1px; + font-weight: bold; +} + +table.reqlist tr > td:first-child { + text-align: right; + font-weight: bold; +} + +div.missing_satisfies { + border-left: 8px solid var(--satisfies-color-hl); + border-radius: 4px; + background: var(--satisfies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +div.missing_verifies { + border-left: 8px solid var(--verifies-color-hl); + border-radius: 4px; + background: var(--verifies-color-bg); + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; +} + +/* ----------- navigation breadcrumb styling ----------- */ + +#nav-path ul { + height: 30px; + line-height: 30px; + color: var(--nav-text-normal-color); + overflow: hidden; + margin: 0px; + padding-left: 4px; + background-image: none; + background: var(--page-background-color); + border-bottom: 1px solid var(--nav-breadcrumb-separator-color); + font-size: var(--nav-font-size-level1); + font-family: var(--font-family-nav); + position: relative; + z-index: 100; +} + +#main-nav { + border-bottom: 1px solid var(--nav-border-color); +} + +.navpath li { + list-style-type:none; + float:left; + color: var(--nav-foreground-color); +} + +.navpath li.footer { + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + font-size: 8pt; + color: var(--footer-foreground-color); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; + padding-left: 15px; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--nav-breadcrumb-color); + position: relative; + top: 0px; + height: 30px; + margin-right: -20px; +} + +#nav-path li.navelem:after { + content: ''; + display: inline-block; + position: relative; + top: 0; + right: -15px; + width: 30px; + height: 30px; + transform: scaleX(0.5) scale(0.707) rotate(45deg); + z-index: 10; + background: var(--page-background-color); + box-shadow: 2px -2px 0 2px var(--nav-breadcrumb-separator-color); + border-radius: 0 5px 0 50px; +} + +#nav-path li.navelem:first-child { + margin-left: -6px; +} + +#nav-path li.navelem:hover, +#nav-path li.navelem:hover:after { + background-color: var(--nav-breadcrumb-active-bg); +} + +/* ---------------------- */ + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + margin: 0px; + background-color: var(--header-background-color); + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl { + padding: 0 0 0 0; +} + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.warning .tt, dl.attention .tt, dl.important .tt { + background-color: hsl(from var(--warning-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.note .tt, dl.remark .tt { + background-color: hsl(from var(--note-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.todo .tt { + background-color: hsl(from var(--todo-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.test .tt { + background-color: hsl(from var(--test-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug .tt { + background-color: hsl(from var(--bug-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.deprecated .tt { + background-color: hsl(from var(--deprecated-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + +dl.invariant .tt, dl.pre .tt, dl.post .tt { + background-color: hsl(from var(--invariant-color-bg) h s calc(l + var(--fragment-highlight-filter))); +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0; + padding: 0; +} + +#side-nav #projectname +{ + font-size: 130%; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0 0 0 5px; + margin: 0px; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +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; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: 400; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0 2px 0; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 12px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + backdrop-filter: var(--tooltip-backdrop-filter); + -webkit-backdrop-filter: var(--tooltip-backdrop-filter); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-arrow-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd +{ + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +:root { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/html/doxygen.svg b/doc/html/doxygen.svg new file mode 100644 index 0000000..59c76de --- /dev/null +++ b/doc/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/doxygen_crawl.html b/doc/html/doxygen_crawl.html new file mode 100644 index 0000000..121836e --- /dev/null +++ b/doc/html/doxygen_crawl.html @@ -0,0 +1,242 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js new file mode 100644 index 0000000..0e15bd4 --- /dev/null +++ b/doc/html/dynsections.js @@ -0,0 +1,191 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.slideUp('fast'); + summary.show(); + $(linkObj).find('.arrowhead').addClass('closed').removeClass('opened'); + } else { + content.slideDown('fast'); + summary.hide(); + $(linkObj).find('.arrowhead').removeClass('closed').addClass('opened'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').addClass('plus').removeClass('minus'); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/doc/html/example_8hpp.html b/doc/html/example_8hpp.html new file mode 100644 index 0000000..e5960cd --- /dev/null +++ b/doc/html/example_8hpp.html @@ -0,0 +1,134 @@ + + + + + + + +Minecraft Community Edition: Core/example.hpp File Reference + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
example.hpp File Reference
+
+
+ +

Example of using all common Doxygen tags. +More...

+ +

Go to the source code of this file.

+ + + + +

+Classes

class  ExampleClass
 This is an example class showing Doxygen tags. More...
+

Detailed Description

+

Example of using all common Doxygen tags.

+
Author
Joud Kandeel
+
Version
1.0
+
Since
2026-03-13
+
Note
This file demonstrates how to document code with Doxygen.
+
Warning
Only for demonstration purposes; not optimized.
+
Todo
Add more functions in the future.
+
Bug
There may be edge cases not handled.
+
Deprecated
This example will be replaced in later versions.
+
+
+ +
+ + + + diff --git a/doc/html/example_8hpp_source.html b/doc/html/example_8hpp_source.html new file mode 100644 index 0000000..f738084 --- /dev/null +++ b/doc/html/example_8hpp_source.html @@ -0,0 +1,119 @@ + + + + + + + +Minecraft Community Edition: Core/example.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
example.hpp
+
+
+Go to the documentation of this file.
1
+
18
+
+ +
24public:
+
39 int add(int a, int b);
+
40
+
46 int subtract(int a, int b);
+
47};
+
+
48 // end of ExampleGroup
+
This is an example class showing Doxygen tags.
Definition example.hpp:23
+
int add(int a, int b)
Adds two integers.
+
+
+
+ + + + diff --git a/doc/html/examples.html b/doc/html/examples.html new file mode 100644 index 0000000..8a44f7c --- /dev/null +++ b/doc/html/examples.html @@ -0,0 +1,108 @@ + + + + + + + +Minecraft Community Edition: Examples + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Examples
+
+
+
Here is a list of all examples:
+
+
+
+ + + + diff --git a/doc/html/examples.js b/doc/html/examples.js new file mode 100644 index 0000000..4de54c9 --- /dev/null +++ b/doc/html/examples.js @@ -0,0 +1,4 @@ +var examples = +[ + [ "examples/example1.cpp", "examples_2example1_8cpp-example.html", null ] +]; \ No newline at end of file diff --git a/doc/html/examples_2example1_8cpp-example.html b/doc/html/examples_2example1_8cpp-example.html new file mode 100644 index 0000000..d88a17a --- /dev/null +++ b/doc/html/examples_2example1_8cpp-example.html @@ -0,0 +1,107 @@ + + + + + + + +Minecraft Community Edition: examples/example1.cpp + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
examples/example1.cpp
+
+
+

Subtracts two integers.

+

Subtracts two integers.

+
+
+
+ + + + diff --git a/doc/html/files.html b/doc/html/files.html new file mode 100644 index 0000000..c9a7485 --- /dev/null +++ b/doc/html/files.html @@ -0,0 +1,137 @@ + + + + + + + +Minecraft Community Edition: File List + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Common
 
Assert.hpp
 
Platform.hpp
 
Core
 
CoroutineScheduler.hpp
Simple coroutine scheduler that runs periodic callbacks using SFML time utilities
 
example.hpp
Example of using all common Doxygen tags
 
FunctionContainer.hpp
 
IEvent.hpp
 
QEventBus.hpp
Thread-safe event bus
 
Thread.hpp
High-level Thread wrapper and callable adapters used by the project
 
ThreadImpl.hpp
Platform-specific implementation details for mce::Thread
 
ThreadManager.hpp
Manages lifecycle and bookkeeping for mce::Thread instances
 
Graphics
 
OpenGL
 
GLGraphicsContext.hpp
 
GLRenderer.hpp
 
GraphicsContext.hpp
 
Renderer.hpp
 
IO
 
Stream
 
FileInputStream.hpp
 
FileOutputStream.hpp
 
InputStream.hpp
 
MemoryInputStream.hpp
 
OutputStream.hpp
 
Logger.hpp
 
LoggerSinks.hpp
 
VirtualFileSystem.hpp
+
+
+
+
+ + + + diff --git a/doc/html/files_dup.js b/doc/html/files_dup.js new file mode 100644 index 0000000..52e9982 --- /dev/null +++ b/doc/html/files_dup.js @@ -0,0 +1,7 @@ +var files_dup = +[ + [ "Common", "dir_4ab6b4cc6a7edbff49100e9123df213f.html", "dir_4ab6b4cc6a7edbff49100e9123df213f" ], + [ "Core", "dir_c6310732a22f63c0c2fc5595561e68f1.html", "dir_c6310732a22f63c0c2fc5595561e68f1" ], + [ "Graphics", "dir_64f7452aef2cdad98d34a70f5ea329e2.html", "dir_64f7452aef2cdad98d34a70f5ea329e2" ], + [ "IO", "dir_f0b8d3380d5649deec2d780f35ec3ac5.html", "dir_f0b8d3380d5649deec2d780f35ec3ac5" ] +]; \ No newline at end of file diff --git a/doc/html/functions.html b/doc/html/functions.html new file mode 100644 index 0000000..1d44e90 --- /dev/null +++ b/doc/html/functions.html @@ -0,0 +1,259 @@ + + + + + + + +Minecraft Community Edition: Class Members + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- q -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+ + +

- ~ -

+
+
+
+ + + + diff --git a/doc/html/functions_enum.html b/doc/html/functions_enum.html new file mode 100644 index 0000000..35cf58f --- /dev/null +++ b/doc/html/functions_enum.html @@ -0,0 +1,105 @@ + + + + + + + +Minecraft Community Edition: Class Members - Enumerations + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented enums with links to the class documentation for each member:
+
+
+
+ + + + diff --git a/doc/html/functions_eval.html b/doc/html/functions_eval.html new file mode 100644 index 0000000..a97a1f0 --- /dev/null +++ b/doc/html/functions_eval.html @@ -0,0 +1,108 @@ + + + + + + + +Minecraft Community Edition: Class Members - Enumerator + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented enum values with links to the class documentation for each member:
+
+
+
+ + + + diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html new file mode 100644 index 0000000..b6be879 --- /dev/null +++ b/doc/html/functions_func.html @@ -0,0 +1,214 @@ + + + + + + + +Minecraft Community Edition: Class Members - Functions + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the class documentation for each member:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+ + +

- ~ -

+
+
+
+ + + + diff --git a/doc/html/functions_type.html b/doc/html/functions_type.html new file mode 100644 index 0000000..5614912 --- /dev/null +++ b/doc/html/functions_type.html @@ -0,0 +1,106 @@ + + + + + + + +Minecraft Community Edition: Class Members - Typedefs + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented typedefs with links to the class documentation for each member:
+
+
+
+ + + + diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html new file mode 100644 index 0000000..d882a13 --- /dev/null +++ b/doc/html/functions_vars.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: Class Members - Variables + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ + + + diff --git a/doc/html/group___example_group.html b/doc/html/group___example_group.html new file mode 100644 index 0000000..af523ca --- /dev/null +++ b/doc/html/group___example_group.html @@ -0,0 +1,123 @@ + + + + + + + +Minecraft Community Edition: Example Group + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Example Group
+
+
+ +

A group containing example functions and classes. +More...

+ + + + +

+Classes

class  ExampleClass
 This is an example class showing Doxygen tags. More...
+

Detailed Description

+

A group containing example functions and classes.

+
+
+ +
+ + + + diff --git a/doc/html/group___example_group.js b/doc/html/group___example_group.js new file mode 100644 index 0000000..98dbaab --- /dev/null +++ b/doc/html/group___example_group.js @@ -0,0 +1,6 @@ +var group___example_group = +[ + [ "ExampleClass", "class_example_class.html", [ + [ "add", "class_example_class.html#a9d2ee12372f2f25050ffd0283a7c6a8d", null ] + ] ] +]; \ No newline at end of file diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html new file mode 100644 index 0000000..e707aa0 --- /dev/null +++ b/doc/html/hierarchy.html @@ -0,0 +1,143 @@ + + + + + + + +Minecraft Community Edition: Class Hierarchy + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Cmce::VirtualFileSystem::ConfigConfiguration for how the VirtualFileSystem should operate
 Cmce::CoroutineSchedulerCoroutine scheduler that manages periodic tasks
 CExampleClassThis is an example class showing Doxygen tags
 Cmce::FunctionContainerContainer for storing and invoking named functions
 Cmce::GraphicsContext
 Cmce::GLGraphicsContext
 Cmce::IEvent
 Cmce::event::LoggerOutput
 Cmce::event::ThreadFinished
 Cmce::event::ThreadStarted
 Cmce::InputStream
 Cmce::FileInputStream
 Cmce::MemoryInputStreamMemory-backed input stream
 Cmce::Logger
 Cmce::LoggerSink
 Cmce::FileSink
 Cmce::StdoutSink
 Cmce::OutputStream
 Cmce::FileOutputStreamPlatform-independent file output stream implementation
 Cmce::QEventBusThread-safe event bus
 Cmce::Renderer
 Cmce::GLRenderer
 Cmce::SubscriptionTokenToken object that controls the lifetime of an event subscription
 Cmce::CoroutineScheduler::TaskRepresents a single scheduled task
 Cmce::ThreadLightweight high-level thread wrapper
 Cmce::ThreadFuncAbstract type-erased callable interface used as a thread entry point
 Cmce::ThreadFunctor< F >Adapter that wraps a generic functor/lambda
 Cmce::ThreadMemberFunctor< C >Adapter that wraps a member function without extra arguments
 Cmce::ThreadMemberFunctorWithArgs< C, Args >Adapter that wraps a member function with arbitrary arguments
 Cmce::ThreadImplPlatform-specific thread implementation
 Cmce::ThreadManager::ThreadInfoMetadata stored per managed thread
 Cmce::ThreadManager
 Cmce::VirtualFileSystem::VersionVersion information for the virtual file system format
 Cmce::VirtualFileSystemVirtualFileSystem manages a collection of files referenced by tags
+
+
+
+
+ + + + diff --git a/doc/html/hierarchy.js b/doc/html/hierarchy.js new file mode 100644 index 0000000..8375950 --- /dev/null +++ b/doc/html/hierarchy.js @@ -0,0 +1,44 @@ +var hierarchy = +[ + [ "mce::VirtualFileSystem::Config", "structmce_1_1_virtual_file_system_1_1_config.html", null ], + [ "mce::CoroutineScheduler", "classmce_1_1_coroutine_scheduler.html", null ], + [ "ExampleClass", "class_example_class.html", null ], + [ "mce::FunctionContainer", "classmce_1_1_function_container.html", null ], + [ "mce::GraphicsContext", "classmce_1_1_graphics_context.html", [ + [ "mce::GLGraphicsContext", "classmce_1_1_g_l_graphics_context.html", null ] + ] ], + [ "mce::IEvent", "structmce_1_1_i_event.html", [ + [ "mce::event::LoggerOutput", "structmce_1_1event_1_1_logger_output.html", null ], + [ "mce::event::ThreadFinished", "structmce_1_1event_1_1_thread_finished.html", null ], + [ "mce::event::ThreadStarted", "structmce_1_1event_1_1_thread_started.html", null ] + ] ], + [ "mce::InputStream", "classmce_1_1_input_stream.html", [ + [ "mce::FileInputStream", "classmce_1_1_file_input_stream.html", null ], + [ "mce::MemoryInputStream", "classmce_1_1_memory_input_stream.html", null ] + ] ], + [ "mce::Logger", "classmce_1_1_logger.html", null ], + [ "mce::LoggerSink", "classmce_1_1_logger_sink.html", [ + [ "mce::FileSink", "classmce_1_1_file_sink.html", null ], + [ "mce::StdoutSink", "classmce_1_1_stdout_sink.html", null ] + ] ], + [ "mce::OutputStream", "classmce_1_1_output_stream.html", [ + [ "mce::FileOutputStream", "classmce_1_1_file_output_stream.html", null ] + ] ], + [ "mce::QEventBus", "classmce_1_1_q_event_bus.html", null ], + [ "mce::Renderer", "classmce_1_1_renderer.html", [ + [ "mce::GLRenderer", "classmce_1_1_g_l_renderer.html", null ] + ] ], + [ "mce::SubscriptionToken", "structmce_1_1_subscription_token.html", null ], + [ "mce::CoroutineScheduler::Task", "structmce_1_1_coroutine_scheduler_1_1_task.html", null ], + [ "mce::Thread", "classmce_1_1_thread.html", null ], + [ "mce::ThreadFunc", "structmce_1_1_thread_func.html", [ + [ "mce::ThreadFunctor< F >", "structmce_1_1_thread_functor.html", null ], + [ "mce::ThreadMemberFunctor< C >", "structmce_1_1_thread_member_functor.html", null ], + [ "mce::ThreadMemberFunctorWithArgs< C, Args >", "structmce_1_1_thread_member_functor_with_args.html", null ] + ] ], + [ "mce::ThreadImpl", "classmce_1_1_thread_impl.html", null ], + [ "mce::ThreadManager::ThreadInfo", "structmce_1_1_thread_manager_1_1_thread_info.html", null ], + [ "mce::ThreadManager", "classmce_1_1_thread_manager.html", null ], + [ "mce::VirtualFileSystem::Version", "unionmce_1_1_virtual_file_system_1_1_version.html", null ], + [ "mce::VirtualFileSystem", "classmce_1_1_virtual_file_system.html", null ] +]; \ No newline at end of file diff --git a/doc/html/index.html b/doc/html/index.html new file mode 100644 index 0000000..741cb66 --- /dev/null +++ b/doc/html/index.html @@ -0,0 +1,106 @@ + + + + + + + +Minecraft Community Edition: Main Page + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Minecraft Community Edition Documentation
+
+
+ +
+
+
+ + + + diff --git a/doc/html/jquery.js b/doc/html/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/doc/html/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/doc/html/json_8hpp_source.html b/doc/html/json_8hpp_source.html new file mode 100644 index 0000000..26c4a10 --- /dev/null +++ b/doc/html/json_8hpp_source.html @@ -0,0 +1,22206 @@ + + + + + + + +Minecraft Community Edition: IO/nlohmann/json.hpp Source File + + + + + + + + + + + + + + + +
+
+ + + + + + +
+
Minecraft Community Edition 0.1.0 +
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
json.hpp
+
+
+
1// __ _____ _____ _____
+
2// __| | __| | | | JSON for Modern C++
+
3// | | |__ | | | | | | version 3.12.0
+
4// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
5//
+
6// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
7// SPDX-License-Identifier: MIT
+
8
+
9/****************************************************************************\
+
10 * Note on documentation: The source files contain links to the online *
+
11 * documentation of the public API at https://json.nlohmann.me. This URL *
+
12 * contains the most recent documentation and should also be applicable to *
+
13 * previous versions; documentation for deprecated functions is not *
+
14 * removed, but marked deprecated. See "Generate documentation" section in *
+
15 * file docs/README.md. *
+
16\****************************************************************************/
+
17
+
18#ifndef INCLUDE_NLOHMANN_JSON_HPP_
+
19#define INCLUDE_NLOHMANN_JSON_HPP_
+
20
+
21#include <algorithm> // all_of, find, for_each
+
22#include <cstddef> // nullptr_t, ptrdiff_t, size_t
+
23#include <functional> // hash, less
+
24#include <initializer_list> // initializer_list
+
25#ifndef JSON_NO_IO
+
26#include <iosfwd> // istream, ostream
+
27#endif // JSON_NO_IO
+
28#include <iterator> // random_access_iterator_tag
+
29#include <memory> // unique_ptr
+
30#include <string> // string, stoi, to_string
+
31#include <utility> // declval, forward, move, pair, swap
+
32#include <vector> // vector
+
33
+
34// #include <nlohmann/adl_serializer.hpp>
+
35// __ _____ _____ _____
+
36// __| | __| | | | JSON for Modern C++
+
37// | | |__ | | | | | | version 3.12.0
+
38// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
39//
+
40// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
41// SPDX-License-Identifier: MIT
+
42
+
43
+
44
+
45#include <utility>
+
46
+
47// #include <nlohmann/detail/abi_macros.hpp>
+
48// __ _____ _____ _____
+
49// __| | __| | | | JSON for Modern C++
+
50// | | |__ | | | | | | version 3.12.0
+
51// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
52//
+
53// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
54// SPDX-License-Identifier: MIT
+
55
+
56
+
57
+
58// This file contains all macro definitions affecting or depending on the ABI
+
59
+
60#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
+
61#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
+
62#if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 12 || NLOHMANN_JSON_VERSION_PATCH != 0
+
63#warning "Already included a different version of the library!"
+
64#endif
+
65#endif
+
66#endif
+
67
+
68#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum)
+
69#define NLOHMANN_JSON_VERSION_MINOR 12 // NOLINT(modernize-macro-to-enum)
+
70#define NLOHMANN_JSON_VERSION_PATCH 0 // NOLINT(modernize-macro-to-enum)
+
71
+
72#ifndef JSON_DIAGNOSTICS
+
73#define JSON_DIAGNOSTICS 0
+
74#endif
+
75
+
76#ifndef JSON_DIAGNOSTIC_POSITIONS
+
77#define JSON_DIAGNOSTIC_POSITIONS 0
+
78#endif
+
79
+
80#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
+
81#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
+
82#endif
+
83
+
84#if JSON_DIAGNOSTICS
+
85#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag
+
86#else
+
87#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS
+
88#endif
+
89
+
90#if JSON_DIAGNOSTIC_POSITIONS
+
91#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS _dp
+
92#else
+
93#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS
+
94#endif
+
95
+
96#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
+
97#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp
+
98#else
+
99#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON
+
100#endif
+
101
+
102#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION
+
103#define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0
+
104#endif
+
105
+
106// Construct the namespace ABI tags component
+
107#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) json_abi ## a ## b ## c
+
108#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b, c) \
+
109 NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c)
+
110
+
111#define NLOHMANN_JSON_ABI_TAGS \
+
112 NLOHMANN_JSON_ABI_TAGS_CONCAT( \
+
113 NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \
+
114 NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON, \
+
115 NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS)
+
116
+
117// Construct the namespace version component
+
118#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \
+
119 _v ## major ## _ ## minor ## _ ## patch
+
120#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \
+
121 NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch)
+
122
+
123#if NLOHMANN_JSON_NAMESPACE_NO_VERSION
+
124#define NLOHMANN_JSON_NAMESPACE_VERSION
+
125#else
+
126#define NLOHMANN_JSON_NAMESPACE_VERSION \
+
127 NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \
+
128 NLOHMANN_JSON_VERSION_MINOR, \
+
129 NLOHMANN_JSON_VERSION_PATCH)
+
130#endif
+
131
+
132// Combine namespace components
+
133#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b
+
134#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \
+
135 NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b)
+
136
+
137#ifndef NLOHMANN_JSON_NAMESPACE
+
138#define NLOHMANN_JSON_NAMESPACE \
+
139 nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \
+
140 NLOHMANN_JSON_ABI_TAGS, \
+
141 NLOHMANN_JSON_NAMESPACE_VERSION)
+
142#endif
+
143
+
144#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN
+
145#define NLOHMANN_JSON_NAMESPACE_BEGIN \
+
146 namespace nlohmann \
+
147 { \
+
148 inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \
+
149 NLOHMANN_JSON_ABI_TAGS, \
+
150 NLOHMANN_JSON_NAMESPACE_VERSION) \
+
151 {
+
152#endif
+
153
+
154#ifndef NLOHMANN_JSON_NAMESPACE_END
+
155#define NLOHMANN_JSON_NAMESPACE_END \
+
156 } /* namespace (inline namespace) NOLINT(readability/namespace) */ \
+
157 } // namespace nlohmann
+
158#endif
+
159
+
160// #include <nlohmann/detail/conversions/from_json.hpp>
+
161// __ _____ _____ _____
+
162// __| | __| | | | JSON for Modern C++
+
163// | | |__ | | | | | | version 3.12.0
+
164// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
165//
+
166// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
167// SPDX-License-Identifier: MIT
+
168
+
169
+
170
+
171#include <algorithm> // transform
+
172#include <array> // array
+
173#include <forward_list> // forward_list
+
174#include <iterator> // inserter, front_inserter, end
+
175#include <map> // map
+
176#include <string> // string
+
177#include <tuple> // tuple, make_tuple
+
178#include <type_traits> // is_arithmetic, is_same, is_enum, underlying_type, is_convertible
+
179#include <unordered_map> // unordered_map
+
180#include <utility> // pair, declval
+
181#include <valarray> // valarray
+
182
+
183// #include <nlohmann/detail/exceptions.hpp>
+
184// __ _____ _____ _____
+
185// __| | __| | | | JSON for Modern C++
+
186// | | |__ | | | | | | version 3.12.0
+
187// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
188//
+
189// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
190// SPDX-License-Identifier: MIT
+
191
+
192
+
193
+
194#include <cstddef> // nullptr_t
+
195#include <exception> // exception
+
196#if JSON_DIAGNOSTICS
+
197#include <numeric> // accumulate
+
198#endif
+
199#include <stdexcept> // runtime_error
+
200#include <string> // to_string
+
201#include <vector> // vector
+
202
+
203// #include <nlohmann/detail/value_t.hpp>
+
204// __ _____ _____ _____
+
205// __| | __| | | | JSON for Modern C++
+
206// | | |__ | | | | | | version 3.12.0
+
207// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
208//
+
209// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
210// SPDX-License-Identifier: MIT
+
211
+
212
+
213
+
214#include <array> // array
+
215#include <cstddef> // size_t
+
216#include <cstdint> // uint8_t
+
217#include <string> // string
+
218
+
219// #include <nlohmann/detail/macro_scope.hpp>
+
220// __ _____ _____ _____
+
221// __| | __| | | | JSON for Modern C++
+
222// | | |__ | | | | | | version 3.12.0
+
223// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
224//
+
225// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
226// SPDX-License-Identifier: MIT
+
227
+
228
+
229
+
230#include <utility> // declval, pair
+
231// #include <nlohmann/detail/meta/detected.hpp>
+
232// __ _____ _____ _____
+
233// __| | __| | | | JSON for Modern C++
+
234// | | |__ | | | | | | version 3.12.0
+
235// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
236//
+
237// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
238// SPDX-License-Identifier: MIT
+
239
+
240
+
241
+
242#include <type_traits>
+
243
+
244// #include <nlohmann/detail/meta/void_t.hpp>
+
245// __ _____ _____ _____
+
246// __| | __| | | | JSON for Modern C++
+
247// | | |__ | | | | | | version 3.12.0
+
248// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
249//
+
250// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
251// SPDX-License-Identifier: MIT
+
252
+
253
+
254
+
255// #include <nlohmann/detail/abi_macros.hpp>
+
256
+
257
+
258NLOHMANN_JSON_NAMESPACE_BEGIN
+
+
259namespace detail {
+
260
+
+
261 template<typename ...Ts> struct make_void {
+
262 using type = void;
+
263 };
+
+
264 template<typename ...Ts> using void_t = typename make_void<Ts...>::type;
+
265
+
266} // namespace detail
+
+
267NLOHMANN_JSON_NAMESPACE_END
+
268
+
269
+
270NLOHMANN_JSON_NAMESPACE_BEGIN
+
271namespace detail {
+
272
+
273 // https://en.cppreference.com/w/cpp/experimental/is_detected
+
+
274 struct nonesuch {
+
275 nonesuch() = delete;
+
276 ~nonesuch() = delete;
+
277 nonesuch(nonesuch const&) = delete;
+
278 nonesuch(nonesuch const&&) = delete;
+
279 void operator=(nonesuch const&) = delete;
+
280 void operator=(nonesuch&&) = delete;
+
281 };
+
+
282
+
283 template<class Default,
+
284 class AlwaysVoid,
+
285 template<class...> class Op,
+
286 class... Args>
+
+
287 struct detector {
+
288 using value_t = std::false_type;
+
289 using type = Default;
+
290 };
+
+
291
+
292 template<class Default, template<class...> class Op, class... Args>
+
+
293 struct detector<Default, void_t<Op<Args...>>, Op, Args...> {
+
294 using value_t = std::true_type;
+
295 using type = Op<Args...>;
+
296 };
+
+
297
+
298 template<template<class...> class Op, class... Args>
+
299 using is_detected = typename detector<nonesuch, void, Op, Args...>::value_t;
+
300
+
301 template<template<class...> class Op, class... Args>
+
302 struct is_detected_lazy : is_detected<Op, Args...> {};
+
303
+
304 template<template<class...> class Op, class... Args>
+
305 using detected_t = typename detector<nonesuch, void, Op, Args...>::type;
+
306
+
307 template<class Default, template<class...> class Op, class... Args>
+
308 using detected_or = detector<Default, void, Op, Args...>;
+
309
+
310 template<class Default, template<class...> class Op, class... Args>
+
311 using detected_or_t = typename detected_or<Default, Op, Args...>::type;
+
312
+
313 template<class Expected, template<class...> class Op, class... Args>
+
314 using is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;
+
315
+
316 template<class To, template<class...> class Op, class... Args>
+
317 using is_detected_convertible =
+
318 std::is_convertible<detected_t<Op, Args...>, To>;
+
319
+
320} // namespace detail
+
321NLOHMANN_JSON_NAMESPACE_END
+
322
+
323// #include <nlohmann/thirdparty/hedley/hedley.hpp>
+
324
+
325
+
326// __ _____ _____ _____
+
327// __| | __| | | | JSON for Modern C++
+
328// | | |__ | | | | | | version 3.12.0
+
329// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
330//
+
331// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
332// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson <evan@nemerson.com>
+
333// SPDX-License-Identifier: MIT
+
334
+
335/* Hedley - https://nemequ.github.io/hedley
+
336 * Created by Evan Nemerson <evan@nemerson.com>
+
337 * SPDX-License-Identifier: CC0-1.0
+
338 */
+
339
+
340#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15)
+
341#if defined(JSON_HEDLEY_VERSION)
+
342#undef JSON_HEDLEY_VERSION
+
343#endif
+
344#define JSON_HEDLEY_VERSION 15
+
345
+
346#if defined(JSON_HEDLEY_STRINGIFY_EX)
+
347#undef JSON_HEDLEY_STRINGIFY_EX
+
348#endif
+
349#define JSON_HEDLEY_STRINGIFY_EX(x) #x
+
350
+
351#if defined(JSON_HEDLEY_STRINGIFY)
+
352#undef JSON_HEDLEY_STRINGIFY
+
353#endif
+
354#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x)
+
355
+
356#if defined(JSON_HEDLEY_CONCAT_EX)
+
357#undef JSON_HEDLEY_CONCAT_EX
+
358#endif
+
359#define JSON_HEDLEY_CONCAT_EX(a,b) a##b
+
360
+
361#if defined(JSON_HEDLEY_CONCAT)
+
362#undef JSON_HEDLEY_CONCAT
+
363#endif
+
364#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b)
+
365
+
366#if defined(JSON_HEDLEY_CONCAT3_EX)
+
367#undef JSON_HEDLEY_CONCAT3_EX
+
368#endif
+
369#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c
+
370
+
371#if defined(JSON_HEDLEY_CONCAT3)
+
372#undef JSON_HEDLEY_CONCAT3
+
373#endif
+
374#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c)
+
375
+
376#if defined(JSON_HEDLEY_VERSION_ENCODE)
+
377#undef JSON_HEDLEY_VERSION_ENCODE
+
378#endif
+
379#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision))
+
380
+
381#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR)
+
382#undef JSON_HEDLEY_VERSION_DECODE_MAJOR
+
383#endif
+
384#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000)
+
385
+
386#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR)
+
387#undef JSON_HEDLEY_VERSION_DECODE_MINOR
+
388#endif
+
389#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000)
+
390
+
391#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION)
+
392#undef JSON_HEDLEY_VERSION_DECODE_REVISION
+
393#endif
+
394#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000)
+
395
+
396#if defined(JSON_HEDLEY_GNUC_VERSION)
+
397#undef JSON_HEDLEY_GNUC_VERSION
+
398#endif
+
399#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)
+
400#define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+
401#elif defined(__GNUC__)
+
402#define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0)
+
403#endif
+
404
+
405#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK)
+
406#undef JSON_HEDLEY_GNUC_VERSION_CHECK
+
407#endif
+
408#if defined(JSON_HEDLEY_GNUC_VERSION)
+
409#define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
410#else
+
411#define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0)
+
412#endif
+
413
+
414#if defined(JSON_HEDLEY_MSVC_VERSION)
+
415#undef JSON_HEDLEY_MSVC_VERSION
+
416#endif
+
417#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL)
+
418#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100)
+
419#elif defined(_MSC_FULL_VER) && !defined(__ICL)
+
420#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10)
+
421#elif defined(_MSC_VER) && !defined(__ICL)
+
422#define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0)
+
423#endif
+
424
+
425#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK)
+
426#undef JSON_HEDLEY_MSVC_VERSION_CHECK
+
427#endif
+
428#if !defined(JSON_HEDLEY_MSVC_VERSION)
+
429#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0)
+
430#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
+
431#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))
+
432#elif defined(_MSC_VER) && (_MSC_VER >= 1200)
+
433#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))
+
434#else
+
435#define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor)))
+
436#endif
+
437
+
438#if defined(JSON_HEDLEY_INTEL_VERSION)
+
439#undef JSON_HEDLEY_INTEL_VERSION
+
440#endif
+
441#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL)
+
442#define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE)
+
443#elif defined(__INTEL_COMPILER) && !defined(__ICL)
+
444#define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)
+
445#endif
+
446
+
447#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK)
+
448#undef JSON_HEDLEY_INTEL_VERSION_CHECK
+
449#endif
+
450#if defined(JSON_HEDLEY_INTEL_VERSION)
+
451#define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
452#else
+
453#define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0)
+
454#endif
+
455
+
456#if defined(JSON_HEDLEY_INTEL_CL_VERSION)
+
457#undef JSON_HEDLEY_INTEL_CL_VERSION
+
458#endif
+
459#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL)
+
460#define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0)
+
461#endif
+
462
+
463#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK)
+
464#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK
+
465#endif
+
466#if defined(JSON_HEDLEY_INTEL_CL_VERSION)
+
467#define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
468#else
+
469#define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0)
+
470#endif
+
471
+
472#if defined(JSON_HEDLEY_PGI_VERSION)
+
473#undef JSON_HEDLEY_PGI_VERSION
+
474#endif
+
475#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)
+
476#define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)
+
477#endif
+
478
+
479#if defined(JSON_HEDLEY_PGI_VERSION_CHECK)
+
480#undef JSON_HEDLEY_PGI_VERSION_CHECK
+
481#endif
+
482#if defined(JSON_HEDLEY_PGI_VERSION)
+
483#define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
484#else
+
485#define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0)
+
486#endif
+
487
+
488#if defined(JSON_HEDLEY_SUNPRO_VERSION)
+
489#undef JSON_HEDLEY_SUNPRO_VERSION
+
490#endif
+
491#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)
+
492#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10)
+
493#elif defined(__SUNPRO_C)
+
494#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf)
+
495#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)
+
496#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10)
+
497#elif defined(__SUNPRO_CC)
+
498#define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf)
+
499#endif
+
500
+
501#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK)
+
502#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
+
503#endif
+
504#if defined(JSON_HEDLEY_SUNPRO_VERSION)
+
505#define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
506#else
+
507#define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0)
+
508#endif
+
509
+
510#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)
+
511#undef JSON_HEDLEY_EMSCRIPTEN_VERSION
+
512#endif
+
513#if defined(__EMSCRIPTEN__)
+
514#define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__)
+
515#endif
+
516
+
517#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK)
+
518#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
+
519#endif
+
520#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)
+
521#define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
522#else
+
523#define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0)
+
524#endif
+
525
+
526#if defined(JSON_HEDLEY_ARM_VERSION)
+
527#undef JSON_HEDLEY_ARM_VERSION
+
528#endif
+
529#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)
+
530#define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100)
+
531#elif defined(__CC_ARM) && defined(__ARMCC_VERSION)
+
532#define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100)
+
533#endif
+
534
+
535#if defined(JSON_HEDLEY_ARM_VERSION_CHECK)
+
536#undef JSON_HEDLEY_ARM_VERSION_CHECK
+
537#endif
+
538#if defined(JSON_HEDLEY_ARM_VERSION)
+
539#define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
540#else
+
541#define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0)
+
542#endif
+
543
+
544#if defined(JSON_HEDLEY_IBM_VERSION)
+
545#undef JSON_HEDLEY_IBM_VERSION
+
546#endif
+
547#if defined(__ibmxl__)
+
548#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__)
+
549#elif defined(__xlC__) && defined(__xlC_ver__)
+
550#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff)
+
551#elif defined(__xlC__)
+
552#define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0)
+
553#endif
+
554
+
555#if defined(JSON_HEDLEY_IBM_VERSION_CHECK)
+
556#undef JSON_HEDLEY_IBM_VERSION_CHECK
+
557#endif
+
558#if defined(JSON_HEDLEY_IBM_VERSION)
+
559#define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
560#else
+
561#define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0)
+
562#endif
+
563
+
564#if defined(JSON_HEDLEY_TI_VERSION)
+
565#undef JSON_HEDLEY_TI_VERSION
+
566#endif
+
567#if \
+
568 defined(__TI_COMPILER_VERSION__) && \
+
569 ( \
+
570 defined(__TMS470__) || defined(__TI_ARM__) || \
+
571 defined(__MSP430__) || \
+
572 defined(__TMS320C2000__) \
+
573 )
+
574#if (__TI_COMPILER_VERSION__ >= 16000000)
+
575#define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+
576#endif
+
577#endif
+
578
+
579#if defined(JSON_HEDLEY_TI_VERSION_CHECK)
+
580#undef JSON_HEDLEY_TI_VERSION_CHECK
+
581#endif
+
582#if defined(JSON_HEDLEY_TI_VERSION)
+
583#define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
584#else
+
585#define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0)
+
586#endif
+
587
+
588#if defined(JSON_HEDLEY_TI_CL2000_VERSION)
+
589#undef JSON_HEDLEY_TI_CL2000_VERSION
+
590#endif
+
591#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__)
+
592#define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+
593#endif
+
594
+
595#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK)
+
596#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
+
597#endif
+
598#if defined(JSON_HEDLEY_TI_CL2000_VERSION)
+
599#define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
600#else
+
601#define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0)
+
602#endif
+
603
+
604#if defined(JSON_HEDLEY_TI_CL430_VERSION)
+
605#undef JSON_HEDLEY_TI_CL430_VERSION
+
606#endif
+
607#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__)
+
608#define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+
609#endif
+
610
+
611#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK)
+
612#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
+
613#endif
+
614#if defined(JSON_HEDLEY_TI_CL430_VERSION)
+
615#define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
616#else
+
617#define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0)
+
618#endif
+
619
+
620#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)
+
621#undef JSON_HEDLEY_TI_ARMCL_VERSION
+
622#endif
+
623#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__))
+
624#define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+
625#endif
+
626
+
627#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK)
+
628#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
+
629#endif
+
630#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)
+
631#define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
632#else
+
633#define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0)
+
634#endif
+
635
+
636#if defined(JSON_HEDLEY_TI_CL6X_VERSION)
+
637#undef JSON_HEDLEY_TI_CL6X_VERSION
+
638#endif
+
639#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__)
+
640#define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+
641#endif
+
642
+
643#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK)
+
644#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
+
645#endif
+
646#if defined(JSON_HEDLEY_TI_CL6X_VERSION)
+
647#define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
648#else
+
649#define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0)
+
650#endif
+
651
+
652#if defined(JSON_HEDLEY_TI_CL7X_VERSION)
+
653#undef JSON_HEDLEY_TI_CL7X_VERSION
+
654#endif
+
655#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__)
+
656#define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+
657#endif
+
658
+
659#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK)
+
660#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
+
661#endif
+
662#if defined(JSON_HEDLEY_TI_CL7X_VERSION)
+
663#define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
664#else
+
665#define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0)
+
666#endif
+
667
+
668#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)
+
669#undef JSON_HEDLEY_TI_CLPRU_VERSION
+
670#endif
+
671#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__)
+
672#define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+
673#endif
+
674
+
675#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK)
+
676#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
+
677#endif
+
678#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)
+
679#define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
680#else
+
681#define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0)
+
682#endif
+
683
+
684#if defined(JSON_HEDLEY_CRAY_VERSION)
+
685#undef JSON_HEDLEY_CRAY_VERSION
+
686#endif
+
687#if defined(_CRAYC)
+
688#if defined(_RELEASE_PATCHLEVEL)
+
689#define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL)
+
690#else
+
691#define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0)
+
692#endif
+
693#endif
+
694
+
695#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK)
+
696#undef JSON_HEDLEY_CRAY_VERSION_CHECK
+
697#endif
+
698#if defined(JSON_HEDLEY_CRAY_VERSION)
+
699#define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
700#else
+
701#define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0)
+
702#endif
+
703
+
704#if defined(JSON_HEDLEY_IAR_VERSION)
+
705#undef JSON_HEDLEY_IAR_VERSION
+
706#endif
+
707#if defined(__IAR_SYSTEMS_ICC__)
+
708#if __VER__ > 1000
+
709#define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000))
+
710#else
+
711#define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0)
+
712#endif
+
713#endif
+
714
+
715#if defined(JSON_HEDLEY_IAR_VERSION_CHECK)
+
716#undef JSON_HEDLEY_IAR_VERSION_CHECK
+
717#endif
+
718#if defined(JSON_HEDLEY_IAR_VERSION)
+
719#define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
720#else
+
721#define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0)
+
722#endif
+
723
+
724#if defined(JSON_HEDLEY_TINYC_VERSION)
+
725#undef JSON_HEDLEY_TINYC_VERSION
+
726#endif
+
727#if defined(__TINYC__)
+
728#define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100)
+
729#endif
+
730
+
731#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK)
+
732#undef JSON_HEDLEY_TINYC_VERSION_CHECK
+
733#endif
+
734#if defined(JSON_HEDLEY_TINYC_VERSION)
+
735#define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
736#else
+
737#define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0)
+
738#endif
+
739
+
740#if defined(JSON_HEDLEY_DMC_VERSION)
+
741#undef JSON_HEDLEY_DMC_VERSION
+
742#endif
+
743#if defined(__DMC__)
+
744#define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf)
+
745#endif
+
746
+
747#if defined(JSON_HEDLEY_DMC_VERSION_CHECK)
+
748#undef JSON_HEDLEY_DMC_VERSION_CHECK
+
749#endif
+
750#if defined(JSON_HEDLEY_DMC_VERSION)
+
751#define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
752#else
+
753#define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0)
+
754#endif
+
755
+
756#if defined(JSON_HEDLEY_COMPCERT_VERSION)
+
757#undef JSON_HEDLEY_COMPCERT_VERSION
+
758#endif
+
759#if defined(__COMPCERT_VERSION__)
+
760#define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100)
+
761#endif
+
762
+
763#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK)
+
764#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
+
765#endif
+
766#if defined(JSON_HEDLEY_COMPCERT_VERSION)
+
767#define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
768#else
+
769#define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0)
+
770#endif
+
771
+
772#if defined(JSON_HEDLEY_PELLES_VERSION)
+
773#undef JSON_HEDLEY_PELLES_VERSION
+
774#endif
+
775#if defined(__POCC__)
+
776#define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0)
+
777#endif
+
778
+
779#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK)
+
780#undef JSON_HEDLEY_PELLES_VERSION_CHECK
+
781#endif
+
782#if defined(JSON_HEDLEY_PELLES_VERSION)
+
783#define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
784#else
+
785#define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0)
+
786#endif
+
787
+
788#if defined(JSON_HEDLEY_MCST_LCC_VERSION)
+
789#undef JSON_HEDLEY_MCST_LCC_VERSION
+
790#endif
+
791#if defined(__LCC__) && defined(__LCC_MINOR__)
+
792#define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__)
+
793#endif
+
794
+
795#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK)
+
796#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK
+
797#endif
+
798#if defined(JSON_HEDLEY_MCST_LCC_VERSION)
+
799#define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
800#else
+
801#define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0)
+
802#endif
+
803
+
804#if defined(JSON_HEDLEY_GCC_VERSION)
+
805#undef JSON_HEDLEY_GCC_VERSION
+
806#endif
+
807#if \
+
808 defined(JSON_HEDLEY_GNUC_VERSION) && \
+
809 !defined(__clang__) && \
+
810 !defined(JSON_HEDLEY_INTEL_VERSION) && \
+
811 !defined(JSON_HEDLEY_PGI_VERSION) && \
+
812 !defined(JSON_HEDLEY_ARM_VERSION) && \
+
813 !defined(JSON_HEDLEY_CRAY_VERSION) && \
+
814 !defined(JSON_HEDLEY_TI_VERSION) && \
+
815 !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \
+
816 !defined(JSON_HEDLEY_TI_CL430_VERSION) && \
+
817 !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \
+
818 !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \
+
819 !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \
+
820 !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \
+
821 !defined(__COMPCERT__) && \
+
822 !defined(JSON_HEDLEY_MCST_LCC_VERSION)
+
823#define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION
+
824#endif
+
825
+
826#if defined(JSON_HEDLEY_GCC_VERSION_CHECK)
+
827#undef JSON_HEDLEY_GCC_VERSION_CHECK
+
828#endif
+
829#if defined(JSON_HEDLEY_GCC_VERSION)
+
830#define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+
831#else
+
832#define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0)
+
833#endif
+
834
+
835#if defined(JSON_HEDLEY_HAS_ATTRIBUTE)
+
836#undef JSON_HEDLEY_HAS_ATTRIBUTE
+
837#endif
+
838#if \
+
839 defined(__has_attribute) && \
+
840 ( \
+
841 (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \
+
842 )
+
843# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute)
+
844#else
+
845# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0)
+
846#endif
+
847
+
848#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE)
+
849#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
+
850#endif
+
851#if defined(__has_attribute)
+
852#define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)
+
853#else
+
854#define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+
855#endif
+
856
+
857#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE)
+
858#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
+
859#endif
+
860#if defined(__has_attribute)
+
861#define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)
+
862#else
+
863#define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+
864#endif
+
865
+
866#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE)
+
867#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
+
868#endif
+
869#if \
+
870 defined(__has_cpp_attribute) && \
+
871 defined(__cplusplus) && \
+
872 (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0))
+
873#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute)
+
874#else
+
875#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0)
+
876#endif
+
877
+
878#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS)
+
879#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
+
880#endif
+
881#if !defined(__cplusplus) || !defined(__has_cpp_attribute)
+
882#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)
+
883#elif \
+
884 !defined(JSON_HEDLEY_PGI_VERSION) && \
+
885 !defined(JSON_HEDLEY_IAR_VERSION) && \
+
886 (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \
+
887 (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0))
+
888#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute)
+
889#else
+
890#define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)
+
891#endif
+
892
+
893#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE)
+
894#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
+
895#endif
+
896#if defined(__has_cpp_attribute) && defined(__cplusplus)
+
897#define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)
+
898#else
+
899#define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+
900#endif
+
901
+
902#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE)
+
903#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
+
904#endif
+
905#if defined(__has_cpp_attribute) && defined(__cplusplus)
+
906#define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)
+
907#else
+
908#define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+
909#endif
+
910
+
911#if defined(JSON_HEDLEY_HAS_BUILTIN)
+
912#undef JSON_HEDLEY_HAS_BUILTIN
+
913#endif
+
914#if defined(__has_builtin)
+
915#define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin)
+
916#else
+
917#define JSON_HEDLEY_HAS_BUILTIN(builtin) (0)
+
918#endif
+
919
+
920#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN)
+
921#undef JSON_HEDLEY_GNUC_HAS_BUILTIN
+
922#endif
+
923#if defined(__has_builtin)
+
924#define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)
+
925#else
+
926#define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+
927#endif
+
928
+
929#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN)
+
930#undef JSON_HEDLEY_GCC_HAS_BUILTIN
+
931#endif
+
932#if defined(__has_builtin)
+
933#define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)
+
934#else
+
935#define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+
936#endif
+
937
+
938#if defined(JSON_HEDLEY_HAS_FEATURE)
+
939#undef JSON_HEDLEY_HAS_FEATURE
+
940#endif
+
941#if defined(__has_feature)
+
942#define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature)
+
943#else
+
944#define JSON_HEDLEY_HAS_FEATURE(feature) (0)
+
945#endif
+
946
+
947#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE)
+
948#undef JSON_HEDLEY_GNUC_HAS_FEATURE
+
949#endif
+
950#if defined(__has_feature)
+
951#define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)
+
952#else
+
953#define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+
954#endif
+
955
+
956#if defined(JSON_HEDLEY_GCC_HAS_FEATURE)
+
957#undef JSON_HEDLEY_GCC_HAS_FEATURE
+
958#endif
+
959#if defined(__has_feature)
+
960#define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)
+
961#else
+
962#define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+
963#endif
+
964
+
965#if defined(JSON_HEDLEY_HAS_EXTENSION)
+
966#undef JSON_HEDLEY_HAS_EXTENSION
+
967#endif
+
968#if defined(__has_extension)
+
969#define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension)
+
970#else
+
971#define JSON_HEDLEY_HAS_EXTENSION(extension) (0)
+
972#endif
+
973
+
974#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION)
+
975#undef JSON_HEDLEY_GNUC_HAS_EXTENSION
+
976#endif
+
977#if defined(__has_extension)
+
978#define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)
+
979#else
+
980#define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+
981#endif
+
982
+
983#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION)
+
984#undef JSON_HEDLEY_GCC_HAS_EXTENSION
+
985#endif
+
986#if defined(__has_extension)
+
987#define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)
+
988#else
+
989#define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+
990#endif
+
991
+
992#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE)
+
993#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
+
994#endif
+
995#if defined(__has_declspec_attribute)
+
996#define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute)
+
997#else
+
998#define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0)
+
999#endif
+
1000
+
1001#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE)
+
1002#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
+
1003#endif
+
1004#if defined(__has_declspec_attribute)
+
1005#define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)
+
1006#else
+
1007#define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+
1008#endif
+
1009
+
1010#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE)
+
1011#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
+
1012#endif
+
1013#if defined(__has_declspec_attribute)
+
1014#define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)
+
1015#else
+
1016#define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+
1017#endif
+
1018
+
1019#if defined(JSON_HEDLEY_HAS_WARNING)
+
1020#undef JSON_HEDLEY_HAS_WARNING
+
1021#endif
+
1022#if defined(__has_warning)
+
1023#define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning)
+
1024#else
+
1025#define JSON_HEDLEY_HAS_WARNING(warning) (0)
+
1026#endif
+
1027
+
1028#if defined(JSON_HEDLEY_GNUC_HAS_WARNING)
+
1029#undef JSON_HEDLEY_GNUC_HAS_WARNING
+
1030#endif
+
1031#if defined(__has_warning)
+
1032#define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)
+
1033#else
+
1034#define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+
1035#endif
+
1036
+
1037#if defined(JSON_HEDLEY_GCC_HAS_WARNING)
+
1038#undef JSON_HEDLEY_GCC_HAS_WARNING
+
1039#endif
+
1040#if defined(__has_warning)
+
1041#define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)
+
1042#else
+
1043#define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+
1044#endif
+
1045
+
1046#if \
+
1047 (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
+
1048 defined(__clang__) || \
+
1049 JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \
+
1050 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1051 JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \
+
1052 JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \
+
1053 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1054 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1055 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \
+
1056 JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \
+
1057 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \
+
1058 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \
+
1059 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1060 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1061 JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \
+
1062 JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \
+
1063 JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \
+
1064 (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR))
+
1065#define JSON_HEDLEY_PRAGMA(value) _Pragma(#value)
+
1066#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
+
1067#define JSON_HEDLEY_PRAGMA(value) __pragma(value)
+
1068#else
+
1069#define JSON_HEDLEY_PRAGMA(value)
+
1070#endif
+
1071
+
1072#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH)
+
1073#undef JSON_HEDLEY_DIAGNOSTIC_PUSH
+
1074#endif
+
1075#if defined(JSON_HEDLEY_DIAGNOSTIC_POP)
+
1076#undef JSON_HEDLEY_DIAGNOSTIC_POP
+
1077#endif
+
1078#if defined(__clang__)
+
1079#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push")
+
1080#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop")
+
1081#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+
1082#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
+
1083#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
+
1084#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)
+
1085#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
+
1086#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
+
1087#elif \
+
1088 JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \
+
1089 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1090#define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push))
+
1091#define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop))
+
1092#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0)
+
1093#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push")
+
1094#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop")
+
1095#elif \
+
1096 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1097 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1098 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \
+
1099 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \
+
1100 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1101 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+
1102#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push")
+
1103#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop")
+
1104#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)
+
1105#define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
+
1106#define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
+
1107#else
+
1108#define JSON_HEDLEY_DIAGNOSTIC_PUSH
+
1109#define JSON_HEDLEY_DIAGNOSTIC_POP
+
1110#endif
+
1111
+
1112 /* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for
+
1113 HEDLEY INTERNAL USE ONLY. API subject to change without notice. */
+
1114#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
+
1115#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
+
1116#endif
+
1117#if defined(__cplusplus)
+
1118# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat")
+
1119# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions")
+
1120# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions")
+
1121# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
+
1122 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
1123 _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
+
1124 _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \
+
1125 _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \
+
1126 xpr \
+
1127 JSON_HEDLEY_DIAGNOSTIC_POP
+
1128# else
+
1129# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
+
1130 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
1131 _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
+
1132 _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \
+
1133 xpr \
+
1134 JSON_HEDLEY_DIAGNOSTIC_POP
+
1135# endif
+
1136# else
+
1137# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
+
1138 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
1139 _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
+
1140 xpr \
+
1141 JSON_HEDLEY_DIAGNOSTIC_POP
+
1142# endif
+
1143# endif
+
1144#endif
+
1145#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
+
1146#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x
+
1147#endif
+
1148
+
1149#if defined(JSON_HEDLEY_CONST_CAST)
+
1150#undef JSON_HEDLEY_CONST_CAST
+
1151#endif
+
1152#if defined(__cplusplus)
+
1153# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr))
+
1154#elif \
+
1155 JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \
+
1156 JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \
+
1157 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+
1158# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \
+
1159 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
1160 JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \
+
1161 ((T) (expr)); \
+
1162 JSON_HEDLEY_DIAGNOSTIC_POP \
+
1163 }))
+
1164#else
+
1165# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr))
+
1166#endif
+
1167
+
1168#if defined(JSON_HEDLEY_REINTERPRET_CAST)
+
1169#undef JSON_HEDLEY_REINTERPRET_CAST
+
1170#endif
+
1171#if defined(__cplusplus)
+
1172#define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr))
+
1173#else
+
1174#define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr))
+
1175#endif
+
1176
+
1177#if defined(JSON_HEDLEY_STATIC_CAST)
+
1178#undef JSON_HEDLEY_STATIC_CAST
+
1179#endif
+
1180#if defined(__cplusplus)
+
1181#define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr))
+
1182#else
+
1183#define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr))
+
1184#endif
+
1185
+
1186#if defined(JSON_HEDLEY_CPP_CAST)
+
1187#undef JSON_HEDLEY_CPP_CAST
+
1188#endif
+
1189#if defined(__cplusplus)
+
1190# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast")
+
1191# define JSON_HEDLEY_CPP_CAST(T, expr) \
+
1192 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
1193 _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \
+
1194 ((T) (expr)) \
+
1195 JSON_HEDLEY_DIAGNOSTIC_POP
+
1196# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0)
+
1197# define JSON_HEDLEY_CPP_CAST(T, expr) \
+
1198 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
1199 _Pragma("diag_suppress=Pe137") \
+
1200 JSON_HEDLEY_DIAGNOSTIC_POP
+
1201# else
+
1202# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr))
+
1203# endif
+
1204#else
+
1205# define JSON_HEDLEY_CPP_CAST(T, expr) (expr)
+
1206#endif
+
1207
+
1208#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED)
+
1209#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
+
1210#endif
+
1211#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations")
+
1212#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
+
1213#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+
1214#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)")
+
1215#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1216#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786))
+
1217#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0)
+
1218#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445")
+
1219#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+
1220#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444")
+
1221#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)
+
1222#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+
1223#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
+
1224#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996))
+
1225#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1226#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444")
+
1227#elif \
+
1228 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1229 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1230 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1231 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1232 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1233 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1234 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1235 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1236 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1237 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1238 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+
1239#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718")
+
1240#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus)
+
1241#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)")
+
1242#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus)
+
1243#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)")
+
1244#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+
1245#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215")
+
1246#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)
+
1247#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)")
+
1248#else
+
1249#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
+
1250#endif
+
1251
+
1252#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS)
+
1253#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
+
1254#endif
+
1255#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
+
1256#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
+
1257#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+
1258#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)")
+
1259#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1260#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161))
+
1261#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+
1262#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
+
1263#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)
+
1264#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
+
1265#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
+
1266#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))
+
1267#elif \
+
1268 JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \
+
1269 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \
+
1270 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1271 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)
+
1272#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
+
1273#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0)
+
1274#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
+
1275#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+
1276#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
+
1277#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1278#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161")
+
1279#else
+
1280#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
+
1281#endif
+
1282
+
1283#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES)
+
1284#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
+
1285#endif
+
1286#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes")
+
1287#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"")
+
1288#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)
+
1289#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+
1290#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0)
+
1291#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)")
+
1292#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1293#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292))
+
1294#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0)
+
1295#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030))
+
1296#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0)
+
1297#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098")
+
1298#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+
1299#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097")
+
1300#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)
+
1301#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)")
+
1302#elif \
+
1303 JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \
+
1304 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \
+
1305 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0)
+
1306#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173")
+
1307#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+
1308#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097")
+
1309#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1310#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097")
+
1311#else
+
1312#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
+
1313#endif
+
1314
+
1315#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL)
+
1316#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
+
1317#endif
+
1318#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual")
+
1319#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"")
+
1320#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+
1321#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)")
+
1322#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0)
+
1323#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"")
+
1324#else
+
1325#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
+
1326#endif
+
1327
+
1328#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION)
+
1329#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
+
1330#endif
+
1331#if JSON_HEDLEY_HAS_WARNING("-Wunused-function")
+
1332#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"")
+
1333#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0)
+
1334#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"")
+
1335#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0)
+
1336#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505))
+
1337#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1338#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142")
+
1339#else
+
1340#define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
+
1341#endif
+
1342
+
1343#if defined(JSON_HEDLEY_DEPRECATED)
+
1344#undef JSON_HEDLEY_DEPRECATED
+
1345#endif
+
1346#if defined(JSON_HEDLEY_DEPRECATED_FOR)
+
1347#undef JSON_HEDLEY_DEPRECATED_FOR
+
1348#endif
+
1349#if \
+
1350 JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \
+
1351 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1352#define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since))
+
1353#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement))
+
1354#elif \
+
1355 (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \
+
1356 JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \
+
1357 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1358 JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \
+
1359 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \
+
1360 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
+
1361 JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \
+
1362 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \
+
1363 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \
+
1364 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1365 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \
+
1366 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1367#define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since)))
+
1368#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement)))
+
1369#elif defined(__cplusplus) && (__cplusplus >= 201402L)
+
1370#define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]])
+
1371#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]])
+
1372#elif \
+
1373 JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \
+
1374 JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
+
1375 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1376 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1377 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1378 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1379 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1380 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1381 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1382 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1383 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1384 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1385 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1386 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1387 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \
+
1388 JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)
+
1389#define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))
+
1390#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))
+
1391#elif \
+
1392 JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
+
1393 JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \
+
1394 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1395#define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated)
+
1396#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)
+
1397#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+
1398#define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated")
+
1399#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated")
+
1400#else
+
1401#define JSON_HEDLEY_DEPRECATED(since)
+
1402#define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)
+
1403#endif
+
1404
+
1405#if defined(JSON_HEDLEY_UNAVAILABLE)
+
1406#undef JSON_HEDLEY_UNAVAILABLE
+
1407#endif
+
1408#if \
+
1409 JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \
+
1410 JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \
+
1411 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1412 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1413#define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since)))
+
1414#else
+
1415#define JSON_HEDLEY_UNAVAILABLE(available_since)
+
1416#endif
+
1417
+
1418#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT)
+
1419#undef JSON_HEDLEY_WARN_UNUSED_RESULT
+
1420#endif
+
1421#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG)
+
1422#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
+
1423#endif
+
1424#if \
+
1425 JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \
+
1426 JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
+
1427 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1428 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1429 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1430 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1431 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1432 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1433 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1434 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1435 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1436 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1437 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1438 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1439 (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \
+
1440 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
+
1441 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1442#define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
+
1443#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__))
+
1444#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L)
+
1445#define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
+
1446#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]])
+
1447#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard)
+
1448#define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
+
1449#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
+
1450#elif defined(_Check_return_) /* SAL */
+
1451#define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_
+
1452#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_
+
1453#else
+
1454#define JSON_HEDLEY_WARN_UNUSED_RESULT
+
1455#define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg)
+
1456#endif
+
1457
+
1458#if defined(JSON_HEDLEY_SENTINEL)
+
1459#undef JSON_HEDLEY_SENTINEL
+
1460#endif
+
1461#if \
+
1462 JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \
+
1463 JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
+
1464 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1465 JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \
+
1466 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1467#define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position)))
+
1468#else
+
1469#define JSON_HEDLEY_SENTINEL(position)
+
1470#endif
+
1471
+
1472#if defined(JSON_HEDLEY_NO_RETURN)
+
1473#undef JSON_HEDLEY_NO_RETURN
+
1474#endif
+
1475#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+
1476#define JSON_HEDLEY_NO_RETURN __noreturn
+
1477#elif \
+
1478 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1479 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1480#define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))
+
1481#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
+
1482#define JSON_HEDLEY_NO_RETURN _Noreturn
+
1483#elif defined(__cplusplus) && (__cplusplus >= 201103L)
+
1484#define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]])
+
1485#elif \
+
1486 JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \
+
1487 JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \
+
1488 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+
1489 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1490 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+
1491 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1492 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1493 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1494 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1495 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1496 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1497 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1498 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1499 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1500 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1501 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1502 JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)
+
1503#define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))
+
1504#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
+
1505#define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return")
+
1506#elif \
+
1507 JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
+
1508 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1509#define JSON_HEDLEY_NO_RETURN __declspec(noreturn)
+
1510#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)
+
1511#define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;")
+
1512#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)
+
1513#define JSON_HEDLEY_NO_RETURN __attribute((noreturn))
+
1514#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)
+
1515#define JSON_HEDLEY_NO_RETURN __declspec(noreturn)
+
1516#else
+
1517#define JSON_HEDLEY_NO_RETURN
+
1518#endif
+
1519
+
1520#if defined(JSON_HEDLEY_NO_ESCAPE)
+
1521#undef JSON_HEDLEY_NO_ESCAPE
+
1522#endif
+
1523#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape)
+
1524#define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__))
+
1525#else
+
1526#define JSON_HEDLEY_NO_ESCAPE
+
1527#endif
+
1528
+
1529#if defined(JSON_HEDLEY_UNREACHABLE)
+
1530#undef JSON_HEDLEY_UNREACHABLE
+
1531#endif
+
1532#if defined(JSON_HEDLEY_UNREACHABLE_RETURN)
+
1533#undef JSON_HEDLEY_UNREACHABLE_RETURN
+
1534#endif
+
1535#if defined(JSON_HEDLEY_ASSUME)
+
1536#undef JSON_HEDLEY_ASSUME
+
1537#endif
+
1538#if \
+
1539 JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
+
1540 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1541 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1542#define JSON_HEDLEY_ASSUME(expr) __assume(expr)
+
1543#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume)
+
1544#define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr)
+
1545#elif \
+
1546 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
+
1547 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)
+
1548#if defined(__cplusplus)
+
1549#define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr)
+
1550#else
+
1551#define JSON_HEDLEY_ASSUME(expr) _nassert(expr)
+
1552#endif
+
1553#endif
+
1554#if \
+
1555 (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \
+
1556 JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \
+
1557 JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \
+
1558 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1559 JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \
+
1560 JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \
+
1561 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1562#define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable()
+
1563#elif defined(JSON_HEDLEY_ASSUME)
+
1564#define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)
+
1565#endif
+
1566#if !defined(JSON_HEDLEY_ASSUME)
+
1567#if defined(JSON_HEDLEY_UNREACHABLE)
+
1568#define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1)))
+
1569#else
+
1570#define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr)
+
1571#endif
+
1572#endif
+
1573#if defined(JSON_HEDLEY_UNREACHABLE)
+
1574#if \
+
1575 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
+
1576 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)
+
1577#define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value))
+
1578#else
+
1579#define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE()
+
1580#endif
+
1581#else
+
1582#define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value)
+
1583#endif
+
1584#if !defined(JSON_HEDLEY_UNREACHABLE)
+
1585#define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)
+
1586#endif
+
1587
+
1588 JSON_HEDLEY_DIAGNOSTIC_PUSH
+
1589#if JSON_HEDLEY_HAS_WARNING("-Wpedantic")
+
1590#pragma clang diagnostic ignored "-Wpedantic"
+
1591#endif
+
1592#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus)
+
1593#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
+
1594#endif
+
1595#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0)
+
1596#if defined(__clang__)
+
1597#pragma clang diagnostic ignored "-Wvariadic-macros"
+
1598#elif defined(JSON_HEDLEY_GCC_VERSION)
+
1599#pragma GCC diagnostic ignored "-Wvariadic-macros"
+
1600#endif
+
1601#endif
+
1602#if defined(JSON_HEDLEY_NON_NULL)
+
1603#undef JSON_HEDLEY_NON_NULL
+
1604#endif
+
1605#if \
+
1606 JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \
+
1607 JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
+
1608 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1609 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)
+
1610#define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
+
1611#else
+
1612#define JSON_HEDLEY_NON_NULL(...)
+
1613#endif
+
1614 JSON_HEDLEY_DIAGNOSTIC_POP
+
1615
+
1616#if defined(JSON_HEDLEY_PRINTF_FORMAT)
+
1617#undef JSON_HEDLEY_PRINTF_FORMAT
+
1618#endif
+
1619#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO)
+
1620#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check)))
+
1621#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO)
+
1622#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check)))
+
1623#elif \
+
1624 JSON_HEDLEY_HAS_ATTRIBUTE(format) || \
+
1625 JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
+
1626 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1627 JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \
+
1628 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+
1629 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1630 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1631 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1632 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1633 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1634 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1635 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1636 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1637 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1638 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1639 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1640 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1641#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check)))
+
1642#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0)
+
1643#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check))
+
1644#else
+
1645#define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check)
+
1646#endif
+
1647
+
1648#if defined(JSON_HEDLEY_CONSTEXPR)
+
1649#undef JSON_HEDLEY_CONSTEXPR
+
1650#endif
+
1651#if defined(__cplusplus)
+
1652#if __cplusplus >= 201103L
+
1653#define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr)
+
1654#endif
+
1655#endif
+
1656#if !defined(JSON_HEDLEY_CONSTEXPR)
+
1657#define JSON_HEDLEY_CONSTEXPR
+
1658#endif
+
1659
+
1660#if defined(JSON_HEDLEY_PREDICT)
+
1661#undef JSON_HEDLEY_PREDICT
+
1662#endif
+
1663#if defined(JSON_HEDLEY_LIKELY)
+
1664#undef JSON_HEDLEY_LIKELY
+
1665#endif
+
1666#if defined(JSON_HEDLEY_UNLIKELY)
+
1667#undef JSON_HEDLEY_UNLIKELY
+
1668#endif
+
1669#if defined(JSON_HEDLEY_UNPREDICTABLE)
+
1670#undef JSON_HEDLEY_UNPREDICTABLE
+
1671#endif
+
1672#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable)
+
1673#define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr))
+
1674#endif
+
1675#if \
+
1676 (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \
+
1677 JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \
+
1678 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1679# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability))
+
1680# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability))
+
1681# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability))
+
1682# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 )
+
1683# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 )
+
1684#elif \
+
1685 (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \
+
1686 JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \
+
1687 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1688 (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \
+
1689 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1690 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+
1691 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1692 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \
+
1693 JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \
+
1694 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \
+
1695 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
+
1696 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1697 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1698 JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \
+
1699 JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \
+
1700 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1701# define JSON_HEDLEY_PREDICT(expr, expected, probability) \
+
1702 (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)))
+
1703# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \
+
1704 (__extension__ ({ \
+
1705 double hedley_probability_ = (probability); \
+
1706 ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \
+
1707 }))
+
1708# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \
+
1709 (__extension__ ({ \
+
1710 double hedley_probability_ = (probability); \
+
1711 ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \
+
1712 }))
+
1713# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1)
+
1714# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
+
1715#else
+
1716# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))
+
1717# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr))
+
1718# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr))
+
1719# define JSON_HEDLEY_LIKELY(expr) (!!(expr))
+
1720# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr))
+
1721#endif
+
1722#if !defined(JSON_HEDLEY_UNPREDICTABLE)
+
1723#define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5)
+
1724#endif
+
1725
+
1726#if defined(JSON_HEDLEY_MALLOC)
+
1727#undef JSON_HEDLEY_MALLOC
+
1728#endif
+
1729#if \
+
1730 JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \
+
1731 JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
+
1732 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1733 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+
1734 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1735 JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \
+
1736 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1737 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1738 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1739 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1740 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1741 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1742 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1743 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1744 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1745 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1746 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1747 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1748#define JSON_HEDLEY_MALLOC __attribute__((__malloc__))
+
1749#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
+
1750#define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory")
+
1751#elif \
+
1752 JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \
+
1753 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1754#define JSON_HEDLEY_MALLOC __declspec(restrict)
+
1755#else
+
1756#define JSON_HEDLEY_MALLOC
+
1757#endif
+
1758
+
1759#if defined(JSON_HEDLEY_PURE)
+
1760#undef JSON_HEDLEY_PURE
+
1761#endif
+
1762#if \
+
1763 JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \
+
1764 JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \
+
1765 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1766 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+
1767 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1768 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+
1769 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1770 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1771 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1772 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1773 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1774 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1775 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1776 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1777 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1778 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1779 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1780 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
+
1781 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1782# define JSON_HEDLEY_PURE __attribute__((__pure__))
+
1783#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
+
1784# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data")
+
1785#elif defined(__cplusplus) && \
+
1786 ( \
+
1787 JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \
+
1788 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \
+
1789 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \
+
1790 )
+
1791# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;")
+
1792#else
+
1793# define JSON_HEDLEY_PURE
+
1794#endif
+
1795
+
1796#if defined(JSON_HEDLEY_CONST)
+
1797#undef JSON_HEDLEY_CONST
+
1798#endif
+
1799#if \
+
1800 JSON_HEDLEY_HAS_ATTRIBUTE(const) || \
+
1801 JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \
+
1802 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1803 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+
1804 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1805 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+
1806 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1807 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1808 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1809 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1810 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1811 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1812 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1813 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1814 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1815 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1816 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1817 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
+
1818 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1819#define JSON_HEDLEY_CONST __attribute__((__const__))
+
1820#elif \
+
1821 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
+
1822#define JSON_HEDLEY_CONST _Pragma("no_side_effect")
+
1823#else
+
1824#define JSON_HEDLEY_CONST JSON_HEDLEY_PURE
+
1825#endif
+
1826
+
1827#if defined(JSON_HEDLEY_RESTRICT)
+
1828#undef JSON_HEDLEY_RESTRICT
+
1829#endif
+
1830#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus)
+
1831#define JSON_HEDLEY_RESTRICT restrict
+
1832#elif \
+
1833 JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
+
1834 JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \
+
1835 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1836 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \
+
1837 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1838 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+
1839 JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
+
1840 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1841 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \
+
1842 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \
+
1843 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1844 (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \
+
1845 JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \
+
1846 defined(__clang__) || \
+
1847 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1848#define JSON_HEDLEY_RESTRICT __restrict
+
1849#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus)
+
1850#define JSON_HEDLEY_RESTRICT _Restrict
+
1851#else
+
1852#define JSON_HEDLEY_RESTRICT
+
1853#endif
+
1854
+
1855#if defined(JSON_HEDLEY_INLINE)
+
1856#undef JSON_HEDLEY_INLINE
+
1857#endif
+
1858#if \
+
1859 (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
+
1860 (defined(__cplusplus) && (__cplusplus >= 199711L))
+
1861#define JSON_HEDLEY_INLINE inline
+
1862#elif \
+
1863 defined(JSON_HEDLEY_GCC_VERSION) || \
+
1864 JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0)
+
1865#define JSON_HEDLEY_INLINE __inline__
+
1866#elif \
+
1867 JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \
+
1868 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \
+
1869 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1870 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \
+
1871 JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \
+
1872 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
+
1873 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \
+
1874 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1875 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1876 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1877#define JSON_HEDLEY_INLINE __inline
+
1878#else
+
1879#define JSON_HEDLEY_INLINE
+
1880#endif
+
1881
+
1882#if defined(JSON_HEDLEY_ALWAYS_INLINE)
+
1883#undef JSON_HEDLEY_ALWAYS_INLINE
+
1884#endif
+
1885#if \
+
1886 JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \
+
1887 JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
+
1888 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1889 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+
1890 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1891 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+
1892 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1893 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1894 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1895 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1896 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1897 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1898 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1899 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1900 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1901 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1902 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1903 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \
+
1904 JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)
+
1905# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE
+
1906#elif \
+
1907 JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \
+
1908 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1909# define JSON_HEDLEY_ALWAYS_INLINE __forceinline
+
1910#elif defined(__cplusplus) && \
+
1911 ( \
+
1912 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1913 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1914 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1915 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
+
1916 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1917 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \
+
1918 )
+
1919# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;")
+
1920#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+
1921# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced")
+
1922#else
+
1923# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE
+
1924#endif
+
1925
+
1926#if defined(JSON_HEDLEY_NEVER_INLINE)
+
1927#undef JSON_HEDLEY_NEVER_INLINE
+
1928#endif
+
1929#if \
+
1930 JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \
+
1931 JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
+
1932 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1933 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+
1934 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1935 JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+
1936 JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+
1937 (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1938 JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+
1939 (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1940 JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+
1941 (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1942 JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+
1943 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1944 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+
1945 JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+
1946 JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+
1947 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \
+
1948 JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0)
+
1949#define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__))
+
1950#elif \
+
1951 JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
+
1952 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
1953#define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)
+
1954#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0)
+
1955#define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline")
+
1956#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)
+
1957#define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;")
+
1958#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+
1959#define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never")
+
1960#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)
+
1961#define JSON_HEDLEY_NEVER_INLINE __attribute((noinline))
+
1962#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)
+
1963#define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)
+
1964#else
+
1965#define JSON_HEDLEY_NEVER_INLINE
+
1966#endif
+
1967
+
1968#if defined(JSON_HEDLEY_PRIVATE)
+
1969#undef JSON_HEDLEY_PRIVATE
+
1970#endif
+
1971#if defined(JSON_HEDLEY_PUBLIC)
+
1972#undef JSON_HEDLEY_PUBLIC
+
1973#endif
+
1974#if defined(JSON_HEDLEY_IMPORT)
+
1975#undef JSON_HEDLEY_IMPORT
+
1976#endif
+
1977#if defined(_WIN32) || defined(__CYGWIN__)
+
1978# define JSON_HEDLEY_PRIVATE
+
1979# define JSON_HEDLEY_PUBLIC __declspec(dllexport)
+
1980# define JSON_HEDLEY_IMPORT __declspec(dllimport)
+
1981#else
+
1982# if \
+
1983 JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \
+
1984 JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
+
1985 JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+
1986 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
1987 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
1988 JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
+
1989 ( \
+
1990 defined(__TI_EABI__) && \
+
1991 ( \
+
1992 (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+
1993 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \
+
1994 ) \
+
1995 ) || \
+
1996 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
1997# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden")))
+
1998# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default")))
+
1999# else
+
2000# define JSON_HEDLEY_PRIVATE
+
2001# define JSON_HEDLEY_PUBLIC
+
2002# endif
+
2003# define JSON_HEDLEY_IMPORT extern
+
2004#endif
+
2005
+
2006#if defined(JSON_HEDLEY_NO_THROW)
+
2007#undef JSON_HEDLEY_NO_THROW
+
2008#endif
+
2009#if \
+
2010 JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \
+
2011 JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
+
2012 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
2013 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
2014#define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__))
+
2015#elif \
+
2016 JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \
+
2017 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \
+
2018 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)
+
2019#define JSON_HEDLEY_NO_THROW __declspec(nothrow)
+
2020#else
+
2021#define JSON_HEDLEY_NO_THROW
+
2022#endif
+
2023
+
2024#if defined(JSON_HEDLEY_FALL_THROUGH)
+
2025#undef JSON_HEDLEY_FALL_THROUGH
+
2026#endif
+
2027#if \
+
2028 JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \
+
2029 JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \
+
2030 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
2031#define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__))
+
2032#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough)
+
2033#define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]])
+
2034#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)
+
2035#define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]])
+
2036#elif defined(__fallthrough) /* SAL */
+
2037#define JSON_HEDLEY_FALL_THROUGH __fallthrough
+
2038#else
+
2039#define JSON_HEDLEY_FALL_THROUGH
+
2040#endif
+
2041
+
2042#if defined(JSON_HEDLEY_RETURNS_NON_NULL)
+
2043#undef JSON_HEDLEY_RETURNS_NON_NULL
+
2044#endif
+
2045#if \
+
2046 JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \
+
2047 JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \
+
2048 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
2049#define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__))
+
2050#elif defined(_Ret_notnull_) /* SAL */
+
2051#define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_
+
2052#else
+
2053#define JSON_HEDLEY_RETURNS_NON_NULL
+
2054#endif
+
2055
+
2056#if defined(JSON_HEDLEY_ARRAY_PARAM)
+
2057#undef JSON_HEDLEY_ARRAY_PARAM
+
2058#endif
+
2059#if \
+
2060 defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
+
2061 !defined(__STDC_NO_VLA__) && \
+
2062 !defined(__cplusplus) && \
+
2063 !defined(JSON_HEDLEY_PGI_VERSION) && \
+
2064 !defined(JSON_HEDLEY_TINYC_VERSION)
+
2065#define JSON_HEDLEY_ARRAY_PARAM(name) (name)
+
2066#else
+
2067#define JSON_HEDLEY_ARRAY_PARAM(name)
+
2068#endif
+
2069
+
2070#if defined(JSON_HEDLEY_IS_CONSTANT)
+
2071#undef JSON_HEDLEY_IS_CONSTANT
+
2072#endif
+
2073#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR)
+
2074#undef JSON_HEDLEY_REQUIRE_CONSTEXPR
+
2075#endif
+
2076 /* JSON_HEDLEY_IS_CONSTEXPR_ is for
+
2077 HEDLEY INTERNAL USE ONLY. API subject to change without notice. */
+
2078#if defined(JSON_HEDLEY_IS_CONSTEXPR_)
+
2079#undef JSON_HEDLEY_IS_CONSTEXPR_
+
2080#endif
+
2081#if \
+
2082 JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \
+
2083 JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
+
2084 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
2085 JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \
+
2086 JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+
2087 JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
+
2088 JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
+
2089 (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \
+
2090 JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \
+
2091 JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10)
+
2092#define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr)
+
2093#endif
+
2094#if !defined(__cplusplus)
+
2095# if \
+
2096 JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \
+
2097 JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
+
2098 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
2099 JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
+
2100 JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \
+
2101 JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \
+
2102 JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24)
+
2103#if defined(__INTPTR_TYPE__)
+
2104#define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*)
+
2105#else
+
2106#include <stdint.h>
+
2107#define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*)
+
2108#endif
+
2109# elif \
+
2110 ( \
+
2111 defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \
+
2112 !defined(JSON_HEDLEY_SUNPRO_VERSION) && \
+
2113 !defined(JSON_HEDLEY_PGI_VERSION) && \
+
2114 !defined(JSON_HEDLEY_IAR_VERSION)) || \
+
2115 (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \
+
2116 JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \
+
2117 JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \
+
2118 JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \
+
2119 JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0)
+
2120#if defined(__INTPTR_TYPE__)
+
2121#define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0)
+
2122#else
+
2123#include <stdint.h>
+
2124#define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0)
+
2125#endif
+
2126# elif \
+
2127 defined(JSON_HEDLEY_GCC_VERSION) || \
+
2128 defined(JSON_HEDLEY_INTEL_VERSION) || \
+
2129 defined(JSON_HEDLEY_TINYC_VERSION) || \
+
2130 defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \
+
2131 JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \
+
2132 defined(JSON_HEDLEY_TI_CL2000_VERSION) || \
+
2133 defined(JSON_HEDLEY_TI_CL6X_VERSION) || \
+
2134 defined(JSON_HEDLEY_TI_CL7X_VERSION) || \
+
2135 defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \
+
2136 defined(__clang__)
+
2137# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \
+
2138 sizeof(void) != \
+
2139 sizeof(*( \
+
2140 1 ? \
+
2141 ((void*) ((expr) * 0L) ) : \
+
2142((struct { char v[sizeof(void) * 2]; } *) 1) \
+
2143 ) \
+
2144 ) \
+
2145 )
+
2146# endif
+
2147#endif
+
2148#if defined(JSON_HEDLEY_IS_CONSTEXPR_)
+
2149#if !defined(JSON_HEDLEY_IS_CONSTANT)
+
2150#define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr)
+
2151#endif
+
2152#define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1))
+
2153#else
+
2154#if !defined(JSON_HEDLEY_IS_CONSTANT)
+
2155#define JSON_HEDLEY_IS_CONSTANT(expr) (0)
+
2156#endif
+
2157#define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr)
+
2158#endif
+
2159
+
2160#if defined(JSON_HEDLEY_BEGIN_C_DECLS)
+
2161#undef JSON_HEDLEY_BEGIN_C_DECLS
+
2162#endif
+
2163#if defined(JSON_HEDLEY_END_C_DECLS)
+
2164#undef JSON_HEDLEY_END_C_DECLS
+
2165#endif
+
2166#if defined(JSON_HEDLEY_C_DECL)
+
2167#undef JSON_HEDLEY_C_DECL
+
2168#endif
+
2169#if defined(__cplusplus)
+
2170#define JSON_HEDLEY_BEGIN_C_DECLS extern "C" {
+
2171#define JSON_HEDLEY_END_C_DECLS }
+
2172#define JSON_HEDLEY_C_DECL extern "C"
+
2173#else
+
2174#define JSON_HEDLEY_BEGIN_C_DECLS
+
2175#define JSON_HEDLEY_END_C_DECLS
+
2176#define JSON_HEDLEY_C_DECL
+
2177#endif
+
2178
+
2179#if defined(JSON_HEDLEY_STATIC_ASSERT)
+
2180#undef JSON_HEDLEY_STATIC_ASSERT
+
2181#endif
+
2182#if \
+
2183 !defined(__cplusplus) && ( \
+
2184 (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \
+
2185 (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \
+
2186 JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \
+
2187 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+
2188 defined(_Static_assert) \
+
2189 )
+
2190# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message)
+
2191#elif \
+
2192 (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
+
2193 JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \
+
2194 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
2195# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message))
+
2196#else
+
2197# define JSON_HEDLEY_STATIC_ASSERT(expr, message)
+
2198#endif
+
2199
+
2200#if defined(JSON_HEDLEY_NULL)
+
2201#undef JSON_HEDLEY_NULL
+
2202#endif
+
2203#if defined(__cplusplus)
+
2204#if __cplusplus >= 201103L
+
2205#define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr)
+
2206#elif defined(NULL)
+
2207#define JSON_HEDLEY_NULL NULL
+
2208#else
+
2209#define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0)
+
2210#endif
+
2211#elif defined(NULL)
+
2212#define JSON_HEDLEY_NULL NULL
+
2213#else
+
2214#define JSON_HEDLEY_NULL ((void*) 0)
+
2215#endif
+
2216
+
2217#if defined(JSON_HEDLEY_MESSAGE)
+
2218#undef JSON_HEDLEY_MESSAGE
+
2219#endif
+
2220#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
+
2221# define JSON_HEDLEY_MESSAGE(msg) \
+
2222 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
2223 JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
+
2224 JSON_HEDLEY_PRAGMA(message msg) \
+
2225 JSON_HEDLEY_DIAGNOSTIC_POP
+
2226#elif \
+
2227 JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \
+
2228 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+
2229# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg)
+
2230#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0)
+
2231# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg)
+
2232#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+
2233# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))
+
2234#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0)
+
2235# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))
+
2236#else
+
2237# define JSON_HEDLEY_MESSAGE(msg)
+
2238#endif
+
2239
+
2240#if defined(JSON_HEDLEY_WARNING)
+
2241#undef JSON_HEDLEY_WARNING
+
2242#endif
+
2243#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
+
2244# define JSON_HEDLEY_WARNING(msg) \
+
2245 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
2246 JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
+
2247 JSON_HEDLEY_PRAGMA(clang warning msg) \
+
2248 JSON_HEDLEY_DIAGNOSTIC_POP
+
2249#elif \
+
2250 JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \
+
2251 JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \
+
2252 JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+
2253# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg)
+
2254#elif \
+
2255 JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \
+
2256 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
2257# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg))
+
2258#else
+
2259# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg)
+
2260#endif
+
2261
+
2262#if defined(JSON_HEDLEY_REQUIRE)
+
2263#undef JSON_HEDLEY_REQUIRE
+
2264#endif
+
2265#if defined(JSON_HEDLEY_REQUIRE_MSG)
+
2266#undef JSON_HEDLEY_REQUIRE_MSG
+
2267#endif
+
2268#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if)
+
2269# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat")
+
2270# define JSON_HEDLEY_REQUIRE(expr) \
+
2271 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
2272 _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
+
2273 __attribute__((diagnose_if(!(expr), #expr, "error"))) \
+
2274 JSON_HEDLEY_DIAGNOSTIC_POP
+
2275# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \
+
2276 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
2277 _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
+
2278 __attribute__((diagnose_if(!(expr), msg, "error"))) \
+
2279 JSON_HEDLEY_DIAGNOSTIC_POP
+
2280# else
+
2281# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error")))
+
2282# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error")))
+
2283# endif
+
2284#else
+
2285# define JSON_HEDLEY_REQUIRE(expr)
+
2286# define JSON_HEDLEY_REQUIRE_MSG(expr,msg)
+
2287#endif
+
2288
+
2289#if defined(JSON_HEDLEY_FLAGS)
+
2290#undef JSON_HEDLEY_FLAGS
+
2291#endif
+
2292#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion"))
+
2293#define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__))
+
2294#else
+
2295#define JSON_HEDLEY_FLAGS
+
2296#endif
+
2297
+
2298#if defined(JSON_HEDLEY_FLAGS_CAST)
+
2299#undef JSON_HEDLEY_FLAGS_CAST
+
2300#endif
+
2301#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0)
+
2302# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \
+
2303 JSON_HEDLEY_DIAGNOSTIC_PUSH \
+
2304 _Pragma("warning(disable:188)") \
+
2305 ((T) (expr)); \
+
2306 JSON_HEDLEY_DIAGNOSTIC_POP \
+
2307 }))
+
2308#else
+
2309# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr)
+
2310#endif
+
2311
+
2312#if defined(JSON_HEDLEY_EMPTY_BASES)
+
2313#undef JSON_HEDLEY_EMPTY_BASES
+
2314#endif
+
2315#if \
+
2316 (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \
+
2317 JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0)
+
2318#define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases)
+
2319#else
+
2320#define JSON_HEDLEY_EMPTY_BASES
+
2321#endif
+
2322
+
2323 /* Remaining macros are deprecated. */
+
2324
+
2325#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK)
+
2326#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
+
2327#endif
+
2328#if defined(__clang__)
+
2329#define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0)
+
2330#else
+
2331#define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+
2332#endif
+
2333
+
2334#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE)
+
2335#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
+
2336#endif
+
2337#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)
+
2338
+
2339#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE)
+
2340#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
+
2341#endif
+
2342#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute)
+
2343
+
2344#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN)
+
2345#undef JSON_HEDLEY_CLANG_HAS_BUILTIN
+
2346#endif
+
2347#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin)
+
2348
+
2349#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE)
+
2350#undef JSON_HEDLEY_CLANG_HAS_FEATURE
+
2351#endif
+
2352#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature)
+
2353
+
2354#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION)
+
2355#undef JSON_HEDLEY_CLANG_HAS_EXTENSION
+
2356#endif
+
2357#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension)
+
2358
+
2359#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE)
+
2360#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
+
2361#endif
+
2362#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute)
+
2363
+
2364#if defined(JSON_HEDLEY_CLANG_HAS_WARNING)
+
2365#undef JSON_HEDLEY_CLANG_HAS_WARNING
+
2366#endif
+
2367#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning)
+
2368
+
2369#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */
+
2370
+
2371
+
2372// This file contains all internal macro definitions (except those affecting ABI)
+
2373// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
+
2374
+
2375// #include <nlohmann/detail/abi_macros.hpp>
+
2376
+
2377
+
2378// exclude unsupported compilers
+
2379#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
+
2380#if defined(__clang__)
+
2381#if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
+
2382#error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
+
2383#endif
+
2384#elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
+
2385#if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
+
2386#error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
+
2387#endif
+
2388#endif
+
2389#endif
+
2390
+
2391// C++ language standard detection
+
2392// if the user manually specified the used C++ version, this is skipped
+
2393#if !defined(JSON_HAS_CPP_26) && !defined(JSON_HAS_CPP_23) && !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11)
+
2394#if (defined(__cplusplus) && __cplusplus > 202302L) || (defined(_MSVC_LANG) && _MSVC_LANG > 202302L)
+
2395#define JSON_HAS_CPP_26
+
2396#define JSON_HAS_CPP_23
+
2397#define JSON_HAS_CPP_20
+
2398#define JSON_HAS_CPP_17
+
2399#define JSON_HAS_CPP_14
+
2400#elif (defined(__cplusplus) && __cplusplus > 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG > 202002L)
+
2401#define JSON_HAS_CPP_23
+
2402#define JSON_HAS_CPP_20
+
2403#define JSON_HAS_CPP_17
+
2404#define JSON_HAS_CPP_14
+
2405#elif (defined(__cplusplus) && __cplusplus > 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG > 201703L)
+
2406#define JSON_HAS_CPP_20
+
2407#define JSON_HAS_CPP_17
+
2408#define JSON_HAS_CPP_14
+
2409#elif (defined(__cplusplus) && __cplusplus > 201402L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
+
2410#define JSON_HAS_CPP_17
+
2411#define JSON_HAS_CPP_14
+
2412#elif (defined(__cplusplus) && __cplusplus > 201103L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
+
2413#define JSON_HAS_CPP_14
+
2414#endif
+
2415// the cpp 11 flag is always specified because it is the minimal required version
+
2416#define JSON_HAS_CPP_11
+
2417#endif
+
2418
+
2419#ifdef __has_include
+
2420#if __has_include(<version>)
+
2421#include <version>
+
2422#endif
+
2423#endif
+
2424
+
2425#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM)
+
2426#ifdef JSON_HAS_CPP_17
+
2427#if defined(__cpp_lib_filesystem)
+
2428#define JSON_HAS_FILESYSTEM 1
+
2429#elif defined(__cpp_lib_experimental_filesystem)
+
2430#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
+
2431#elif !defined(__has_include)
+
2432#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
+
2433#elif __has_include(<filesystem>)
+
2434#define JSON_HAS_FILESYSTEM 1
+
2435#elif __has_include(<experimental/filesystem>)
+
2436#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1
+
2437#endif
+
2438
+
2439// std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/
+
2440#if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8
+
2441#undef JSON_HAS_FILESYSTEM
+
2442#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
2443#endif
+
2444
+
2445// no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support
+
2446#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8
+
2447#undef JSON_HAS_FILESYSTEM
+
2448#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
2449#endif
+
2450
+
2451// no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support
+
2452#if defined(__clang_major__) && __clang_major__ < 7
+
2453#undef JSON_HAS_FILESYSTEM
+
2454#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
2455#endif
+
2456
+
2457// no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support
+
2458#if defined(_MSC_VER) && _MSC_VER < 1914
+
2459#undef JSON_HAS_FILESYSTEM
+
2460#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
2461#endif
+
2462
+
2463// no filesystem support before iOS 13
+
2464#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000
+
2465#undef JSON_HAS_FILESYSTEM
+
2466#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
2467#endif
+
2468
+
2469// no filesystem support before macOS Catalina
+
2470#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500
+
2471#undef JSON_HAS_FILESYSTEM
+
2472#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
2473#endif
+
2474#endif
+
2475#endif
+
2476
+
2477#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
2478#define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0
+
2479#endif
+
2480
+
2481#ifndef JSON_HAS_FILESYSTEM
+
2482#define JSON_HAS_FILESYSTEM 0
+
2483#endif
+
2484
+
2485#ifndef JSON_HAS_THREE_WAY_COMPARISON
+
2486#if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \
+
2487 && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L
+
2488#define JSON_HAS_THREE_WAY_COMPARISON 1
+
2489#else
+
2490#define JSON_HAS_THREE_WAY_COMPARISON 0
+
2491#endif
+
2492#endif
+
2493
+
2494#ifndef JSON_HAS_RANGES
+
2495 // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has a syntax error
+
2496#if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427
+
2497#define JSON_HAS_RANGES 0
+
2498#elif defined(__cpp_lib_ranges)
+
2499#define JSON_HAS_RANGES 1
+
2500#else
+
2501#define JSON_HAS_RANGES 0
+
2502#endif
+
2503#endif
+
2504
+
2505#ifndef JSON_HAS_STATIC_RTTI
+
2506#if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0
+
2507#define JSON_HAS_STATIC_RTTI 1
+
2508#else
+
2509#define JSON_HAS_STATIC_RTTI 0
+
2510#endif
+
2511#endif
+
2512
+
2513#ifdef JSON_HAS_CPP_17
+
2514#define JSON_INLINE_VARIABLE inline
+
2515#else
+
2516#define JSON_INLINE_VARIABLE
+
2517#endif
+
2518
+
2519#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address)
+
2520#define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]]
+
2521#else
+
2522#define JSON_NO_UNIQUE_ADDRESS
+
2523#endif
+
2524
+
2525// disable documentation warnings on clang
+
2526#if defined(__clang__)
+
2527#pragma clang diagnostic push
+
2528#pragma clang diagnostic ignored "-Wdocumentation"
+
2529#pragma clang diagnostic ignored "-Wdocumentation-unknown-command"
+
2530#endif
+
2531
+
2532// allow disabling exceptions
+
2533#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
+
2534#define JSON_THROW(exception) throw exception
+
2535#define JSON_TRY try
+
2536#define JSON_CATCH(exception) catch(exception)
+
2537#define JSON_INTERNAL_CATCH(exception) catch(exception)
+
2538#else
+
2539#include <cstdlib>
+
2540#define JSON_THROW(exception) std::abort()
+
2541#define JSON_TRY if(true)
+
2542#define JSON_CATCH(exception) if(false)
+
2543#define JSON_INTERNAL_CATCH(exception) if(false)
+
2544#endif
+
2545
+
2546// override exception macros
+
2547#if defined(JSON_THROW_USER)
+
2548#undef JSON_THROW
+
2549#define JSON_THROW JSON_THROW_USER
+
2550#endif
+
2551#if defined(JSON_TRY_USER)
+
2552#undef JSON_TRY
+
2553#define JSON_TRY JSON_TRY_USER
+
2554#endif
+
2555#if defined(JSON_CATCH_USER)
+
2556#undef JSON_CATCH
+
2557#define JSON_CATCH JSON_CATCH_USER
+
2558#undef JSON_INTERNAL_CATCH
+
2559#define JSON_INTERNAL_CATCH JSON_CATCH_USER
+
2560#endif
+
2561#if defined(JSON_INTERNAL_CATCH_USER)
+
2562#undef JSON_INTERNAL_CATCH
+
2563#define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
+
2564#endif
+
2565
+
2566// allow overriding assert
+
2567#if !defined(JSON_ASSERT)
+
2568#include <cassert> // assert
+
2569#define JSON_ASSERT(x) assert(x)
+
2570#endif
+
2571
+
2572// allow accessing some private functions (needed by the test suite)
+
2573#if defined(JSON_TESTS_PRIVATE)
+
2574#define JSON_PRIVATE_UNLESS_TESTED public
+
2575#else
+
2576#define JSON_PRIVATE_UNLESS_TESTED private
+
2577#endif
+
2578
+
2584#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \
+
2585 template<typename BasicJsonType> \
+
2586 inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \
+
2587 { \
+
2588 /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \
+
2589 static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
+
2590 /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on <array> */ \
+
2591 static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
+
2592 auto it = std::find_if(std::begin(m), std::end(m), \
+
2593 [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
+
2594 { \
+
2595 return ej_pair.first == e; \
+
2596 }); \
+
2597 j = ((it != std::end(m)) ? it : std::begin(m))->second; \
+
2598 } \
+
2599 template<typename BasicJsonType> \
+
2600 inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \
+
2601 { \
+
2602 /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \
+
2603 static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
+
2604 /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on <array> */ \
+
2605 static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
+
2606 auto it = std::find_if(std::begin(m), std::end(m), \
+
2607 [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
+
2608 { \
+
2609 return ej_pair.second == j; \
+
2610 }); \
+
2611 e = ((it != std::end(m)) ? it : std::begin(m))->first; \
+
2612 }
+
2613
+
2614// Ugly macros to avoid uglier copy-paste when specializing basic_json. They
+
2615// may be removed in the future once the class is split.
+
2616
+
2617#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \
+
2618 template<template<typename, typename, typename...> class ObjectType, \
+
2619 template<typename, typename...> class ArrayType, \
+
2620 class StringType, class BooleanType, class NumberIntegerType, \
+
2621 class NumberUnsignedType, class NumberFloatType, \
+
2622 template<typename> class AllocatorType, \
+
2623 template<typename, typename = void> class JSONSerializer, \
+
2624 class BinaryType, \
+
2625 class CustomBaseClass>
+
2626
+
2627#define NLOHMANN_BASIC_JSON_TPL \
+
2628 basic_json<ObjectType, ArrayType, StringType, BooleanType, \
+
2629 NumberIntegerType, NumberUnsignedType, NumberFloatType, \
+
2630 AllocatorType, JSONSerializer, BinaryType, CustomBaseClass>
+
2631
+
2632// Macros to simplify conversion from/to types
+
2633
+
2634#define NLOHMANN_JSON_EXPAND( x ) x
+
2635#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME
+
2636#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \
+
2637 NLOHMANN_JSON_PASTE64, \
+
2638 NLOHMANN_JSON_PASTE63, \
+
2639 NLOHMANN_JSON_PASTE62, \
+
2640 NLOHMANN_JSON_PASTE61, \
+
2641 NLOHMANN_JSON_PASTE60, \
+
2642 NLOHMANN_JSON_PASTE59, \
+
2643 NLOHMANN_JSON_PASTE58, \
+
2644 NLOHMANN_JSON_PASTE57, \
+
2645 NLOHMANN_JSON_PASTE56, \
+
2646 NLOHMANN_JSON_PASTE55, \
+
2647 NLOHMANN_JSON_PASTE54, \
+
2648 NLOHMANN_JSON_PASTE53, \
+
2649 NLOHMANN_JSON_PASTE52, \
+
2650 NLOHMANN_JSON_PASTE51, \
+
2651 NLOHMANN_JSON_PASTE50, \
+
2652 NLOHMANN_JSON_PASTE49, \
+
2653 NLOHMANN_JSON_PASTE48, \
+
2654 NLOHMANN_JSON_PASTE47, \
+
2655 NLOHMANN_JSON_PASTE46, \
+
2656 NLOHMANN_JSON_PASTE45, \
+
2657 NLOHMANN_JSON_PASTE44, \
+
2658 NLOHMANN_JSON_PASTE43, \
+
2659 NLOHMANN_JSON_PASTE42, \
+
2660 NLOHMANN_JSON_PASTE41, \
+
2661 NLOHMANN_JSON_PASTE40, \
+
2662 NLOHMANN_JSON_PASTE39, \
+
2663 NLOHMANN_JSON_PASTE38, \
+
2664 NLOHMANN_JSON_PASTE37, \
+
2665 NLOHMANN_JSON_PASTE36, \
+
2666 NLOHMANN_JSON_PASTE35, \
+
2667 NLOHMANN_JSON_PASTE34, \
+
2668 NLOHMANN_JSON_PASTE33, \
+
2669 NLOHMANN_JSON_PASTE32, \
+
2670 NLOHMANN_JSON_PASTE31, \
+
2671 NLOHMANN_JSON_PASTE30, \
+
2672 NLOHMANN_JSON_PASTE29, \
+
2673 NLOHMANN_JSON_PASTE28, \
+
2674 NLOHMANN_JSON_PASTE27, \
+
2675 NLOHMANN_JSON_PASTE26, \
+
2676 NLOHMANN_JSON_PASTE25, \
+
2677 NLOHMANN_JSON_PASTE24, \
+
2678 NLOHMANN_JSON_PASTE23, \
+
2679 NLOHMANN_JSON_PASTE22, \
+
2680 NLOHMANN_JSON_PASTE21, \
+
2681 NLOHMANN_JSON_PASTE20, \
+
2682 NLOHMANN_JSON_PASTE19, \
+
2683 NLOHMANN_JSON_PASTE18, \
+
2684 NLOHMANN_JSON_PASTE17, \
+
2685 NLOHMANN_JSON_PASTE16, \
+
2686 NLOHMANN_JSON_PASTE15, \
+
2687 NLOHMANN_JSON_PASTE14, \
+
2688 NLOHMANN_JSON_PASTE13, \
+
2689 NLOHMANN_JSON_PASTE12, \
+
2690 NLOHMANN_JSON_PASTE11, \
+
2691 NLOHMANN_JSON_PASTE10, \
+
2692 NLOHMANN_JSON_PASTE9, \
+
2693 NLOHMANN_JSON_PASTE8, \
+
2694 NLOHMANN_JSON_PASTE7, \
+
2695 NLOHMANN_JSON_PASTE6, \
+
2696 NLOHMANN_JSON_PASTE5, \
+
2697 NLOHMANN_JSON_PASTE4, \
+
2698 NLOHMANN_JSON_PASTE3, \
+
2699 NLOHMANN_JSON_PASTE2, \
+
2700 NLOHMANN_JSON_PASTE1)(__VA_ARGS__))
+
2701#define NLOHMANN_JSON_PASTE2(func, v1) func(v1)
+
2702#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2)
+
2703#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3)
+
2704#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4)
+
2705#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5)
+
2706#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6)
+
2707#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7)
+
2708#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8)
+
2709#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9)
+
2710#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10)
+
2711#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)
+
2712#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12)
+
2713#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13)
+
2714#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14)
+
2715#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15)
+
2716#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16)
+
2717#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17)
+
2718#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18)
+
2719#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19)
+
2720#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20)
+
2721#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21)
+
2722#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22)
+
2723#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23)
+
2724#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24)
+
2725#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25)
+
2726#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26)
+
2727#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27)
+
2728#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28)
+
2729#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29)
+
2730#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30)
+
2731#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31)
+
2732#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32)
+
2733#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33)
+
2734#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34)
+
2735#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)
+
2736#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36)
+
2737#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37)
+
2738#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38)
+
2739#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39)
+
2740#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40)
+
2741#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41)
+
2742#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42)
+
2743#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43)
+
2744#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44)
+
2745#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45)
+
2746#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46)
+
2747#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47)
+
2748#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48)
+
2749#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49)
+
2750#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50)
+
2751#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51)
+
2752#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52)
+
2753#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53)
+
2754#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54)
+
2755#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55)
+
2756#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56)
+
2757#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57)
+
2758#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58)
+
2759#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59)
+
2760#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60)
+
2761#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61)
+
2762#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62)
+
2763#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63)
+
2764
+
2765#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1;
+
2766#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1);
+
2767#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = !nlohmann_json_j.is_null() ? nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1) : nlohmann_json_default_obj.v1;
+
2768
+
2775#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \
+
2776 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2777 friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
+
2778 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2779 friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
+
2780
+
2787#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \
+
2788 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2789 friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
+
2790 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2791 friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
+
2792
+
2799#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \
+
2800 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2801 friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
+
2802
+
2809#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \
+
2810 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2811 void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
+
2812 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2813 void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
+
2814
+
2821#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \
+
2822 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2823 void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
+
2824 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2825 void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
+
2826
+
2833#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \
+
2834 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2835 void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
+
2836
+
2843#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(Type, BaseType, ...) \
+
2844 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2845 friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
+
2846 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2847 friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
+
2848
+
2855#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \
+
2856 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2857 friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType&>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
+
2858 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2859 friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
+
2860
+
2867#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \
+
2868 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2869 friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
+
2870
+
2877#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(Type, BaseType, ...) \
+
2878 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2879 void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
+
2880 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2881 void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) }
+
2882
+
2889#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \
+
2890 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2891 void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \
+
2892 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2893 void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast<BaseType&>(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) }
+
2894
+
2901#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \
+
2902 template<typename BasicJsonType, nlohmann::detail::enable_if_t<nlohmann::detail::is_basic_json<BasicJsonType>::value, int> = 0> \
+
2903 void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast<const BaseType &>(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) }
+
2904
+
2905// inspired from https://stackoverflow.com/a/26745591
+
2906// allows calling any std function as if (e.g., with begin):
+
2907// using std::begin; begin(x);
+
2908//
+
2909// it allows using the detected idiom to retrieve the return type
+
2910// of such an expression
+
2911#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \
+
2912 namespace detail { \
+
2913 using std::std_name; \
+
2914 \
+
2915 template<typename... T> \
+
2916 using result_of_##std_name = decltype(std_name(std::declval<T>()...)); \
+
2917 } \
+
2918 \
+
2919 namespace detail2 { \
+
2920 struct std_name##_tag \
+
2921 { \
+
2922 }; \
+
2923 \
+
2924 template<typename... T> \
+
2925 std_name##_tag std_name(T&&...); \
+
2926 \
+
2927 template<typename... T> \
+
2928 using result_of_##std_name = decltype(std_name(std::declval<T>()...)); \
+
2929 \
+
2930 template<typename... T> \
+
2931 struct would_call_std_##std_name \
+
2932 { \
+
2933 static constexpr auto const value = ::nlohmann::detail:: \
+
2934 is_detected_exact<std_name##_tag, result_of_##std_name, T...>::value; \
+
2935 }; \
+
2936 } /* namespace detail2 */ \
+
2937 \
+
2938 template<typename... T> \
+
2939 struct would_call_std_##std_name : detail2::would_call_std_##std_name<T...> \
+
2940 { \
+
2941 }
+
2942
+
2943#ifndef JSON_USE_IMPLICIT_CONVERSIONS
+
2944#define JSON_USE_IMPLICIT_CONVERSIONS 1
+
2945#endif
+
2946
+
2947#if JSON_USE_IMPLICIT_CONVERSIONS
+
2948#define JSON_EXPLICIT
+
2949#else
+
2950#define JSON_EXPLICIT explicit
+
2951#endif
+
2952
+
2953#ifndef JSON_DISABLE_ENUM_SERIALIZATION
+
2954#define JSON_DISABLE_ENUM_SERIALIZATION 0
+
2955#endif
+
2956
+
2957#ifndef JSON_USE_GLOBAL_UDLS
+
2958#define JSON_USE_GLOBAL_UDLS 1
+
2959#endif
+
2960
+
2961#if JSON_HAS_THREE_WAY_COMPARISON
+
2962#include <compare> // partial_ordering
+
2963#endif
+
2964
+
2965NLOHMANN_JSON_NAMESPACE_BEGIN
+
2966namespace detail {
+
2967
+
2969 // JSON type enumeration //
+
2971
+ +
3008
+
3022#if JSON_HAS_THREE_WAY_COMPARISON
+
3023 inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD*
+
3024#else
+
+
3025 inline bool operator<(const value_t lhs, const value_t rhs) noexcept
+
3026#endif
+
3027 {
+
3028 static constexpr std::array<std::uint8_t, 9> order = { {
+
3029 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */,
+
3030 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */,
+
3031 6 /* binary */
+
3032 }
+
3033 };
+
3034
+
3035 const auto l_index = static_cast<std::size_t>(lhs);
+
3036 const auto r_index = static_cast<std::size_t>(rhs);
+
3037#if JSON_HAS_THREE_WAY_COMPARISON
+
3038 if (l_index < order.size() && r_index < order.size()) {
+
3039 return order[l_index] <=> order[r_index]; // *NOPAD*
+
3040 }
+
3041 return std::partial_ordering::unordered;
+
3042#else
+
3043 return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index];
+
3044#endif
+
3045 }
+
+
3046
+
3047 // GCC selects the built-in operator< over an operator rewritten from
+
3048 // a user-defined spaceship operator
+
3049 // Clang, MSVC, and ICC select the rewritten candidate
+
3050 // (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200)
+
3051#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__)
+
3052 inline bool operator<(const value_t lhs, const value_t rhs) noexcept {
+
3053 return std::is_lt(lhs <=> rhs); // *NOPAD*
+
3054 }
+
3055#endif
+
3056
+
3057} // namespace detail
+
3058NLOHMANN_JSON_NAMESPACE_END
+
3059
+
3060// #include <nlohmann/detail/string_escape.hpp>
+
3061// __ _____ _____ _____
+
3062// __| | __| | | | JSON for Modern C++
+
3063// | | |__ | | | | | | version 3.12.0
+
3064// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
3065//
+
3066// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
3067// SPDX-License-Identifier: MIT
+
3068
+
3069
+
3070
+
3071// #include <nlohmann/detail/abi_macros.hpp>
+
3072
+
3073
+
3074NLOHMANN_JSON_NAMESPACE_BEGIN
+
3075namespace detail {
+
3076
+
3090 template<typename StringType>
+
+
3091 inline void replace_substring(StringType& s, const StringType& f,
+
3092 const StringType& t) {
+
3093 JSON_ASSERT(!f.empty());
+
3094 for (auto pos = s.find(f); // find the first occurrence of f
+
3095 pos != StringType::npos; // make sure f was found
+
3096 s.replace(pos, f.size(), t), // replace with t, and
+
3097 pos = s.find(f, pos + t.size())) // find the next occurrence of f
+
3098 {
+
3099 }
+
3100 }
+
+
3101
+
3109 template<typename StringType>
+
+
3110 inline StringType escape(StringType s) {
+
3111 replace_substring(s, StringType{ "~" }, StringType{ "~0" });
+
3112 replace_substring(s, StringType{ "/" }, StringType{ "~1" });
+
3113 return s;
+
3114 }
+
+
3115
+
3123 template<typename StringType>
+
+
3124 inline void unescape(StringType& s) {
+
3125 replace_substring(s, StringType{ "~1" }, StringType{ "/" });
+
3126 replace_substring(s, StringType{ "~0" }, StringType{ "~" });
+
3127 }
+
+
3128
+
3129} // namespace detail
+
3130NLOHMANN_JSON_NAMESPACE_END
+
3131
+
3132// #include <nlohmann/detail/input/position_t.hpp>
+
3133// __ _____ _____ _____
+
3134// __| | __| | | | JSON for Modern C++
+
3135// | | |__ | | | | | | version 3.12.0
+
3136// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
3137//
+
3138// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
3139// SPDX-License-Identifier: MIT
+
3140
+
3141
+
3142
+
3143#include <cstddef> // size_t
+
3144
+
3145// #include <nlohmann/detail/abi_macros.hpp>
+
3146
+
3147
+
3148NLOHMANN_JSON_NAMESPACE_BEGIN
+
3149namespace detail {
+
3150
+
+
3152 struct position_t {
+
3154 std::size_t chars_read_total = 0;
+ +
3158 std::size_t lines_read = 0;
+
3159
+
+
3161 constexpr operator size_t() const {
+
3162 return chars_read_total;
+
3163 }
+
+
3164 };
+
+
3165
+
3166} // namespace detail
+
3167NLOHMANN_JSON_NAMESPACE_END
+
3168
+
3169// #include <nlohmann/detail/macro_scope.hpp>
+
3170
+
3171// #include <nlohmann/detail/meta/cpp_future.hpp>
+
3172// __ _____ _____ _____
+
3173// __| | __| | | | JSON for Modern C++
+
3174// | | |__ | | | | | | version 3.12.0
+
3175// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
3176//
+
3177// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
3178// SPDX-FileCopyrightText: 2018 The Abseil Authors
+
3179// SPDX-License-Identifier: MIT
+
3180
+
3181
+
3182
+
3183#include <array> // array
+
3184#include <cstddef> // size_t
+
3185#include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type
+
3186#include <utility> // index_sequence, make_index_sequence, index_sequence_for
+
3187
+
3188// #include <nlohmann/detail/macro_scope.hpp>
+
3189
+
3190
+
3191NLOHMANN_JSON_NAMESPACE_BEGIN
+
3192namespace detail {
+
3193
+
3194 template<typename T>
+
3195 using uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
+
3196
+
3197#ifdef JSON_HAS_CPP_14
+
3198
+
3199 // the following utilities are natively available in C++14
+
3200 using std::enable_if_t;
+
3201 using std::index_sequence;
+
3202 using std::make_index_sequence;
+
3203 using std::index_sequence_for;
+
3204
+
3205#else
+
3206
+
3207 // alias templates to reduce boilerplate
+
3208 template<bool B, typename T = void>
+
3209 using enable_if_t = typename std::enable_if<B, T>::type;
+
3210
+
3211 // The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h
+
3212 // which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0.
+
3213
+
3215
+
3216 // integer_sequence
+
3217 //
+
3218 // Class template representing a compile-time integer sequence. An instantiation
+
3219 // of `integer_sequence<T, Ints...>` has a sequence of integers encoded in its
+
3220 // type through its template arguments (which is a common need when
+
3221 // working with C++11 variadic templates). `absl::integer_sequence` is designed
+
3222 // to be a drop-in replacement for C++14's `std::integer_sequence`.
+
3223 //
+
3224 // Example:
+
3225 //
+
3226 // template< class T, T... Ints >
+
3227 // void user_function(integer_sequence<T, Ints...>);
+
3228 //
+
3229 // int main()
+
3230 // {
+
3231 // // user_function's `T` will be deduced to `int` and `Ints...`
+
3232 // // will be deduced to `0, 1, 2, 3, 4`.
+
3233 // user_function(make_integer_sequence<int, 5>());
+
3234 // }
+
3235 template <typename T, T... Ints>
+
+ +
3237 using value_type = T;
+
3238 static constexpr std::size_t size() noexcept {
+
3239 return sizeof...(Ints);
+
3240 }
+
3241 };
+
+
3242
+
3243 // index_sequence
+
3244 //
+
3245 // A helper template for an `integer_sequence` of `size_t`,
+
3246 // `absl::index_sequence` is designed to be a drop-in replacement for C++14's
+
3247 // `std::index_sequence`.
+
3248 template <size_t... Ints>
+
3249 using index_sequence = integer_sequence<size_t, Ints...>;
+
3250
+
3251 namespace utility_internal {
+
3252
+
3253 template <typename Seq, size_t SeqSize, size_t Rem>
+
3254 struct Extend;
+
3255
+
3256 // Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency.
+
3257 template <typename T, T... Ints, size_t SeqSize>
+
+
3258 struct Extend<integer_sequence<T, Ints...>, SeqSize, 0> {
+
3259 using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >;
+
3260 };
+
+
3261
+
3262 template <typename T, T... Ints, size_t SeqSize>
+
+
3263 struct Extend<integer_sequence<T, Ints...>, SeqSize, 1> {
+
3264 using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >;
+
3265 };
+
+
3266
+
3267 // Recursion helper for 'make_integer_sequence<T, N>'.
+
3268 // 'Gen<T, N>::type' is an alias for 'integer_sequence<T, 0, 1, ... N-1>'.
+
3269 template <typename T, size_t N>
+
+
3270 struct Gen {
+
3271 using type =
+
3272 typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type;
+
3273 };
+
+
3274
+
3275 template <typename T>
+
+
3276 struct Gen<T, 0> {
+
3277 using type = integer_sequence<T>;
+
3278 };
+
+
3279
+
3280 } // namespace utility_internal
+
3281
+
3282 // Compile-time sequences of integers
+
3283
+
3284 // make_integer_sequence
+
3285 //
+
3286 // This template alias is equivalent to
+
3287 // `integer_sequence<int, 0, 1, ..., N-1>`, and is designed to be a drop-in
+
3288 // replacement for C++14's `std::make_integer_sequence`.
+
3289 template <typename T, T N>
+
3290 using make_integer_sequence = typename utility_internal::Gen<T, N>::type;
+
3291
+
3292 // make_index_sequence
+
3293 //
+
3294 // This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`,
+
3295 // and is designed to be a drop-in replacement for C++14's
+
3296 // `std::make_index_sequence`.
+
3297 template <size_t N>
+
3298 using make_index_sequence = make_integer_sequence<size_t, N>;
+
3299
+
3300 // index_sequence_for
+
3301 //
+
3302 // Converts a typename pack into an index sequence of the same length, and
+
3303 // is designed to be a drop-in replacement for C++14's
+
3304 // `std::index_sequence_for()`
+
3305 template <typename... Ts>
+
3306 using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
+
3307
+
3309
+
3310#endif
+
3311
+
3312// dispatch utility (taken from ranges-v3)
+
3313 template<unsigned N> struct priority_tag : priority_tag < N - 1 > {};
+
3314 template<> struct priority_tag<0> {};
+
3315
+
3316 // taken from ranges-v3
+
3317 template<typename T>
+
+ +
3319 static JSON_INLINE_VARIABLE constexpr T value{};
+
3320 };
+
+
3321
+
3322#ifndef JSON_HAS_CPP_17
+
3323 template<typename T>
+
3324 constexpr T static_const<T>::value;
+
3325#endif
+
3326
+
3327 template<typename T, typename... Args>
+
3328 constexpr std::array<T, sizeof...(Args)> make_array(Args&& ... args) {
+
3329 return std::array<T, sizeof...(Args)> {{static_cast<T>(std::forward<Args>(args))...}};
+
3330 }
+
3331
+
3332} // namespace detail
+
3333NLOHMANN_JSON_NAMESPACE_END
+
3334
+
3335// #include <nlohmann/detail/meta/type_traits.hpp>
+
3336// __ _____ _____ _____
+
3337// __| | __| | | | JSON for Modern C++
+
3338// | | |__ | | | | | | version 3.12.0
+
3339// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
3340//
+
3341// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
3342// SPDX-License-Identifier: MIT
+
3343
+
3344
+
3345
+
3346#include <limits> // numeric_limits
+
3347#include <string> // char_traits
+
3348#include <tuple> // tuple
+
3349#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type
+
3350#include <utility> // declval
+
3351#if defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603L
+
3352#include <cstddef> // byte
+
3353#endif
+
3354// #include <nlohmann/detail/iterators/iterator_traits.hpp>
+
3355// __ _____ _____ _____
+
3356// __| | __| | | | JSON for Modern C++
+
3357// | | |__ | | | | | | version 3.12.0
+
3358// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
3359//
+
3360// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
3361// SPDX-License-Identifier: MIT
+
3362
+
3363
+
3364
+
3365#include <iterator> // random_access_iterator_tag
+
3366
+
3367// #include <nlohmann/detail/abi_macros.hpp>
+
3368
+
3369// #include <nlohmann/detail/meta/void_t.hpp>
+
3370
+
3371// #include <nlohmann/detail/meta/cpp_future.hpp>
+
3372
+
3373
+
3374NLOHMANN_JSON_NAMESPACE_BEGIN
+
3375namespace detail {
+
3376
+
3377 template<typename It, typename = void>
+ +
3379
+
3380 template<typename It>
+
+ +
3382 It,
+
3383 void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
+
3384 typename It::reference, typename It::iterator_category >>
+
3385 {
+
3386 using difference_type = typename It::difference_type;
+
3387 using value_type = typename It::value_type;
+
3388 using pointer = typename It::pointer;
+
3389 using reference = typename It::reference;
+
3390 using iterator_category = typename It::iterator_category;
+
3391 };
+
+
3392
+
3393 // This is required as some compilers implement std::iterator_traits in a way that
+
3394 // doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341.
+
3395 template<typename T, typename = void>
+ +
3397
+
3398 template<typename T>
+
+
3399 struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
+
3400 : iterator_types<T> {};
+
+
3401
+
3402 template<typename T>
+
+
3403 struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>> {
+
3404 using iterator_category = std::random_access_iterator_tag;
+
3405 using value_type = T;
+
3406 using difference_type = ptrdiff_t;
+
3407 using pointer = T*;
+
3408 using reference = T&;
+
3409 };
+
+
3410
+
3411} // namespace detail
+
3412NLOHMANN_JSON_NAMESPACE_END
+
3413
+
3414// #include <nlohmann/detail/macro_scope.hpp>
+
3415
+
3416// #include <nlohmann/detail/meta/call_std/begin.hpp>
+
3417// __ _____ _____ _____
+
3418// __| | __| | | | JSON for Modern C++
+
3419// | | |__ | | | | | | version 3.12.0
+
3420// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
3421//
+
3422// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
3423// SPDX-License-Identifier: MIT
+
3424
+
3425
+
3426
+
3427// #include <nlohmann/detail/macro_scope.hpp>
+
3428
+
3429
+
3430NLOHMANN_JSON_NAMESPACE_BEGIN
+
3431
+
3432NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin);
+
3433
+
3434NLOHMANN_JSON_NAMESPACE_END
+
3435
+
3436// #include <nlohmann/detail/meta/call_std/end.hpp>
+
3437// __ _____ _____ _____
+
3438// __| | __| | | | JSON for Modern C++
+
3439// | | |__ | | | | | | version 3.12.0
+
3440// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
3441//
+
3442// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
3443// SPDX-License-Identifier: MIT
+
3444
+
3445
+
3446
+
3447// #include <nlohmann/detail/macro_scope.hpp>
+
3448
+
3449
+
3450NLOHMANN_JSON_NAMESPACE_BEGIN
+
3451
+
3452NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end);
+
3453
+
3454NLOHMANN_JSON_NAMESPACE_END
+
3455
+
3456// #include <nlohmann/detail/meta/cpp_future.hpp>
+
3457
+
3458// #include <nlohmann/detail/meta/detected.hpp>
+
3459
+
3460// #include <nlohmann/json_fwd.hpp>
+
3461// __ _____ _____ _____
+
3462// __| | __| | | | JSON for Modern C++
+
3463// | | |__ | | | | | | version 3.12.0
+
3464// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
3465//
+
3466// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
3467// SPDX-License-Identifier: MIT
+
3468
+
3469#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_
+
3470#define INCLUDE_NLOHMANN_JSON_FWD_HPP_
+
3471
+
3472#include <cstdint> // int64_t, uint64_t
+
3473#include <map> // map
+
3474#include <memory> // allocator
+
3475#include <string> // string
+
3476#include <vector> // vector
+
3477
+
3478// #include <nlohmann/detail/abi_macros.hpp>
+
3479
+
3480
+
3486NLOHMANN_JSON_NAMESPACE_BEGIN
+
3487
+
3495template<typename T = void, typename SFINAE = void>
+
3496struct adl_serializer;
+
3497
+
3500template<template<typename U, typename V, typename... Args> class ObjectType =
+
3501 std::map,
+
3502 template<typename U, typename... Args> class ArrayType = std::vector,
+
3503 class StringType = std::string, class BooleanType = bool,
+
3504 class NumberIntegerType = std::int64_t,
+
3505 class NumberUnsignedType = std::uint64_t,
+
3506 class NumberFloatType = double,
+
3507 template<typename U> class AllocatorType = std::allocator,
+
3508 template<typename T, typename SFINAE = void> class JSONSerializer =
+ +
3510 class BinaryType = std::vector<std::uint8_t>, // cppcheck-suppress syntaxError
+
3511 class CustomBaseClass = void>
+
3512class basic_json;
+
3513
+
3516template<typename RefStringType>
+ +
3518
+
3523using json = basic_json<>;
+
3524
+
3527template<class Key, class T, class IgnoredLess, class Allocator>
+ +
3529
+
3532using ordered_json = basic_json<nlohmann::ordered_map>;
+
3533
+
3534NLOHMANN_JSON_NAMESPACE_END
+
3535
+
3536#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_
+
3537
+
3538
+
3539NLOHMANN_JSON_NAMESPACE_BEGIN
+
3548namespace detail {
+
3549
+
3551 // helpers //
+
3553
+
3554 // Note to maintainers:
+
3555 //
+
3556 // Every trait in this file expects a non-CV-qualified type.
+
3557 // The only exceptions are in the 'aliases for detected' section
+
3558 // (i.e., those of the form: decltype(T::member_function(std::declval<T>())))
+
3559 //
+
3560 // In this case, T has to be properly CV-qualified to constraint the function arguments
+
3561 // (e.g., to_json(BasicJsonType&, const T&))
+
3562
+
3563 template<typename> struct is_basic_json : std::false_type {};
+
3564
+
3565 NLOHMANN_BASIC_JSON_TPL_DECLARATION
+
3566 struct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {};
+
3567
+
3568 // used by exceptions create() member functions
+
3569 // true_type for the pointer to possibly cv-qualified basic_json or std::nullptr_t
+
3570 // false_type otherwise
+
3571 template<typename BasicJsonContext>
+
+ +
3573 std::integral_constant < bool,
+
3574 is_basic_json<typename std::remove_cv<typename std::remove_pointer<BasicJsonContext>::type>::type>::value
+
3575 || std::is_same<BasicJsonContext, std::nullptr_t>::value > {};
+
+
3576
+
3578 // json_ref helpers //
+
3580
+
3581 template<typename>
+
3582 class json_ref;
+
3583
+
3584 template<typename>
+
3585 struct is_json_ref : std::false_type {};
+
3586
+
3587 template<typename T>
+
3588 struct is_json_ref<json_ref<T>> : std::true_type {};
+
3589
+
3591 // aliases for detected //
+
3593
+
3594 template<typename T>
+
3595 using mapped_type_t = typename T::mapped_type;
+
3596
+
3597 template<typename T>
+
3598 using key_type_t = typename T::key_type;
+
3599
+
3600 template<typename T>
+
3601 using value_type_t = typename T::value_type;
+
3602
+
3603 template<typename T>
+
3604 using difference_type_t = typename T::difference_type;
+
3605
+
3606 template<typename T>
+
3607 using pointer_t = typename T::pointer;
+
3608
+
3609 template<typename T>
+
3610 using reference_t = typename T::reference;
+
3611
+
3612 template<typename T>
+
3613 using iterator_category_t = typename T::iterator_category;
+
3614
+
3615 template<typename T, typename... Args>
+
3616 using to_json_function = decltype(T::to_json(std::declval<Args>()...));
+
3617
+
3618 template<typename T, typename... Args>
+
3619 using from_json_function = decltype(T::from_json(std::declval<Args>()...));
+
3620
+
3621 template<typename T, typename U>
+
3622 using get_template_function = decltype(std::declval<T>().template get<U>());
+
3623
+
3624 // trait checking if JSONSerializer<T>::from_json(json const&, udt&) exists
+
3625 template<typename BasicJsonType, typename T, typename = void>
+
3626 struct has_from_json : std::false_type {};
+
3627
+
3628 // trait checking if j.get<T> is valid
+
3629 // use this trait instead of std::is_constructible or std::is_convertible,
+
3630 // both rely on, or make use of implicit conversions, and thus fail when T
+
3631 // has several constructors/operator= (see https://github.com/nlohmann/json/issues/958)
+
3632 template <typename BasicJsonType, typename T>
+
+
3633 struct is_getable {
+
3634 static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value;
+
3635 };
+
+
3636
+
3637 template<typename BasicJsonType, typename T>
+
+
3638 struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> {
+
3639 using serializer = typename BasicJsonType::template json_serializer<T, void>;
+
3640
+
3641 static constexpr bool value =
+
3642 is_detected_exact<void, from_json_function, serializer,
+
3643 const BasicJsonType&, T&>::value;
+
3644 };
+
+
3645
+
3646 // This trait checks if JSONSerializer<T>::from_json(json const&) exists
+
3647 // this overload is used for non-default-constructible user-defined-types
+
3648 template<typename BasicJsonType, typename T, typename = void>
+
3649 struct has_non_default_from_json : std::false_type {};
+
3650
+
3651 template<typename BasicJsonType, typename T>
+
+
3652 struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> {
+
3653 using serializer = typename BasicJsonType::template json_serializer<T, void>;
+
3654
+
3655 static constexpr bool value =
+
3656 is_detected_exact<T, from_json_function, serializer,
+
3657 const BasicJsonType&>::value;
+
3658 };
+
+
3659
+
3660 // This trait checks if BasicJsonType::json_serializer<T>::to_json exists
+
3661 // Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion.
+
3662 template<typename BasicJsonType, typename T, typename = void>
+
3663 struct has_to_json : std::false_type {};
+
3664
+
3665 template<typename BasicJsonType, typename T>
+
+
3666 struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json<T>::value >> {
+
3667 using serializer = typename BasicJsonType::template json_serializer<T, void>;
+
3668
+
3669 static constexpr bool value =
+
3670 is_detected_exact<void, to_json_function, serializer, BasicJsonType&,
+
3671 T>::value;
+
3672 };
+
+
3673
+
3674 template<typename T>
+
3675 using detect_key_compare = typename T::key_compare;
+
3676
+
3677 template<typename T>
+
3678 struct has_key_compare : std::integral_constant<bool, is_detected<detect_key_compare, T>::value> {};
+
3679
+
3680 // obtains the actual object key comparator
+
3681 template<typename BasicJsonType>
+
+ +
3683 using object_t = typename BasicJsonType::object_t;
+
3684 using object_comparator_t = typename BasicJsonType::default_object_comparator_t;
+
3685 using type = typename std::conditional < has_key_compare<object_t>::value,
+
3686 typename object_t::key_compare, object_comparator_t>::type;
+
3687 };
+
+
3688
+
3689 template<typename BasicJsonType>
+
3690 using actual_object_comparator_t = typename actual_object_comparator<BasicJsonType>::type;
+
3691
+
3693 // char_traits //
+
3695
+
3696 // Primary template of char_traits calls std char_traits
+
3697 template<typename T>
+
3698 struct char_traits : std::char_traits<T> {};
+
3699
+
3700 // Explicitly define char traits for unsigned char since it is not standard
+
3701 template<>
+
+
3702 struct char_traits<unsigned char> : std::char_traits<char> {
+
3703 using char_type = unsigned char;
+
3704 using int_type = uint64_t;
+
3705
+
3706 // Redefine to_int_type function
+
3707 static int_type to_int_type(char_type c) noexcept {
+
3708 return static_cast<int_type>(c);
+
3709 }
+
3710
+
3711 static char_type to_char_type(int_type i) noexcept {
+
3712 return static_cast<char_type>(i);
+
3713 }
+
3714
+
3715 static constexpr int_type eof() noexcept {
+
3716 return static_cast<int_type>(std::char_traits<char>::eof());
+
3717 }
+
3718 };
+
+
3719
+
3720 // Explicitly define char traits for signed char since it is not standard
+
3721 template<>
+
+
3722 struct char_traits<signed char> : std::char_traits<char> {
+
3723 using char_type = signed char;
+
3724 using int_type = uint64_t;
+
3725
+
3726 // Redefine to_int_type function
+
3727 static int_type to_int_type(char_type c) noexcept {
+
3728 return static_cast<int_type>(c);
+
3729 }
+
3730
+
3731 static char_type to_char_type(int_type i) noexcept {
+
3732 return static_cast<char_type>(i);
+
3733 }
+
3734
+
3735 static constexpr int_type eof() noexcept {
+
3736 return static_cast<int_type>(std::char_traits<char>::eof());
+
3737 }
+
3738 };
+
+
3739
+
3740#if defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603L
+
3741 template<>
+
3742 struct char_traits<std::byte> : std::char_traits<char> {
+
3743 using char_type = std::byte;
+
3744 using int_type = uint64_t;
+
3745
+
3746 static int_type to_int_type(char_type c) noexcept {
+
3747 return static_cast<int_type>(std::to_integer<unsigned char>(c));
+
3748 }
+
3749
+
3750 static char_type to_char_type(int_type i) noexcept {
+
3751 return std::byte(static_cast<unsigned char>(i));
+
3752 }
+
3753
+
3754 static constexpr int_type eof() noexcept {
+
3755 return static_cast<int_type>(std::char_traits<char>::eof());
+
3756 }
+
3757 };
+
3758#endif
+
3759
+
3761 // is_ functions //
+
3763
+
3764 // https://en.cppreference.com/w/cpp/types/conjunction
+
3765 template<class...> struct conjunction : std::true_type {};
+
3766 template<class B> struct conjunction<B> : B {};
+
3767 template<class B, class... Bn>
+
+
3768 struct conjunction<B, Bn...>
+
3769 : std::conditional<static_cast<bool>(B::value), conjunction<Bn...>, B>::type {};
+
+
3770
+
3771 // https://en.cppreference.com/w/cpp/types/negation
+
3772 template<class B> struct negation : std::integral_constant < bool, !B::value > {};
+
3773
+
3774 // Reimplementation of is_constructible and is_default_constructible, due to them being broken for
+
3775 // std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367).
+
3776 // This causes compile errors in e.g., Clang 3.5 or GCC 4.9.
+
3777 template <typename T>
+
3778 struct is_default_constructible : std::is_default_constructible<T> {};
+
3779
+
3780 template <typename T1, typename T2>
+
+
3781 struct is_default_constructible<std::pair<T1, T2>>
+
3782 : conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
+
+
3783
+
3784 template <typename T1, typename T2>
+
+
3785 struct is_default_constructible<const std::pair<T1, T2>>
+
3786 : conjunction<is_default_constructible<T1>, is_default_constructible<T2>> {};
+
+
3787
+
3788 template <typename... Ts>
+
+
3789 struct is_default_constructible<std::tuple<Ts...>>
+
3790 : conjunction<is_default_constructible<Ts>...> {};
+
+
3791
+
3792 template <typename... Ts>
+
+
3793 struct is_default_constructible<const std::tuple<Ts...>>
+
3794 : conjunction<is_default_constructible<Ts>...> {};
+
+
3795
+
3796 template <typename T, typename... Args>
+
3797 struct is_constructible : std::is_constructible<T, Args...> {};
+
3798
+
3799 template <typename T1, typename T2>
+
3800 struct is_constructible<std::pair<T1, T2>> : is_default_constructible<std::pair<T1, T2>> {};
+
3801
+
3802 template <typename T1, typename T2>
+
3803 struct is_constructible<const std::pair<T1, T2>> : is_default_constructible<const std::pair<T1, T2>> {};
+
3804
+
3805 template <typename... Ts>
+
3806 struct is_constructible<std::tuple<Ts...>> : is_default_constructible<std::tuple<Ts...>> {};
+
3807
+
3808 template <typename... Ts>
+
3809 struct is_constructible<const std::tuple<Ts...>> : is_default_constructible<const std::tuple<Ts...>> {};
+
3810
+
3811 template<typename T, typename = void>
+
3812 struct is_iterator_traits : std::false_type {};
+
3813
+
3814 template<typename T>
+
+ +
3816 private:
+
3817 using traits = iterator_traits<T>;
+
3818
+
3819 public:
+
3820 static constexpr auto value =
+
3821 is_detected<value_type_t, traits>::value&&
+
3822 is_detected<difference_type_t, traits>::value&&
+
3823 is_detected<pointer_t, traits>::value&&
+
3824 is_detected<iterator_category_t, traits>::value&&
+
3825 is_detected<reference_t, traits>::value;
+
3826 };
+
+
3827
+
3828 template<typename T>
+
+
3829 struct is_range {
+
3830 private:
+
3831 using t_ref = typename std::add_lvalue_reference<T>::type;
+
3832
+
3833 using iterator = detected_t<result_of_begin, t_ref>;
+
3834 using sentinel = detected_t<result_of_end, t_ref>;
+
3835
+
3836 // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator
+
3837 // and https://en.cppreference.com/w/cpp/iterator/sentinel_for
+
3838 // but reimplementing these would be too much work, as a lot of other concepts are used underneath
+
3839 static constexpr auto is_iterator_begin =
+ +
3841
+
3842 public:
+
3843 static constexpr bool value = !std::is_same<iterator, nonesuch>::value && !std::is_same<sentinel, nonesuch>::value&& is_iterator_begin;
+
3844 };
+
+
3845
+
3846 template<typename R>
+
3847 using iterator_t = enable_if_t<is_range<R>::value, result_of_begin<decltype(std::declval<R&>())>>;
+
3848
+
3849 template<typename T>
+
3850 using range_value_t = value_type_t<iterator_traits<iterator_t<T>>>;
+
3851
+
3852 // The following implementation of is_complete_type is taken from
+
3853 // https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/
+
3854 // and is written by Xiang Fan who agreed to use it in this library.
+
3855
+
3856 template<typename T, typename = void>
+
3857 struct is_complete_type : std::false_type {};
+
3858
+
3859 template<typename T>
+
3860 struct is_complete_type<T, decltype(void(sizeof(T)))> : std::true_type {};
+
3861
+
3862 template<typename BasicJsonType, typename CompatibleObjectType,
+
3863 typename = void>
+
3864 struct is_compatible_object_type_impl : std::false_type {};
+
3865
+
3866 template<typename BasicJsonType, typename CompatibleObjectType>
+
+ +
3868 BasicJsonType, CompatibleObjectType,
+
3869 enable_if_t < is_detected<mapped_type_t, CompatibleObjectType>::value&&
+
3870 is_detected<key_type_t, CompatibleObjectType>::value >>
+
3871 {
+
3872 using object_t = typename BasicJsonType::object_t;
+
3873
+
3874 // macOS's is_constructible does not play well with nonesuch...
+
3875 static constexpr bool value =
+
3876 is_constructible<typename object_t::key_type,
+
3877 typename CompatibleObjectType::key_type>::value&&
+
3878 is_constructible<typename object_t::mapped_type,
+
3879 typename CompatibleObjectType::mapped_type>::value;
+
3880 };
+
+
3881
+
3882 template<typename BasicJsonType, typename CompatibleObjectType>
+
+ +
3884 : is_compatible_object_type_impl<BasicJsonType, CompatibleObjectType> {};
+
+
3885
+
3886 template<typename BasicJsonType, typename ConstructibleObjectType,
+
3887 typename = void>
+
3888 struct is_constructible_object_type_impl : std::false_type {};
+
3889
+
3890 template<typename BasicJsonType, typename ConstructibleObjectType>
+
+ +
3892 BasicJsonType, ConstructibleObjectType,
+
3893 enable_if_t < is_detected<mapped_type_t, ConstructibleObjectType>::value&&
+
3894 is_detected<key_type_t, ConstructibleObjectType>::value >>
+
3895 {
+
3896 using object_t = typename BasicJsonType::object_t;
+
3897
+
3898 static constexpr bool value =
+ +
3900 (std::is_move_assignable<ConstructibleObjectType>::value ||
+
3901 std::is_copy_assignable<ConstructibleObjectType>::value) &&
+
3902 (is_constructible<typename ConstructibleObjectType::key_type,
+
3903 typename object_t::key_type>::value &&
+
3904 std::is_same <
+
3905 typename object_t::mapped_type,
+
3906 typename ConstructibleObjectType::mapped_type >::value)) ||
+
3907 (has_from_json<BasicJsonType,
+
3908 typename ConstructibleObjectType::mapped_type>::value ||
+ +
3910 BasicJsonType,
+
3911 typename ConstructibleObjectType::mapped_type >::value);
+
3912 };
+
+
3913
+
3914 template<typename BasicJsonType, typename ConstructibleObjectType>
+
+ +
3916 : is_constructible_object_type_impl<BasicJsonType,
+
3917 ConstructibleObjectType> {};
+
+
3918
+
3919 template<typename BasicJsonType, typename CompatibleStringType>
+ +
3924
+
3925 template<typename BasicJsonType, typename ConstructibleStringType>
+
+ +
3927 // launder type through decltype() to fix compilation failure on ICPC
+
3928#ifdef __INTEL_COMPILER
+
3929 using laundered_type = decltype(std::declval<ConstructibleStringType>());
+
3930#else
+
3931 using laundered_type = ConstructibleStringType;
+
3932#endif
+
3933
+
3934 static constexpr auto value =
+
3935 conjunction <
+ +
3937 is_detected_exact<typename BasicJsonType::string_t::value_type,
+
3938 value_type_t, laundered_type >>::value;
+
3939 };
+
+
3940
+
3941 template<typename BasicJsonType, typename CompatibleArrayType, typename = void>
+
3942 struct is_compatible_array_type_impl : std::false_type {};
+
3943
+
3944 template<typename BasicJsonType, typename CompatibleArrayType>
+
+ +
3946 BasicJsonType, CompatibleArrayType,
+
3947 enable_if_t <
+
3948 is_detected<iterator_t, CompatibleArrayType>::value&&
+
3949 is_iterator_traits<iterator_traits<detected_t<iterator_t, CompatibleArrayType>>>::value &&
+
3950 // special case for types like std::filesystem::path whose iterator's value_type are themselves
+
3951 // c.f. https://github.com/nlohmann/json/pull/3073
+
3952 !std::is_same<CompatibleArrayType, detected_t<range_value_t, CompatibleArrayType>>::value >>
+
3953 {
+
3954 static constexpr bool value =
+
3955 is_constructible<BasicJsonType,
+
3956 range_value_t<CompatibleArrayType>>::value;
+
3957 };
+
+
3958
+
3959 template<typename BasicJsonType, typename CompatibleArrayType>
+
+ +
3961 : is_compatible_array_type_impl<BasicJsonType, CompatibleArrayType> {};
+
+
3962
+
3963 template<typename BasicJsonType, typename ConstructibleArrayType, typename = void>
+
3964 struct is_constructible_array_type_impl : std::false_type {};
+
3965
+
3966 template<typename BasicJsonType, typename ConstructibleArrayType>
+
+ +
3968 BasicJsonType, ConstructibleArrayType,
+
3969 enable_if_t<std::is_same<ConstructibleArrayType,
+
3970 typename BasicJsonType::value_type>::value >>
+
3971 : std::true_type {};
+
+
3972
+
3973 template<typename BasicJsonType, typename ConstructibleArrayType>
+
+ +
3975 BasicJsonType, ConstructibleArrayType,
+
3976 enable_if_t < !std::is_same<ConstructibleArrayType,
+
3977 typename BasicJsonType::value_type>::value &&
+
3978 !is_compatible_string_type<BasicJsonType, ConstructibleArrayType>::value&&
+
3979 is_default_constructible<ConstructibleArrayType>::value &&
+
3980 (std::is_move_assignable<ConstructibleArrayType>::value ||
+
3981 std::is_copy_assignable<ConstructibleArrayType>::value) &&
+
3982 is_detected<iterator_t, ConstructibleArrayType>::value&&
+
3983 is_iterator_traits<iterator_traits<detected_t<iterator_t, ConstructibleArrayType>>>::value&&
+
3984 is_detected<range_value_t, ConstructibleArrayType>::value &&
+
3985 // special case for types like std::filesystem::path whose iterator's value_type are themselves
+
3986 // c.f. https://github.com/nlohmann/json/pull/3073
+
3987 !std::is_same<ConstructibleArrayType, detected_t<range_value_t, ConstructibleArrayType>>::value&&
+ +
3989 detected_t<range_value_t, ConstructibleArrayType >>::value >>
+
3990 {
+
3991 using value_type = range_value_t<ConstructibleArrayType>;
+
3992
+
3993 static constexpr bool value =
+
3994 std::is_same<value_type,
+
3995 typename BasicJsonType::array_t::value_type>::value ||
+
3996 has_from_json<BasicJsonType,
+
3997 value_type>::value ||
+ +
3999 BasicJsonType,
+
4000 value_type >::value;
+
4001 };
+
+
4002
+
4003 template<typename BasicJsonType, typename ConstructibleArrayType>
+
+ +
4005 : is_constructible_array_type_impl<BasicJsonType, ConstructibleArrayType> {};
+
+
4006
+
4007 template<typename RealIntegerType, typename CompatibleNumberIntegerType,
+
4008 typename = void>
+
4009 struct is_compatible_integer_type_impl : std::false_type {};
+
4010
+
4011 template<typename RealIntegerType, typename CompatibleNumberIntegerType>
+
+ +
4013 RealIntegerType, CompatibleNumberIntegerType,
+
4014 enable_if_t < std::is_integral<RealIntegerType>::value&&
+
4015 std::is_integral<CompatibleNumberIntegerType>::value &&
+
4016 !std::is_same<bool, CompatibleNumberIntegerType>::value >>
+
4017 {
+
4018 // is there an assert somewhere on overflows?
+
4019 using RealLimits = std::numeric_limits<RealIntegerType>;
+
4020 using CompatibleLimits = std::numeric_limits<CompatibleNumberIntegerType>;
+
4021
+
4022 static constexpr auto value =
+
4023 is_constructible<RealIntegerType,
+
4024 CompatibleNumberIntegerType>::value&&
+
4025 CompatibleLimits::is_integer&&
+
4026 RealLimits::is_signed == CompatibleLimits::is_signed;
+
4027 };
+
+
4028
+
4029 template<typename RealIntegerType, typename CompatibleNumberIntegerType>
+
+ +
4031 : is_compatible_integer_type_impl<RealIntegerType,
+
4032 CompatibleNumberIntegerType> {};
+
+
4033
+
4034 template<typename BasicJsonType, typename CompatibleType, typename = void>
+
4035 struct is_compatible_type_impl : std::false_type {};
+
4036
+
4037 template<typename BasicJsonType, typename CompatibleType>
+
+ +
4039 BasicJsonType, CompatibleType,
+
4040 enable_if_t<is_complete_type<CompatibleType>::value >>
+
4041 {
+
4042 static constexpr bool value =
+ +
4044 };
+
+
4045
+
4046 template<typename BasicJsonType, typename CompatibleType>
+
+ +
4048 : is_compatible_type_impl<BasicJsonType, CompatibleType> {};
+
+
4049
+
4050 template<typename BasicJsonType, typename CompatibleReferenceType>
+
+ +
4052 using JsonType = uncvref_t<BasicJsonType>;
+
4053 using CVType = typename std::remove_reference<CompatibleReferenceType>::type;
+
4054 using Type = typename std::remove_cv<CVType>::type;
+
4055 constexpr static bool value = std::is_reference<CompatibleReferenceType>::value &&
+
4056 (!std::is_const<typename std::remove_reference<BasicJsonType>::type>::value || std::is_const<CVType>::value) &&
+
4057 (std::is_same<typename JsonType::boolean_t, Type>::value ||
+
4058 std::is_same<typename JsonType::number_float_t, Type>::value ||
+
4059 std::is_same<typename JsonType::number_integer_t, Type>::value ||
+
4060 std::is_same<typename JsonType::number_unsigned_t, Type>::value ||
+
4061 std::is_same<typename JsonType::string_t, Type>::value ||
+
4062 std::is_same<typename JsonType::binary_t, Type>::value ||
+
4063 std::is_same<typename JsonType::object_t, Type>::value ||
+
4064 std::is_same<typename JsonType::array_t, Type>::value);
+
4065 };
+
+
4066
+
4067 template<typename BasicJsonType, typename CompatibleReferenceType>
+
+ +
4069 : is_compatible_reference_type_impl<BasicJsonType, CompatibleReferenceType> {};
+
+
4070
+
4071 template<typename T1, typename T2>
+
4072 struct is_constructible_tuple : std::false_type {};
+
4073
+
4074 template<typename T1, typename... Args>
+
4075 struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<is_constructible<T1, Args>...> {};
+
4076
+
4077 template<typename BasicJsonType, typename T>
+
4078 struct is_json_iterator_of : std::false_type {};
+
4079
+
4080 template<typename BasicJsonType>
+
4081 struct is_json_iterator_of<BasicJsonType, typename BasicJsonType::iterator> : std::true_type {};
+
4082
+
4083 template<typename BasicJsonType>
+
4084 struct is_json_iterator_of<BasicJsonType, typename BasicJsonType::const_iterator> : std::true_type {};
+
4085
+
4086 // checks if a given type T is a template specialization of Primary
+
4087 template<template <typename...> class Primary, typename T>
+
4088 struct is_specialization_of : std::false_type {};
+
4089
+
4090 template<template <typename...> class Primary, typename... Args>
+
4091 struct is_specialization_of<Primary, Primary<Args...>> : std::true_type {};
+
4092
+
4093 template<typename T>
+ +
4095
+
4096 // checks if B is a json_pointer<A>
+
4097 template <typename A, typename B>
+
4098 struct is_json_pointer_of : std::false_type {};
+
4099
+
4100 template <typename A>
+
4101 struct is_json_pointer_of<A, ::nlohmann::json_pointer<A>> : std::true_type {};
+
4102
+
4103 template <typename A>
+
4104 struct is_json_pointer_of<A, ::nlohmann::json_pointer<A>&> : std::true_type {};
+
4105
+
4106 // checks if A and B are comparable using Compare functor
+
4107 template<typename Compare, typename A, typename B, typename = void>
+
4108 struct is_comparable : std::false_type {};
+
4109
+
4110 // We exclude json_pointer here, because the checks using Compare(A, B) will
+
4111 // use json_pointer::operator string_t() which triggers a deprecation warning
+
4112 // for GCC. See https://github.com/nlohmann/json/issues/4621. The call to
+
4113 // is_json_pointer_of can be removed once the deprecated function has been
+
4114 // removed.
+
4115 template<typename Compare, typename A, typename B>
+
+
4116 struct is_comparable < Compare, A, B, enable_if_t < !is_json_pointer_of<A, B>::value
+
4117 && std::is_constructible <decltype(std::declval<Compare>()(std::declval<A>(), std::declval<B>()))>::value
+
4118 && std::is_constructible <decltype(std::declval<Compare>()(std::declval<B>(), std::declval<A>()))>::value
+
4119 >> : std::true_type {};
+
+
4120
+
4121 template<typename T>
+
4122 using detect_is_transparent = typename T::is_transparent;
+
4123
+
4124 // type trait to check if KeyType can be used as an object key (without a BasicJsonType)
+
4125 // see is_usable_as_basic_json_key_type below
+
4126 template<typename Comparator, typename ObjectKeyType, typename KeyTypeCVRef, bool RequireTransparentComparator = true,
+
4127 bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>
+
4128 using is_usable_as_key_type = typename std::conditional <
+ +
4130 && !(ExcludeObjectKeyType&& std::is_same<KeyType,
+
4131 ObjectKeyType>::value)
+
4132 && (!RequireTransparentComparator
+
4133 || is_detected <detect_is_transparent, Comparator>::value)
+
4134 && !is_json_pointer<KeyType>::value,
+
4135 std::true_type,
+
4136 std::false_type >::type;
+
4137
+
4138 // type trait to check if KeyType can be used as an object key
+
4139 // true if:
+
4140 // - KeyType is comparable with BasicJsonType::object_t::key_type
+
4141 // - if ExcludeObjectKeyType is true, KeyType is not BasicJsonType::object_t::key_type
+
4142 // - the comparator is transparent or RequireTransparentComparator is false
+
4143 // - KeyType is not a JSON iterator or json_pointer
+
4144 template<typename BasicJsonType, typename KeyTypeCVRef, bool RequireTransparentComparator = true,
+
4145 bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>
+
4146 using is_usable_as_basic_json_key_type = typename std::conditional <
+
4147 (is_usable_as_key_type<typename BasicJsonType::object_comparator_t,
+
4148 typename BasicJsonType::object_t::key_type, KeyTypeCVRef,
+
4149 RequireTransparentComparator, ExcludeObjectKeyType>::value
+ +
4151#ifdef JSON_HAS_CPP_17
+
4152 || std::is_convertible<KeyType, std::string_view>::value
+
4153#endif
+
4154 , std::true_type,
+
4155 std::false_type >::type;
+
4156
+
4157 template<typename ObjectType, typename KeyType>
+
4158 using detect_erase_with_key_type = decltype(std::declval<ObjectType&>().erase(std::declval<KeyType>()));
+
4159
+
4160 // type trait to check if object_t has an erase() member functions accepting KeyType
+
4161 template<typename BasicJsonType, typename KeyType>
+
4162 using has_erase_with_key_type = typename std::conditional <
+
4163 is_detected <
+
4164 detect_erase_with_key_type,
+
4165 typename BasicJsonType::object_t, KeyType >::value,
+
4166 std::true_type,
+
4167 std::false_type >::type;
+
4168
+
4169 // a naive helper to check if a type is an ordered_map (exploits the fact that
+
4170 // ordered_map inherits capacity() from std::vector)
+
4171 template <typename T>
+
+ +
4173 using one = char;
+
4174
+
+
4175 struct two {
+
4176 char x[2]; // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
4177 };
+
+
4178
+
4179 template <typename C> static one test(decltype(&C::capacity));
+
4180 template <typename C> static two test(...);
+
4181
+
4182 enum { value = sizeof(test<T>(nullptr)) == sizeof(char) }; // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg,cppcoreguidelines-use-enum-class)
+
4183 };
+
+
4184
+
4185 // to avoid useless casts (see https://github.com/nlohmann/json/issues/2893#issuecomment-889152324)
+
4186 template < typename T, typename U, enable_if_t < !std::is_same<T, U>::value, int > = 0 >
+
4187 T conditional_static_cast(U value) {
+
4188 return static_cast<T>(value);
+
4189 }
+
4190
+
4191 template<typename T, typename U, enable_if_t<std::is_same<T, U>::value, int> = 0>
+
4192 T conditional_static_cast(U value) {
+
4193 return value;
+
4194 }
+
4195
+
4196 template<typename... Types>
+
4197 using all_integral = conjunction<std::is_integral<Types>...>;
+
4198
+
4199 template<typename... Types>
+
4200 using all_signed = conjunction<std::is_signed<Types>...>;
+
4201
+
4202 template<typename... Types>
+
4203 using all_unsigned = conjunction<std::is_unsigned<Types>...>;
+
4204
+
4205 // there's a disjunction trait in another PR; replace when merged
+
4206 template<typename... Types>
+
4207 using same_sign = std::integral_constant < bool,
+
4208 all_signed<Types...>::value || all_unsigned<Types...>::value >;
+
4209
+
4210 template<typename OfType, typename T>
+
4211 using never_out_of_range = std::integral_constant < bool,
+
4212 (std::is_signed<OfType>::value && (sizeof(T) < sizeof(OfType)))
+
4213 || (same_sign<OfType, T>::value && sizeof(OfType) == sizeof(T)) >;
+
4214
+
4215 template<typename OfType, typename T,
+
4216 bool OfTypeSigned = std::is_signed<OfType>::value,
+
4217 bool TSigned = std::is_signed<T>::value>
+ +
4219
+
4220 template<typename OfType, typename T>
+
+
4221 struct value_in_range_of_impl2<OfType, T, false, false> {
+
4222 static constexpr bool test(T val) {
+
4223 using CommonType = typename std::common_type<OfType, T>::type;
+
4224 return static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());
+
4225 }
+
4226 };
+
+
4227
+
4228 template<typename OfType, typename T>
+
+
4229 struct value_in_range_of_impl2<OfType, T, true, false> {
+
4230 static constexpr bool test(T val) {
+
4231 using CommonType = typename std::common_type<OfType, T>::type;
+
4232 return static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());
+
4233 }
+
4234 };
+
+
4235
+
4236 template<typename OfType, typename T>
+
+
4237 struct value_in_range_of_impl2<OfType, T, false, true> {
+
4238 static constexpr bool test(T val) {
+
4239 using CommonType = typename std::common_type<OfType, T>::type;
+
4240 return val >= 0 && static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());
+
4241 }
+
4242 };
+
+
4243
+
4244 template<typename OfType, typename T>
+
+
4245 struct value_in_range_of_impl2<OfType, T, true, true> {
+
4246 static constexpr bool test(T val) {
+
4247 using CommonType = typename std::common_type<OfType, T>::type;
+
4248 return static_cast<CommonType>(val) >= static_cast<CommonType>((std::numeric_limits<OfType>::min)())
+
4249 && static_cast<CommonType>(val) <= static_cast<CommonType>((std::numeric_limits<OfType>::max)());
+
4250 }
+
4251 };
+
+
4252
+
4253 template<typename OfType, typename T,
+
4254 bool NeverOutOfRange = never_out_of_range<OfType, T>::value,
+
4255 typename = detail::enable_if_t<all_integral<OfType, T>::value>>
+ +
4257
+
4258 template<typename OfType, typename T>
+
+
4259 struct value_in_range_of_impl1<OfType, T, false> {
+
4260 static constexpr bool test(T val) {
+ +
4262 }
+
4263 };
+
+
4264
+
4265 template<typename OfType, typename T>
+
+
4266 struct value_in_range_of_impl1<OfType, T, true> {
+
4267 static constexpr bool test(T /*val*/) {
+
4268 return true;
+
4269 }
+
4270 };
+
+
4271
+
4272 template<typename OfType, typename T>
+
4273 constexpr bool value_in_range_of(T val) {
+ +
4275 }
+
4276
+
4277 template<bool Value>
+
4278 using bool_constant = std::integral_constant<bool, Value>;
+
4279
+
4281 // is_c_string
+
4283
+
4284 namespace impl {
+
4285
+
4286 template<typename T>
+
4287 constexpr bool is_c_string() {
+
4288 using TUnExt = typename std::remove_extent<T>::type;
+
4289 using TUnCVExt = typename std::remove_cv<TUnExt>::type;
+
4290 using TUnPtr = typename std::remove_pointer<T>::type;
+
4291 using TUnCVPtr = typename std::remove_cv<TUnPtr>::type;
+
4292 return
+
4293 (std::is_array<T>::value && std::is_same<TUnCVExt, char>::value)
+
4294 || (std::is_pointer<T>::value && std::is_same<TUnCVPtr, char>::value);
+
4295 }
+
4296
+
4297 } // namespace impl
+
4298
+
4299 // checks whether T is a [cv] char */[cv] char[] C string
+
4300 template<typename T>
+
4301 struct is_c_string : bool_constant<impl::is_c_string<T>()> {};
+
4302
+
4303 template<typename T>
+
4304 using is_c_string_uncvref = is_c_string<uncvref_t<T>>;
+
4305
+
4307 // is_transparent
+
4309
+
4310 namespace impl {
+
4311
+
4312 template<typename T>
+
4313 constexpr bool is_transparent() {
+
4314 return is_detected<detect_is_transparent, T>::value;
+
4315 }
+
4316
+
4317 } // namespace impl
+
4318
+
4319 // checks whether T has a member named is_transparent
+
4320 template<typename T>
+
4321 struct is_transparent : bool_constant<impl::is_transparent<T>()> {};
+
4322
+
4324
+
4325} // namespace detail
+
4326NLOHMANN_JSON_NAMESPACE_END
+
4327
+
4328// #include <nlohmann/detail/string_concat.hpp>
+
4329// __ _____ _____ _____
+
4330// __| | __| | | | JSON for Modern C++
+
4331// | | |__ | | | | | | version 3.12.0
+
4332// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
4333//
+
4334// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
4335// SPDX-License-Identifier: MIT
+
4336
+
4337
+
4338
+
4339#include <cstring> // strlen
+
4340#include <string> // string
+
4341#include <utility> // forward
+
4342
+
4343// #include <nlohmann/detail/meta/cpp_future.hpp>
+
4344
+
4345// #include <nlohmann/detail/meta/detected.hpp>
+
4346
+
4347
+
4348NLOHMANN_JSON_NAMESPACE_BEGIN
+
4349namespace detail {
+
4350
+
4351 inline std::size_t concat_length() {
+
4352 return 0;
+
4353 }
+
4354
+
4355 template<typename... Args>
+
4356 inline std::size_t concat_length(const char* cstr, const Args& ... rest);
+
4357
+
4358 template<typename StringType, typename... Args>
+
4359 inline std::size_t concat_length(const StringType& str, const Args& ... rest);
+
4360
+
4361 template<typename... Args>
+
4362 inline std::size_t concat_length(const char /*c*/, const Args& ... rest) {
+
4363 return 1 + concat_length(rest...);
+
4364 }
+
4365
+
4366 template<typename... Args>
+
4367 inline std::size_t concat_length(const char* cstr, const Args& ... rest) {
+
4368 // cppcheck-suppress ignoredReturnValue
+
4369 return ::strlen(cstr) + concat_length(rest...);
+
4370 }
+
4371
+
4372 template<typename StringType, typename... Args>
+
4373 inline std::size_t concat_length(const StringType& str, const Args& ... rest) {
+
4374 return str.size() + concat_length(rest...);
+
4375 }
+
4376
+
4377 template<typename OutStringType>
+
4378 inline void concat_into(OutStringType& /*out*/) {}
+
4379
+
4380 template<typename StringType, typename Arg>
+
4381 using string_can_append = decltype(std::declval<StringType&>().append(std::declval < Arg&& >()));
+
4382
+
4383 template<typename StringType, typename Arg>
+
4384 using detect_string_can_append = is_detected<string_can_append, StringType, Arg>;
+
4385
+
4386 template<typename StringType, typename Arg>
+
4387 using string_can_append_op = decltype(std::declval<StringType&>() += std::declval < Arg&& >());
+
4388
+
4389 template<typename StringType, typename Arg>
+
4390 using detect_string_can_append_op = is_detected<string_can_append_op, StringType, Arg>;
+
4391
+
4392 template<typename StringType, typename Arg>
+
4393 using string_can_append_iter = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().begin(), std::declval<const Arg&>().end()));
+
4394
+
4395 template<typename StringType, typename Arg>
+
4396 using detect_string_can_append_iter = is_detected<string_can_append_iter, StringType, Arg>;
+
4397
+
4398 template<typename StringType, typename Arg>
+
4399 using string_can_append_data = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().data(), std::declval<const Arg&>().size()));
+
4400
+
4401 template<typename StringType, typename Arg>
+
4402 using detect_string_can_append_data = is_detected<string_can_append_data, StringType, Arg>;
+
4403
+
4404 template < typename OutStringType, typename Arg, typename... Args,
+
4405 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
+
4406 && detect_string_can_append_op<OutStringType, Arg>::value, int > = 0 >
+
4407 inline void concat_into(OutStringType& out, Arg&& arg, Args && ... rest);
+
4408
+
4409 template < typename OutStringType, typename Arg, typename... Args,
+
4410 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
+
4411 && !detect_string_can_append_op<OutStringType, Arg>::value
+
4412 && detect_string_can_append_iter<OutStringType, Arg>::value, int > = 0 >
+
4413 inline void concat_into(OutStringType& out, const Arg& arg, Args && ... rest);
+
4414
+
4415 template < typename OutStringType, typename Arg, typename... Args,
+
4416 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
+
4417 && !detect_string_can_append_op<OutStringType, Arg>::value
+
4418 && !detect_string_can_append_iter<OutStringType, Arg>::value
+
4419 && detect_string_can_append_data<OutStringType, Arg>::value, int > = 0 >
+
4420 inline void concat_into(OutStringType& out, const Arg& arg, Args && ... rest);
+
4421
+
4422 template<typename OutStringType, typename Arg, typename... Args,
+
4423 enable_if_t<detect_string_can_append<OutStringType, Arg>::value, int> = 0>
+
4424 inline void concat_into(OutStringType& out, Arg&& arg, Args && ... rest) {
+
4425 out.append(std::forward<Arg>(arg));
+
4426 concat_into(out, std::forward<Args>(rest)...);
+
4427 }
+
4428
+
4429 template < typename OutStringType, typename Arg, typename... Args,
+
4430 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
+
4431 && detect_string_can_append_op<OutStringType, Arg>::value, int > >
+
4432 inline void concat_into(OutStringType& out, Arg&& arg, Args&& ... rest) {
+
4433 out += std::forward<Arg>(arg);
+
4434 concat_into(out, std::forward<Args>(rest)...);
+
4435 }
+
4436
+
4437 template < typename OutStringType, typename Arg, typename... Args,
+
4438 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
+
4439 && !detect_string_can_append_op<OutStringType, Arg>::value
+
4440 && detect_string_can_append_iter<OutStringType, Arg>::value, int > >
+
4441 inline void concat_into(OutStringType& out, const Arg& arg, Args&& ... rest) {
+
4442 out.append(arg.begin(), arg.end());
+
4443 concat_into(out, std::forward<Args>(rest)...);
+
4444 }
+
4445
+
4446 template < typename OutStringType, typename Arg, typename... Args,
+
4447 enable_if_t < !detect_string_can_append<OutStringType, Arg>::value
+
4448 && !detect_string_can_append_op<OutStringType, Arg>::value
+
4449 && !detect_string_can_append_iter<OutStringType, Arg>::value
+
4450 && detect_string_can_append_data<OutStringType, Arg>::value, int > >
+
4451 inline void concat_into(OutStringType& out, const Arg& arg, Args&& ... rest) {
+
4452 out.append(arg.data(), arg.size());
+
4453 concat_into(out, std::forward<Args>(rest)...);
+
4454 }
+
4455
+
4456 template<typename OutStringType = std::string, typename... Args>
+
4457 inline OutStringType concat(Args && ... args) {
+
4458 OutStringType str;
+
4459 str.reserve(concat_length(args...));
+
4460 concat_into(str, std::forward<Args>(args)...);
+
4461 return str;
+
4462 }
+
4463
+
4464} // namespace detail
+
4465NLOHMANN_JSON_NAMESPACE_END
+
4466
+
4467
+
4468// With -Wweak-vtables, Clang will complain about the exception classes as they
+
4469// have no out-of-line virtual method definitions and their vtable will be
+
4470// emitted in every translation unit. This issue cannot be fixed with a
+
4471// header-only library as there is no implementation file to move these
+
4472// functions to. As a result, we suppress this warning here to avoid client
+
4473// code stumbling over this. See https://github.com/nlohmann/json/issues/4087
+
4474// for a discussion.
+
4475#if defined(__clang__)
+
4476#pragma clang diagnostic push
+
4477#pragma clang diagnostic ignored "-Wweak-vtables"
+
4478#endif
+
4479
+
4480NLOHMANN_JSON_NAMESPACE_BEGIN
+
4481namespace detail {
+
4482
+
4484 // exceptions //
+
4486
+
+
4489 class exception : public std::exception {
+
4490 public:
+
+
4492 const char* what() const noexcept override {
+
4493 return m.what();
+
4494 }
+
+
4495
+
4497 const int id; // NOLINT(cppcoreguidelines-non-private-member-variables-in-classes)
+
4498
+
4499 protected:
+
4500 JSON_HEDLEY_NON_NULL(3)
+
4501 exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} // NOLINT(bugprone-throw-keyword-missing)
+
4502
+
4503 static std::string name(const std::string& ename, int id_) {
+
4504 return concat("[json.exception.", ename, '.', std::to_string(id_), "] ");
+
4505 }
+
4506
+
4507 static std::string diagnostics(std::nullptr_t /*leaf_element*/) {
+
4508 return "";
+
4509 }
+
4510
+
4511 template<typename BasicJsonType>
+
4512 static std::string diagnostics(const BasicJsonType* leaf_element) {
+
4513#if JSON_DIAGNOSTICS
+
4514 std::vector<std::string> tokens;
+
4515 for (const auto* current = leaf_element; current != nullptr && current->m_parent != nullptr; current = current->m_parent) {
+
4516 switch (current->m_parent->type()) {
+
4517 case value_t::array:
+
4518 {
+
4519 for (std::size_t i = 0; i < current->m_parent->m_data.m_value.array->size(); ++i) {
+
4520 if (&current->m_parent->m_data.m_value.array->operator[](i) == current) {
+
4521 tokens.emplace_back(std::to_string(i));
+
4522 break;
+
4523 }
+
4524 }
+
4525 break;
+
4526 }
+
4527
+
4528 case value_t::object:
+
4529 {
+
4530 for (const auto& element : *current->m_parent->m_data.m_value.object) {
+
4531 if (&element.second == current) {
+
4532 tokens.emplace_back(element.first.c_str());
+
4533 break;
+
4534 }
+
4535 }
+
4536 break;
+
4537 }
+
4538
+
4539 case value_t::null: // LCOV_EXCL_LINE
+
4540 case value_t::string: // LCOV_EXCL_LINE
+
4541 case value_t::boolean: // LCOV_EXCL_LINE
+
4542 case value_t::number_integer: // LCOV_EXCL_LINE
+
4543 case value_t::number_unsigned: // LCOV_EXCL_LINE
+
4544 case value_t::number_float: // LCOV_EXCL_LINE
+
4545 case value_t::binary: // LCOV_EXCL_LINE
+
4546 case value_t::discarded: // LCOV_EXCL_LINE
+
4547 default: // LCOV_EXCL_LINE
+
4548 break; // LCOV_EXCL_LINE
+
4549 }
+
4550 }
+
4551
+
4552 if (tokens.empty()) {
+
4553 return "";
+
4554 }
+
4555
+
4556 auto str = std::accumulate(tokens.rbegin(), tokens.rend(), std::string{},
+
4557 [](const std::string& a, const std::string& b) {
+
4558 return concat(a, '/', detail::escape(b));
+
4559 });
+
4560
+
4561 return concat('(', str, ") ", get_byte_positions(leaf_element));
+
4562#else
+
4563 return get_byte_positions(leaf_element);
+
4564#endif
+
4565 }
+
4566
+
4567 private:
+
4569 std::runtime_error m;
+
4570#if JSON_DIAGNOSTIC_POSITIONS
+
4571 template<typename BasicJsonType>
+
4572 static std::string get_byte_positions(const BasicJsonType* leaf_element) {
+
4573 if ((leaf_element->start_pos() != std::string::npos) && (leaf_element->end_pos() != std::string::npos)) {
+
4574 return concat("(bytes ", std::to_string(leaf_element->start_pos()), "-", std::to_string(leaf_element->end_pos()), ") ");
+
4575 }
+
4576 return "";
+
4577 }
+
4578#else
+
4579 template<typename BasicJsonType>
+
4580 static std::string get_byte_positions(const BasicJsonType* leaf_element) {
+
4581 static_cast<void>(leaf_element);
+
4582 return "";
+
4583 }
+
4584#endif
+
4585 };
+
+
4586
+
+
4589 class parse_error : public exception {
+
4590 public:
+
4600 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
+
+
4601 static parse_error create(int id_, const position_t& pos, const std::string& what_arg, BasicJsonContext context) {
+
4602 const std::string w = concat(exception::name("parse_error", id_), "parse error",
+
4603 position_string(pos), ": ", exception::diagnostics(context), what_arg);
+
4604 return { id_, pos.chars_read_total, w.c_str() };
+
4605 }
+
+
4606
+
4607 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
+
4608 static parse_error create(int id_, std::size_t byte_, const std::string& what_arg, BasicJsonContext context) {
+
4609 const std::string w = concat(exception::name("parse_error", id_), "parse error",
+
4610 (byte_ != 0 ? (concat(" at byte ", std::to_string(byte_))) : ""),
+
4611 ": ", exception::diagnostics(context), what_arg);
+
4612 return { id_, byte_, w.c_str() };
+
4613 }
+
4614
+
4624 const std::size_t byte;
+
4625
+
4626 private:
+
4627 parse_error(int id_, std::size_t byte_, const char* what_arg)
+
4628 : exception(id_, what_arg), byte(byte_) {}
+
4629
+
4630 static std::string position_string(const position_t& pos) {
+
4631 return concat(" at line ", std::to_string(pos.lines_read + 1),
+
4632 ", column ", std::to_string(pos.chars_read_current_line));
+
4633 }
+
4634 };
+
+
4635
+
+
4638 class invalid_iterator : public exception {
+
4639 public:
+
4640 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
+
4641 static invalid_iterator create(int id_, const std::string& what_arg, BasicJsonContext context) {
+
4642 const std::string w = concat(exception::name("invalid_iterator", id_), exception::diagnostics(context), what_arg);
+
4643 return { id_, w.c_str() };
+
4644 }
+
4645
+
4646 private:
+
4647 JSON_HEDLEY_NON_NULL(3)
+
4648 invalid_iterator(int id_, const char* what_arg)
+
4649 : exception(id_, what_arg) {}
+
4650 };
+
+
4651
+
+
4654 class type_error : public exception {
+
4655 public:
+
4656 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
+
4657 static type_error create(int id_, const std::string& what_arg, BasicJsonContext context) {
+
4658 const std::string w = concat(exception::name("type_error", id_), exception::diagnostics(context), what_arg);
+
4659 return { id_, w.c_str() };
+
4660 }
+
4661
+
4662 private:
+
4663 JSON_HEDLEY_NON_NULL(3)
+
4664 type_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
+
4665 };
+
+
4666
+
+
4669 class out_of_range : public exception {
+
4670 public:
+
4671 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
+
4672 static out_of_range create(int id_, const std::string& what_arg, BasicJsonContext context) {
+
4673 const std::string w = concat(exception::name("out_of_range", id_), exception::diagnostics(context), what_arg);
+
4674 return { id_, w.c_str() };
+
4675 }
+
4676
+
4677 private:
+
4678 JSON_HEDLEY_NON_NULL(3)
+
4679 out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {}
+
4680 };
+
+
4681
+
+
4684 class other_error : public exception {
+
4685 public:
+
4686 template<typename BasicJsonContext, enable_if_t<is_basic_json_context<BasicJsonContext>::value, int> = 0>
+
4687 static other_error create(int id_, const std::string& what_arg, BasicJsonContext context) {
+
4688 const std::string w = concat(exception::name("other_error", id_), exception::diagnostics(context), what_arg);
+
4689 return { id_, w.c_str() };
+
4690 }
+
4691
+
4692 private:
+
4693 JSON_HEDLEY_NON_NULL(3)
+
4694 other_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
+
4695 };
+
+
4696
+
4697} // namespace detail
+
4698NLOHMANN_JSON_NAMESPACE_END
+
4699
+
4700#if defined(__clang__)
+
4701#pragma clang diagnostic pop
+
4702#endif
+
4703
+
4704// #include <nlohmann/detail/macro_scope.hpp>
+
4705
+
4706// #include <nlohmann/detail/meta/cpp_future.hpp>
+
4707
+
4708// #include <nlohmann/detail/meta/identity_tag.hpp>
+
4709// __ _____ _____ _____
+
4710// __| | __| | | | JSON for Modern C++
+
4711// | | |__ | | | | | | version 3.12.0
+
4712// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
4713//
+
4714// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
4715// SPDX-License-Identifier: MIT
+
4716
+
4717
+
4718
+
4719// #include <nlohmann/detail/abi_macros.hpp>
+
4720
+
4721
+
4722NLOHMANN_JSON_NAMESPACE_BEGIN
+
4723namespace detail {
+
4724
+
4725 // dispatching helper struct
+
4726 template <class T> struct identity_tag {};
+
4727
+
4728} // namespace detail
+
4729NLOHMANN_JSON_NAMESPACE_END
+
4730
+
4731// #include <nlohmann/detail/meta/std_fs.hpp>
+
4732// __ _____ _____ _____
+
4733// __| | __| | | | JSON for Modern C++
+
4734// | | |__ | | | | | | version 3.12.0
+
4735// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
4736//
+
4737// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
4738// SPDX-License-Identifier: MIT
+
4739
+
4740
+
4741
+
4742// #include <nlohmann/detail/macro_scope.hpp>
+
4743
+
4744
+
4745#if JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
4746#include <experimental/filesystem>
+
4747NLOHMANN_JSON_NAMESPACE_BEGIN
+
4748namespace detail {
+
4749 namespace std_fs = std::experimental::filesystem;
+
4750} // namespace detail
+
4751NLOHMANN_JSON_NAMESPACE_END
+
4752#elif JSON_HAS_FILESYSTEM
+
4753#include <filesystem> // NOLINT(build/c++17)
+
4754NLOHMANN_JSON_NAMESPACE_BEGIN
+
4755namespace detail {
+
4756 namespace std_fs = std::filesystem;
+
4757} // namespace detail
+
4758NLOHMANN_JSON_NAMESPACE_END
+
4759#endif
+
4760
+
4761// #include <nlohmann/detail/meta/type_traits.hpp>
+
4762
+
4763// #include <nlohmann/detail/meta/logic.hpp>
+
4764
+
4765
+
4766// #include <nlohmann/detail/macro_scope.hpp>
+
4767
+
4768
+
4769NLOHMANN_JSON_NAMESPACE_BEGIN
+
4770namespace detail {
+
4771#ifdef JSON_HAS_CPP_17
+
4772
+
4773 template<bool... Booleans>
+
4774 struct cxpr_or_impl : std::integral_constant < bool, (Booleans || ...) > {};
+
4775
+
4776 template<bool... Booleans>
+
4777 struct cxpr_and_impl : std::integral_constant < bool, (Booleans &&...) > {};
+
4778
+
4779#else
+
4780
+
4781 template<bool... Booleans>
+
4782 struct cxpr_or_impl : std::false_type {};
+
4783
+
4784 template<bool... Booleans>
+
4785 struct cxpr_or_impl<true, Booleans...> : std::true_type {};
+
4786
+
4787 template<bool... Booleans>
+
4788 struct cxpr_or_impl<false, Booleans...> : cxpr_or_impl<Booleans...> {};
+
4789
+
4790 template<bool... Booleans>
+
4791 struct cxpr_and_impl : std::true_type {};
+
4792
+
4793 template<bool... Booleans>
+
4794 struct cxpr_and_impl<true, Booleans...> : cxpr_and_impl<Booleans...> {};
+
4795
+
4796 template<bool... Booleans>
+
4797 struct cxpr_and_impl<false, Booleans...> : std::false_type {};
+
4798
+
4799#endif
+
4800
+
4801 template<class Boolean>
+
4802 struct cxpr_not : std::integral_constant < bool, !Boolean::value > {};
+
4803
+
4804 template<class... Booleans>
+
4805 struct cxpr_or : cxpr_or_impl<Booleans::value...> {};
+
4806
+
4807 template<bool... Booleans>
+
4808 struct cxpr_or_c : cxpr_or_impl<Booleans...> {};
+
4809
+
4810 template<class... Booleans>
+
4811 struct cxpr_and : cxpr_and_impl<Booleans::value...> {};
+
4812
+
4813 template<bool... Booleans>
+
4814 struct cxpr_and_c : cxpr_and_impl<Booleans...> {};
+
4815
+
4816} // namespace detail
+
4817NLOHMANN_JSON_NAMESPACE_END
+
4818
+
4819// #include <nlohmann/detail/string_concat.hpp>
+
4820
+
4821// #include <nlohmann/detail/value_t.hpp>
+
4822
+
4823
+
4824// include after macro_scope.hpp
+
4825#ifdef JSON_HAS_CPP_17
+
4826#include <optional> // optional
+
4827#endif
+
4828
+
4829#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
4830#include <string_view> // u8string_view
+
4831#endif
+
4832
+
4833NLOHMANN_JSON_NAMESPACE_BEGIN
+
4834namespace detail {
+
4835
+
4836 template<typename BasicJsonType>
+
4837 inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n) {
+
4838 if (JSON_HEDLEY_UNLIKELY(!j.is_null())) {
+
4839 JSON_THROW(type_error::create(302, concat("type must be null, but is ", j.type_name()), &j));
+
4840 }
+
4841 n = nullptr;
+
4842 }
+
4843
+
4844#ifdef JSON_HAS_CPP_17
+
4845 template < typename BasicJsonType, typename T,
+
4846 typename std::enable_if < !nlohmann::detail::is_basic_json<T>::value, int >::type = 0 >
+
4847 void from_json(const BasicJsonType& j, std::optional<T>& opt) {
+
4848 if (j.is_null()) {
+
4849 opt = std::nullopt;
+
4850 }
+
4851 else {
+
4852 opt.emplace(j.template get<T>());
+
4853 }
+
4854 }
+
4855#endif // JSON_HAS_CPP_17
+
4856
+
4857 // overloads for basic_json template parameters
+
4858 template < typename BasicJsonType, typename ArithmeticType,
+
4859 enable_if_t < std::is_arithmetic<ArithmeticType>::value &&
+
4860 !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
+
4861 int > = 0 >
+
4862 void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) {
+
4863 switch (static_cast<value_t>(j)) {
+ +
4865 {
+
4866 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
+
4867 break;
+
4868 }
+ +
4870 {
+
4871 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
+
4872 break;
+
4873 }
+ +
4875 {
+
4876 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
+
4877 break;
+
4878 }
+
4879
+
4880 case value_t::null:
+
4881 case value_t::object:
+
4882 case value_t::array:
+
4883 case value_t::string:
+
4884 case value_t::boolean:
+
4885 case value_t::binary:
+
4886 case value_t::discarded:
+
4887 default:
+
4888 JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j));
+
4889 }
+
4890 }
+
4891
+
4892 template<typename BasicJsonType>
+
4893 inline void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) {
+
4894 if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) {
+
4895 JSON_THROW(type_error::create(302, concat("type must be boolean, but is ", j.type_name()), &j));
+
4896 }
+
4897 b = *j.template get_ptr<const typename BasicJsonType::boolean_t*>();
+
4898 }
+
4899
+
4900 template<typename BasicJsonType>
+
4901 inline void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) {
+
4902 if (JSON_HEDLEY_UNLIKELY(!j.is_string())) {
+
4903 JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j));
+
4904 }
+
4905 s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
+
4906 }
+
4907
+
4908 template <
+
4909 typename BasicJsonType, typename StringType,
+
4910 enable_if_t <
+
4911 std::is_assignable<StringType&, const typename BasicJsonType::string_t>::value
+
4912 && is_detected_exact<typename BasicJsonType::string_t::value_type, value_type_t, StringType>::value
+
4913 && !std::is_same<typename BasicJsonType::string_t, StringType>::value
+
4914 && !is_json_ref<StringType>::value, int > = 0 >
+
4915 inline void from_json(const BasicJsonType& j, StringType& s) {
+
4916 if (JSON_HEDLEY_UNLIKELY(!j.is_string())) {
+
4917 JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j));
+
4918 }
+
4919
+
4920 s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
+
4921 }
+
4922
+
4923 template<typename BasicJsonType>
+
4924 inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) {
+
4925 get_arithmetic_value(j, val);
+
4926 }
+
4927
+
4928 template<typename BasicJsonType>
+
4929 inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) {
+
4930 get_arithmetic_value(j, val);
+
4931 }
+
4932
+
4933 template<typename BasicJsonType>
+
4934 inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) {
+
4935 get_arithmetic_value(j, val);
+
4936 }
+
4937
+
4938#if !JSON_DISABLE_ENUM_SERIALIZATION
+
4939 template<typename BasicJsonType, typename EnumType,
+
4940 enable_if_t<std::is_enum<EnumType>::value, int> = 0>
+
4941 inline void from_json(const BasicJsonType& j, EnumType& e) {
+
4942 typename std::underlying_type<EnumType>::type val;
+
4943 get_arithmetic_value(j, val);
+
4944 e = static_cast<EnumType>(val);
+
4945 }
+
4946#endif // JSON_DISABLE_ENUM_SERIALIZATION
+
4947
+
4948 // forward_list doesn't have an insert method
+
4949 template<typename BasicJsonType, typename T, typename Allocator,
+
4950 enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>
+
4951 inline void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l) {
+
4952 if (JSON_HEDLEY_UNLIKELY(!j.is_array())) {
+
4953 JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
+
4954 }
+
4955 l.clear();
+
4956 std::transform(j.rbegin(), j.rend(),
+
4957 std::front_inserter(l), [](const BasicJsonType& i) {
+
4958 return i.template get<T>();
+
4959 });
+
4960 }
+
4961
+
4962 // valarray doesn't have an insert method
+
4963 template<typename BasicJsonType, typename T,
+
4964 enable_if_t<is_getable<BasicJsonType, T>::value, int> = 0>
+
4965 inline void from_json(const BasicJsonType& j, std::valarray<T>& l) {
+
4966 if (JSON_HEDLEY_UNLIKELY(!j.is_array())) {
+
4967 JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
+
4968 }
+
4969 l.resize(j.size());
+
4970 std::transform(j.begin(), j.end(), std::begin(l),
+
4971 [](const BasicJsonType& elem) {
+
4972 return elem.template get<T>();
+
4973 });
+
4974 }
+
4975
+
4976 template<typename BasicJsonType, typename T, std::size_t N>
+
4977 auto from_json(const BasicJsonType& j, T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
4978 -> decltype(j.template get<T>(), void()) {
+
4979 for (std::size_t i = 0; i < N; ++i) {
+
4980 arr[i] = j.at(i).template get<T>();
+
4981 }
+
4982 }
+
4983
+
4984 template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2>
+
4985 auto from_json(const BasicJsonType& j, T(&arr)[N1][N2]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
4986 -> decltype(j.template get<T>(), void()) {
+
4987 for (std::size_t i1 = 0; i1 < N1; ++i1) {
+
4988 for (std::size_t i2 = 0; i2 < N2; ++i2) {
+
4989 arr[i1][i2] = j.at(i1).at(i2).template get<T>();
+
4990 }
+
4991 }
+
4992 }
+
4993
+
4994 template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3>
+
4995 auto from_json(const BasicJsonType& j, T(&arr)[N1][N2][N3]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
4996 -> decltype(j.template get<T>(), void()) {
+
4997 for (std::size_t i1 = 0; i1 < N1; ++i1) {
+
4998 for (std::size_t i2 = 0; i2 < N2; ++i2) {
+
4999 for (std::size_t i3 = 0; i3 < N3; ++i3) {
+
5000 arr[i1][i2][i3] = j.at(i1).at(i2).at(i3).template get<T>();
+
5001 }
+
5002 }
+
5003 }
+
5004 }
+
5005
+
5006 template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3, std::size_t N4>
+
5007 auto from_json(const BasicJsonType& j, T(&arr)[N1][N2][N3][N4]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
5008 -> decltype(j.template get<T>(), void()) {
+
5009 for (std::size_t i1 = 0; i1 < N1; ++i1) {
+
5010 for (std::size_t i2 = 0; i2 < N2; ++i2) {
+
5011 for (std::size_t i3 = 0; i3 < N3; ++i3) {
+
5012 for (std::size_t i4 = 0; i4 < N4; ++i4) {
+
5013 arr[i1][i2][i3][i4] = j.at(i1).at(i2).at(i3).at(i4).template get<T>();
+
5014 }
+
5015 }
+
5016 }
+
5017 }
+
5018 }
+
5019
+
5020 template<typename BasicJsonType>
+
5021 inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) {
+
5022 arr = *j.template get_ptr<const typename BasicJsonType::array_t*>();
+
5023 }
+
5024
+
5025 template<typename BasicJsonType, typename T, std::size_t N>
+
5026 auto from_json_array_impl(const BasicJsonType& j, std::array<T, N>& arr,
+
5027 priority_tag<2> /*unused*/)
+
5028 -> decltype(j.template get<T>(), void()) {
+
5029 for (std::size_t i = 0; i < N; ++i) {
+
5030 arr[i] = j.at(i).template get<T>();
+
5031 }
+
5032 }
+
5033
+
5034 template<typename BasicJsonType, typename ConstructibleArrayType,
+
5035 enable_if_t<
+
5036 std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value,
+
5037 int> = 0>
+
5038 auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/)
+
5039 -> decltype(
+
5040 arr.reserve(std::declval<typename ConstructibleArrayType::size_type>()),
+
5041 j.template get<typename ConstructibleArrayType::value_type>(),
+
5042 void()) {
+
5043 using std::end;
+
5044
+
5045 ConstructibleArrayType ret;
+
5046 ret.reserve(j.size());
+
5047 std::transform(j.begin(), j.end(),
+
5048 std::inserter(ret, end(ret)), [](const BasicJsonType& i) {
+
5049 // get<BasicJsonType>() returns *this, this won't call a from_json
+
5050 // method when value_type is BasicJsonType
+
5051 return i.template get<typename ConstructibleArrayType::value_type>();
+
5052 });
+
5053 arr = std::move(ret);
+
5054 }
+
5055
+
5056 template<typename BasicJsonType, typename ConstructibleArrayType,
+
5057 enable_if_t<
+
5058 std::is_assignable<ConstructibleArrayType&, ConstructibleArrayType>::value,
+
5059 int> = 0>
+
5060 inline void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr,
+
5061 priority_tag<0> /*unused*/) {
+
5062 using std::end;
+
5063
+
5064 ConstructibleArrayType ret;
+
5065 std::transform(
+
5066 j.begin(), j.end(), std::inserter(ret, end(ret)),
+
5067 [](const BasicJsonType& i) {
+
5068 // get<BasicJsonType>() returns *this, this won't call a from_json
+
5069 // method when value_type is BasicJsonType
+
5070 return i.template get<typename ConstructibleArrayType::value_type>();
+
5071 });
+
5072 arr = std::move(ret);
+
5073 }
+
5074
+
5075 template < typename BasicJsonType, typename ConstructibleArrayType,
+
5076 enable_if_t <
+ + +
5079 !is_constructible_string_type<BasicJsonType, ConstructibleArrayType>::value &&
+
5080 !std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value &&
+ +
5082 int > = 0 >
+
5083 auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
+
5084 -> decltype(from_json_array_impl(j, arr, priority_tag<3> {}),
+
5085 j.template get<typename ConstructibleArrayType::value_type>(),
+
5086 void()) {
+
5087 if (JSON_HEDLEY_UNLIKELY(!j.is_array())) {
+
5088 JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
+
5089 }
+
5090
+
5091 from_json_array_impl(j, arr, priority_tag<3> {});
+
5092 }
+
5093
+
5094 template < typename BasicJsonType, typename T, std::size_t... Idx >
+
5095 std::array<T, sizeof...(Idx)> from_json_inplace_array_impl(BasicJsonType&& j,
+
5096 identity_tag<std::array<T, sizeof...(Idx)>> /*unused*/, index_sequence<Idx...> /*unused*/) {
+
5097 return { { std::forward<BasicJsonType>(j).at(Idx).template get<T>()... } };
+
5098 }
+
5099
+
5100 template < typename BasicJsonType, typename T, std::size_t N >
+
5101 auto from_json(BasicJsonType&& j, identity_tag<std::array<T, N>> tag)
+
5102 -> decltype(from_json_inplace_array_impl(std::forward<BasicJsonType>(j), tag, make_index_sequence<N> {})) {
+
5103 if (JSON_HEDLEY_UNLIKELY(!j.is_array())) {
+
5104 JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
+
5105 }
+
5106
+
5107 return from_json_inplace_array_impl(std::forward<BasicJsonType>(j), tag, make_index_sequence<N> {});
+
5108 }
+
5109
+
5110 template<typename BasicJsonType>
+
5111 inline void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) {
+
5112 if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) {
+
5113 JSON_THROW(type_error::create(302, concat("type must be binary, but is ", j.type_name()), &j));
+
5114 }
+
5115
+
5116 bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>();
+
5117 }
+
5118
+
5119 template<typename BasicJsonType, typename ConstructibleObjectType,
+
5120 enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value, int> = 0>
+
5121 inline void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) {
+
5122 if (JSON_HEDLEY_UNLIKELY(!j.is_object())) {
+
5123 JSON_THROW(type_error::create(302, concat("type must be object, but is ", j.type_name()), &j));
+
5124 }
+
5125
+
5126 ConstructibleObjectType ret;
+
5127 const auto* inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();
+
5128 using value_type = typename ConstructibleObjectType::value_type;
+
5129 std::transform(
+
5130 inner_object->begin(), inner_object->end(),
+
5131 std::inserter(ret, ret.begin()),
+
5132 [](typename BasicJsonType::object_t::value_type const& p) {
+
5133 return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>());
+
5134 });
+
5135 obj = std::move(ret);
+
5136 }
+
5137
+
5138 // overload for arithmetic types, not chosen for basic_json template arguments
+
5139 // (BooleanType, etc.); note: Is it really necessary to provide explicit
+
5140 // overloads for boolean_t etc. in case of a custom BooleanType which is not
+
5141 // an arithmetic type?
+
5142 template < typename BasicJsonType, typename ArithmeticType,
+
5143 enable_if_t <
+
5144 std::is_arithmetic<ArithmeticType>::value &&
+
5145 !std::is_same<ArithmeticType, typename BasicJsonType::number_unsigned_t>::value &&
+
5146 !std::is_same<ArithmeticType, typename BasicJsonType::number_integer_t>::value &&
+
5147 !std::is_same<ArithmeticType, typename BasicJsonType::number_float_t>::value &&
+
5148 !std::is_same<ArithmeticType, typename BasicJsonType::boolean_t>::value,
+
5149 int > = 0 >
+
5150 inline void from_json(const BasicJsonType& j, ArithmeticType& val) {
+
5151 switch (static_cast<value_t>(j)) {
+ +
5153 {
+
5154 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_unsigned_t*>());
+
5155 break;
+
5156 }
+ +
5158 {
+
5159 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_integer_t*>());
+
5160 break;
+
5161 }
+ +
5163 {
+
5164 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
+
5165 break;
+
5166 }
+
5167 case value_t::boolean:
+
5168 {
+
5169 val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());
+
5170 break;
+
5171 }
+
5172
+
5173 case value_t::null:
+
5174 case value_t::object:
+
5175 case value_t::array:
+
5176 case value_t::string:
+
5177 case value_t::binary:
+
5178 case value_t::discarded:
+
5179 default:
+
5180 JSON_THROW(type_error::create(302, concat("type must be number, but is ", j.type_name()), &j));
+
5181 }
+
5182 }
+
5183
+
5184 template<typename BasicJsonType, typename Type>
+
5185 detail::uncvref_t<Type> from_json_tuple_get_impl(BasicJsonType&& j, detail::identity_tag<Type> /*unused*/, detail::priority_tag<0> /*unused*/) {
+
5186 return std::forward<BasicJsonType>(j).template get<detail::uncvref_t<Type>>();
+
5187 }
+
5188
+
5189 template<typename BasicJsonType, typename Type,
+
5190 detail::enable_if_t<detail::is_compatible_reference_type<BasicJsonType, Type>::value, int> = 0>
+
5191 Type from_json_tuple_get_impl(BasicJsonType&& j, detail::identity_tag<Type> /*unused*/, detail::priority_tag<1> /*unused*/) {
+
5192 return std::forward<BasicJsonType>(j).template get_ref<Type>();
+
5193 }
+
5194
+
5195 template<typename BasicJsonType, typename Type,
+
5196 detail::enable_if_t<std::is_arithmetic<uncvref_t<Type>>::value, int> = 0>
+
5197 detail::uncvref_t<Type> from_json_tuple_get_impl(BasicJsonType&& j, detail::identity_tag<Type> /*unused*/, detail::priority_tag<2> /*unused*/) {
+
5198 return std::forward<BasicJsonType>(j).template get<detail::uncvref_t<Type>>();
+
5199 }
+
5200
+
5201 template<std::size_t PTagValue, typename BasicJsonType, typename... Types>
+
5202 using tuple_type = std::tuple < decltype(from_json_tuple_get_impl(std::declval<BasicJsonType>(), detail::identity_tag<Types> {}, detail::priority_tag<PTagValue> {}))... > ;
+
5203
+
5204 template<std::size_t PTagValue, typename... Args, typename BasicJsonType, std::size_t... Idx>
+
5205 tuple_type<PTagValue, BasicJsonType, Args...> from_json_tuple_impl_base(BasicJsonType&& j, index_sequence<Idx...> /*unused*/) {
+
5206 return tuple_type<PTagValue, BasicJsonType, Args...>(from_json_tuple_get_impl(std::forward<BasicJsonType>(j).at(Idx), detail::identity_tag<Args> {}, detail::priority_tag<PTagValue> {})...);
+
5207 }
+
5208
+
5209 template<std::size_t PTagValue, typename BasicJsonType>
+
5210 std::tuple<> from_json_tuple_impl_base(BasicJsonType& /*unused*/, index_sequence<> /*unused*/) {
+
5211 return {};
+
5212 }
+
5213
+
5214 template < typename BasicJsonType, class A1, class A2 >
+
5215 std::pair<A1, A2> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::pair<A1, A2>> /*unused*/, priority_tag<0> /*unused*/) {
+
5216 return { std::forward<BasicJsonType>(j).at(0).template get<A1>(),
+
5217 std::forward<BasicJsonType>(j).at(1).template get<A2>() };
+
5218 }
+
5219
+
5220 template<typename BasicJsonType, typename A1, typename A2>
+
5221 inline void from_json_tuple_impl(BasicJsonType&& j, std::pair<A1, A2>& p, priority_tag<1> /*unused*/) {
+
5222 p = from_json_tuple_impl(std::forward<BasicJsonType>(j), identity_tag<std::pair<A1, A2>> {}, priority_tag<0> {});
+
5223 }
+
5224
+
5225 template<typename BasicJsonType, typename... Args>
+
5226 std::tuple<Args...> from_json_tuple_impl(BasicJsonType&& j, identity_tag<std::tuple<Args...>> /*unused*/, priority_tag<2> /*unused*/) {
+ +
5228 "Can not return a tuple containing references to types not contained in a Json, try Json::get_to()");
+
5229 return from_json_tuple_impl_base<1, Args...>(std::forward<BasicJsonType>(j), index_sequence_for<Args...> {});
+
5230 }
+
5231
+
5232 template<typename BasicJsonType, typename... Args>
+
5233 inline void from_json_tuple_impl(BasicJsonType&& j, std::tuple<Args...>& t, priority_tag<3> /*unused*/) {
+
5234 t = from_json_tuple_impl_base<2, Args...>(std::forward<BasicJsonType>(j), index_sequence_for<Args...> {});
+
5235 }
+
5236
+
5237 template<typename BasicJsonType, typename TupleRelated>
+
5238 auto from_json(BasicJsonType&& j, TupleRelated&& t)
+
5239 -> decltype(from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {})) {
+
5240 if (JSON_HEDLEY_UNLIKELY(!j.is_array())) {
+
5241 JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
+
5242 }
+
5243
+
5244 return from_json_tuple_impl(std::forward<BasicJsonType>(j), std::forward<TupleRelated>(t), priority_tag<3> {});
+
5245 }
+
5246
+
5247 template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator,
+
5248 typename = enable_if_t < !std::is_constructible <
+
5249 typename BasicJsonType::string_t, Key >::value >>
+
5250 inline void from_json(const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m) {
+
5251 if (JSON_HEDLEY_UNLIKELY(!j.is_array())) {
+
5252 JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
+
5253 }
+
5254 m.clear();
+
5255 for (const auto& p : j) {
+
5256 if (JSON_HEDLEY_UNLIKELY(!p.is_array())) {
+
5257 JSON_THROW(type_error::create(302, concat("type must be array, but is ", p.type_name()), &j));
+
5258 }
+
5259 m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());
+
5260 }
+
5261 }
+
5262
+
5263 template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator,
+
5264 typename = enable_if_t < !std::is_constructible <
+
5265 typename BasicJsonType::string_t, Key >::value >>
+
5266 inline void from_json(const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m) {
+
5267 if (JSON_HEDLEY_UNLIKELY(!j.is_array())) {
+
5268 JSON_THROW(type_error::create(302, concat("type must be array, but is ", j.type_name()), &j));
+
5269 }
+
5270 m.clear();
+
5271 for (const auto& p : j) {
+
5272 if (JSON_HEDLEY_UNLIKELY(!p.is_array())) {
+
5273 JSON_THROW(type_error::create(302, concat("type must be array, but is ", p.type_name()), &j));
+
5274 }
+
5275 m.emplace(p.at(0).template get<Key>(), p.at(1).template get<Value>());
+
5276 }
+
5277 }
+
5278
+
5279#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
5280 template<typename BasicJsonType>
+
5281 inline void from_json(const BasicJsonType& j, std_fs::path& p) {
+
5282 if (JSON_HEDLEY_UNLIKELY(!j.is_string())) {
+
5283 JSON_THROW(type_error::create(302, concat("type must be string, but is ", j.type_name()), &j));
+
5284 }
+
5285 const auto& s = *j.template get_ptr<const typename BasicJsonType::string_t*>();
+
5286 // Checking for C++20 standard or later can be insufficient in case the
+
5287 // library support for char8_t is either incomplete or was disabled
+
5288 // altogether. Use the __cpp_lib_char8_t feature test instead.
+
5289#if defined(__cpp_lib_char8_t) && (__cpp_lib_char8_t >= 201907L)
+
5290 p = std_fs::path(std::u8string_view(reinterpret_cast<const char8_t*>(s.data()), s.size()));
+
5291#else
+
5292 p = std_fs::u8path(s); // accepts UTF-8 encoded std::string in C++17, deprecated in C++20
+
5293#endif
+
5294 }
+
5295#endif
+
5296
+
+ +
5298 template<typename BasicJsonType, typename T>
+
5299 auto operator()(const BasicJsonType& j, T&& val) const
+
5300 noexcept(noexcept(from_json(j, std::forward<T>(val))))
+
5301 -> decltype(from_json(j, std::forward<T>(val))) {
+
5302 return from_json(j, std::forward<T>(val));
+
5303 }
+
5304 };
+
+
5305
+
5306} // namespace detail
+
5307
+
5308#ifndef JSON_HAS_CPP_17
+
5312namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces)
+
5313{
+
5314#endif
+
5315 JSON_INLINE_VARIABLE constexpr const auto& from_json = // NOLINT(misc-definitions-in-headers)
+
5316 detail::static_const<detail::from_json_fn>::value;
+
5317#ifndef JSON_HAS_CPP_17
+
5318} // namespace
+
5319#endif
+
5320
+
5321NLOHMANN_JSON_NAMESPACE_END
+
5322
+
5323// #include <nlohmann/detail/conversions/to_json.hpp>
+
5324// __ _____ _____ _____
+
5325// __| | __| | | | JSON for Modern C++
+
5326// | | |__ | | | | | | version 3.12.0
+
5327// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
5328//
+
5329// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
5330// SPDX-License-Identifier: MIT
+
5331
+
5332
+
5333
+
5334// #include <nlohmann/detail/macro_scope.hpp>
+
5335// JSON_HAS_CPP_17
+
5336#ifdef JSON_HAS_CPP_17
+
5337#include <optional> // optional
+
5338#endif
+
5339
+
5340#include <algorithm> // copy
+
5341#include <iterator> // begin, end
+
5342#include <memory> // allocator_traits
+
5343#include <string> // basic_string, char_traits
+
5344#include <tuple> // tuple, get
+
5345#include <type_traits> // is_same, is_constructible, is_floating_point, is_enum, underlying_type
+
5346#include <utility> // move, forward, declval, pair
+
5347#include <valarray> // valarray
+
5348#include <vector> // vector
+
5349
+
5350// #include <nlohmann/detail/iterators/iteration_proxy.hpp>
+
5351// __ _____ _____ _____
+
5352// __| | __| | | | JSON for Modern C++
+
5353// | | |__ | | | | | | version 3.12.0
+
5354// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
5355//
+
5356// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
5357// SPDX-License-Identifier: MIT
+
5358
+
5359
+
5360
+
5361#include <cstddef> // size_t
+
5362#include <iterator> // forward_iterator_tag
+
5363#include <tuple> // tuple_size, get, tuple_element
+
5364#include <utility> // move
+
5365
+
5366#if JSON_HAS_RANGES
+
5367#include <ranges> // enable_borrowed_range
+
5368#endif
+
5369
+
5370// #include <nlohmann/detail/abi_macros.hpp>
+
5371
+
5372// #include <nlohmann/detail/meta/type_traits.hpp>
+
5373
+
5374// #include <nlohmann/detail/string_utils.hpp>
+
5375// __ _____ _____ _____
+
5376// __| | __| | | | JSON for Modern C++
+
5377// | | |__ | | | | | | version 3.12.0
+
5378// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
5379//
+
5380// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
5381// SPDX-License-Identifier: MIT
+
5382
+
5383
+
5384
+
5385#include <cstddef> // size_t
+
5386#include <string> // string, to_string
+
5387
+
5388// #include <nlohmann/detail/abi_macros.hpp>
+
5389
+
5390
+
5391NLOHMANN_JSON_NAMESPACE_BEGIN
+
5392namespace detail {
+
5393
+
5394 template<typename StringType>
+
5395 void int_to_string(StringType& target, std::size_t value) {
+
5396 // For ADL
+
5397 using std::to_string;
+
5398 target = to_string(value);
+
5399 }
+
5400
+
5401 template<typename StringType>
+
5402 StringType to_string(std::size_t value) {
+
5403 StringType result;
+
5404 int_to_string(result, value);
+
5405 return result;
+
5406 }
+
5407
+
5408} // namespace detail
+
5409NLOHMANN_JSON_NAMESPACE_END
+
5410
+
5411// #include <nlohmann/detail/value_t.hpp>
+
5412
+
5413
+
5414NLOHMANN_JSON_NAMESPACE_BEGIN
+
5415namespace detail {
+
5416
+
+
5417 template<typename IteratorType> class iteration_proxy_value {
+
5418 public:
+
5419 using difference_type = std::ptrdiff_t;
+
5420 using value_type = iteration_proxy_value;
+
5421 using pointer = value_type*;
+
5422 using reference = value_type&;
+
5423 using iterator_category = std::forward_iterator_tag;
+
5424 using string_type = typename std::remove_cv< typename std::remove_reference<decltype(std::declval<IteratorType>().key()) >::type >::type;
+
5425
+
5426 private:
+
5428 IteratorType anchor{};
+
5430 std::size_t array_index = 0;
+
5432 mutable std::size_t array_index_last = 0;
+
5434 mutable string_type array_index_str = "0";
+
5436 string_type empty_str{};
+
5437
+
5438 public:
+
5439 explicit iteration_proxy_value() = default;
+
5440 explicit iteration_proxy_value(IteratorType it, std::size_t array_index_ = 0)
+
5441 noexcept(std::is_nothrow_move_constructible<IteratorType>::value
+
5442 && std::is_nothrow_default_constructible<string_type>::value)
+
5443 : anchor(std::move(it))
+
5444 , array_index(array_index_) {}
+
5445
+
5446 iteration_proxy_value(iteration_proxy_value const&) = default;
+
5447 iteration_proxy_value& operator=(iteration_proxy_value const&) = default;
+
5448 // older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions
+
5449 iteration_proxy_value(iteration_proxy_value&&)
+
5450 noexcept(std::is_nothrow_move_constructible<IteratorType>::value
+
5451 && std::is_nothrow_move_constructible<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
+
5452 iteration_proxy_value& operator=(iteration_proxy_value&&)
+
5453 noexcept(std::is_nothrow_move_assignable<IteratorType>::value
+
5454 && std::is_nothrow_move_assignable<string_type>::value) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor,cppcoreguidelines-noexcept-move-operations)
+
5455 ~iteration_proxy_value() = default;
+
5456
+
+
5458 const iteration_proxy_value& operator*() const {
+
5459 return *this;
+
5460 }
+
+
5461
+
+
5463 iteration_proxy_value& operator++() {
+
5464 ++anchor;
+
5465 ++array_index;
+
5466
+
5467 return *this;
+
5468 }
+
+
5469
+
5470 iteration_proxy_value operator++(int)& // NOLINT(cert-dcl21-cpp)
+
5471 {
+
5472 auto tmp = iteration_proxy_value(anchor, array_index);
+
5473 ++anchor;
+
5474 ++array_index;
+
5475 return tmp;
+
5476 }
+
5477
+
+
5479 bool operator==(const iteration_proxy_value& o) const {
+
5480 return anchor == o.anchor;
+
5481 }
+
+
5482
+
+
5484 bool operator!=(const iteration_proxy_value& o) const {
+
5485 return anchor != o.anchor;
+
5486 }
+
+
5487
+
+
5489 const string_type& key() const {
+
5490 JSON_ASSERT(anchor.m_object != nullptr);
+
5491
+
5492 switch (anchor.m_object->type()) {
+
5493 // use integer array index as key
+
5494 case value_t::array:
+
5495 {
+
5496 if (array_index != array_index_last) {
+
5497 int_to_string(array_index_str, array_index);
+
5498 array_index_last = array_index;
+
5499 }
+
5500 return array_index_str;
+
5501 }
+
5502
+
5503 // use key from the object
+
5504 case value_t::object:
+
5505 return anchor.key();
+
5506
+
5507 // use an empty key for all primitive types
+
5508 case value_t::null:
+
5509 case value_t::string:
+
5510 case value_t::boolean:
+ + + +
5514 case value_t::binary:
+
5515 case value_t::discarded:
+
5516 default:
+
5517 return empty_str;
+
5518 }
+
5519 }
+
+
5520
+
+
5522 typename IteratorType::reference value() const {
+
5523 return anchor.value();
+
5524 }
+
+
5525 };
+
+
5526
+
+
5528 template<typename IteratorType> class iteration_proxy {
+
5529 private:
+
5531 typename IteratorType::pointer container = nullptr;
+
5532
+
5533 public:
+
5534 explicit iteration_proxy() = default;
+
5535
+
+
5537 explicit iteration_proxy(typename IteratorType::reference cont) noexcept
+
5538 : container(&cont) {}
+
+
5539
+
5540 iteration_proxy(iteration_proxy const&) = default;
+
5541 iteration_proxy& operator=(iteration_proxy const&) = default;
+
5542 iteration_proxy(iteration_proxy&&) noexcept = default;
+
5543 iteration_proxy& operator=(iteration_proxy&&) noexcept = default;
+
5544 ~iteration_proxy() = default;
+
5545
+
+
5547 iteration_proxy_value<IteratorType> begin() const noexcept {
+
5548 return iteration_proxy_value<IteratorType>(container->begin());
+
5549 }
+
+
5550
+
+ +
5553 return iteration_proxy_value<IteratorType>(container->end());
+
5554 }
+
+
5555 };
+
+
5556
+
5557 // Structured Bindings Support
+
5558 // For further reference see https://blog.tartanllama.xyz/structured-bindings/
+
5559 // And see https://github.com/nlohmann/json/pull/1391
+
5560 template<std::size_t N, typename IteratorType, enable_if_t<N == 0, int> = 0>
+
5561 auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.key()) {
+
5562 return i.key();
+
5563 }
+
5564 // Structured Bindings Support
+
5565 // For further reference see https://blog.tartanllama.xyz/structured-bindings/
+
5566 // And see https://github.com/nlohmann/json/pull/1391
+
5567 template<std::size_t N, typename IteratorType, enable_if_t<N == 1, int> = 0>
+
5568 auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decltype(i.value()) {
+
5569 return i.value();
+
5570 }
+
5571
+
5572} // namespace detail
+
5573NLOHMANN_JSON_NAMESPACE_END
+
5574
+
5575// The Addition to the STD Namespace is required to add
+
5576// Structured Bindings Support to the iteration_proxy_value class
+
5577// For further reference see https://blog.tartanllama.xyz/structured-bindings/
+
5578// And see https://github.com/nlohmann/json/pull/1391
+
5579namespace std {
+
5580
+
5581#if defined(__clang__)
+
5582 // Fix: https://github.com/nlohmann/json/issues/1401
+
5583#pragma clang diagnostic push
+
5584#pragma clang diagnostic ignored "-Wmismatched-tags"
+
5585#endif
+
5586 template<typename IteratorType>
+
+
5587 class tuple_size<::nlohmann::detail::iteration_proxy_value<IteratorType>> // NOLINT(cert-dcl58-cpp)
+
5588 : public std::integral_constant<std::size_t, 2> {};
+
+
5589
+
5590 template<std::size_t N, typename IteratorType>
+
+
5591 class tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >> // NOLINT(cert-dcl58-cpp)
+
5592 {
+
5593 public:
+
5594 using type = decltype(
+
5595 get<N>(std::declval <
+
5596 ::nlohmann::detail::iteration_proxy_value<IteratorType >> ()));
+
5597 };
+
+
5598#if defined(__clang__)
+
5599#pragma clang diagnostic pop
+
5600#endif
+
5601
+
5602} // namespace std
+
5603
+
5604#if JSON_HAS_RANGES
+
5605template <typename IteratorType>
+
5606inline constexpr bool ::std::ranges::enable_borrowed_range<::nlohmann::detail::iteration_proxy<IteratorType>> = true;
+
5607#endif
+
5608
+
5609// #include <nlohmann/detail/meta/cpp_future.hpp>
+
5610
+
5611// #include <nlohmann/detail/meta/std_fs.hpp>
+
5612
+
5613// #include <nlohmann/detail/meta/type_traits.hpp>
+
5614
+
5615// #include <nlohmann/detail/value_t.hpp>
+
5616
+
5617
+
5618NLOHMANN_JSON_NAMESPACE_BEGIN
+
5619namespace detail {
+
5620
+
5622 // constructors //
+
5624
+
5625 /*
+
5626 * Note all external_constructor<>::construct functions need to call
+
5627 * j.m_data.m_value.destroy(j.m_data.m_type) to avoid a memory leak in case j contains an
+
5628 * allocated value (e.g., a string). See bug issue
+
5629 * https://github.com/nlohmann/json/issues/2865 for more information.
+
5630 */
+
5631
+
5632 template<value_t> struct external_constructor;
+
5633
+
5634 template<>
+
+ +
5636 template<typename BasicJsonType>
+
5637 static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept {
+
5638 j.m_data.m_value.destroy(j.m_data.m_type);
+
5639 j.m_data.m_type = value_t::boolean;
+
5640 j.m_data.m_value = b;
+
5641 j.assert_invariant();
+
5642 }
+
5643 };
+
+
5644
+
5645 template<>
+
+ +
5647 template<typename BasicJsonType>
+
5648 static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) {
+
5649 j.m_data.m_value.destroy(j.m_data.m_type);
+
5650 j.m_data.m_type = value_t::string;
+
5651 j.m_data.m_value = s;
+
5652 j.assert_invariant();
+
5653 }
+
5654
+
5655 template<typename BasicJsonType>
+
5656 static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) {
+
5657 j.m_data.m_value.destroy(j.m_data.m_type);
+
5658 j.m_data.m_type = value_t::string;
+
5659 j.m_data.m_value = std::move(s);
+
5660 j.assert_invariant();
+
5661 }
+
5662
+
5663 template < typename BasicJsonType, typename CompatibleStringType,
+
5664 enable_if_t < !std::is_same<CompatibleStringType, typename BasicJsonType::string_t>::value,
+
5665 int > = 0 >
+
5666 static void construct(BasicJsonType& j, const CompatibleStringType& str) {
+
5667 j.m_data.m_value.destroy(j.m_data.m_type);
+
5668 j.m_data.m_type = value_t::string;
+
5669 j.m_data.m_value.string = j.template create<typename BasicJsonType::string_t>(str);
+
5670 j.assert_invariant();
+
5671 }
+
5672 };
+
+
5673
+
5674 template<>
+
+ +
5676 template<typename BasicJsonType>
+
5677 static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b) {
+
5678 j.m_data.m_value.destroy(j.m_data.m_type);
+
5679 j.m_data.m_type = value_t::binary;
+
5680 j.m_data.m_value = typename BasicJsonType::binary_t(b);
+
5681 j.assert_invariant();
+
5682 }
+
5683
+
5684 template<typename BasicJsonType>
+
5685 static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b) {
+
5686 j.m_data.m_value.destroy(j.m_data.m_type);
+
5687 j.m_data.m_type = value_t::binary;
+
5688 j.m_data.m_value = typename BasicJsonType::binary_t(std::move(b));
+
5689 j.assert_invariant();
+
5690 }
+
5691 };
+
+
5692
+
5693 template<>
+
+ +
5695 template<typename BasicJsonType>
+
5696 static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept {
+
5697 j.m_data.m_value.destroy(j.m_data.m_type);
+
5698 j.m_data.m_type = value_t::number_float;
+
5699 j.m_data.m_value = val;
+
5700 j.assert_invariant();
+
5701 }
+
5702 };
+
+
5703
+
5704 template<>
+
+ +
5706 template<typename BasicJsonType>
+
5707 static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept {
+
5708 j.m_data.m_value.destroy(j.m_data.m_type);
+
5709 j.m_data.m_type = value_t::number_unsigned;
+
5710 j.m_data.m_value = val;
+
5711 j.assert_invariant();
+
5712 }
+
5713 };
+
+
5714
+
5715 template<>
+
+ +
5717 template<typename BasicJsonType>
+
5718 static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept {
+
5719 j.m_data.m_value.destroy(j.m_data.m_type);
+
5720 j.m_data.m_type = value_t::number_integer;
+
5721 j.m_data.m_value = val;
+
5722 j.assert_invariant();
+
5723 }
+
5724 };
+
+
5725
+
5726 template<>
+
+ +
5728 template<typename BasicJsonType>
+
5729 static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) {
+
5730 j.m_data.m_value.destroy(j.m_data.m_type);
+
5731 j.m_data.m_type = value_t::array;
+
5732 j.m_data.m_value = arr;
+
5733 j.set_parents();
+
5734 j.assert_invariant();
+
5735 }
+
5736
+
5737 template<typename BasicJsonType>
+
5738 static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) {
+
5739 j.m_data.m_value.destroy(j.m_data.m_type);
+
5740 j.m_data.m_type = value_t::array;
+
5741 j.m_data.m_value = std::move(arr);
+
5742 j.set_parents();
+
5743 j.assert_invariant();
+
5744 }
+
5745
+
5746 template < typename BasicJsonType, typename CompatibleArrayType,
+
5747 enable_if_t < !std::is_same<CompatibleArrayType, typename BasicJsonType::array_t>::value,
+
5748 int > = 0 >
+
5749 static void construct(BasicJsonType& j, const CompatibleArrayType& arr) {
+
5750 using std::begin;
+
5751 using std::end;
+
5752
+
5753 j.m_data.m_value.destroy(j.m_data.m_type);
+
5754 j.m_data.m_type = value_t::array;
+
5755 j.m_data.m_value.array = j.template create<typename BasicJsonType::array_t>(begin(arr), end(arr));
+
5756 j.set_parents();
+
5757 j.assert_invariant();
+
5758 }
+
5759
+
5760 template<typename BasicJsonType>
+
5761 static void construct(BasicJsonType& j, const std::vector<bool>& arr) {
+
5762 j.m_data.m_value.destroy(j.m_data.m_type);
+
5763 j.m_data.m_type = value_t::array;
+
5764 j.m_data.m_value = value_t::array;
+
5765 j.m_data.m_value.array->reserve(arr.size());
+
5766 for (const bool x : arr) {
+
5767 j.m_data.m_value.array->push_back(x);
+
5768 j.set_parent(j.m_data.m_value.array->back());
+
5769 }
+
5770 j.assert_invariant();
+
5771 }
+
5772
+
5773 template<typename BasicJsonType, typename T,
+
5774 enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>
+
5775 static void construct(BasicJsonType& j, const std::valarray<T>& arr) {
+
5776 j.m_data.m_value.destroy(j.m_data.m_type);
+
5777 j.m_data.m_type = value_t::array;
+
5778 j.m_data.m_value = value_t::array;
+
5779 j.m_data.m_value.array->resize(arr.size());
+
5780 if (arr.size() > 0) {
+
5781 std::copy(std::begin(arr), std::end(arr), j.m_data.m_value.array->begin());
+
5782 }
+
5783 j.set_parents();
+
5784 j.assert_invariant();
+
5785 }
+
5786 };
+
+
5787
+
5788 template<>
+
+ +
5790 template<typename BasicJsonType>
+
5791 static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) {
+
5792 j.m_data.m_value.destroy(j.m_data.m_type);
+
5793 j.m_data.m_type = value_t::object;
+
5794 j.m_data.m_value = obj;
+
5795 j.set_parents();
+
5796 j.assert_invariant();
+
5797 }
+
5798
+
5799 template<typename BasicJsonType>
+
5800 static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) {
+
5801 j.m_data.m_value.destroy(j.m_data.m_type);
+
5802 j.m_data.m_type = value_t::object;
+
5803 j.m_data.m_value = std::move(obj);
+
5804 j.set_parents();
+
5805 j.assert_invariant();
+
5806 }
+
5807
+
5808 template < typename BasicJsonType, typename CompatibleObjectType,
+
5809 enable_if_t < !std::is_same<CompatibleObjectType, typename BasicJsonType::object_t>::value, int > = 0 >
+
5810 static void construct(BasicJsonType& j, const CompatibleObjectType& obj) {
+
5811 using std::begin;
+
5812 using std::end;
+
5813
+
5814 j.m_data.m_value.destroy(j.m_data.m_type);
+
5815 j.m_data.m_type = value_t::object;
+
5816 j.m_data.m_value.object = j.template create<typename BasicJsonType::object_t>(begin(obj), end(obj));
+
5817 j.set_parents();
+
5818 j.assert_invariant();
+
5819 }
+
5820 };
+
+
5821
+
5823 // to_json //
+
5825
+
5826#ifdef JSON_HAS_CPP_17
+
5827 template<typename BasicJsonType, typename T,
+
5828 enable_if_t<std::is_constructible<BasicJsonType, T>::value, int> = 0>
+
5829 void to_json(BasicJsonType& j, const std::optional<T>& opt) noexcept {
+
5830 if (opt.has_value()) {
+
5831 j = *opt;
+
5832 }
+
5833 else {
+
5834 j = nullptr;
+
5835 }
+
5836 }
+
5837#endif
+
5838
+
5839 template<typename BasicJsonType, typename T,
+
5840 enable_if_t<std::is_same<T, typename BasicJsonType::boolean_t>::value, int> = 0>
+
5841 inline void to_json(BasicJsonType& j, T b) noexcept {
+ +
5843 }
+
5844
+
5845 template < typename BasicJsonType, typename BoolRef,
+
5846 enable_if_t <
+
5847 ((std::is_same<std::vector<bool>::reference, BoolRef>::value
+
5848 && !std::is_same <std::vector<bool>::reference, typename BasicJsonType::boolean_t&>::value)
+
5849 || (std::is_same<std::vector<bool>::const_reference, BoolRef>::value
+
5850 && !std::is_same <detail::uncvref_t<std::vector<bool>::const_reference>,
+
5851 typename BasicJsonType::boolean_t >::value))
+
5852 && std::is_convertible<const BoolRef&, typename BasicJsonType::boolean_t>::value, int > = 0 >
+
5853 inline void to_json(BasicJsonType& j, const BoolRef& b) noexcept {
+
5854 external_constructor<value_t::boolean>::construct(j, static_cast<typename BasicJsonType::boolean_t>(b));
+
5855 }
+
5856
+
5857 template<typename BasicJsonType, typename CompatibleString,
+
5858 enable_if_t<std::is_constructible<typename BasicJsonType::string_t, CompatibleString>::value, int> = 0>
+
5859 inline void to_json(BasicJsonType& j, const CompatibleString& s) {
+ +
5861 }
+
5862
+
5863 template<typename BasicJsonType>
+
5864 inline void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) {
+ +
5866 }
+
5867
+
5868 template<typename BasicJsonType, typename FloatType,
+
5869 enable_if_t<std::is_floating_point<FloatType>::value, int> = 0>
+
5870 inline void to_json(BasicJsonType& j, FloatType val) noexcept {
+
5871 external_constructor<value_t::number_float>::construct(j, static_cast<typename BasicJsonType::number_float_t>(val));
+
5872 }
+
5873
+
5874 template<typename BasicJsonType, typename CompatibleNumberUnsignedType,
+
5875 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType>::value, int> = 0>
+
5876 inline void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept {
+
5877 external_constructor<value_t::number_unsigned>::construct(j, static_cast<typename BasicJsonType::number_unsigned_t>(val));
+
5878 }
+
5879
+
5880 template<typename BasicJsonType, typename CompatibleNumberIntegerType,
+
5881 enable_if_t<is_compatible_integer_type<typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType>::value, int> = 0>
+
5882 inline void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept {
+
5883 external_constructor<value_t::number_integer>::construct(j, static_cast<typename BasicJsonType::number_integer_t>(val));
+
5884 }
+
5885
+
5886#if !JSON_DISABLE_ENUM_SERIALIZATION
+
5887 template<typename BasicJsonType, typename EnumType,
+
5888 enable_if_t<std::is_enum<EnumType>::value, int> = 0>
+
5889 inline void to_json(BasicJsonType& j, EnumType e) noexcept {
+
5890 using underlying_type = typename std::underlying_type<EnumType>::type;
+
5891 static constexpr value_t integral_value_t = std::is_unsigned<underlying_type>::value ? value_t::number_unsigned : value_t::number_integer;
+
5892 external_constructor<integral_value_t>::construct(j, static_cast<underlying_type>(e));
+
5893 }
+
5894#endif // JSON_DISABLE_ENUM_SERIALIZATION
+
5895
+
5896 template<typename BasicJsonType>
+
5897 inline void to_json(BasicJsonType& j, const std::vector<bool>& e) {
+ +
5899 }
+
5900
+
5901 template < typename BasicJsonType, typename CompatibleArrayType,
+
5902 enable_if_t < is_compatible_array_type<BasicJsonType,
+
5903 CompatibleArrayType>::value &&
+ +
5905 !is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value &&
+
5906 !std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value &&
+ +
5908 int > = 0 >
+
5909 inline void to_json(BasicJsonType& j, const CompatibleArrayType& arr) {
+ +
5911 }
+
5912
+
5913 template<typename BasicJsonType>
+
5914 inline void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) {
+ +
5916 }
+
5917
+
5918 template<typename BasicJsonType, typename T,
+
5919 enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>
+
5920 inline void to_json(BasicJsonType& j, const std::valarray<T>& arr) {
+ +
5922 }
+
5923
+
5924 template<typename BasicJsonType>
+
5925 inline void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) {
+ +
5927 }
+
5928
+
5929 template < typename BasicJsonType, typename CompatibleObjectType,
+
5930 enable_if_t < is_compatible_object_type<BasicJsonType, CompatibleObjectType>::value && !is_basic_json<CompatibleObjectType>::value, int > = 0 >
+
5931 inline void to_json(BasicJsonType& j, const CompatibleObjectType& obj) {
+ +
5933 }
+
5934
+
5935 template<typename BasicJsonType>
+
5936 inline void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) {
+ +
5938 }
+
5939
+
5940 template <
+
5941 typename BasicJsonType, typename T, std::size_t N,
+
5942 enable_if_t < !std::is_constructible<typename BasicJsonType::string_t,
+
5943 const T(&)[N]>::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
5944 int > = 0 >
+
5945 inline void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
5946 {
+ +
5948 }
+
5949
+
5950 template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value, int > = 0 >
+
5951 inline void to_json(BasicJsonType& j, const std::pair<T1, T2>& p) {
+
5952 j = { p.first, p.second };
+
5953 }
+
5954
+
5955 // for https://github.com/nlohmann/json/pull/1134
+
5956 template<typename BasicJsonType, typename T,
+
5957 enable_if_t<std::is_same<T, iteration_proxy_value<typename BasicJsonType::iterator>>::value, int> = 0>
+
5958 inline void to_json(BasicJsonType& j, const T& b) {
+
5959 j = { {b.key(), b.value()} };
+
5960 }
+
5961
+
5962 template<typename BasicJsonType, typename Tuple, std::size_t... Idx>
+
5963 inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<Idx...> /*unused*/) {
+
5964 j = { std::get<Idx>(t)... };
+
5965 }
+
5966
+
5967 template<typename BasicJsonType, typename Tuple>
+
5968 inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& /*unused*/, index_sequence<> /*unused*/) {
+
5969 using array_t = typename BasicJsonType::array_t;
+
5970 j = array_t();
+
5971 }
+
5972
+
5973 template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>
+
5974 inline void to_json(BasicJsonType& j, const T& t) {
+
5975 to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});
+
5976 }
+
5977
+
5978#if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
5979#if defined(__cpp_lib_char8_t)
+
5980 template<typename BasicJsonType, typename Tr, typename Allocator>
+
5981 inline void to_json(BasicJsonType& j, const std::basic_string<char8_t, Tr, Allocator>& s) {
+
5982 using OtherAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<char>;
+
5983 j = std::basic_string<char, std::char_traits<char>, OtherAllocator>(s.begin(), s.end(), s.get_allocator());
+
5984 }
+
5985#endif
+
5986
+
5987 template<typename BasicJsonType>
+
5988 inline void to_json(BasicJsonType& j, const std_fs::path& p) {
+
5989 // Returns either a std::string or a std::u8string depending whether library
+
5990 // support for char8_t is enabled.
+
5991 j = p.u8string();
+
5992 }
+
5993#endif
+
5994
+
+
5995 struct to_json_fn {
+
5996 template<typename BasicJsonType, typename T>
+
5997 auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward<T>(val))))
+
5998 -> decltype(to_json(j, std::forward<T>(val)), void()) {
+
5999 return to_json(j, std::forward<T>(val));
+
6000 }
+
6001 };
+
+
6002} // namespace detail
+
6003
+
6004#ifndef JSON_HAS_CPP_17
+
6008namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces)
+
6009{
+
6010#endif
+
6011 JSON_INLINE_VARIABLE constexpr const auto& to_json = // NOLINT(misc-definitions-in-headers)
+
6012 detail::static_const<detail::to_json_fn>::value;
+
6013#ifndef JSON_HAS_CPP_17
+
6014} // namespace
+
6015#endif
+
6016
+
6017NLOHMANN_JSON_NAMESPACE_END
+
6018
+
6019// #include <nlohmann/detail/meta/identity_tag.hpp>
+
6020
+
6021
+
6022NLOHMANN_JSON_NAMESPACE_BEGIN
+
6023
+
6025template<typename ValueType, typename>
+
+ +
6029 template<typename BasicJsonType, typename TargetType = ValueType>
+
+
6030 static auto from_json(BasicJsonType&& j, TargetType& val) noexcept(
+
6031 noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), val)))
+
6032 -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), val), void()) {
+
6033 ::nlohmann::from_json(std::forward<BasicJsonType>(j), val);
+
6034 }
+
+
6035
+
6038 template<typename BasicJsonType, typename TargetType = ValueType>
+
+
6039 static auto from_json(BasicJsonType&& j) noexcept(
+
6040 noexcept(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {})))
+
6041 -> decltype(::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {})) {
+
6042 return ::nlohmann::from_json(std::forward<BasicJsonType>(j), detail::identity_tag<TargetType> {});
+
6043 }
+
+
6044
+
6047 template<typename BasicJsonType, typename TargetType = ValueType>
+
+
6048 static auto to_json(BasicJsonType& j, TargetType&& val) noexcept(
+
6049 noexcept(::nlohmann::to_json(j, std::forward<TargetType>(val))))
+
6050 -> decltype(::nlohmann::to_json(j, std::forward<TargetType>(val)), void()) {
+
6051 ::nlohmann::to_json(j, std::forward<TargetType>(val));
+
6052 }
+
+
6053};
+
+
6054
+
6055NLOHMANN_JSON_NAMESPACE_END
+
6056
+
6057// #include <nlohmann/byte_container_with_subtype.hpp>
+
6058// __ _____ _____ _____
+
6059// __| | __| | | | JSON for Modern C++
+
6060// | | |__ | | | | | | version 3.12.0
+
6061// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
6062//
+
6063// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
6064// SPDX-License-Identifier: MIT
+
6065
+
6066
+
6067
+
6068#include <cstdint> // uint8_t, uint64_t
+
6069#include <tuple> // tie
+
6070#include <utility> // move
+
6071
+
6072// #include <nlohmann/detail/abi_macros.hpp>
+
6073
+
6074
+
6075NLOHMANN_JSON_NAMESPACE_BEGIN
+
6076
+
6079template<typename BinaryType>
+
+
6080class byte_container_with_subtype : public BinaryType {
+
6081public:
+
6082 using container_type = BinaryType;
+
6083 using subtype_type = std::uint64_t;
+
6084
+
+
6086 byte_container_with_subtype() noexcept(noexcept(container_type()))
+
6087 : container_type() {}
+
+
6088
+
+
6090 byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b)))
+
6091 : container_type(b) {}
+
+
6092
+
+
6094 byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b))))
+
6095 : container_type(std::move(b)) {}
+
+
6096
+
+
6098 byte_container_with_subtype(const container_type& b, subtype_type subtype_) noexcept(noexcept(container_type(b)))
+
6099 : container_type(b)
+
6100 , m_subtype(subtype_)
+
6101 , m_has_subtype(true) {}
+
+
6102
+
+
6104 byte_container_with_subtype(container_type&& b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b))))
+
6105 : container_type(std::move(b))
+
6106 , m_subtype(subtype_)
+
6107 , m_has_subtype(true) {}
+
+
6108
+
6109 bool operator==(const byte_container_with_subtype& rhs) const {
+
6110 return std::tie(static_cast<const BinaryType&>(*this), m_subtype, m_has_subtype) ==
+
6111 std::tie(static_cast<const BinaryType&>(rhs), rhs.m_subtype, rhs.m_has_subtype);
+
6112 }
+
6113
+
6114 bool operator!=(const byte_container_with_subtype& rhs) const {
+
6115 return !(rhs == *this);
+
6116 }
+
6117
+
+
6120 void set_subtype(subtype_type subtype_) noexcept {
+
6121 m_subtype = subtype_;
+
6122 m_has_subtype = true;
+
6123 }
+
+
6124
+
+
6127 constexpr subtype_type subtype() const noexcept {
+
6128 return m_has_subtype ? m_subtype : static_cast<subtype_type>(-1);
+
6129 }
+
+
6130
+
+
6133 constexpr bool has_subtype() const noexcept {
+
6134 return m_has_subtype;
+
6135 }
+
+
6136
+
+
6139 void clear_subtype() noexcept {
+
6140 m_subtype = 0;
+
6141 m_has_subtype = false;
+
6142 }
+
+
6143
+
6144private:
+
6145 subtype_type m_subtype = 0;
+
6146 bool m_has_subtype = false;
+
6147};
+
+
6148
+
6149NLOHMANN_JSON_NAMESPACE_END
+
6150
+
6151// #include <nlohmann/detail/conversions/from_json.hpp>
+
6152
+
6153// #include <nlohmann/detail/conversions/to_json.hpp>
+
6154
+
6155// #include <nlohmann/detail/exceptions.hpp>
+
6156
+
6157// #include <nlohmann/detail/hash.hpp>
+
6158// __ _____ _____ _____
+
6159// __| | __| | | | JSON for Modern C++
+
6160// | | |__ | | | | | | version 3.12.0
+
6161// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
6162//
+
6163// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
6164// SPDX-License-Identifier: MIT
+
6165
+
6166
+
6167
+
6168#include <cstdint> // uint8_t
+
6169#include <cstddef> // size_t
+
6170#include <functional> // hash
+
6171
+
6172// #include <nlohmann/detail/abi_macros.hpp>
+
6173
+
6174// #include <nlohmann/detail/value_t.hpp>
+
6175
+
6176
+
6177NLOHMANN_JSON_NAMESPACE_BEGIN
+
6178namespace detail {
+
6179
+
6180 // boost::hash_combine
+
6181 inline std::size_t combine(std::size_t seed, std::size_t h) noexcept {
+
6182 seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U);
+
6183 return seed;
+
6184 }
+
6185
+
6197 template<typename BasicJsonType>
+
+
6198 std::size_t hash(const BasicJsonType& j) {
+
6199 using string_t = typename BasicJsonType::string_t;
+
6200 using number_integer_t = typename BasicJsonType::number_integer_t;
+
6201 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
6202 using number_float_t = typename BasicJsonType::number_float_t;
+
6203
+
6204 const auto type = static_cast<std::size_t>(j.type());
+
6205 switch (j.type()) {
+
6206 case BasicJsonType::value_t::null:
+
6207 case BasicJsonType::value_t::discarded:
+
6208 {
+
6209 return combine(type, 0);
+
6210 }
+
6211
+
6212 case BasicJsonType::value_t::object:
+
6213 {
+
6214 auto seed = combine(type, j.size());
+
6215 for (const auto& element : j.items()) {
+
6216 const auto h = std::hash<string_t>{}(element.key());
+
6217 seed = combine(seed, h);
+
6218 seed = combine(seed, hash(element.value()));
+
6219 }
+
6220 return seed;
+
6221 }
+
6222
+
6223 case BasicJsonType::value_t::array:
+
6224 {
+
6225 auto seed = combine(type, j.size());
+
6226 for (const auto& element : j) {
+
6227 seed = combine(seed, hash(element));
+
6228 }
+
6229 return seed;
+
6230 }
+
6231
+
6232 case BasicJsonType::value_t::string:
+
6233 {
+
6234 const auto h = std::hash<string_t>{}(j.template get_ref<const string_t&>());
+
6235 return combine(type, h);
+
6236 }
+
6237
+
6238 case BasicJsonType::value_t::boolean:
+
6239 {
+
6240 const auto h = std::hash<bool>{}(j.template get<bool>());
+
6241 return combine(type, h);
+
6242 }
+
6243
+
6244 case BasicJsonType::value_t::number_integer:
+
6245 {
+
6246 const auto h = std::hash<number_integer_t>{}(j.template get<number_integer_t>());
+
6247 return combine(type, h);
+
6248 }
+
6249
+
6250 case BasicJsonType::value_t::number_unsigned:
+
6251 {
+
6252 const auto h = std::hash<number_unsigned_t>{}(j.template get<number_unsigned_t>());
+
6253 return combine(type, h);
+
6254 }
+
6255
+
6256 case BasicJsonType::value_t::number_float:
+
6257 {
+
6258 const auto h = std::hash<number_float_t>{}(j.template get<number_float_t>());
+
6259 return combine(type, h);
+
6260 }
+
6261
+
6262 case BasicJsonType::value_t::binary:
+
6263 {
+
6264 auto seed = combine(type, j.get_binary().size());
+
6265 const auto h = std::hash<bool>{}(j.get_binary().has_subtype());
+
6266 seed = combine(seed, h);
+
6267 seed = combine(seed, static_cast<std::size_t>(j.get_binary().subtype()));
+
6268 for (const auto byte : j.get_binary()) {
+
6269 seed = combine(seed, std::hash<std::uint8_t> {}(byte));
+
6270 }
+
6271 return seed;
+
6272 }
+
6273
+
6274 default: // LCOV_EXCL_LINE
+
6275 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
6276 return 0; // LCOV_EXCL_LINE
+
6277 }
+
6278 }
+
+
6279
+
6280} // namespace detail
+
6281NLOHMANN_JSON_NAMESPACE_END
+
6282
+
6283// #include <nlohmann/detail/input/binary_reader.hpp>
+
6284// __ _____ _____ _____
+
6285// __| | __| | | | JSON for Modern C++
+
6286// | | |__ | | | | | | version 3.12.0
+
6287// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
6288//
+
6289// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
6290// SPDX-License-Identifier: MIT
+
6291
+
6292
+
6293
+
6294#include <algorithm> // generate_n
+
6295#include <array> // array
+
6296#include <cmath> // ldexp
+
6297#include <cstddef> // size_t
+
6298#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t
+
6299#include <cstdio> // snprintf
+
6300#include <cstring> // memcpy
+
6301#include <iterator> // back_inserter
+
6302#include <limits> // numeric_limits
+
6303#include <string> // char_traits, string
+
6304#include <utility> // make_pair, move
+
6305#include <vector> // vector
+
6306#ifdef __cpp_lib_byteswap
+
6307#include <bit> //byteswap
+
6308#endif
+
6309
+
6310// #include <nlohmann/detail/exceptions.hpp>
+
6311
+
6312// #include <nlohmann/detail/input/input_adapters.hpp>
+
6313// __ _____ _____ _____
+
6314// __| | __| | | | JSON for Modern C++
+
6315// | | |__ | | | | | | version 3.12.0
+
6316// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
6317//
+
6318// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
6319// SPDX-License-Identifier: MIT
+
6320
+
6321
+
6322
+
6323#include <array> // array
+
6324#include <cstddef> // size_t
+
6325#include <cstring> // strlen
+
6326#include <iterator> // begin, end, iterator_traits, random_access_iterator_tag, distance, next
+
6327#include <memory> // shared_ptr, make_shared, addressof
+
6328#include <numeric> // accumulate
+
6329#include <streambuf> // streambuf
+
6330#include <string> // string, char_traits
+
6331#include <type_traits> // enable_if, is_base_of, is_pointer, is_integral, remove_pointer
+
6332#include <utility> // pair, declval
+
6333
+
6334#ifndef JSON_NO_IO
+
6335#include <cstdio> // FILE *
+
6336#include <istream> // istream
+
6337#endif // JSON_NO_IO
+
6338
+
6339// #include <nlohmann/detail/exceptions.hpp>
+
6340
+
6341// #include <nlohmann/detail/iterators/iterator_traits.hpp>
+
6342
+
6343// #include <nlohmann/detail/macro_scope.hpp>
+
6344
+
6345// #include <nlohmann/detail/meta/type_traits.hpp>
+
6346
+
6347
+
6348NLOHMANN_JSON_NAMESPACE_BEGIN
+
6349namespace detail {
+
6350
+
6352 enum class input_format_t { json, cbor, msgpack, ubjson, bson, bjdata };
+
6353
+
6355 // input adapters //
+
6357
+
6358#ifndef JSON_NO_IO
+
+
6363 class file_input_adapter {
+
6364 public:
+
6365 using char_type = char;
+
6366
+
6367 JSON_HEDLEY_NON_NULL(2)
+
6368 explicit file_input_adapter(std::FILE* f) noexcept
+
6369 : m_file(f) {
+
6370 JSON_ASSERT(m_file != nullptr);
+
6371 }
+
6372
+
6373 // make class move-only
+
6374 file_input_adapter(const file_input_adapter&) = delete;
+
6375 file_input_adapter(file_input_adapter&&) noexcept = default;
+
6376 file_input_adapter& operator=(const file_input_adapter&) = delete;
+
6377 file_input_adapter& operator=(file_input_adapter&&) = delete;
+
6378 ~file_input_adapter() = default;
+
6379
+
6380 std::char_traits<char>::int_type get_character() noexcept {
+
6381 return std::fgetc(m_file);
+
6382 }
+
6383
+
6384 // returns the number of characters successfully read
+
6385 template<class T>
+
6386 std::size_t get_elements(T* dest, std::size_t count = 1) {
+
6387 return fread(dest, 1, sizeof(T) * count, m_file);
+
6388 }
+
6389
+
6390 private:
+
6392 std::FILE* m_file;
+
6393 };
+
+
6394
+
+
6404 class input_stream_adapter {
+
6405 public:
+
6406 using char_type = char;
+
6407
+
6408 ~input_stream_adapter() {
+
6409 // clear stream flags; we use underlying streambuf I/O, do not
+
6410 // maintain ifstream flags, except eof
+
6411 if (is != nullptr) {
+
6412 is->clear(is->rdstate() & std::ios::eofbit);
+
6413 }
+
6414 }
+
6415
+
6416 explicit input_stream_adapter(std::istream& i)
+
6417 : is(&i), sb(i.rdbuf()) {}
+
6418
+
6419 // deleted because of pointer members
+
6420 input_stream_adapter(const input_stream_adapter&) = delete;
+
6421 input_stream_adapter& operator=(input_stream_adapter&) = delete;
+
6422 input_stream_adapter& operator=(input_stream_adapter&&) = delete;
+
6423
+
6424 input_stream_adapter(input_stream_adapter&& rhs) noexcept
+
6425 : is(rhs.is), sb(rhs.sb) {
+
6426 rhs.is = nullptr;
+
6427 rhs.sb = nullptr;
+
6428 }
+
6429
+
6430 // std::istream/std::streambuf use std::char_traits<char>::to_int_type, to
+
6431 // ensure that std::char_traits<char>::eof() and the character 0xFF do not
+
6432 // end up as the same value, e.g., 0xFFFFFFFF.
+
6433 std::char_traits<char>::int_type get_character() {
+
6434 auto res = sb->sbumpc();
+
6435 // set eof manually, as we don't use the istream interface.
+
6436 if (JSON_HEDLEY_UNLIKELY(res == std::char_traits<char>::eof())) {
+
6437 is->clear(is->rdstate() | std::ios::eofbit);
+
6438 }
+
6439 return res;
+
6440 }
+
6441
+
6442 template<class T>
+
6443 std::size_t get_elements(T* dest, std::size_t count = 1) {
+
6444 auto res = static_cast<std::size_t>(sb->sgetn(reinterpret_cast<char*>(dest), static_cast<std::streamsize>(count * sizeof(T))));
+
6445 if (JSON_HEDLEY_UNLIKELY(res < count * sizeof(T))) {
+
6446 is->clear(is->rdstate() | std::ios::eofbit);
+
6447 }
+
6448 return res;
+
6449 }
+
6450
+
6451 private:
+
6453 std::istream* is = nullptr;
+
6454 std::streambuf* sb = nullptr;
+
6455 };
+
+
6456#endif // JSON_NO_IO
+
6457
+
6458 // General-purpose iterator-based adapter. It might not be as fast as
+
6459 // theoretically possible for some containers, but it is extremely versatile.
+
6460 template<typename IteratorType>
+
+
6461 class iterator_input_adapter {
+
6462 public:
+
6463 using char_type = typename std::iterator_traits<IteratorType>::value_type;
+
6464
+
6465 iterator_input_adapter(IteratorType first, IteratorType last)
+
6466 : current(std::move(first)), end(std::move(last)) {}
+
6467
+
6468 typename char_traits<char_type>::int_type get_character() {
+
6469 if (JSON_HEDLEY_LIKELY(current != end)) {
+
6470 auto result = char_traits<char_type>::to_int_type(*current);
+
6471 std::advance(current, 1);
+
6472 return result;
+
6473 }
+
6474
+ +
6476 }
+
6477
+
6478 // for general iterators, we cannot really do something better than falling back to processing the range one-by-one
+
6479 template<class T>
+
6480 std::size_t get_elements(T* dest, std::size_t count = 1) {
+
6481 auto* ptr = reinterpret_cast<char*>(dest);
+
6482 for (std::size_t read_index = 0; read_index < count * sizeof(T); ++read_index) {
+
6483 if (JSON_HEDLEY_LIKELY(current != end)) {
+
6484 ptr[read_index] = static_cast<char>(*current);
+
6485 std::advance(current, 1);
+
6486 }
+
6487 else {
+
6488 return read_index;
+
6489 }
+
6490 }
+
6491 return count * sizeof(T);
+
6492 }
+
6493
+
6494 private:
+
6495 IteratorType current;
+
6496 IteratorType end;
+
6497
+
6498 template<typename BaseInputAdapter, size_t T>
+
6499 friend struct wide_string_input_helper;
+
6500
+
6501 bool empty() const {
+
6502 return current == end;
+
6503 }
+
6504 };
+
+
6505
+
6506 template<typename BaseInputAdapter, size_t T>
+ +
6508
+
6509 template<typename BaseInputAdapter>
+
+
6510 struct wide_string_input_helper<BaseInputAdapter, 4> {
+
6511 // UTF-32
+
6512 static void fill_buffer(BaseInputAdapter& input,
+
6513 std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
+
6514 size_t& utf8_bytes_index,
+
6515 size_t& utf8_bytes_filled) {
+
6516 utf8_bytes_index = 0;
+
6517
+
6518 if (JSON_HEDLEY_UNLIKELY(input.empty())) {
+
6519 utf8_bytes[0] = std::char_traits<char>::eof();
+
6520 utf8_bytes_filled = 1;
+
6521 }
+
6522 else {
+
6523 // get the current character
+
6524 const auto wc = input.get_character();
+
6525
+
6526 // UTF-32 to UTF-8 encoding
+
6527 if (wc < 0x80) {
+
6528 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
+
6529 utf8_bytes_filled = 1;
+
6530 }
+
6531 else if (wc <= 0x7FF) {
+
6532 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));
+
6533 utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
+
6534 utf8_bytes_filled = 2;
+
6535 }
+
6536 else if (wc <= 0xFFFF) {
+
6537 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));
+
6538 utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
+
6539 utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
+
6540 utf8_bytes_filled = 3;
+
6541 }
+
6542 else if (wc <= 0x10FFFF) {
+
6543 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((static_cast<unsigned int>(wc) >> 18u) & 0x07u));
+
6544 utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));
+
6545 utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
+
6546 utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
+
6547 utf8_bytes_filled = 4;
+
6548 }
+
6549 else {
+
6550 // unknown character
+
6551 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
+
6552 utf8_bytes_filled = 1;
+
6553 }
+
6554 }
+
6555 }
+
6556 };
+
+
6557
+
6558 template<typename BaseInputAdapter>
+
+
6559 struct wide_string_input_helper<BaseInputAdapter, 2> {
+
6560 // UTF-16
+
6561 static void fill_buffer(BaseInputAdapter& input,
+
6562 std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
+
6563 size_t& utf8_bytes_index,
+
6564 size_t& utf8_bytes_filled) {
+
6565 utf8_bytes_index = 0;
+
6566
+
6567 if (JSON_HEDLEY_UNLIKELY(input.empty())) {
+
6568 utf8_bytes[0] = std::char_traits<char>::eof();
+
6569 utf8_bytes_filled = 1;
+
6570 }
+
6571 else {
+
6572 // get the current character
+
6573 const auto wc = input.get_character();
+
6574
+
6575 // UTF-16 to UTF-8 encoding
+
6576 if (wc < 0x80) {
+
6577 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
+
6578 utf8_bytes_filled = 1;
+
6579 }
+
6580 else if (wc <= 0x7FF) {
+
6581 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u)));
+
6582 utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
+
6583 utf8_bytes_filled = 2;
+
6584 }
+
6585 else if (0xD800 > wc || wc >= 0xE000) {
+
6586 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u)));
+
6587 utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
+
6588 utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
+
6589 utf8_bytes_filled = 3;
+
6590 }
+
6591 else {
+
6592 if (JSON_HEDLEY_UNLIKELY(!input.empty())) {
+
6593 const auto wc2 = static_cast<unsigned int>(input.get_character());
+
6594 const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));
+
6595 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u));
+
6596 utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu));
+
6597 utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu));
+
6598 utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (charcode & 0x3Fu));
+
6599 utf8_bytes_filled = 4;
+
6600 }
+
6601 else {
+
6602 utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
+
6603 utf8_bytes_filled = 1;
+
6604 }
+
6605 }
+
6606 }
+
6607 }
+
6608 };
+
+
6609
+
6610 // Wraps another input adapter to convert wide character types into individual bytes.
+
6611 template<typename BaseInputAdapter, typename WideCharType>
+
+
6612 class wide_string_input_adapter {
+
6613 public:
+
6614 using char_type = char;
+
6615
+
6616 wide_string_input_adapter(BaseInputAdapter base)
+
6617 : base_adapter(base) {}
+
6618
+
6619 typename std::char_traits<char>::int_type get_character() noexcept {
+
6620 // check if the buffer needs to be filled
+
6621 if (utf8_bytes_index == utf8_bytes_filled) {
+
6622 fill_buffer<sizeof(WideCharType)>();
+
6623
+
6624 JSON_ASSERT(utf8_bytes_filled > 0);
+
6625 JSON_ASSERT(utf8_bytes_index == 0);
+
6626 }
+
6627
+
6628 // use buffer
+
6629 JSON_ASSERT(utf8_bytes_filled > 0);
+
6630 JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled);
+
6631 return utf8_bytes[utf8_bytes_index++];
+
6632 }
+
6633
+
6634 // parsing binary with wchar doesn't make sense, but since the parsing mode can be runtime, we need something here
+
6635 template<class T>
+
6636 std::size_t get_elements(T* /*dest*/, std::size_t /*count*/ = 1) {
+
6637 JSON_THROW(parse_error::create(112, 1, "wide string type cannot be interpreted as binary data", nullptr));
+
6638 }
+
6639
+
6640 private:
+
6641 BaseInputAdapter base_adapter;
+
6642
+
6643 template<size_t T>
+
6644 void fill_buffer() {
+
6645 wide_string_input_helper<BaseInputAdapter, T>::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
+
6646 }
+
6647
+
6649 std::array<std::char_traits<char>::int_type, 4> utf8_bytes = { {0, 0, 0, 0} };
+
6650
+
6652 std::size_t utf8_bytes_index = 0;
+
6654 std::size_t utf8_bytes_filled = 0;
+
6655 };
+
+
6656
+
6657 template<typename IteratorType, typename Enable = void>
+
+ +
6659 using iterator_type = IteratorType;
+
6660 using char_type = typename std::iterator_traits<iterator_type>::value_type;
+
6661 using adapter_type = iterator_input_adapter<iterator_type>;
+
6662
+
6663 static adapter_type create(IteratorType first, IteratorType last) {
+
6664 return adapter_type(std::move(first), std::move(last));
+
6665 }
+
6666 };
+
+
6667
+
6668 template<typename T>
+
+ +
6670 using value_type = typename std::iterator_traits<T>::value_type;
+
6671 enum // NOLINT(cppcoreguidelines-use-enum-class)
+
6672 {
+
6673 value = sizeof(value_type) > 1
+
6674 };
+
6675 };
+
+
6676
+
6677 template<typename IteratorType>
+
+
6678 struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>> {
+
6679 using iterator_type = IteratorType;
+
6680 using char_type = typename std::iterator_traits<iterator_type>::value_type;
+
6681 using base_adapter_type = iterator_input_adapter<iterator_type>;
+ +
6683
+
6684 static adapter_type create(IteratorType first, IteratorType last) {
+
6685 return adapter_type(base_adapter_type(std::move(first), std::move(last)));
+
6686 }
+
6687 };
+
+
6688
+
6689 // General purpose iterator-based input
+
6690 template<typename IteratorType>
+
6691 typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapter(IteratorType first, IteratorType last) {
+ +
6693 return factory_type::create(first, last);
+
6694 }
+
6695
+
6696 // Convenience shorthand from container to iterator
+
6697 // Enables ADL on begin(container) and end(container)
+
6698 // Encloses the using declarations in namespace for not to leak them to outside scope
+
6699
+
6700 namespace container_input_adapter_factory_impl {
+
6701
+
6702 using std::begin;
+
6703 using std::end;
+
6704
+
6705 template<typename ContainerType, typename Enable = void>
+ +
6707
+
6708 template<typename ContainerType>
+
+
6709 struct container_input_adapter_factory< ContainerType,
+
6710 void_t<decltype(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>()))>>
+
6711 {
+
6712 using adapter_type = decltype(input_adapter(begin(std::declval<ContainerType>()), end(std::declval<ContainerType>())));
+
6713
+
6714 static adapter_type create(const ContainerType& container) {
+
6715 return input_adapter(begin(container), end(container));
+
6716 }
+
6717 };
+
+
6718
+
6719 } // namespace container_input_adapter_factory_impl
+
6720
+
6721 template<typename ContainerType>
+ + +
6724 }
+
6725
+
6726 // specialization for std::string
+
6727 using string_input_adapter_type = decltype(input_adapter(std::declval<std::string>()));
+
6728
+
6729#ifndef JSON_NO_IO
+
6730 // Special cases with fast paths
+
6731 inline file_input_adapter input_adapter(std::FILE* file) {
+
6732 if (file == nullptr) {
+
6733 JSON_THROW(parse_error::create(101, 0, "attempting to parse an empty input; check that your input string or stream contains the expected JSON", nullptr));
+
6734 }
+
6735 return file_input_adapter(file);
+
6736 }
+
6737
+
6738 inline input_stream_adapter input_adapter(std::istream& stream) {
+
6739 return input_stream_adapter(stream);
+
6740 }
+
6741
+
6742 inline input_stream_adapter input_adapter(std::istream&& stream) {
+
6743 return input_stream_adapter(stream);
+
6744 }
+
6745#endif // JSON_NO_IO
+
6746
+
6747 using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>()));
+
6748
+
6749 // Null-delimited strings, and the like.
+
6750 template < typename CharT,
+
6751 typename std::enable_if <
+
6752 std::is_pointer<CharT>::value &&
+
6753 !std::is_array<CharT>::value&&
+
6754 std::is_integral<typename std::remove_pointer<CharT>::type>::value &&
+
6755 sizeof(typename std::remove_pointer<CharT>::type) == 1,
+
6756 int >::type = 0 >
+
6757 contiguous_bytes_input_adapter input_adapter(CharT b) {
+
6758 if (b == nullptr) {
+
6759 JSON_THROW(parse_error::create(101, 0, "attempting to parse an empty input; check that your input string or stream contains the expected JSON", nullptr));
+
6760 }
+
6761 auto length = std::strlen(reinterpret_cast<const char*>(b));
+
6762 const auto* ptr = reinterpret_cast<const char*>(b);
+
6763 return input_adapter(ptr, ptr + length); // cppcheck-suppress[nullPointerArithmeticRedundantCheck]
+
6764 }
+
6765
+
6766 template<typename T, std::size_t N>
+
6767 auto input_adapter(T(&array)[N]) -> decltype(input_adapter(array, array + N)) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
6768 {
+
6769 return input_adapter(array, array + N);
+
6770 }
+
6771
+
6772 // This class only handles inputs of input_buffer_adapter type.
+
6773 // It's required so that expressions like {ptr, len} can be implicitly cast
+
6774 // to the correct adapter.
+
+
6775 class span_input_adapter {
+
6776 public:
+
6777 template < typename CharT,
+
6778 typename std::enable_if <
+
6779 std::is_pointer<CharT>::value&&
+
6780 std::is_integral<typename std::remove_pointer<CharT>::type>::value &&
+
6781 sizeof(typename std::remove_pointer<CharT>::type) == 1,
+
6782 int >::type = 0 >
+
6783 span_input_adapter(CharT b, std::size_t l)
+
6784 : ia(reinterpret_cast<const char*>(b), reinterpret_cast<const char*>(b) + l) {}
+
6785
+
6786 template<class IteratorType,
+
6787 typename std::enable_if<
+
6788 std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value,
+
6789 int>::type = 0>
+
6790 span_input_adapter(IteratorType first, IteratorType last)
+
6791 : ia(input_adapter(first, last)) {}
+
6792
+
6793 contiguous_bytes_input_adapter&& get() {
+
6794 return std::move(ia); // NOLINT(hicpp-move-const-arg,performance-move-const-arg)
+
6795 }
+
6796
+
6797 private:
+
6798 contiguous_bytes_input_adapter ia;
+
6799 };
+
+
6800
+
6801} // namespace detail
+
6802NLOHMANN_JSON_NAMESPACE_END
+
6803
+
6804// #include <nlohmann/detail/input/json_sax.hpp>
+
6805// __ _____ _____ _____
+
6806// __| | __| | | | JSON for Modern C++
+
6807// | | |__ | | | | | | version 3.12.0
+
6808// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
6809//
+
6810// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
6811// SPDX-License-Identifier: MIT
+
6812
+
6813
+
6814
+
6815#include <cstddef>
+
6816#include <string> // string
+
6817#include <type_traits> // enable_if_t
+
6818#include <utility> // move
+
6819#include <vector> // vector
+
6820
+
6821// #include <nlohmann/detail/exceptions.hpp>
+
6822
+
6823// #include <nlohmann/detail/input/lexer.hpp>
+
6824// __ _____ _____ _____
+
6825// __| | __| | | | JSON for Modern C++
+
6826// | | |__ | | | | | | version 3.12.0
+
6827// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
6828//
+
6829// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
6830// SPDX-License-Identifier: MIT
+
6831
+
6832
+
6833
+
6834#include <array> // array
+
6835#include <clocale> // localeconv
+
6836#include <cstddef> // size_t
+
6837#include <cstdio> // snprintf
+
6838#include <cstdlib> // strtof, strtod, strtold, strtoll, strtoull
+
6839#include <initializer_list> // initializer_list
+
6840#include <string> // char_traits, string
+
6841#include <utility> // move
+
6842#include <vector> // vector
+
6843
+
6844// #include <nlohmann/detail/input/input_adapters.hpp>
+
6845
+
6846// #include <nlohmann/detail/input/position_t.hpp>
+
6847
+
6848// #include <nlohmann/detail/macro_scope.hpp>
+
6849
+
6850// #include <nlohmann/detail/meta/type_traits.hpp>
+
6851
+
6852
+
6853NLOHMANN_JSON_NAMESPACE_BEGIN
+
6854namespace detail {
+
6855
+
6857 // lexer //
+
6859
+
6860 template<typename BasicJsonType>
+
+ +
6862 public:
+ +
6883
+
6885 JSON_HEDLEY_RETURNS_NON_NULL
+
6886 JSON_HEDLEY_CONST
+
+
6887 static const char* token_type_name(const token_type t) noexcept {
+
6888 switch (t) {
+ +
6890 return "<uninitialized>";
+ +
6892 return "true literal";
+ +
6894 return "false literal";
+ +
6896 return "null literal";
+ +
6898 return "string literal";
+ + + +
6902 return "number literal";
+ +
6904 return "'['";
+ +
6906 return "'{'";
+ +
6908 return "']'";
+ +
6910 return "'}'";
+ +
6912 return "':'";
+ +
6914 return "','";
+ +
6916 return "<parse error>";
+ +
6918 return "end of input";
+ +
6920 return "'[', '{', or a literal";
+
6921 // LCOV_EXCL_START
+
6922 default: // catch non-enum values
+
6923 return "unknown token";
+
6924 // LCOV_EXCL_STOP
+
6925 }
+
6926 }
+
+
6927 };
+
+
6928
+
6933 template<typename BasicJsonType, typename InputAdapterType>
+
+
6934 class lexer : public lexer_base<BasicJsonType> {
+
6935 using number_integer_t = typename BasicJsonType::number_integer_t;
+
6936 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
6937 using number_float_t = typename BasicJsonType::number_float_t;
+
6938 using string_t = typename BasicJsonType::string_t;
+
6939 using char_type = typename InputAdapterType::char_type;
+
6940 using char_int_type = typename char_traits<char_type>::int_type;
+
6941
+
6942 public:
+
6943 using token_type = typename lexer_base<BasicJsonType>::token_type;
+
6944
+
6945 explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) noexcept
+
6946 : ia(std::move(adapter))
+
6947 , ignore_comments(ignore_comments_)
+
6948 , decimal_point_char(static_cast<char_int_type>(get_decimal_point())) {}
+
6949
+
6950 // deleted because of pointer members
+
6951 lexer(const lexer&) = delete;
+
6952 lexer(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
+
6953 lexer& operator=(lexer&) = delete;
+
6954 lexer& operator=(lexer&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
+
6955 ~lexer() = default;
+
6956
+
6957 private:
+
6959 // locales
+
6961
+
6963 JSON_HEDLEY_PURE
+
6964 static char get_decimal_point() noexcept {
+
6965 const auto* loc = localeconv();
+
6966 JSON_ASSERT(loc != nullptr);
+
6967 return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point);
+
6968 }
+
6969
+
6971 // scan functions
+
6973
+
6989 int get_codepoint() {
+
6990 // this function only makes sense after reading `\u`
+
6991 JSON_ASSERT(current == 'u');
+
6992 int codepoint = 0;
+
6993
+
6994 const auto factors = { 12u, 8u, 4u, 0u };
+
6995 for (const auto factor : factors) {
+
6996 get();
+
6997
+
6998 if (current >= '0' && current <= '9') {
+
6999 codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x30u) << factor);
+
7000 }
+
7001 else if (current >= 'A' && current <= 'F') {
+
7002 codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x37u) << factor);
+
7003 }
+
7004 else if (current >= 'a' && current <= 'f') {
+
7005 codepoint += static_cast<int>((static_cast<unsigned int>(current) - 0x57u) << factor);
+
7006 }
+
7007 else {
+
7008 return -1;
+
7009 }
+
7010 }
+
7011
+
7012 JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF);
+
7013 return codepoint;
+
7014 }
+
7015
+
7031 bool next_byte_in_range(std::initializer_list<char_int_type> ranges) {
+
7032 JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6);
+
7033 add(current);
+
7034
+
7035 for (auto range = ranges.begin(); range != ranges.end(); ++range) {
+
7036 get();
+
7037 if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) // NOLINT(bugprone-inc-dec-in-conditions)
+
7038 {
+
7039 add(current);
+
7040 }
+
7041 else {
+
7042 error_message = "invalid string: ill-formed UTF-8 byte";
+
7043 return false;
+
7044 }
+
7045 }
+
7046
+
7047 return true;
+
7048 }
+
7049
+
7065 token_type scan_string() {
+
7066 // reset token_buffer (ignore opening quote)
+
7067 reset();
+
7068
+
7069 // we entered the function by reading an open quote
+
7070 JSON_ASSERT(current == '\"');
+
7071
+
7072 while (true) {
+
7073 // get the next character
+
7074 switch (get()) {
+
7075 // end of file while parsing the string
+ +
7077 {
+
7078 error_message = "invalid string: missing closing quote";
+
7079 return token_type::parse_error;
+
7080 }
+
7081
+
7082 // closing quote
+
7083 case '\"':
+
7084 {
+
7085 return token_type::value_string;
+
7086 }
+
7087
+
7088 // escapes
+
7089 case '\\':
+
7090 {
+
7091 switch (get()) {
+
7092 // quotation mark
+
7093 case '\"':
+
7094 add('\"');
+
7095 break;
+
7096 // reverse solidus
+
7097 case '\\':
+
7098 add('\\');
+
7099 break;
+
7100 // solidus
+
7101 case '/':
+
7102 add('/');
+
7103 break;
+
7104 // backspace
+
7105 case 'b':
+
7106 add('\b');
+
7107 break;
+
7108 // form feed
+
7109 case 'f':
+
7110 add('\f');
+
7111 break;
+
7112 // line feed
+
7113 case 'n':
+
7114 add('\n');
+
7115 break;
+
7116 // carriage return
+
7117 case 'r':
+
7118 add('\r');
+
7119 break;
+
7120 // tab
+
7121 case 't':
+
7122 add('\t');
+
7123 break;
+
7124
+
7125 // unicode escapes
+
7126 case 'u':
+
7127 {
+
7128 const int codepoint1 = get_codepoint();
+
7129 int codepoint = codepoint1; // start with codepoint1
+
7130
+
7131 if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1)) {
+
7132 error_message = "invalid string: '\\u' must be followed by 4 hex digits";
+
7133 return token_type::parse_error;
+
7134 }
+
7135
+
7136 // check if code point is a high surrogate
+
7137 if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF) {
+
7138 // expect next \uxxxx entry
+
7139 if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u')) {
+
7140 const int codepoint2 = get_codepoint();
+
7141
+
7142 if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1)) {
+
7143 error_message = "invalid string: '\\u' must be followed by 4 hex digits";
+
7144 return token_type::parse_error;
+
7145 }
+
7146
+
7147 // check if codepoint2 is a low surrogate
+
7148 if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF)) {
+
7149 // overwrite codepoint
+
7150 codepoint = static_cast<int>(
+
7151 // high surrogate occupies the most significant 22 bits
+
7152 (static_cast<unsigned int>(codepoint1) << 10u)
+
7153 // low surrogate occupies the least significant 15 bits
+
7154 + static_cast<unsigned int>(codepoint2)
+
7155 // there is still the 0xD800, 0xDC00, and 0x10000 noise
+
7156 // in the result, so we have to subtract with:
+
7157 // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00
+
7158 -0x35FDC00u);
+
7159 }
+
7160 else {
+
7161 error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
+
7162 return token_type::parse_error;
+
7163 }
+
7164 }
+
7165 else {
+
7166 error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
+
7167 return token_type::parse_error;
+
7168 }
+
7169 }
+
7170 else {
+
7171 if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) {
+
7172 error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF";
+
7173 return token_type::parse_error;
+
7174 }
+
7175 }
+
7176
+
7177 // the result of the above calculation yields a proper codepoint
+
7178 JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF);
+
7179
+
7180 // translate codepoint into bytes
+
7181 if (codepoint < 0x80) {
+
7182 // 1-byte characters: 0xxxxxxx (ASCII)
+
7183 add(static_cast<char_int_type>(codepoint));
+
7184 }
+
7185 else if (codepoint <= 0x7FF) {
+
7186 // 2-byte characters: 110xxxxx 10xxxxxx
+
7187 add(static_cast<char_int_type>(0xC0u | (static_cast<unsigned int>(codepoint) >> 6u)));
+
7188 add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
+
7189 }
+
7190 else if (codepoint <= 0xFFFF) {
+
7191 // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx
+
7192 add(static_cast<char_int_type>(0xE0u | (static_cast<unsigned int>(codepoint) >> 12u)));
+
7193 add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
+
7194 add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
+
7195 }
+
7196 else {
+
7197 // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
7198 add(static_cast<char_int_type>(0xF0u | (static_cast<unsigned int>(codepoint) >> 18u)));
+
7199 add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));
+
7200 add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
+
7201 add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
+
7202 }
+
7203
+
7204 break;
+
7205 }
+
7206
+
7207 // other characters after escape
+
7208 default:
+
7209 error_message = "invalid string: forbidden character after backslash";
+
7210 return token_type::parse_error;
+
7211 }
+
7212
+
7213 break;
+
7214 }
+
7215
+
7216 // invalid control characters
+
7217 case 0x00:
+
7218 {
+
7219 error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000";
+
7220 return token_type::parse_error;
+
7221 }
+
7222
+
7223 case 0x01:
+
7224 {
+
7225 error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001";
+
7226 return token_type::parse_error;
+
7227 }
+
7228
+
7229 case 0x02:
+
7230 {
+
7231 error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002";
+
7232 return token_type::parse_error;
+
7233 }
+
7234
+
7235 case 0x03:
+
7236 {
+
7237 error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003";
+
7238 return token_type::parse_error;
+
7239 }
+
7240
+
7241 case 0x04:
+
7242 {
+
7243 error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004";
+
7244 return token_type::parse_error;
+
7245 }
+
7246
+
7247 case 0x05:
+
7248 {
+
7249 error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005";
+
7250 return token_type::parse_error;
+
7251 }
+
7252
+
7253 case 0x06:
+
7254 {
+
7255 error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006";
+
7256 return token_type::parse_error;
+
7257 }
+
7258
+
7259 case 0x07:
+
7260 {
+
7261 error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007";
+
7262 return token_type::parse_error;
+
7263 }
+
7264
+
7265 case 0x08:
+
7266 {
+
7267 error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b";
+
7268 return token_type::parse_error;
+
7269 }
+
7270
+
7271 case 0x09:
+
7272 {
+
7273 error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t";
+
7274 return token_type::parse_error;
+
7275 }
+
7276
+
7277 case 0x0A:
+
7278 {
+
7279 error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n";
+
7280 return token_type::parse_error;
+
7281 }
+
7282
+
7283 case 0x0B:
+
7284 {
+
7285 error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B";
+
7286 return token_type::parse_error;
+
7287 }
+
7288
+
7289 case 0x0C:
+
7290 {
+
7291 error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f";
+
7292 return token_type::parse_error;
+
7293 }
+
7294
+
7295 case 0x0D:
+
7296 {
+
7297 error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r";
+
7298 return token_type::parse_error;
+
7299 }
+
7300
+
7301 case 0x0E:
+
7302 {
+
7303 error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E";
+
7304 return token_type::parse_error;
+
7305 }
+
7306
+
7307 case 0x0F:
+
7308 {
+
7309 error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F";
+
7310 return token_type::parse_error;
+
7311 }
+
7312
+
7313 case 0x10:
+
7314 {
+
7315 error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010";
+
7316 return token_type::parse_error;
+
7317 }
+
7318
+
7319 case 0x11:
+
7320 {
+
7321 error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011";
+
7322 return token_type::parse_error;
+
7323 }
+
7324
+
7325 case 0x12:
+
7326 {
+
7327 error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012";
+
7328 return token_type::parse_error;
+
7329 }
+
7330
+
7331 case 0x13:
+
7332 {
+
7333 error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013";
+
7334 return token_type::parse_error;
+
7335 }
+
7336
+
7337 case 0x14:
+
7338 {
+
7339 error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014";
+
7340 return token_type::parse_error;
+
7341 }
+
7342
+
7343 case 0x15:
+
7344 {
+
7345 error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015";
+
7346 return token_type::parse_error;
+
7347 }
+
7348
+
7349 case 0x16:
+
7350 {
+
7351 error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016";
+
7352 return token_type::parse_error;
+
7353 }
+
7354
+
7355 case 0x17:
+
7356 {
+
7357 error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017";
+
7358 return token_type::parse_error;
+
7359 }
+
7360
+
7361 case 0x18:
+
7362 {
+
7363 error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018";
+
7364 return token_type::parse_error;
+
7365 }
+
7366
+
7367 case 0x19:
+
7368 {
+
7369 error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019";
+
7370 return token_type::parse_error;
+
7371 }
+
7372
+
7373 case 0x1A:
+
7374 {
+
7375 error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A";
+
7376 return token_type::parse_error;
+
7377 }
+
7378
+
7379 case 0x1B:
+
7380 {
+
7381 error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B";
+
7382 return token_type::parse_error;
+
7383 }
+
7384
+
7385 case 0x1C:
+
7386 {
+
7387 error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C";
+
7388 return token_type::parse_error;
+
7389 }
+
7390
+
7391 case 0x1D:
+
7392 {
+
7393 error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D";
+
7394 return token_type::parse_error;
+
7395 }
+
7396
+
7397 case 0x1E:
+
7398 {
+
7399 error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E";
+
7400 return token_type::parse_error;
+
7401 }
+
7402
+
7403 case 0x1F:
+
7404 {
+
7405 error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F";
+
7406 return token_type::parse_error;
+
7407 }
+
7408
+
7409 // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace))
+
7410 case 0x20:
+
7411 case 0x21:
+
7412 case 0x23:
+
7413 case 0x24:
+
7414 case 0x25:
+
7415 case 0x26:
+
7416 case 0x27:
+
7417 case 0x28:
+
7418 case 0x29:
+
7419 case 0x2A:
+
7420 case 0x2B:
+
7421 case 0x2C:
+
7422 case 0x2D:
+
7423 case 0x2E:
+
7424 case 0x2F:
+
7425 case 0x30:
+
7426 case 0x31:
+
7427 case 0x32:
+
7428 case 0x33:
+
7429 case 0x34:
+
7430 case 0x35:
+
7431 case 0x36:
+
7432 case 0x37:
+
7433 case 0x38:
+
7434 case 0x39:
+
7435 case 0x3A:
+
7436 case 0x3B:
+
7437 case 0x3C:
+
7438 case 0x3D:
+
7439 case 0x3E:
+
7440 case 0x3F:
+
7441 case 0x40:
+
7442 case 0x41:
+
7443 case 0x42:
+
7444 case 0x43:
+
7445 case 0x44:
+
7446 case 0x45:
+
7447 case 0x46:
+
7448 case 0x47:
+
7449 case 0x48:
+
7450 case 0x49:
+
7451 case 0x4A:
+
7452 case 0x4B:
+
7453 case 0x4C:
+
7454 case 0x4D:
+
7455 case 0x4E:
+
7456 case 0x4F:
+
7457 case 0x50:
+
7458 case 0x51:
+
7459 case 0x52:
+
7460 case 0x53:
+
7461 case 0x54:
+
7462 case 0x55:
+
7463 case 0x56:
+
7464 case 0x57:
+
7465 case 0x58:
+
7466 case 0x59:
+
7467 case 0x5A:
+
7468 case 0x5B:
+
7469 case 0x5D:
+
7470 case 0x5E:
+
7471 case 0x5F:
+
7472 case 0x60:
+
7473 case 0x61:
+
7474 case 0x62:
+
7475 case 0x63:
+
7476 case 0x64:
+
7477 case 0x65:
+
7478 case 0x66:
+
7479 case 0x67:
+
7480 case 0x68:
+
7481 case 0x69:
+
7482 case 0x6A:
+
7483 case 0x6B:
+
7484 case 0x6C:
+
7485 case 0x6D:
+
7486 case 0x6E:
+
7487 case 0x6F:
+
7488 case 0x70:
+
7489 case 0x71:
+
7490 case 0x72:
+
7491 case 0x73:
+
7492 case 0x74:
+
7493 case 0x75:
+
7494 case 0x76:
+
7495 case 0x77:
+
7496 case 0x78:
+
7497 case 0x79:
+
7498 case 0x7A:
+
7499 case 0x7B:
+
7500 case 0x7C:
+
7501 case 0x7D:
+
7502 case 0x7E:
+
7503 case 0x7F:
+
7504 {
+
7505 add(current);
+
7506 break;
+
7507 }
+
7508
+
7509 // U+0080..U+07FF: bytes C2..DF 80..BF
+
7510 case 0xC2:
+
7511 case 0xC3:
+
7512 case 0xC4:
+
7513 case 0xC5:
+
7514 case 0xC6:
+
7515 case 0xC7:
+
7516 case 0xC8:
+
7517 case 0xC9:
+
7518 case 0xCA:
+
7519 case 0xCB:
+
7520 case 0xCC:
+
7521 case 0xCD:
+
7522 case 0xCE:
+
7523 case 0xCF:
+
7524 case 0xD0:
+
7525 case 0xD1:
+
7526 case 0xD2:
+
7527 case 0xD3:
+
7528 case 0xD4:
+
7529 case 0xD5:
+
7530 case 0xD6:
+
7531 case 0xD7:
+
7532 case 0xD8:
+
7533 case 0xD9:
+
7534 case 0xDA:
+
7535 case 0xDB:
+
7536 case 0xDC:
+
7537 case 0xDD:
+
7538 case 0xDE:
+
7539 case 0xDF:
+
7540 {
+
7541 if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({ 0x80, 0xBF }))) {
+
7542 return token_type::parse_error;
+
7543 }
+
7544 break;
+
7545 }
+
7546
+
7547 // U+0800..U+0FFF: bytes E0 A0..BF 80..BF
+
7548 case 0xE0:
+
7549 {
+
7550 if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({ 0xA0, 0xBF, 0x80, 0xBF })))) {
+
7551 return token_type::parse_error;
+
7552 }
+
7553 break;
+
7554 }
+
7555
+
7556 // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF
+
7557 // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF
+
7558 case 0xE1:
+
7559 case 0xE2:
+
7560 case 0xE3:
+
7561 case 0xE4:
+
7562 case 0xE5:
+
7563 case 0xE6:
+
7564 case 0xE7:
+
7565 case 0xE8:
+
7566 case 0xE9:
+
7567 case 0xEA:
+
7568 case 0xEB:
+
7569 case 0xEC:
+
7570 case 0xEE:
+
7571 case 0xEF:
+
7572 {
+
7573 if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({ 0x80, 0xBF, 0x80, 0xBF })))) {
+
7574 return token_type::parse_error;
+
7575 }
+
7576 break;
+
7577 }
+
7578
+
7579 // U+D000..U+D7FF: bytes ED 80..9F 80..BF
+
7580 case 0xED:
+
7581 {
+
7582 if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({ 0x80, 0x9F, 0x80, 0xBF })))) {
+
7583 return token_type::parse_error;
+
7584 }
+
7585 break;
+
7586 }
+
7587
+
7588 // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF
+
7589 case 0xF0:
+
7590 {
+
7591 if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({ 0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF })))) {
+
7592 return token_type::parse_error;
+
7593 }
+
7594 break;
+
7595 }
+
7596
+
7597 // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF
+
7598 case 0xF1:
+
7599 case 0xF2:
+
7600 case 0xF3:
+
7601 {
+
7602 if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({ 0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF })))) {
+
7603 return token_type::parse_error;
+
7604 }
+
7605 break;
+
7606 }
+
7607
+
7608 // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
+
7609 case 0xF4:
+
7610 {
+
7611 if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({ 0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF })))) {
+
7612 return token_type::parse_error;
+
7613 }
+
7614 break;
+
7615 }
+
7616
+
7617 // the remaining bytes (80..C1 and F5..FF) are ill-formed
+
7618 default:
+
7619 {
+
7620 error_message = "invalid string: ill-formed UTF-8 byte";
+
7621 return token_type::parse_error;
+
7622 }
+
7623 }
+
7624 }
+
7625 }
+
7626
+
7631 bool scan_comment() {
+
7632 switch (get()) {
+
7633 // single-line comments skip input until a newline or EOF is read
+
7634 case '/':
+
7635 {
+
7636 while (true) {
+
7637 switch (get()) {
+
7638 case '\n':
+
7639 case '\r':
+ +
7641 case '\0':
+
7642 return true;
+
7643
+
7644 default:
+
7645 break;
+
7646 }
+
7647 }
+
7648
+
7649 JSON_HEDLEY_UNREACHABLE();
+
7650 }
+
7651
+
7652 // multi-line comments skip input until */ is read
+
7653 case '*':
+
7654 {
+
7655 while (true) {
+
7656 switch (get()) {
+ +
7658 case '\0':
+
7659 {
+
7660 error_message = "invalid comment; missing closing '*/'";
+
7661 return false;
+
7662 }
+
7663
+
7664 case '*':
+
7665 {
+
7666 switch (get()) {
+
7667 case '/':
+
7668 return true;
+
7669
+
7670 default:
+
7671 {
+
7672 unget();
+
7673 continue;
+
7674 }
+
7675 }
+
7676 }
+
7677
+
7678 default:
+
7679 continue;
+
7680 }
+
7681 }
+
7682
+
7683 JSON_HEDLEY_UNREACHABLE();
+
7684 }
+
7685
+
7686 // unexpected character after reading '/'
+
7687 default:
+
7688 {
+
7689 error_message = "invalid comment; expecting '/' or '*' after '/'";
+
7690 return false;
+
7691 }
+
7692 }
+
7693 }
+
7694
+
7695 JSON_HEDLEY_NON_NULL(2)
+
7696 static void strtof(float& f, const char* str, char** endptr) noexcept {
+
7697 f = std::strtof(str, endptr);
+
7698 }
+
7699
+
7700 JSON_HEDLEY_NON_NULL(2)
+
7701 static void strtof(double& f, const char* str, char** endptr) noexcept {
+
7702 f = std::strtod(str, endptr);
+
7703 }
+
7704
+
7705 JSON_HEDLEY_NON_NULL(2)
+
7706 static void strtof(long double& f, const char* str, char** endptr) noexcept {
+
7707 f = std::strtold(str, endptr);
+
7708 }
+
7709
+
7750 token_type scan_number() // lgtm [cpp/use-of-goto] `goto` is used in this function to implement the number-parsing state machine described above. By design, any finite input will eventually reach the "done" state or return token_type::parse_error. In each intermediate state, 1 byte of the input is appended to the token_buffer vector, and only the already initialized variables token_buffer, number_type, and error_message are manipulated.
+
7751 {
+
7752 // reset token_buffer to store the number's bytes
+
7753 reset();
+
7754
+
7755 // the type of the parsed number; initially set to unsigned; will be
+
7756 // changed if minus sign, decimal point, or exponent is read
+
7757 token_type number_type = token_type::value_unsigned;
+
7758
+
7759 // state (init): we just found out we need to scan a number
+
7760 switch (current) {
+
7761 case '-':
+
7762 {
+
7763 add(current);
+
7764 goto scan_number_minus;
+
7765 }
+
7766
+
7767 case '0':
+
7768 {
+
7769 add(current);
+
7770 goto scan_number_zero;
+
7771 }
+
7772
+
7773 case '1':
+
7774 case '2':
+
7775 case '3':
+
7776 case '4':
+
7777 case '5':
+
7778 case '6':
+
7779 case '7':
+
7780 case '8':
+
7781 case '9':
+
7782 {
+
7783 add(current);
+
7784 goto scan_number_any1;
+
7785 }
+
7786
+
7787 // all other characters are rejected outside scan_number()
+
7788 default: // LCOV_EXCL_LINE
+
7789 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
7790 }
+
7791
+
7792 scan_number_minus:
+
7793 // state: we just parsed a leading minus sign
+
7794 number_type = token_type::value_integer;
+
7795 switch (get()) {
+
7796 case '0':
+
7797 {
+
7798 add(current);
+
7799 goto scan_number_zero;
+
7800 }
+
7801
+
7802 case '1':
+
7803 case '2':
+
7804 case '3':
+
7805 case '4':
+
7806 case '5':
+
7807 case '6':
+
7808 case '7':
+
7809 case '8':
+
7810 case '9':
+
7811 {
+
7812 add(current);
+
7813 goto scan_number_any1;
+
7814 }
+
7815
+
7816 default:
+
7817 {
+
7818 error_message = "invalid number; expected digit after '-'";
+
7819 return token_type::parse_error;
+
7820 }
+
7821 }
+
7822
+
7823 scan_number_zero:
+
7824 // state: we just parse a zero (maybe with a leading minus sign)
+
7825 switch (get()) {
+
7826 case '.':
+
7827 {
+
7828 add(decimal_point_char);
+
7829 decimal_point_position = token_buffer.size() - 1;
+
7830 goto scan_number_decimal1;
+
7831 }
+
7832
+
7833 case 'e':
+
7834 case 'E':
+
7835 {
+
7836 add(current);
+
7837 goto scan_number_exponent;
+
7838 }
+
7839
+
7840 default:
+
7841 goto scan_number_done;
+
7842 }
+
7843
+
7844 scan_number_any1:
+
7845 // state: we just parsed a number 0-9 (maybe with a leading minus sign)
+
7846 switch (get()) {
+
7847 case '0':
+
7848 case '1':
+
7849 case '2':
+
7850 case '3':
+
7851 case '4':
+
7852 case '5':
+
7853 case '6':
+
7854 case '7':
+
7855 case '8':
+
7856 case '9':
+
7857 {
+
7858 add(current);
+
7859 goto scan_number_any1;
+
7860 }
+
7861
+
7862 case '.':
+
7863 {
+
7864 add(decimal_point_char);
+
7865 decimal_point_position = token_buffer.size() - 1;
+
7866 goto scan_number_decimal1;
+
7867 }
+
7868
+
7869 case 'e':
+
7870 case 'E':
+
7871 {
+
7872 add(current);
+
7873 goto scan_number_exponent;
+
7874 }
+
7875
+
7876 default:
+
7877 goto scan_number_done;
+
7878 }
+
7879
+
7880 scan_number_decimal1:
+
7881 // state: we just parsed a decimal point
+
7882 number_type = token_type::value_float;
+
7883 switch (get()) {
+
7884 case '0':
+
7885 case '1':
+
7886 case '2':
+
7887 case '3':
+
7888 case '4':
+
7889 case '5':
+
7890 case '6':
+
7891 case '7':
+
7892 case '8':
+
7893 case '9':
+
7894 {
+
7895 add(current);
+
7896 goto scan_number_decimal2;
+
7897 }
+
7898
+
7899 default:
+
7900 {
+
7901 error_message = "invalid number; expected digit after '.'";
+
7902 return token_type::parse_error;
+
7903 }
+
7904 }
+
7905
+
7906 scan_number_decimal2:
+
7907 // we just parsed at least one number after a decimal point
+
7908 switch (get()) {
+
7909 case '0':
+
7910 case '1':
+
7911 case '2':
+
7912 case '3':
+
7913 case '4':
+
7914 case '5':
+
7915 case '6':
+
7916 case '7':
+
7917 case '8':
+
7918 case '9':
+
7919 {
+
7920 add(current);
+
7921 goto scan_number_decimal2;
+
7922 }
+
7923
+
7924 case 'e':
+
7925 case 'E':
+
7926 {
+
7927 add(current);
+
7928 goto scan_number_exponent;
+
7929 }
+
7930
+
7931 default:
+
7932 goto scan_number_done;
+
7933 }
+
7934
+
7935 scan_number_exponent:
+
7936 // we just parsed an exponent
+
7937 number_type = token_type::value_float;
+
7938 switch (get()) {
+
7939 case '+':
+
7940 case '-':
+
7941 {
+
7942 add(current);
+
7943 goto scan_number_sign;
+
7944 }
+
7945
+
7946 case '0':
+
7947 case '1':
+
7948 case '2':
+
7949 case '3':
+
7950 case '4':
+
7951 case '5':
+
7952 case '6':
+
7953 case '7':
+
7954 case '8':
+
7955 case '9':
+
7956 {
+
7957 add(current);
+
7958 goto scan_number_any2;
+
7959 }
+
7960
+
7961 default:
+
7962 {
+
7963 error_message =
+
7964 "invalid number; expected '+', '-', or digit after exponent";
+
7965 return token_type::parse_error;
+
7966 }
+
7967 }
+
7968
+
7969 scan_number_sign:
+
7970 // we just parsed an exponent sign
+
7971 switch (get()) {
+
7972 case '0':
+
7973 case '1':
+
7974 case '2':
+
7975 case '3':
+
7976 case '4':
+
7977 case '5':
+
7978 case '6':
+
7979 case '7':
+
7980 case '8':
+
7981 case '9':
+
7982 {
+
7983 add(current);
+
7984 goto scan_number_any2;
+
7985 }
+
7986
+
7987 default:
+
7988 {
+
7989 error_message = "invalid number; expected digit after exponent sign";
+
7990 return token_type::parse_error;
+
7991 }
+
7992 }
+
7993
+
7994 scan_number_any2:
+
7995 // we just parsed a number after the exponent or exponent sign
+
7996 switch (get()) {
+
7997 case '0':
+
7998 case '1':
+
7999 case '2':
+
8000 case '3':
+
8001 case '4':
+
8002 case '5':
+
8003 case '6':
+
8004 case '7':
+
8005 case '8':
+
8006 case '9':
+
8007 {
+
8008 add(current);
+
8009 goto scan_number_any2;
+
8010 }
+
8011
+
8012 default:
+
8013 goto scan_number_done;
+
8014 }
+
8015
+
8016 scan_number_done:
+
8017 // unget the character after the number (we only read it to know that
+
8018 // we are done scanning a number)
+
8019 unget();
+
8020
+
8021 char* endptr = nullptr; // NOLINT(misc-const-correctness,cppcoreguidelines-pro-type-vararg,hicpp-vararg)
+
8022 errno = 0;
+
8023
+
8024 // try to parse integers first and fall back to floats
+
8025 if (number_type == token_type::value_unsigned) {
+
8026 const auto x = std::strtoull(token_buffer.data(), &endptr, 10);
+
8027
+
8028 // we checked the number format before
+
8029 JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
+
8030
+
8031 if (errno != ERANGE) {
+
8032 value_unsigned = static_cast<number_unsigned_t>(x);
+
8033 if (value_unsigned == x) {
+
8034 return token_type::value_unsigned;
+
8035 }
+
8036 }
+
8037 }
+
8038 else if (number_type == token_type::value_integer) {
+
8039 const auto x = std::strtoll(token_buffer.data(), &endptr, 10);
+
8040
+
8041 // we checked the number format before
+
8042 JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
+
8043
+
8044 if (errno != ERANGE) {
+
8045 value_integer = static_cast<number_integer_t>(x);
+
8046 if (value_integer == x) {
+
8047 return token_type::value_integer;
+
8048 }
+
8049 }
+
8050 }
+
8051
+
8052 // this code is reached if we parse a floating-point number or if an
+
8053 // integer conversion above failed
+
8054 strtof(value_float, token_buffer.data(), &endptr);
+
8055
+
8056 // we checked the number format before
+
8057 JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size());
+
8058
+
8059 return token_type::value_float;
+
8060 }
+
8061
+
8067 JSON_HEDLEY_NON_NULL(2)
+
8068 token_type scan_literal(const char_type* literal_text, const std::size_t length,
+
8069 token_type return_type) {
+
8070 JSON_ASSERT(char_traits<char_type>::to_char_type(current) == literal_text[0]);
+
8071 for (std::size_t i = 1; i < length; ++i) {
+
8072 if (JSON_HEDLEY_UNLIKELY(char_traits<char_type>::to_char_type(get()) != literal_text[i])) {
+
8073 error_message = "invalid literal";
+
8074 return token_type::parse_error;
+
8075 }
+
8076 }
+
8077 return return_type;
+
8078 }
+
8079
+
8081 // input management
+
8083
+
8085 void reset() noexcept {
+
8086 token_buffer.clear();
+
8087 token_string.clear();
+
8088 decimal_point_position = std::string::npos;
+
8089 token_string.push_back(char_traits<char_type>::to_char_type(current));
+
8090 }
+
8091
+
8092 /*
+
8093 @brief get next character from the input
+
8094
+
8095 This function provides the interface to the used input adapter. It does
+
8096 not throw in case the input reached EOF, but returns a
+
8097 `char_traits<char>::eof()` in that case. Stores the scanned characters
+
8098 for use in error messages.
+
8099
+
8100 @return character read from the input
+
8101 */
+
8102 char_int_type get() {
+
8103 ++position.chars_read_total;
+
8104 ++position.chars_read_current_line;
+
8105
+
8106 if (next_unget) {
+
8107 // only reset the next_unget variable and work with current
+
8108 next_unget = false;
+
8109 }
+
8110 else {
+
8111 current = ia.get_character();
+
8112 }
+
8113
+
8114 if (JSON_HEDLEY_LIKELY(current != char_traits<char_type>::eof())) {
+
8115 token_string.push_back(char_traits<char_type>::to_char_type(current));
+
8116 }
+
8117
+
8118 if (current == '\n') {
+
8119 ++position.lines_read;
+
8120 position.chars_read_current_line = 0;
+
8121 }
+
8122
+
8123 return current;
+
8124 }
+
8125
+
8134 void unget() {
+
8135 next_unget = true;
+
8136
+
8137 --position.chars_read_total;
+
8138
+
8139 // in case we "unget" a newline, we have to also decrement the lines_read
+
8140 if (position.chars_read_current_line == 0) {
+
8141 if (position.lines_read > 0) {
+
8142 --position.lines_read;
+
8143 }
+
8144 }
+
8145 else {
+
8146 --position.chars_read_current_line;
+
8147 }
+
8148
+
8149 if (JSON_HEDLEY_LIKELY(current != char_traits<char_type>::eof())) {
+
8150 JSON_ASSERT(!token_string.empty());
+
8151 token_string.pop_back();
+
8152 }
+
8153 }
+
8154
+
8156 void add(char_int_type c) {
+
8157 token_buffer.push_back(static_cast<typename string_t::value_type>(c));
+
8158 }
+
8159
+
8160 public:
+
8162 // value getters
+
8164
+
+
8166 constexpr number_integer_t get_number_integer() const noexcept {
+
8167 return value_integer;
+
8168 }
+
+
8169
+
+
8171 constexpr number_unsigned_t get_number_unsigned() const noexcept {
+
8172 return value_unsigned;
+
8173 }
+
+
8174
+
+
8176 constexpr number_float_t get_number_float() const noexcept {
+
8177 return value_float;
+
8178 }
+
+
8179
+
+
8181 string_t& get_string() {
+
8182 // translate decimal points from locale back to '.' (#4084)
+
8183 if (decimal_point_char != '.' && decimal_point_position != std::string::npos) {
+
8184 token_buffer[decimal_point_position] = '.';
+
8185 }
+
8186 return token_buffer;
+
8187 }
+
+
8188
+
8190 // diagnostics
+
8192
+
+
8194 constexpr position_t get_position() const noexcept {
+
8195 return position;
+
8196 }
+
+
8197
+
+
8201 std::string get_token_string() const {
+
8202 // escape control characters
+
8203 std::string result;
+
8204 for (const auto c : token_string) {
+
8205 if (static_cast<unsigned char>(c) <= '\x1F') {
+
8206 // escape control characters
+
8207 std::array<char, 9> cs{ {} };
+
8208 static_cast<void>((std::snprintf)(cs.data(), cs.size(), "<U+%.4X>", static_cast<unsigned char>(c))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
+
8209 result += cs.data();
+
8210 }
+
8211 else {
+
8212 // add character as is
+
8213 result.push_back(static_cast<std::string::value_type>(c));
+
8214 }
+
8215 }
+
8216
+
8217 return result;
+
8218 }
+
+
8219
+
8221 JSON_HEDLEY_RETURNS_NON_NULL
+
+
8222 constexpr const char* get_error_message() const noexcept {
+
8223 return error_message;
+
8224 }
+
+
8225
+
8227 // actual scanner
+
8229
+
+
8234 bool skip_bom() {
+
8235 if (get() == 0xEF) {
+
8236 // check if we completely parse the BOM
+
8237 return get() == 0xBB && get() == 0xBF;
+
8238 }
+
8239
+
8240 // the first character is not the beginning of the BOM; unget it to
+
8241 // process is later
+
8242 unget();
+
8243 return true;
+
8244 }
+
+
8245
+
8246 void skip_whitespace() {
+
8247 do {
+
8248 get();
+
8249 } while (current == ' ' || current == '\t' || current == '\n' || current == '\r');
+
8250 }
+
8251
+
8252 token_type scan() {
+
8253 // initially, skip the BOM
+
8254 if (position.chars_read_total == 0 && !skip_bom()) {
+
8255 error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given";
+
8256 return token_type::parse_error;
+
8257 }
+
8258
+
8259 // read the next character and ignore whitespace
+
8260 skip_whitespace();
+
8261
+
8262 // ignore comments
+
8263 while (ignore_comments && current == '/') {
+
8264 if (!scan_comment()) {
+
8265 return token_type::parse_error;
+
8266 }
+
8267
+
8268 // skip following whitespace
+
8269 skip_whitespace();
+
8270 }
+
8271
+
8272 switch (current) {
+
8273 // structural characters
+
8274 case '[':
+
8275 return token_type::begin_array;
+
8276 case ']':
+
8277 return token_type::end_array;
+
8278 case '{':
+
8279 return token_type::begin_object;
+
8280 case '}':
+
8281 return token_type::end_object;
+
8282 case ':':
+
8283 return token_type::name_separator;
+
8284 case ',':
+
8285 return token_type::value_separator;
+
8286
+
8287 // literals
+
8288 case 't':
+
8289 {
+
8290 std::array<char_type, 4> true_literal = { {static_cast<char_type>('t'), static_cast<char_type>('r'), static_cast<char_type>('u'), static_cast<char_type>('e')} };
+
8291 return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);
+
8292 }
+
8293 case 'f':
+
8294 {
+
8295 std::array<char_type, 5> false_literal = { {static_cast<char_type>('f'), static_cast<char_type>('a'), static_cast<char_type>('l'), static_cast<char_type>('s'), static_cast<char_type>('e')} };
+
8296 return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);
+
8297 }
+
8298 case 'n':
+
8299 {
+
8300 std::array<char_type, 4> null_literal = { {static_cast<char_type>('n'), static_cast<char_type>('u'), static_cast<char_type>('l'), static_cast<char_type>('l')} };
+
8301 return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);
+
8302 }
+
8303
+
8304 // string
+
8305 case '\"':
+
8306 return scan_string();
+
8307
+
8308 // number
+
8309 case '-':
+
8310 case '0':
+
8311 case '1':
+
8312 case '2':
+
8313 case '3':
+
8314 case '4':
+
8315 case '5':
+
8316 case '6':
+
8317 case '7':
+
8318 case '8':
+
8319 case '9':
+
8320 return scan_number();
+
8321
+
8322 // end of input (the null byte is needed when parsing from
+
8323 // string literals)
+
8324 case '\0':
+
8325 case char_traits<char_type>::eof():
+
8326 return token_type::end_of_input;
+
8327
+
8328 // error
+
8329 default:
+
8330 error_message = "invalid literal";
+
8331 return token_type::parse_error;
+
8332 }
+
8333 }
+
8334
+
8335 private:
+
8337 InputAdapterType ia;
+
8338
+
8340 const bool ignore_comments = false;
+
8341
+
8343 char_int_type current = char_traits<char_type>::eof();
+
8344
+
8346 bool next_unget = false;
+
8347
+
8349 position_t position{};
+
8350
+
8352 std::vector<char_type> token_string{};
+
8353
+
8355 string_t token_buffer{};
+
8356
+
8358 const char* error_message = "";
+
8359
+
8360 // number values
+
8361 number_integer_t value_integer = 0;
+
8362 number_unsigned_t value_unsigned = 0;
+
8363 number_float_t value_float = 0;
+
8364
+
8366 const char_int_type decimal_point_char = '.';
+
8368 std::size_t decimal_point_position = std::string::npos;
+
8369 };
+
+
8370
+
8371} // namespace detail
+
8372NLOHMANN_JSON_NAMESPACE_END
+
8373
+
8374// #include <nlohmann/detail/macro_scope.hpp>
+
8375
+
8376// #include <nlohmann/detail/string_concat.hpp>
+
8377
+
8378NLOHMANN_JSON_NAMESPACE_BEGIN
+
8379
+
8388template<typename BasicJsonType>
+
+
8389struct json_sax {
+
8390 using number_integer_t = typename BasicJsonType::number_integer_t;
+
8391 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
8392 using number_float_t = typename BasicJsonType::number_float_t;
+
8393 using string_t = typename BasicJsonType::string_t;
+
8394 using binary_t = typename BasicJsonType::binary_t;
+
8395
+
8400 virtual bool null() = 0;
+
8401
+
8407 virtual bool boolean(bool val) = 0;
+
8408
+
8414 virtual bool number_integer(number_integer_t val) = 0;
+
8415
+
8421 virtual bool number_unsigned(number_unsigned_t val) = 0;
+
8422
+
8429 virtual bool number_float(number_float_t val, const string_t& s) = 0;
+
8430
+
8437 virtual bool string(string_t& val) = 0;
+
8438
+
8445 virtual bool binary(binary_t& val) = 0;
+
8446
+
8453 virtual bool start_object(std::size_t elements) = 0;
+
8454
+
8461 virtual bool key(string_t& val) = 0;
+
8462
+
8467 virtual bool end_object() = 0;
+
8468
+
8475 virtual bool start_array(std::size_t elements) = 0;
+
8476
+
8481 virtual bool end_array() = 0;
+
8482
+
8490 virtual bool parse_error(std::size_t position,
+
8491 const std::string& last_token,
+
8492 const detail::exception& ex) = 0;
+
8493
+
8494 json_sax() = default;
+
8495 json_sax(const json_sax&) = default;
+
8496 json_sax(json_sax&&) noexcept = default;
+
8497 json_sax& operator=(const json_sax&) = default;
+
8498 json_sax& operator=(json_sax&&) noexcept = default;
+
8499 virtual ~json_sax() = default;
+
8500};
+
+
8501
+
8502namespace detail {
+
8503 constexpr std::size_t unknown_size() {
+
8504 return (std::numeric_limits<std::size_t>::max)();
+
8505 }
+
8506
+
8520 template<typename BasicJsonType, typename InputAdapterType>
+
+ +
8522 public:
+
8523 using number_integer_t = typename BasicJsonType::number_integer_t;
+
8524 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
8525 using number_float_t = typename BasicJsonType::number_float_t;
+
8526 using string_t = typename BasicJsonType::string_t;
+
8527 using binary_t = typename BasicJsonType::binary_t;
+ +
8529
+
+
8535 explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true, lexer_t* lexer_ = nullptr)
+
8536 : root(r), allow_exceptions(allow_exceptions_), m_lexer_ref(lexer_) {}
+
+
8537
+
8538 // make class move-only
+ +
8540 json_sax_dom_parser(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
+
8541 json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete;
+
8542 json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
+
8543 ~json_sax_dom_parser() = default;
+
8544
+
8545 bool null() {
+
8546 handle_value(nullptr);
+
8547 return true;
+
8548 }
+
8549
+
8550 bool boolean(bool val) {
+
8551 handle_value(val);
+
8552 return true;
+
8553 }
+
8554
+
8555 bool number_integer(number_integer_t val) {
+
8556 handle_value(val);
+
8557 return true;
+
8558 }
+
8559
+
8560 bool number_unsigned(number_unsigned_t val) {
+
8561 handle_value(val);
+
8562 return true;
+
8563 }
+
8564
+
8565 bool number_float(number_float_t val, const string_t& /*unused*/) {
+
8566 handle_value(val);
+
8567 return true;
+
8568 }
+
8569
+
8570 bool string(string_t& val) {
+
8571 handle_value(val);
+
8572 return true;
+
8573 }
+
8574
+
8575 bool binary(binary_t& val) {
+
8576 handle_value(std::move(val));
+
8577 return true;
+
8578 }
+
8579
+
8580 bool start_object(std::size_t len) {
+
8581 ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
+
8582
+
8583#if JSON_DIAGNOSTIC_POSITIONS
+
8584 // Manually set the start position of the object here.
+
8585 // Ensure this is after the call to handle_value to ensure correct start position.
+
8586 if (m_lexer_ref) {
+
8587 // Lexer has read the first character of the object, so
+
8588 // subtract 1 from the position to get the correct start position.
+
8589 ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
+
8590 }
+
8591#endif
+
8592
+
8593 if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size())) {
+
8594 JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back()));
+
8595 }
+
8596
+
8597 return true;
+
8598 }
+
8599
+
8600 bool key(string_t& val) {
+
8601 JSON_ASSERT(!ref_stack.empty());
+
8602 JSON_ASSERT(ref_stack.back()->is_object());
+
8603
+
8604 // add null at the given key and store the reference for later
+
8605 object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val));
+
8606 return true;
+
8607 }
+
8608
+
8609 bool end_object() {
+
8610 JSON_ASSERT(!ref_stack.empty());
+
8611 JSON_ASSERT(ref_stack.back()->is_object());
+
8612
+
8613#if JSON_DIAGNOSTIC_POSITIONS
+
8614 if (m_lexer_ref) {
+
8615 // Lexer's position is past the closing brace, so set that as the end position.
+
8616 ref_stack.back()->end_position = m_lexer_ref->get_position();
+
8617 }
+
8618#endif
+
8619
+
8620 ref_stack.back()->set_parents();
+
8621 ref_stack.pop_back();
+
8622 return true;
+
8623 }
+
8624
+
8625 bool start_array(std::size_t len) {
+
8626 ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
+
8627
+
8628#if JSON_DIAGNOSTIC_POSITIONS
+
8629 // Manually set the start position of the array here.
+
8630 // Ensure this is after the call to handle_value to ensure correct start position.
+
8631 if (m_lexer_ref) {
+
8632 ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
+
8633 }
+
8634#endif
+
8635
+
8636 if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size())) {
+
8637 JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back()));
+
8638 }
+
8639
+
8640 return true;
+
8641 }
+
8642
+
8643 bool end_array() {
+
8644 JSON_ASSERT(!ref_stack.empty());
+
8645 JSON_ASSERT(ref_stack.back()->is_array());
+
8646
+
8647#if JSON_DIAGNOSTIC_POSITIONS
+
8648 if (m_lexer_ref) {
+
8649 // Lexer's position is past the closing bracket, so set that as the end position.
+
8650 ref_stack.back()->end_position = m_lexer_ref->get_position();
+
8651 }
+
8652#endif
+
8653
+
8654 ref_stack.back()->set_parents();
+
8655 ref_stack.pop_back();
+
8656 return true;
+
8657 }
+
8658
+
8659 template<class Exception>
+
8660 bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,
+
8661 const Exception& ex) {
+
8662 errored = true;
+
8663 static_cast<void>(ex);
+
8664 if (allow_exceptions) {
+
8665 JSON_THROW(ex);
+
8666 }
+
8667 return false;
+
8668 }
+
8669
+
8670 constexpr bool is_errored() const {
+
8671 return errored;
+
8672 }
+
8673
+
8674 private:
+
8675
+
8676#if JSON_DIAGNOSTIC_POSITIONS
+
8677 void handle_diagnostic_positions_for_json_value(BasicJsonType& v) {
+
8678 if (m_lexer_ref) {
+
8679 // Lexer has read past the current field value, so set the end position to the current position.
+
8680 // The start position will be set below based on the length of the string representation
+
8681 // of the value.
+
8682 v.end_position = m_lexer_ref->get_position();
+
8683
+
8684 switch (v.type()) {
+
8685 case value_t::boolean:
+
8686 {
+
8687 // 4 and 5 are the string length of "true" and "false"
+
8688 v.start_position = v.end_position - (v.m_data.m_value.boolean ? 4 : 5);
+
8689 break;
+
8690 }
+
8691
+
8692 case value_t::null:
+
8693 {
+
8694 // 4 is the string length of "null"
+
8695 v.start_position = v.end_position - 4;
+
8696 break;
+
8697 }
+
8698
+
8699 case value_t::string:
+
8700 {
+
8701 // include the length of the quotes, which is 2
+
8702 v.start_position = v.end_position - v.m_data.m_value.string->size() - 2;
+
8703 break;
+
8704 }
+
8705
+
8706 // As we handle the start and end positions for values created during parsing,
+
8707 // we do not expect the following value type to be called. Regardless, set the positions
+
8708 // in case this is created manually or through a different constructor. Exclude from lcov
+
8709 // since the exact condition of this switch is esoteric.
+
8710 // LCOV_EXCL_START
+
8711 case value_t::discarded:
+
8712 {
+
8713 v.end_position = std::string::npos;
+
8714 v.start_position = v.end_position;
+
8715 break;
+
8716 }
+
8717 // LCOV_EXCL_STOP
+
8718 case value_t::binary:
+
8719 case value_t::number_integer:
+
8720 case value_t::number_unsigned:
+
8721 case value_t::number_float:
+
8722 {
+
8723 v.start_position = v.end_position - m_lexer_ref->get_string().size();
+
8724 break;
+
8725 }
+
8726 case value_t::object:
+
8727 case value_t::array:
+
8728 {
+
8729 // object and array are handled in start_object() and start_array() handlers
+
8730 // skip setting the values here.
+
8731 break;
+
8732 }
+
8733 default: // LCOV_EXCL_LINE
+
8734 // Handle all possible types discretely, default handler should never be reached.
+
8735 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert,-warnings-as-errors) LCOV_EXCL_LINE
+
8736 }
+
8737 }
+
8738 }
+
8739#endif
+
8740
+
8747 template<typename Value>
+
8748 JSON_HEDLEY_RETURNS_NON_NULL
+
8749 BasicJsonType* handle_value(Value&& v) {
+
8750 if (ref_stack.empty()) {
+
8751 root = BasicJsonType(std::forward<Value>(v));
+
8752
+
8753#if JSON_DIAGNOSTIC_POSITIONS
+
8754 handle_diagnostic_positions_for_json_value(root);
+
8755#endif
+
8756
+
8757 return &root;
+
8758 }
+
8759
+
8760 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
+
8761
+
8762 if (ref_stack.back()->is_array()) {
+
8763 ref_stack.back()->m_data.m_value.array->emplace_back(std::forward<Value>(v));
+
8764
+
8765#if JSON_DIAGNOSTIC_POSITIONS
+
8766 handle_diagnostic_positions_for_json_value(ref_stack.back()->m_data.m_value.array->back());
+
8767#endif
+
8768
+
8769 return &(ref_stack.back()->m_data.m_value.array->back());
+
8770 }
+
8771
+
8772 JSON_ASSERT(ref_stack.back()->is_object());
+
8773 JSON_ASSERT(object_element);
+
8774 *object_element = BasicJsonType(std::forward<Value>(v));
+
8775
+
8776#if JSON_DIAGNOSTIC_POSITIONS
+
8777 handle_diagnostic_positions_for_json_value(*object_element);
+
8778#endif
+
8779
+
8780 return object_element;
+
8781 }
+
8782
+
8784 BasicJsonType& root;
+
8786 std::vector<BasicJsonType*> ref_stack{};
+
8788 BasicJsonType* object_element = nullptr;
+
8790 bool errored = false;
+
8792 const bool allow_exceptions = true;
+
8794 lexer_t* m_lexer_ref = nullptr;
+
8795 };
+
+
8796
+
8797 template<typename BasicJsonType, typename InputAdapterType>
+
+
8798 class json_sax_dom_callback_parser {
+
8799 public:
+
8800 using number_integer_t = typename BasicJsonType::number_integer_t;
+
8801 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
8802 using number_float_t = typename BasicJsonType::number_float_t;
+
8803 using string_t = typename BasicJsonType::string_t;
+
8804 using binary_t = typename BasicJsonType::binary_t;
+
8805 using parser_callback_t = typename BasicJsonType::parser_callback_t;
+
8806 using parse_event_t = typename BasicJsonType::parse_event_t;
+ +
8808
+
8809 json_sax_dom_callback_parser(BasicJsonType& r,
+
8810 parser_callback_t cb,
+
8811 const bool allow_exceptions_ = true,
+
8812 lexer_t* lexer_ = nullptr)
+
8813 : root(r), callback(std::move(cb)), allow_exceptions(allow_exceptions_), m_lexer_ref(lexer_) {
+
8814 keep_stack.push_back(true);
+
8815 }
+
8816
+
8817 // make class move-only
+
8818 json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete;
+
8819 json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
+
8820 json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete;
+
8821 json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
+
8822 ~json_sax_dom_callback_parser() = default;
+
8823
+
8824 bool null() {
+
8825 handle_value(nullptr);
+
8826 return true;
+
8827 }
+
8828
+
8829 bool boolean(bool val) {
+
8830 handle_value(val);
+
8831 return true;
+
8832 }
+
8833
+
8834 bool number_integer(number_integer_t val) {
+
8835 handle_value(val);
+
8836 return true;
+
8837 }
+
8838
+
8839 bool number_unsigned(number_unsigned_t val) {
+
8840 handle_value(val);
+
8841 return true;
+
8842 }
+
8843
+
8844 bool number_float(number_float_t val, const string_t& /*unused*/) {
+
8845 handle_value(val);
+
8846 return true;
+
8847 }
+
8848
+
8849 bool string(string_t& val) {
+
8850 handle_value(val);
+
8851 return true;
+
8852 }
+
8853
+
8854 bool binary(binary_t& val) {
+
8855 handle_value(std::move(val));
+
8856 return true;
+
8857 }
+
8858
+
8859 bool start_object(std::size_t len) {
+
8860 // check callback for object start
+
8861 const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::object_start, discarded);
+
8862 keep_stack.push_back(keep);
+
8863
+
8864 auto val = handle_value(BasicJsonType::value_t::object, true);
+
8865 ref_stack.push_back(val.second);
+
8866
+
8867 if (ref_stack.back()) {
+
8868
+
8869#if JSON_DIAGNOSTIC_POSITIONS
+
8870 // Manually set the start position of the object here.
+
8871 // Ensure this is after the call to handle_value to ensure correct start position.
+
8872 if (m_lexer_ref) {
+
8873 // Lexer has read the first character of the object, so
+
8874 // subtract 1 from the position to get the correct start position.
+
8875 ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
+
8876 }
+
8877#endif
+
8878
+
8879 // check object limit
+
8880 if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size())) {
+
8881 JSON_THROW(out_of_range::create(408, concat("excessive object size: ", std::to_string(len)), ref_stack.back()));
+
8882 }
+
8883 }
+
8884 return true;
+
8885 }
+
8886
+
8887 bool key(string_t& val) {
+
8888 BasicJsonType k = BasicJsonType(val);
+
8889
+
8890 // check callback for the key
+
8891 const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::key, k);
+
8892 key_keep_stack.push_back(keep);
+
8893
+
8894 // add discarded value at the given key and store the reference for later
+
8895 if (keep && ref_stack.back()) {
+
8896 object_element = &(ref_stack.back()->m_data.m_value.object->operator[](val) = discarded);
+
8897 }
+
8898
+
8899 return true;
+
8900 }
+
8901
+
8902 bool end_object() {
+
8903 if (ref_stack.back()) {
+
8904 if (!callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) {
+
8905 // discard object
+
8906 *ref_stack.back() = discarded;
+
8907
+
8908#if JSON_DIAGNOSTIC_POSITIONS
+
8909 // Set start/end positions for discarded object.
+
8910 handle_diagnostic_positions_for_json_value(*ref_stack.back());
+
8911#endif
+
8912 }
+
8913 else {
+
8914
+
8915#if JSON_DIAGNOSTIC_POSITIONS
+
8916 if (m_lexer_ref) {
+
8917 // Lexer's position is past the closing brace, so set that as the end position.
+
8918 ref_stack.back()->end_position = m_lexer_ref->get_position();
+
8919 }
+
8920#endif
+
8921
+
8922 ref_stack.back()->set_parents();
+
8923 }
+
8924 }
+
8925
+
8926 JSON_ASSERT(!ref_stack.empty());
+
8927 JSON_ASSERT(!keep_stack.empty());
+
8928 ref_stack.pop_back();
+
8929 keep_stack.pop_back();
+
8930
+
8931 if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured()) {
+
8932 // remove discarded value
+
8933 for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) {
+
8934 if (it->is_discarded()) {
+
8935 ref_stack.back()->erase(it);
+
8936 break;
+
8937 }
+
8938 }
+
8939 }
+
8940
+
8941 return true;
+
8942 }
+
8943
+
8944 bool start_array(std::size_t len) {
+
8945 const bool keep = callback(static_cast<int>(ref_stack.size()), parse_event_t::array_start, discarded);
+
8946 keep_stack.push_back(keep);
+
8947
+
8948 auto val = handle_value(BasicJsonType::value_t::array, true);
+
8949 ref_stack.push_back(val.second);
+
8950
+
8951 if (ref_stack.back()) {
+
8952
+
8953#if JSON_DIAGNOSTIC_POSITIONS
+
8954 // Manually set the start position of the array here.
+
8955 // Ensure this is after the call to handle_value to ensure correct start position.
+
8956 if (m_lexer_ref) {
+
8957 // Lexer has read the first character of the array, so
+
8958 // subtract 1 from the position to get the correct start position.
+
8959 ref_stack.back()->start_position = m_lexer_ref->get_position() - 1;
+
8960 }
+
8961#endif
+
8962
+
8963 // check array limit
+
8964 if (JSON_HEDLEY_UNLIKELY(len != detail::unknown_size() && len > ref_stack.back()->max_size())) {
+
8965 JSON_THROW(out_of_range::create(408, concat("excessive array size: ", std::to_string(len)), ref_stack.back()));
+
8966 }
+
8967 }
+
8968
+
8969 return true;
+
8970 }
+
8971
+
8972 bool end_array() {
+
8973 bool keep = true;
+
8974
+
8975 if (ref_stack.back()) {
+
8976 keep = callback(static_cast<int>(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back());
+
8977 if (keep) {
+
8978
+
8979#if JSON_DIAGNOSTIC_POSITIONS
+
8980 if (m_lexer_ref) {
+
8981 // Lexer's position is past the closing bracket, so set that as the end position.
+
8982 ref_stack.back()->end_position = m_lexer_ref->get_position();
+
8983 }
+
8984#endif
+
8985
+
8986 ref_stack.back()->set_parents();
+
8987 }
+
8988 else {
+
8989 // discard array
+
8990 *ref_stack.back() = discarded;
+
8991
+
8992#if JSON_DIAGNOSTIC_POSITIONS
+
8993 // Set start/end positions for discarded array.
+
8994 handle_diagnostic_positions_for_json_value(*ref_stack.back());
+
8995#endif
+
8996 }
+
8997 }
+
8998
+
8999 JSON_ASSERT(!ref_stack.empty());
+
9000 JSON_ASSERT(!keep_stack.empty());
+
9001 ref_stack.pop_back();
+
9002 keep_stack.pop_back();
+
9003
+
9004 // remove discarded value
+
9005 if (!keep && !ref_stack.empty() && ref_stack.back()->is_array()) {
+
9006 ref_stack.back()->m_data.m_value.array->pop_back();
+
9007 }
+
9008
+
9009 return true;
+
9010 }
+
9011
+
9012 template<class Exception>
+
9013 bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/,
+
9014 const Exception& ex) {
+
9015 errored = true;
+
9016 static_cast<void>(ex);
+
9017 if (allow_exceptions) {
+
9018 JSON_THROW(ex);
+
9019 }
+
9020 return false;
+
9021 }
+
9022
+
9023 constexpr bool is_errored() const {
+
9024 return errored;
+
9025 }
+
9026
+
9027 private:
+
9028
+
9029#if JSON_DIAGNOSTIC_POSITIONS
+
9030 void handle_diagnostic_positions_for_json_value(BasicJsonType& v) {
+
9031 if (m_lexer_ref) {
+
9032 // Lexer has read past the current field value, so set the end position to the current position.
+
9033 // The start position will be set below based on the length of the string representation
+
9034 // of the value.
+
9035 v.end_position = m_lexer_ref->get_position();
+
9036
+
9037 switch (v.type()) {
+
9038 case value_t::boolean:
+
9039 {
+
9040 // 4 and 5 are the string length of "true" and "false"
+
9041 v.start_position = v.end_position - (v.m_data.m_value.boolean ? 4 : 5);
+
9042 break;
+
9043 }
+
9044
+
9045 case value_t::null:
+
9046 {
+
9047 // 4 is the string length of "null"
+
9048 v.start_position = v.end_position - 4;
+
9049 break;
+
9050 }
+
9051
+
9052 case value_t::string:
+
9053 {
+
9054 // include the length of the quotes, which is 2
+
9055 v.start_position = v.end_position - v.m_data.m_value.string->size() - 2;
+
9056 break;
+
9057 }
+
9058
+
9059 case value_t::discarded:
+
9060 {
+
9061 v.end_position = std::string::npos;
+
9062 v.start_position = v.end_position;
+
9063 break;
+
9064 }
+
9065
+
9066 case value_t::binary:
+ + + +
9070 {
+
9071 v.start_position = v.end_position - m_lexer_ref->get_string().size();
+
9072 break;
+
9073 }
+
9074
+
9075 case value_t::object:
+
9076 case value_t::array:
+
9077 {
+
9078 // object and array are handled in start_object() and start_array() handlers
+
9079 // skip setting the values here.
+
9080 break;
+
9081 }
+
9082 default: // LCOV_EXCL_LINE
+
9083 // Handle all possible types discretely, default handler should never be reached.
+
9084 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert,-warnings-as-errors) LCOV_EXCL_LINE
+
9085 }
+
9086 }
+
9087 }
+
9088#endif
+
9089
+
9105 template<typename Value>
+
9106 std::pair<bool, BasicJsonType*> handle_value(Value&& v, const bool skip_callback = false) {
+
9107 JSON_ASSERT(!keep_stack.empty());
+
9108
+
9109 // do not handle this value if we know it would be added to a discarded
+
9110 // container
+
9111 if (!keep_stack.back()) {
+
9112 return { false, nullptr };
+
9113 }
+
9114
+
9115 // create value
+
9116 auto value = BasicJsonType(std::forward<Value>(v));
+
9117
+
9118#if JSON_DIAGNOSTIC_POSITIONS
+
9119 handle_diagnostic_positions_for_json_value(value);
+
9120#endif
+
9121
+
9122 // check callback
+
9123 const bool keep = skip_callback || callback(static_cast<int>(ref_stack.size()), parse_event_t::value, value);
+
9124
+
9125 // do not handle this value if we just learnt it shall be discarded
+
9126 if (!keep) {
+
9127 return { false, nullptr };
+
9128 }
+
9129
+
9130 if (ref_stack.empty()) {
+
9131 root = std::move(value);
+
9132 return { true, &root };
+
9133 }
+
9134
+
9135 // skip this value if we already decided to skip the parent
+
9136 // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360)
+
9137 if (!ref_stack.back()) {
+
9138 return { false, nullptr };
+
9139 }
+
9140
+
9141 // we now only expect arrays and objects
+
9142 JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object());
+
9143
+
9144 // array
+
9145 if (ref_stack.back()->is_array()) {
+
9146 ref_stack.back()->m_data.m_value.array->emplace_back(std::move(value));
+
9147 return { true, &(ref_stack.back()->m_data.m_value.array->back()) };
+
9148 }
+
9149
+
9150 // object
+
9151 JSON_ASSERT(ref_stack.back()->is_object());
+
9152 // check if we should store an element for the current key
+
9153 JSON_ASSERT(!key_keep_stack.empty());
+
9154 const bool store_element = key_keep_stack.back();
+
9155 key_keep_stack.pop_back();
+
9156
+
9157 if (!store_element) {
+
9158 return { false, nullptr };
+
9159 }
+
9160
+
9161 JSON_ASSERT(object_element);
+
9162 *object_element = std::move(value);
+
9163 return { true, object_element };
+
9164 }
+
9165
+
9167 BasicJsonType& root;
+
9169 std::vector<BasicJsonType*> ref_stack{};
+
9171 std::vector<bool> keep_stack{}; // NOLINT(readability-redundant-member-init)
+
9173 std::vector<bool> key_keep_stack{}; // NOLINT(readability-redundant-member-init)
+
9175 BasicJsonType* object_element = nullptr;
+
9177 bool errored = false;
+
9179 const parser_callback_t callback = nullptr;
+
9181 const bool allow_exceptions = true;
+
9183 BasicJsonType discarded = BasicJsonType::value_t::discarded;
+
9185 lexer_t* m_lexer_ref = nullptr;
+
9186 };
+
+
9187
+
9188 template<typename BasicJsonType>
+
+ +
9190 public:
+
9191 using number_integer_t = typename BasicJsonType::number_integer_t;
+
9192 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
9193 using number_float_t = typename BasicJsonType::number_float_t;
+
9194 using string_t = typename BasicJsonType::string_t;
+
9195 using binary_t = typename BasicJsonType::binary_t;
+
9196
+
9197 bool null() {
+
9198 return true;
+
9199 }
+
9200
+
9201 bool boolean(bool /*unused*/) {
+
9202 return true;
+
9203 }
+
9204
+
9205 bool number_integer(number_integer_t /*unused*/) {
+
9206 return true;
+
9207 }
+
9208
+
9209 bool number_unsigned(number_unsigned_t /*unused*/) {
+
9210 return true;
+
9211 }
+
9212
+
9213 bool number_float(number_float_t /*unused*/, const string_t& /*unused*/) {
+
9214 return true;
+
9215 }
+
9216
+
9217 bool string(string_t& /*unused*/) {
+
9218 return true;
+
9219 }
+
9220
+
9221 bool binary(binary_t& /*unused*/) {
+
9222 return true;
+
9223 }
+
9224
+
9225 bool start_object(std::size_t /*unused*/ = detail::unknown_size()) {
+
9226 return true;
+
9227 }
+
9228
+
9229 bool key(string_t& /*unused*/) {
+
9230 return true;
+
9231 }
+
9232
+
9233 bool end_object() {
+
9234 return true;
+
9235 }
+
9236
+
9237 bool start_array(std::size_t /*unused*/ = detail::unknown_size()) {
+
9238 return true;
+
9239 }
+
9240
+
9241 bool end_array() {
+
9242 return true;
+
9243 }
+
9244
+
9245 bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/) {
+
9246 return false;
+
9247 }
+
9248 };
+
+
9249
+
9250} // namespace detail
+
9251NLOHMANN_JSON_NAMESPACE_END
+
9252
+
9253// #include <nlohmann/detail/input/lexer.hpp>
+
9254
+
9255// #include <nlohmann/detail/macro_scope.hpp>
+
9256
+
9257// #include <nlohmann/detail/meta/is_sax.hpp>
+
9258// __ _____ _____ _____
+
9259// __| | __| | | | JSON for Modern C++
+
9260// | | |__ | | | | | | version 3.12.0
+
9261// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
9262//
+
9263// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
9264// SPDX-License-Identifier: MIT
+
9265
+
9266
+
9267
+
9268#include <cstdint> // size_t
+
9269#include <utility> // declval
+
9270#include <string> // string
+
9271
+
9272// #include <nlohmann/detail/abi_macros.hpp>
+
9273
+
9274// #include <nlohmann/detail/meta/detected.hpp>
+
9275
+
9276// #include <nlohmann/detail/meta/type_traits.hpp>
+
9277
+
9278
+
9279NLOHMANN_JSON_NAMESPACE_BEGIN
+
9280namespace detail {
+
9281
+
9282 template<typename T>
+
9283 using null_function_t = decltype(std::declval<T&>().null());
+
9284
+
9285 template<typename T>
+
9286 using boolean_function_t =
+
9287 decltype(std::declval<T&>().boolean(std::declval<bool>()));
+
9288
+
9289 template<typename T, typename Integer>
+
9290 using number_integer_function_t =
+
9291 decltype(std::declval<T&>().number_integer(std::declval<Integer>()));
+
9292
+
9293 template<typename T, typename Unsigned>
+
9294 using number_unsigned_function_t =
+
9295 decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>()));
+
9296
+
9297 template<typename T, typename Float, typename String>
+
9298 using number_float_function_t = decltype(std::declval<T&>().number_float(
+
9299 std::declval<Float>(), std::declval<const String&>()));
+
9300
+
9301 template<typename T, typename String>
+
9302 using string_function_t =
+
9303 decltype(std::declval<T&>().string(std::declval<String&>()));
+
9304
+
9305 template<typename T, typename Binary>
+
9306 using binary_function_t =
+
9307 decltype(std::declval<T&>().binary(std::declval<Binary&>()));
+
9308
+
9309 template<typename T>
+
9310 using start_object_function_t =
+
9311 decltype(std::declval<T&>().start_object(std::declval<std::size_t>()));
+
9312
+
9313 template<typename T, typename String>
+
9314 using key_function_t =
+
9315 decltype(std::declval<T&>().key(std::declval<String&>()));
+
9316
+
9317 template<typename T>
+
9318 using end_object_function_t = decltype(std::declval<T&>().end_object());
+
9319
+
9320 template<typename T>
+
9321 using start_array_function_t =
+
9322 decltype(std::declval<T&>().start_array(std::declval<std::size_t>()));
+
9323
+
9324 template<typename T>
+
9325 using end_array_function_t = decltype(std::declval<T&>().end_array());
+
9326
+
9327 template<typename T, typename Exception>
+
9328 using parse_error_function_t = decltype(std::declval<T&>().parse_error(
+
9329 std::declval<std::size_t>(), std::declval<const std::string&>(),
+
9330 std::declval<const Exception&>()));
+
9331
+
9332 template<typename SAX, typename BasicJsonType>
+
+
9333 struct is_sax {
+
9334 private:
+ +
9336 "BasicJsonType must be of type basic_json<...>");
+
9337
+
9338 using number_integer_t = typename BasicJsonType::number_integer_t;
+
9339 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
9340 using number_float_t = typename BasicJsonType::number_float_t;
+
9341 using string_t = typename BasicJsonType::string_t;
+
9342 using binary_t = typename BasicJsonType::binary_t;
+
9343 using exception_t = typename BasicJsonType::exception;
+
9344
+
9345 public:
+
9346 static constexpr bool value =
+
9347 is_detected_exact<bool, null_function_t, SAX>::value&&
+
9348 is_detected_exact<bool, boolean_function_t, SAX>::value&&
+
9349 is_detected_exact<bool, number_integer_function_t, SAX, number_integer_t>::value&&
+
9350 is_detected_exact<bool, number_unsigned_function_t, SAX, number_unsigned_t>::value&&
+
9351 is_detected_exact<bool, number_float_function_t, SAX, number_float_t, string_t>::value&&
+
9352 is_detected_exact<bool, string_function_t, SAX, string_t>::value&&
+
9353 is_detected_exact<bool, binary_function_t, SAX, binary_t>::value&&
+
9354 is_detected_exact<bool, start_object_function_t, SAX>::value&&
+
9355 is_detected_exact<bool, key_function_t, SAX, string_t>::value&&
+
9356 is_detected_exact<bool, end_object_function_t, SAX>::value&&
+
9357 is_detected_exact<bool, start_array_function_t, SAX>::value&&
+
9358 is_detected_exact<bool, end_array_function_t, SAX>::value&&
+
9359 is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value;
+
9360 };
+
+
9361
+
9362 template<typename SAX, typename BasicJsonType>
+
+ +
9364 private:
+ +
9366 "BasicJsonType must be of type basic_json<...>");
+
9367
+
9368 using number_integer_t = typename BasicJsonType::number_integer_t;
+
9369 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
9370 using number_float_t = typename BasicJsonType::number_float_t;
+
9371 using string_t = typename BasicJsonType::string_t;
+
9372 using binary_t = typename BasicJsonType::binary_t;
+
9373 using exception_t = typename BasicJsonType::exception;
+
9374
+
9375 public:
+
9376 static_assert(is_detected_exact<bool, null_function_t, SAX>::value,
+
9377 "Missing/invalid function: bool null()");
+
9378 static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,
+
9379 "Missing/invalid function: bool boolean(bool)");
+
9380 static_assert(is_detected_exact<bool, boolean_function_t, SAX>::value,
+
9381 "Missing/invalid function: bool boolean(bool)");
+
9382 static_assert(
+
9383 is_detected_exact<bool, number_integer_function_t, SAX,
+
9384 number_integer_t>::value,
+
9385 "Missing/invalid function: bool number_integer(number_integer_t)");
+
9386 static_assert(
+
9387 is_detected_exact<bool, number_unsigned_function_t, SAX,
+
9388 number_unsigned_t>::value,
+
9389 "Missing/invalid function: bool number_unsigned(number_unsigned_t)");
+
9390 static_assert(is_detected_exact<bool, number_float_function_t, SAX,
+
9391 number_float_t, string_t>::value,
+
9392 "Missing/invalid function: bool number_float(number_float_t, const string_t&)");
+
9393 static_assert(
+
9394 is_detected_exact<bool, string_function_t, SAX, string_t>::value,
+
9395 "Missing/invalid function: bool string(string_t&)");
+
9396 static_assert(
+
9397 is_detected_exact<bool, binary_function_t, SAX, binary_t>::value,
+
9398 "Missing/invalid function: bool binary(binary_t&)");
+
9399 static_assert(is_detected_exact<bool, start_object_function_t, SAX>::value,
+
9400 "Missing/invalid function: bool start_object(std::size_t)");
+
9401 static_assert(is_detected_exact<bool, key_function_t, SAX, string_t>::value,
+
9402 "Missing/invalid function: bool key(string_t&)");
+
9403 static_assert(is_detected_exact<bool, end_object_function_t, SAX>::value,
+
9404 "Missing/invalid function: bool end_object()");
+
9405 static_assert(is_detected_exact<bool, start_array_function_t, SAX>::value,
+
9406 "Missing/invalid function: bool start_array(std::size_t)");
+
9407 static_assert(is_detected_exact<bool, end_array_function_t, SAX>::value,
+
9408 "Missing/invalid function: bool end_array()");
+
9409 static_assert(
+
9410 is_detected_exact<bool, parse_error_function_t, SAX, exception_t>::value,
+
9411 "Missing/invalid function: bool parse_error(std::size_t, const "
+
9412 "std::string&, const exception&)");
+
9413 };
+
+
9414
+
9415} // namespace detail
+
9416NLOHMANN_JSON_NAMESPACE_END
+
9417
+
9418// #include <nlohmann/detail/meta/type_traits.hpp>
+
9419
+
9420// #include <nlohmann/detail/string_concat.hpp>
+
9421
+
9422// #include <nlohmann/detail/value_t.hpp>
+
9423
+
9424
+
9425NLOHMANN_JSON_NAMESPACE_BEGIN
+
9426namespace detail {
+
9427
+
+ + + + +
9433 };
+
+
9434
+
+
9442 inline bool little_endianness(int num = 1) noexcept {
+
9443 return *reinterpret_cast<char*>(&num) == 1;
+
9444 }
+
+
9445
+
9447 // binary reader //
+
9449
+
9453 template<typename BasicJsonType, typename InputAdapterType, typename SAX = json_sax_dom_parser<BasicJsonType, InputAdapterType>>
+
+ +
9455 using number_integer_t = typename BasicJsonType::number_integer_t;
+
9456 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
9457 using number_float_t = typename BasicJsonType::number_float_t;
+
9458 using string_t = typename BasicJsonType::string_t;
+
9459 using binary_t = typename BasicJsonType::binary_t;
+
9460 using json_sax_t = SAX;
+
9461 using char_type = typename InputAdapterType::char_type;
+
9462 using char_int_type = typename char_traits<char_type>::int_type;
+
9463
+
9464 public:
+
+
9470 explicit binary_reader(InputAdapterType&& adapter, const input_format_t format = input_format_t::json) noexcept : ia(std::move(adapter)), input_format(format) {
+ +
9472 }
+
+
9473
+
9474 // make class move-only
+
9475 binary_reader(const binary_reader&) = delete;
+
9476 binary_reader(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
+
9477 binary_reader& operator=(const binary_reader&) = delete;
+
9478 binary_reader& operator=(binary_reader&&) = default; // NOLINT(hicpp-noexcept-move,performance-noexcept-move-constructor)
+
9479 ~binary_reader() = default;
+
9480
+
9489 JSON_HEDLEY_NON_NULL(3)
+
+
9490 bool sax_parse(const input_format_t format,
+
9491 json_sax_t* sax_,
+
9492 const bool strict = true,
+
9493 const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) {
+
9494 sax = sax_;
+
9495 bool result = false;
+
9496
+
9497 switch (format) {
+
9498 case input_format_t::bson:
+
9499 result = parse_bson_internal();
+
9500 break;
+
9501
+
9502 case input_format_t::cbor:
+
9503 result = parse_cbor_internal(true, tag_handler);
+
9504 break;
+
9505
+
9506 case input_format_t::msgpack:
+
9507 result = parse_msgpack_internal();
+
9508 break;
+
9509
+
9510 case input_format_t::ubjson:
+
9511 case input_format_t::bjdata:
+
9512 result = parse_ubjson_internal();
+
9513 break;
+
9514
+
9515 case input_format_t::json: // LCOV_EXCL_LINE
+
9516 default: // LCOV_EXCL_LINE
+
9517 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
9518 }
+
9519
+
9520 // strict mode: next byte must be EOF
+
9521 if (result && strict) {
+
9522 if (input_format == input_format_t::ubjson || input_format == input_format_t::bjdata) {
+
9523 get_ignore_noop();
+
9524 }
+
9525 else {
+
9526 get();
+
9527 }
+
9528
+
9529 if (JSON_HEDLEY_UNLIKELY(current != char_traits<char_type>::eof())) {
+
9530 return sax->parse_error(chars_read, get_token_string(), parse_error::create(110, chars_read,
+
9531 exception_message(input_format, concat("expected end of input; last byte: 0x", get_token_string()), "value"), nullptr));
+
9532 }
+
9533 }
+
9534
+
9535 return result;
+
9536 }
+
+
9537
+
9538 private:
+
9540 // BSON //
+
9542
+
9547 bool parse_bson_internal() {
+
9548 std::int32_t document_size{};
+
9549 get_number<std::int32_t, true>(input_format_t::bson, document_size);
+
9550
+
9551 if (JSON_HEDLEY_UNLIKELY(!sax->start_object(detail::unknown_size()))) {
+
9552 return false;
+
9553 }
+
9554
+
9555 if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false))) {
+
9556 return false;
+
9557 }
+
9558
+
9559 return sax->end_object();
+
9560 }
+
9561
+
9569 bool get_bson_cstr(string_t& result) {
+
9570 auto out = std::back_inserter(result);
+
9571 while (true) {
+
9572 get();
+
9573 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring"))) {
+
9574 return false;
+
9575 }
+
9576 if (current == 0x00) {
+
9577 return true;
+
9578 }
+
9579 *out++ = static_cast<typename string_t::value_type>(current);
+
9580 }
+
9581 }
+
9582
+
9594 template<typename NumberType>
+
9595 bool get_bson_string(const NumberType len, string_t& result) {
+
9596 if (JSON_HEDLEY_UNLIKELY(len < 1)) {
+
9597 auto last_token = get_token_string();
+
9598 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
9599 exception_message(input_format_t::bson, concat("string length must be at least 1, is ", std::to_string(len)), "string"), nullptr));
+
9600 }
+
9601
+
9602 return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) && get() != char_traits<char_type>::eof();
+
9603 }
+
9604
+
9614 template<typename NumberType>
+
9615 bool get_bson_binary(const NumberType len, binary_t& result) {
+
9616 if (JSON_HEDLEY_UNLIKELY(len < 0)) {
+
9617 auto last_token = get_token_string();
+
9618 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
9619 exception_message(input_format_t::bson, concat("byte array length cannot be negative, is ", std::to_string(len)), "binary"), nullptr));
+
9620 }
+
9621
+
9622 // All BSON binary values have a subtype
+
9623 std::uint8_t subtype{};
+
9624 get_number<std::uint8_t>(input_format_t::bson, subtype);
+
9625 result.set_subtype(subtype);
+
9626
+
9627 return get_binary(input_format_t::bson, len, result);
+
9628 }
+
9629
+
9640 bool parse_bson_element_internal(const char_int_type element_type,
+
9641 const std::size_t element_type_parse_position) {
+
9642 switch (element_type) {
+
9643 case 0x01: // double
+
9644 {
+
9645 double number{};
+
9646 return get_number<double, true>(input_format_t::bson, number) && sax->number_float(static_cast<number_float_t>(number), "");
+
9647 }
+
9648
+
9649 case 0x02: // string
+
9650 {
+
9651 std::int32_t len{};
+
9652 string_t value;
+
9653 return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value);
+
9654 }
+
9655
+
9656 case 0x03: // object
+
9657 {
+
9658 return parse_bson_internal();
+
9659 }
+
9660
+
9661 case 0x04: // array
+
9662 {
+
9663 return parse_bson_array();
+
9664 }
+
9665
+
9666 case 0x05: // binary
+
9667 {
+
9668 std::int32_t len{};
+
9669 binary_t value;
+
9670 return get_number<std::int32_t, true>(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value);
+
9671 }
+
9672
+
9673 case 0x08: // boolean
+
9674 {
+
9675 return sax->boolean(get() != 0);
+
9676 }
+
9677
+
9678 case 0x0A: // null
+
9679 {
+
9680 return sax->null();
+
9681 }
+
9682
+
9683 case 0x10: // int32
+
9684 {
+
9685 std::int32_t value{};
+
9686 return get_number<std::int32_t, true>(input_format_t::bson, value) && sax->number_integer(value);
+
9687 }
+
9688
+
9689 case 0x12: // int64
+
9690 {
+
9691 std::int64_t value{};
+
9692 return get_number<std::int64_t, true>(input_format_t::bson, value) && sax->number_integer(value);
+
9693 }
+
9694
+
9695 case 0x11: // uint64
+
9696 {
+
9697 std::uint64_t value{};
+
9698 return get_number<std::uint64_t, true>(input_format_t::bson, value) && sax->number_unsigned(value);
+
9699 }
+
9700
+
9701 default: // anything else is not supported (yet)
+
9702 {
+
9703 std::array<char, 3> cr{ {} };
+
9704 static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(element_type))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
+
9705 const std::string cr_str{ cr.data() };
+
9706 return sax->parse_error(element_type_parse_position, cr_str,
+
9707 parse_error::create(114, element_type_parse_position, concat("Unsupported BSON record type 0x", cr_str), nullptr));
+
9708 }
+
9709 }
+
9710 }
+
9711
+
9724 bool parse_bson_element_list(const bool is_array) {
+
9725 string_t key;
+
9726
+
9727 while (auto element_type = get()) {
+
9728 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list"))) {
+
9729 return false;
+
9730 }
+
9731
+
9732 const std::size_t element_type_parse_position = chars_read;
+
9733 if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key))) {
+
9734 return false;
+
9735 }
+
9736
+
9737 if (!is_array && !sax->key(key)) {
+
9738 return false;
+
9739 }
+
9740
+
9741 if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position))) {
+
9742 return false;
+
9743 }
+
9744
+
9745 // get_bson_cstr only appends
+
9746 key.clear();
+
9747 }
+
9748
+
9749 return true;
+
9750 }
+
9751
+
9756 bool parse_bson_array() {
+
9757 std::int32_t document_size{};
+
9758 get_number<std::int32_t, true>(input_format_t::bson, document_size);
+
9759
+
9760 if (JSON_HEDLEY_UNLIKELY(!sax->start_array(detail::unknown_size()))) {
+
9761 return false;
+
9762 }
+
9763
+
9764 if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true))) {
+
9765 return false;
+
9766 }
+
9767
+
9768 return sax->end_array();
+
9769 }
+
9770
+
9772 // CBOR //
+
9774
+
9783
+
9784 template<typename NumberType>
+
9785 bool get_cbor_negative_integer() {
+
9786 NumberType number{};
+
9787 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::cbor, number))) {
+
9788 return false;
+
9789 }
+
9790 const auto max_val = static_cast<NumberType>((std::numeric_limits<number_integer_t>::max)());
+
9791 if (number > max_val) {
+
9792 return sax->parse_error(chars_read, get_token_string(),
+
9793 parse_error::create(112, chars_read,
+
9794 exception_message(input_format_t::cbor, "negative integer overflow", "value"), nullptr));
+
9795 }
+
9796 return sax->number_integer(static_cast<number_integer_t>(-1) - static_cast<number_integer_t>(number));
+
9797 }
+
9798
+
9799 bool parse_cbor_internal(const bool get_char,
+
9800 const cbor_tag_handler_t tag_handler) {
+
9801 switch (get_char ? get() : current) {
+
9802 // EOF
+
9803 case char_traits<char_type>::eof():
+
9804 return unexpect_eof(input_format_t::cbor, "value");
+
9805
+
9806 // Integer 0x00..0x17 (0..23)
+
9807 case 0x00:
+
9808 case 0x01:
+
9809 case 0x02:
+
9810 case 0x03:
+
9811 case 0x04:
+
9812 case 0x05:
+
9813 case 0x06:
+
9814 case 0x07:
+
9815 case 0x08:
+
9816 case 0x09:
+
9817 case 0x0A:
+
9818 case 0x0B:
+
9819 case 0x0C:
+
9820 case 0x0D:
+
9821 case 0x0E:
+
9822 case 0x0F:
+
9823 case 0x10:
+
9824 case 0x11:
+
9825 case 0x12:
+
9826 case 0x13:
+
9827 case 0x14:
+
9828 case 0x15:
+
9829 case 0x16:
+
9830 case 0x17:
+
9831 return sax->number_unsigned(static_cast<number_unsigned_t>(current));
+
9832
+
9833 case 0x18: // Unsigned integer (one-byte uint8_t follows)
+
9834 {
+
9835 std::uint8_t number{};
+
9836 return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);
+
9837 }
+
9838
+
9839 case 0x19: // Unsigned integer (two-byte uint16_t follows)
+
9840 {
+
9841 std::uint16_t number{};
+
9842 return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);
+
9843 }
+
9844
+
9845 case 0x1A: // Unsigned integer (four-byte uint32_t follows)
+
9846 {
+
9847 std::uint32_t number{};
+
9848 return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);
+
9849 }
+
9850
+
9851 case 0x1B: // Unsigned integer (eight-byte uint64_t follows)
+
9852 {
+
9853 std::uint64_t number{};
+
9854 return get_number(input_format_t::cbor, number) && sax->number_unsigned(number);
+
9855 }
+
9856
+
9857 // Negative integer -1-0x00..-1-0x17 (-1..-24)
+
9858 case 0x20:
+
9859 case 0x21:
+
9860 case 0x22:
+
9861 case 0x23:
+
9862 case 0x24:
+
9863 case 0x25:
+
9864 case 0x26:
+
9865 case 0x27:
+
9866 case 0x28:
+
9867 case 0x29:
+
9868 case 0x2A:
+
9869 case 0x2B:
+
9870 case 0x2C:
+
9871 case 0x2D:
+
9872 case 0x2E:
+
9873 case 0x2F:
+
9874 case 0x30:
+
9875 case 0x31:
+
9876 case 0x32:
+
9877 case 0x33:
+
9878 case 0x34:
+
9879 case 0x35:
+
9880 case 0x36:
+
9881 case 0x37:
+
9882 return sax->number_integer(static_cast<std::int8_t>(0x20 - 1 - current));
+
9883
+
9884 case 0x38: // Negative integer (one-byte uint8_t follows)
+
9885 return get_cbor_negative_integer<std::uint8_t>();
+
9886
+
9887 case 0x39: // Negative integer -1-n (two-byte uint16_t follows)
+
9888 return get_cbor_negative_integer<std::uint16_t>();
+
9889
+
9890 case 0x3A: // Negative integer -1-n (four-byte uint32_t follows)
+
9891 return get_cbor_negative_integer<std::uint32_t>();
+
9892
+
9893 case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows)
+
9894 return get_cbor_negative_integer<std::uint64_t>();
+
9895
+
9896 // Binary data (0x00..0x17 bytes follow)
+
9897 case 0x40:
+
9898 case 0x41:
+
9899 case 0x42:
+
9900 case 0x43:
+
9901 case 0x44:
+
9902 case 0x45:
+
9903 case 0x46:
+
9904 case 0x47:
+
9905 case 0x48:
+
9906 case 0x49:
+
9907 case 0x4A:
+
9908 case 0x4B:
+
9909 case 0x4C:
+
9910 case 0x4D:
+
9911 case 0x4E:
+
9912 case 0x4F:
+
9913 case 0x50:
+
9914 case 0x51:
+
9915 case 0x52:
+
9916 case 0x53:
+
9917 case 0x54:
+
9918 case 0x55:
+
9919 case 0x56:
+
9920 case 0x57:
+
9921 case 0x58: // Binary data (one-byte uint8_t for n follows)
+
9922 case 0x59: // Binary data (two-byte uint16_t for n follow)
+
9923 case 0x5A: // Binary data (four-byte uint32_t for n follow)
+
9924 case 0x5B: // Binary data (eight-byte uint64_t for n follow)
+
9925 case 0x5F: // Binary data (indefinite length)
+
9926 {
+
9927 binary_t b;
+
9928 return get_cbor_binary(b) && sax->binary(b);
+
9929 }
+
9930
+
9931 // UTF-8 string (0x00..0x17 bytes follow)
+
9932 case 0x60:
+
9933 case 0x61:
+
9934 case 0x62:
+
9935 case 0x63:
+
9936 case 0x64:
+
9937 case 0x65:
+
9938 case 0x66:
+
9939 case 0x67:
+
9940 case 0x68:
+
9941 case 0x69:
+
9942 case 0x6A:
+
9943 case 0x6B:
+
9944 case 0x6C:
+
9945 case 0x6D:
+
9946 case 0x6E:
+
9947 case 0x6F:
+
9948 case 0x70:
+
9949 case 0x71:
+
9950 case 0x72:
+
9951 case 0x73:
+
9952 case 0x74:
+
9953 case 0x75:
+
9954 case 0x76:
+
9955 case 0x77:
+
9956 case 0x78: // UTF-8 string (one-byte uint8_t for n follows)
+
9957 case 0x79: // UTF-8 string (two-byte uint16_t for n follow)
+
9958 case 0x7A: // UTF-8 string (four-byte uint32_t for n follow)
+
9959 case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow)
+
9960 case 0x7F: // UTF-8 string (indefinite length)
+
9961 {
+
9962 string_t s;
+
9963 return get_cbor_string(s) && sax->string(s);
+
9964 }
+
9965
+
9966 // array (0x00..0x17 data items follow)
+
9967 case 0x80:
+
9968 case 0x81:
+
9969 case 0x82:
+
9970 case 0x83:
+
9971 case 0x84:
+
9972 case 0x85:
+
9973 case 0x86:
+
9974 case 0x87:
+
9975 case 0x88:
+
9976 case 0x89:
+
9977 case 0x8A:
+
9978 case 0x8B:
+
9979 case 0x8C:
+
9980 case 0x8D:
+
9981 case 0x8E:
+
9982 case 0x8F:
+
9983 case 0x90:
+
9984 case 0x91:
+
9985 case 0x92:
+
9986 case 0x93:
+
9987 case 0x94:
+
9988 case 0x95:
+
9989 case 0x96:
+
9990 case 0x97:
+
9991 return get_cbor_array(
+
9992 conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);
+
9993
+
9994 case 0x98: // array (one-byte uint8_t for n follows)
+
9995 {
+
9996 std::uint8_t len{};
+
9997 return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);
+
9998 }
+
9999
+
10000 case 0x99: // array (two-byte uint16_t for n follow)
+
10001 {
+
10002 std::uint16_t len{};
+
10003 return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast<std::size_t>(len), tag_handler);
+
10004 }
+
10005
+
10006 case 0x9A: // array (four-byte uint32_t for n follow)
+
10007 {
+
10008 std::uint32_t len{};
+
10009 return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast<std::size_t>(len), tag_handler);
+
10010 }
+
10011
+
10012 case 0x9B: // array (eight-byte uint64_t for n follow)
+
10013 {
+
10014 std::uint64_t len{};
+
10015 return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast<std::size_t>(len), tag_handler);
+
10016 }
+
10017
+
10018 case 0x9F: // array (indefinite length)
+
10019 return get_cbor_array(detail::unknown_size(), tag_handler);
+
10020
+
10021 // map (0x00..0x17 pairs of data items follow)
+
10022 case 0xA0:
+
10023 case 0xA1:
+
10024 case 0xA2:
+
10025 case 0xA3:
+
10026 case 0xA4:
+
10027 case 0xA5:
+
10028 case 0xA6:
+
10029 case 0xA7:
+
10030 case 0xA8:
+
10031 case 0xA9:
+
10032 case 0xAA:
+
10033 case 0xAB:
+
10034 case 0xAC:
+
10035 case 0xAD:
+
10036 case 0xAE:
+
10037 case 0xAF:
+
10038 case 0xB0:
+
10039 case 0xB1:
+
10040 case 0xB2:
+
10041 case 0xB3:
+
10042 case 0xB4:
+
10043 case 0xB5:
+
10044 case 0xB6:
+
10045 case 0xB7:
+
10046 return get_cbor_object(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x1Fu), tag_handler);
+
10047
+
10048 case 0xB8: // map (one-byte uint8_t for n follows)
+
10049 {
+
10050 std::uint8_t len{};
+
10051 return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);
+
10052 }
+
10053
+
10054 case 0xB9: // map (two-byte uint16_t for n follow)
+
10055 {
+
10056 std::uint16_t len{};
+
10057 return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast<std::size_t>(len), tag_handler);
+
10058 }
+
10059
+
10060 case 0xBA: // map (four-byte uint32_t for n follow)
+
10061 {
+
10062 std::uint32_t len{};
+
10063 return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast<std::size_t>(len), tag_handler);
+
10064 }
+
10065
+
10066 case 0xBB: // map (eight-byte uint64_t for n follow)
+
10067 {
+
10068 std::uint64_t len{};
+
10069 return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast<std::size_t>(len), tag_handler);
+
10070 }
+
10071
+
10072 case 0xBF: // map (indefinite length)
+
10073 return get_cbor_object(detail::unknown_size(), tag_handler);
+
10074
+
10075 case 0xC6: // tagged item
+
10076 case 0xC7:
+
10077 case 0xC8:
+
10078 case 0xC9:
+
10079 case 0xCA:
+
10080 case 0xCB:
+
10081 case 0xCC:
+
10082 case 0xCD:
+
10083 case 0xCE:
+
10084 case 0xCF:
+
10085 case 0xD0:
+
10086 case 0xD1:
+
10087 case 0xD2:
+
10088 case 0xD3:
+
10089 case 0xD4:
+
10090 case 0xD8: // tagged item (1 byte follows)
+
10091 case 0xD9: // tagged item (2 bytes follow)
+
10092 case 0xDA: // tagged item (4 bytes follow)
+
10093 case 0xDB: // tagged item (8 bytes follow)
+
10094 {
+
10095 switch (tag_handler) {
+
10096 case cbor_tag_handler_t::error:
+
10097 {
+
10098 auto last_token = get_token_string();
+
10099 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
10100 exception_message(input_format_t::cbor, concat("invalid byte: 0x", last_token), "value"), nullptr));
+
10101 }
+
10102
+
10103 case cbor_tag_handler_t::ignore:
+
10104 {
+
10105 // ignore binary subtype
+
10106 switch (current) {
+
10107 case 0xD8:
+
10108 {
+
10109 std::uint8_t subtype_to_ignore{};
+
10110 get_number(input_format_t::cbor, subtype_to_ignore);
+
10111 break;
+
10112 }
+
10113 case 0xD9:
+
10114 {
+
10115 std::uint16_t subtype_to_ignore{};
+
10116 get_number(input_format_t::cbor, subtype_to_ignore);
+
10117 break;
+
10118 }
+
10119 case 0xDA:
+
10120 {
+
10121 std::uint32_t subtype_to_ignore{};
+
10122 get_number(input_format_t::cbor, subtype_to_ignore);
+
10123 break;
+
10124 }
+
10125 case 0xDB:
+
10126 {
+
10127 std::uint64_t subtype_to_ignore{};
+
10128 get_number(input_format_t::cbor, subtype_to_ignore);
+
10129 break;
+
10130 }
+
10131 default:
+
10132 break;
+
10133 }
+
10134 return parse_cbor_internal(true, tag_handler);
+
10135 }
+
10136
+
10137 case cbor_tag_handler_t::store:
+
10138 {
+
10139 binary_t b;
+
10140 // use binary subtype and store in a binary container
+
10141 switch (current) {
+
10142 case 0xD8:
+
10143 {
+
10144 std::uint8_t subtype{};
+
10145 get_number(input_format_t::cbor, subtype);
+
10146 b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));
+
10147 break;
+
10148 }
+
10149 case 0xD9:
+
10150 {
+
10151 std::uint16_t subtype{};
+
10152 get_number(input_format_t::cbor, subtype);
+
10153 b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));
+
10154 break;
+
10155 }
+
10156 case 0xDA:
+
10157 {
+
10158 std::uint32_t subtype{};
+
10159 get_number(input_format_t::cbor, subtype);
+
10160 b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));
+
10161 break;
+
10162 }
+
10163 case 0xDB:
+
10164 {
+
10165 std::uint64_t subtype{};
+
10166 get_number(input_format_t::cbor, subtype);
+
10167 b.set_subtype(detail::conditional_static_cast<typename binary_t::subtype_type>(subtype));
+
10168 break;
+
10169 }
+
10170 default:
+
10171 return parse_cbor_internal(true, tag_handler);
+
10172 }
+
10173 get();
+
10174 return get_cbor_binary(b) && sax->binary(b);
+
10175 }
+
10176
+
10177 default: // LCOV_EXCL_LINE
+
10178 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
10179 return false; // LCOV_EXCL_LINE
+
10180 }
+
10181 }
+
10182
+
10183 case 0xF4: // false
+
10184 return sax->boolean(false);
+
10185
+
10186 case 0xF5: // true
+
10187 return sax->boolean(true);
+
10188
+
10189 case 0xF6: // null
+
10190 return sax->null();
+
10191
+
10192 case 0xF9: // Half-Precision Float (two-byte IEEE 754)
+
10193 {
+
10194 const auto byte1_raw = get();
+
10195 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) {
+
10196 return false;
+
10197 }
+
10198 const auto byte2_raw = get();
+
10199 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) {
+
10200 return false;
+
10201 }
+
10202
+
10203 const auto byte1 = static_cast<unsigned char>(byte1_raw);
+
10204 const auto byte2 = static_cast<unsigned char>(byte2_raw);
+
10205
+
10206 // Code from RFC 7049, Appendix D, Figure 3:
+
10207 // As half-precision floating-point numbers were only added
+
10208 // to IEEE 754 in 2008, today's programming platforms often
+
10209 // still only have limited support for them. It is very
+
10210 // easy to include at least decoding support for them even
+
10211 // without such support. An example of a small decoder for
+
10212 // half-precision floating-point numbers in the C language
+
10213 // is shown in Fig. 3.
+
10214 const auto half = static_cast<unsigned int>((byte1 << 8u) + byte2);
+
10215 const double val = [&half] {
+
10216 const int exp = (half >> 10u) & 0x1Fu;
+
10217 const unsigned int mant = half & 0x3FFu;
+
10218 JSON_ASSERT(0 <= exp && exp <= 32);
+
10219 JSON_ASSERT(mant <= 1024);
+
10220 switch (exp) {
+
10221 case 0:
+
10222 return std::ldexp(mant, -24);
+
10223 case 31:
+
10224 return (mant == 0)
+
10225 ? std::numeric_limits<double>::infinity()
+
10226 : std::numeric_limits<double>::quiet_NaN();
+
10227 default:
+
10228 return std::ldexp(mant + 1024, exp - 25);
+
10229 }
+
10230 }();
+
10231 return sax->number_float((half & 0x8000u) != 0
+
10232 ? static_cast<number_float_t>(-val)
+
10233 : static_cast<number_float_t>(val), "");
+
10234 }
+
10235
+
10236 case 0xFA: // Single-Precision Float (four-byte IEEE 754)
+
10237 {
+
10238 float number{};
+
10239 return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), "");
+
10240 }
+
10241
+
10242 case 0xFB: // Double-Precision Float (eight-byte IEEE 754)
+
10243 {
+
10244 double number{};
+
10245 return get_number(input_format_t::cbor, number) && sax->number_float(static_cast<number_float_t>(number), "");
+
10246 }
+
10247
+
10248 default: // anything else (0xFF is handled inside the other types)
+
10249 {
+
10250 auto last_token = get_token_string();
+
10251 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
10252 exception_message(input_format_t::cbor, concat("invalid byte: 0x", last_token), "value"), nullptr));
+
10253 }
+
10254 }
+
10255 }
+
10256
+
10268 bool get_cbor_string(string_t& result) {
+
10269 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string"))) {
+
10270 return false;
+
10271 }
+
10272
+
10273 switch (current) {
+
10274 // UTF-8 string (0x00..0x17 bytes follow)
+
10275 case 0x60:
+
10276 case 0x61:
+
10277 case 0x62:
+
10278 case 0x63:
+
10279 case 0x64:
+
10280 case 0x65:
+
10281 case 0x66:
+
10282 case 0x67:
+
10283 case 0x68:
+
10284 case 0x69:
+
10285 case 0x6A:
+
10286 case 0x6B:
+
10287 case 0x6C:
+
10288 case 0x6D:
+
10289 case 0x6E:
+
10290 case 0x6F:
+
10291 case 0x70:
+
10292 case 0x71:
+
10293 case 0x72:
+
10294 case 0x73:
+
10295 case 0x74:
+
10296 case 0x75:
+
10297 case 0x76:
+
10298 case 0x77:
+
10299 {
+
10300 return get_string(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);
+
10301 }
+
10302
+
10303 case 0x78: // UTF-8 string (one-byte uint8_t for n follows)
+
10304 {
+
10305 std::uint8_t len{};
+
10306 return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);
+
10307 }
+
10308
+
10309 case 0x79: // UTF-8 string (two-byte uint16_t for n follow)
+
10310 {
+
10311 std::uint16_t len{};
+
10312 return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);
+
10313 }
+
10314
+
10315 case 0x7A: // UTF-8 string (four-byte uint32_t for n follow)
+
10316 {
+
10317 std::uint32_t len{};
+
10318 return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);
+
10319 }
+
10320
+
10321 case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow)
+
10322 {
+
10323 std::uint64_t len{};
+
10324 return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result);
+
10325 }
+
10326
+
10327 case 0x7F: // UTF-8 string (indefinite length)
+
10328 {
+
10329 while (get() != 0xFF) {
+
10330 string_t chunk;
+
10331 if (!get_cbor_string(chunk)) {
+
10332 return false;
+
10333 }
+
10334 result.append(chunk);
+
10335 }
+
10336 return true;
+
10337 }
+
10338
+
10339 default:
+
10340 {
+
10341 auto last_token = get_token_string();
+
10342 return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read,
+
10343 exception_message(input_format_t::cbor, concat("expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x", last_token), "string"), nullptr));
+
10344 }
+
10345 }
+
10346 }
+
10347
+
10359 bool get_cbor_binary(binary_t& result) {
+
10360 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary"))) {
+
10361 return false;
+
10362 }
+
10363
+
10364 switch (current) {
+
10365 // Binary data (0x00..0x17 bytes follow)
+
10366 case 0x40:
+
10367 case 0x41:
+
10368 case 0x42:
+
10369 case 0x43:
+
10370 case 0x44:
+
10371 case 0x45:
+
10372 case 0x46:
+
10373 case 0x47:
+
10374 case 0x48:
+
10375 case 0x49:
+
10376 case 0x4A:
+
10377 case 0x4B:
+
10378 case 0x4C:
+
10379 case 0x4D:
+
10380 case 0x4E:
+
10381 case 0x4F:
+
10382 case 0x50:
+
10383 case 0x51:
+
10384 case 0x52:
+
10385 case 0x53:
+
10386 case 0x54:
+
10387 case 0x55:
+
10388 case 0x56:
+
10389 case 0x57:
+
10390 {
+
10391 return get_binary(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);
+
10392 }
+
10393
+
10394 case 0x58: // Binary data (one-byte uint8_t for n follows)
+
10395 {
+
10396 std::uint8_t len{};
+
10397 return get_number(input_format_t::cbor, len) &&
+
10398 get_binary(input_format_t::cbor, len, result);
+
10399 }
+
10400
+
10401 case 0x59: // Binary data (two-byte uint16_t for n follow)
+
10402 {
+
10403 std::uint16_t len{};
+
10404 return get_number(input_format_t::cbor, len) &&
+
10405 get_binary(input_format_t::cbor, len, result);
+
10406 }
+
10407
+
10408 case 0x5A: // Binary data (four-byte uint32_t for n follow)
+
10409 {
+
10410 std::uint32_t len{};
+
10411 return get_number(input_format_t::cbor, len) &&
+
10412 get_binary(input_format_t::cbor, len, result);
+
10413 }
+
10414
+
10415 case 0x5B: // Binary data (eight-byte uint64_t for n follow)
+
10416 {
+
10417 std::uint64_t len{};
+
10418 return get_number(input_format_t::cbor, len) &&
+
10419 get_binary(input_format_t::cbor, len, result);
+
10420 }
+
10421
+
10422 case 0x5F: // Binary data (indefinite length)
+
10423 {
+
10424 while (get() != 0xFF) {
+
10425 binary_t chunk;
+
10426 if (!get_cbor_binary(chunk)) {
+
10427 return false;
+
10428 }
+
10429 result.insert(result.end(), chunk.begin(), chunk.end());
+
10430 }
+
10431 return true;
+
10432 }
+
10433
+
10434 default:
+
10435 {
+
10436 auto last_token = get_token_string();
+
10437 return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read,
+
10438 exception_message(input_format_t::cbor, concat("expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x", last_token), "binary"), nullptr));
+
10439 }
+
10440 }
+
10441 }
+
10442
+
10449 bool get_cbor_array(const std::size_t len,
+
10450 const cbor_tag_handler_t tag_handler) {
+
10451 if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) {
+
10452 return false;
+
10453 }
+
10454
+
10455 if (len != detail::unknown_size()) {
+
10456 for (std::size_t i = 0; i < len; ++i) {
+
10457 if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) {
+
10458 return false;
+
10459 }
+
10460 }
+
10461 }
+
10462 else {
+
10463 while (get() != 0xFF) {
+
10464 if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler))) {
+
10465 return false;
+
10466 }
+
10467 }
+
10468 }
+
10469
+
10470 return sax->end_array();
+
10471 }
+
10472
+
10479 bool get_cbor_object(const std::size_t len,
+
10480 const cbor_tag_handler_t tag_handler) {
+
10481 if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) {
+
10482 return false;
+
10483 }
+
10484
+
10485 if (len != 0) {
+
10486 string_t key;
+
10487 if (len != detail::unknown_size()) {
+
10488 for (std::size_t i = 0; i < len; ++i) {
+
10489 get();
+
10490 if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) {
+
10491 return false;
+
10492 }
+
10493
+
10494 if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) {
+
10495 return false;
+
10496 }
+
10497 key.clear();
+
10498 }
+
10499 }
+
10500 else {
+
10501 while (get() != 0xFF) {
+
10502 if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) {
+
10503 return false;
+
10504 }
+
10505
+
10506 if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) {
+
10507 return false;
+
10508 }
+
10509 key.clear();
+
10510 }
+
10511 }
+
10512 }
+
10513
+
10514 return sax->end_object();
+
10515 }
+
10516
+
10518 // MsgPack //
+
10520
+
10524 bool parse_msgpack_internal() {
+
10525 switch (get()) {
+
10526 // EOF
+
10527 case char_traits<char_type>::eof():
+
10528 return unexpect_eof(input_format_t::msgpack, "value");
+
10529
+
10530 // positive fixint
+
10531 case 0x00:
+
10532 case 0x01:
+
10533 case 0x02:
+
10534 case 0x03:
+
10535 case 0x04:
+
10536 case 0x05:
+
10537 case 0x06:
+
10538 case 0x07:
+
10539 case 0x08:
+
10540 case 0x09:
+
10541 case 0x0A:
+
10542 case 0x0B:
+
10543 case 0x0C:
+
10544 case 0x0D:
+
10545 case 0x0E:
+
10546 case 0x0F:
+
10547 case 0x10:
+
10548 case 0x11:
+
10549 case 0x12:
+
10550 case 0x13:
+
10551 case 0x14:
+
10552 case 0x15:
+
10553 case 0x16:
+
10554 case 0x17:
+
10555 case 0x18:
+
10556 case 0x19:
+
10557 case 0x1A:
+
10558 case 0x1B:
+
10559 case 0x1C:
+
10560 case 0x1D:
+
10561 case 0x1E:
+
10562 case 0x1F:
+
10563 case 0x20:
+
10564 case 0x21:
+
10565 case 0x22:
+
10566 case 0x23:
+
10567 case 0x24:
+
10568 case 0x25:
+
10569 case 0x26:
+
10570 case 0x27:
+
10571 case 0x28:
+
10572 case 0x29:
+
10573 case 0x2A:
+
10574 case 0x2B:
+
10575 case 0x2C:
+
10576 case 0x2D:
+
10577 case 0x2E:
+
10578 case 0x2F:
+
10579 case 0x30:
+
10580 case 0x31:
+
10581 case 0x32:
+
10582 case 0x33:
+
10583 case 0x34:
+
10584 case 0x35:
+
10585 case 0x36:
+
10586 case 0x37:
+
10587 case 0x38:
+
10588 case 0x39:
+
10589 case 0x3A:
+
10590 case 0x3B:
+
10591 case 0x3C:
+
10592 case 0x3D:
+
10593 case 0x3E:
+
10594 case 0x3F:
+
10595 case 0x40:
+
10596 case 0x41:
+
10597 case 0x42:
+
10598 case 0x43:
+
10599 case 0x44:
+
10600 case 0x45:
+
10601 case 0x46:
+
10602 case 0x47:
+
10603 case 0x48:
+
10604 case 0x49:
+
10605 case 0x4A:
+
10606 case 0x4B:
+
10607 case 0x4C:
+
10608 case 0x4D:
+
10609 case 0x4E:
+
10610 case 0x4F:
+
10611 case 0x50:
+
10612 case 0x51:
+
10613 case 0x52:
+
10614 case 0x53:
+
10615 case 0x54:
+
10616 case 0x55:
+
10617 case 0x56:
+
10618 case 0x57:
+
10619 case 0x58:
+
10620 case 0x59:
+
10621 case 0x5A:
+
10622 case 0x5B:
+
10623 case 0x5C:
+
10624 case 0x5D:
+
10625 case 0x5E:
+
10626 case 0x5F:
+
10627 case 0x60:
+
10628 case 0x61:
+
10629 case 0x62:
+
10630 case 0x63:
+
10631 case 0x64:
+
10632 case 0x65:
+
10633 case 0x66:
+
10634 case 0x67:
+
10635 case 0x68:
+
10636 case 0x69:
+
10637 case 0x6A:
+
10638 case 0x6B:
+
10639 case 0x6C:
+
10640 case 0x6D:
+
10641 case 0x6E:
+
10642 case 0x6F:
+
10643 case 0x70:
+
10644 case 0x71:
+
10645 case 0x72:
+
10646 case 0x73:
+
10647 case 0x74:
+
10648 case 0x75:
+
10649 case 0x76:
+
10650 case 0x77:
+
10651 case 0x78:
+
10652 case 0x79:
+
10653 case 0x7A:
+
10654 case 0x7B:
+
10655 case 0x7C:
+
10656 case 0x7D:
+
10657 case 0x7E:
+
10658 case 0x7F:
+
10659 return sax->number_unsigned(static_cast<number_unsigned_t>(current));
+
10660
+
10661 // fixmap
+
10662 case 0x80:
+
10663 case 0x81:
+
10664 case 0x82:
+
10665 case 0x83:
+
10666 case 0x84:
+
10667 case 0x85:
+
10668 case 0x86:
+
10669 case 0x87:
+
10670 case 0x88:
+
10671 case 0x89:
+
10672 case 0x8A:
+
10673 case 0x8B:
+
10674 case 0x8C:
+
10675 case 0x8D:
+
10676 case 0x8E:
+
10677 case 0x8F:
+
10678 return get_msgpack_object(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));
+
10679
+
10680 // fixarray
+
10681 case 0x90:
+
10682 case 0x91:
+
10683 case 0x92:
+
10684 case 0x93:
+
10685 case 0x94:
+
10686 case 0x95:
+
10687 case 0x96:
+
10688 case 0x97:
+
10689 case 0x98:
+
10690 case 0x99:
+
10691 case 0x9A:
+
10692 case 0x9B:
+
10693 case 0x9C:
+
10694 case 0x9D:
+
10695 case 0x9E:
+
10696 case 0x9F:
+
10697 return get_msgpack_array(conditional_static_cast<std::size_t>(static_cast<unsigned int>(current) & 0x0Fu));
+
10698
+
10699 // fixstr
+
10700 case 0xA0:
+
10701 case 0xA1:
+
10702 case 0xA2:
+
10703 case 0xA3:
+
10704 case 0xA4:
+
10705 case 0xA5:
+
10706 case 0xA6:
+
10707 case 0xA7:
+
10708 case 0xA8:
+
10709 case 0xA9:
+
10710 case 0xAA:
+
10711 case 0xAB:
+
10712 case 0xAC:
+
10713 case 0xAD:
+
10714 case 0xAE:
+
10715 case 0xAF:
+
10716 case 0xB0:
+
10717 case 0xB1:
+
10718 case 0xB2:
+
10719 case 0xB3:
+
10720 case 0xB4:
+
10721 case 0xB5:
+
10722 case 0xB6:
+
10723 case 0xB7:
+
10724 case 0xB8:
+
10725 case 0xB9:
+
10726 case 0xBA:
+
10727 case 0xBB:
+
10728 case 0xBC:
+
10729 case 0xBD:
+
10730 case 0xBE:
+
10731 case 0xBF:
+
10732 case 0xD9: // str 8
+
10733 case 0xDA: // str 16
+
10734 case 0xDB: // str 32
+
10735 {
+
10736 string_t s;
+
10737 return get_msgpack_string(s) && sax->string(s);
+
10738 }
+
10739
+
10740 case 0xC0: // nil
+
10741 return sax->null();
+
10742
+
10743 case 0xC2: // false
+
10744 return sax->boolean(false);
+
10745
+
10746 case 0xC3: // true
+
10747 return sax->boolean(true);
+
10748
+
10749 case 0xC4: // bin 8
+
10750 case 0xC5: // bin 16
+
10751 case 0xC6: // bin 32
+
10752 case 0xC7: // ext 8
+
10753 case 0xC8: // ext 16
+
10754 case 0xC9: // ext 32
+
10755 case 0xD4: // fixext 1
+
10756 case 0xD5: // fixext 2
+
10757 case 0xD6: // fixext 4
+
10758 case 0xD7: // fixext 8
+
10759 case 0xD8: // fixext 16
+
10760 {
+
10761 binary_t b;
+
10762 return get_msgpack_binary(b) && sax->binary(b);
+
10763 }
+
10764
+
10765 case 0xCA: // float 32
+
10766 {
+
10767 float number{};
+
10768 return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), "");
+
10769 }
+
10770
+
10771 case 0xCB: // float 64
+
10772 {
+
10773 double number{};
+
10774 return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast<number_float_t>(number), "");
+
10775 }
+
10776
+
10777 case 0xCC: // uint 8
+
10778 {
+
10779 std::uint8_t number{};
+
10780 return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);
+
10781 }
+
10782
+
10783 case 0xCD: // uint 16
+
10784 {
+
10785 std::uint16_t number{};
+
10786 return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);
+
10787 }
+
10788
+
10789 case 0xCE: // uint 32
+
10790 {
+
10791 std::uint32_t number{};
+
10792 return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);
+
10793 }
+
10794
+
10795 case 0xCF: // uint 64
+
10796 {
+
10797 std::uint64_t number{};
+
10798 return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number);
+
10799 }
+
10800
+
10801 case 0xD0: // int 8
+
10802 {
+
10803 std::int8_t number{};
+
10804 return get_number(input_format_t::msgpack, number) && sax->number_integer(number);
+
10805 }
+
10806
+
10807 case 0xD1: // int 16
+
10808 {
+
10809 std::int16_t number{};
+
10810 return get_number(input_format_t::msgpack, number) && sax->number_integer(number);
+
10811 }
+
10812
+
10813 case 0xD2: // int 32
+
10814 {
+
10815 std::int32_t number{};
+
10816 return get_number(input_format_t::msgpack, number) && sax->number_integer(number);
+
10817 }
+
10818
+
10819 case 0xD3: // int 64
+
10820 {
+
10821 std::int64_t number{};
+
10822 return get_number(input_format_t::msgpack, number) && sax->number_integer(number);
+
10823 }
+
10824
+
10825 case 0xDC: // array 16
+
10826 {
+
10827 std::uint16_t len{};
+
10828 return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast<std::size_t>(len));
+
10829 }
+
10830
+
10831 case 0xDD: // array 32
+
10832 {
+
10833 std::uint32_t len{};
+
10834 return get_number(input_format_t::msgpack, len) && get_msgpack_array(conditional_static_cast<std::size_t>(len));
+
10835 }
+
10836
+
10837 case 0xDE: // map 16
+
10838 {
+
10839 std::uint16_t len{};
+
10840 return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast<std::size_t>(len));
+
10841 }
+
10842
+
10843 case 0xDF: // map 32
+
10844 {
+
10845 std::uint32_t len{};
+
10846 return get_number(input_format_t::msgpack, len) && get_msgpack_object(conditional_static_cast<std::size_t>(len));
+
10847 }
+
10848
+
10849 // negative fixint
+
10850 case 0xE0:
+
10851 case 0xE1:
+
10852 case 0xE2:
+
10853 case 0xE3:
+
10854 case 0xE4:
+
10855 case 0xE5:
+
10856 case 0xE6:
+
10857 case 0xE7:
+
10858 case 0xE8:
+
10859 case 0xE9:
+
10860 case 0xEA:
+
10861 case 0xEB:
+
10862 case 0xEC:
+
10863 case 0xED:
+
10864 case 0xEE:
+
10865 case 0xEF:
+
10866 case 0xF0:
+
10867 case 0xF1:
+
10868 case 0xF2:
+
10869 case 0xF3:
+
10870 case 0xF4:
+
10871 case 0xF5:
+
10872 case 0xF6:
+
10873 case 0xF7:
+
10874 case 0xF8:
+
10875 case 0xF9:
+
10876 case 0xFA:
+
10877 case 0xFB:
+
10878 case 0xFC:
+
10879 case 0xFD:
+
10880 case 0xFE:
+
10881 case 0xFF:
+
10882 return sax->number_integer(static_cast<std::int8_t>(current));
+
10883
+
10884 default: // anything else
+
10885 {
+
10886 auto last_token = get_token_string();
+
10887 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
10888 exception_message(input_format_t::msgpack, concat("invalid byte: 0x", last_token), "value"), nullptr));
+
10889 }
+
10890 }
+
10891 }
+
10892
+
10903 bool get_msgpack_string(string_t& result) {
+
10904 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string"))) {
+
10905 return false;
+
10906 }
+
10907
+
10908 switch (current) {
+
10909 // fixstr
+
10910 case 0xA0:
+
10911 case 0xA1:
+
10912 case 0xA2:
+
10913 case 0xA3:
+
10914 case 0xA4:
+
10915 case 0xA5:
+
10916 case 0xA6:
+
10917 case 0xA7:
+
10918 case 0xA8:
+
10919 case 0xA9:
+
10920 case 0xAA:
+
10921 case 0xAB:
+
10922 case 0xAC:
+
10923 case 0xAD:
+
10924 case 0xAE:
+
10925 case 0xAF:
+
10926 case 0xB0:
+
10927 case 0xB1:
+
10928 case 0xB2:
+
10929 case 0xB3:
+
10930 case 0xB4:
+
10931 case 0xB5:
+
10932 case 0xB6:
+
10933 case 0xB7:
+
10934 case 0xB8:
+
10935 case 0xB9:
+
10936 case 0xBA:
+
10937 case 0xBB:
+
10938 case 0xBC:
+
10939 case 0xBD:
+
10940 case 0xBE:
+
10941 case 0xBF:
+
10942 {
+
10943 return get_string(input_format_t::msgpack, static_cast<unsigned int>(current) & 0x1Fu, result);
+
10944 }
+
10945
+
10946 case 0xD9: // str 8
+
10947 {
+
10948 std::uint8_t len{};
+
10949 return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);
+
10950 }
+
10951
+
10952 case 0xDA: // str 16
+
10953 {
+
10954 std::uint16_t len{};
+
10955 return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);
+
10956 }
+
10957
+
10958 case 0xDB: // str 32
+
10959 {
+
10960 std::uint32_t len{};
+
10961 return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result);
+
10962 }
+
10963
+
10964 default:
+
10965 {
+
10966 auto last_token = get_token_string();
+
10967 return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read,
+
10968 exception_message(input_format_t::msgpack, concat("expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x", last_token), "string"), nullptr));
+
10969 }
+
10970 }
+
10971 }
+
10972
+
10983 bool get_msgpack_binary(binary_t& result) {
+
10984 // helper function to set the subtype
+
10985 auto assign_and_return_true = [&result](std::int8_t subtype) {
+
10986 result.set_subtype(static_cast<std::uint8_t>(subtype));
+
10987 return true;
+
10988 };
+
10989
+
10990 switch (current) {
+
10991 case 0xC4: // bin 8
+
10992 {
+
10993 std::uint8_t len{};
+
10994 return get_number(input_format_t::msgpack, len) &&
+
10995 get_binary(input_format_t::msgpack, len, result);
+
10996 }
+
10997
+
10998 case 0xC5: // bin 16
+
10999 {
+
11000 std::uint16_t len{};
+
11001 return get_number(input_format_t::msgpack, len) &&
+
11002 get_binary(input_format_t::msgpack, len, result);
+
11003 }
+
11004
+
11005 case 0xC6: // bin 32
+
11006 {
+
11007 std::uint32_t len{};
+
11008 return get_number(input_format_t::msgpack, len) &&
+
11009 get_binary(input_format_t::msgpack, len, result);
+
11010 }
+
11011
+
11012 case 0xC7: // ext 8
+
11013 {
+
11014 std::uint8_t len{};
+
11015 std::int8_t subtype{};
+
11016 return get_number(input_format_t::msgpack, len) &&
+
11017 get_number(input_format_t::msgpack, subtype) &&
+
11018 get_binary(input_format_t::msgpack, len, result) &&
+
11019 assign_and_return_true(subtype);
+
11020 }
+
11021
+
11022 case 0xC8: // ext 16
+
11023 {
+
11024 std::uint16_t len{};
+
11025 std::int8_t subtype{};
+
11026 return get_number(input_format_t::msgpack, len) &&
+
11027 get_number(input_format_t::msgpack, subtype) &&
+
11028 get_binary(input_format_t::msgpack, len, result) &&
+
11029 assign_and_return_true(subtype);
+
11030 }
+
11031
+
11032 case 0xC9: // ext 32
+
11033 {
+
11034 std::uint32_t len{};
+
11035 std::int8_t subtype{};
+
11036 return get_number(input_format_t::msgpack, len) &&
+
11037 get_number(input_format_t::msgpack, subtype) &&
+
11038 get_binary(input_format_t::msgpack, len, result) &&
+
11039 assign_and_return_true(subtype);
+
11040 }
+
11041
+
11042 case 0xD4: // fixext 1
+
11043 {
+
11044 std::int8_t subtype{};
+
11045 return get_number(input_format_t::msgpack, subtype) &&
+
11046 get_binary(input_format_t::msgpack, 1, result) &&
+
11047 assign_and_return_true(subtype);
+
11048 }
+
11049
+
11050 case 0xD5: // fixext 2
+
11051 {
+
11052 std::int8_t subtype{};
+
11053 return get_number(input_format_t::msgpack, subtype) &&
+
11054 get_binary(input_format_t::msgpack, 2, result) &&
+
11055 assign_and_return_true(subtype);
+
11056 }
+
11057
+
11058 case 0xD6: // fixext 4
+
11059 {
+
11060 std::int8_t subtype{};
+
11061 return get_number(input_format_t::msgpack, subtype) &&
+
11062 get_binary(input_format_t::msgpack, 4, result) &&
+
11063 assign_and_return_true(subtype);
+
11064 }
+
11065
+
11066 case 0xD7: // fixext 8
+
11067 {
+
11068 std::int8_t subtype{};
+
11069 return get_number(input_format_t::msgpack, subtype) &&
+
11070 get_binary(input_format_t::msgpack, 8, result) &&
+
11071 assign_and_return_true(subtype);
+
11072 }
+
11073
+
11074 case 0xD8: // fixext 16
+
11075 {
+
11076 std::int8_t subtype{};
+
11077 return get_number(input_format_t::msgpack, subtype) &&
+
11078 get_binary(input_format_t::msgpack, 16, result) &&
+
11079 assign_and_return_true(subtype);
+
11080 }
+
11081
+
11082 default: // LCOV_EXCL_LINE
+
11083 return false; // LCOV_EXCL_LINE
+
11084 }
+
11085 }
+
11086
+
11091 bool get_msgpack_array(const std::size_t len) {
+
11092 if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) {
+
11093 return false;
+
11094 }
+
11095
+
11096 for (std::size_t i = 0; i < len; ++i) {
+
11097 if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) {
+
11098 return false;
+
11099 }
+
11100 }
+
11101
+
11102 return sax->end_array();
+
11103 }
+
11104
+
11109 bool get_msgpack_object(const std::size_t len) {
+
11110 if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) {
+
11111 return false;
+
11112 }
+
11113
+
11114 string_t key;
+
11115 for (std::size_t i = 0; i < len; ++i) {
+
11116 get();
+
11117 if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key))) {
+
11118 return false;
+
11119 }
+
11120
+
11121 if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) {
+
11122 return false;
+
11123 }
+
11124 key.clear();
+
11125 }
+
11126
+
11127 return sax->end_object();
+
11128 }
+
11129
+
11131 // UBJSON //
+
11133
+
11141 bool parse_ubjson_internal(const bool get_char = true) {
+
11142 return get_ubjson_value(get_char ? get_ignore_noop() : current);
+
11143 }
+
11144
+
11159 bool get_ubjson_string(string_t& result, const bool get_char = true) {
+
11160 if (get_char) {
+
11161 get(); // TODO(niels): may we ignore N here?
+
11162 }
+
11163
+
11164 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "value"))) {
+
11165 return false;
+
11166 }
+
11167
+
11168 switch (current) {
+
11169 case 'U':
+
11170 {
+
11171 std::uint8_t len{};
+
11172 return get_number(input_format, len) && get_string(input_format, len, result);
+
11173 }
+
11174
+
11175 case 'i':
+
11176 {
+
11177 std::int8_t len{};
+
11178 return get_number(input_format, len) && get_string(input_format, len, result);
+
11179 }
+
11180
+
11181 case 'I':
+
11182 {
+
11183 std::int16_t len{};
+
11184 return get_number(input_format, len) && get_string(input_format, len, result);
+
11185 }
+
11186
+
11187 case 'l':
+
11188 {
+
11189 std::int32_t len{};
+
11190 return get_number(input_format, len) && get_string(input_format, len, result);
+
11191 }
+
11192
+
11193 case 'L':
+
11194 {
+
11195 std::int64_t len{};
+
11196 return get_number(input_format, len) && get_string(input_format, len, result);
+
11197 }
+
11198
+
11199 case 'u':
+
11200 {
+
11201 if (input_format != input_format_t::bjdata) {
+
11202 break;
+
11203 }
+
11204 std::uint16_t len{};
+
11205 return get_number(input_format, len) && get_string(input_format, len, result);
+
11206 }
+
11207
+
11208 case 'm':
+
11209 {
+
11210 if (input_format != input_format_t::bjdata) {
+
11211 break;
+
11212 }
+
11213 std::uint32_t len{};
+
11214 return get_number(input_format, len) && get_string(input_format, len, result);
+
11215 }
+
11216
+
11217 case 'M':
+
11218 {
+
11219 if (input_format != input_format_t::bjdata) {
+
11220 break;
+
11221 }
+
11222 std::uint64_t len{};
+
11223 return get_number(input_format, len) && get_string(input_format, len, result);
+
11224 }
+
11225
+
11226 default:
+
11227 break;
+
11228 }
+
11229 auto last_token = get_token_string();
+
11230 std::string message;
+
11231
+
11232 if (input_format != input_format_t::bjdata) {
+
11233 message = "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token;
+
11234 }
+
11235 else {
+
11236 message = "expected length type specification (U, i, u, I, m, l, M, L); last byte: 0x" + last_token;
+
11237 }
+
11238 return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format, message, "string"), nullptr));
+
11239 }
+
11240
+
11245 bool get_ubjson_ndarray_size(std::vector<size_t>& dim) {
+
11246 std::pair<std::size_t, char_int_type> size_and_type;
+
11247 size_t dimlen = 0;
+
11248 bool no_ndarray = true;
+
11249
+
11250 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type, no_ndarray))) {
+
11251 return false;
+
11252 }
+
11253
+
11254 if (size_and_type.first != npos) {
+
11255 if (size_and_type.second != 0) {
+
11256 if (size_and_type.second != 'N') {
+
11257 for (std::size_t i = 0; i < size_and_type.first; ++i) {
+
11258 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, size_and_type.second))) {
+
11259 return false;
+
11260 }
+
11261 dim.push_back(dimlen);
+
11262 }
+
11263 }
+
11264 }
+
11265 else {
+
11266 for (std::size_t i = 0; i < size_and_type.first; ++i) {
+
11267 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray))) {
+
11268 return false;
+
11269 }
+
11270 dim.push_back(dimlen);
+
11271 }
+
11272 }
+
11273 }
+
11274 else {
+
11275 while (current != ']') {
+
11276 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, current))) {
+
11277 return false;
+
11278 }
+
11279 dim.push_back(dimlen);
+
11280 get_ignore_noop();
+
11281 }
+
11282 }
+
11283 return true;
+
11284 }
+
11285
+
11297 bool get_ubjson_size_value(std::size_t& result, bool& is_ndarray, char_int_type prefix = 0) {
+
11298 if (prefix == 0) {
+
11299 prefix = get_ignore_noop();
+
11300 }
+
11301
+
11302 switch (prefix) {
+
11303 case 'U':
+
11304 {
+
11305 std::uint8_t number{};
+
11306 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) {
+
11307 return false;
+
11308 }
+
11309 result = static_cast<std::size_t>(number);
+
11310 return true;
+
11311 }
+
11312
+
11313 case 'i':
+
11314 {
+
11315 std::int8_t number{};
+
11316 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) {
+
11317 return false;
+
11318 }
+
11319 if (number < 0) {
+
11320 return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read,
+
11321 exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr));
+
11322 }
+
11323 result = static_cast<std::size_t>(number); // NOLINT(bugprone-signed-char-misuse,cert-str34-c): number is not a char
+
11324 return true;
+
11325 }
+
11326
+
11327 case 'I':
+
11328 {
+
11329 std::int16_t number{};
+
11330 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) {
+
11331 return false;
+
11332 }
+
11333 if (number < 0) {
+
11334 return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read,
+
11335 exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr));
+
11336 }
+
11337 result = static_cast<std::size_t>(number);
+
11338 return true;
+
11339 }
+
11340
+
11341 case 'l':
+
11342 {
+
11343 std::int32_t number{};
+
11344 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) {
+
11345 return false;
+
11346 }
+
11347 if (number < 0) {
+
11348 return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read,
+
11349 exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr));
+
11350 }
+
11351 result = static_cast<std::size_t>(number);
+
11352 return true;
+
11353 }
+
11354
+
11355 case 'L':
+
11356 {
+
11357 std::int64_t number{};
+
11358 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) {
+
11359 return false;
+
11360 }
+
11361 if (number < 0) {
+
11362 return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read,
+
11363 exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr));
+
11364 }
+
11365 if (!value_in_range_of<std::size_t>(number)) {
+
11366 return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408,
+
11367 exception_message(input_format, "integer value overflow", "size"), nullptr));
+
11368 }
+
11369 result = static_cast<std::size_t>(number);
+
11370 return true;
+
11371 }
+
11372
+
11373 case 'u':
+
11374 {
+
11375 if (input_format != input_format_t::bjdata) {
+
11376 break;
+
11377 }
+
11378 std::uint16_t number{};
+
11379 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) {
+
11380 return false;
+
11381 }
+
11382 result = static_cast<std::size_t>(number);
+
11383 return true;
+
11384 }
+
11385
+
11386 case 'm':
+
11387 {
+
11388 if (input_format != input_format_t::bjdata) {
+
11389 break;
+
11390 }
+
11391 std::uint32_t number{};
+
11392 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) {
+
11393 return false;
+
11394 }
+
11395 result = conditional_static_cast<std::size_t>(number);
+
11396 return true;
+
11397 }
+
11398
+
11399 case 'M':
+
11400 {
+
11401 if (input_format != input_format_t::bjdata) {
+
11402 break;
+
11403 }
+
11404 std::uint64_t number{};
+
11405 if (JSON_HEDLEY_UNLIKELY(!get_number(input_format, number))) {
+
11406 return false;
+
11407 }
+
11408 if (!value_in_range_of<std::size_t>(number)) {
+
11409 return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408,
+
11410 exception_message(input_format, "integer value overflow", "size"), nullptr));
+
11411 }
+
11412 result = detail::conditional_static_cast<std::size_t>(number);
+
11413 return true;
+
11414 }
+
11415
+
11416 case '[':
+
11417 {
+
11418 if (input_format != input_format_t::bjdata) {
+
11419 break;
+
11420 }
+
11421 if (is_ndarray) // ndarray dimensional vector can only contain integers and cannot embed another array
+
11422 {
+
11423 return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, "ndarray dimensional vector is not allowed", "size"), nullptr));
+
11424 }
+
11425 std::vector<size_t> dim;
+
11426 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_ndarray_size(dim))) {
+
11427 return false;
+
11428 }
+
11429 if (dim.size() == 1 || (dim.size() == 2 && dim.at(0) == 1)) // return normal array size if 1D row vector
+
11430 {
+
11431 result = dim.at(dim.size() - 1);
+
11432 return true;
+
11433 }
+
11434 if (!dim.empty()) // if ndarray, convert to an object in JData annotated array format
+
11435 {
+
11436 for (auto i : dim) // test if any dimension in an ndarray is 0, if so, return a 1D empty container
+
11437 {
+
11438 if (i == 0) {
+
11439 result = 0;
+
11440 return true;
+
11441 }
+
11442 }
+
11443
+
11444 string_t key = "_ArraySize_";
+
11445 if (JSON_HEDLEY_UNLIKELY(!sax->start_object(3) || !sax->key(key) || !sax->start_array(dim.size()))) {
+
11446 return false;
+
11447 }
+
11448 result = 1;
+
11449 for (auto i : dim) {
+
11450 // Pre-multiplication overflow check: if i > 0 and result > SIZE_MAX/i, then result*i would overflow.
+
11451 // This check must happen before multiplication since overflow detection after the fact is unreliable
+
11452 // as modular arithmetic can produce any value, not just 0 or SIZE_MAX.
+
11453 if (JSON_HEDLEY_UNLIKELY(i > 0 && result > (std::numeric_limits<std::size_t>::max)() / i)) {
+
11454 return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, exception_message(input_format, "excessive ndarray size caused overflow", "size"), nullptr));
+
11455 }
+
11456 result *= i;
+
11457 // Additional post-multiplication check to catch any edge cases the pre-check might miss
+
11458 if (result == 0 || result == npos) {
+
11459 return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, exception_message(input_format, "excessive ndarray size caused overflow", "size"), nullptr));
+
11460 }
+
11461 if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(static_cast<number_unsigned_t>(i)))) {
+
11462 return false;
+
11463 }
+
11464 }
+
11465 is_ndarray = true;
+
11466 return sax->end_array();
+
11467 }
+
11468 result = 0;
+
11469 return true;
+
11470 }
+
11471
+
11472 default:
+
11473 break;
+
11474 }
+
11475 auto last_token = get_token_string();
+
11476 std::string message;
+
11477
+
11478 if (input_format != input_format_t::bjdata) {
+
11479 message = "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token;
+
11480 }
+
11481 else {
+
11482 message = "expected length type specification (U, i, u, I, m, l, M, L) after '#'; last byte: 0x" + last_token;
+
11483 }
+
11484 return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format, message, "size"), nullptr));
+
11485 }
+
11486
+
11498 bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& result, bool inside_ndarray = false) {
+
11499 result.first = npos; // size
+
11500 result.second = 0; // type
+
11501 bool is_ndarray = false;
+
11502
+
11503 get_ignore_noop();
+
11504
+
11505 if (current == '$') {
+
11506 result.second = get(); // must not ignore 'N', because 'N' maybe the type
+
11507 if (input_format == input_format_t::bjdata
+
11508 && JSON_HEDLEY_UNLIKELY(std::binary_search(bjd_optimized_type_markers.begin(), bjd_optimized_type_markers.end(), result.second))) {
+
11509 auto last_token = get_token_string();
+
11510 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
11511 exception_message(input_format, concat("marker 0x", last_token, " is not a permitted optimized array type"), "type"), nullptr));
+
11512 }
+
11513
+
11514 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "type"))) {
+
11515 return false;
+
11516 }
+
11517
+
11518 get_ignore_noop();
+
11519 if (JSON_HEDLEY_UNLIKELY(current != '#')) {
+
11520 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "value"))) {
+
11521 return false;
+
11522 }
+
11523 auto last_token = get_token_string();
+
11524 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
11525 exception_message(input_format, concat("expected '#' after type information; last byte: 0x", last_token), "size"), nullptr));
+
11526 }
+
11527
+
11528 const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
+
11529 if (input_format == input_format_t::bjdata && is_ndarray) {
+
11530 if (inside_ndarray) {
+
11531 return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,
+
11532 exception_message(input_format, "ndarray can not be recursive", "size"), nullptr));
+
11533 }
+
11534 result.second |= (1 << 8); // use bit 8 to indicate ndarray, all UBJSON and BJData markers should be ASCII letters
+
11535 }
+
11536 return is_error;
+
11537 }
+
11538
+
11539 if (current == '#') {
+
11540 const bool is_error = get_ubjson_size_value(result.first, is_ndarray);
+
11541 if (input_format == input_format_t::bjdata && is_ndarray) {
+
11542 return sax->parse_error(chars_read, get_token_string(), parse_error::create(112, chars_read,
+
11543 exception_message(input_format, "ndarray requires both type and size", "size"), nullptr));
+
11544 }
+
11545 return is_error;
+
11546 }
+
11547
+
11548 return true;
+
11549 }
+
11550
+
11555 bool get_ubjson_value(const char_int_type prefix) {
+
11556 switch (prefix) {
+
11557 case char_traits<char_type>::eof(): // EOF
+
11558 return unexpect_eof(input_format, "value");
+
11559
+
11560 case 'T': // true
+
11561 return sax->boolean(true);
+
11562 case 'F': // false
+
11563 return sax->boolean(false);
+
11564
+
11565 case 'Z': // null
+
11566 return sax->null();
+
11567
+
11568 case 'B': // byte
+
11569 {
+
11570 if (input_format != input_format_t::bjdata) {
+
11571 break;
+
11572 }
+
11573 std::uint8_t number{};
+
11574 return get_number(input_format, number) && sax->number_unsigned(number);
+
11575 }
+
11576
+
11577 case 'U':
+
11578 {
+
11579 std::uint8_t number{};
+
11580 return get_number(input_format, number) && sax->number_unsigned(number);
+
11581 }
+
11582
+
11583 case 'i':
+
11584 {
+
11585 std::int8_t number{};
+
11586 return get_number(input_format, number) && sax->number_integer(number);
+
11587 }
+
11588
+
11589 case 'I':
+
11590 {
+
11591 std::int16_t number{};
+
11592 return get_number(input_format, number) && sax->number_integer(number);
+
11593 }
+
11594
+
11595 case 'l':
+
11596 {
+
11597 std::int32_t number{};
+
11598 return get_number(input_format, number) && sax->number_integer(number);
+
11599 }
+
11600
+
11601 case 'L':
+
11602 {
+
11603 std::int64_t number{};
+
11604 return get_number(input_format, number) && sax->number_integer(number);
+
11605 }
+
11606
+
11607 case 'u':
+
11608 {
+
11609 if (input_format != input_format_t::bjdata) {
+
11610 break;
+
11611 }
+
11612 std::uint16_t number{};
+
11613 return get_number(input_format, number) && sax->number_unsigned(number);
+
11614 }
+
11615
+
11616 case 'm':
+
11617 {
+
11618 if (input_format != input_format_t::bjdata) {
+
11619 break;
+
11620 }
+
11621 std::uint32_t number{};
+
11622 return get_number(input_format, number) && sax->number_unsigned(number);
+
11623 }
+
11624
+
11625 case 'M':
+
11626 {
+
11627 if (input_format != input_format_t::bjdata) {
+
11628 break;
+
11629 }
+
11630 std::uint64_t number{};
+
11631 return get_number(input_format, number) && sax->number_unsigned(number);
+
11632 }
+
11633
+
11634 case 'h':
+
11635 {
+
11636 if (input_format != input_format_t::bjdata) {
+
11637 break;
+
11638 }
+
11639 const auto byte1_raw = get();
+
11640 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) {
+
11641 return false;
+
11642 }
+
11643 const auto byte2_raw = get();
+
11644 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) {
+
11645 return false;
+
11646 }
+
11647
+
11648 const auto byte1 = static_cast<unsigned char>(byte1_raw);
+
11649 const auto byte2 = static_cast<unsigned char>(byte2_raw);
+
11650
+
11651 // Code from RFC 7049, Appendix D, Figure 3:
+
11652 // As half-precision floating-point numbers were only added
+
11653 // to IEEE 754 in 2008, today's programming platforms often
+
11654 // still only have limited support for them. It is very
+
11655 // easy to include at least decoding support for them even
+
11656 // without such support. An example of a small decoder for
+
11657 // half-precision floating-point numbers in the C language
+
11658 // is shown in Fig. 3.
+
11659 const auto half = static_cast<unsigned int>((byte2 << 8u) + byte1);
+
11660 const double val = [&half] {
+
11661 const int exp = (half >> 10u) & 0x1Fu;
+
11662 const unsigned int mant = half & 0x3FFu;
+
11663 JSON_ASSERT(0 <= exp && exp <= 32);
+
11664 JSON_ASSERT(mant <= 1024);
+
11665 switch (exp) {
+
11666 case 0:
+
11667 return std::ldexp(mant, -24);
+
11668 case 31:
+
11669 return (mant == 0)
+
11670 ? std::numeric_limits<double>::infinity()
+
11671 : std::numeric_limits<double>::quiet_NaN();
+
11672 default:
+
11673 return std::ldexp(mant + 1024, exp - 25);
+
11674 }
+
11675 }();
+
11676 return sax->number_float((half & 0x8000u) != 0
+
11677 ? static_cast<number_float_t>(-val)
+
11678 : static_cast<number_float_t>(val), "");
+
11679 }
+
11680
+
11681 case 'd':
+
11682 {
+
11683 float number{};
+
11684 return get_number(input_format, number) && sax->number_float(static_cast<number_float_t>(number), "");
+
11685 }
+
11686
+
11687 case 'D':
+
11688 {
+
11689 double number{};
+
11690 return get_number(input_format, number) && sax->number_float(static_cast<number_float_t>(number), "");
+
11691 }
+
11692
+
11693 case 'H':
+
11694 {
+
11695 return get_ubjson_high_precision_number();
+
11696 }
+
11697
+
11698 case 'C': // char
+
11699 {
+
11700 get();
+
11701 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "char"))) {
+
11702 return false;
+
11703 }
+
11704 if (JSON_HEDLEY_UNLIKELY(current > 127)) {
+
11705 auto last_token = get_token_string();
+
11706 return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read,
+
11707 exception_message(input_format, concat("byte after 'C' must be in range 0x00..0x7F; last byte: 0x", last_token), "char"), nullptr));
+
11708 }
+
11709 string_t s(1, static_cast<typename string_t::value_type>(current));
+
11710 return sax->string(s);
+
11711 }
+
11712
+
11713 case 'S': // string
+
11714 {
+
11715 string_t s;
+
11716 return get_ubjson_string(s) && sax->string(s);
+
11717 }
+
11718
+
11719 case '[': // array
+
11720 return get_ubjson_array();
+
11721
+
11722 case '{': // object
+
11723 return get_ubjson_object();
+
11724
+
11725 default: // anything else
+
11726 break;
+
11727 }
+
11728 auto last_token = get_token_string();
+
11729 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format, "invalid byte: 0x" + last_token, "value"), nullptr));
+
11730 }
+
11731
+
11735 bool get_ubjson_array() {
+
11736 std::pair<std::size_t, char_int_type> size_and_type;
+
11737 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) {
+
11738 return false;
+
11739 }
+
11740
+
11741 // if bit-8 of size_and_type.second is set to 1, encode bjdata ndarray as an object in JData annotated array format (https://github.com/NeuroJSON/jdata):
+
11742 // {"_ArrayType_" : "typeid", "_ArraySize_" : [n1, n2, ...], "_ArrayData_" : [v1, v2, ...]}
+
11743
+
11744 if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0) {
+
11745 size_and_type.second &= ~(static_cast<char_int_type>(1) << 8); // use bit 8 to indicate ndarray, here we remove the bit to restore the type marker
+
11746 auto it = std::lower_bound(bjd_types_map.begin(), bjd_types_map.end(), size_and_type.second, [](const bjd_type& p, char_int_type t) {
+
11747 return p.first < t;
+
11748 });
+
11749 string_t key = "_ArrayType_";
+
11750 if (JSON_HEDLEY_UNLIKELY(it == bjd_types_map.end() || it->first != size_and_type.second)) {
+
11751 auto last_token = get_token_string();
+
11752 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
11753 exception_message(input_format, "invalid byte: 0x" + last_token, "type"), nullptr));
+
11754 }
+
11755
+
11756 string_t type = it->second; // sax->string() takes a reference
+
11757 if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->string(type))) {
+
11758 return false;
+
11759 }
+
11760
+
11761 if (size_and_type.second == 'C' || size_and_type.second == 'B') {
+
11762 size_and_type.second = 'U';
+
11763 }
+
11764
+
11765 key = "_ArrayData_";
+
11766 if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->start_array(size_and_type.first))) {
+
11767 return false;
+
11768 }
+
11769
+
11770 for (std::size_t i = 0; i < size_and_type.first; ++i) {
+
11771 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) {
+
11772 return false;
+
11773 }
+
11774 }
+
11775
+
11776 return (sax->end_array() && sax->end_object());
+
11777 }
+
11778
+
11779 // If BJData type marker is 'B' decode as binary
+
11780 if (input_format == input_format_t::bjdata && size_and_type.first != npos && size_and_type.second == 'B') {
+
11781 binary_t result;
+
11782 return get_binary(input_format, size_and_type.first, result) && sax->binary(result);
+
11783 }
+
11784
+
11785 if (size_and_type.first != npos) {
+
11786 if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) {
+
11787 return false;
+
11788 }
+
11789
+
11790 if (size_and_type.second != 0) {
+
11791 if (size_and_type.second != 'N') {
+
11792 for (std::size_t i = 0; i < size_and_type.first; ++i) {
+
11793 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) {
+
11794 return false;
+
11795 }
+
11796 }
+
11797 }
+
11798 }
+
11799 else {
+
11800 for (std::size_t i = 0; i < size_and_type.first; ++i) {
+
11801 if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) {
+
11802 return false;
+
11803 }
+
11804 }
+
11805 }
+
11806 }
+
11807 else {
+
11808 if (JSON_HEDLEY_UNLIKELY(!sax->start_array(detail::unknown_size()))) {
+
11809 return false;
+
11810 }
+
11811
+
11812 while (current != ']') {
+
11813 if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false))) {
+
11814 return false;
+
11815 }
+
11816 get_ignore_noop();
+
11817 }
+
11818 }
+
11819
+
11820 return sax->end_array();
+
11821 }
+
11822
+
11826 bool get_ubjson_object() {
+
11827 std::pair<std::size_t, char_int_type> size_and_type;
+
11828 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) {
+
11829 return false;
+
11830 }
+
11831
+
11832 // do not accept ND-array size in objects in BJData
+
11833 if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0) {
+
11834 auto last_token = get_token_string();
+
11835 return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read,
+
11836 exception_message(input_format, "BJData object does not support ND-array size in optimized format", "object"), nullptr));
+
11837 }
+
11838
+
11839 string_t key;
+
11840 if (size_and_type.first != npos) {
+
11841 if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) {
+
11842 return false;
+
11843 }
+
11844
+
11845 if (size_and_type.second != 0) {
+
11846 for (std::size_t i = 0; i < size_and_type.first; ++i) {
+
11847 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) {
+
11848 return false;
+
11849 }
+
11850 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) {
+
11851 return false;
+
11852 }
+
11853 key.clear();
+
11854 }
+
11855 }
+
11856 else {
+
11857 for (std::size_t i = 0; i < size_and_type.first; ++i) {
+
11858 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) {
+
11859 return false;
+
11860 }
+
11861 if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) {
+
11862 return false;
+
11863 }
+
11864 key.clear();
+
11865 }
+
11866 }
+
11867 }
+
11868 else {
+
11869 if (JSON_HEDLEY_UNLIKELY(!sax->start_object(detail::unknown_size()))) {
+
11870 return false;
+
11871 }
+
11872
+
11873 while (current != '}') {
+
11874 if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key))) {
+
11875 return false;
+
11876 }
+
11877 if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) {
+
11878 return false;
+
11879 }
+
11880 get_ignore_noop();
+
11881 key.clear();
+
11882 }
+
11883 }
+
11884
+
11885 return sax->end_object();
+
11886 }
+
11887
+
11888 // Note, no reader for UBJSON binary types is implemented because they do
+
11889 // not exist
+
11890
+
11891 bool get_ubjson_high_precision_number() {
+
11892 // get the size of the following number string
+
11893 std::size_t size{};
+
11894 bool no_ndarray = true;
+
11895 auto res = get_ubjson_size_value(size, no_ndarray);
+
11896 if (JSON_HEDLEY_UNLIKELY(!res)) {
+
11897 return res;
+
11898 }
+
11899
+
11900 // get number string
+
11901 std::vector<char> number_vector;
+
11902 for (std::size_t i = 0; i < size; ++i) {
+
11903 get();
+
11904 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format, "number"))) {
+
11905 return false;
+
11906 }
+
11907 number_vector.push_back(static_cast<char>(current));
+
11908 }
+
11909
+
11910 // parse number string
+
11911 using ia_type = decltype(detail::input_adapter(number_vector));
+
11912 auto number_lexer = detail::lexer<BasicJsonType, ia_type>(detail::input_adapter(number_vector), false);
+
11913 const auto result_number = number_lexer.scan();
+
11914 const auto number_string = number_lexer.get_token_string();
+
11915 const auto result_remainder = number_lexer.scan();
+
11916
+
11917 using token_type = typename detail::lexer_base<BasicJsonType>::token_type;
+
11918
+
11919 if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) {
+
11920 return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read,
+
11921 exception_message(input_format, concat("invalid number text: ", number_lexer.get_token_string()), "high-precision number"), nullptr));
+
11922 }
+
11923
+
11924 switch (result_number) {
+
11925 case token_type::value_integer:
+
11926 return sax->number_integer(number_lexer.get_number_integer());
+
11927 case token_type::value_unsigned:
+
11928 return sax->number_unsigned(number_lexer.get_number_unsigned());
+
11929 case token_type::value_float:
+
11930 return sax->number_float(number_lexer.get_number_float(), std::move(number_string));
+
11931 case token_type::uninitialized:
+
11932 case token_type::literal_true:
+
11933 case token_type::literal_false:
+
11934 case token_type::literal_null:
+
11935 case token_type::value_string:
+
11936 case token_type::begin_array:
+
11937 case token_type::begin_object:
+
11938 case token_type::end_array:
+
11939 case token_type::end_object:
+
11940 case token_type::name_separator:
+
11941 case token_type::value_separator:
+
11942 case token_type::parse_error:
+
11943 case token_type::end_of_input:
+
11944 case token_type::literal_or_value:
+
11945 default:
+
11946 return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read,
+
11947 exception_message(input_format, concat("invalid number text: ", number_lexer.get_token_string()), "high-precision number"), nullptr));
+
11948 }
+
11949 }
+
11950
+
11952 // Utility functions //
+
11954
+
11964 char_int_type get() {
+
11965 ++chars_read;
+
11966 return current = ia.get_character();
+
11967 }
+
11968
+
11977 template<class T>
+
11978 bool get_to(T& dest, const input_format_t format, const char* context) {
+
11979 auto new_chars_read = ia.get_elements(&dest);
+
11980 chars_read += new_chars_read;
+
11981 if (JSON_HEDLEY_UNLIKELY(new_chars_read < sizeof(T))) {
+
11982 // in case of failure, advance position by 1 to report the failing location
+
11983 ++chars_read;
+
11984 sax->parse_error(chars_read, "<end of file>", parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), nullptr));
+
11985 return false;
+
11986 }
+
11987 return true;
+
11988 }
+
11989
+
11993 char_int_type get_ignore_noop() {
+
11994 do {
+
11995 get();
+
11996 } while (current == 'N');
+
11997
+
11998 return current;
+
11999 }
+
12000
+
12001 template<class NumberType>
+
12002 static void byte_swap(NumberType& number) {
+
12003 constexpr std::size_t sz = sizeof(number);
+
12004#ifdef __cpp_lib_byteswap
+
12005 if constexpr (sz == 1) {
+
12006 return;
+
12007 }
+
12008 else if constexpr (std::is_integral_v<NumberType>) {
+
12009 number = std::byteswap(number);
+
12010 return;
+
12011 }
+
12012 else {
+
12013#endif
+
12014 auto* ptr = reinterpret_cast<std::uint8_t*>(&number);
+
12015 for (std::size_t i = 0; i < sz / 2; ++i) {
+
12016 std::swap(ptr[i], ptr[sz - i - 1]);
+
12017 }
+
12018#ifdef __cpp_lib_byteswap
+
12019 }
+
12020#endif
+
12021 }
+
12022
+
12023 /*
+
12024 @brief read a number from the input
+
12025
+
12026 @tparam NumberType the type of the number
+
12027 @param[in] format the current format (for diagnostics)
+
12028 @param[out] result number of type @a NumberType
+
12029
+
12030 @return whether conversion completed
+
12031
+
12032 @note This function needs to respect the system's endianness, because
+
12033 bytes in CBOR, MessagePack, and UBJSON are stored in network order
+
12034 (big endian) and therefore need reordering on little endian systems.
+
12035 On the other hand, BSON and BJData use little endian and should reorder
+
12036 on big endian systems.
+
12037 */
+
12038 template<typename NumberType, bool InputIsLittleEndian = false>
+
12039 bool get_number(const input_format_t format, NumberType& result) {
+
12040 // read in the original format
+
12041
+
12042 if (JSON_HEDLEY_UNLIKELY(!get_to(result, format, "number"))) {
+
12043 return false;
+
12044 }
+
12045 if (is_little_endian != (InputIsLittleEndian || format == input_format_t::bjdata)) {
+
12046 byte_swap(result);
+
12047 }
+
12048 return true;
+
12049 }
+
12050
+
12065 template<typename NumberType>
+
12066 bool get_string(const input_format_t format,
+
12067 const NumberType len,
+
12068 string_t& result) {
+
12069 bool success = true;
+
12070 for (NumberType i = 0; i < len; i++) {
+
12071 get();
+
12072 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) {
+
12073 success = false;
+
12074 break;
+
12075 }
+
12076 result.push_back(static_cast<typename string_t::value_type>(current));
+
12077 }
+
12078 return success;
+
12079 }
+
12080
+
12095 template<typename NumberType>
+
12096 bool get_binary(const input_format_t format,
+
12097 const NumberType len,
+
12098 binary_t& result) {
+
12099 bool success = true;
+
12100 for (NumberType i = 0; i < len; i++) {
+
12101 get();
+
12102 if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) {
+
12103 success = false;
+
12104 break;
+
12105 }
+
12106 result.push_back(static_cast<typename binary_t::value_type>(current));
+
12107 }
+
12108 return success;
+
12109 }
+
12110
+
12116 JSON_HEDLEY_NON_NULL(3)
+
12117 bool unexpect_eof(const input_format_t format, const char* context) const {
+
12118 if (JSON_HEDLEY_UNLIKELY(current == char_traits<char_type>::eof())) {
+
12119 return sax->parse_error(chars_read, "<end of file>",
+
12120 parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context), nullptr));
+
12121 }
+
12122 return true;
+
12123 }
+
12124
+
12128 std::string get_token_string() const {
+
12129 std::array<char, 3> cr{ {} };
+
12130 static_cast<void>((std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast<unsigned char>(current))); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
+
12131 return std::string{ cr.data() };
+
12132 }
+
12133
+
12140 std::string exception_message(const input_format_t format,
+
12141 const std::string& detail,
+
12142 const std::string& context) const {
+
12143 std::string error_msg = "syntax error while parsing ";
+
12144
+
12145 switch (format) {
+
12146 case input_format_t::cbor:
+
12147 error_msg += "CBOR";
+
12148 break;
+
12149
+
12150 case input_format_t::msgpack:
+
12151 error_msg += "MessagePack";
+
12152 break;
+
12153
+
12154 case input_format_t::ubjson:
+
12155 error_msg += "UBJSON";
+
12156 break;
+
12157
+
12158 case input_format_t::bson:
+
12159 error_msg += "BSON";
+
12160 break;
+
12161
+
12162 case input_format_t::bjdata:
+
12163 error_msg += "BJData";
+
12164 break;
+
12165
+
12166 case input_format_t::json: // LCOV_EXCL_LINE
+
12167 default: // LCOV_EXCL_LINE
+
12168 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
12169 }
+
12170
+
12171 return concat(error_msg, ' ', context, ": ", detail);
+
12172 }
+
12173
+
12174 private:
+
12175 static JSON_INLINE_VARIABLE constexpr std::size_t npos = detail::unknown_size();
+
12176
+
12178 InputAdapterType ia;
+
12179
+
12181 char_int_type current = char_traits<char_type>::eof();
+
12182
+
12184 std::size_t chars_read = 0;
+
12185
+
12187 const bool is_little_endian = little_endianness();
+
12188
+
12190 const input_format_t input_format = input_format_t::json;
+
12191
+
12193 json_sax_t* sax = nullptr;
+
12194
+
12195 // excluded markers in bjdata optimized type
+
12196#define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ \
+
12197 make_array<char_int_type>('F', 'H', 'N', 'S', 'T', 'Z', '[', '{')
+
12198
+
12199#define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ \
+
12200 make_array<bjd_type>( \
+
12201 bjd_type{'B', "byte"}, \
+
12202 bjd_type{'C', "char"}, \
+
12203 bjd_type{'D', "double"}, \
+
12204 bjd_type{'I', "int16"}, \
+
12205 bjd_type{'L', "int64"}, \
+
12206 bjd_type{'M', "uint64"}, \
+
12207 bjd_type{'U', "uint8"}, \
+
12208 bjd_type{'d', "single"}, \
+
12209 bjd_type{'i', "int8"}, \
+
12210 bjd_type{'l', "int32"}, \
+
12211 bjd_type{'m', "uint32"}, \
+
12212 bjd_type{'u', "uint16"})
+
12213
+
12214 JSON_PRIVATE_UNLESS_TESTED:
+
12215 // lookup tables
+
12216 // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes)
+
12217 const decltype(JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_) bjd_optimized_type_markers =
+
12218 JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_;
+
12219
+
12220 using bjd_type = std::pair<char_int_type, string_t>;
+
12221 // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes)
+
12222 const decltype(JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_) bjd_types_map =
+
12223 JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_;
+
12224
+
12225#undef JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_
+
12226#undef JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_
+
12227 };
+
+
12228
+
12229#ifndef JSON_HAS_CPP_17
+
12230 template<typename BasicJsonType, typename InputAdapterType, typename SAX>
+
12231 constexpr std::size_t binary_reader<BasicJsonType, InputAdapterType, SAX>::npos;
+
12232#endif
+
12233
+
12234} // namespace detail
+
12235NLOHMANN_JSON_NAMESPACE_END
+
12236
+
12237// #include <nlohmann/detail/input/input_adapters.hpp>
+
12238
+
12239// #include <nlohmann/detail/input/lexer.hpp>
+
12240
+
12241// #include <nlohmann/detail/input/parser.hpp>
+
12242// __ _____ _____ _____
+
12243// __| | __| | | | JSON for Modern C++
+
12244// | | |__ | | | | | | version 3.12.0
+
12245// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
12246//
+
12247// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
12248// SPDX-License-Identifier: MIT
+
12249
+
12250
+
12251
+
12252#include <cmath> // isfinite
+
12253#include <cstdint> // uint8_t
+
12254#include <functional> // function
+
12255#include <string> // string
+
12256#include <utility> // move
+
12257#include <vector> // vector
+
12258
+
12259// #include <nlohmann/detail/exceptions.hpp>
+
12260
+
12261// #include <nlohmann/detail/input/input_adapters.hpp>
+
12262
+
12263// #include <nlohmann/detail/input/json_sax.hpp>
+
12264
+
12265// #include <nlohmann/detail/input/lexer.hpp>
+
12266
+
12267// #include <nlohmann/detail/macro_scope.hpp>
+
12268
+
12269// #include <nlohmann/detail/meta/is_sax.hpp>
+
12270
+
12271// #include <nlohmann/detail/string_concat.hpp>
+
12272
+
12273// #include <nlohmann/detail/value_t.hpp>
+
12274
+
12275
+
12276NLOHMANN_JSON_NAMESPACE_BEGIN
+
12277namespace detail {
+
12279 // parser //
+
12281
+
12282 enum class parse_event_t : std::uint8_t {
+
12284 object_start,
+
12286 object_end,
+
12288 array_start,
+
12290 array_end,
+
12292 key,
+
12294 value
+
12295 };
+
12296
+
12297 template<typename BasicJsonType>
+
12298 using parser_callback_t =
+
12299 std::function<bool(int /*depth*/, parse_event_t /*event*/, BasicJsonType& /*parsed*/)>;
+
12300
+
12306 template<typename BasicJsonType, typename InputAdapterType>
+
+
12307 class parser {
+
12308 using number_integer_t = typename BasicJsonType::number_integer_t;
+
12309 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
12310 using number_float_t = typename BasicJsonType::number_float_t;
+
12311 using string_t = typename BasicJsonType::string_t;
+ +
12313 using token_type = typename lexer_t::token_type;
+
12314
+
12315 public:
+
12317 explicit parser(InputAdapterType&& adapter,
+
12318 parser_callback_t<BasicJsonType> cb = nullptr,
+
12319 const bool allow_exceptions_ = true,
+
12320 const bool ignore_comments = false,
+
12321 const bool ignore_trailing_commas_ = false)
+
12322 : callback(std::move(cb))
+
12323 , m_lexer(std::move(adapter), ignore_comments)
+
12324 , allow_exceptions(allow_exceptions_)
+
12325 , ignore_trailing_commas(ignore_trailing_commas_) {
+
12326 // read first token
+
12327 get_token();
+
12328 }
+
12329
+
+
12340 void parse(const bool strict, BasicJsonType& result) {
+
12341 if (callback) {
+
12342 json_sax_dom_callback_parser<BasicJsonType, InputAdapterType> sdp(result, callback, allow_exceptions, &m_lexer);
+
12343 sax_parse_internal(&sdp);
+
12344
+
12345 // in strict mode, input must be completely read
+
12346 if (strict && (get_token() != token_type::end_of_input)) {
+
12347 sdp.parse_error(m_lexer.get_position(),
+
12348 m_lexer.get_token_string(),
+
12349 parse_error::create(101, m_lexer.get_position(),
+
12350 exception_message(token_type::end_of_input, "value"), nullptr));
+
12351 }
+
12352
+
12353 // in case of an error, return a discarded value
+
12354 if (sdp.is_errored()) {
+
12355 result = value_t::discarded;
+
12356 return;
+
12357 }
+
12358
+
12359 // set top-level value to null if it was discarded by the callback
+
12360 // function
+
12361 if (result.is_discarded()) {
+
12362 result = nullptr;
+
12363 }
+
12364 }
+
12365 else {
+
12366 json_sax_dom_parser<BasicJsonType, InputAdapterType> sdp(result, allow_exceptions, &m_lexer);
+
12367 sax_parse_internal(&sdp);
+
12368
+
12369 // in strict mode, input must be completely read
+
12370 if (strict && (get_token() != token_type::end_of_input)) {
+
12371 sdp.parse_error(m_lexer.get_position(),
+
12372 m_lexer.get_token_string(),
+
12373 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), nullptr));
+
12374 }
+
12375
+
12376 // in case of an error, return a discarded value
+
12377 if (sdp.is_errored()) {
+
12378 result = value_t::discarded;
+
12379 return;
+
12380 }
+
12381 }
+
12382
+
12383 result.assert_invariant();
+
12384 }
+
+
12385
+
+
12392 bool accept(const bool strict = true) {
+ +
12394 return sax_parse(&sax_acceptor, strict);
+
12395 }
+
+
12396
+
12397 template<typename SAX>
+
12398 JSON_HEDLEY_NON_NULL(2)
+
12399 bool sax_parse(SAX* sax, const bool strict = true) {
+ +
12401 const bool result = sax_parse_internal(sax);
+
12402
+
12403 // strict mode: next byte must be EOF
+
12404 if (result && strict && (get_token() != token_type::end_of_input)) {
+
12405 return sax->parse_error(m_lexer.get_position(),
+
12406 m_lexer.get_token_string(),
+
12407 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_of_input, "value"), nullptr));
+
12408 }
+
12409
+
12410 return result;
+
12411 }
+
12412
+
12413 private:
+
12414 template<typename SAX>
+
12415 JSON_HEDLEY_NON_NULL(2)
+
12416 bool sax_parse_internal(SAX* sax) {
+
12417 // stack to remember the hierarchy of structured values we are parsing
+
12418 // true = array; false = object
+
12419 std::vector<bool> states;
+
12420 // value to avoid a goto (see comment where set to true)
+
12421 bool skip_to_state_evaluation = false;
+
12422
+
12423 while (true) {
+
12424 if (!skip_to_state_evaluation) {
+
12425 // invariant: get_token() was called before each iteration
+
12426 switch (last_token) {
+
12427 case token_type::begin_object:
+
12428 {
+
12429 if (JSON_HEDLEY_UNLIKELY(!sax->start_object(detail::unknown_size()))) {
+
12430 return false;
+
12431 }
+
12432
+
12433 // closing } -> we are done
+
12434 if (get_token() == token_type::end_object) {
+
12435 if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) {
+
12436 return false;
+
12437 }
+
12438 break;
+
12439 }
+
12440
+
12441 // parse key
+
12442 if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) {
+
12443 return sax->parse_error(m_lexer.get_position(),
+
12444 m_lexer.get_token_string(),
+
12445 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), nullptr));
+
12446 }
+
12447 if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) {
+
12448 return false;
+
12449 }
+
12450
+
12451 // parse separator (:)
+
12452 if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) {
+
12453 return sax->parse_error(m_lexer.get_position(),
+
12454 m_lexer.get_token_string(),
+
12455 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), nullptr));
+
12456 }
+
12457
+
12458 // remember we are now inside an object
+
12459 states.push_back(false);
+
12460
+
12461 // parse values
+
12462 get_token();
+
12463 continue;
+
12464 }
+
12465
+
12466 case token_type::begin_array:
+
12467 {
+
12468 if (JSON_HEDLEY_UNLIKELY(!sax->start_array(detail::unknown_size()))) {
+
12469 return false;
+
12470 }
+
12471
+
12472 // closing ] -> we are done
+
12473 if (get_token() == token_type::end_array) {
+
12474 if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) {
+
12475 return false;
+
12476 }
+
12477 break;
+
12478 }
+
12479
+
12480 // remember we are now inside an array
+
12481 states.push_back(true);
+
12482
+
12483 // parse values (no need to call get_token)
+
12484 continue;
+
12485 }
+
12486
+
12487 case token_type::value_float:
+
12488 {
+
12489 const auto res = m_lexer.get_number_float();
+
12490
+
12491 if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res))) {
+
12492 return sax->parse_error(m_lexer.get_position(),
+
12493 m_lexer.get_token_string(),
+
12494 out_of_range::create(406, concat("number overflow parsing '", m_lexer.get_token_string(), '\''), nullptr));
+
12495 }
+
12496
+
12497 if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string()))) {
+
12498 return false;
+
12499 }
+
12500
+
12501 break;
+
12502 }
+
12503
+
12504 case token_type::literal_false:
+
12505 {
+
12506 if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false))) {
+
12507 return false;
+
12508 }
+
12509 break;
+
12510 }
+
12511
+
12512 case token_type::literal_null:
+
12513 {
+
12514 if (JSON_HEDLEY_UNLIKELY(!sax->null())) {
+
12515 return false;
+
12516 }
+
12517 break;
+
12518 }
+
12519
+
12520 case token_type::literal_true:
+
12521 {
+
12522 if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true))) {
+
12523 return false;
+
12524 }
+
12525 break;
+
12526 }
+
12527
+
12528 case token_type::value_integer:
+
12529 {
+
12530 if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer()))) {
+
12531 return false;
+
12532 }
+
12533 break;
+
12534 }
+
12535
+
12536 case token_type::value_string:
+
12537 {
+
12538 if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string()))) {
+
12539 return false;
+
12540 }
+
12541 break;
+
12542 }
+
12543
+
12544 case token_type::value_unsigned:
+
12545 {
+
12546 if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned()))) {
+
12547 return false;
+
12548 }
+
12549 break;
+
12550 }
+
12551
+
12552 case token_type::parse_error:
+
12553 {
+
12554 // using "uninitialized" to avoid an "expected" message
+
12555 return sax->parse_error(m_lexer.get_position(),
+
12556 m_lexer.get_token_string(),
+
12557 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::uninitialized, "value"), nullptr));
+
12558 }
+
12559 case token_type::end_of_input:
+
12560 {
+
12561 if (JSON_HEDLEY_UNLIKELY(m_lexer.get_position().chars_read_total == 1)) {
+
12562 return sax->parse_error(m_lexer.get_position(),
+
12563 m_lexer.get_token_string(),
+
12564 parse_error::create(101, m_lexer.get_position(),
+
12565 "attempting to parse an empty input; check that your input string or stream contains the expected JSON", nullptr));
+
12566 }
+
12567
+
12568 return sax->parse_error(m_lexer.get_position(),
+
12569 m_lexer.get_token_string(),
+
12570 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), nullptr));
+
12571 }
+
12572 case token_type::uninitialized:
+
12573 case token_type::end_array:
+
12574 case token_type::end_object:
+
12575 case token_type::name_separator:
+
12576 case token_type::value_separator:
+
12577 case token_type::literal_or_value:
+
12578 default: // the last token was unexpected
+
12579 {
+
12580 return sax->parse_error(m_lexer.get_position(),
+
12581 m_lexer.get_token_string(),
+
12582 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::literal_or_value, "value"), nullptr));
+
12583 }
+
12584 }
+
12585 }
+
12586 else {
+
12587 skip_to_state_evaluation = false;
+
12588 }
+
12589
+
12590 // we reached this line after we successfully parsed a value
+
12591 if (states.empty()) {
+
12592 // empty stack: we reached the end of the hierarchy: done
+
12593 return true;
+
12594 }
+
12595
+
12596 if (states.back()) // array
+
12597 {
+
12598 // comma -> next value
+
12599 // or end of array (ignore_trailing_commas = true)
+
12600 if (get_token() == token_type::value_separator) {
+
12601 // parse a new value
+
12602 get_token();
+
12603
+
12604 // if ignore_trailing_commas and last_token is ], we can continue to "closing ]"
+
12605 if (!(ignore_trailing_commas && last_token == token_type::end_array)) {
+
12606 continue;
+
12607 }
+
12608 }
+
12609
+
12610 // closing ]
+
12611 if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array)) {
+
12612 if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) {
+
12613 return false;
+
12614 }
+
12615
+
12616 // We are done with this array. Before we can parse a
+
12617 // new value, we need to evaluate the new state first.
+
12618 // By setting skip_to_state_evaluation to false, we
+
12619 // are effectively jumping to the beginning of this if.
+
12620 JSON_ASSERT(!states.empty());
+
12621 states.pop_back();
+
12622 skip_to_state_evaluation = true;
+
12623 continue;
+
12624 }
+
12625
+
12626 return sax->parse_error(m_lexer.get_position(),
+
12627 m_lexer.get_token_string(),
+
12628 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_array, "array"), nullptr));
+
12629 }
+
12630
+
12631 // states.back() is false -> object
+
12632
+
12633 // comma -> next value
+
12634 // or end of object (ignore_trailing_commas = true)
+
12635 if (get_token() == token_type::value_separator) {
+
12636 get_token();
+
12637
+
12638 // if ignore_trailing_commas and last_token is }, we can continue to "closing }"
+
12639 if (!(ignore_trailing_commas && last_token == token_type::end_object)) {
+
12640 // parse key
+
12641 if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) {
+
12642 return sax->parse_error(m_lexer.get_position(),
+
12643 m_lexer.get_token_string(),
+
12644 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::value_string, "object key"), nullptr));
+
12645 }
+
12646
+
12647 if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) {
+
12648 return false;
+
12649 }
+
12650
+
12651 // parse separator (:)
+
12652 if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) {
+
12653 return sax->parse_error(m_lexer.get_position(),
+
12654 m_lexer.get_token_string(),
+
12655 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::name_separator, "object separator"), nullptr));
+
12656 }
+
12657
+
12658 // parse values
+
12659 get_token();
+
12660 continue;
+
12661 }
+
12662 }
+
12663
+
12664 // closing }
+
12665 if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object)) {
+
12666 if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) {
+
12667 return false;
+
12668 }
+
12669
+
12670 // We are done with this object. Before we can parse a
+
12671 // new value, we need to evaluate the new state first.
+
12672 // By setting skip_to_state_evaluation to false, we
+
12673 // are effectively jumping to the beginning of this if.
+
12674 JSON_ASSERT(!states.empty());
+
12675 states.pop_back();
+
12676 skip_to_state_evaluation = true;
+
12677 continue;
+
12678 }
+
12679
+
12680 return sax->parse_error(m_lexer.get_position(),
+
12681 m_lexer.get_token_string(),
+
12682 parse_error::create(101, m_lexer.get_position(), exception_message(token_type::end_object, "object"), nullptr));
+
12683 }
+
12684 }
+
12685
+
12687 token_type get_token() {
+
12688 return last_token = m_lexer.scan();
+
12689 }
+
12690
+
12691 std::string exception_message(const token_type expected, const std::string& context) {
+
12692 std::string error_msg = "syntax error ";
+
12693
+
12694 if (!context.empty()) {
+
12695 error_msg += concat("while parsing ", context, ' ');
+
12696 }
+
12697
+
12698 error_msg += "- ";
+
12699
+
12700 if (last_token == token_type::parse_error) {
+
12701 error_msg += concat(m_lexer.get_error_message(), "; last read: '",
+
12702 m_lexer.get_token_string(), '\'');
+
12703 }
+
12704 else {
+
12705 error_msg += concat("unexpected ", lexer_t::token_type_name(last_token));
+
12706 }
+
12707
+
12708 if (expected != token_type::uninitialized) {
+
12709 error_msg += concat("; expected ", lexer_t::token_type_name(expected));
+
12710 }
+
12711
+
12712 return error_msg;
+
12713 }
+
12714
+
12715 private:
+
12717 const parser_callback_t<BasicJsonType> callback = nullptr;
+
12719 token_type last_token = token_type::uninitialized;
+
12721 lexer_t m_lexer;
+
12723 const bool allow_exceptions = true;
+
12725 const bool ignore_trailing_commas = false;
+
12726 };
+
+
12727
+
12728} // namespace detail
+
12729NLOHMANN_JSON_NAMESPACE_END
+
12730
+
12731// #include <nlohmann/detail/iterators/internal_iterator.hpp>
+
12732// __ _____ _____ _____
+
12733// __| | __| | | | JSON for Modern C++
+
12734// | | |__ | | | | | | version 3.12.0
+
12735// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
12736//
+
12737// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
12738// SPDX-License-Identifier: MIT
+
12739
+
12740
+
12741
+
12742// #include <nlohmann/detail/abi_macros.hpp>
+
12743
+
12744// #include <nlohmann/detail/iterators/primitive_iterator.hpp>
+
12745// __ _____ _____ _____
+
12746// __| | __| | | | JSON for Modern C++
+
12747// | | |__ | | | | | | version 3.12.0
+
12748// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
12749//
+
12750// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
12751// SPDX-License-Identifier: MIT
+
12752
+
12753
+
12754
+
12755#include <cstddef> // ptrdiff_t
+
12756#include <limits> // numeric_limits
+
12757
+
12758// #include <nlohmann/detail/macro_scope.hpp>
+
12759
+
12760
+
12761NLOHMANN_JSON_NAMESPACE_BEGIN
+
12762namespace detail {
+
12763
+
12764 /*
+
12765 @brief an iterator for primitive JSON types
+
12766
+
12767 This class models an iterator for primitive JSON types (boolean, number,
+
12768 string). Its only purpose is to allow the iterator/const_iterator classes
+
12769 to "iterate" over primitive values. Internally, the iterator is modeled by
+
12770 a `difference_type` variable. Value begin_value (`0`) models the begin and
+
12771 end_value (`1`) models past the end.
+
12772 */
+
+ +
12774 private:
+
12775 using difference_type = std::ptrdiff_t;
+
12776 static constexpr difference_type begin_value = 0;
+
12777 static constexpr difference_type end_value = begin_value + 1;
+
12778
+
12779 JSON_PRIVATE_UNLESS_TESTED:
+
12781 difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
+
12782
+
12783 public:
+
12784 constexpr difference_type get_value() const noexcept {
+
12785 return m_it;
+
12786 }
+
12787
+
12789 void set_begin() noexcept {
+
12790 m_it = begin_value;
+
12791 }
+
12792
+
12794 void set_end() noexcept {
+
12795 m_it = end_value;
+
12796 }
+
12797
+
12799 constexpr bool is_begin() const noexcept {
+
12800 return m_it == begin_value;
+
12801 }
+
12802
+
12804 constexpr bool is_end() const noexcept {
+
12805 return m_it == end_value;
+
12806 }
+
12807
+
12808 friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept {
+
12809 return lhs.m_it == rhs.m_it;
+
12810 }
+
12811
+
12812 friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept {
+
12813 return lhs.m_it < rhs.m_it;
+
12814 }
+
12815
+
12816 primitive_iterator_t operator+(difference_type n) noexcept {
+
12817 auto result = *this;
+
12818 result += n;
+
12819 return result;
+
12820 }
+
12821
+
12822 friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept {
+
12823 return lhs.m_it - rhs.m_it;
+
12824 }
+
12825
+
12826 primitive_iterator_t& operator++() noexcept {
+
12827 ++m_it;
+
12828 return *this;
+
12829 }
+
12830
+
12831 primitive_iterator_t operator++(int)&noexcept // NOLINT(cert-dcl21-cpp)
+
12832 {
+
12833 auto result = *this;
+
12834 ++m_it;
+
12835 return result;
+
12836 }
+
12837
+
12838 primitive_iterator_t& operator--() noexcept {
+
12839 --m_it;
+
12840 return *this;
+
12841 }
+
12842
+
12843 primitive_iterator_t operator--(int)&noexcept // NOLINT(cert-dcl21-cpp)
+
12844 {
+
12845 auto result = *this;
+
12846 --m_it;
+
12847 return result;
+
12848 }
+
12849
+
12850 primitive_iterator_t& operator+=(difference_type n) noexcept {
+
12851 m_it += n;
+
12852 return *this;
+
12853 }
+
12854
+
12855 primitive_iterator_t& operator-=(difference_type n) noexcept {
+
12856 m_it -= n;
+
12857 return *this;
+
12858 }
+
12859 };
+
+
12860
+
12861} // namespace detail
+
12862NLOHMANN_JSON_NAMESPACE_END
+
12863
+
12864
+
12865NLOHMANN_JSON_NAMESPACE_BEGIN
+
12866namespace detail {
+
12867
+
+
12874 template<typename BasicJsonType> struct internal_iterator {
+
12876 typename BasicJsonType::object_t::iterator object_iterator{};
+
12878 typename BasicJsonType::array_t::iterator array_iterator{};
+
12880 primitive_iterator_t primitive_iterator{};
+
12881 };
+
+
12882
+
12883} // namespace detail
+
12884NLOHMANN_JSON_NAMESPACE_END
+
12885
+
12886// #include <nlohmann/detail/iterators/iter_impl.hpp>
+
12887// __ _____ _____ _____
+
12888// __| | __| | | | JSON for Modern C++
+
12889// | | |__ | | | | | | version 3.12.0
+
12890// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
12891//
+
12892// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
12893// SPDX-License-Identifier: MIT
+
12894
+
12895
+
12896
+
12897#include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next
+
12898#include <type_traits> // conditional, is_const, remove_const
+
12899
+
12900// #include <nlohmann/detail/exceptions.hpp>
+
12901
+
12902// #include <nlohmann/detail/iterators/internal_iterator.hpp>
+
12903
+
12904// #include <nlohmann/detail/iterators/primitive_iterator.hpp>
+
12905
+
12906// #include <nlohmann/detail/macro_scope.hpp>
+
12907
+
12908// #include <nlohmann/detail/meta/cpp_future.hpp>
+
12909
+
12910// #include <nlohmann/detail/meta/type_traits.hpp>
+
12911
+
12912// #include <nlohmann/detail/value_t.hpp>
+
12913
+
12914
+
12915NLOHMANN_JSON_NAMESPACE_BEGIN
+
12916namespace detail {
+
12917
+
12918 // forward declare to be able to friend it later on
+
12919 template<typename IteratorType> class iteration_proxy;
+
12920 template<typename IteratorType> class iteration_proxy_value;
+
12921
+
12938 template<typename BasicJsonType>
+
+
12939 class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions)
+
12940 {
+
12942 using other_iter_impl = iter_impl<typename std::conditional<std::is_const<BasicJsonType>::value, typename std::remove_const<BasicJsonType>::type, const BasicJsonType>::type>;
+
12944 friend other_iter_impl;
+
12945 friend BasicJsonType;
+ + +
12948
+
12949 using object_t = typename BasicJsonType::object_t;
+
12950 using array_t = typename BasicJsonType::array_t;
+
12951 // make sure BasicJsonType is basic_json or const basic_json
+ +
12953 "iter_impl only accepts (const) basic_json");
+
12954 // superficial check for the LegacyBidirectionalIterator named requirement
+
12955 static_assert(std::is_base_of<std::bidirectional_iterator_tag, std::bidirectional_iterator_tag>::value
+
12956 && std::is_base_of<std::bidirectional_iterator_tag, typename std::iterator_traits<typename array_t::iterator>::iterator_category>::value,
+
12957 "basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement.");
+
12958
+
12959 public:
+
12965 using iterator_category = std::bidirectional_iterator_tag;
+
12966
+
12968 using value_type = typename BasicJsonType::value_type;
+
12970 using difference_type = typename BasicJsonType::difference_type;
+
12972 using pointer = typename std::conditional<std::is_const<BasicJsonType>::value,
+
12973 typename BasicJsonType::const_pointer,
+
12974 typename BasicJsonType::pointer>::type;
+
12976 using reference =
+
12977 typename std::conditional<std::is_const<BasicJsonType>::value,
+
12978 typename BasicJsonType::const_reference,
+
12979 typename BasicJsonType::reference>::type;
+
12980
+
12981 iter_impl() = default;
+
12982 ~iter_impl() = default;
+
12983 iter_impl(iter_impl&&) noexcept = default;
+
12984 iter_impl& operator=(iter_impl&&) noexcept = default;
+
12985
+
+
12992 explicit iter_impl(pointer object) noexcept : m_object(object) {
+
12993 JSON_ASSERT(m_object != nullptr);
+
12994
+
12995 switch (m_object->m_data.m_type) {
+
12996 case value_t::object:
+
12997 {
+
12998 m_it.object_iterator = typename object_t::iterator();
+
12999 break;
+
13000 }
+
13001
+
13002 case value_t::array:
+
13003 {
+
13004 m_it.array_iterator = typename array_t::iterator();
+
13005 break;
+
13006 }
+
13007
+
13008 case value_t::null:
+
13009 case value_t::string:
+
13010 case value_t::boolean:
+ + + +
13014 case value_t::binary:
+
13015 case value_t::discarded:
+
13016 default:
+
13017 {
+
13018 m_it.primitive_iterator = primitive_iterator_t();
+
13019 break;
+
13020 }
+
13021 }
+
13022 }
+
+
13023
+
13032
+
+
13040 iter_impl(const iter_impl<const BasicJsonType>& other) noexcept
+
13041 : m_object(other.m_object), m_it(other.m_it) {}
+
+
13042
+
+
13049 iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept {
+
13050 if (&other != this) {
+
13051 m_object = other.m_object;
+
13052 m_it = other.m_it;
+
13053 }
+
13054 return *this;
+
13055 }
+
+
13056
+
+
13062 iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept
+
13063 : m_object(other.m_object), m_it(other.m_it) {}
+
+
13064
+
+
13071 iter_impl& operator=(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept // NOLINT(cert-oop54-cpp)
+
13072 {
+
13073 m_object = other.m_object;
+
13074 m_it = other.m_it;
+
13075 return *this;
+
13076 }
+
+
13077
+
13078 JSON_PRIVATE_UNLESS_TESTED:
+
13083 void set_begin() noexcept {
+
13084 JSON_ASSERT(m_object != nullptr);
+
13085
+
13086 switch (m_object->m_data.m_type) {
+
13087 case value_t::object:
+
13088 {
+
13089 m_it.object_iterator = m_object->m_data.m_value.object->begin();
+
13090 break;
+
13091 }
+
13092
+
13093 case value_t::array:
+
13094 {
+
13095 m_it.array_iterator = m_object->m_data.m_value.array->begin();
+
13096 break;
+
13097 }
+
13098
+
13099 case value_t::null:
+
13100 {
+
13101 // set to end so begin()==end() is true: null is empty
+
13102 m_it.primitive_iterator.set_end();
+
13103 break;
+
13104 }
+
13105
+
13106 case value_t::string:
+
13107 case value_t::boolean:
+
13108 case value_t::number_integer:
+
13109 case value_t::number_unsigned:
+
13110 case value_t::number_float:
+
13111 case value_t::binary:
+
13112 case value_t::discarded:
+
13113 default:
+
13114 {
+
13115 m_it.primitive_iterator.set_begin();
+
13116 break;
+
13117 }
+
13118 }
+
13119 }
+
13120
+
+
13125 void set_end() noexcept {
+
13126 JSON_ASSERT(m_object != nullptr);
+
13127
+
13128 switch (m_object->m_data.m_type) {
+
13129 case value_t::object:
+
13130 {
+
13131 m_it.object_iterator = m_object->m_data.m_value.object->end();
+
13132 break;
+
13133 }
+
13134
+
13135 case value_t::array:
+
13136 {
+
13137 m_it.array_iterator = m_object->m_data.m_value.array->end();
+
13138 break;
+
13139 }
+
13140
+
13141 case value_t::null:
+
13142 case value_t::string:
+
13143 case value_t::boolean:
+ + + +
13147 case value_t::binary:
+
13148 case value_t::discarded:
+
13149 default:
+
13150 {
+
13151 m_it.primitive_iterator.set_end();
+
13152 break;
+
13153 }
+
13154 }
+
13155 }
+
+
13156
+
13157 public:
+
+
13162 reference operator*() const {
+
13163 JSON_ASSERT(m_object != nullptr);
+
13164
+
13165 switch (m_object->m_data.m_type) {
+
13166 case value_t::object:
+
13167 {
+
13168 JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());
+
13169 return m_it.object_iterator->second;
+
13170 }
+
13171
+
13172 case value_t::array:
+
13173 {
+
13174 JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());
+
13175 return *m_it.array_iterator;
+
13176 }
+
13177
+
13178 case value_t::null:
+
13179 JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
+
13180
+
13181 case value_t::string:
+
13182 case value_t::boolean:
+ + + +
13186 case value_t::binary:
+
13187 case value_t::discarded:
+
13188 default:
+
13189 {
+
13190 if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) {
+
13191 return *m_object;
+
13192 }
+
13193
+
13194 JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
+
13195 }
+
13196 }
+
13197 }
+
+
13198
+
+
13203 pointer operator->() const {
+
13204 JSON_ASSERT(m_object != nullptr);
+
13205
+
13206 switch (m_object->m_data.m_type) {
+
13207 case value_t::object:
+
13208 {
+
13209 JSON_ASSERT(m_it.object_iterator != m_object->m_data.m_value.object->end());
+
13210 return &(m_it.object_iterator->second);
+
13211 }
+
13212
+
13213 case value_t::array:
+
13214 {
+
13215 JSON_ASSERT(m_it.array_iterator != m_object->m_data.m_value.array->end());
+
13216 return &*m_it.array_iterator;
+
13217 }
+
13218
+
13219 case value_t::null:
+
13220 case value_t::string:
+
13221 case value_t::boolean:
+ + + +
13225 case value_t::binary:
+
13226 case value_t::discarded:
+
13227 default:
+
13228 {
+
13229 if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) {
+
13230 return m_object;
+
13231 }
+
13232
+
13233 JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
+
13234 }
+
13235 }
+
13236 }
+
+
13237
+
+
13242 iter_impl operator++(int)& // NOLINT(cert-dcl21-cpp)
+
13243 {
+
13244 auto result = *this;
+
13245 ++(*this);
+
13246 return result;
+
13247 }
+
+
13248
+
+
13253 iter_impl& operator++() {
+
13254 JSON_ASSERT(m_object != nullptr);
+
13255
+
13256 switch (m_object->m_data.m_type) {
+
13257 case value_t::object:
+
13258 {
+
13259 std::advance(m_it.object_iterator, 1);
+
13260 break;
+
13261 }
+
13262
+
13263 case value_t::array:
+
13264 {
+
13265 std::advance(m_it.array_iterator, 1);
+
13266 break;
+
13267 }
+
13268
+
13269 case value_t::null:
+
13270 case value_t::string:
+
13271 case value_t::boolean:
+ + + +
13275 case value_t::binary:
+
13276 case value_t::discarded:
+
13277 default:
+
13278 {
+
13279 ++m_it.primitive_iterator;
+
13280 break;
+
13281 }
+
13282 }
+
13283
+
13284 return *this;
+
13285 }
+
+
13286
+
+
13291 iter_impl operator--(int)& // NOLINT(cert-dcl21-cpp)
+
13292 {
+
13293 auto result = *this;
+
13294 --(*this);
+
13295 return result;
+
13296 }
+
+
13297
+
+
13302 iter_impl& operator--() {
+
13303 JSON_ASSERT(m_object != nullptr);
+
13304
+
13305 switch (m_object->m_data.m_type) {
+
13306 case value_t::object:
+
13307 {
+
13308 std::advance(m_it.object_iterator, -1);
+
13309 break;
+
13310 }
+
13311
+
13312 case value_t::array:
+
13313 {
+
13314 std::advance(m_it.array_iterator, -1);
+
13315 break;
+
13316 }
+
13317
+
13318 case value_t::null:
+
13319 case value_t::string:
+
13320 case value_t::boolean:
+ + + +
13324 case value_t::binary:
+
13325 case value_t::discarded:
+
13326 default:
+
13327 {
+
13328 --m_it.primitive_iterator;
+
13329 break;
+
13330 }
+
13331 }
+
13332
+
13333 return *this;
+
13334 }
+
+
13335
+
13340 template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
+
+
13341 bool operator==(const IterImpl& other) const {
+
13342 // if objects are not the same, the comparison is undefined
+
13343 if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) {
+
13344 JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object));
+
13345 }
+
13346
+
13347 // value-initialized forward iterators can be compared, and must compare equal to other value-initialized iterators of the same type #4493
+
13348 if (m_object == nullptr) {
+
13349 return true;
+
13350 }
+
13351
+
13352 switch (m_object->m_data.m_type) {
+
13353 case value_t::object:
+
13354 return (m_it.object_iterator == other.m_it.object_iterator);
+
13355
+
13356 case value_t::array:
+
13357 return (m_it.array_iterator == other.m_it.array_iterator);
+
13358
+
13359 case value_t::null:
+
13360 case value_t::string:
+
13361 case value_t::boolean:
+ + + +
13365 case value_t::binary:
+
13366 case value_t::discarded:
+
13367 default:
+
13368 return (m_it.primitive_iterator == other.m_it.primitive_iterator);
+
13369 }
+
13370 }
+
+
13371
+
13376 template < typename IterImpl, detail::enable_if_t < (std::is_same<IterImpl, iter_impl>::value || std::is_same<IterImpl, other_iter_impl>::value), std::nullptr_t > = nullptr >
+
+
13377 bool operator!=(const IterImpl& other) const {
+
13378 return !operator==(other);
+
13379 }
+
+
13380
+
+
13385 bool operator<(const iter_impl& other) const {
+
13386 // if objects are not the same, the comparison is undefined
+
13387 if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) {
+
13388 JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers", m_object));
+
13389 }
+
13390
+
13391 // value-initialized forward iterators can be compared, and must compare equal to other value-initialized iterators of the same type #4493
+
13392 if (m_object == nullptr) {
+
13393 // the iterators are both value-initialized and are to be considered equal, but this function checks for smaller, so we return false
+
13394 return false;
+
13395 }
+
13396
+
13397 switch (m_object->m_data.m_type) {
+
13398 case value_t::object:
+
13399 JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators", m_object));
+
13400
+
13401 case value_t::array:
+
13402 return (m_it.array_iterator < other.m_it.array_iterator);
+
13403
+
13404 case value_t::null:
+
13405 case value_t::string:
+
13406 case value_t::boolean:
+ + + +
13410 case value_t::binary:
+
13411 case value_t::discarded:
+
13412 default:
+
13413 return (m_it.primitive_iterator < other.m_it.primitive_iterator);
+
13414 }
+
13415 }
+
+
13416
+
+
13421 bool operator<=(const iter_impl& other) const {
+
13422 return !other.operator < (*this);
+
13423 }
+
+
13424
+
+
13429 bool operator>(const iter_impl& other) const {
+
13430 return !operator<=(other);
+
13431 }
+
+
13432
+
+
13437 bool operator>=(const iter_impl& other) const {
+
13438 return !operator<(other);
+
13439 }
+
+
13440
+
+
13445 iter_impl& operator+=(difference_type i) {
+
13446 JSON_ASSERT(m_object != nullptr);
+
13447
+
13448 switch (m_object->m_data.m_type) {
+
13449 case value_t::object:
+
13450 JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object));
+
13451
+
13452 case value_t::array:
+
13453 {
+
13454 std::advance(m_it.array_iterator, i);
+
13455 break;
+
13456 }
+
13457
+
13458 case value_t::null:
+
13459 case value_t::string:
+
13460 case value_t::boolean:
+ + + +
13464 case value_t::binary:
+
13465 case value_t::discarded:
+
13466 default:
+
13467 {
+
13468 m_it.primitive_iterator += i;
+
13469 break;
+
13470 }
+
13471 }
+
13472
+
13473 return *this;
+
13474 }
+
+
13475
+
+
13480 iter_impl& operator-=(difference_type i) {
+
13481 return operator+=(-i);
+
13482 }
+
+
13483
+
+
13488 iter_impl operator+(difference_type i) const {
+
13489 auto result = *this;
+
13490 result += i;
+
13491 return result;
+
13492 }
+
+
13493
+
+
13498 friend iter_impl operator+(difference_type i, const iter_impl& it) {
+
13499 auto result = it;
+
13500 result += i;
+
13501 return result;
+
13502 }
+
+
13503
+
+
13508 iter_impl operator-(difference_type i) const {
+
13509 auto result = *this;
+
13510 result -= i;
+
13511 return result;
+
13512 }
+
+
13513
+
+
13518 difference_type operator-(const iter_impl& other) const {
+
13519 JSON_ASSERT(m_object != nullptr);
+
13520
+
13521 switch (m_object->m_data.m_type) {
+
13522 case value_t::object:
+
13523 JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators", m_object));
+
13524
+
13525 case value_t::array:
+
13526 return m_it.array_iterator - other.m_it.array_iterator;
+
13527
+
13528 case value_t::null:
+
13529 case value_t::string:
+
13530 case value_t::boolean:
+ + + +
13534 case value_t::binary:
+
13535 case value_t::discarded:
+
13536 default:
+
13537 return m_it.primitive_iterator - other.m_it.primitive_iterator;
+
13538 }
+
13539 }
+
+
13540
+
+
13545 reference operator[](difference_type n) const {
+
13546 JSON_ASSERT(m_object != nullptr);
+
13547
+
13548 switch (m_object->m_data.m_type) {
+
13549 case value_t::object:
+
13550 JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators", m_object));
+
13551
+
13552 case value_t::array:
+
13553 return *std::next(m_it.array_iterator, n);
+
13554
+
13555 case value_t::null:
+
13556 JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
+
13557
+
13558 case value_t::string:
+
13559 case value_t::boolean:
+ + + +
13563 case value_t::binary:
+
13564 case value_t::discarded:
+
13565 default:
+
13566 {
+
13567 if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n)) {
+
13568 return *m_object;
+
13569 }
+
13570
+
13571 JSON_THROW(invalid_iterator::create(214, "cannot get value", m_object));
+
13572 }
+
13573 }
+
13574 }
+
+
13575
+
+
13580 const typename object_t::key_type& key() const {
+
13581 JSON_ASSERT(m_object != nullptr);
+
13582
+
13583 if (JSON_HEDLEY_LIKELY(m_object->is_object())) {
+
13584 return m_it.object_iterator->first;
+
13585 }
+
13586
+
13587 JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators", m_object));
+
13588 }
+
+
13589
+
+
13594 reference value() const {
+
13595 return operator*();
+
13596 }
+
+
13597
+
13598 JSON_PRIVATE_UNLESS_TESTED:
+
13600 pointer m_object = nullptr;
+ +
13603 };
+
+
13604
+
13605} // namespace detail
+
13606NLOHMANN_JSON_NAMESPACE_END
+
13607
+
13608// #include <nlohmann/detail/iterators/iteration_proxy.hpp>
+
13609
+
13610// #include <nlohmann/detail/iterators/json_reverse_iterator.hpp>
+
13611// __ _____ _____ _____
+
13612// __| | __| | | | JSON for Modern C++
+
13613// | | |__ | | | | | | version 3.12.0
+
13614// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
13615//
+
13616// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
13617// SPDX-License-Identifier: MIT
+
13618
+
13619
+
13620
+
13621#include <cstddef> // ptrdiff_t
+
13622#include <iterator> // reverse_iterator
+
13623#include <utility> // declval
+
13624
+
13625// #include <nlohmann/detail/abi_macros.hpp>
+
13626
+
13627
+
13628NLOHMANN_JSON_NAMESPACE_BEGIN
+
13629namespace detail {
+
13630
+
13632 // reverse_iterator //
+
13634
+
13653 template<typename Base>
+
+
13654 class json_reverse_iterator : public std::reverse_iterator<Base> {
+
13655 public:
+
13656 using difference_type = std::ptrdiff_t;
+
13658 using base_iterator = std::reverse_iterator<Base>;
+
13660 using reference = typename Base::reference;
+
13661
+
13663 explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
+
13664 : base_iterator(it) {}
+
13665
+
13667 explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
+
13668
+
13670 json_reverse_iterator operator++(int)& // NOLINT(cert-dcl21-cpp)
+
13671 {
+
13672 return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
+
13673 }
+
13674
+
13676 json_reverse_iterator& operator++() {
+
13677 return static_cast<json_reverse_iterator&>(base_iterator::operator++());
+
13678 }
+
13679
+
13681 json_reverse_iterator operator--(int)& // NOLINT(cert-dcl21-cpp)
+
13682 {
+
13683 return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
+
13684 }
+
13685
+
13687 json_reverse_iterator& operator--() {
+
13688 return static_cast<json_reverse_iterator&>(base_iterator::operator--());
+
13689 }
+
13690
+
13692 json_reverse_iterator& operator+=(difference_type i) {
+
13693 return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
+
13694 }
+
13695
+
13697 json_reverse_iterator operator+(difference_type i) const {
+
13698 return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
+
13699 }
+
13700
+
13702 json_reverse_iterator operator-(difference_type i) const {
+
13703 return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
+
13704 }
+
13705
+
13707 difference_type operator-(const json_reverse_iterator& other) const {
+
13708 return base_iterator(*this) - base_iterator(other);
+
13709 }
+
13710
+
13712 reference operator[](difference_type n) const {
+
13713 return *(this->operator+(n));
+
13714 }
+
13715
+
13717 auto key() const -> decltype(std::declval<Base>().key()) {
+
13718 auto it = --this->base();
+
13719 return it.key();
+
13720 }
+
13721
+
13723 reference value() const {
+
13724 auto it = --this->base();
+
13725 return it.operator * ();
+
13726 }
+
13727 };
+
+
13728
+
13729} // namespace detail
+
13730NLOHMANN_JSON_NAMESPACE_END
+
13731
+
13732// #include <nlohmann/detail/iterators/primitive_iterator.hpp>
+
13733
+
13734// #include <nlohmann/detail/json_custom_base_class.hpp>
+
13735// __ _____ _____ _____
+
13736// __| | __| | | | JSON for Modern C++
+
13737// | | |__ | | | | | | version 3.12.0
+
13738// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
13739//
+
13740// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
13741// SPDX-License-Identifier: MIT
+
13742
+
13743
+
13744
+
13745#include <type_traits> // conditional, is_same
+
13746
+
13747// #include <nlohmann/detail/abi_macros.hpp>
+
13748
+
13749
+
13750NLOHMANN_JSON_NAMESPACE_BEGIN
+
13751namespace detail {
+
13752
+ +
13764
+
13765 template<class T>
+
13766 using json_base_class = typename std::conditional <
+
13767 std::is_same<T, void>::value,
+ +
13769 T
+
13770 >::type;
+
13771
+
13772} // namespace detail
+
13773NLOHMANN_JSON_NAMESPACE_END
+
13774
+
13775// #include <nlohmann/detail/json_pointer.hpp>
+
13776// __ _____ _____ _____
+
13777// __| | __| | | | JSON for Modern C++
+
13778// | | |__ | | | | | | version 3.12.0
+
13779// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
13780//
+
13781// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
13782// SPDX-License-Identifier: MIT
+
13783
+
13784
+
13785
+
13786#include <algorithm> // all_of
+
13787#include <cctype> // isdigit
+
13788#include <cerrno> // errno, ERANGE
+
13789#include <cstdlib> // strtoull
+
13790#ifndef JSON_NO_IO
+
13791#include <iosfwd> // ostream
+
13792#endif // JSON_NO_IO
+
13793#include <limits> // max
+
13794#include <numeric> // accumulate
+
13795#include <string> // string
+
13796#include <utility> // move
+
13797#include <vector> // vector
+
13798
+
13799// #include <nlohmann/detail/exceptions.hpp>
+
13800
+
13801// #include <nlohmann/detail/macro_scope.hpp>
+
13802
+
13803// #include <nlohmann/detail/string_concat.hpp>
+
13804
+
13805// #include <nlohmann/detail/string_escape.hpp>
+
13806
+
13807// #include <nlohmann/detail/value_t.hpp>
+
13808
+
13809
+
13810NLOHMANN_JSON_NAMESPACE_BEGIN
+
13811
+
13814template<typename RefStringType>
+
13815class json_pointer {
+
13816 // allow basic_json to access private members
+
13817 NLOHMANN_BASIC_JSON_TPL_DECLARATION
+
13818 friend class basic_json;
+
13819
+
13820 template<typename>
+
13821 friend class json_pointer;
+
13822
+
13823 template<typename T>
+
+ +
13825 using type = T;
+
13826 };
+
+
13827
+
13828 NLOHMANN_BASIC_JSON_TPL_DECLARATION
+
+
13829 struct string_t_helper<NLOHMANN_BASIC_JSON_TPL> {
+
13830 using type = StringType;
+
13831 };
+
+
13832
+
13833public:
+
13834 // for backwards compatibility accept BasicJsonType
+
13835 using string_t = typename string_t_helper<RefStringType>::type;
+
13836
+
13839 explicit json_pointer(const string_t& s = "")
+
13840 : reference_tokens(split(s)) {}
+
13841
+
13844 string_t to_string() const {
+
13845 return std::accumulate(reference_tokens.begin(), reference_tokens.end(),
+
13846 string_t{},
+
13847 [](const string_t& a, const string_t& b) {
+
13848 return detail::concat(a, '/', detail::escape(b));
+
13849 });
+
13850 }
+
13851
+
13854 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, to_string())
+
13855 operator string_t() const {
+
13856 return to_string();
+
13857 }
+
13858
+
13859#ifndef JSON_NO_IO
+
13862 friend std::ostream& operator<<(std::ostream& o, const json_pointer& ptr) {
+
13863 o << ptr.to_string();
+
13864 return o;
+
13865 }
+
13866#endif
+
13867
+
13870 json_pointer& operator/=(const json_pointer& ptr) {
+
13871 reference_tokens.insert(reference_tokens.end(),
+
13872 ptr.reference_tokens.begin(),
+
13873 ptr.reference_tokens.end());
+
13874 return *this;
+
13875 }
+
13876
+
13879 json_pointer& operator/=(string_t token) {
+
13880 push_back(std::move(token));
+
13881 return *this;
+
13882 }
+
13883
+
13886 json_pointer& operator/=(std::size_t array_idx) {
+
13887 return *this /= std::to_string(array_idx);
+
13888 }
+
13889
+
13892 friend json_pointer operator/(const json_pointer& lhs,
+
13893 const json_pointer& rhs) {
+
13894 return json_pointer(lhs) /= rhs;
+
13895 }
+
13896
+
13899 friend json_pointer operator/(const json_pointer& lhs, string_t token) // NOLINT(performance-unnecessary-value-param)
+
13900 {
+
13901 return json_pointer(lhs) /= std::move(token);
+
13902 }
+
13903
+
13906 friend json_pointer operator/(const json_pointer& lhs, std::size_t array_idx) {
+
13907 return json_pointer(lhs) /= array_idx;
+
13908 }
+
13909
+
13912 json_pointer parent_pointer() const {
+
13913 if (empty()) {
+
13914 return *this;
+
13915 }
+
13916
+
13917 json_pointer res = *this;
+
13918 res.pop_back();
+
13919 return res;
+
13920 }
+
13921
+
13924 void pop_back() {
+
13925 if (JSON_HEDLEY_UNLIKELY(empty())) {
+
13926 JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
+
13927 }
+
13928
+
13929 reference_tokens.pop_back();
+
13930 }
+
13931
+
13934 const string_t& back() const {
+
13935 if (JSON_HEDLEY_UNLIKELY(empty())) {
+
13936 JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
+
13937 }
+
13938
+
13939 return reference_tokens.back();
+
13940 }
+
13941
+
13944 void push_back(const string_t& token) {
+
13945 reference_tokens.push_back(token);
+
13946 }
+
13947
+
13950 void push_back(string_t&& token) {
+
13951 reference_tokens.push_back(std::move(token));
+
13952 }
+
13953
+
13956 bool empty() const noexcept {
+
13957 return reference_tokens.empty();
+
13958 }
+
13959
+
13960private:
+
13971 template<typename BasicJsonType>
+
13972 static typename BasicJsonType::size_type array_index(const string_t& s) {
+
13973 using size_type = typename BasicJsonType::size_type;
+
13974
+
13975 // error condition (cf. RFC 6901, Sect. 4)
+
13976 if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0')) {
+
13977 JSON_THROW(detail::parse_error::create(106, 0, detail::concat("array index '", s, "' must not begin with '0'"), nullptr));
+
13978 }
+
13979
+
13980 // error condition (cf. RFC 6901, Sect. 4)
+
13981 if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9'))) {
+
13982 JSON_THROW(detail::parse_error::create(109, 0, detail::concat("array index '", s, "' is not a number"), nullptr));
+
13983 }
+
13984
+
13985 const char* p = s.c_str();
+
13986 char* p_end = nullptr; // NOLINT(misc-const-correctness)
+
13987 errno = 0; // strtoull doesn't reset errno
+
13988 const unsigned long long res = std::strtoull(p, &p_end, 10); // NOLINT(runtime/int)
+
13989 if (p == p_end // invalid input or empty string
+
13990 || errno == ERANGE // out of range
+
13991 || JSON_HEDLEY_UNLIKELY(static_cast<std::size_t>(p_end - p) != s.size())) // incomplete read
+
13992 {
+
13993 JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", s, "'"), nullptr));
+
13994 }
+
13995
+
13996 // only triggered on special platforms (like 32bit), see also
+
13997 // https://github.com/nlohmann/json/pull/2203
+
13998 if (res >= static_cast<unsigned long long>((std::numeric_limits<size_type>::max)())) // NOLINT(runtime/int)
+
13999 {
+
14000 JSON_THROW(detail::out_of_range::create(410, detail::concat("array index ", s, " exceeds size_type"), nullptr)); // LCOV_EXCL_LINE
+
14001 }
+
14002
+
14003 return static_cast<size_type>(res);
+
14004 }
+
14005
+
14006JSON_PRIVATE_UNLESS_TESTED:
+
14007 json_pointer top() const {
+
14008 if (JSON_HEDLEY_UNLIKELY(empty())) {
+
14009 JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent", nullptr));
+
14010 }
+
14011
+
14012 json_pointer result = *this;
+
14013 result.reference_tokens = { reference_tokens[0] };
+
14014 return result;
+
14015 }
+
14016
+
14017private:
+
14026 template<typename BasicJsonType>
+
14027 BasicJsonType& get_and_create(BasicJsonType& j) const {
+
14028 auto* result = &j;
+
14029
+
14030 // in case no reference tokens exist, return a reference to the JSON value
+
14031 // j which will be overwritten by a primitive value
+
14032 for (const auto& reference_token : reference_tokens) {
+
14033 switch (result->type()) {
+ +
14035 {
+
14036 if (reference_token == "0") {
+
14037 // start a new array if the reference token is 0
+
14038 result = &result->operator[](0);
+
14039 }
+
14040 else {
+
14041 // start a new object otherwise
+
14042 result = &result->operator[](reference_token);
+
14043 }
+
14044 break;
+
14045 }
+
14046
+ +
14048 {
+
14049 // create an entry in the object
+
14050 result = &result->operator[](reference_token);
+
14051 break;
+
14052 }
+
14053
+ +
14055 {
+
14056 // create an entry in the array
+
14057 result = &result->operator[](array_index<BasicJsonType>(reference_token));
+
14058 break;
+
14059 }
+
14060
+
14061 /*
+
14062 The following code is only reached if there exists a reference
+
14063 token _and_ the current value is primitive. In this case, we have
+
14064 an error situation, because primitive values may only occur as
+
14065 a single value; that is, with an empty list of reference tokens.
+
14066 */
+ + + + + + + +
14074 default:
+
14075 JSON_THROW(detail::type_error::create(313, "invalid value to unflatten", &j));
+
14076 }
+
14077 }
+
14078
+
14079 return *result;
+
14080 }
+
14081
+
14101 template<typename BasicJsonType>
+
14102 BasicJsonType& get_unchecked(BasicJsonType* ptr) const {
+
14103 for (const auto& reference_token : reference_tokens) {
+
14104 // convert null values to arrays or objects before continuing
+
14105 if (ptr->is_null()) {
+
14106 // check if the reference token is a number
+
14107 const bool nums =
+
14108 std::all_of(reference_token.begin(), reference_token.end(),
+
14109 [](const unsigned char x) {
+
14110 return std::isdigit(x);
+
14111 });
+
14112
+
14113 // change value to an array for numbers or "-" or to object otherwise
+
14114 *ptr = (nums || reference_token == "-")
+ +
14116 : detail::value_t::object;
+
14117 }
+
14118
+
14119 switch (ptr->type()) {
+ +
14121 {
+
14122 // use unchecked object access
+
14123 ptr = &ptr->operator[](reference_token);
+
14124 break;
+
14125 }
+
14126
+ +
14128 {
+
14129 if (reference_token == "-") {
+
14130 // explicitly treat "-" as index beyond the end
+
14131 ptr = &ptr->operator[](ptr->m_data.m_value.array->size());
+
14132 }
+
14133 else {
+
14134 // convert array index to number; unchecked access
+
14135 ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));
+
14136 }
+
14137 break;
+
14138 }
+
14139
+ + + + + + + + +
14148 default:
+
14149 JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
+
14150 }
+
14151 }
+
14152
+
14153 return *ptr;
+
14154 }
+
14155
+
14162 template<typename BasicJsonType>
+
14163 BasicJsonType& get_checked(BasicJsonType* ptr) const {
+
14164 for (const auto& reference_token : reference_tokens) {
+
14165 switch (ptr->type()) {
+ +
14167 {
+
14168 // note: at performs range check
+
14169 ptr = &ptr->at(reference_token);
+
14170 break;
+
14171 }
+
14172
+ +
14174 {
+
14175 if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) {
+
14176 // "-" always fails the range check
+
14177 JSON_THROW(detail::out_of_range::create(402, detail::concat(
+
14178 "array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
+
14179 ") is out of range"), ptr));
+
14180 }
+
14181
+
14182 // note: at performs range check
+
14183 ptr = &ptr->at(array_index<BasicJsonType>(reference_token));
+
14184 break;
+
14185 }
+
14186
+ + + + + + + + +
14195 default:
+
14196 JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
+
14197 }
+
14198 }
+
14199
+
14200 return *ptr;
+
14201 }
+
14202
+
14216 template<typename BasicJsonType>
+
14217 const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const {
+
14218 for (const auto& reference_token : reference_tokens) {
+
14219 switch (ptr->type()) {
+ +
14221 {
+
14222 // use unchecked object access
+
14223 ptr = &ptr->operator[](reference_token);
+
14224 break;
+
14225 }
+
14226
+ +
14228 {
+
14229 if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) {
+
14230 // "-" cannot be used for const access
+
14231 JSON_THROW(detail::out_of_range::create(402, detail::concat("array index '-' (", std::to_string(ptr->m_data.m_value.array->size()), ") is out of range"), ptr));
+
14232 }
+
14233
+
14234 // use unchecked array access
+
14235 ptr = &ptr->operator[](array_index<BasicJsonType>(reference_token));
+
14236 break;
+
14237 }
+
14238
+ + + + + + + + +
14247 default:
+
14248 JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
+
14249 }
+
14250 }
+
14251
+
14252 return *ptr;
+
14253 }
+
14254
+
14261 template<typename BasicJsonType>
+
14262 const BasicJsonType& get_checked(const BasicJsonType* ptr) const {
+
14263 for (const auto& reference_token : reference_tokens) {
+
14264 switch (ptr->type()) {
+ +
14266 {
+
14267 // note: at performs range check
+
14268 ptr = &ptr->at(reference_token);
+
14269 break;
+
14270 }
+
14271
+ +
14273 {
+
14274 if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) {
+
14275 // "-" always fails the range check
+
14276 JSON_THROW(detail::out_of_range::create(402, detail::concat(
+
14277 "array index '-' (", std::to_string(ptr->m_data.m_value.array->size()),
+
14278 ") is out of range"), ptr));
+
14279 }
+
14280
+
14281 // note: at performs range check
+
14282 ptr = &ptr->at(array_index<BasicJsonType>(reference_token));
+
14283 break;
+
14284 }
+
14285
+ + + + + + + + +
14294 default:
+
14295 JSON_THROW(detail::out_of_range::create(404, detail::concat("unresolved reference token '", reference_token, "'"), ptr));
+
14296 }
+
14297 }
+
14298
+
14299 return *ptr;
+
14300 }
+
14301
+
14306 template<typename BasicJsonType>
+
14307 bool contains(const BasicJsonType* ptr) const {
+
14308 for (const auto& reference_token : reference_tokens) {
+
14309 switch (ptr->type()) {
+ +
14311 {
+
14312 if (!ptr->contains(reference_token)) {
+
14313 // we did not find the key in the object
+
14314 return false;
+
14315 }
+
14316
+
14317 ptr = &ptr->operator[](reference_token);
+
14318 break;
+
14319 }
+
14320
+ +
14322 {
+
14323 if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) {
+
14324 // "-" always fails the range check
+
14325 return false;
+
14326 }
+
14327 if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) {
+
14328 // invalid char
+
14329 return false;
+
14330 }
+
14331 if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) {
+
14332 if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) {
+
14333 // the first char should be between '1' and '9'
+
14334 return false;
+
14335 }
+
14336 for (std::size_t i = 1; i < reference_token.size(); i++) {
+
14337 if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) {
+
14338 // other char should be between '0' and '9'
+
14339 return false;
+
14340 }
+
14341 }
+
14342 }
+
14343
+
14344 const auto idx = array_index<BasicJsonType>(reference_token);
+
14345 if (idx >= ptr->size()) {
+
14346 // index out of range
+
14347 return false;
+
14348 }
+
14349
+
14350 ptr = &ptr->operator[](idx);
+
14351 break;
+
14352 }
+
14353
+ + + + + + + + +
14362 default:
+
14363 {
+
14364 // we do not expect primitive values if there is still a
+
14365 // reference token to process
+
14366 return false;
+
14367 }
+
14368 }
+
14369 }
+
14370
+
14371 // no reference token left means we found a primitive value
+
14372 return true;
+
14373 }
+
14374
+
14384 static std::vector<string_t> split(const string_t& reference_string) {
+
14385 std::vector<string_t> result;
+
14386
+
14387 // special case: empty reference string -> no reference tokens
+
14388 if (reference_string.empty()) {
+
14389 return result;
+
14390 }
+
14391
+
14392 // check if a nonempty reference string begins with slash
+
14393 if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/')) {
+
14394 JSON_THROW(detail::parse_error::create(107, 1, detail::concat("JSON pointer must be empty or begin with '/' - was: '", reference_string, "'"), nullptr));
+
14395 }
+
14396
+
14397 // extract the reference tokens:
+
14398 // - slash: position of the last read slash (or end of string)
+
14399 // - start: position after the previous slash
+
14400 for (
+
14401 // search for the first slash after the first character
+
14402 std::size_t slash = reference_string.find_first_of('/', 1),
+
14403 // set the beginning of the first reference token
+
14404 start = 1;
+
14405 // we can stop if start == 0 (if slash == string_t::npos)
+
14406 start != 0;
+
14407 // set the beginning of the next reference token
+
14408 // (will eventually be 0 if slash == string_t::npos)
+
14409 start = (slash == string_t::npos) ? 0 : slash + 1,
+
14410 // find next slash
+
14411 slash = reference_string.find_first_of('/', start)) {
+
14412 // use the text between the beginning of the reference token
+
14413 // (start) and the last slash (slash).
+
14414 auto reference_token = reference_string.substr(start, slash - start);
+
14415
+
14416 // check reference tokens are properly escaped
+
14417 for (std::size_t pos = reference_token.find_first_of('~');
+
14418 pos != string_t::npos;
+
14419 pos = reference_token.find_first_of('~', pos + 1)) {
+
14420 JSON_ASSERT(reference_token[pos] == '~');
+
14421
+
14422 // ~ must be followed by 0 or 1
+
14423 if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 ||
+
14424 (reference_token[pos + 1] != '0' &&
+
14425 reference_token[pos + 1] != '1'))) {
+
14426 JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'", nullptr));
+
14427 }
+
14428 }
+
14429
+
14430 // finally, store the reference token
+
14431 detail::unescape(reference_token);
+
14432 result.push_back(reference_token);
+
14433 }
+
14434
+
14435 return result;
+
14436 }
+
14437
+
14438private:
+
14446 template<typename BasicJsonType>
+
14447 static void flatten(const string_t& reference_string,
+
14448 const BasicJsonType& value,
+
14449 BasicJsonType& result) {
+
14450 switch (value.type()) {
+ +
14452 {
+
14453 if (value.m_data.m_value.array->empty()) {
+
14454 // flatten empty array as null
+
14455 result[reference_string] = nullptr;
+
14456 }
+
14457 else {
+
14458 // iterate array and use index as a reference string
+
14459 for (std::size_t i = 0; i < value.m_data.m_value.array->size(); ++i) {
+
14460 flatten(detail::concat<string_t>(reference_string, '/', std::to_string(i)),
+
14461 value.m_data.m_value.array->operator[](i), result);
+
14462 }
+
14463 }
+
14464 break;
+
14465 }
+
14466
+ +
14468 {
+
14469 if (value.m_data.m_value.object->empty()) {
+
14470 // flatten empty object as null
+
14471 result[reference_string] = nullptr;
+
14472 }
+
14473 else {
+
14474 // iterate object and use keys as reference string
+
14475 for (const auto& element : *value.m_data.m_value.object) {
+
14476 flatten(detail::concat<string_t>(reference_string, '/', detail::escape(element.first)), element.second, result);
+
14477 }
+
14478 }
+
14479 break;
+
14480 }
+
14481
+ + + + + + + + +
14490 default:
+
14491 {
+
14492 // add a primitive value with its reference string
+
14493 result[reference_string] = value;
+
14494 break;
+
14495 }
+
14496 }
+
14497 }
+
14498
+
14509 template<typename BasicJsonType>
+
14510 static BasicJsonType
+
14511 unflatten(const BasicJsonType& value) {
+
14512 if (JSON_HEDLEY_UNLIKELY(!value.is_object())) {
+
14513 JSON_THROW(detail::type_error::create(314, "only objects can be unflattened", &value));
+
14514 }
+
14515
+
14516 BasicJsonType result;
+
14517
+
14518 // iterate the JSON object values
+
14519 for (const auto& element : *value.m_data.m_value.object) {
+
14520 if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive())) {
+
14521 JSON_THROW(detail::type_error::create(315, "values in object must be primitive", &element.second));
+
14522 }
+
14523
+
14524 // Assign the value to the reference pointed to by JSON pointer. Note
+
14525 // that if the JSON pointer is "" (i.e., points to the whole value),
+
14526 // function get_and_create returns a reference to the result itself.
+
14527 // An assignment will then create a primitive value.
+
14528 json_pointer(element.first).get_and_create(result) = element.second;
+
14529 }
+
14530
+
14531 return result;
+
14532 }
+
14533
+
14534 // can't use the conversion operator because of ambiguity
+
14535 json_pointer<string_t> convert() const& {
+
14536 json_pointer<string_t> result;
+
14537 result.reference_tokens = reference_tokens;
+
14538 return result;
+
14539 }
+
14540
+
14541 json_pointer<string_t> convert()&& {
+
14542 json_pointer<string_t> result;
+
14543 result.reference_tokens = std::move(reference_tokens);
+
14544 return result;
+
14545 }
+
14546
+
14547public:
+
14548#if JSON_HAS_THREE_WAY_COMPARISON
+
14551 template<typename RefStringTypeRhs>
+
14552 bool operator==(const json_pointer<RefStringTypeRhs>& rhs) const noexcept {
+
14553 return reference_tokens == rhs.reference_tokens;
+
14554 }
+
14555
+
14558 JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer))
+
14559 bool operator==(const string_t& rhs) const {
+
14560 return *this == json_pointer(rhs);
+
14561 }
+
14562
+
14564 template<typename RefStringTypeRhs>
+
14565 std::strong_ordering operator<=>(const json_pointer<RefStringTypeRhs>& rhs) const noexcept // *NOPAD*
+
14566 {
+
14567 return reference_tokens <=> rhs.reference_tokens; // *NOPAD*
+
14568 }
+
14569#else
+
14572 template<typename RefStringTypeLhs, typename RefStringTypeRhs>
+
14573 // NOLINTNEXTLINE(readability-redundant-declaration)
+
14574 friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
+
14575 const json_pointer<RefStringTypeRhs>& rhs) noexcept;
+
14576
+
14579 template<typename RefStringTypeLhs, typename StringType>
+
14580 // NOLINTNEXTLINE(readability-redundant-declaration)
+
14581 friend bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
+
14582 const StringType& rhs);
+
14583
+
14586 template<typename RefStringTypeRhs, typename StringType>
+
14587 // NOLINTNEXTLINE(readability-redundant-declaration)
+
14588 friend bool operator==(const StringType& lhs,
+
14589 const json_pointer<RefStringTypeRhs>& rhs);
+
14590
+
14593 template<typename RefStringTypeLhs, typename RefStringTypeRhs>
+
14594 // NOLINTNEXTLINE(readability-redundant-declaration)
+
14595 friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
+
14596 const json_pointer<RefStringTypeRhs>& rhs) noexcept;
+
14597
+
14600 template<typename RefStringTypeLhs, typename StringType>
+
14601 // NOLINTNEXTLINE(readability-redundant-declaration)
+
14602 friend bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
+
14603 const StringType& rhs);
+
14604
+
14607 template<typename RefStringTypeRhs, typename StringType>
+
14608 // NOLINTNEXTLINE(readability-redundant-declaration)
+
14609 friend bool operator!=(const StringType& lhs,
+
14610 const json_pointer<RefStringTypeRhs>& rhs);
+
14611
+
14613 template<typename RefStringTypeLhs, typename RefStringTypeRhs>
+
14614 // NOLINTNEXTLINE(readability-redundant-declaration)
+
14615 friend bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
+
14616 const json_pointer<RefStringTypeRhs>& rhs) noexcept;
+
14617#endif
+
14618
+
14619private:
+
14621 std::vector<string_t> reference_tokens;
+
14622};
+
14623
+
14624#if !JSON_HAS_THREE_WAY_COMPARISON
+
14625// functions cannot be defined inside the class due to ODR violations
+
14626template<typename RefStringTypeLhs, typename RefStringTypeRhs>
+
14627inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
+
14628 const json_pointer<RefStringTypeRhs>& rhs) noexcept {
+
14629 return lhs.reference_tokens == rhs.reference_tokens;
+
14630}
+
14631
+
14632template<typename RefStringTypeLhs,
+
14633 typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
+
14634JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer))
+
14635inline bool operator==(const json_pointer<RefStringTypeLhs>& lhs,
+
14636 const StringType& rhs) {
+
14637 return lhs == json_pointer<RefStringTypeLhs>(rhs);
+
14638}
+
14639
+
14640template<typename RefStringTypeRhs,
+
14641 typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
+
14642JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer))
+
14643inline bool operator==(const StringType& lhs,
+
14644 const json_pointer<RefStringTypeRhs>& rhs) {
+
14645 return json_pointer<RefStringTypeRhs>(lhs) == rhs;
+
14646}
+
14647
+
14648template<typename RefStringTypeLhs, typename RefStringTypeRhs>
+
14649inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
+
14650 const json_pointer<RefStringTypeRhs>& rhs) noexcept {
+
14651 return !(lhs == rhs);
+
14652}
+
14653
+
14654template<typename RefStringTypeLhs,
+
14655 typename StringType = typename json_pointer<RefStringTypeLhs>::string_t>
+
14656JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer))
+
14657inline bool operator!=(const json_pointer<RefStringTypeLhs>& lhs,
+
14658 const StringType& rhs) {
+
14659 return !(lhs == rhs);
+
14660}
+
14661
+
14662template<typename RefStringTypeRhs,
+
14663 typename StringType = typename json_pointer<RefStringTypeRhs>::string_t>
+
14664JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer))
+
14665inline bool operator!=(const StringType& lhs,
+
14666 const json_pointer<RefStringTypeRhs>& rhs) {
+
14667 return !(lhs == rhs);
+
14668}
+
14669
+
14670template<typename RefStringTypeLhs, typename RefStringTypeRhs>
+
14671inline bool operator<(const json_pointer<RefStringTypeLhs>& lhs,
+
14672 const json_pointer<RefStringTypeRhs>& rhs) noexcept {
+
14673 return lhs.reference_tokens < rhs.reference_tokens;
+
14674}
+
14675#endif
+
14676
+
14677NLOHMANN_JSON_NAMESPACE_END
+
14678
+
14679// #include <nlohmann/detail/json_ref.hpp>
+
14680// __ _____ _____ _____
+
14681// __| | __| | | | JSON for Modern C++
+
14682// | | |__ | | | | | | version 3.12.0
+
14683// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
14684//
+
14685// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
14686// SPDX-License-Identifier: MIT
+
14687
+
14688
+
14689
+
14690#include <initializer_list>
+
14691#include <utility>
+
14692
+
14693// #include <nlohmann/detail/abi_macros.hpp>
+
14694
+
14695// #include <nlohmann/detail/meta/type_traits.hpp>
+
14696
+
14697
+
14698NLOHMANN_JSON_NAMESPACE_BEGIN
+
14699namespace detail {
+
14700
+
14701 template<typename BasicJsonType>
+
+
14702 class json_ref {
+
14703 public:
+
14704 using value_type = BasicJsonType;
+
14705
+
14706 json_ref(value_type&& value)
+
14707 : owned_value(std::move(value)) {}
+
14708
+
14709 json_ref(const value_type& value)
+
14710 : value_ref(&value) {}
+
14711
+
14712 json_ref(std::initializer_list<json_ref> init)
+
14713 : owned_value(init) {}
+
14714
+
14715 template <
+
14716 class... Args,
+
14717 enable_if_t<std::is_constructible<value_type, Args...>::value, int> = 0 >
+
14718 json_ref(Args && ... args)
+
14719 : owned_value(std::forward<Args>(args)...) {}
+
14720
+
14721 // class should be movable only
+
14722 json_ref(json_ref&&) noexcept = default;
+
14723 json_ref(const json_ref&) = delete;
+
14724 json_ref& operator=(const json_ref&) = delete;
+
14725 json_ref& operator=(json_ref&&) = delete;
+
14726 ~json_ref() = default;
+
14727
+
14728 value_type moved_or_copied() const {
+
14729 if (value_ref == nullptr) {
+
14730 return std::move(owned_value);
+
14731 }
+
14732 return *value_ref;
+
14733 }
+
14734
+
14735 value_type const& operator*() const {
+
14736 return value_ref ? *value_ref : owned_value;
+
14737 }
+
14738
+
14739 value_type const* operator->() const {
+
14740 return &**this;
+
14741 }
+
14742
+
14743 private:
+
14744 mutable value_type owned_value = nullptr;
+
14745 value_type const* value_ref = nullptr;
+
14746 };
+
+
14747
+
14748} // namespace detail
+
14749NLOHMANN_JSON_NAMESPACE_END
+
14750
+
14751// #include <nlohmann/detail/macro_scope.hpp>
+
14752
+
14753// #include <nlohmann/detail/string_concat.hpp>
+
14754
+
14755// #include <nlohmann/detail/string_escape.hpp>
+
14756
+
14757// #include <nlohmann/detail/string_utils.hpp>
+
14758
+
14759// #include <nlohmann/detail/meta/cpp_future.hpp>
+
14760
+
14761// #include <nlohmann/detail/meta/type_traits.hpp>
+
14762
+
14763// #include <nlohmann/detail/output/binary_writer.hpp>
+
14764// __ _____ _____ _____
+
14765// __| | __| | | | JSON for Modern C++
+
14766// | | |__ | | | | | | version 3.12.0
+
14767// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
14768//
+
14769// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
14770// SPDX-License-Identifier: MIT
+
14771
+
14772
+
14773
+
14774#include <algorithm> // reverse
+
14775#include <array> // array
+
14776#include <map> // map
+
14777#include <cmath> // isnan, isinf
+
14778#include <cstdint> // uint8_t, uint16_t, uint32_t, uint64_t
+
14779#include <cstring> // memcpy
+
14780#include <limits> // numeric_limits
+
14781#include <string> // string
+
14782#include <utility> // move
+
14783#include <vector> // vector
+
14784
+
14785// #include <nlohmann/detail/input/binary_reader.hpp>
+
14786
+
14787// #include <nlohmann/detail/macro_scope.hpp>
+
14788
+
14789// #include <nlohmann/detail/output/output_adapters.hpp>
+
14790// __ _____ _____ _____
+
14791// __| | __| | | | JSON for Modern C++
+
14792// | | |__ | | | | | | version 3.12.0
+
14793// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
14794//
+
14795// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
14796// SPDX-License-Identifier: MIT
+
14797
+
14798
+
14799
+
14800#include <algorithm> // copy
+
14801#include <cstddef> // size_t
+
14802#include <iterator> // back_inserter
+
14803#include <memory> // shared_ptr, make_shared
+
14804#include <string> // basic_string
+
14805#include <vector> // vector
+
14806
+
14807#ifndef JSON_NO_IO
+
14808#include <ios> // streamsize
+
14809#include <ostream> // basic_ostream
+
14810#endif // JSON_NO_IO
+
14811
+
14812// #include <nlohmann/detail/macro_scope.hpp>
+
14813
+
14814
+
14815NLOHMANN_JSON_NAMESPACE_BEGIN
+
14816namespace detail {
+
14817
+
+
14819 template<typename CharType> struct output_adapter_protocol {
+
14820 virtual void write_character(CharType c) = 0;
+
14821 virtual void write_characters(const CharType* s, std::size_t length) = 0;
+
14822 virtual ~output_adapter_protocol() = default;
+
14823
+
14824 output_adapter_protocol() = default;
+
14825 output_adapter_protocol(const output_adapter_protocol&) = default;
+
14826 output_adapter_protocol(output_adapter_protocol&&) noexcept = default;
+
14827 output_adapter_protocol& operator=(const output_adapter_protocol&) = default;
+
14828 output_adapter_protocol& operator=(output_adapter_protocol&&) noexcept = default;
+
14829 };
+
+
14830
+
14832 template<typename CharType>
+
14833 using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>;
+
14834
+
14836 template<typename CharType, typename AllocatorType = std::allocator<CharType>>
+
+
14837 class output_vector_adapter : public output_adapter_protocol<CharType> {
+
14838 public:
+
14839 explicit output_vector_adapter(std::vector<CharType, AllocatorType>& vec) noexcept
+
14840 : v(vec) {}
+
14841
+
14842 void write_character(CharType c) override {
+
14843 v.push_back(c);
+
14844 }
+
14845
+
14846 JSON_HEDLEY_NON_NULL(2)
+
14847 void write_characters(const CharType* s, std::size_t length) override {
+
14848 v.insert(v.end(), s, s + length);
+
14849 }
+
14850
+
14851 private:
+
14852 std::vector<CharType, AllocatorType>& v;
+
14853 };
+
+
14854
+
14855#ifndef JSON_NO_IO
+
14857 template<typename CharType>
+
+
14858 class output_stream_adapter : public output_adapter_protocol<CharType> {
+
14859 public:
+
14860 explicit output_stream_adapter(std::basic_ostream<CharType>& s) noexcept
+
14861 : stream(s) {}
+
14862
+
14863 void write_character(CharType c) override {
+
14864 stream.put(c);
+
14865 }
+
14866
+
14867 JSON_HEDLEY_NON_NULL(2)
+
14868 void write_characters(const CharType* s, std::size_t length) override {
+
14869 stream.write(s, static_cast<std::streamsize>(length));
+
14870 }
+
14871
+
14872 private:
+
14873 std::basic_ostream<CharType>& stream;
+
14874 };
+
+
14875#endif // JSON_NO_IO
+
14876
+
14878 template<typename CharType, typename StringType = std::basic_string<CharType>>
+
+
14879 class output_string_adapter : public output_adapter_protocol<CharType> {
+
14880 public:
+
14881 explicit output_string_adapter(StringType& s) noexcept
+
14882 : str(s) {}
+
14883
+
14884 void write_character(CharType c) override {
+
14885 str.push_back(c);
+
14886 }
+
14887
+
14888 JSON_HEDLEY_NON_NULL(2)
+
14889 void write_characters(const CharType* s, std::size_t length) override {
+
14890 str.append(s, length);
+
14891 }
+
14892
+
14893 private:
+
14894 StringType& str;
+
14895 };
+
+
14896
+
14897 template<typename CharType, typename StringType = std::basic_string<CharType>>
+
+
14898 class output_adapter {
+
14899 public:
+
14900 template<typename AllocatorType = std::allocator<CharType>>
+
14901 output_adapter(std::vector<CharType, AllocatorType>& vec)
+
14902 : oa(std::make_shared<output_vector_adapter<CharType, AllocatorType>>(vec)) {}
+
14903
+
14904#ifndef JSON_NO_IO
+
14905 output_adapter(std::basic_ostream<CharType>& s)
+
14906 : oa(std::make_shared<output_stream_adapter<CharType>>(s)) {}
+
14907#endif // JSON_NO_IO
+
14908
+
14909 output_adapter(StringType& s)
+
14910 : oa(std::make_shared<output_string_adapter<CharType, StringType>>(s)) {}
+
14911
+
14912 operator output_adapter_t<CharType>() {
+
14913 return oa;
+
14914 }
+
14915
+
14916 private:
+
14917 output_adapter_t<CharType> oa = nullptr;
+
14918 };
+
+
14919
+
14920} // namespace detail
+
14921NLOHMANN_JSON_NAMESPACE_END
+
14922
+
14923// #include <nlohmann/detail/string_concat.hpp>
+
14924
+
14925
+
14926NLOHMANN_JSON_NAMESPACE_BEGIN
+
14927namespace detail {
+
14928
+
14930 enum class bjdata_version_t {
+
14931 draft2,
+
14932 draft3,
+
14933 };
+
14934
+
14936 // binary writer //
+
14938
+
14942 template<typename BasicJsonType, typename CharType>
+
+ +
14944 using string_t = typename BasicJsonType::string_t;
+
14945 using binary_t = typename BasicJsonType::binary_t;
+
14946 using number_float_t = typename BasicJsonType::number_float_t;
+
14947
+
14948 public:
+
+
14954 explicit binary_writer(output_adapter_t<CharType> adapter) : oa(std::move(adapter)) {
+
14955 JSON_ASSERT(oa);
+
14956 }
+
+
14957
+
+
14962 void write_bson(const BasicJsonType& j) {
+
14963 switch (j.type()) {
+
14964 case value_t::object:
+
14965 {
+
14966 write_bson_object(*j.m_data.m_value.object);
+
14967 break;
+
14968 }
+
14969
+
14970 case value_t::null:
+
14971 case value_t::array:
+
14972 case value_t::string:
+
14973 case value_t::boolean:
+ + + +
14977 case value_t::binary:
+
14978 case value_t::discarded:
+
14979 default:
+
14980 {
+
14981 JSON_THROW(type_error::create(317, concat("to serialize to BSON, top-level type must be object, but is ", j.type_name()), &j));
+
14982 }
+
14983 }
+
14984 }
+
+
14985
+
+
14989 void write_cbor(const BasicJsonType& j) {
+
14990 switch (j.type()) {
+
14991 case value_t::null:
+
14992 {
+
14993 oa->write_character(to_char_type(0xF6));
+
14994 break;
+
14995 }
+
14996
+
14997 case value_t::boolean:
+
14998 {
+
14999 oa->write_character(j.m_data.m_value.boolean
+
15000 ? to_char_type(0xF5)
+
15001 : to_char_type(0xF4));
+
15002 break;
+
15003 }
+
15004
+ +
15006 {
+
15007 if (j.m_data.m_value.number_integer >= 0) {
+
15008 // CBOR does not differentiate between positive signed
+
15009 // integers and unsigned integers. Therefore, we used the
+
15010 // code from the value_t::number_unsigned case here.
+
15011 if (j.m_data.m_value.number_integer <= 0x17) {
+
15012 write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
+
15013 }
+
15014 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15015 oa->write_character(to_char_type(0x18));
+
15016 write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
+
15017 }
+
15018 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15019 oa->write_character(to_char_type(0x19));
+
15020 write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));
+
15021 }
+
15022 else if (j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15023 oa->write_character(to_char_type(0x1A));
+
15024 write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));
+
15025 }
+
15026 else {
+
15027 oa->write_character(to_char_type(0x1B));
+
15028 write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));
+
15029 }
+
15030 }
+
15031 else {
+
15032 // The conversions below encode the sign in the first
+
15033 // byte, and the value is converted to a positive number.
+
15034 const auto positive_number = -1 - j.m_data.m_value.number_integer;
+
15035 if (j.m_data.m_value.number_integer >= -24) {
+
15036 write_number(static_cast<std::uint8_t>(0x20 + positive_number));
+
15037 }
+
15038 else if (positive_number <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15039 oa->write_character(to_char_type(0x38));
+
15040 write_number(static_cast<std::uint8_t>(positive_number));
+
15041 }
+
15042 else if (positive_number <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15043 oa->write_character(to_char_type(0x39));
+
15044 write_number(static_cast<std::uint16_t>(positive_number));
+
15045 }
+
15046 else if (positive_number <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15047 oa->write_character(to_char_type(0x3A));
+
15048 write_number(static_cast<std::uint32_t>(positive_number));
+
15049 }
+
15050 else {
+
15051 oa->write_character(to_char_type(0x3B));
+
15052 write_number(static_cast<std::uint64_t>(positive_number));
+
15053 }
+
15054 }
+
15055 break;
+
15056 }
+
15057
+ +
15059 {
+
15060 if (j.m_data.m_value.number_unsigned <= 0x17) {
+
15061 write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_unsigned));
+
15062 }
+
15063 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15064 oa->write_character(to_char_type(0x18));
+
15065 write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_unsigned));
+
15066 }
+
15067 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15068 oa->write_character(to_char_type(0x19));
+
15069 write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_unsigned));
+
15070 }
+
15071 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15072 oa->write_character(to_char_type(0x1A));
+
15073 write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_unsigned));
+
15074 }
+
15075 else {
+
15076 oa->write_character(to_char_type(0x1B));
+
15077 write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_unsigned));
+
15078 }
+
15079 break;
+
15080 }
+
15081
+ +
15083 {
+
15084 if (std::isnan(j.m_data.m_value.number_float)) {
+
15085 // NaN is 0xf97e00 in CBOR
+
15086 oa->write_character(to_char_type(0xF9));
+
15087 oa->write_character(to_char_type(0x7E));
+
15088 oa->write_character(to_char_type(0x00));
+
15089 }
+
15090 else if (std::isinf(j.m_data.m_value.number_float)) {
+
15091 // Infinity is 0xf97c00, -Infinity is 0xf9fc00
+
15092 oa->write_character(to_char_type(0xf9));
+
15093 oa->write_character(j.m_data.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));
+
15094 oa->write_character(to_char_type(0x00));
+
15095 }
+
15096 else {
+
15097 write_compact_float(j.m_data.m_value.number_float, detail::input_format_t::cbor);
+
15098 }
+
15099 break;
+
15100 }
+
15101
+
15102 case value_t::string:
+
15103 {
+
15104 // step 1: write control byte and the string length
+
15105 const auto N = j.m_data.m_value.string->size();
+
15106 if (N <= 0x17) {
+
15107 write_number(static_cast<std::uint8_t>(0x60 + N));
+
15108 }
+
15109 else if (N <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15110 oa->write_character(to_char_type(0x78));
+
15111 write_number(static_cast<std::uint8_t>(N));
+
15112 }
+
15113 else if (N <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15114 oa->write_character(to_char_type(0x79));
+
15115 write_number(static_cast<std::uint16_t>(N));
+
15116 }
+
15117 else if (N <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15118 oa->write_character(to_char_type(0x7A));
+
15119 write_number(static_cast<std::uint32_t>(N));
+
15120 }
+
15121 // LCOV_EXCL_START
+
15122 else if (N <= (std::numeric_limits<std::uint64_t>::max)()) {
+
15123 oa->write_character(to_char_type(0x7B));
+
15124 write_number(static_cast<std::uint64_t>(N));
+
15125 }
+
15126 // LCOV_EXCL_STOP
+
15127
+
15128 // step 2: write the string
+
15129 oa->write_characters(
+
15130 reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),
+
15131 j.m_data.m_value.string->size());
+
15132 break;
+
15133 }
+
15134
+
15135 case value_t::array:
+
15136 {
+
15137 // step 1: write control byte and the array size
+
15138 const auto N = j.m_data.m_value.array->size();
+
15139 if (N <= 0x17) {
+
15140 write_number(static_cast<std::uint8_t>(0x80 + N));
+
15141 }
+
15142 else if (N <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15143 oa->write_character(to_char_type(0x98));
+
15144 write_number(static_cast<std::uint8_t>(N));
+
15145 }
+
15146 else if (N <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15147 oa->write_character(to_char_type(0x99));
+
15148 write_number(static_cast<std::uint16_t>(N));
+
15149 }
+
15150 else if (N <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15151 oa->write_character(to_char_type(0x9A));
+
15152 write_number(static_cast<std::uint32_t>(N));
+
15153 }
+
15154 // LCOV_EXCL_START
+
15155 else if (N <= (std::numeric_limits<std::uint64_t>::max)()) {
+
15156 oa->write_character(to_char_type(0x9B));
+
15157 write_number(static_cast<std::uint64_t>(N));
+
15158 }
+
15159 // LCOV_EXCL_STOP
+
15160
+
15161 // step 2: write each element
+
15162 for (const auto& el : *j.m_data.m_value.array) {
+
15163 write_cbor(el);
+
15164 }
+
15165 break;
+
15166 }
+
15167
+
15168 case value_t::binary:
+
15169 {
+
15170 if (j.m_data.m_value.binary->has_subtype()) {
+
15171 if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15172 write_number(static_cast<std::uint8_t>(0xd8));
+
15173 write_number(static_cast<std::uint8_t>(j.m_data.m_value.binary->subtype()));
+
15174 }
+
15175 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15176 write_number(static_cast<std::uint8_t>(0xd9));
+
15177 write_number(static_cast<std::uint16_t>(j.m_data.m_value.binary->subtype()));
+
15178 }
+
15179 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15180 write_number(static_cast<std::uint8_t>(0xda));
+
15181 write_number(static_cast<std::uint32_t>(j.m_data.m_value.binary->subtype()));
+
15182 }
+
15183 else if (j.m_data.m_value.binary->subtype() <= (std::numeric_limits<std::uint64_t>::max)()) {
+
15184 write_number(static_cast<std::uint8_t>(0xdb));
+
15185 write_number(static_cast<std::uint64_t>(j.m_data.m_value.binary->subtype()));
+
15186 }
+
15187 }
+
15188
+
15189 // step 1: write control byte and the binary array size
+
15190 const auto N = j.m_data.m_value.binary->size();
+
15191 if (N <= 0x17) {
+
15192 write_number(static_cast<std::uint8_t>(0x40 + N));
+
15193 }
+
15194 else if (N <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15195 oa->write_character(to_char_type(0x58));
+
15196 write_number(static_cast<std::uint8_t>(N));
+
15197 }
+
15198 else if (N <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15199 oa->write_character(to_char_type(0x59));
+
15200 write_number(static_cast<std::uint16_t>(N));
+
15201 }
+
15202 else if (N <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15203 oa->write_character(to_char_type(0x5A));
+
15204 write_number(static_cast<std::uint32_t>(N));
+
15205 }
+
15206 // LCOV_EXCL_START
+
15207 else if (N <= (std::numeric_limits<std::uint64_t>::max)()) {
+
15208 oa->write_character(to_char_type(0x5B));
+
15209 write_number(static_cast<std::uint64_t>(N));
+
15210 }
+
15211 // LCOV_EXCL_STOP
+
15212
+
15213 // step 2: write each element
+
15214 oa->write_characters(
+
15215 reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),
+
15216 N);
+
15217
+
15218 break;
+
15219 }
+
15220
+
15221 case value_t::object:
+
15222 {
+
15223 // step 1: write control byte and the object size
+
15224 const auto N = j.m_data.m_value.object->size();
+
15225 if (N <= 0x17) {
+
15226 write_number(static_cast<std::uint8_t>(0xA0 + N));
+
15227 }
+
15228 else if (N <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15229 oa->write_character(to_char_type(0xB8));
+
15230 write_number(static_cast<std::uint8_t>(N));
+
15231 }
+
15232 else if (N <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15233 oa->write_character(to_char_type(0xB9));
+
15234 write_number(static_cast<std::uint16_t>(N));
+
15235 }
+
15236 else if (N <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15237 oa->write_character(to_char_type(0xBA));
+
15238 write_number(static_cast<std::uint32_t>(N));
+
15239 }
+
15240 // LCOV_EXCL_START
+
15241 else if (N <= (std::numeric_limits<std::uint64_t>::max)()) {
+
15242 oa->write_character(to_char_type(0xBB));
+
15243 write_number(static_cast<std::uint64_t>(N));
+
15244 }
+
15245 // LCOV_EXCL_STOP
+
15246
+
15247 // step 2: write each element
+
15248 for (const auto& el : *j.m_data.m_value.object) {
+
15249 write_cbor(el.first);
+
15250 write_cbor(el.second);
+
15251 }
+
15252 break;
+
15253 }
+
15254
+
15255 case value_t::discarded:
+
15256 default:
+
15257 break;
+
15258 }
+
15259 }
+
+
15260
+
+
15264 void write_msgpack(const BasicJsonType& j) {
+
15265 switch (j.type()) {
+
15266 case value_t::null: // nil
+
15267 {
+
15268 oa->write_character(to_char_type(0xC0));
+
15269 break;
+
15270 }
+
15271
+
15272 case value_t::boolean: // true and false
+
15273 {
+
15274 oa->write_character(j.m_data.m_value.boolean
+
15275 ? to_char_type(0xC3)
+
15276 : to_char_type(0xC2));
+
15277 break;
+
15278 }
+
15279
+ +
15281 {
+
15282 if (j.m_data.m_value.number_integer >= 0) {
+
15283 // MessagePack does not differentiate between positive
+
15284 // signed integers and unsigned integers. Therefore, we used
+
15285 // the code from the value_t::number_unsigned case here.
+
15286 if (j.m_data.m_value.number_unsigned < 128) {
+
15287 // positive fixnum
+
15288 write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
+
15289 }
+
15290 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15291 // uint 8
+
15292 oa->write_character(to_char_type(0xCC));
+
15293 write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
+
15294 }
+
15295 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15296 // uint 16
+
15297 oa->write_character(to_char_type(0xCD));
+
15298 write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));
+
15299 }
+
15300 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15301 // uint 32
+
15302 oa->write_character(to_char_type(0xCE));
+
15303 write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));
+
15304 }
+
15305 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)()) {
+
15306 // uint 64
+
15307 oa->write_character(to_char_type(0xCF));
+
15308 write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));
+
15309 }
+
15310 }
+
15311 else {
+
15312 if (j.m_data.m_value.number_integer >= -32) {
+
15313 // negative fixnum
+
15314 write_number(static_cast<std::int8_t>(j.m_data.m_value.number_integer));
+
15315 }
+
15316 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int8_t>::min)() &&
+
15317 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)()) {
+
15318 // int 8
+
15319 oa->write_character(to_char_type(0xD0));
+
15320 write_number(static_cast<std::int8_t>(j.m_data.m_value.number_integer));
+
15321 }
+
15322 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int16_t>::min)() &&
+
15323 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)()) {
+
15324 // int 16
+
15325 oa->write_character(to_char_type(0xD1));
+
15326 write_number(static_cast<std::int16_t>(j.m_data.m_value.number_integer));
+
15327 }
+
15328 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int32_t>::min)() &&
+
15329 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)()) {
+
15330 // int 32
+
15331 oa->write_character(to_char_type(0xD2));
+
15332 write_number(static_cast<std::int32_t>(j.m_data.m_value.number_integer));
+
15333 }
+
15334 else if (j.m_data.m_value.number_integer >= (std::numeric_limits<std::int64_t>::min)() &&
+
15335 j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)()) {
+
15336 // int 64
+
15337 oa->write_character(to_char_type(0xD3));
+
15338 write_number(static_cast<std::int64_t>(j.m_data.m_value.number_integer));
+
15339 }
+
15340 }
+
15341 break;
+
15342 }
+
15343
+ +
15345 {
+
15346 if (j.m_data.m_value.number_unsigned < 128) {
+
15347 // positive fixnum
+
15348 write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
+
15349 }
+
15350 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15351 // uint 8
+
15352 oa->write_character(to_char_type(0xCC));
+
15353 write_number(static_cast<std::uint8_t>(j.m_data.m_value.number_integer));
+
15354 }
+
15355 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15356 // uint 16
+
15357 oa->write_character(to_char_type(0xCD));
+
15358 write_number(static_cast<std::uint16_t>(j.m_data.m_value.number_integer));
+
15359 }
+
15360 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15361 // uint 32
+
15362 oa->write_character(to_char_type(0xCE));
+
15363 write_number(static_cast<std::uint32_t>(j.m_data.m_value.number_integer));
+
15364 }
+
15365 else if (j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)()) {
+
15366 // uint 64
+
15367 oa->write_character(to_char_type(0xCF));
+
15368 write_number(static_cast<std::uint64_t>(j.m_data.m_value.number_integer));
+
15369 }
+
15370 break;
+
15371 }
+
15372
+ +
15374 {
+
15375 write_compact_float(j.m_data.m_value.number_float, detail::input_format_t::msgpack);
+
15376 break;
+
15377 }
+
15378
+
15379 case value_t::string:
+
15380 {
+
15381 // step 1: write control byte and the string length
+
15382 const auto N = j.m_data.m_value.string->size();
+
15383 if (N <= 31) {
+
15384 // fixstr
+
15385 write_number(static_cast<std::uint8_t>(0xA0 | N));
+
15386 }
+
15387 else if (N <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15388 // str 8
+
15389 oa->write_character(to_char_type(0xD9));
+
15390 write_number(static_cast<std::uint8_t>(N));
+
15391 }
+
15392 else if (N <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15393 // str 16
+
15394 oa->write_character(to_char_type(0xDA));
+
15395 write_number(static_cast<std::uint16_t>(N));
+
15396 }
+
15397 else if (N <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15398 // str 32
+
15399 oa->write_character(to_char_type(0xDB));
+
15400 write_number(static_cast<std::uint32_t>(N));
+
15401 }
+
15402
+
15403 // step 2: write the string
+
15404 oa->write_characters(
+
15405 reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),
+
15406 j.m_data.m_value.string->size());
+
15407 break;
+
15408 }
+
15409
+
15410 case value_t::array:
+
15411 {
+
15412 // step 1: write control byte and the array size
+
15413 const auto N = j.m_data.m_value.array->size();
+
15414 if (N <= 15) {
+
15415 // fixarray
+
15416 write_number(static_cast<std::uint8_t>(0x90 | N));
+
15417 }
+
15418 else if (N <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15419 // array 16
+
15420 oa->write_character(to_char_type(0xDC));
+
15421 write_number(static_cast<std::uint16_t>(N));
+
15422 }
+
15423 else if (N <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15424 // array 32
+
15425 oa->write_character(to_char_type(0xDD));
+
15426 write_number(static_cast<std::uint32_t>(N));
+
15427 }
+
15428
+
15429 // step 2: write each element
+
15430 for (const auto& el : *j.m_data.m_value.array) {
+
15431 write_msgpack(el);
+
15432 }
+
15433 break;
+
15434 }
+
15435
+
15436 case value_t::binary:
+
15437 {
+
15438 // step 0: determine if the binary type has a set subtype to
+
15439 // determine whether to use the ext or fixext types
+
15440 const bool use_ext = j.m_data.m_value.binary->has_subtype();
+
15441
+
15442 // step 1: write control byte and the byte string length
+
15443 const auto N = j.m_data.m_value.binary->size();
+
15444 if (N <= (std::numeric_limits<std::uint8_t>::max)()) {
+
15445 std::uint8_t output_type{};
+
15446 bool fixed = true;
+
15447 if (use_ext) {
+
15448 switch (N) {
+
15449 case 1:
+
15450 output_type = 0xD4; // fixext 1
+
15451 break;
+
15452 case 2:
+
15453 output_type = 0xD5; // fixext 2
+
15454 break;
+
15455 case 4:
+
15456 output_type = 0xD6; // fixext 4
+
15457 break;
+
15458 case 8:
+
15459 output_type = 0xD7; // fixext 8
+
15460 break;
+
15461 case 16:
+
15462 output_type = 0xD8; // fixext 16
+
15463 break;
+
15464 default:
+
15465 output_type = 0xC7; // ext 8
+
15466 fixed = false;
+
15467 break;
+
15468 }
+
15469
+
15470 }
+
15471 else {
+
15472 output_type = 0xC4; // bin 8
+
15473 fixed = false;
+
15474 }
+
15475
+
15476 oa->write_character(to_char_type(output_type));
+
15477 if (!fixed) {
+
15478 write_number(static_cast<std::uint8_t>(N));
+
15479 }
+
15480 }
+
15481 else if (N <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15482 const std::uint8_t output_type = use_ext
+
15483 ? 0xC8 // ext 16
+
15484 : 0xC5; // bin 16
+
15485
+
15486 oa->write_character(to_char_type(output_type));
+
15487 write_number(static_cast<std::uint16_t>(N));
+
15488 }
+
15489 else if (N <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15490 const std::uint8_t output_type = use_ext
+
15491 ? 0xC9 // ext 32
+
15492 : 0xC6; // bin 32
+
15493
+
15494 oa->write_character(to_char_type(output_type));
+
15495 write_number(static_cast<std::uint32_t>(N));
+
15496 }
+
15497
+
15498 // step 1.5: if this is an ext type, write the subtype
+
15499 if (use_ext) {
+
15500 write_number(static_cast<std::int8_t>(j.m_data.m_value.binary->subtype()));
+
15501 }
+
15502
+
15503 // step 2: write the byte string
+
15504 oa->write_characters(
+
15505 reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),
+
15506 N);
+
15507
+
15508 break;
+
15509 }
+
15510
+
15511 case value_t::object:
+
15512 {
+
15513 // step 1: write control byte and the object size
+
15514 const auto N = j.m_data.m_value.object->size();
+
15515 if (N <= 15) {
+
15516 // fixmap
+
15517 write_number(static_cast<std::uint8_t>(0x80 | (N & 0xF)));
+
15518 }
+
15519 else if (N <= (std::numeric_limits<std::uint16_t>::max)()) {
+
15520 // map 16
+
15521 oa->write_character(to_char_type(0xDE));
+
15522 write_number(static_cast<std::uint16_t>(N));
+
15523 }
+
15524 else if (N <= (std::numeric_limits<std::uint32_t>::max)()) {
+
15525 // map 32
+
15526 oa->write_character(to_char_type(0xDF));
+
15527 write_number(static_cast<std::uint32_t>(N));
+
15528 }
+
15529
+
15530 // step 2: write each element
+
15531 for (const auto& el : *j.m_data.m_value.object) {
+
15532 write_msgpack(el.first);
+
15533 write_msgpack(el.second);
+
15534 }
+
15535 break;
+
15536 }
+
15537
+
15538 case value_t::discarded:
+
15539 default:
+
15540 break;
+
15541 }
+
15542 }
+
+
15543
+
+
15552 void write_ubjson(const BasicJsonType& j, const bool use_count,
+
15553 const bool use_type, const bool add_prefix = true,
+
15554 const bool use_bjdata = false, const bjdata_version_t bjdata_version = bjdata_version_t::draft2) {
+
15555 const bool bjdata_draft3 = use_bjdata && bjdata_version == bjdata_version_t::draft3;
+
15556
+
15557 switch (j.type()) {
+
15558 case value_t::null:
+
15559 {
+
15560 if (add_prefix) {
+
15561 oa->write_character(to_char_type('Z'));
+
15562 }
+
15563 break;
+
15564 }
+
15565
+
15566 case value_t::boolean:
+
15567 {
+
15568 if (add_prefix) {
+
15569 oa->write_character(j.m_data.m_value.boolean
+
15570 ? to_char_type('T')
+
15571 : to_char_type('F'));
+
15572 }
+
15573 break;
+
15574 }
+
15575
+ +
15577 {
+
15578 write_number_with_ubjson_prefix(j.m_data.m_value.number_integer, add_prefix, use_bjdata);
+
15579 break;
+
15580 }
+
15581
+ +
15583 {
+
15584 write_number_with_ubjson_prefix(j.m_data.m_value.number_unsigned, add_prefix, use_bjdata);
+
15585 break;
+
15586 }
+
15587
+ +
15589 {
+
15590 write_number_with_ubjson_prefix(j.m_data.m_value.number_float, add_prefix, use_bjdata);
+
15591 break;
+
15592 }
+
15593
+
15594 case value_t::string:
+
15595 {
+
15596 if (add_prefix) {
+
15597 oa->write_character(to_char_type('S'));
+
15598 }
+
15599 write_number_with_ubjson_prefix(j.m_data.m_value.string->size(), true, use_bjdata);
+
15600 oa->write_characters(
+
15601 reinterpret_cast<const CharType*>(j.m_data.m_value.string->c_str()),
+
15602 j.m_data.m_value.string->size());
+
15603 break;
+
15604 }
+
15605
+
15606 case value_t::array:
+
15607 {
+
15608 if (add_prefix) {
+
15609 oa->write_character(to_char_type('['));
+
15610 }
+
15611
+
15612 bool prefix_required = true;
+
15613 if (use_type && !j.m_data.m_value.array->empty()) {
+
15614 JSON_ASSERT(use_count);
+
15615 const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata);
+
15616 const bool same_prefix = std::all_of(j.begin() + 1, j.end(),
+
15617 [this, first_prefix, use_bjdata](const BasicJsonType& v) {
+
15618 return ubjson_prefix(v, use_bjdata) == first_prefix;
+
15619 });
+
15620
+
15621 std::vector<CharType> bjdx = { '[', '{', 'S', 'H', 'T', 'F', 'N', 'Z' }; // excluded markers in bjdata optimized type
+
15622
+
15623 if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end())) {
+
15624 prefix_required = false;
+
15625 oa->write_character(to_char_type('$'));
+
15626 oa->write_character(first_prefix);
+
15627 }
+
15628 }
+
15629
+
15630 if (use_count) {
+
15631 oa->write_character(to_char_type('#'));
+
15632 write_number_with_ubjson_prefix(j.m_data.m_value.array->size(), true, use_bjdata);
+
15633 }
+
15634
+
15635 for (const auto& el : *j.m_data.m_value.array) {
+
15636 write_ubjson(el, use_count, use_type, prefix_required, use_bjdata, bjdata_version);
+
15637 }
+
15638
+
15639 if (!use_count) {
+
15640 oa->write_character(to_char_type(']'));
+
15641 }
+
15642
+
15643 break;
+
15644 }
+
15645
+
15646 case value_t::binary:
+
15647 {
+
15648 if (add_prefix) {
+
15649 oa->write_character(to_char_type('['));
+
15650 }
+
15651
+
15652 if (use_type && (bjdata_draft3 || !j.m_data.m_value.binary->empty())) {
+
15653 JSON_ASSERT(use_count);
+
15654 oa->write_character(to_char_type('$'));
+
15655 oa->write_character(bjdata_draft3 ? 'B' : 'U');
+
15656 }
+
15657
+
15658 if (use_count) {
+
15659 oa->write_character(to_char_type('#'));
+
15660 write_number_with_ubjson_prefix(j.m_data.m_value.binary->size(), true, use_bjdata);
+
15661 }
+
15662
+
15663 if (use_type) {
+
15664 oa->write_characters(
+
15665 reinterpret_cast<const CharType*>(j.m_data.m_value.binary->data()),
+
15666 j.m_data.m_value.binary->size());
+
15667 }
+
15668 else {
+
15669 for (size_t i = 0; i < j.m_data.m_value.binary->size(); ++i) {
+
15670 oa->write_character(to_char_type(bjdata_draft3 ? 'B' : 'U'));
+
15671 oa->write_character(j.m_data.m_value.binary->data()[i]);
+
15672 }
+
15673 }
+
15674
+
15675 if (!use_count) {
+
15676 oa->write_character(to_char_type(']'));
+
15677 }
+
15678
+
15679 break;
+
15680 }
+
15681
+
15682 case value_t::object:
+
15683 {
+
15684 if (use_bjdata && j.m_data.m_value.object->size() == 3 && j.m_data.m_value.object->find("_ArrayType_") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find("_ArraySize_") != j.m_data.m_value.object->end() && j.m_data.m_value.object->find("_ArrayData_") != j.m_data.m_value.object->end()) {
+
15685 if (!write_bjdata_ndarray(*j.m_data.m_value.object, use_count, use_type, bjdata_version)) // decode bjdata ndarray in the JData format (https://github.com/NeuroJSON/jdata)
+
15686 {
+
15687 break;
+
15688 }
+
15689 }
+
15690
+
15691 if (add_prefix) {
+
15692 oa->write_character(to_char_type('{'));
+
15693 }
+
15694
+
15695 bool prefix_required = true;
+
15696 if (use_type && !j.m_data.m_value.object->empty()) {
+
15697 JSON_ASSERT(use_count);
+
15698 const CharType first_prefix = ubjson_prefix(j.front(), use_bjdata);
+
15699 const bool same_prefix = std::all_of(j.begin(), j.end(),
+
15700 [this, first_prefix, use_bjdata](const BasicJsonType& v) {
+
15701 return ubjson_prefix(v, use_bjdata) == first_prefix;
+
15702 });
+
15703
+
15704 std::vector<CharType> bjdx = { '[', '{', 'S', 'H', 'T', 'F', 'N', 'Z' }; // excluded markers in bjdata optimized type
+
15705
+
15706 if (same_prefix && !(use_bjdata && std::find(bjdx.begin(), bjdx.end(), first_prefix) != bjdx.end())) {
+
15707 prefix_required = false;
+
15708 oa->write_character(to_char_type('$'));
+
15709 oa->write_character(first_prefix);
+
15710 }
+
15711 }
+
15712
+
15713 if (use_count) {
+
15714 oa->write_character(to_char_type('#'));
+
15715 write_number_with_ubjson_prefix(j.m_data.m_value.object->size(), true, use_bjdata);
+
15716 }
+
15717
+
15718 for (const auto& el : *j.m_data.m_value.object) {
+
15719 write_number_with_ubjson_prefix(el.first.size(), true, use_bjdata);
+
15720 oa->write_characters(
+
15721 reinterpret_cast<const CharType*>(el.first.c_str()),
+
15722 el.first.size());
+
15723 write_ubjson(el.second, use_count, use_type, prefix_required, use_bjdata, bjdata_version);
+
15724 }
+
15725
+
15726 if (!use_count) {
+
15727 oa->write_character(to_char_type('}'));
+
15728 }
+
15729
+
15730 break;
+
15731 }
+
15732
+
15733 case value_t::discarded:
+
15734 default:
+
15735 break;
+
15736 }
+
15737 }
+
+
15738
+
15739 private:
+
15741 // BSON //
+
15743
+
15748 static std::size_t calc_bson_entry_header_size(const string_t& name, const BasicJsonType& j) {
+
15749 const auto it = name.find(static_cast<typename string_t::value_type>(0));
+
15750 if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos)) {
+
15751 JSON_THROW(out_of_range::create(409, concat("BSON key cannot contain code point U+0000 (at byte ", std::to_string(it), ")"), &j));
+
15752 }
+
15753
+
15754 static_cast<void>(j);
+
15755 return /*id*/ 1ul + name.size() + /*zero-terminator*/1u;
+
15756 }
+
15757
+
15761 void write_bson_entry_header(const string_t& name,
+
15762 const std::uint8_t element_type) {
+
15763 oa->write_character(to_char_type(element_type)); // boolean
+
15764 oa->write_characters(
+
15765 reinterpret_cast<const CharType*>(name.c_str()),
+
15766 name.size() + 1u);
+
15767 }
+
15768
+
15772 void write_bson_boolean(const string_t& name,
+
15773 const bool value) {
+
15774 write_bson_entry_header(name, 0x08);
+
15775 oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00));
+
15776 }
+
15777
+
15781 void write_bson_double(const string_t& name,
+
15782 const double value) {
+
15783 write_bson_entry_header(name, 0x01);
+
15784 write_number<double>(value, true);
+
15785 }
+
15786
+
15790 static std::size_t calc_bson_string_size(const string_t& value) {
+
15791 return sizeof(std::int32_t) + value.size() + 1ul;
+
15792 }
+
15793
+
15797 void write_bson_string(const string_t& name,
+
15798 const string_t& value) {
+
15799 write_bson_entry_header(name, 0x02);
+
15800
+
15801 write_number<std::int32_t>(static_cast<std::int32_t>(value.size() + 1ul), true);
+
15802 oa->write_characters(
+
15803 reinterpret_cast<const CharType*>(value.c_str()),
+
15804 value.size() + 1);
+
15805 }
+
15806
+
15810 void write_bson_null(const string_t& name) {
+
15811 write_bson_entry_header(name, 0x0A);
+
15812 }
+
15813
+
15817 static std::size_t calc_bson_integer_size(const std::int64_t value) {
+
15818 return (std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)()
+
15819 ? sizeof(std::int32_t)
+
15820 : sizeof(std::int64_t);
+
15821 }
+
15822
+
15826 void write_bson_integer(const string_t& name,
+
15827 const std::int64_t value) {
+
15828 if ((std::numeric_limits<std::int32_t>::min)() <= value && value <= (std::numeric_limits<std::int32_t>::max)()) {
+
15829 write_bson_entry_header(name, 0x10); // int32
+
15830 write_number<std::int32_t>(static_cast<std::int32_t>(value), true);
+
15831 }
+
15832 else {
+
15833 write_bson_entry_header(name, 0x12); // int64
+
15834 write_number<std::int64_t>(static_cast<std::int64_t>(value), true);
+
15835 }
+
15836 }
+
15837
+
15841 static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept {
+
15842 return (value <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
+
15843 ? sizeof(std::int32_t)
+
15844 : sizeof(std::int64_t);
+
15845 }
+
15846
+
15850 void write_bson_unsigned(const string_t& name,
+
15851 const BasicJsonType& j) {
+
15852 if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)())) {
+
15853 write_bson_entry_header(name, 0x10 /* int32 */);
+
15854 write_number<std::int32_t>(static_cast<std::int32_t>(j.m_data.m_value.number_unsigned), true);
+
15855 }
+
15856 else if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)())) {
+
15857 write_bson_entry_header(name, 0x12 /* int64 */);
+
15858 write_number<std::int64_t>(static_cast<std::int64_t>(j.m_data.m_value.number_unsigned), true);
+
15859 }
+
15860 else {
+
15861 write_bson_entry_header(name, 0x11 /* uint64 */);
+
15862 write_number<std::uint64_t>(static_cast<std::uint64_t>(j.m_data.m_value.number_unsigned), true);
+
15863 }
+
15864 }
+
15865
+
15869 void write_bson_object_entry(const string_t& name,
+
15870 const typename BasicJsonType::object_t& value) {
+
15871 write_bson_entry_header(name, 0x03); // object
+
15872 write_bson_object(value);
+
15873 }
+
15874
+
15878 static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value) {
+
15879 std::size_t array_index = 0ul;
+
15880
+
15881 const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), static_cast<std::size_t>(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type& el) {
+
15882 return result + calc_bson_element_size(std::to_string(array_index++), el);
+
15883 });
+
15884
+
15885 return sizeof(std::int32_t) + embedded_document_size + 1ul;
+
15886 }
+
15887
+
15891 static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value) {
+
15892 return sizeof(std::int32_t) + value.size() + 1ul;
+
15893 }
+
15894
+
15898 void write_bson_array(const string_t& name,
+
15899 const typename BasicJsonType::array_t& value) {
+
15900 write_bson_entry_header(name, 0x04); // array
+
15901 write_number<std::int32_t>(static_cast<std::int32_t>(calc_bson_array_size(value)), true);
+
15902
+
15903 std::size_t array_index = 0ul;
+
15904
+
15905 for (const auto& el : value) {
+
15906 write_bson_element(std::to_string(array_index++), el);
+
15907 }
+
15908
+
15909 oa->write_character(to_char_type(0x00));
+
15910 }
+
15911
+
15915 void write_bson_binary(const string_t& name,
+
15916 const binary_t& value) {
+
15917 write_bson_entry_header(name, 0x05);
+
15918
+
15919 write_number<std::int32_t>(static_cast<std::int32_t>(value.size()), true);
+
15920 write_number(value.has_subtype() ? static_cast<std::uint8_t>(value.subtype()) : static_cast<std::uint8_t>(0x00));
+
15921
+
15922 oa->write_characters(reinterpret_cast<const CharType*>(value.data()), value.size());
+
15923 }
+
15924
+
15929 static std::size_t calc_bson_element_size(const string_t& name,
+
15930 const BasicJsonType& j) {
+
15931 const auto header_size = calc_bson_entry_header_size(name, j);
+
15932 switch (j.type()) {
+
15933 case value_t::object:
+
15934 return header_size + calc_bson_object_size(*j.m_data.m_value.object);
+
15935
+
15936 case value_t::array:
+
15937 return header_size + calc_bson_array_size(*j.m_data.m_value.array);
+
15938
+
15939 case value_t::binary:
+
15940 return header_size + calc_bson_binary_size(*j.m_data.m_value.binary);
+
15941
+
15942 case value_t::boolean:
+
15943 return header_size + 1ul;
+
15944
+
15945 case value_t::number_float:
+
15946 return header_size + 8ul;
+
15947
+
15948 case value_t::number_integer:
+
15949 return header_size + calc_bson_integer_size(j.m_data.m_value.number_integer);
+
15950
+
15951 case value_t::number_unsigned:
+
15952 return header_size + calc_bson_unsigned_size(j.m_data.m_value.number_unsigned);
+
15953
+
15954 case value_t::string:
+
15955 return header_size + calc_bson_string_size(*j.m_data.m_value.string);
+
15956
+
15957 case value_t::null:
+
15958 return header_size + 0ul;
+
15959
+
15960 // LCOV_EXCL_START
+
15961 case value_t::discarded:
+
15962 default:
+
15963 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
+
15964 return 0ul;
+
15965 // LCOV_EXCL_STOP
+
15966 }
+
15967 }
+
15968
+
15975 void write_bson_element(const string_t& name,
+
15976 const BasicJsonType& j) {
+
15977 switch (j.type()) {
+
15978 case value_t::object:
+
15979 return write_bson_object_entry(name, *j.m_data.m_value.object);
+
15980
+
15981 case value_t::array:
+
15982 return write_bson_array(name, *j.m_data.m_value.array);
+
15983
+
15984 case value_t::binary:
+
15985 return write_bson_binary(name, *j.m_data.m_value.binary);
+
15986
+
15987 case value_t::boolean:
+
15988 return write_bson_boolean(name, j.m_data.m_value.boolean);
+
15989
+
15990 case value_t::number_float:
+
15991 return write_bson_double(name, j.m_data.m_value.number_float);
+
15992
+
15993 case value_t::number_integer:
+
15994 return write_bson_integer(name, j.m_data.m_value.number_integer);
+
15995
+
15996 case value_t::number_unsigned:
+
15997 return write_bson_unsigned(name, j);
+
15998
+
15999 case value_t::string:
+
16000 return write_bson_string(name, *j.m_data.m_value.string);
+
16001
+
16002 case value_t::null:
+
16003 return write_bson_null(name);
+
16004
+
16005 // LCOV_EXCL_START
+
16006 case value_t::discarded:
+
16007 default:
+
16008 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert)
+
16009 return;
+
16010 // LCOV_EXCL_STOP
+
16011 }
+
16012 }
+
16013
+
16020 static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value) {
+
16021 const std::size_t document_size = std::accumulate(value.begin(), value.end(), static_cast<std::size_t>(0),
+
16022 [](size_t result, const typename BasicJsonType::object_t::value_type& el) {
+
16023 return result += calc_bson_element_size(el.first, el.second);
+
16024 });
+
16025
+
16026 return sizeof(std::int32_t) + document_size + 1ul;
+
16027 }
+
16028
+
16033 void write_bson_object(const typename BasicJsonType::object_t& value) {
+
16034 write_number<std::int32_t>(static_cast<std::int32_t>(calc_bson_object_size(value)), true);
+
16035
+
16036 for (const auto& el : value) {
+
16037 write_bson_element(el.first, el.second);
+
16038 }
+
16039
+
16040 oa->write_character(to_char_type(0x00));
+
16041 }
+
16042
+
16044 // CBOR //
+
16046
+
16047 static constexpr CharType get_cbor_float_prefix(float /*unused*/) {
+
16048 return to_char_type(0xFA); // Single-Precision Float
+
16049 }
+
16050
+
16051 static constexpr CharType get_cbor_float_prefix(double /*unused*/) {
+
16052 return to_char_type(0xFB); // Double-Precision Float
+
16053 }
+
16054
+
16056 // MsgPack //
+
16058
+
16059 static constexpr CharType get_msgpack_float_prefix(float /*unused*/) {
+
16060 return to_char_type(0xCA); // float 32
+
16061 }
+
16062
+
16063 static constexpr CharType get_msgpack_float_prefix(double /*unused*/) {
+
16064 return to_char_type(0xCB); // float 64
+
16065 }
+
16066
+
16068 // UBJSON //
+
16070
+
16071 // UBJSON: write number (floating point)
+
16072 template<typename NumberType, typename std::enable_if<
+
16073 std::is_floating_point<NumberType>::value, int>::type = 0>
+
16074 void write_number_with_ubjson_prefix(const NumberType n,
+
16075 const bool add_prefix,
+
16076 const bool use_bjdata) {
+
16077 if (add_prefix) {
+
16078 oa->write_character(get_ubjson_float_prefix(n));
+
16079 }
+
16080 write_number(n, use_bjdata);
+
16081 }
+
16082
+
16083 // UBJSON: write number (unsigned integer)
+
16084 template<typename NumberType, typename std::enable_if<
+
16085 std::is_unsigned<NumberType>::value, int>::type = 0>
+
16086 void write_number_with_ubjson_prefix(const NumberType n,
+
16087 const bool add_prefix,
+
16088 const bool use_bjdata) {
+
16089 if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)())) {
+
16090 if (add_prefix) {
+
16091 oa->write_character(to_char_type('i')); // int8
+
16092 }
+
16093 write_number(static_cast<std::uint8_t>(n), use_bjdata);
+
16094 }
+
16095 else if (n <= (std::numeric_limits<std::uint8_t>::max)()) {
+
16096 if (add_prefix) {
+
16097 oa->write_character(to_char_type('U')); // uint8
+
16098 }
+
16099 write_number(static_cast<std::uint8_t>(n), use_bjdata);
+
16100 }
+
16101 else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)())) {
+
16102 if (add_prefix) {
+
16103 oa->write_character(to_char_type('I')); // int16
+
16104 }
+
16105 write_number(static_cast<std::int16_t>(n), use_bjdata);
+
16106 }
+
16107 else if (use_bjdata && n <= static_cast<uint64_t>((std::numeric_limits<uint16_t>::max)())) {
+
16108 if (add_prefix) {
+
16109 oa->write_character(to_char_type('u')); // uint16 - bjdata only
+
16110 }
+
16111 write_number(static_cast<std::uint16_t>(n), use_bjdata);
+
16112 }
+
16113 else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)())) {
+
16114 if (add_prefix) {
+
16115 oa->write_character(to_char_type('l')); // int32
+
16116 }
+
16117 write_number(static_cast<std::int32_t>(n), use_bjdata);
+
16118 }
+
16119 else if (use_bjdata && n <= static_cast<uint64_t>((std::numeric_limits<uint32_t>::max)())) {
+
16120 if (add_prefix) {
+
16121 oa->write_character(to_char_type('m')); // uint32 - bjdata only
+
16122 }
+
16123 write_number(static_cast<std::uint32_t>(n), use_bjdata);
+
16124 }
+
16125 else if (n <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)())) {
+
16126 if (add_prefix) {
+
16127 oa->write_character(to_char_type('L')); // int64
+
16128 }
+
16129 write_number(static_cast<std::int64_t>(n), use_bjdata);
+
16130 }
+
16131 else if (use_bjdata && n <= (std::numeric_limits<uint64_t>::max)()) {
+
16132 if (add_prefix) {
+
16133 oa->write_character(to_char_type('M')); // uint64 - bjdata only
+
16134 }
+
16135 write_number(static_cast<std::uint64_t>(n), use_bjdata);
+
16136 }
+
16137 else {
+
16138 if (add_prefix) {
+
16139 oa->write_character(to_char_type('H')); // high-precision number
+
16140 }
+
16141
+
16142 const auto number = BasicJsonType(n).dump();
+
16143 write_number_with_ubjson_prefix(number.size(), true, use_bjdata);
+
16144 for (std::size_t i = 0; i < number.size(); ++i) {
+
16145 oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));
+
16146 }
+
16147 }
+
16148 }
+
16149
+
16150 // UBJSON: write number (signed integer)
+
16151 template < typename NumberType, typename std::enable_if <
+
16152 std::is_signed<NumberType>::value &&
+
16153 !std::is_floating_point<NumberType>::value, int >::type = 0 >
+
16154 void write_number_with_ubjson_prefix(const NumberType n,
+
16155 const bool add_prefix,
+
16156 const bool use_bjdata) {
+
16157 if ((std::numeric_limits<std::int8_t>::min)() <= n && n <= (std::numeric_limits<std::int8_t>::max)()) {
+
16158 if (add_prefix) {
+
16159 oa->write_character(to_char_type('i')); // int8
+
16160 }
+
16161 write_number(static_cast<std::int8_t>(n), use_bjdata);
+
16162 }
+
16163 else if (static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint8_t>::max)())) {
+
16164 if (add_prefix) {
+
16165 oa->write_character(to_char_type('U')); // uint8
+
16166 }
+
16167 write_number(static_cast<std::uint8_t>(n), use_bjdata);
+
16168 }
+
16169 else if ((std::numeric_limits<std::int16_t>::min)() <= n && n <= (std::numeric_limits<std::int16_t>::max)()) {
+
16170 if (add_prefix) {
+
16171 oa->write_character(to_char_type('I')); // int16
+
16172 }
+
16173 write_number(static_cast<std::int16_t>(n), use_bjdata);
+
16174 }
+
16175 else if (use_bjdata && (static_cast<std::int64_t>((std::numeric_limits<std::uint16_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint16_t>::max)()))) {
+
16176 if (add_prefix) {
+
16177 oa->write_character(to_char_type('u')); // uint16 - bjdata only
+
16178 }
+
16179 write_number(static_cast<uint16_t>(n), use_bjdata);
+
16180 }
+
16181 else if ((std::numeric_limits<std::int32_t>::min)() <= n && n <= (std::numeric_limits<std::int32_t>::max)()) {
+
16182 if (add_prefix) {
+
16183 oa->write_character(to_char_type('l')); // int32
+
16184 }
+
16185 write_number(static_cast<std::int32_t>(n), use_bjdata);
+
16186 }
+
16187 else if (use_bjdata && (static_cast<std::int64_t>((std::numeric_limits<std::uint32_t>::min)()) <= n && n <= static_cast<std::int64_t>((std::numeric_limits<std::uint32_t>::max)()))) {
+
16188 if (add_prefix) {
+
16189 oa->write_character(to_char_type('m')); // uint32 - bjdata only
+
16190 }
+
16191 write_number(static_cast<uint32_t>(n), use_bjdata);
+
16192 }
+
16193 else if ((std::numeric_limits<std::int64_t>::min)() <= n && n <= (std::numeric_limits<std::int64_t>::max)()) {
+
16194 if (add_prefix) {
+
16195 oa->write_character(to_char_type('L')); // int64
+
16196 }
+
16197 write_number(static_cast<std::int64_t>(n), use_bjdata);
+
16198 }
+
16199 // LCOV_EXCL_START
+
16200 else {
+
16201 if (add_prefix) {
+
16202 oa->write_character(to_char_type('H')); // high-precision number
+
16203 }
+
16204
+
16205 const auto number = BasicJsonType(n).dump();
+
16206 write_number_with_ubjson_prefix(number.size(), true, use_bjdata);
+
16207 for (std::size_t i = 0; i < number.size(); ++i) {
+
16208 oa->write_character(to_char_type(static_cast<std::uint8_t>(number[i])));
+
16209 }
+
16210 }
+
16211 // LCOV_EXCL_STOP
+
16212 }
+
16213
+
16217 CharType ubjson_prefix(const BasicJsonType& j, const bool use_bjdata) const noexcept {
+
16218 switch (j.type()) {
+
16219 case value_t::null:
+
16220 return 'Z';
+
16221
+
16222 case value_t::boolean:
+
16223 return j.m_data.m_value.boolean ? 'T' : 'F';
+
16224
+
16225 case value_t::number_integer:
+
16226 {
+
16227 if ((std::numeric_limits<std::int8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int8_t>::max)()) {
+
16228 return 'i';
+
16229 }
+
16230 if ((std::numeric_limits<std::uint8_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint8_t>::max)()) {
+
16231 return 'U';
+
16232 }
+
16233 if ((std::numeric_limits<std::int16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int16_t>::max)()) {
+
16234 return 'I';
+
16235 }
+
16236 if (use_bjdata && ((std::numeric_limits<std::uint16_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint16_t>::max)())) {
+
16237 return 'u';
+
16238 }
+
16239 if ((std::numeric_limits<std::int32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int32_t>::max)()) {
+
16240 return 'l';
+
16241 }
+
16242 if (use_bjdata && ((std::numeric_limits<std::uint32_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::uint32_t>::max)())) {
+
16243 return 'm';
+
16244 }
+
16245 if ((std::numeric_limits<std::int64_t>::min)() <= j.m_data.m_value.number_integer && j.m_data.m_value.number_integer <= (std::numeric_limits<std::int64_t>::max)()) {
+
16246 return 'L';
+
16247 }
+
16248 // anything else is treated as a high-precision number
+
16249 return 'H'; // LCOV_EXCL_LINE
+
16250 }
+
16251
+
16252 case value_t::number_unsigned:
+
16253 {
+
16254 if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)())) {
+
16255 return 'i';
+
16256 }
+
16257 if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)())) {
+
16258 return 'U';
+
16259 }
+
16260 if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)())) {
+
16261 return 'I';
+
16262 }
+
16263 if (use_bjdata && j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint16_t>::max)())) {
+
16264 return 'u';
+
16265 }
+
16266 if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)())) {
+
16267 return 'l';
+
16268 }
+
16269 if (use_bjdata && j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint32_t>::max)())) {
+
16270 return 'm';
+
16271 }
+
16272 if (j.m_data.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int64_t>::max)())) {
+
16273 return 'L';
+
16274 }
+
16275 if (use_bjdata && j.m_data.m_value.number_unsigned <= (std::numeric_limits<std::uint64_t>::max)()) {
+
16276 return 'M';
+
16277 }
+
16278 // anything else is treated as a high-precision number
+
16279 return 'H'; // LCOV_EXCL_LINE
+
16280 }
+
16281
+
16282 case value_t::number_float:
+
16283 return get_ubjson_float_prefix(j.m_data.m_value.number_float);
+
16284
+
16285 case value_t::string:
+
16286 return 'S';
+
16287
+
16288 case value_t::array: // fallthrough
+
16289 case value_t::binary:
+
16290 return '[';
+
16291
+
16292 case value_t::object:
+
16293 return '{';
+
16294
+
16295 case value_t::discarded:
+
16296 default: // discarded values
+
16297 return 'N';
+
16298 }
+
16299 }
+
16300
+
16301 static constexpr CharType get_ubjson_float_prefix(float /*unused*/) {
+
16302 return 'd'; // float 32
+
16303 }
+
16304
+
16305 static constexpr CharType get_ubjson_float_prefix(double /*unused*/) {
+
16306 return 'D'; // float 64
+
16307 }
+
16308
+
16312 bool write_bjdata_ndarray(const typename BasicJsonType::object_t& value, const bool use_count, const bool use_type, const bjdata_version_t bjdata_version) {
+
16313 std::map<string_t, CharType> bjdtype = { {"uint8", 'U'}, {"int8", 'i'}, {"uint16", 'u'}, {"int16", 'I'},
+
16314 {"uint32", 'm'}, {"int32", 'l'}, {"uint64", 'M'}, {"int64", 'L'}, {"single", 'd'}, {"double", 'D'},
+
16315 {"char", 'C'}, {"byte", 'B'}
+
16316 };
+
16317
+
16318 string_t key = "_ArrayType_";
+
16319 auto it = bjdtype.find(static_cast<string_t>(value.at(key)));
+
16320 if (it == bjdtype.end()) {
+
16321 return true;
+
16322 }
+
16323 CharType dtype = it->second;
+
16324
+
16325 key = "_ArraySize_";
+
16326 std::size_t len = (value.at(key).empty() ? 0 : 1);
+
16327 for (const auto& el : value.at(key)) {
+
16328 len *= static_cast<std::size_t>(el.m_data.m_value.number_unsigned);
+
16329 }
+
16330
+
16331 key = "_ArrayData_";
+
16332 if (value.at(key).size() != len) {
+
16333 return true;
+
16334 }
+
16335
+
16336 oa->write_character('[');
+
16337 oa->write_character('$');
+
16338 oa->write_character(dtype);
+
16339 oa->write_character('#');
+
16340
+
16341 key = "_ArraySize_";
+
16342 write_ubjson(value.at(key), use_count, use_type, true, true, bjdata_version);
+
16343
+
16344 key = "_ArrayData_";
+
16345 if (dtype == 'U' || dtype == 'C' || dtype == 'B') {
+
16346 for (const auto& el : value.at(key)) {
+
16347 write_number(static_cast<std::uint8_t>(el.m_data.m_value.number_unsigned), true);
+
16348 }
+
16349 }
+
16350 else if (dtype == 'i') {
+
16351 for (const auto& el : value.at(key)) {
+
16352 write_number(static_cast<std::int8_t>(el.m_data.m_value.number_integer), true);
+
16353 }
+
16354 }
+
16355 else if (dtype == 'u') {
+
16356 for (const auto& el : value.at(key)) {
+
16357 write_number(static_cast<std::uint16_t>(el.m_data.m_value.number_unsigned), true);
+
16358 }
+
16359 }
+
16360 else if (dtype == 'I') {
+
16361 for (const auto& el : value.at(key)) {
+
16362 write_number(static_cast<std::int16_t>(el.m_data.m_value.number_integer), true);
+
16363 }
+
16364 }
+
16365 else if (dtype == 'm') {
+
16366 for (const auto& el : value.at(key)) {
+
16367 write_number(static_cast<std::uint32_t>(el.m_data.m_value.number_unsigned), true);
+
16368 }
+
16369 }
+
16370 else if (dtype == 'l') {
+
16371 for (const auto& el : value.at(key)) {
+
16372 write_number(static_cast<std::int32_t>(el.m_data.m_value.number_integer), true);
+
16373 }
+
16374 }
+
16375 else if (dtype == 'M') {
+
16376 for (const auto& el : value.at(key)) {
+
16377 write_number(static_cast<std::uint64_t>(el.m_data.m_value.number_unsigned), true);
+
16378 }
+
16379 }
+
16380 else if (dtype == 'L') {
+
16381 for (const auto& el : value.at(key)) {
+
16382 write_number(static_cast<std::int64_t>(el.m_data.m_value.number_integer), true);
+
16383 }
+
16384 }
+
16385 else if (dtype == 'd') {
+
16386 for (const auto& el : value.at(key)) {
+
16387 write_number(static_cast<float>(el.m_data.m_value.number_float), true);
+
16388 }
+
16389 }
+
16390 else if (dtype == 'D') {
+
16391 for (const auto& el : value.at(key)) {
+
16392 write_number(static_cast<double>(el.m_data.m_value.number_float), true);
+
16393 }
+
16394 }
+
16395 return false;
+
16396 }
+
16397
+
16399 // Utility functions //
+
16401
+
16402 /*
+
16403 @brief write a number to output input
+
16404 @param[in] n number of type @a NumberType
+
16405 @param[in] OutputIsLittleEndian Set to true if output data is
+
16406 required to be little endian
+
16407 @tparam NumberType the type of the number
+
16408
+
16409 @note This function needs to respect the system's endianness, because bytes
+
16410 in CBOR, MessagePack, and UBJSON are stored in network order (big
+
16411 endian) and therefore need reordering on little endian systems.
+
16412 On the other hand, BSON and BJData use little endian and should reorder
+
16413 on big endian systems.
+
16414 */
+
16415 template<typename NumberType>
+
16416 void write_number(const NumberType n, const bool OutputIsLittleEndian = false) {
+
16417 // step 1: write the number to an array of length NumberType
+
16418 std::array<CharType, sizeof(NumberType)> vec{};
+
16419 std::memcpy(vec.data(), &n, sizeof(NumberType));
+
16420
+
16421 // step 2: write the array to output (with possible reordering)
+
16422 if (is_little_endian != OutputIsLittleEndian) {
+
16423 // reverse byte order prior to conversion if necessary
+
16424 std::reverse(vec.begin(), vec.end());
+
16425 }
+
16426
+
16427 oa->write_characters(vec.data(), sizeof(NumberType));
+
16428 }
+
16429
+
16430 void write_compact_float(const number_float_t n, detail::input_format_t format) {
+
16431#ifdef __GNUC__
+
16432#pragma GCC diagnostic push
+
16433#pragma GCC diagnostic ignored "-Wfloat-equal"
+
16434#endif
+
16435 if (!std::isfinite(n) || ((static_cast<double>(n) >= static_cast<double>(std::numeric_limits<float>::lowest()) &&
+
16436 static_cast<double>(n) <= static_cast<double>((std::numeric_limits<float>::max)()) &&
+
16437 static_cast<double>(static_cast<float>(n)) == static_cast<double>(n)))) {
+
16438 oa->write_character(format == detail::input_format_t::cbor
+
16439 ? get_cbor_float_prefix(static_cast<float>(n))
+
16440 : get_msgpack_float_prefix(static_cast<float>(n)));
+
16441 write_number(static_cast<float>(n));
+
16442 }
+
16443 else {
+
16444 oa->write_character(format == detail::input_format_t::cbor
+
16445 ? get_cbor_float_prefix(n)
+
16446 : get_msgpack_float_prefix(n));
+
16447 write_number(n);
+
16448 }
+
16449#ifdef __GNUC__
+
16450#pragma GCC diagnostic pop
+
16451#endif
+
16452 }
+
16453
+
16454 public:
+
16455 // The following to_char_type functions are implement the conversion
+
16456 // between uint8_t and CharType. In case CharType is not unsigned,
+
16457 // such a conversion is required to allow values greater than 128.
+
16458 // See <https://github.com/nlohmann/json/issues/1286> for a discussion.
+
16459 template < typename C = CharType,
+
16460 enable_if_t < std::is_signed<C>::value&& std::is_signed<char>::value >* = nullptr >
+
16461 static constexpr CharType to_char_type(std::uint8_t x) noexcept {
+
16462 return *reinterpret_cast<char*>(&x);
+
16463 }
+
16464
+
16465 template < typename C = CharType,
+
16466 enable_if_t < std::is_signed<C>::value&& std::is_unsigned<char>::value >* = nullptr >
+
16467 static CharType to_char_type(std::uint8_t x) noexcept {
+
16468 // The std::is_trivial trait is deprecated in C++26. The replacement is to use
+
16469 // std::is_trivially_copyable and std::is_trivially_default_constructible.
+
16470 // However, some older library implementations support std::is_trivial
+
16471 // but not all the std::is_trivially_* traits.
+
16472 // Since detecting full support across all libraries is difficult,
+
16473 // we use std::is_trivial unless we are using a standard where it has been deprecated.
+
16474 // For more details, see: https://github.com/nlohmann/json/pull/4775#issuecomment-2884361627
+
16475#ifdef JSON_HAS_CPP_26
+
16476 static_assert(std::is_trivially_copyable<CharType>::value, "CharType must be trivially copyable");
+
16477 static_assert(std::is_trivially_default_constructible<CharType>::value, "CharType must be trivially default constructible");
+
16478#else
+
16479 static_assert(std::is_trivial<CharType>::value, "CharType must be trivial");
+
16480#endif
+
16481
+
16482 static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t");
+
16483 CharType result;
+
16484 std::memcpy(&result, &x, sizeof(x));
+
16485 return result;
+
16486 }
+
16487
+
16488 template<typename C = CharType,
+
16489 enable_if_t<std::is_unsigned<C>::value>* = nullptr>
+
16490 static constexpr CharType to_char_type(std::uint8_t x) noexcept {
+
16491 return x;
+
16492 }
+
16493
+
16494 template < typename InputCharType, typename C = CharType,
+
16495 enable_if_t <
+
16496 std::is_signed<C>::value&&
+
16497 std::is_signed<char>::value&&
+
16498 std::is_same<char, typename std::remove_cv<InputCharType>::type>::value
+
16499 >* = nullptr >
+
16500 static constexpr CharType to_char_type(InputCharType x) noexcept {
+
16501 return x;
+
16502 }
+
16503
+
16504 private:
+
16506 const bool is_little_endian = little_endianness();
+
16507
+
16509 output_adapter_t<CharType> oa = nullptr;
+
16510 };
+
+
16511
+
16512} // namespace detail
+
16513NLOHMANN_JSON_NAMESPACE_END
+
16514
+
16515// #include <nlohmann/detail/output/output_adapters.hpp>
+
16516
+
16517// #include <nlohmann/detail/output/serializer.hpp>
+
16518// __ _____ _____ _____
+
16519// __| | __| | | | JSON for Modern C++
+
16520// | | |__ | | | | | | version 3.12.0
+
16521// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
16522//
+
16523// SPDX-FileCopyrightText: 2008, 2009 Björn Hoehrmann <bjoern@hoehrmann.de>
+
16524// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
16525// SPDX-License-Identifier: MIT
+
16526
+
16527
+
16528
+
16529#include <algorithm> // reverse, remove, fill, find, none_of
+
16530#include <array> // array
+
16531#include <clocale> // localeconv, lconv
+
16532#include <cmath> // labs, isfinite, isnan, signbit
+
16533#include <cstddef> // size_t, ptrdiff_t
+
16534#include <cstdint> // uint8_t
+
16535#include <cstdio> // snprintf
+
16536#include <limits> // numeric_limits
+
16537#include <string> // string, char_traits
+
16538#include <iomanip> // setfill, setw
+
16539#include <type_traits> // is_same
+
16540#include <utility> // move
+
16541
+
16542// #include <nlohmann/detail/conversions/to_chars.hpp>
+
16543// __ _____ _____ _____
+
16544// __| | __| | | | JSON for Modern C++
+
16545// | | |__ | | | | | | version 3.12.0
+
16546// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
16547//
+
16548// SPDX-FileCopyrightText: 2009 Florian Loitsch <https://florian.loitsch.com/>
+
16549// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
16550// SPDX-License-Identifier: MIT
+
16551
+
16552
+
16553
+
16554#include <array> // array
+
16555#include <cmath> // signbit, isfinite
+
16556#include <cstdint> // intN_t, uintN_t
+
16557#include <cstring> // memcpy, memmove
+
16558#include <limits> // numeric_limits
+
16559#include <type_traits> // conditional
+
16560
+
16561// #include <nlohmann/detail/macro_scope.hpp>
+
16562
+
16563
+
16564NLOHMANN_JSON_NAMESPACE_BEGIN
+
16565namespace detail {
+
16566
+
+
16586 namespace dtoa_impl {
+
16587
+
16588 template<typename Target, typename Source>
+
16589 Target reinterpret_bits(const Source source) {
+
16590 static_assert(sizeof(Target) == sizeof(Source), "size mismatch");
+
16591
+
16592 Target target;
+
16593 std::memcpy(&target, &source, sizeof(Source));
+
16594 return target;
+
16595 }
+
16596
+
+
16597 struct diyfp // f * 2^e
+
16598 {
+
16599 static constexpr int kPrecision = 64; // = q
+
16600
+
16601 std::uint64_t f = 0;
+
16602 int e = 0;
+
16603
+
16604 constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {}
+
16605
+
+
16610 static diyfp sub(const diyfp& x, const diyfp& y) noexcept {
+
16611 JSON_ASSERT(x.e == y.e);
+
16612 JSON_ASSERT(x.f >= y.f);
+
16613
+
16614 return { x.f - y.f, x.e };
+
16615 }
+
+
16616
+
+
16621 static diyfp mul(const diyfp& x, const diyfp& y) noexcept {
+
16622 static_assert(kPrecision == 64, "internal error");
+
16623
+
16624 // Computes:
+
16625 // f = round((x.f * y.f) / 2^q)
+
16626 // e = x.e + y.e + q
+
16627
+
16628 // Emulate the 64-bit * 64-bit multiplication:
+
16629 //
+
16630 // p = u * v
+
16631 // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi)
+
16632 // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi )
+
16633 // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 )
+
16634 // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 )
+
16635 // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3)
+
16636 // = (p0_lo ) + 2^32 (Q ) + 2^64 (H )
+
16637 // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H )
+
16638 //
+
16639 // (Since Q might be larger than 2^32 - 1)
+
16640 //
+
16641 // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H)
+
16642 //
+
16643 // (Q_hi + H does not overflow a 64-bit int)
+
16644 //
+
16645 // = p_lo + 2^64 p_hi
+
16646
+
16647 const std::uint64_t u_lo = x.f & 0xFFFFFFFFu;
+
16648 const std::uint64_t u_hi = x.f >> 32u;
+
16649 const std::uint64_t v_lo = y.f & 0xFFFFFFFFu;
+
16650 const std::uint64_t v_hi = y.f >> 32u;
+
16651
+
16652 const std::uint64_t p0 = u_lo * v_lo;
+
16653 const std::uint64_t p1 = u_lo * v_hi;
+
16654 const std::uint64_t p2 = u_hi * v_lo;
+
16655 const std::uint64_t p3 = u_hi * v_hi;
+
16656
+
16657 const std::uint64_t p0_hi = p0 >> 32u;
+
16658 const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu;
+
16659 const std::uint64_t p1_hi = p1 >> 32u;
+
16660 const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu;
+
16661 const std::uint64_t p2_hi = p2 >> 32u;
+
16662
+
16663 std::uint64_t Q = p0_hi + p1_lo + p2_lo;
+
16664
+
16665 // The full product might now be computed as
+
16666 //
+
16667 // p_hi = p3 + p2_hi + p1_hi + (Q >> 32)
+
16668 // p_lo = p0_lo + (Q << 32)
+
16669 //
+
16670 // But in this particular case here, the full p_lo is not required.
+
16671 // Effectively, we only need to add the highest bit in p_lo to p_hi (and
+
16672 // Q_hi + 1 does not overflow).
+
16673
+
16674 Q += std::uint64_t{ 1 } << (64u - 32u - 1u); // round, ties up
+
16675
+
16676 const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u);
+
16677
+
16678 return { h, x.e + y.e + 64 };
+
16679 }
+
+
16680
+
+
16685 static diyfp normalize(diyfp x) noexcept {
+
16686 JSON_ASSERT(x.f != 0);
+
16687
+
16688 while ((x.f >> 63u) == 0) {
+
16689 x.f <<= 1u;
+
16690 x.e--;
+
16691 }
+
16692
+
16693 return x;
+
16694 }
+
+
16695
+
+
16700 static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept {
+
16701 const int delta = x.e - target_exponent;
+
16702
+
16703 JSON_ASSERT(delta >= 0);
+
16704 JSON_ASSERT(((x.f << delta) >> delta) == x.f);
+
16705
+
16706 return { x.f << delta, target_exponent };
+
16707 }
+
+
16708 };
+
+
16709
+
+
16710 struct boundaries {
+
16711 diyfp w;
+
16712 diyfp minus;
+
16713 diyfp plus;
+
16714 };
+
+
16715
+
16722 template<typename FloatType>
+
+ +
16724 JSON_ASSERT(std::isfinite(value));
+
16725 JSON_ASSERT(value > 0);
+
16726
+
16727 // Convert the IEEE representation into a diyfp.
+
16728 //
+
16729 // If v is denormal:
+
16730 // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1))
+
16731 // If v is normalized:
+
16732 // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1))
+
16733
+
16734 static_assert(std::numeric_limits<FloatType>::is_iec559,
+
16735 "internal error: dtoa_short requires an IEEE-754 floating-point implementation");
+
16736
+
16737 constexpr int kPrecision = std::numeric_limits<FloatType>::digits; // = p (includes the hidden bit)
+
16738 constexpr int kBias = std::numeric_limits<FloatType>::max_exponent - 1 + (kPrecision - 1);
+
16739 constexpr int kMinExp = 1 - kBias;
+
16740 constexpr std::uint64_t kHiddenBit = std::uint64_t{ 1 } << (kPrecision - 1); // = 2^(p-1)
+
16741
+
16742 using bits_type = typename std::conditional<kPrecision == 24, std::uint32_t, std::uint64_t >::type;
+
16743
+
16744 const auto bits = static_cast<std::uint64_t>(reinterpret_bits<bits_type>(value));
+
16745 const std::uint64_t E = bits >> (kPrecision - 1);
+
16746 const std::uint64_t F = bits & (kHiddenBit - 1);
+
16747
+
16748 const bool is_denormal = E == 0;
+
16749 const diyfp v = is_denormal
+
16750 ? diyfp(F, kMinExp)
+
16751 : diyfp(F + kHiddenBit, static_cast<int>(E) - kBias);
+
16752
+
16753 // Compute the boundaries m- and m+ of the floating-point value
+
16754 // v = f * 2^e.
+
16755 //
+
16756 // Determine v- and v+, the floating-point predecessor and successor of v,
+
16757 // respectively.
+
16758 //
+
16759 // v- = v - 2^e if f != 2^(p-1) or e == e_min (A)
+
16760 // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B)
+
16761 //
+
16762 // v+ = v + 2^e
+
16763 //
+
16764 // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_
+
16765 // between m- and m+ round to v, regardless of how the input rounding
+
16766 // algorithm breaks ties.
+
16767 //
+
16768 // ---+-------------+-------------+-------------+-------------+--- (A)
+
16769 // v- m- v m+ v+
+
16770 //
+
16771 // -----------------+------+------+-------------+-------------+--- (B)
+
16772 // v- m- v m+ v+
+
16773
+
16774 const bool lower_boundary_is_closer = F == 0 && E > 1;
+
16775 const diyfp m_plus = diyfp((2 * v.f) + 1, v.e - 1);
+
16776 const diyfp m_minus = lower_boundary_is_closer
+
16777 ? diyfp((4 * v.f) - 1, v.e - 2) // (B)
+
16778 : diyfp((2 * v.f) - 1, v.e - 1); // (A)
+
16779
+
16780 // Determine the normalized w+ = m+.
+
16781 const diyfp w_plus = diyfp::normalize(m_plus);
+
16782
+
16783 // Determine w- = m- such that e_(w-) = e_(w+).
+
16784 const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e);
+
16785
+
16786 return { diyfp::normalize(v), w_minus, w_plus };
+
16787 }
+
+
16788
+
16789 // Given normalized diyfp w, Grisu needs to find a (normalized) cached
+
16790 // power-of-ten c, such that the exponent of the product c * w = f * 2^e lies
+
16791 // within a certain range [alpha, gamma] (Definition 3.2 from [1])
+
16792 //
+
16793 // alpha <= e = e_c + e_w + q <= gamma
+
16794 //
+
16795 // or
+
16796 //
+
16797 // f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q
+
16798 // <= f_c * f_w * 2^gamma
+
16799 //
+
16800 // Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies
+
16801 //
+
16802 // 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma
+
16803 //
+
16804 // or
+
16805 //
+
16806 // 2^(q - 2 + alpha) <= c * w < 2^(q + gamma)
+
16807 //
+
16808 // The choice of (alpha,gamma) determines the size of the table and the form of
+
16809 // the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well
+
16810 // in practice:
+
16811 //
+
16812 // The idea is to cut the number c * w = f * 2^e into two parts, which can be
+
16813 // processed independently: An integral part p1, and a fractional part p2:
+
16814 //
+
16815 // f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e
+
16816 // = (f div 2^-e) + (f mod 2^-e) * 2^e
+
16817 // = p1 + p2 * 2^e
+
16818 //
+
16819 // The conversion of p1 into decimal form requires a series of divisions and
+
16820 // modulos by (a power of) 10. These operations are faster for 32-bit than for
+
16821 // 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be
+
16822 // achieved by choosing
+
16823 //
+
16824 // -e >= 32 or e <= -32 := gamma
+
16825 //
+
16826 // In order to convert the fractional part
+
16827 //
+
16828 // p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ...
+
16829 //
+
16830 // into decimal form, the fraction is repeatedly multiplied by 10 and the digits
+
16831 // d[-i] are extracted in order:
+
16832 //
+
16833 // (10 * p2) div 2^-e = d[-1]
+
16834 // (10 * p2) mod 2^-e = d[-2] / 10^1 + ...
+
16835 //
+
16836 // The multiplication by 10 must not overflow. It is sufficient to choose
+
16837 //
+
16838 // 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64.
+
16839 //
+
16840 // Since p2 = f mod 2^-e < 2^-e,
+
16841 //
+
16842 // -e <= 60 or e >= -60 := alpha
+
16843
+
16844 constexpr int kAlpha = -60;
+
16845 constexpr int kGamma = -32;
+
16846
+
+
16847 struct cached_power // c = f * 2^e ~= 10^k
+
16848 {
+
16849 std::uint64_t f;
+
16850 int e;
+
16851 int k;
+
16852 };
+
+
16853
+
+ +
16862 // Now
+
16863 //
+
16864 // alpha <= e_c + e + q <= gamma (1)
+
16865 // ==> f_c * 2^alpha <= c * 2^e * 2^q
+
16866 //
+
16867 // and since the c's are normalized, 2^(q-1) <= f_c,
+
16868 //
+
16869 // ==> 2^(q - 1 + alpha) <= c * 2^(e + q)
+
16870 // ==> 2^(alpha - e - 1) <= c
+
16871 //
+
16872 // If c were an exact power of ten, i.e. c = 10^k, one may determine k as
+
16873 //
+
16874 // k = ceil( log_10( 2^(alpha - e - 1) ) )
+
16875 // = ceil( (alpha - e - 1) * log_10(2) )
+
16876 //
+
16877 // From the paper:
+
16878 // "In theory the result of the procedure could be wrong since c is rounded,
+
16879 // and the computation itself is approximated [...]. In practice, however,
+
16880 // this simple function is sufficient."
+
16881 //
+
16882 // For IEEE double precision floating-point numbers converted into
+
16883 // normalized diyfp's w = f * 2^e, with q = 64,
+
16884 //
+
16885 // e >= -1022 (min IEEE exponent)
+
16886 // -52 (p - 1)
+
16887 // -52 (p - 1, possibly normalize denormal IEEE numbers)
+
16888 // -11 (normalize the diyfp)
+
16889 // = -1137
+
16890 //
+
16891 // and
+
16892 //
+
16893 // e <= +1023 (max IEEE exponent)
+
16894 // -52 (p - 1)
+
16895 // -11 (normalize the diyfp)
+
16896 // = 960
+
16897 //
+
16898 // This binary exponent range [-1137,960] results in a decimal exponent
+
16899 // range [-307,324]. One does not need to store a cached power for each
+
16900 // k in this range. For each such k it suffices to find a cached power
+
16901 // such that the exponent of the product lies in [alpha,gamma].
+
16902 // This implies that the difference of the decimal exponents of adjacent
+
16903 // table entries must be less than or equal to
+
16904 //
+
16905 // floor( (gamma - alpha) * log_10(2) ) = 8.
+
16906 //
+
16907 // (A smaller distance gamma-alpha would require a larger table.)
+
16908
+
16909 // NB:
+
16910 // Actually, this function returns c, such that -60 <= e_c + e + 64 <= -34.
+
16911
+
16912 constexpr int kCachedPowersMinDecExp = -300;
+
16913 constexpr int kCachedPowersDecStep = 8;
+
16914
+
16915 static constexpr std::array<cached_power, 79> kCachedPowers =
+
16916 {
+
16917 {
+
16918 { 0xAB70FE17C79AC6CA, -1060, -300 },
+
16919 { 0xFF77B1FCBEBCDC4F, -1034, -292 },
+
16920 { 0xBE5691EF416BD60C, -1007, -284 },
+
16921 { 0x8DD01FAD907FFC3C, -980, -276 },
+
16922 { 0xD3515C2831559A83, -954, -268 },
+
16923 { 0x9D71AC8FADA6C9B5, -927, -260 },
+
16924 { 0xEA9C227723EE8BCB, -901, -252 },
+
16925 { 0xAECC49914078536D, -874, -244 },
+
16926 { 0x823C12795DB6CE57, -847, -236 },
+
16927 { 0xC21094364DFB5637, -821, -228 },
+
16928 { 0x9096EA6F3848984F, -794, -220 },
+
16929 { 0xD77485CB25823AC7, -768, -212 },
+
16930 { 0xA086CFCD97BF97F4, -741, -204 },
+
16931 { 0xEF340A98172AACE5, -715, -196 },
+
16932 { 0xB23867FB2A35B28E, -688, -188 },
+
16933 { 0x84C8D4DFD2C63F3B, -661, -180 },
+
16934 { 0xC5DD44271AD3CDBA, -635, -172 },
+
16935 { 0x936B9FCEBB25C996, -608, -164 },
+
16936 { 0xDBAC6C247D62A584, -582, -156 },
+
16937 { 0xA3AB66580D5FDAF6, -555, -148 },
+
16938 { 0xF3E2F893DEC3F126, -529, -140 },
+
16939 { 0xB5B5ADA8AAFF80B8, -502, -132 },
+
16940 { 0x87625F056C7C4A8B, -475, -124 },
+
16941 { 0xC9BCFF6034C13053, -449, -116 },
+
16942 { 0x964E858C91BA2655, -422, -108 },
+
16943 { 0xDFF9772470297EBD, -396, -100 },
+
16944 { 0xA6DFBD9FB8E5B88F, -369, -92 },
+
16945 { 0xF8A95FCF88747D94, -343, -84 },
+
16946 { 0xB94470938FA89BCF, -316, -76 },
+
16947 { 0x8A08F0F8BF0F156B, -289, -68 },
+
16948 { 0xCDB02555653131B6, -263, -60 },
+
16949 { 0x993FE2C6D07B7FAC, -236, -52 },
+
16950 { 0xE45C10C42A2B3B06, -210, -44 },
+
16951 { 0xAA242499697392D3, -183, -36 },
+
16952 { 0xFD87B5F28300CA0E, -157, -28 },
+
16953 { 0xBCE5086492111AEB, -130, -20 },
+
16954 { 0x8CBCCC096F5088CC, -103, -12 },
+
16955 { 0xD1B71758E219652C, -77, -4 },
+
16956 { 0x9C40000000000000, -50, 4 },
+
16957 { 0xE8D4A51000000000, -24, 12 },
+
16958 { 0xAD78EBC5AC620000, 3, 20 },
+
16959 { 0x813F3978F8940984, 30, 28 },
+
16960 { 0xC097CE7BC90715B3, 56, 36 },
+
16961 { 0x8F7E32CE7BEA5C70, 83, 44 },
+
16962 { 0xD5D238A4ABE98068, 109, 52 },
+
16963 { 0x9F4F2726179A2245, 136, 60 },
+
16964 { 0xED63A231D4C4FB27, 162, 68 },
+
16965 { 0xB0DE65388CC8ADA8, 189, 76 },
+
16966 { 0x83C7088E1AAB65DB, 216, 84 },
+
16967 { 0xC45D1DF942711D9A, 242, 92 },
+
16968 { 0x924D692CA61BE758, 269, 100 },
+
16969 { 0xDA01EE641A708DEA, 295, 108 },
+
16970 { 0xA26DA3999AEF774A, 322, 116 },
+
16971 { 0xF209787BB47D6B85, 348, 124 },
+
16972 { 0xB454E4A179DD1877, 375, 132 },
+
16973 { 0x865B86925B9BC5C2, 402, 140 },
+
16974 { 0xC83553C5C8965D3D, 428, 148 },
+
16975 { 0x952AB45CFA97A0B3, 455, 156 },
+
16976 { 0xDE469FBD99A05FE3, 481, 164 },
+
16977 { 0xA59BC234DB398C25, 508, 172 },
+
16978 { 0xF6C69A72A3989F5C, 534, 180 },
+
16979 { 0xB7DCBF5354E9BECE, 561, 188 },
+
16980 { 0x88FCF317F22241E2, 588, 196 },
+
16981 { 0xCC20CE9BD35C78A5, 614, 204 },
+
16982 { 0x98165AF37B2153DF, 641, 212 },
+
16983 { 0xE2A0B5DC971F303A, 667, 220 },
+
16984 { 0xA8D9D1535CE3B396, 694, 228 },
+
16985 { 0xFB9B7CD9A4A7443C, 720, 236 },
+
16986 { 0xBB764C4CA7A44410, 747, 244 },
+
16987 { 0x8BAB8EEFB6409C1A, 774, 252 },
+
16988 { 0xD01FEF10A657842C, 800, 260 },
+
16989 { 0x9B10A4E5E9913129, 827, 268 },
+
16990 { 0xE7109BFBA19C0C9D, 853, 276 },
+
16991 { 0xAC2820D9623BF429, 880, 284 },
+
16992 { 0x80444B5E7AA7CF85, 907, 292 },
+
16993 { 0xBF21E44003ACDD2D, 933, 300 },
+
16994 { 0x8E679C2F5E44FF8F, 960, 308 },
+
16995 { 0xD433179D9C8CB841, 986, 316 },
+
16996 { 0x9E19DB92B4E31BA9, 1013, 324 },
+
16997 }
+
16998 };
+
16999
+
17000 // This computation gives exactly the same results for k as
+
17001 // k = ceil((kAlpha - e - 1) * 0.30102999566398114)
+
17002 // for |e| <= 1500, but doesn't require floating-point operations.
+
17003 // NB: log_10(2) ~= 78913 / 2^18
+
17004 JSON_ASSERT(e >= -1500);
+
17005 JSON_ASSERT(e <= 1500);
+
17006 const int f = kAlpha - e - 1;
+
17007 const int k = ((f * 78913) / (1 << 18)) + static_cast<int>(f > 0);
+
17008
+
17009 const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep;
+
17010 JSON_ASSERT(index >= 0);
+
17011 JSON_ASSERT(static_cast<std::size_t>(index) < kCachedPowers.size());
+
17012
+
17013 const cached_power cached = kCachedPowers[static_cast<std::size_t>(index)];
+
17014 JSON_ASSERT(kAlpha <= cached.e + e + 64);
+
17015 JSON_ASSERT(kGamma >= cached.e + e + 64);
+
17016
+
17017 return cached;
+
17018 }
+
+
17019
+
+
17024 inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) {
+
17025 // LCOV_EXCL_START
+
17026 if (n >= 1000000000) {
+
17027 pow10 = 1000000000;
+
17028 return 10;
+
17029 }
+
17030 // LCOV_EXCL_STOP
+
17031 if (n >= 100000000) {
+
17032 pow10 = 100000000;
+
17033 return 9;
+
17034 }
+
17035 if (n >= 10000000) {
+
17036 pow10 = 10000000;
+
17037 return 8;
+
17038 }
+
17039 if (n >= 1000000) {
+
17040 pow10 = 1000000;
+
17041 return 7;
+
17042 }
+
17043 if (n >= 100000) {
+
17044 pow10 = 100000;
+
17045 return 6;
+
17046 }
+
17047 if (n >= 10000) {
+
17048 pow10 = 10000;
+
17049 return 5;
+
17050 }
+
17051 if (n >= 1000) {
+
17052 pow10 = 1000;
+
17053 return 4;
+
17054 }
+
17055 if (n >= 100) {
+
17056 pow10 = 100;
+
17057 return 3;
+
17058 }
+
17059 if (n >= 10) {
+
17060 pow10 = 10;
+
17061 return 2;
+
17062 }
+
17063
+
17064 pow10 = 1;
+
17065 return 1;
+
17066 }
+
+
17067
+
17068 inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta,
+
17069 std::uint64_t rest, std::uint64_t ten_k) {
+
17070 JSON_ASSERT(len >= 1);
+
17071 JSON_ASSERT(dist <= delta);
+
17072 JSON_ASSERT(rest <= delta);
+
17073 JSON_ASSERT(ten_k > 0);
+
17074
+
17075 // <--------------------------- delta ---->
+
17076 // <---- dist --------->
+
17077 // --------------[------------------+-------------------]--------------
+
17078 // M- w M+
+
17079 //
+
17080 // ten_k
+
17081 // <------>
+
17082 // <---- rest ---->
+
17083 // --------------[------------------+----+--------------]--------------
+
17084 // w V
+
17085 // = buf * 10^k
+
17086 //
+
17087 // ten_k represents a unit-in-the-last-place in the decimal representation
+
17088 // stored in buf.
+
17089 // Decrement buf by ten_k while this takes buf closer to w.
+
17090
+
17091 // The tests are written in this order to avoid overflow in unsigned
+
17092 // integer arithmetic.
+
17093
+
17094 while (rest < dist
+
17095 && delta - rest >= ten_k
+
17096 && (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) {
+
17097 JSON_ASSERT(buf[len - 1] != '0');
+
17098 buf[len - 1]--;
+
17099 rest += ten_k;
+
17100 }
+
17101 }
+
17102
+
+
17107 inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent,
+
17108 diyfp M_minus, diyfp w, diyfp M_plus) {
+
17109 static_assert(kAlpha >= -60, "internal error");
+
17110 static_assert(kGamma <= -32, "internal error");
+
17111
+
17112 // Generates the digits (and the exponent) of a decimal floating-point
+
17113 // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's
+
17114 // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma.
+
17115 //
+
17116 // <--------------------------- delta ---->
+
17117 // <---- dist --------->
+
17118 // --------------[------------------+-------------------]--------------
+
17119 // M- w M+
+
17120 //
+
17121 // Grisu2 generates the digits of M+ from left to right and stops as soon as
+
17122 // V is in [M-,M+].
+
17123
+
17124 JSON_ASSERT(M_plus.e >= kAlpha);
+
17125 JSON_ASSERT(M_plus.e <= kGamma);
+
17126
+
17127 std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e)
+
17128 std::uint64_t dist = diyfp::sub(M_plus, w).f; // (significand of (M+ - w ), implicit exponent is e)
+
17129
+
17130 // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0):
+
17131 //
+
17132 // M+ = f * 2^e
+
17133 // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e
+
17134 // = ((p1 ) * 2^-e + (p2 )) * 2^e
+
17135 // = p1 + p2 * 2^e
+
17136
+
17137 const diyfp one(std::uint64_t{ 1 } << -M_plus.e, M_plus.e);
+
17138
+
17139 auto p1 = static_cast<std::uint32_t>(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.)
+
17140 std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e
+
17141
+
17142 // 1)
+
17143 //
+
17144 // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0]
+
17145
+
17146 JSON_ASSERT(p1 > 0);
+
17147
+
17148 std::uint32_t pow10{};
+
17149 const int k = find_largest_pow10(p1, pow10);
+
17150
+
17151 // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1)
+
17152 //
+
17153 // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1))
+
17154 // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1))
+
17155 //
+
17156 // M+ = p1 + p2 * 2^e
+
17157 // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e
+
17158 // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e
+
17159 // = d[k-1] * 10^(k-1) + ( rest) * 2^e
+
17160 //
+
17161 // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0)
+
17162 //
+
17163 // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0]
+
17164 //
+
17165 // but stop as soon as
+
17166 //
+
17167 // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e
+
17168
+
17169 int n = k;
+
17170 while (n > 0) {
+
17171 // Invariants:
+
17172 // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k)
+
17173 // pow10 = 10^(n-1) <= p1 < 10^n
+
17174 //
+
17175 const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1)
+
17176 const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1)
+
17177 //
+
17178 // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e
+
17179 // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e)
+
17180 //
+
17181 JSON_ASSERT(d <= 9);
+
17182 buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d
+
17183 //
+
17184 // M+ = buffer * 10^(n-1) + (r + p2 * 2^e)
+
17185 //
+
17186 p1 = r;
+
17187 n--;
+
17188 //
+
17189 // M+ = buffer * 10^n + (p1 + p2 * 2^e)
+
17190 // pow10 = 10^n
+
17191 //
+
17192
+
17193 // Now check if enough digits have been generated.
+
17194 // Compute
+
17195 //
+
17196 // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e
+
17197 //
+
17198 // Note:
+
17199 // Since rest and delta share the same exponent e, it suffices to
+
17200 // compare the significands.
+
17201 const std::uint64_t rest = (std::uint64_t{ p1 } << -one.e) + p2;
+
17202 if (rest <= delta) {
+
17203 // V = buffer * 10^n, with M- <= V <= M+.
+
17204
+
17205 decimal_exponent += n;
+
17206
+
17207 // We may now just stop. But instead, it looks as if the buffer
+
17208 // could be decremented to bring V closer to w.
+
17209 //
+
17210 // pow10 = 10^n is now 1 ulp in the decimal representation V.
+
17211 // The rounding procedure works with diyfp's with an implicit
+
17212 // exponent of e.
+
17213 //
+
17214 // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e
+
17215 //
+
17216 const std::uint64_t ten_n = std::uint64_t{ pow10 } << -one.e;
+
17217 grisu2_round(buffer, length, dist, delta, rest, ten_n);
+
17218
+
17219 return;
+
17220 }
+
17221
+
17222 pow10 /= 10;
+
17223 //
+
17224 // pow10 = 10^(n-1) <= p1 < 10^n
+
17225 // Invariants restored.
+
17226 }
+
17227
+
17228 // 2)
+
17229 //
+
17230 // The digits of the integral part have been generated:
+
17231 //
+
17232 // M+ = d[k-1]...d[1]d[0] + p2 * 2^e
+
17233 // = buffer + p2 * 2^e
+
17234 //
+
17235 // Now generate the digits of the fractional part p2 * 2^e.
+
17236 //
+
17237 // Note:
+
17238 // No decimal point is generated: the exponent is adjusted instead.
+
17239 //
+
17240 // p2 actually represents the fraction
+
17241 //
+
17242 // p2 * 2^e
+
17243 // = p2 / 2^-e
+
17244 // = d[-1] / 10^1 + d[-2] / 10^2 + ...
+
17245 //
+
17246 // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...)
+
17247 //
+
17248 // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m
+
17249 // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...)
+
17250 //
+
17251 // using
+
17252 //
+
17253 // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e)
+
17254 // = ( d) * 2^-e + ( r)
+
17255 //
+
17256 // or
+
17257 // 10^m * p2 * 2^e = d + r * 2^e
+
17258 //
+
17259 // i.e.
+
17260 //
+
17261 // M+ = buffer + p2 * 2^e
+
17262 // = buffer + 10^-m * (d + r * 2^e)
+
17263 // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e
+
17264 //
+
17265 // and stop as soon as 10^-m * r * 2^e <= delta * 2^e
+
17266
+
17267 JSON_ASSERT(p2 > delta);
+
17268
+
17269 int m = 0;
+
17270 for (;;) {
+
17271 // Invariant:
+
17272 // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e
+
17273 // = buffer * 10^-m + 10^-m * (p2 ) * 2^e
+
17274 // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e
+
17275 // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e
+
17276 //
+
17277 JSON_ASSERT(p2 <= (std::numeric_limits<std::uint64_t>::max)() / 10);
+
17278 p2 *= 10;
+
17279 const std::uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e
+
17280 const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e
+
17281 //
+
17282 // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e
+
17283 // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e))
+
17284 // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e
+
17285 //
+
17286 JSON_ASSERT(d <= 9);
+
17287 buffer[length++] = static_cast<char>('0' + d); // buffer := buffer * 10 + d
+
17288 //
+
17289 // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e
+
17290 //
+
17291 p2 = r;
+
17292 m++;
+
17293 //
+
17294 // M+ = buffer * 10^-m + 10^-m * p2 * 2^e
+
17295 // Invariant restored.
+
17296
+
17297 // Check if enough digits have been generated.
+
17298 //
+
17299 // 10^-m * p2 * 2^e <= delta * 2^e
+
17300 // p2 * 2^e <= 10^m * delta * 2^e
+
17301 // p2 <= 10^m * delta
+
17302 delta *= 10;
+
17303 dist *= 10;
+
17304 if (p2 <= delta) {
+
17305 break;
+
17306 }
+
17307 }
+
17308
+
17309 // V = buffer * 10^-m, with M- <= V <= M+.
+
17310
+
17311 decimal_exponent -= m;
+
17312
+
17313 // 1 ulp in the decimal representation is now 10^-m.
+
17314 // Since delta and dist are now scaled by 10^m, we need to do the
+
17315 // same with ulp in order to keep the units in sync.
+
17316 //
+
17317 // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e
+
17318 //
+
17319 const std::uint64_t ten_m = one.f;
+
17320 grisu2_round(buffer, length, dist, delta, p2, ten_m);
+
17321
+
17322 // By construction this algorithm generates the shortest possible decimal
+
17323 // number (Loitsch, Theorem 6.2) which rounds back to w.
+
17324 // For an input number of precision p, at least
+
17325 //
+
17326 // N = 1 + ceil(p * log_10(2))
+
17327 //
+
17328 // decimal digits are sufficient to identify all binary floating-point
+
17329 // numbers (Matula, "In-and-Out conversions").
+
17330 // This implies that the algorithm does not produce more than N decimal
+
17331 // digits.
+
17332 //
+
17333 // N = 17 for p = 53 (IEEE double precision)
+
17334 // N = 9 for p = 24 (IEEE single precision)
+
17335 }
+
+
17336
+
17342 JSON_HEDLEY_NON_NULL(1)
+
+
17343 inline void grisu2(char* buf, int& len, int& decimal_exponent,
+
17344 diyfp m_minus, diyfp v, diyfp m_plus) {
+
17345 JSON_ASSERT(m_plus.e == m_minus.e);
+
17346 JSON_ASSERT(m_plus.e == v.e);
+
17347
+
17348 // --------(-----------------------+-----------------------)-------- (A)
+
17349 // m- v m+
+
17350 //
+
17351 // --------------------(-----------+-----------------------)-------- (B)
+
17352 // m- v m+
+
17353 //
+
17354 // First scale v (and m- and m+) such that the exponent is in the range
+
17355 // [alpha, gamma].
+
17356
+
17357 const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e);
+
17358
+
17359 const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k
+
17360
+
17361 // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma]
+
17362 const diyfp w = diyfp::mul(v, c_minus_k);
+
17363 const diyfp w_minus = diyfp::mul(m_minus, c_minus_k);
+
17364 const diyfp w_plus = diyfp::mul(m_plus, c_minus_k);
+
17365
+
17366 // ----(---+---)---------------(---+---)---------------(---+---)----
+
17367 // w- w w+
+
17368 // = c*m- = c*v = c*m+
+
17369 //
+
17370 // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and
+
17371 // w+ are now off by a small amount.
+
17372 // In fact:
+
17373 //
+
17374 // w - v * 10^k < 1 ulp
+
17375 //
+
17376 // To account for this inaccuracy, add resp. subtract 1 ulp.
+
17377 //
+
17378 // --------+---[---------------(---+---)---------------]---+--------
+
17379 // w- M- w M+ w+
+
17380 //
+
17381 // Now any number in [M-, M+] (bounds included) will round to w when input,
+
17382 // regardless of how the input rounding algorithm breaks ties.
+
17383 //
+
17384 // And digit_gen generates the shortest possible such number in [M-, M+].
+
17385 // Note that this does not mean that Grisu2 always generates the shortest
+
17386 // possible number in the interval (m-, m+).
+
17387 const diyfp M_minus(w_minus.f + 1, w_minus.e);
+
17388 const diyfp M_plus(w_plus.f - 1, w_plus.e);
+
17389
+
17390 decimal_exponent = -cached.k; // = -(-k) = k
+
17391
+
17392 grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus);
+
17393 }
+
+
17394
+
17400 template<typename FloatType>
+
17401 JSON_HEDLEY_NON_NULL(1)
+
+
17402 void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) {
+
17403 static_assert(diyfp::kPrecision >= std::numeric_limits<FloatType>::digits + 3,
+
17404 "internal error: not enough precision");
+
17405
+
17406 JSON_ASSERT(std::isfinite(value));
+
17407 JSON_ASSERT(value > 0);
+
17408
+
17409 // If the neighbors (and boundaries) of 'value' are always computed for double-precision
+
17410 // numbers, all float's can be recovered using strtod (and strtof). However, the resulting
+
17411 // decimal representations are not exactly "short".
+
17412 //
+
17413 // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars)
+
17414 // says "value is converted to a string as if by std::sprintf in the default ("C") locale"
+
17415 // and since sprintf promotes floats to doubles, I think this is exactly what 'std::to_chars'
+
17416 // does.
+
17417 // On the other hand, the documentation for 'std::to_chars' requires that "parsing the
+
17418 // representation using the corresponding std::from_chars function recovers value exactly". That
+
17419 // indicates that single precision floating-point numbers should be recovered using
+
17420 // 'std::strtof'.
+
17421 //
+
17422 // NB: If the neighbors are computed for single-precision numbers, there is a single float
+
17423 // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision
+
17424 // value is off by 1 ulp.
+
17425#if 0 // NOLINT(readability-avoid-unconditional-preprocessor-if)
+
17426 const boundaries w = compute_boundaries(static_cast<double>(value));
+
17427#else
+
17428 const boundaries w = compute_boundaries(value);
+
17429#endif
+
17430
+
17431 grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus);
+
17432 }
+
+
17433
+
17439 JSON_HEDLEY_NON_NULL(1)
+
17440 JSON_HEDLEY_RETURNS_NON_NULL
+
+
17441 inline char* append_exponent(char* buf, int e) {
+
17442 JSON_ASSERT(e > -1000);
+
17443 JSON_ASSERT(e < 1000);
+
17444
+
17445 if (e < 0) {
+
17446 e = -e;
+
17447 *buf++ = '-';
+
17448 }
+
17449 else {
+
17450 *buf++ = '+';
+
17451 }
+
17452
+
17453 auto k = static_cast<std::uint32_t>(e);
+
17454 if (k < 10) {
+
17455 // Always print at least two digits in the exponent.
+
17456 // This is for compatibility with printf("%g").
+
17457 *buf++ = '0';
+
17458 *buf++ = static_cast<char>('0' + k);
+
17459 }
+
17460 else if (k < 100) {
+
17461 *buf++ = static_cast<char>('0' + (k / 10));
+
17462 k %= 10;
+
17463 *buf++ = static_cast<char>('0' + k);
+
17464 }
+
17465 else {
+
17466 *buf++ = static_cast<char>('0' + (k / 100));
+
17467 k %= 100;
+
17468 *buf++ = static_cast<char>('0' + (k / 10));
+
17469 k %= 10;
+
17470 *buf++ = static_cast<char>('0' + k);
+
17471 }
+
17472
+
17473 return buf;
+
17474 }
+
+
17475
+
17485 JSON_HEDLEY_NON_NULL(1)
+
17486 JSON_HEDLEY_RETURNS_NON_NULL
+
+
17487 inline char* format_buffer(char* buf, int len, int decimal_exponent,
+
17488 int min_exp, int max_exp) {
+
17489 JSON_ASSERT(min_exp < 0);
+
17490 JSON_ASSERT(max_exp > 0);
+
17491
+
17492 const int k = len;
+
17493 const int n = len + decimal_exponent;
+
17494
+
17495 // v = buf * 10^(n-k)
+
17496 // k is the length of the buffer (number of decimal digits)
+
17497 // n is the position of the decimal point relative to the start of the buffer.
+
17498
+
17499 if (k <= n && n <= max_exp) {
+
17500 // digits[000]
+
17501 // len <= max_exp + 2
+
17502
+
17503 std::memset(buf + k, '0', static_cast<size_t>(n) - static_cast<size_t>(k));
+
17504 // Make it look like a floating-point number (#362, #378)
+
17505 buf[n + 0] = '.';
+
17506 buf[n + 1] = '0';
+
17507 return buf + (static_cast<size_t>(n) + 2);
+
17508 }
+
17509
+
17510 if (0 < n && n <= max_exp) {
+
17511 // dig.its
+
17512 // len <= max_digits10 + 1
+
17513
+
17514 JSON_ASSERT(k > n);
+
17515
+
17516 std::memmove(buf + (static_cast<size_t>(n) + 1), buf + n, static_cast<size_t>(k) - static_cast<size_t>(n));
+
17517 buf[n] = '.';
+
17518 return buf + (static_cast<size_t>(k) + 1U);
+
17519 }
+
17520
+
17521 if (min_exp < n && n <= 0) {
+
17522 // 0.[000]digits
+
17523 // len <= 2 + (-min_exp - 1) + max_digits10
+
17524
+
17525 std::memmove(buf + (2 + static_cast<size_t>(-n)), buf, static_cast<size_t>(k));
+
17526 buf[0] = '0';
+
17527 buf[1] = '.';
+
17528 std::memset(buf + 2, '0', static_cast<size_t>(-n));
+
17529 return buf + (2U + static_cast<size_t>(-n) + static_cast<size_t>(k));
+
17530 }
+
17531
+
17532 if (k == 1) {
+
17533 // dE+123
+
17534 // len <= 1 + 5
+
17535
+
17536 buf += 1;
+
17537 }
+
17538 else {
+
17539 // d.igitsE+123
+
17540 // len <= max_digits10 + 1 + 5
+
17541
+
17542 std::memmove(buf + 2, buf + 1, static_cast<size_t>(k) - 1);
+
17543 buf[1] = '.';
+
17544 buf += 1 + static_cast<size_t>(k);
+
17545 }
+
17546
+
17547 *buf++ = 'e';
+
17548 return append_exponent(buf, n - 1);
+
17549 }
+
+
17550
+
17551 } // namespace dtoa_impl
+
+
17552
+
17563 template<typename FloatType>
+
17564 JSON_HEDLEY_NON_NULL(1, 2)
+
17565 JSON_HEDLEY_RETURNS_NON_NULL
+
+
17566 char* to_chars(char* first, const char* last, FloatType value) {
+
17567 static_cast<void>(last); // maybe unused - fix warning
+
17568 JSON_ASSERT(std::isfinite(value));
+
17569
+
17570 // Use signbit(value) instead of (value < 0) since signbit works for -0.
+
17571 if (std::signbit(value)) {
+
17572 value = -value;
+
17573 *first++ = '-';
+
17574 }
+
17575
+
17576#ifdef __GNUC__
+
17577#pragma GCC diagnostic push
+
17578#pragma GCC diagnostic ignored "-Wfloat-equal"
+
17579#endif
+
17580 if (value == 0) // +-0
+
17581 {
+
17582 *first++ = '0';
+
17583 // Make it look like a floating-point number (#362, #378)
+
17584 *first++ = '.';
+
17585 *first++ = '0';
+
17586 return first;
+
17587 }
+
17588#ifdef __GNUC__
+
17589#pragma GCC diagnostic pop
+
17590#endif
+
17591
+
17592 JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10);
+
17593
+
17594 // Compute v = buffer * 10^decimal_exponent.
+
17595 // The decimal digits are stored in the buffer, which needs to be interpreted
+
17596 // as an unsigned decimal integer.
+
17597 // len is the length of the buffer, i.e., the number of decimal digits.
+
17598 int len = 0;
+
17599 int decimal_exponent = 0;
+
17600 dtoa_impl::grisu2(first, len, decimal_exponent, value);
+
17601
+
17602 JSON_ASSERT(len <= std::numeric_limits<FloatType>::max_digits10);
+
17603
+
17604 // Format the buffer like printf("%.*g", prec, value)
+
17605 constexpr int kMinExp = -4;
+
17606 // Use digits10 here to increase compatibility with version 2.
+
17607 constexpr int kMaxExp = std::numeric_limits<FloatType>::digits10;
+
17608
+
17609 JSON_ASSERT(last - first >= kMaxExp + 2);
+
17610 JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits<FloatType>::max_digits10);
+
17611 JSON_ASSERT(last - first >= std::numeric_limits<FloatType>::max_digits10 + 6);
+
17612
+
17613 return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp);
+
17614 }
+
+
17615
+
17616} // namespace detail
+
17617NLOHMANN_JSON_NAMESPACE_END
+
17618
+
17619// #include <nlohmann/detail/exceptions.hpp>
+
17620
+
17621// #include <nlohmann/detail/macro_scope.hpp>
+
17622
+
17623// #include <nlohmann/detail/meta/cpp_future.hpp>
+
17624
+
17625// #include <nlohmann/detail/output/binary_writer.hpp>
+
17626
+
17627// #include <nlohmann/detail/output/output_adapters.hpp>
+
17628
+
17629// #include <nlohmann/detail/string_concat.hpp>
+
17630
+
17631// #include <nlohmann/detail/value_t.hpp>
+
17632
+
17633
+
17634NLOHMANN_JSON_NAMESPACE_BEGIN
+
17635namespace detail {
+
17636
+
17638 // serialization //
+
17640
+
+
17642 enum class error_handler_t {
+ + + +
17646 };
+
+
17647
+
17648 template<typename BasicJsonType>
+
+ +
17650 using string_t = typename BasicJsonType::string_t;
+
17651 using number_float_t = typename BasicJsonType::number_float_t;
+
17652 using number_integer_t = typename BasicJsonType::number_integer_t;
+
17653 using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
17654 using binary_char_t = typename BasicJsonType::binary_t::value_type;
+
17655 static constexpr std::uint8_t UTF8_ACCEPT = 0;
+
17656 static constexpr std::uint8_t UTF8_REJECT = 1;
+
17657
+
17658 public:
+
+
17664 serializer(output_adapter_t<char> s, const char ichar,
+ +
17666 : o(std::move(s))
+
17667 , loc(std::localeconv())
+
17668 , thousands_sep(loc->thousands_sep == nullptr ? '\0' : std::char_traits<char>::to_char_type(*(loc->thousands_sep)))
+
17669 , decimal_point(loc->decimal_point == nullptr ? '\0' : std::char_traits<char>::to_char_type(*(loc->decimal_point)))
+
17670 , indent_char(ichar)
+
17671 , indent_string(512, indent_char)
+
17672 , error_handler(error_handler_) {}
+
+
17673
+
17674 // deleted because of pointer members
+
17675 serializer(const serializer&) = delete;
+
17676 serializer& operator=(const serializer&) = delete;
+
17677 serializer(serializer&&) = delete;
+
17678 serializer& operator=(serializer&&) = delete;
+
17679 ~serializer() = default;
+
17680
+
+
17703 void dump(const BasicJsonType& val,
+
17704 const bool pretty_print,
+
17705 const bool ensure_ascii,
+
17706 const unsigned int indent_step,
+
17707 const unsigned int current_indent = 0) {
+
17708 switch (val.m_data.m_type) {
+
17709 case value_t::object:
+
17710 {
+
17711 if (val.m_data.m_value.object->empty()) {
+
17712 o->write_characters("{}", 2);
+
17713 return;
+
17714 }
+
17715
+
17716 if (pretty_print) {
+
17717 o->write_characters("{\n", 2);
+
17718
+
17719 // variable to hold indentation for recursive calls
+
17720 const auto new_indent = current_indent + indent_step;
+
17721 if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) {
+
17722 indent_string.resize(indent_string.size() * 2, ' ');
+
17723 }
+
17724
+
17725 // first n-1 elements
+
17726 auto i = val.m_data.m_value.object->cbegin();
+
17727 for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i) {
+
17728 o->write_characters(indent_string.c_str(), new_indent);
+
17729 o->write_character('\"');
+
17730 dump_escaped(i->first, ensure_ascii);
+
17731 o->write_characters("\": ", 3);
+
17732 dump(i->second, true, ensure_ascii, indent_step, new_indent);
+
17733 o->write_characters(",\n", 2);
+
17734 }
+
17735
+
17736 // last element
+
17737 JSON_ASSERT(i != val.m_data.m_value.object->cend());
+
17738 JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());
+
17739 o->write_characters(indent_string.c_str(), new_indent);
+
17740 o->write_character('\"');
+
17741 dump_escaped(i->first, ensure_ascii);
+
17742 o->write_characters("\": ", 3);
+
17743 dump(i->second, true, ensure_ascii, indent_step, new_indent);
+
17744
+
17745 o->write_character('\n');
+
17746 o->write_characters(indent_string.c_str(), current_indent);
+
17747 o->write_character('}');
+
17748 }
+
17749 else {
+
17750 o->write_character('{');
+
17751
+
17752 // first n-1 elements
+
17753 auto i = val.m_data.m_value.object->cbegin();
+
17754 for (std::size_t cnt = 0; cnt < val.m_data.m_value.object->size() - 1; ++cnt, ++i) {
+
17755 o->write_character('\"');
+
17756 dump_escaped(i->first, ensure_ascii);
+
17757 o->write_characters("\":", 2);
+
17758 dump(i->second, false, ensure_ascii, indent_step, current_indent);
+
17759 o->write_character(',');
+
17760 }
+
17761
+
17762 // last element
+
17763 JSON_ASSERT(i != val.m_data.m_value.object->cend());
+
17764 JSON_ASSERT(std::next(i) == val.m_data.m_value.object->cend());
+
17765 o->write_character('\"');
+
17766 dump_escaped(i->first, ensure_ascii);
+
17767 o->write_characters("\":", 2);
+
17768 dump(i->second, false, ensure_ascii, indent_step, current_indent);
+
17769
+
17770 o->write_character('}');
+
17771 }
+
17772
+
17773 return;
+
17774 }
+
17775
+
17776 case value_t::array:
+
17777 {
+
17778 if (val.m_data.m_value.array->empty()) {
+
17779 o->write_characters("[]", 2);
+
17780 return;
+
17781 }
+
17782
+
17783 if (pretty_print) {
+
17784 o->write_characters("[\n", 2);
+
17785
+
17786 // variable to hold indentation for recursive calls
+
17787 const auto new_indent = current_indent + indent_step;
+
17788 if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) {
+
17789 indent_string.resize(indent_string.size() * 2, ' ');
+
17790 }
+
17791
+
17792 // first n-1 elements
+
17793 for (auto i = val.m_data.m_value.array->cbegin();
+
17794 i != val.m_data.m_value.array->cend() - 1; ++i) {
+
17795 o->write_characters(indent_string.c_str(), new_indent);
+
17796 dump(*i, true, ensure_ascii, indent_step, new_indent);
+
17797 o->write_characters(",\n", 2);
+
17798 }
+
17799
+
17800 // last element
+
17801 JSON_ASSERT(!val.m_data.m_value.array->empty());
+
17802 o->write_characters(indent_string.c_str(), new_indent);
+
17803 dump(val.m_data.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);
+
17804
+
17805 o->write_character('\n');
+
17806 o->write_characters(indent_string.c_str(), current_indent);
+
17807 o->write_character(']');
+
17808 }
+
17809 else {
+
17810 o->write_character('[');
+
17811
+
17812 // first n-1 elements
+
17813 for (auto i = val.m_data.m_value.array->cbegin();
+
17814 i != val.m_data.m_value.array->cend() - 1; ++i) {
+
17815 dump(*i, false, ensure_ascii, indent_step, current_indent);
+
17816 o->write_character(',');
+
17817 }
+
17818
+
17819 // last element
+
17820 JSON_ASSERT(!val.m_data.m_value.array->empty());
+
17821 dump(val.m_data.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);
+
17822
+
17823 o->write_character(']');
+
17824 }
+
17825
+
17826 return;
+
17827 }
+
17828
+
17829 case value_t::string:
+
17830 {
+
17831 o->write_character('\"');
+
17832 dump_escaped(*val.m_data.m_value.string, ensure_ascii);
+
17833 o->write_character('\"');
+
17834 return;
+
17835 }
+
17836
+
17837 case value_t::binary:
+
17838 {
+
17839 if (pretty_print) {
+
17840 o->write_characters("{\n", 2);
+
17841
+
17842 // variable to hold indentation for recursive calls
+
17843 const auto new_indent = current_indent + indent_step;
+
17844 if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) {
+
17845 indent_string.resize(indent_string.size() * 2, ' ');
+
17846 }
+
17847
+
17848 o->write_characters(indent_string.c_str(), new_indent);
+
17849
+
17850 o->write_characters("\"bytes\": [", 10);
+
17851
+
17852 if (!val.m_data.m_value.binary->empty()) {
+
17853 for (auto i = val.m_data.m_value.binary->cbegin();
+
17854 i != val.m_data.m_value.binary->cend() - 1; ++i) {
+
17855 dump_integer(*i);
+
17856 o->write_characters(", ", 2);
+
17857 }
+
17858 dump_integer(val.m_data.m_value.binary->back());
+
17859 }
+
17860
+
17861 o->write_characters("],\n", 3);
+
17862 o->write_characters(indent_string.c_str(), new_indent);
+
17863
+
17864 o->write_characters("\"subtype\": ", 11);
+
17865 if (val.m_data.m_value.binary->has_subtype()) {
+
17866 dump_integer(val.m_data.m_value.binary->subtype());
+
17867 }
+
17868 else {
+
17869 o->write_characters("null", 4);
+
17870 }
+
17871 o->write_character('\n');
+
17872 o->write_characters(indent_string.c_str(), current_indent);
+
17873 o->write_character('}');
+
17874 }
+
17875 else {
+
17876 o->write_characters("{\"bytes\":[", 10);
+
17877
+
17878 if (!val.m_data.m_value.binary->empty()) {
+
17879 for (auto i = val.m_data.m_value.binary->cbegin();
+
17880 i != val.m_data.m_value.binary->cend() - 1; ++i) {
+
17881 dump_integer(*i);
+
17882 o->write_character(',');
+
17883 }
+
17884 dump_integer(val.m_data.m_value.binary->back());
+
17885 }
+
17886
+
17887 o->write_characters("],\"subtype\":", 12);
+
17888 if (val.m_data.m_value.binary->has_subtype()) {
+
17889 dump_integer(val.m_data.m_value.binary->subtype());
+
17890 o->write_character('}');
+
17891 }
+
17892 else {
+
17893 o->write_characters("null}", 5);
+
17894 }
+
17895 }
+
17896 return;
+
17897 }
+
17898
+
17899 case value_t::boolean:
+
17900 {
+
17901 if (val.m_data.m_value.boolean) {
+
17902 o->write_characters("true", 4);
+
17903 }
+
17904 else {
+
17905 o->write_characters("false", 5);
+
17906 }
+
17907 return;
+
17908 }
+
17909
+ +
17911 {
+
17912 dump_integer(val.m_data.m_value.number_integer);
+
17913 return;
+
17914 }
+
17915
+ +
17917 {
+
17918 dump_integer(val.m_data.m_value.number_unsigned);
+
17919 return;
+
17920 }
+
17921
+ +
17923 {
+
17924 dump_float(val.m_data.m_value.number_float);
+
17925 return;
+
17926 }
+
17927
+
17928 case value_t::discarded:
+
17929 {
+
17930 o->write_characters("<discarded>", 11);
+
17931 return;
+
17932 }
+
17933
+
17934 case value_t::null:
+
17935 {
+
17936 o->write_characters("null", 4);
+
17937 return;
+
17938 }
+
17939
+
17940 default: // LCOV_EXCL_LINE
+
17941 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
17942 }
+
17943 }
+
+
17944
+
17945 JSON_PRIVATE_UNLESS_TESTED:
+
17960 void dump_escaped(const string_t& s, const bool ensure_ascii) {
+
17961 std::uint32_t codepoint{};
+
17962 std::uint8_t state = UTF8_ACCEPT;
+
17963 std::size_t bytes = 0; // number of bytes written to string_buffer
+
17964
+
17965 // number of bytes written at the point of the last valid byte
+
17966 std::size_t bytes_after_last_accept = 0;
+
17967 std::size_t undumped_chars = 0;
+
17968
+
17969 for (std::size_t i = 0; i < s.size(); ++i) {
+
17970 const auto byte = static_cast<std::uint8_t>(s[i]);
+
17971
+
17972 switch (decode(state, codepoint, byte)) {
+
17973 case UTF8_ACCEPT: // decode found a new code point
+
17974 {
+
17975 switch (codepoint) {
+
17976 case 0x08: // backspace
+
17977 {
+
17978 string_buffer[bytes++] = '\\';
+
17979 string_buffer[bytes++] = 'b';
+
17980 break;
+
17981 }
+
17982
+
17983 case 0x09: // horizontal tab
+
17984 {
+
17985 string_buffer[bytes++] = '\\';
+
17986 string_buffer[bytes++] = 't';
+
17987 break;
+
17988 }
+
17989
+
17990 case 0x0A: // newline
+
17991 {
+
17992 string_buffer[bytes++] = '\\';
+
17993 string_buffer[bytes++] = 'n';
+
17994 break;
+
17995 }
+
17996
+
17997 case 0x0C: // formfeed
+
17998 {
+
17999 string_buffer[bytes++] = '\\';
+
18000 string_buffer[bytes++] = 'f';
+
18001 break;
+
18002 }
+
18003
+
18004 case 0x0D: // carriage return
+
18005 {
+
18006 string_buffer[bytes++] = '\\';
+
18007 string_buffer[bytes++] = 'r';
+
18008 break;
+
18009 }
+
18010
+
18011 case 0x22: // quotation mark
+
18012 {
+
18013 string_buffer[bytes++] = '\\';
+
18014 string_buffer[bytes++] = '\"';
+
18015 break;
+
18016 }
+
18017
+
18018 case 0x5C: // reverse solidus
+
18019 {
+
18020 string_buffer[bytes++] = '\\';
+
18021 string_buffer[bytes++] = '\\';
+
18022 break;
+
18023 }
+
18024
+
18025 default:
+
18026 {
+
18027 // escape control characters (0x00..0x1F) or, if
+
18028 // ensure_ascii parameter is used, non-ASCII characters
+
18029 if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F))) {
+
18030 if (codepoint <= 0xFFFF) {
+
18031 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
+
18032 static_cast<void>((std::snprintf)(string_buffer.data() + bytes, 7, "\\u%04x",
+
18033 static_cast<std::uint16_t>(codepoint)));
+
18034 bytes += 6;
+
18035 }
+
18036 else {
+
18037 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
+
18038 static_cast<void>((std::snprintf)(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x",
+
18039 static_cast<std::uint16_t>(0xD7C0u + (codepoint >> 10u)),
+
18040 static_cast<std::uint16_t>(0xDC00u + (codepoint & 0x3FFu))));
+
18041 bytes += 12;
+
18042 }
+
18043 }
+
18044 else {
+
18045 // copy byte to buffer (all previous bytes
+
18046 // been copied have in default case above)
+
18047 string_buffer[bytes++] = s[i];
+
18048 }
+
18049 break;
+
18050 }
+
18051 }
+
18052
+
18053 // write buffer and reset index; there must be 13 bytes
+
18054 // left, as this is the maximal number of bytes to be
+
18055 // written ("\uxxxx\uxxxx\0") for one code point
+
18056 if (string_buffer.size() - bytes < 13) {
+
18057 o->write_characters(string_buffer.data(), bytes);
+
18058 bytes = 0;
+
18059 }
+
18060
+
18061 // remember the byte position of this accept
+
18062 bytes_after_last_accept = bytes;
+
18063 undumped_chars = 0;
+
18064 break;
+
18065 }
+
18066
+
18067 case UTF8_REJECT: // decode found invalid UTF-8 byte
+
18068 {
+
18069 switch (error_handler) {
+
18070 case error_handler_t::strict:
+
18071 {
+
18072 JSON_THROW(type_error::create(316, concat("invalid UTF-8 byte at index ", std::to_string(i), ": 0x", hex_bytes(byte | 0)), nullptr));
+
18073 }
+
18074
+
18075 case error_handler_t::ignore:
+
18076 case error_handler_t::replace:
+
18077 {
+
18078 // in case we saw this character the first time, we
+
18079 // would like to read it again, because the byte
+
18080 // may be OK for itself, but just not OK for the
+
18081 // previous sequence
+
18082 if (undumped_chars > 0) {
+
18083 --i;
+
18084 }
+
18085
+
18086 // reset length buffer to the last accepted index;
+
18087 // thus removing/ignoring the invalid characters
+
18088 bytes = bytes_after_last_accept;
+
18089
+
18090 if (error_handler == error_handler_t::replace) {
+
18091 // add a replacement character
+
18092 if (ensure_ascii) {
+
18093 string_buffer[bytes++] = '\\';
+
18094 string_buffer[bytes++] = 'u';
+
18095 string_buffer[bytes++] = 'f';
+
18096 string_buffer[bytes++] = 'f';
+
18097 string_buffer[bytes++] = 'f';
+
18098 string_buffer[bytes++] = 'd';
+
18099 }
+
18100 else {
+
18101 string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xEF');
+
18102 string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xBF');
+
18103 string_buffer[bytes++] = detail::binary_writer<BasicJsonType, char>::to_char_type('\xBD');
+
18104 }
+
18105
+
18106 // write buffer and reset index; there must be 13 bytes
+
18107 // left, as this is the maximal number of bytes to be
+
18108 // written ("\uxxxx\uxxxx\0") for one code point
+
18109 if (string_buffer.size() - bytes < 13) {
+
18110 o->write_characters(string_buffer.data(), bytes);
+
18111 bytes = 0;
+
18112 }
+
18113
+
18114 bytes_after_last_accept = bytes;
+
18115 }
+
18116
+
18117 undumped_chars = 0;
+
18118
+
18119 // continue processing the string
+
18120 state = UTF8_ACCEPT;
+
18121 break;
+
18122 }
+
18123
+
18124 default: // LCOV_EXCL_LINE
+
18125 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
18126 }
+
18127 break;
+
18128 }
+
18129
+
18130 default: // decode found yet incomplete multibyte code point
+
18131 {
+
18132 if (!ensure_ascii) {
+
18133 // code point will not be escaped - copy byte to buffer
+
18134 string_buffer[bytes++] = s[i];
+
18135 }
+
18136 ++undumped_chars;
+
18137 break;
+
18138 }
+
18139 }
+
18140 }
+
18141
+
18142 // we finished processing the string
+
18143 if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT)) {
+
18144 // write buffer
+
18145 if (bytes > 0) {
+
18146 o->write_characters(string_buffer.data(), bytes);
+
18147 }
+
18148 }
+
18149 else {
+
18150 // we finish reading, but do not accept: string was incomplete
+
18151 switch (error_handler) {
+
18152 case error_handler_t::strict:
+
18153 {
+
18154 JSON_THROW(type_error::create(316, concat("incomplete UTF-8 string; last byte: 0x", hex_bytes(static_cast<std::uint8_t>(s.back() | 0))), nullptr));
+
18155 }
+
18156
+
18157 case error_handler_t::ignore:
+
18158 {
+
18159 // write all accepted bytes
+
18160 o->write_characters(string_buffer.data(), bytes_after_last_accept);
+
18161 break;
+
18162 }
+
18163
+
18164 case error_handler_t::replace:
+
18165 {
+
18166 // write all accepted bytes
+
18167 o->write_characters(string_buffer.data(), bytes_after_last_accept);
+
18168 // add a replacement character
+
18169 if (ensure_ascii) {
+
18170 o->write_characters("\\ufffd", 6);
+
18171 }
+
18172 else {
+
18173 o->write_characters("\xEF\xBF\xBD", 3);
+
18174 }
+
18175 break;
+
18176 }
+
18177
+
18178 default: // LCOV_EXCL_LINE
+
18179 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
18180 }
+
18181 }
+
18182 }
+
18183
+
18184 private:
+
18193 unsigned int count_digits(number_unsigned_t x) noexcept {
+
18194 unsigned int n_digits = 1;
+
18195 for (;;) {
+
18196 if (x < 10) {
+
18197 return n_digits;
+
18198 }
+
18199 if (x < 100) {
+
18200 return n_digits + 1;
+
18201 }
+
18202 if (x < 1000) {
+
18203 return n_digits + 2;
+
18204 }
+
18205 if (x < 10000) {
+
18206 return n_digits + 3;
+
18207 }
+
18208 x = x / 10000u;
+
18209 n_digits += 4;
+
18210 }
+
18211 }
+
18212
+
18218 static std::string hex_bytes(std::uint8_t byte) {
+
18219 std::string result = "FF";
+
18220 constexpr const char* nibble_to_hex = "0123456789ABCDEF";
+
18221 result[0] = nibble_to_hex[byte / 16];
+
18222 result[1] = nibble_to_hex[byte % 16];
+
18223 return result;
+
18224 }
+
18225
+
18226 // templates to avoid warnings about useless casts
+
18227 template <typename NumberType, enable_if_t<std::is_signed<NumberType>::value, int> = 0>
+
18228 bool is_negative_number(NumberType x) {
+
18229 return x < 0;
+
18230 }
+
18231
+
18232 template < typename NumberType, enable_if_t <std::is_unsigned<NumberType>::value, int > = 0 >
+
18233 bool is_negative_number(NumberType /*unused*/) {
+
18234 return false;
+
18235 }
+
18236
+
18246 template < typename NumberType, detail::enable_if_t <
+
18247 std::is_integral<NumberType>::value ||
+
18248 std::is_same<NumberType, number_unsigned_t>::value ||
+
18249 std::is_same<NumberType, number_integer_t>::value ||
+
18250 std::is_same<NumberType, binary_char_t>::value,
+
18251 int > = 0 >
+
18252 void dump_integer(NumberType x) {
+
18253 static constexpr std::array<std::array<char, 2>, 100> digits_to_99
+
18254 {
+
18255 {
+
18256 {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}},
+
18257 {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}},
+
18258 {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}},
+
18259 {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}},
+
18260 {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}},
+
18261 {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}},
+
18262 {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}},
+
18263 {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}},
+
18264 {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}},
+
18265 {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}},
+
18266 }
+
18267 };
+
18268
+
18269 // special case for "0"
+
18270 if (x == 0) {
+
18271 o->write_character('0');
+
18272 return;
+
18273 }
+
18274
+
18275 // use a pointer to fill the buffer
+
18276 auto buffer_ptr = number_buffer.begin(); // NOLINT(llvm-qualified-auto,readability-qualified-auto,cppcoreguidelines-pro-type-vararg,hicpp-vararg)
+
18277
+
18278 number_unsigned_t abs_value;
+
18279
+
18280 unsigned int n_chars{};
+
18281
+
18282 if (is_negative_number(x)) {
+
18283 *buffer_ptr = '-';
+
18284 abs_value = remove_sign(static_cast<number_integer_t>(x));
+
18285
+
18286 // account one more byte for the minus sign
+
18287 n_chars = 1 + count_digits(abs_value);
+
18288 }
+
18289 else {
+
18290 abs_value = static_cast<number_unsigned_t>(x);
+
18291 n_chars = count_digits(abs_value);
+
18292 }
+
18293
+
18294 // spare 1 byte for '\0'
+
18295 JSON_ASSERT(n_chars < number_buffer.size() - 1);
+
18296
+
18297 // jump to the end to generate the string from backward,
+
18298 // so we later avoid reversing the result
+
18299 buffer_ptr += static_cast<typename decltype(number_buffer)::difference_type>(n_chars);
+
18300
+
18301 // Fast int2ascii implementation inspired by "Fastware" talk by Andrei Alexandrescu
+
18302 // See: https://www.youtube.com/watch?v=o4-CwDo2zpg
+
18303 while (abs_value >= 100) {
+
18304 const auto digits_index = static_cast<unsigned>((abs_value % 100));
+
18305 abs_value /= 100;
+
18306 *(--buffer_ptr) = digits_to_99[digits_index][1];
+
18307 *(--buffer_ptr) = digits_to_99[digits_index][0];
+
18308 }
+
18309
+
18310 if (abs_value >= 10) {
+
18311 const auto digits_index = static_cast<unsigned>(abs_value);
+
18312 *(--buffer_ptr) = digits_to_99[digits_index][1];
+
18313 *(--buffer_ptr) = digits_to_99[digits_index][0];
+
18314 }
+
18315 else {
+
18316 *(--buffer_ptr) = static_cast<char>('0' + abs_value);
+
18317 }
+
18318
+
18319 o->write_characters(number_buffer.data(), n_chars);
+
18320 }
+
18321
+
18330 void dump_float(number_float_t x) {
+
18331 // NaN / inf
+
18332 if (!std::isfinite(x)) {
+
18333 o->write_characters("null", 4);
+
18334 return;
+
18335 }
+
18336
+
18337 // If number_float_t is an IEEE-754 single or double precision number,
+
18338 // use the Grisu2 algorithm to produce short numbers which are
+
18339 // guaranteed to round-trip, using strtof and strtod, resp.
+
18340 //
+
18341 // NB: The test below works if <long double> == <double>.
+
18342 static constexpr bool is_ieee_single_or_double
+
18343 = (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 24 && std::numeric_limits<number_float_t>::max_exponent == 128) ||
+
18344 (std::numeric_limits<number_float_t>::is_iec559 && std::numeric_limits<number_float_t>::digits == 53 && std::numeric_limits<number_float_t>::max_exponent == 1024);
+
18345
+
18346 dump_float(x, std::integral_constant<bool, is_ieee_single_or_double>());
+
18347 }
+
18348
+
18349 void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/) {
+
18350 auto* begin = number_buffer.data();
+
18351 auto* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x);
+
18352
+
18353 o->write_characters(begin, static_cast<size_t>(end - begin));
+
18354 }
+
18355
+
18356 void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/) {
+
18357 // get the number of digits for a float -> text -> float round-trip
+
18358 static constexpr auto d = std::numeric_limits<number_float_t>::max_digits10;
+
18359
+
18360 // the actual conversion
+
18361 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg,hicpp-vararg)
+
18362 std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), "%.*g", d, x);
+
18363
+
18364 // negative value indicates an error
+
18365 JSON_ASSERT(len > 0);
+
18366 // check if the buffer was large enough
+
18367 JSON_ASSERT(static_cast<std::size_t>(len) < number_buffer.size());
+
18368
+
18369 // erase thousands separators
+
18370 if (thousands_sep != '\0') {
+
18371 // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::remove returns an iterator, see https://github.com/nlohmann/json/issues/3081
+
18372 const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep);
+
18373 std::fill(end, number_buffer.end(), '\0');
+
18374 JSON_ASSERT((end - number_buffer.begin()) <= len);
+
18375 len = (end - number_buffer.begin());
+
18376 }
+
18377
+
18378 // convert decimal point to '.'
+
18379 if (decimal_point != '\0' && decimal_point != '.') {
+
18380 // NOLINTNEXTLINE(readability-qualified-auto,llvm-qualified-auto): std::find returns an iterator, see https://github.com/nlohmann/json/issues/3081
+
18381 const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point);
+
18382 if (dec_pos != number_buffer.end()) {
+
18383 *dec_pos = '.';
+
18384 }
+
18385 }
+
18386
+
18387 o->write_characters(number_buffer.data(), static_cast<std::size_t>(len));
+
18388
+
18389 // determine if we need to append ".0"
+
18390 const bool value_is_int_like =
+
18391 std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1,
+
18392 [](char c) {
+
18393 return c == '.' || c == 'e';
+
18394 });
+
18395
+
18396 if (value_is_int_like) {
+
18397 o->write_characters(".0", 2);
+
18398 }
+
18399 }
+
18400
+
18422 static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept {
+
18423 static const std::array<std::uint8_t, 400> utf8d =
+
18424 {
+
18425 {
+
18426 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F
+
18427 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F
+
18428 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F
+
18429 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F
+
18430 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F
+
18431 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF
+
18432 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF
+
18433 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF
+
18434 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF
+
18435 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0
+
18436 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2
+
18437 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4
+
18438 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6
+
18439 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8
+
18440 }
+
18441 };
+
18442
+
18443 JSON_ASSERT(static_cast<std::size_t>(byte) < utf8d.size());
+
18444 const std::uint8_t type = utf8d[byte];
+
18445
+
18446 codep = (state != UTF8_ACCEPT)
+
18447 ? (byte & 0x3fu) | (codep << 6u)
+
18448 : (0xFFu >> type) & (byte);
+
18449
+
18450 const std::size_t index = 256u + (static_cast<size_t>(state) * 16u) + static_cast<size_t>(type);
+
18451 JSON_ASSERT(index < utf8d.size());
+
18452 state = utf8d[index];
+
18453 return state;
+
18454 }
+
18455
+
18456 /*
+
18457 * Overload to make the compiler happy while it is instantiating
+
18458 * dump_integer for number_unsigned_t.
+
18459 * Must never be called.
+
18460 */
+
18461 number_unsigned_t remove_sign(number_unsigned_t x) {
+
18462 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
18463 return x; // LCOV_EXCL_LINE
+
18464 }
+
18465
+
18466 /*
+
18467 * Helper function for dump_integer
+
18468 *
+
18469 * This function takes a negative signed integer and returns its absolute
+
18470 * value as an unsigned integer. The plus/minus shuffling is necessary as we
+
18471 * cannot directly remove the sign of an arbitrary signed integer as the
+
18472 * absolute values of INT_MIN and INT_MAX are usually not the same. See
+
18473 * #1708 for details.
+
18474 */
+
18475 number_unsigned_t remove_sign(number_integer_t x) noexcept {
+
18476 JSON_ASSERT(x < 0 && x < (std::numeric_limits<number_integer_t>::max)()); // NOLINT(misc-redundant-expression)
+
18477 return static_cast<number_unsigned_t>(-(x + 1)) + 1;
+
18478 }
+
18479
+
18480 private:
+
18482 output_adapter_t<char> o = nullptr;
+
18483
+
18485 std::array<char, 64> number_buffer{ {} };
+
18486
+
18488 const std::lconv* loc = nullptr;
+
18490 const char thousands_sep = '\0';
+
18492 const char decimal_point = '\0';
+
18493
+
18495 std::array<char, 512> string_buffer{ {} };
+
18496
+
18498 const char indent_char;
+
18500 string_t indent_string;
+
18501
+
18503 const error_handler_t error_handler;
+
18504 };
+
+
18505
+
18506} // namespace detail
+
18507NLOHMANN_JSON_NAMESPACE_END
+
18508
+
18509// #include <nlohmann/detail/value_t.hpp>
+
18510
+
18511// #include <nlohmann/json_fwd.hpp>
+
18512
+
18513// #include <nlohmann/ordered_map.hpp>
+
18514// __ _____ _____ _____
+
18515// __| | __| | | | JSON for Modern C++
+
18516// | | |__ | | | | | | version 3.12.0
+
18517// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
18518//
+
18519// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
18520// SPDX-License-Identifier: MIT
+
18521
+
18522
+
18523
+
18524#include <functional> // equal_to, less
+
18525#include <initializer_list> // initializer_list
+
18526#include <iterator> // input_iterator_tag, iterator_traits
+
18527#include <memory> // allocator
+
18528#include <stdexcept> // for out_of_range
+
18529#include <type_traits> // enable_if, is_convertible
+
18530#include <utility> // pair
+
18531#include <vector> // vector
+
18532
+
18533// #include <nlohmann/detail/macro_scope.hpp>
+
18534
+
18535// #include <nlohmann/detail/meta/type_traits.hpp>
+
18536
+
18537
+
18538NLOHMANN_JSON_NAMESPACE_BEGIN
+
18539
+
18542template <class Key, class T, class IgnoredLess = std::less<Key>,
+
18543 class Allocator = std::allocator<std::pair<const Key, T>>>
+
18544struct ordered_map : std::vector<std::pair<const Key, T>, Allocator> {
+
18545 using key_type = Key;
+
18546 using mapped_type = T;
+
18547 using Container = std::vector<std::pair<const Key, T>, Allocator>;
+
18548 using iterator = typename Container::iterator;
+
18549 using const_iterator = typename Container::const_iterator;
+
18550 using size_type = typename Container::size_type;
+
18551 using value_type = typename Container::value_type;
+
18552#ifdef JSON_HAS_CPP_14
+
18553 using key_compare = std::equal_to<>;
+
18554#else
+
18555 using key_compare = std::equal_to<Key>;
+
18556#endif
+
18557
+
18558 // Explicit constructors instead of `using Container::Container`
+
18559 // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4)
+
18560 ordered_map() noexcept(noexcept(Container())) : Container{} {}
+
18561 explicit ordered_map(const Allocator& alloc) noexcept(noexcept(Container(alloc))) : Container{ alloc } {}
+
18562 template <class It>
+
18563 ordered_map(It first, It last, const Allocator& alloc = Allocator())
+
18564 : Container{ first, last, alloc } {}
+
18565 ordered_map(std::initializer_list<value_type> init, const Allocator& alloc = Allocator())
+
18566 : Container{ init, alloc } {}
+
18567
+
18568 std::pair<iterator, bool> emplace(const key_type& key, T&& t) {
+
18569 for (auto it = this->begin(); it != this->end(); ++it) {
+
18570 if (m_compare(it->first, key)) {
+
18571 return { it, false };
+
18572 }
+
18573 }
+
18574 Container::emplace_back(key, std::forward<T>(t));
+
18575 return { std::prev(this->end()), true };
+
18576 }
+
18577
+
18578 template<class KeyType, detail::enable_if_t<
+
18579 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
+
18580 std::pair<iterator, bool> emplace(KeyType&& key, T&& t) {
+
18581 for (auto it = this->begin(); it != this->end(); ++it) {
+
18582 if (m_compare(it->first, key)) {
+
18583 return { it, false };
+
18584 }
+
18585 }
+
18586 Container::emplace_back(std::forward<KeyType>(key), std::forward<T>(t));
+
18587 return { std::prev(this->end()), true };
+
18588 }
+
18589
+
18590 T& operator[](const key_type& key) {
+
18591 return emplace(key, T{}).first->second;
+
18592 }
+
18593
+
18594 template<class KeyType, detail::enable_if_t<
+
18595 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
+
18596 T& operator[](KeyType&& key) {
+
18597 return emplace(std::forward<KeyType>(key), T{}).first->second;
+
18598 }
+
18599
+
18600 const T& operator[](const key_type& key) const {
+
18601 return at(key);
+
18602 }
+
18603
+
18604 template<class KeyType, detail::enable_if_t<
+
18605 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
+
18606 const T& operator[](KeyType&& key) const {
+
18607 return at(std::forward<KeyType>(key));
+
18608 }
+
18609
+
18610 T& at(const key_type& key) {
+
18611 for (auto it = this->begin(); it != this->end(); ++it) {
+
18612 if (m_compare(it->first, key)) {
+
18613 return it->second;
+
18614 }
+
18615 }
+
18616
+
18617 JSON_THROW(std::out_of_range("key not found"));
+
18618 }
+
18619
+
18620 template<class KeyType, detail::enable_if_t<
+
18621 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
+
18622 T& at(KeyType&& key) // NOLINT(cppcoreguidelines-missing-std-forward)
+
18623 {
+
18624 for (auto it = this->begin(); it != this->end(); ++it) {
+
18625 if (m_compare(it->first, key)) {
+
18626 return it->second;
+
18627 }
+
18628 }
+
18629
+
18630 JSON_THROW(std::out_of_range("key not found"));
+
18631 }
+
18632
+
18633 const T& at(const key_type& key) const {
+
18634 for (auto it = this->begin(); it != this->end(); ++it) {
+
18635 if (m_compare(it->first, key)) {
+
18636 return it->second;
+
18637 }
+
18638 }
+
18639
+
18640 JSON_THROW(std::out_of_range("key not found"));
+
18641 }
+
18642
+
18643 template<class KeyType, detail::enable_if_t<
+
18644 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
+
18645 const T& at(KeyType&& key) const // NOLINT(cppcoreguidelines-missing-std-forward)
+
18646 {
+
18647 for (auto it = this->begin(); it != this->end(); ++it) {
+
18648 if (m_compare(it->first, key)) {
+
18649 return it->second;
+
18650 }
+
18651 }
+
18652
+
18653 JSON_THROW(std::out_of_range("key not found"));
+
18654 }
+
18655
+
18656 size_type erase(const key_type& key) {
+
18657 for (auto it = this->begin(); it != this->end(); ++it) {
+
18658 if (m_compare(it->first, key)) {
+
18659 // Since we cannot move const Keys, re-construct them in place
+
18660 for (auto next = it; ++next != this->end(); ++it) {
+
18661 it->~value_type(); // Destroy but keep allocation
+
18662 new (&*it) value_type{ std::move(*next) };
+
18663 }
+
18664 Container::pop_back();
+
18665 return 1;
+
18666 }
+
18667 }
+
18668 return 0;
+
18669 }
+
18670
+
18671 template<class KeyType, detail::enable_if_t<
+
18672 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
+
18673 size_type erase(KeyType&& key) // NOLINT(cppcoreguidelines-missing-std-forward)
+
18674 {
+
18675 for (auto it = this->begin(); it != this->end(); ++it) {
+
18676 if (m_compare(it->first, key)) {
+
18677 // Since we cannot move const Keys, re-construct them in place
+
18678 for (auto next = it; ++next != this->end(); ++it) {
+
18679 it->~value_type(); // Destroy but keep allocation
+
18680 new (&*it) value_type{ std::move(*next) };
+
18681 }
+
18682 Container::pop_back();
+
18683 return 1;
+
18684 }
+
18685 }
+
18686 return 0;
+
18687 }
+
18688
+
18689 iterator erase(iterator pos) {
+
18690 return erase(pos, std::next(pos));
+
18691 }
+
18692
+
18693 iterator erase(iterator first, iterator last) {
+
18694 if (first == last) {
+
18695 return first;
+
18696 }
+
18697
+
18698 const auto elements_affected = std::distance(first, last);
+
18699 const auto offset = std::distance(Container::begin(), first);
+
18700
+
18701 // This is the start situation. We need to delete elements_affected
+
18702 // elements (3 in this example: e, f, g), and need to return an
+
18703 // iterator past the last deleted element (h in this example).
+
18704 // Note that offset is the distance from the start of the vector
+
18705 // to first. We will need this later.
+
18706
+
18707 // [ a, b, c, d, e, f, g, h, i, j ]
+
18708 // ^ ^
+
18709 // first last
+
18710
+
18711 // Since we cannot move const Keys, we re-construct them in place.
+
18712 // We start at first and re-construct (viz. copy) the elements from
+
18713 // the back of the vector. Example for the first iteration:
+
18714
+
18715 // ,--------.
+
18716 // v | destroy e and re-construct with h
+
18717 // [ a, b, c, d, e, f, g, h, i, j ]
+
18718 // ^ ^
+
18719 // it it + elements_affected
+
18720
+
18721 for (auto it = first; std::next(it, elements_affected) != Container::end(); ++it) {
+
18722 it->~value_type(); // destroy but keep allocation
+
18723 new (&*it) value_type{ std::move(*std::next(it, elements_affected)) }; // "move" next element to it
+
18724 }
+
18725
+
18726 // [ a, b, c, d, h, i, j, h, i, j ]
+
18727 // ^ ^
+
18728 // first last
+
18729
+
18730 // remove the unneeded elements at the end of the vector
+
18731 Container::resize(this->size() - static_cast<size_type>(elements_affected));
+
18732
+
18733 // [ a, b, c, d, h, i, j ]
+
18734 // ^ ^
+
18735 // first last
+
18736
+
18737 // first is now pointing past the last deleted element, but we cannot
+
18738 // use this iterator, because it may have been invalidated by the
+
18739 // resize call. Instead, we can return begin() + offset.
+
18740 return Container::begin() + offset;
+
18741 }
+
18742
+
18743 size_type count(const key_type& key) const {
+
18744 for (auto it = this->begin(); it != this->end(); ++it) {
+
18745 if (m_compare(it->first, key)) {
+
18746 return 1;
+
18747 }
+
18748 }
+
18749 return 0;
+
18750 }
+
18751
+
18752 template<class KeyType, detail::enable_if_t<
+
18753 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
+
18754 size_type count(KeyType&& key) const // NOLINT(cppcoreguidelines-missing-std-forward)
+
18755 {
+
18756 for (auto it = this->begin(); it != this->end(); ++it) {
+
18757 if (m_compare(it->first, key)) {
+
18758 return 1;
+
18759 }
+
18760 }
+
18761 return 0;
+
18762 }
+
18763
+
18764 iterator find(const key_type& key) {
+
18765 for (auto it = this->begin(); it != this->end(); ++it) {
+
18766 if (m_compare(it->first, key)) {
+
18767 return it;
+
18768 }
+
18769 }
+
18770 return Container::end();
+
18771 }
+
18772
+
18773 template<class KeyType, detail::enable_if_t<
+
18774 detail::is_usable_as_key_type<key_compare, key_type, KeyType>::value, int> = 0>
+
18775 iterator find(KeyType&& key) // NOLINT(cppcoreguidelines-missing-std-forward)
+
18776 {
+
18777 for (auto it = this->begin(); it != this->end(); ++it) {
+
18778 if (m_compare(it->first, key)) {
+
18779 return it;
+
18780 }
+
18781 }
+
18782 return Container::end();
+
18783 }
+
18784
+
18785 const_iterator find(const key_type& key) const {
+
18786 for (auto it = this->begin(); it != this->end(); ++it) {
+
18787 if (m_compare(it->first, key)) {
+
18788 return it;
+
18789 }
+
18790 }
+
18791 return Container::end();
+
18792 }
+
18793
+
18794 std::pair<iterator, bool> insert(value_type&& value) {
+
18795 return emplace(value.first, std::move(value.second));
+
18796 }
+
18797
+
18798 std::pair<iterator, bool> insert(const value_type& value) {
+
18799 for (auto it = this->begin(); it != this->end(); ++it) {
+
18800 if (m_compare(it->first, value.first)) {
+
18801 return { it, false };
+
18802 }
+
18803 }
+
18804 Container::push_back(value);
+
18805 return { --this->end(), true };
+
18806 }
+
18807
+
18808 template<typename InputIt>
+
18809 using require_input_iter = typename std::enable_if<std::is_convertible<typename std::iterator_traits<InputIt>::iterator_category,
+
18810 std::input_iterator_tag>::value>::type;
+
18811
+
18812 template<typename InputIt, typename = require_input_iter<InputIt>>
+
18813 void insert(InputIt first, InputIt last) {
+
18814 for (auto it = first; it != last; ++it) {
+
18815 insert(*it);
+
18816 }
+
18817 }
+
18818
+
18819private:
+
18820 JSON_NO_UNIQUE_ADDRESS key_compare m_compare = key_compare();
+
18821};
+
18822
+
18823NLOHMANN_JSON_NAMESPACE_END
+
18824
+
18825
+
18826#if defined(JSON_HAS_CPP_17)
+
18827#if JSON_HAS_STATIC_RTTI
+
18828#include <any>
+
18829#endif
+
18830#include <string_view>
+
18831#endif
+
18832
+
18838NLOHMANN_JSON_NAMESPACE_BEGIN
+
18839
+
18858NLOHMANN_BASIC_JSON_TPL_DECLARATION
+
+
18859class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-special-member-functions)
+
18860 : public ::nlohmann::detail::json_base_class<CustomBaseClass> {
+
18861private:
+
18862 template<detail::value_t> friend struct detail::external_constructor;
+
18863
+
18864 template<typename>
+
18865 friend class ::nlohmann::json_pointer;
+
18866 // can be restored when json_pointer backwards compatibility is removed
+
18867 // friend ::nlohmann::json_pointer<StringType>;
+
18868
+
18869 template<typename BasicJsonType, typename InputType>
+
18870 friend class ::nlohmann::detail::parser;
+
18871 friend ::nlohmann::detail::serializer<basic_json>;
+
18872 template<typename BasicJsonType>
+
18873 friend class ::nlohmann::detail::iter_impl;
+
18874 template<typename BasicJsonType, typename CharType>
+
18875 friend class ::nlohmann::detail::binary_writer;
+
18876 template<typename BasicJsonType, typename InputType, typename SAX>
+
18877 friend class ::nlohmann::detail::binary_reader;
+
18878 template<typename BasicJsonType, typename InputAdapterType>
+
18879 friend class ::nlohmann::detail::json_sax_dom_parser;
+
18880 template<typename BasicJsonType, typename InputAdapterType>
+
18881 friend class ::nlohmann::detail::json_sax_dom_callback_parser;
+
18882 friend class ::nlohmann::detail::exception;
+
18883
+
18885 using basic_json_t = NLOHMANN_BASIC_JSON_TPL;
+
18886 using json_base_class_t = ::nlohmann::detail::json_base_class<CustomBaseClass>;
+
18887
+
18888JSON_PRIVATE_UNLESS_TESTED:
+
18889 // convenience aliases for types residing in namespace detail;
+
18890 using lexer = ::nlohmann::detail::lexer_base<basic_json>;
+
18891
+
18892 template<typename InputAdapterType>
+
18893 static ::nlohmann::detail::parser<basic_json, InputAdapterType> parser(
+
18894 InputAdapterType adapter,
+
18895 detail::parser_callback_t<basic_json>cb = nullptr,
+
18896 const bool allow_exceptions = true,
+
18897 const bool ignore_comments = false,
+
18898 const bool ignore_trailing_commas = false
+
18899 ) {
+
18900 return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter),
+
18901 std::move(cb), allow_exceptions, ignore_comments, ignore_trailing_commas);
+
18902 }
+
18903
+
18904private:
+
18905 using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t;
+
18906 template<typename BasicJsonType>
+
18907 using internal_iterator = ::nlohmann::detail::internal_iterator<BasicJsonType>;
+
18908 template<typename BasicJsonType>
+
18909 using iter_impl = ::nlohmann::detail::iter_impl<BasicJsonType>;
+
18910 template<typename Iterator>
+
18911 using iteration_proxy = ::nlohmann::detail::iteration_proxy<Iterator>;
+
18912 template<typename Base> using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator<Base>;
+
18913
+
18914 template<typename CharType>
+
18915 using output_adapter_t = ::nlohmann::detail::output_adapter_t<CharType>;
+
18916
+
18917 template<typename InputType>
+
18918 using binary_reader = ::nlohmann::detail::binary_reader<basic_json, InputType>;
+
18919 template<typename CharType> using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>;
+
18920
+
18921JSON_PRIVATE_UNLESS_TESTED:
+
18922 using serializer = ::nlohmann::detail::serializer<basic_json>;
+
18923
+
18924public:
+
18925 using value_t = detail::value_t;
+
18927 using json_pointer = ::nlohmann::json_pointer<StringType>;
+
18928 template<typename T, typename SFINAE>
+
18929 using json_serializer = JSONSerializer<T, SFINAE>;
+
18931 using error_handler_t = detail::error_handler_t;
+
18933 using cbor_tag_handler_t = detail::cbor_tag_handler_t;
+
18935 using bjdata_version_t = detail::bjdata_version_t;
+
18937 using initializer_list_t = std::initializer_list<detail::json_ref<basic_json>>;
+
18938
+
18939 using input_format_t = detail::input_format_t;
+
18941 using json_sax_t = json_sax<basic_json>;
+
18942
+
18944 // exceptions //
+
18946
+
18950
+
18951 using exception = detail::exception;
+
18952 using parse_error = detail::parse_error;
+
18953 using invalid_iterator = detail::invalid_iterator;
+
18954 using type_error = detail::type_error;
+
18955 using out_of_range = detail::out_of_range;
+
18956 using other_error = detail::other_error;
+
18957
+
18959
+
18961 // container types //
+
18963
+
18968
+
18970 using value_type = basic_json;
+
18971
+
18973 using reference = value_type&;
+
18975 using const_reference = const value_type&;
+
18976
+
18978 using difference_type = std::ptrdiff_t;
+
18980 using size_type = std::size_t;
+
18981
+
18983 using allocator_type = AllocatorType<basic_json>;
+
18984
+
18986 using pointer = typename std::allocator_traits<allocator_type>::pointer;
+
18988 using const_pointer = typename std::allocator_traits<allocator_type>::const_pointer;
+
18989
+
18991 using iterator = iter_impl<basic_json>;
+
18993 using const_iterator = iter_impl<const basic_json>;
+
18995 using reverse_iterator = json_reverse_iterator<typename basic_json::iterator>;
+
18997 using const_reverse_iterator = json_reverse_iterator<typename basic_json::const_iterator>;
+
18998
+
19000
+
19003 static allocator_type get_allocator() {
+
19004 return allocator_type();
+
19005 }
+
19006
+
19009 JSON_HEDLEY_WARN_UNUSED_RESULT
+
19010 static basic_json meta() {
+
19011 basic_json result;
+
19012
+
19013 result["copyright"] = "(C) 2013-2026 Niels Lohmann";
+
19014 result["name"] = "JSON for Modern C++";
+
19015 result["url"] = "https://github.com/nlohmann/json";
+
19016 result["version"]["string"] =
+
19017 detail::concat(std::to_string(NLOHMANN_JSON_VERSION_MAJOR), '.',
+
19018 std::to_string(NLOHMANN_JSON_VERSION_MINOR), '.',
+
19019 std::to_string(NLOHMANN_JSON_VERSION_PATCH));
+
19020 result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR;
+
19021 result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR;
+
19022 result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH;
+
19023
+
19024#ifdef _WIN32
+
19025 result["platform"] = "win32";
+
19026#elif defined __linux__
+
19027 result["platform"] = "linux";
+
19028#elif defined __APPLE__
+
19029 result["platform"] = "apple";
+
19030#elif defined __unix__
+
19031 result["platform"] = "unix";
+
19032#else
+
19033 result["platform"] = "unknown";
+
19034#endif
+
19035
+
19036#if defined(__ICC) || defined(__INTEL_COMPILER)
+
19037 result["compiler"] = { {"family", "icc"}, {"version", __INTEL_COMPILER} };
+
19038#elif defined(__clang__)
+
19039 result["compiler"] = { {"family", "clang"}, {"version", __clang_version__} };
+
19040#elif defined(__GNUC__) || defined(__GNUG__)
+
19041 result["compiler"] = { {"family", "gcc"}, {"version", detail::concat(
+
19042 std::to_string(__GNUC__), '.',
+
19043 std::to_string(__GNUC_MINOR__), '.',
+
19044 std::to_string(__GNUC_PATCHLEVEL__))
+
19045 }
+
19046 };
+
19047#elif defined(__HP_cc) || defined(__HP_aCC)
+
19048 result["compiler"] = "hp"
+
19049#elif defined(__IBMCPP__)
+
19050 result["compiler"] = { {"family", "ilecpp"}, {"version", __IBMCPP__} };
+
19051#elif defined(_MSC_VER)
+
19052 result["compiler"] = { {"family", "msvc"}, {"version", _MSC_VER} };
+
19053#elif defined(__PGI)
+
19054 result["compiler"] = { {"family", "pgcpp"}, {"version", __PGI} };
+
19055#elif defined(__SUNPRO_CC)
+
19056 result["compiler"] = { {"family", "sunpro"}, {"version", __SUNPRO_CC} };
+
19057#else
+
19058 result["compiler"] = { {"family", "unknown"}, {"version", "unknown"} };
+
19059#endif
+
19060
+
19061#if defined(_MSVC_LANG)
+
19062 result["compiler"]["c++"] = std::to_string(_MSVC_LANG);
+
19063#elif defined(__cplusplus)
+
19064 result["compiler"]["c++"] = std::to_string(__cplusplus);
+
19065#else
+
19066 result["compiler"]["c++"] = "unknown";
+
19067#endif
+
19068 return result;
+
19069 }
+
19070
+
19072 // JSON value data types //
+
19074
+
19079
+
19084#if defined(JSON_HAS_CPP_14)
+
19085 // use of transparent comparator avoids unnecessary repeated construction of temporaries
+
19086 // in functions involving lookup by key with types other than object_t::key_type (aka. StringType)
+
19087 using default_object_comparator_t = std::less<>;
+
19088#else
+
19089 using default_object_comparator_t = std::less<StringType>;
+
19090#endif
+
19091
+
19094 using object_t = ObjectType<StringType,
+
19095 basic_json,
+
19096 default_object_comparator_t,
+
19097 AllocatorType<std::pair<const StringType,
+
19098 basic_json>>>;
+
19099
+
19102 using array_t = ArrayType<basic_json, AllocatorType<basic_json>>;
+
19103
+
19106 using string_t = StringType;
+
19107
+
19110 using boolean_t = BooleanType;
+
19111
+
19114 using number_integer_t = NumberIntegerType;
+
19115
+
19118 using number_unsigned_t = NumberUnsignedType;
+
19119
+
19122 using number_float_t = NumberFloatType;
+
19123
+
19126 using binary_t = nlohmann::byte_container_with_subtype<BinaryType>;
+
19127
+
19130 using object_comparator_t = detail::actual_object_comparator_t<basic_json>;
+
19131
+
19133
+
19134private:
+
19135
+
19137 template<typename T, typename... Args>
+
19138 JSON_HEDLEY_RETURNS_NON_NULL
+
19139 static T* create(Args&& ... args) {
+
19140 AllocatorType<T> alloc;
+
19141 using AllocatorTraits = std::allocator_traits<AllocatorType<T>>;
+
19142
+
19143 auto deleter = [&](T* obj) {
+
19144 AllocatorTraits::deallocate(alloc, obj, 1);
+
19145 };
+
19146 std::unique_ptr<T, decltype(deleter)> obj(AllocatorTraits::allocate(alloc, 1), deleter);
+
19147 AllocatorTraits::construct(alloc, obj.get(), std::forward<Args>(args)...);
+
19148 JSON_ASSERT(obj != nullptr);
+
19149 return obj.release();
+
19150 }
+
19151
+
19153 // JSON value storage //
+
19155
+
19156JSON_PRIVATE_UNLESS_TESTED:
+
19182 union json_value {
+
19184 object_t* object;
+
19186 array_t* array;
+
19188 string_t* string;
+
19190 binary_t* binary;
+
19192 boolean_t boolean;
+
19194 number_integer_t number_integer;
+
19196 number_unsigned_t number_unsigned;
+
19198 number_float_t number_float;
+
19199
+
19201 json_value() = default;
+
19203 json_value(boolean_t v) noexcept : boolean(v) {}
+
19205 json_value(number_integer_t v) noexcept : number_integer(v) {}
+
19207 json_value(number_unsigned_t v) noexcept : number_unsigned(v) {}
+
19209 json_value(number_float_t v) noexcept : number_float(v) {}
+
19211 json_value(value_t t) {
+
19212 switch (t) {
+
19213 case value_t::object:
+
19214 {
+
19215 object = create<object_t>();
+
19216 break;
+
19217 }
+
19218
+
19219 case value_t::array:
+
19220 {
+
19221 array = create<array_t>();
+
19222 break;
+
19223 }
+
19224
+
19225 case value_t::string:
+
19226 {
+
19227 string = create<string_t>("");
+
19228 break;
+
19229 }
+
19230
+
19231 case value_t::binary:
+
19232 {
+
19233 binary = create<binary_t>();
+
19234 break;
+
19235 }
+
19236
+
19237 case value_t::boolean:
+
19238 {
+
19239 boolean = static_cast<boolean_t>(false);
+
19240 break;
+
19241 }
+
19242
+
19243 case value_t::number_integer:
+
19244 {
+
19245 number_integer = static_cast<number_integer_t>(0);
+
19246 break;
+
19247 }
+
19248
+
19249 case value_t::number_unsigned:
+
19250 {
+
19251 number_unsigned = static_cast<number_unsigned_t>(0);
+
19252 break;
+
19253 }
+
19254
+
19255 case value_t::number_float:
+
19256 {
+
19257 number_float = static_cast<number_float_t>(0.0);
+
19258 break;
+
19259 }
+
19260
+
19261 case value_t::null:
+
19262 {
+
19263 object = nullptr; // silence warning, see #821
+
19264 break;
+
19265 }
+
19266
+
19267 case value_t::discarded:
+
19268 default:
+
19269 {
+
19270 object = nullptr; // silence warning, see #821
+
19271 if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) {
+
19272 JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.12.0", nullptr)); // LCOV_EXCL_LINE
+
19273 }
+
19274 break;
+
19275 }
+
19276 }
+
19277 }
+
19278
+
19280 json_value(const string_t& value) : string(create<string_t>(value)) {}
+
19281
+
19283 json_value(string_t&& value) : string(create<string_t>(std::move(value))) {}
+
19284
+
19286 json_value(const object_t& value) : object(create<object_t>(value)) {}
+
19287
+
19289 json_value(object_t&& value) : object(create<object_t>(std::move(value))) {}
+
19290
+
19292 json_value(const array_t& value) : array(create<array_t>(value)) {}
+
19293
+
19295 json_value(array_t&& value) : array(create<array_t>(std::move(value))) {}
+
19296
+
19298 json_value(const typename binary_t::container_type& value) : binary(create<binary_t>(value)) {}
+
19299
+
19301 json_value(typename binary_t::container_type&& value) : binary(create<binary_t>(std::move(value))) {}
+
19302
+
19304 json_value(const binary_t& value) : binary(create<binary_t>(value)) {}
+
19305
+
19307 json_value(binary_t&& value) : binary(create<binary_t>(std::move(value))) {}
+
19308
+
19309 void destroy(value_t t) {
+
19310 if (
+
19311 (t == value_t::object && object == nullptr) ||
+
19312 (t == value_t::array && array == nullptr) ||
+
19313 (t == value_t::string && string == nullptr) ||
+
19314 (t == value_t::binary && binary == nullptr)
+
19315 ) {
+
19316 // not initialized (e.g., due to exception in the ctor)
+
19317 return;
+
19318 }
+
19319 if (t == value_t::array || t == value_t::object) {
+
19320 // flatten the current json_value to a heap-allocated stack
+
19321 std::vector<basic_json> stack;
+
19322
+
19323 // move the top-level items to stack
+
19324 if (t == value_t::array) {
+
19325 stack.reserve(array->size());
+
19326 std::move(array->begin(), array->end(), std::back_inserter(stack));
+
19327 }
+
19328 else {
+
19329 stack.reserve(object->size());
+
19330 for (auto&& it : *object) {
+
19331 stack.push_back(std::move(it.second));
+
19332 }
+
19333 }
+
19334
+
19335 while (!stack.empty()) {
+
19336 // move the last item to a local variable to be processed
+
19337 basic_json current_item(std::move(stack.back()));
+
19338 stack.pop_back();
+
19339
+
19340 // if current_item is array/object, move
+
19341 // its children to the stack to be processed later
+
19342 if (current_item.is_array()) {
+
19343 std::move(current_item.m_data.m_value.array->begin(), current_item.m_data.m_value.array->end(), std::back_inserter(stack));
+
19344
+
19345 current_item.m_data.m_value.array->clear();
+
19346 }
+
19347 else if (current_item.is_object()) {
+
19348 for (auto&& it : *current_item.m_data.m_value.object) {
+
19349 stack.push_back(std::move(it.second));
+
19350 }
+
19351
+
19352 current_item.m_data.m_value.object->clear();
+
19353 }
+
19354
+
19355 // it's now safe that current_item gets destructed
+
19356 // since it doesn't have any children
+
19357 }
+
19358 }
+
19359
+
19360 switch (t) {
+
19361 case value_t::object:
+
19362 {
+
19363 AllocatorType<object_t> alloc;
+
19364 std::allocator_traits<decltype(alloc)>::destroy(alloc, object);
+
19365 std::allocator_traits<decltype(alloc)>::deallocate(alloc, object, 1);
+
19366 break;
+
19367 }
+
19368
+
19369 case value_t::array:
+
19370 {
+
19371 AllocatorType<array_t> alloc;
+
19372 std::allocator_traits<decltype(alloc)>::destroy(alloc, array);
+
19373 std::allocator_traits<decltype(alloc)>::deallocate(alloc, array, 1);
+
19374 break;
+
19375 }
+
19376
+
19377 case value_t::string:
+
19378 {
+
19379 AllocatorType<string_t> alloc;
+
19380 std::allocator_traits<decltype(alloc)>::destroy(alloc, string);
+
19381 std::allocator_traits<decltype(alloc)>::deallocate(alloc, string, 1);
+
19382 break;
+
19383 }
+
19384
+
19385 case value_t::binary:
+
19386 {
+
19387 AllocatorType<binary_t> alloc;
+
19388 std::allocator_traits<decltype(alloc)>::destroy(alloc, binary);
+
19389 std::allocator_traits<decltype(alloc)>::deallocate(alloc, binary, 1);
+
19390 break;
+
19391 }
+
19392
+
19393 case value_t::null:
+
19394 case value_t::boolean:
+
19395 case value_t::number_integer:
+
19396 case value_t::number_unsigned:
+
19397 case value_t::number_float:
+
19398 case value_t::discarded:
+
19399 default:
+
19400 {
+
19401 break;
+
19402 }
+
19403 }
+
19404 }
+
19405 };
+
19406
+
19407private:
+
19426 void assert_invariant(bool check_parents = true) const noexcept {
+
19427 JSON_ASSERT(m_data.m_type != value_t::object || m_data.m_value.object != nullptr);
+
19428 JSON_ASSERT(m_data.m_type != value_t::array || m_data.m_value.array != nullptr);
+
19429 JSON_ASSERT(m_data.m_type != value_t::string || m_data.m_value.string != nullptr);
+
19430 JSON_ASSERT(m_data.m_type != value_t::binary || m_data.m_value.binary != nullptr);
+
19431
+
19432#if JSON_DIAGNOSTICS
+
19433 JSON_TRY
+
19434 {
+
19435 // cppcheck-suppress assertWithSideEffect
+
19436 JSON_ASSERT(!check_parents || !is_structured() || std::all_of(begin(), end(), [this](const basic_json& j) {
+
19437 return j.m_parent == this;
+
19438 }));
+
19439 }
+
19440 JSON_CATCH(...) {} // LCOV_EXCL_LINE
+
19441#endif
+
19442 static_cast<void>(check_parents);
+
19443 }
+
19444
+
19445 void set_parents() {
+
19446#if JSON_DIAGNOSTICS
+
19447 switch (m_data.m_type) {
+
19448 case value_t::array:
+
19449 {
+
19450 for (auto& element : *m_data.m_value.array) {
+
19451 element.m_parent = this;
+
19452 }
+
19453 break;
+
19454 }
+
19455
+
19456 case value_t::object:
+
19457 {
+
19458 for (auto& element : *m_data.m_value.object) {
+
19459 element.second.m_parent = this;
+
19460 }
+
19461 break;
+
19462 }
+
19463
+
19464 case value_t::null:
+
19465 case value_t::string:
+
19466 case value_t::boolean:
+
19467 case value_t::number_integer:
+
19468 case value_t::number_unsigned:
+
19469 case value_t::number_float:
+
19470 case value_t::binary:
+
19471 case value_t::discarded:
+
19472 default:
+
19473 break;
+
19474 }
+
19475#endif
+
19476 }
+
19477
+
19478 iterator set_parents(iterator it, typename iterator::difference_type count_set_parents) {
+
19479#if JSON_DIAGNOSTICS
+
19480 for (typename iterator::difference_type i = 0; i < count_set_parents; ++i) {
+
19481 (it + i)->m_parent = this;
+
19482 }
+
19483#else
+
19484 static_cast<void>(count_set_parents);
+
19485#endif
+
19486 return it;
+
19487 }
+
19488
+
19489 reference set_parent(reference j, std::size_t old_capacity = detail::unknown_size()) {
+
19490#if JSON_DIAGNOSTICS
+
19491 if (old_capacity != detail::unknown_size()) {
+
19492 // see https://github.com/nlohmann/json/issues/2838
+
19493 JSON_ASSERT(type() == value_t::array);
+
19494 if (JSON_HEDLEY_UNLIKELY(m_data.m_value.array->capacity() != old_capacity)) {
+
19495 // capacity has changed: update all parents
+
19496 set_parents();
+
19497 return j;
+
19498 }
+
19499 }
+
19500
+
19501 // ordered_json uses a vector internally, so pointers could have
+
19502 // been invalidated; see https://github.com/nlohmann/json/issues/2962
+
19503#ifdef JSON_HEDLEY_MSVC_VERSION
+
19504#pragma warning(push )
+
19505#pragma warning(disable : 4127) // ignore warning to replace if with if constexpr
+
19506#endif
+
19507 if (detail::is_ordered_map<object_t>::value) {
+
19508 set_parents();
+
19509 return j;
+
19510 }
+
19511#ifdef JSON_HEDLEY_MSVC_VERSION
+
19512#pragma warning( pop )
+
19513#endif
+
19514
+
19515 j.m_parent = this;
+
19516#else
+
19517 static_cast<void>(j);
+
19518 static_cast<void>(old_capacity);
+
19519#endif
+
19520 return j;
+
19521 }
+
19522
+
19523public:
+
19525 // JSON parser callback //
+
19527
+
19530 using parse_event_t = detail::parse_event_t;
+
19531
+
19534 using parser_callback_t = detail::parser_callback_t<basic_json>;
+
19535
+
19537 // constructors //
+
19539
+
19544
+
19547 basic_json(const value_t v)
+
19548 : m_data(v) {
+
19549 assert_invariant();
+
19550 }
+
19551
+
19554 basic_json(std::nullptr_t = nullptr) noexcept // NOLINT(bugprone-exception-escape)
+
19555 : basic_json(value_t::null) {
+
19556 assert_invariant();
+
19557 }
+
19558
+
19561 template < typename CompatibleType,
+
19562 typename U = detail::uncvref_t<CompatibleType>,
+
19563 detail::enable_if_t <
+ +
19565 basic_json(CompatibleType&& val) noexcept(noexcept( // NOLINT(bugprone-forwarding-reference-overload,bugprone-exception-escape)
+
19566 JSONSerializer<U>::to_json(std::declval<basic_json_t&>(),
+
19567 std::forward<CompatibleType>(val)))) {
+
19568 JSONSerializer<U>::to_json(*this, std::forward<CompatibleType>(val));
+
19569 set_parents();
+
19570 assert_invariant();
+
19571 }
+
19572
+
19575 template < typename BasicJsonType,
+
19576 detail::enable_if_t <
+
19577 detail::is_basic_json<BasicJsonType>::value && !std::is_same<basic_json, BasicJsonType>::value, int > = 0 >
+
19578 basic_json(const BasicJsonType& val)
+
19579#if JSON_DIAGNOSTIC_POSITIONS
+
19580 : start_position(val.start_pos()),
+
19581 end_position(val.end_pos())
+
19582#endif
+
19583 {
+
19584 using other_boolean_t = typename BasicJsonType::boolean_t;
+
19585 using other_number_float_t = typename BasicJsonType::number_float_t;
+
19586 using other_number_integer_t = typename BasicJsonType::number_integer_t;
+
19587 using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+
19588 using other_string_t = typename BasicJsonType::string_t;
+
19589 using other_object_t = typename BasicJsonType::object_t;
+
19590 using other_array_t = typename BasicJsonType::array_t;
+
19591 using other_binary_t = typename BasicJsonType::binary_t;
+
19592
+
19593 switch (val.type()) {
+
19594 case value_t::boolean:
+
19595 JSONSerializer<other_boolean_t>::to_json(*this, val.template get<other_boolean_t>());
+
19596 break;
+
19597 case value_t::number_float:
+
19598 JSONSerializer<other_number_float_t>::to_json(*this, val.template get<other_number_float_t>());
+
19599 break;
+
19600 case value_t::number_integer:
+
19601 JSONSerializer<other_number_integer_t>::to_json(*this, val.template get<other_number_integer_t>());
+
19602 break;
+
19603 case value_t::number_unsigned:
+
19604 JSONSerializer<other_number_unsigned_t>::to_json(*this, val.template get<other_number_unsigned_t>());
+
19605 break;
+
19606 case value_t::string:
+
19607 JSONSerializer<other_string_t>::to_json(*this, val.template get_ref<const other_string_t&>());
+
19608 break;
+
19609 case value_t::object:
+
19610 JSONSerializer<other_object_t>::to_json(*this, val.template get_ref<const other_object_t&>());
+
19611 break;
+
19612 case value_t::array:
+
19613 JSONSerializer<other_array_t>::to_json(*this, val.template get_ref<const other_array_t&>());
+
19614 break;
+
19615 case value_t::binary:
+
19616 JSONSerializer<other_binary_t>::to_json(*this, val.template get_ref<const other_binary_t&>());
+
19617 break;
+
19618 case value_t::null:
+
19619 *this = nullptr;
+
19620 break;
+
19621 case value_t::discarded:
+
19622 m_data.m_type = value_t::discarded;
+
19623 break;
+
19624 default: // LCOV_EXCL_LINE
+
19625 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
19626 }
+
19627 JSON_ASSERT(m_data.m_type == val.type());
+
19628
+
19629 set_parents();
+
19630 assert_invariant();
+
19631 }
+
19632
+
19635 basic_json(initializer_list_t init,
+
19636 bool type_deduction = true,
+
19637 value_t manual_type = value_t::array) {
+
19638 // check if each element is an array with two elements whose first
+
19639 // element is a string
+
19640 bool is_an_object = std::all_of(init.begin(), init.end(),
+
19641 [](const detail::json_ref<basic_json>& element_ref) {
+
19642 // The cast is to ensure op[size_type] is called, bearing in mind size_type may not be int;
+
19643 // (many string types can be constructed from 0 via its null-pointer guise, so we get a
+
19644 // broken call to op[key_type], the wrong semantics, and a 4804 warning on Windows)
+
19645 return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[static_cast<size_type>(0)].is_string();
+
19646 });
+
19647
+
19648 // adjust type if type deduction is not wanted
+
19649 if (!type_deduction) {
+
19650 // if an array is wanted, do not create an object though possible
+
19651 if (manual_type == value_t::array) {
+
19652 is_an_object = false;
+
19653 }
+
19654
+
19655 // if an object is wanted but impossible, throw an exception
+
19656 if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object)) {
+
19657 JSON_THROW(type_error::create(301, "cannot create object from initializer list", nullptr));
+
19658 }
+
19659 }
+
19660
+
19661 if (is_an_object) {
+
19662 // the initializer list is a list of pairs -> create an object
+
19663 m_data.m_type = value_t::object;
+
19664 m_data.m_value = value_t::object;
+
19665
+
19666 for (auto& element_ref : init) {
+
19667 auto element = element_ref.moved_or_copied();
+
19668 m_data.m_value.object->emplace(
+
19669 std::move(*((*element.m_data.m_value.array)[0].m_data.m_value.string)),
+
19670 std::move((*element.m_data.m_value.array)[1]));
+
19671 }
+
19672 }
+
19673 else {
+
19674 // the initializer list describes an array -> create an array
+
19675 m_data.m_type = value_t::array;
+
19676 m_data.m_value.array = create<array_t>(init.begin(), init.end());
+
19677 }
+
19678
+
19679 set_parents();
+
19680 assert_invariant();
+
19681 }
+
19682
+
19685 JSON_HEDLEY_WARN_UNUSED_RESULT
+
19686 static basic_json binary(const typename binary_t::container_type& init) {
+
19687 auto res = basic_json();
+
19688 res.m_data.m_type = value_t::binary;
+
19689 res.m_data.m_value = init;
+
19690 return res;
+
19691 }
+
19692
+
19695 JSON_HEDLEY_WARN_UNUSED_RESULT
+
19696 static basic_json binary(const typename binary_t::container_type& init, typename binary_t::subtype_type subtype) {
+
19697 auto res = basic_json();
+
19698 res.m_data.m_type = value_t::binary;
+
19699 res.m_data.m_value = binary_t(init, subtype);
+
19700 return res;
+
19701 }
+
19702
+
19705 JSON_HEDLEY_WARN_UNUSED_RESULT
+
19706 static basic_json binary(typename binary_t::container_type&& init) {
+
19707 auto res = basic_json();
+
19708 res.m_data.m_type = value_t::binary;
+
19709 res.m_data.m_value = std::move(init);
+
19710 return res;
+
19711 }
+
19712
+
19715 JSON_HEDLEY_WARN_UNUSED_RESULT
+
19716 static basic_json binary(typename binary_t::container_type&& init, typename binary_t::subtype_type subtype) {
+
19717 auto res = basic_json();
+
19718 res.m_data.m_type = value_t::binary;
+
19719 res.m_data.m_value = binary_t(std::move(init), subtype);
+
19720 return res;
+
19721 }
+
19722
+
19725 JSON_HEDLEY_WARN_UNUSED_RESULT
+
19726 static basic_json array(initializer_list_t init = {}) {
+
19727 return basic_json(init, false, value_t::array);
+
19728 }
+
19729
+
19732 JSON_HEDLEY_WARN_UNUSED_RESULT
+
19733 static basic_json object(initializer_list_t init = {}) {
+
19734 return basic_json(init, false, value_t::object);
+
19735 }
+
19736
+
19739 basic_json(size_type cnt, const basic_json& val) :
+
19740 m_data{ cnt, val } {
+
19741 set_parents();
+
19742 assert_invariant();
+
19743 }
+
19744
+
19747 template < class InputIT, typename std::enable_if <
+
19748 std::is_same<InputIT, typename basic_json_t::iterator>::value ||
+
19749 std::is_same<InputIT, typename basic_json_t::const_iterator>::value, int >::type = 0 >
+
19750 basic_json(InputIT first, InputIT last) // NOLINT(performance-unnecessary-value-param)
+
19751 {
+
19752 JSON_ASSERT(first.m_object != nullptr);
+
19753 JSON_ASSERT(last.m_object != nullptr);
+
19754
+
19755 // make sure the iterator fits the current value
+
19756 if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) {
+
19757 JSON_THROW(invalid_iterator::create(201, "iterators are not compatible", nullptr));
+
19758 }
+
19759
+
19760 // copy type from the first iterator
+
19761 m_data.m_type = first.m_object->m_data.m_type;
+
19762
+
19763 // check if the iterator range is complete for primitive values
+
19764 switch (m_data.m_type) {
+
19765 case value_t::boolean:
+
19766 case value_t::number_float:
+
19767 case value_t::number_integer:
+
19768 case value_t::number_unsigned:
+
19769 case value_t::string:
+
19770 {
+
19771 if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin()
+
19772 || !last.m_it.primitive_iterator.is_end())) {
+
19773 JSON_THROW(invalid_iterator::create(204, "iterators out of range", first.m_object));
+
19774 }
+
19775 break;
+
19776 }
+
19777
+
19778 case value_t::null:
+
19779 case value_t::object:
+
19780 case value_t::array:
+
19781 case value_t::binary:
+
19782 case value_t::discarded:
+
19783 default:
+
19784 break;
+
19785 }
+
19786
+
19787 switch (m_data.m_type) {
+
19788 case value_t::number_integer:
+
19789 {
+
19790 m_data.m_value.number_integer = first.m_object->m_data.m_value.number_integer;
+
19791 break;
+
19792 }
+
19793
+
19794 case value_t::number_unsigned:
+
19795 {
+
19796 m_data.m_value.number_unsigned = first.m_object->m_data.m_value.number_unsigned;
+
19797 break;
+
19798 }
+
19799
+
19800 case value_t::number_float:
+
19801 {
+
19802 m_data.m_value.number_float = first.m_object->m_data.m_value.number_float;
+
19803 break;
+
19804 }
+
19805
+
19806 case value_t::boolean:
+
19807 {
+
19808 m_data.m_value.boolean = first.m_object->m_data.m_value.boolean;
+
19809 break;
+
19810 }
+
19811
+
19812 case value_t::string:
+
19813 {
+
19814 m_data.m_value = *first.m_object->m_data.m_value.string;
+
19815 break;
+
19816 }
+
19817
+
19818 case value_t::object:
+
19819 {
+
19820 m_data.m_value.object = create<object_t>(first.m_it.object_iterator,
+
19821 last.m_it.object_iterator);
+
19822 break;
+
19823 }
+
19824
+
19825 case value_t::array:
+
19826 {
+
19827 m_data.m_value.array = create<array_t>(first.m_it.array_iterator,
+
19828 last.m_it.array_iterator);
+
19829 break;
+
19830 }
+
19831
+
19832 case value_t::binary:
+
19833 {
+
19834 m_data.m_value = *first.m_object->m_data.m_value.binary;
+
19835 break;
+
19836 }
+
19837
+
19838 case value_t::null:
+
19839 case value_t::discarded:
+
19840 default:
+
19841 JSON_THROW(invalid_iterator::create(206, detail::concat("cannot construct with iterators from ", first.m_object->type_name()), first.m_object));
+
19842 }
+
19843
+
19844 set_parents();
+
19845 assert_invariant();
+
19846 }
+
19847
+
19849 // other constructors and destructor //
+
19851
+
19852 template<typename JsonRef,
+
19853 detail::enable_if_t<detail::conjunction<detail::is_json_ref<JsonRef>,
+
19854 std::is_same<typename JsonRef::value_type, basic_json>>::value, int> = 0 >
+
19855 basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {}
+
19856
+
19859 basic_json(const basic_json& other)
+
19860 : json_base_class_t(other)
+
19861#if JSON_DIAGNOSTIC_POSITIONS
+
19862 , start_position(other.start_position)
+
19863 , end_position(other.end_position)
+
19864#endif
+
19865 {
+
19866 m_data.m_type = other.m_data.m_type;
+
19867 // check of passed value is valid
+
19868 other.assert_invariant();
+
19869
+
19870 switch (m_data.m_type) {
+
19871 case value_t::object:
+
19872 {
+
19873 m_data.m_value = *other.m_data.m_value.object;
+
19874 break;
+
19875 }
+
19876
+
19877 case value_t::array:
+
19878 {
+
19879 m_data.m_value = *other.m_data.m_value.array;
+
19880 break;
+
19881 }
+
19882
+
19883 case value_t::string:
+
19884 {
+
19885 m_data.m_value = *other.m_data.m_value.string;
+
19886 break;
+
19887 }
+
19888
+
19889 case value_t::boolean:
+
19890 {
+
19891 m_data.m_value = other.m_data.m_value.boolean;
+
19892 break;
+
19893 }
+
19894
+
19895 case value_t::number_integer:
+
19896 {
+
19897 m_data.m_value = other.m_data.m_value.number_integer;
+
19898 break;
+
19899 }
+
19900
+
19901 case value_t::number_unsigned:
+
19902 {
+
19903 m_data.m_value = other.m_data.m_value.number_unsigned;
+
19904 break;
+
19905 }
+
19906
+
19907 case value_t::number_float:
+
19908 {
+
19909 m_data.m_value = other.m_data.m_value.number_float;
+
19910 break;
+
19911 }
+
19912
+
19913 case value_t::binary:
+
19914 {
+
19915 m_data.m_value = *other.m_data.m_value.binary;
+
19916 break;
+
19917 }
+
19918
+
19919 case value_t::null:
+
19920 case value_t::discarded:
+
19921 default:
+
19922 break;
+
19923 }
+
19924
+
19925 set_parents();
+
19926 assert_invariant();
+
19927 }
+
19928
+
19931 basic_json(basic_json&& other) noexcept
+
19932 : json_base_class_t(std::forward<json_base_class_t>(other)),
+
19933 m_data(std::move(other.m_data)) // cppcheck-suppress[accessForwarded] TODO check
+
19934#if JSON_DIAGNOSTIC_POSITIONS
+
19935 , start_position(other.start_position) // cppcheck-suppress[accessForwarded] TODO check
+
19936 , end_position(other.end_position) // cppcheck-suppress[accessForwarded] TODO check
+
19937#endif
+
19938 {
+
19939 // check that the passed value is valid
+
19940 other.assert_invariant(false); // cppcheck-suppress[accessForwarded]
+
19941
+
19942 // invalidate payload
+
19943 other.m_data.m_type = value_t::null;
+
19944 other.m_data.m_value = {};
+
19945
+
19946#if JSON_DIAGNOSTIC_POSITIONS
+
19947 other.start_position = std::string::npos;
+
19948 other.end_position = std::string::npos;
+
19949#endif
+
19950
+
19951 set_parents();
+
19952 assert_invariant();
+
19953 }
+
19954
+
19957 basic_json& operator=(basic_json other) noexcept ( // NOLINT(cppcoreguidelines-c-copy-assignment-signature,misc-unconventional-assign-operator)
+
19958 std::is_nothrow_move_constructible<value_t>::value&&
+
19959 std::is_nothrow_move_assignable<value_t>::value&&
+
19960 std::is_nothrow_move_constructible<json_value>::value&&
+
19961 std::is_nothrow_move_assignable<json_value>::value&&
+
19962 std::is_nothrow_move_assignable<json_base_class_t>::value
+
19963 ) {
+
19964 // check that the passed value is valid
+
19965 other.assert_invariant();
+
19966
+
19967 using std::swap;
+
19968 swap(m_data.m_type, other.m_data.m_type);
+
19969 swap(m_data.m_value, other.m_data.m_value);
+
19970
+
19971#if JSON_DIAGNOSTIC_POSITIONS
+
19972 swap(start_position, other.start_position);
+
19973 swap(end_position, other.end_position);
+
19974#endif
+
19975
+
19976 json_base_class_t::operator=(std::move(other));
+
19977
+
19978 set_parents();
+
19979 assert_invariant();
+
19980 return *this;
+
19981 }
+
19982
+
19985 ~basic_json() noexcept {
+
19986 assert_invariant(false);
+
19987 }
+
19988
+
19990
+
19991public:
+
19993 // object inspection //
+
19995
+
19999
+
20002 string_t dump(const int indent = -1,
+
20003 const char indent_char = ' ',
+
20004 const bool ensure_ascii = false,
+
20005 const error_handler_t error_handler = error_handler_t::strict) const {
+
20006 string_t result;
+
20007 serializer s(detail::output_adapter<char, string_t>(result), indent_char, error_handler);
+
20008
+
20009 if (indent >= 0) {
+
20010 s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent));
+
20011 }
+
20012 else {
+
20013 s.dump(*this, false, ensure_ascii, 0);
+
20014 }
+
20015
+
20016 return result;
+
20017 }
+
20018
+
20021 constexpr value_t type() const noexcept {
+
20022 return m_data.m_type;
+
20023 }
+
20024
+
20027 constexpr bool is_primitive() const noexcept {
+
20028 return is_null() || is_string() || is_boolean() || is_number() || is_binary();
+
20029 }
+
20030
+
20033 constexpr bool is_structured() const noexcept {
+
20034 return is_array() || is_object();
+
20035 }
+
20036
+
20039 constexpr bool is_null() const noexcept {
+
20040 return m_data.m_type == value_t::null;
+
20041 }
+
20042
+
20045 constexpr bool is_boolean() const noexcept {
+
20046 return m_data.m_type == value_t::boolean;
+
20047 }
+
20048
+
20051 constexpr bool is_number() const noexcept {
+
20052 return is_number_integer() || is_number_float();
+
20053 }
+
20054
+
20057 constexpr bool is_number_integer() const noexcept {
+
20058 return m_data.m_type == value_t::number_integer || m_data.m_type == value_t::number_unsigned;
+
20059 }
+
20060
+
20063 constexpr bool is_number_unsigned() const noexcept {
+
20064 return m_data.m_type == value_t::number_unsigned;
+
20065 }
+
20066
+
20069 constexpr bool is_number_float() const noexcept {
+
20070 return m_data.m_type == value_t::number_float;
+
20071 }
+
20072
+
20075 constexpr bool is_object() const noexcept {
+
20076 return m_data.m_type == value_t::object;
+
20077 }
+
20078
+
20081 constexpr bool is_array() const noexcept {
+
20082 return m_data.m_type == value_t::array;
+
20083 }
+
20084
+
20087 constexpr bool is_string() const noexcept {
+
20088 return m_data.m_type == value_t::string;
+
20089 }
+
20090
+
20093 constexpr bool is_binary() const noexcept {
+
20094 return m_data.m_type == value_t::binary;
+
20095 }
+
20096
+
20099 constexpr bool is_discarded() const noexcept {
+
20100 return m_data.m_type == value_t::discarded;
+
20101 }
+
20102
+
20105 constexpr operator value_t() const noexcept {
+
20106 return m_data.m_type;
+
20107 }
+
20108
+
20110
+
20111private:
+
20113 // value access //
+
20115
+
20117 boolean_t get_impl(boolean_t* /*unused*/) const {
+
20118 if (JSON_HEDLEY_LIKELY(is_boolean())) {
+
20119 return m_data.m_value.boolean;
+
20120 }
+
20121
+
20122 JSON_THROW(type_error::create(302, detail::concat("type must be boolean, but is ", type_name()), this));
+
20123 }
+
20124
+
20126 object_t* get_impl_ptr(object_t* /*unused*/) noexcept {
+
20127 return is_object() ? m_data.m_value.object : nullptr;
+
20128 }
+
20129
+
20131 constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept {
+
20132 return is_object() ? m_data.m_value.object : nullptr;
+
20133 }
+
20134
+
20136 array_t* get_impl_ptr(array_t* /*unused*/) noexcept {
+
20137 return is_array() ? m_data.m_value.array : nullptr;
+
20138 }
+
20139
+
20141 constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept {
+
20142 return is_array() ? m_data.m_value.array : nullptr;
+
20143 }
+
20144
+
20146 string_t* get_impl_ptr(string_t* /*unused*/) noexcept {
+
20147 return is_string() ? m_data.m_value.string : nullptr;
+
20148 }
+
20149
+
20151 constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept {
+
20152 return is_string() ? m_data.m_value.string : nullptr;
+
20153 }
+
20154
+
20156 boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept {
+
20157 return is_boolean() ? &m_data.m_value.boolean : nullptr;
+
20158 }
+
20159
+
20161 constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept {
+
20162 return is_boolean() ? &m_data.m_value.boolean : nullptr;
+
20163 }
+
20164
+
20166 number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept {
+
20167 return m_data.m_type == value_t::number_integer ? &m_data.m_value.number_integer : nullptr;
+
20168 }
+
20169
+
20171 constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept {
+
20172 return m_data.m_type == value_t::number_integer ? &m_data.m_value.number_integer : nullptr;
+
20173 }
+
20174
+
20176 number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept {
+
20177 return is_number_unsigned() ? &m_data.m_value.number_unsigned : nullptr;
+
20178 }
+
20179
+
20181 constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept {
+
20182 return is_number_unsigned() ? &m_data.m_value.number_unsigned : nullptr;
+
20183 }
+
20184
+
20186 number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept {
+
20187 return is_number_float() ? &m_data.m_value.number_float : nullptr;
+
20188 }
+
20189
+
20191 constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept {
+
20192 return is_number_float() ? &m_data.m_value.number_float : nullptr;
+
20193 }
+
20194
+
20196 binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept {
+
20197 return is_binary() ? m_data.m_value.binary : nullptr;
+
20198 }
+
20199
+
20201 constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept {
+
20202 return is_binary() ? m_data.m_value.binary : nullptr;
+
20203 }
+
20204
+
20216 template<typename ReferenceType, typename ThisType>
+
20217 static ReferenceType get_ref_impl(ThisType& obj) {
+
20218 // delegate the call to get_ptr<>()
+
20219 auto* ptr = obj.template get_ptr<typename std::add_pointer<ReferenceType>::type>();
+
20220
+
20221 if (JSON_HEDLEY_LIKELY(ptr != nullptr)) {
+
20222 return *ptr;
+
20223 }
+
20224
+
20225 JSON_THROW(type_error::create(303, detail::concat("incompatible ReferenceType for get_ref, actual type is ", obj.type_name()), &obj));
+
20226 }
+
20227
+
20228public:
+
20232
+
20235 template<typename PointerType, typename std::enable_if<
+
20236 std::is_pointer<PointerType>::value, int>::type = 0>
+
20237 auto get_ptr() noexcept -> decltype(std::declval<basic_json_t&>().get_impl_ptr(std::declval<PointerType>())) {
+
20238 // delegate the call to get_impl_ptr<>()
+
20239 return get_impl_ptr(static_cast<PointerType>(nullptr));
+
20240 }
+
20241
+
20244 template < typename PointerType, typename std::enable_if <
+
20245 std::is_pointer<PointerType>::value&&
+
20246 std::is_const<typename std::remove_pointer<PointerType>::type>::value, int >::type = 0 >
+
20247 constexpr auto get_ptr() const noexcept -> decltype(std::declval<const basic_json_t&>().get_impl_ptr(std::declval<PointerType>())) {
+
20248 // delegate the call to get_impl_ptr<>() const
+
20249 return get_impl_ptr(static_cast<PointerType>(nullptr));
+
20250 }
+
20251
+
20252private:
+
20291 template < typename ValueType,
+
20292 detail::enable_if_t <
+ + +
20295 int > = 0 >
+
20296 ValueType get_impl(detail::priority_tag<0> /*unused*/) const noexcept(noexcept(
+
20297 JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), std::declval<ValueType&>()))) {
+
20298 auto ret = ValueType();
+
20299 JSONSerializer<ValueType>::from_json(*this, ret);
+
20300 return ret;
+
20301 }
+
20302
+
20333 template < typename ValueType,
+
20334 detail::enable_if_t <
+ +
20336 int > = 0 >
+
20337 ValueType get_impl(detail::priority_tag<1> /*unused*/) const noexcept(noexcept(
+
20338 JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>()))) {
+
20339 return JSONSerializer<ValueType>::from_json(*this);
+
20340 }
+
20341
+
20357 template < typename BasicJsonType,
+
20358 detail::enable_if_t <
+ +
20360 int > = 0 >
+
20361 BasicJsonType get_impl(detail::priority_tag<2> /*unused*/) const {
+
20362 return *this;
+
20363 }
+
20364
+
20379 template<typename BasicJsonType,
+
20380 detail::enable_if_t<
+
20381 std::is_same<BasicJsonType, basic_json_t>::value,
+
20382 int> = 0>
+
20383 basic_json get_impl(detail::priority_tag<3> /*unused*/) const {
+
20384 return *this;
+
20385 }
+
20386
+
20391 template<typename PointerType,
+
20392 detail::enable_if_t<
+
20393 std::is_pointer<PointerType>::value,
+
20394 int> = 0>
+
20395 constexpr auto get_impl(detail::priority_tag<4> /*unused*/) const noexcept
+
20396 -> decltype(std::declval<const basic_json_t&>().template get_ptr<PointerType>()) {
+
20397 // delegate the call to get_ptr
+
20398 return get_ptr<PointerType>();
+
20399 }
+
20400
+
20401public:
+
20425 template < typename ValueTypeCV, typename ValueType = detail::uncvref_t<ValueTypeCV>>
+
20426#if defined(JSON_HAS_CPP_14)
+
20427 constexpr
+
20428#endif
+
20429 auto get() const noexcept(
+
20430 noexcept(std::declval<const basic_json_t&>().template get_impl<ValueType>(detail::priority_tag<4> {})))
+
20431 -> decltype(std::declval<const basic_json_t&>().template get_impl<ValueType>(detail::priority_tag<4> {})) {
+
20432 // we cannot static_assert on ValueTypeCV being non-const, because
+
20433 // there is support for get<const basic_json_t>(), which is why we
+
20434 // still need the uncvref
+
20435 static_assert(!std::is_reference<ValueTypeCV>::value,
+
20436 "get() cannot be used with reference types, you might want to use get_ref()");
+
20437 return get_impl<ValueType>(detail::priority_tag<4> {});
+
20438 }
+
20439
+
20467 template<typename PointerType, typename std::enable_if<
+
20468 std::is_pointer<PointerType>::value, int>::type = 0>
+
20469 auto get() noexcept -> decltype(std::declval<basic_json_t&>().template get_ptr<PointerType>()) {
+
20470 // delegate the call to get_ptr
+
20471 return get_ptr<PointerType>();
+
20472 }
+
20473
+
20476 template < typename ValueType,
+
20477 detail::enable_if_t <
+ + +
20480 int > = 0 >
+
20481 ValueType& get_to(ValueType& v) const noexcept(noexcept(
+
20482 JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>(), v))) {
+
20483 JSONSerializer<ValueType>::from_json(*this, v);
+
20484 return v;
+
20485 }
+
20486
+
20487 // specialization to allow calling get_to with a basic_json value
+
20488 // see https://github.com/nlohmann/json/issues/2175
+
20489 template<typename ValueType,
+
20490 detail::enable_if_t <
+ +
20492 int> = 0>
+
20493 ValueType& get_to(ValueType& v) const {
+
20494 v = *this;
+
20495 return v;
+
20496 }
+
20497
+
20498 template <
+
20499 typename T, std::size_t N,
+
20500 typename Array = T(&)[N], // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
20501 detail::enable_if_t <
+ +
20503 Array get_to(T(&v)[N]) const // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays)
+
20504 noexcept(noexcept(JSONSerializer<Array>::from_json(
+
20505 std::declval<const basic_json_t&>(), v))) {
+
20506 JSONSerializer<Array>::from_json(*this, v);
+
20507 return v;
+
20508 }
+
20509
+
20512 template<typename ReferenceType, typename std::enable_if<
+
20513 std::is_reference<ReferenceType>::value, int>::type = 0>
+
20514 ReferenceType get_ref() {
+
20515 // delegate call to get_ref_impl
+
20516 return get_ref_impl<ReferenceType>(*this);
+
20517 }
+
20518
+
20521 template < typename ReferenceType, typename std::enable_if <
+
20522 std::is_reference<ReferenceType>::value&&
+
20523 std::is_const<typename std::remove_reference<ReferenceType>::type>::value, int >::type = 0 >
+
20524 ReferenceType get_ref() const {
+
20525 // delegate call to get_ref_impl
+
20526 return get_ref_impl<ReferenceType>(*this);
+
20527 }
+
20528
+
20558 template < typename ValueType, typename std::enable_if <
+ + + + + + + +
20566#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914))
+ +
20568#endif
+
20569#if defined(JSON_HAS_CPP_17) && JSON_HAS_STATIC_RTTI
+ +
20571#endif
+ +
20573 >::value, int >::type = 0 >
+
20574 JSON_EXPLICIT operator ValueType() const {
+
20575 // delegate the call to get<>() const
+
20576 return get<ValueType>();
+
20577 }
+
20578
+
20581 binary_t& get_binary() {
+
20582 if (!is_binary()) {
+
20583 JSON_THROW(type_error::create(302, detail::concat("type must be binary, but is ", type_name()), this));
+
20584 }
+
20585
+
20586 return *get_ptr<binary_t*>();
+
20587 }
+
20588
+
20591 const binary_t& get_binary() const {
+
20592 if (!is_binary()) {
+
20593 JSON_THROW(type_error::create(302, detail::concat("type must be binary, but is ", type_name()), this));
+
20594 }
+
20595
+
20596 return *get_ptr<const binary_t*>();
+
20597 }
+
20598
+
20600
+
20602 // element access //
+
20604
+
20608
+
20611 reference at(size_type idx) {
+
20612 // at only works for arrays
+
20613 if (JSON_HEDLEY_LIKELY(is_array())) {
+
20614 JSON_TRY
+
20615 {
+
20616 return set_parent(m_data.m_value.array->at(idx));
+
20617 }
+
20618 JSON_CATCH(std::out_of_range&) {
+
20619 // create a better exception explanation
+
20620 JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this));
+
20621 } // cppcheck-suppress[missingReturn]
+
20622 }
+
20623 else {
+
20624 JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
+
20625 }
+
20626 }
+
20627
+
20630 const_reference at(size_type idx) const {
+
20631 // at only works for arrays
+
20632 if (JSON_HEDLEY_LIKELY(is_array())) {
+
20633 JSON_TRY
+
20634 {
+
20635 return m_data.m_value.array->at(idx);
+
20636 }
+
20637 JSON_CATCH(std::out_of_range&) {
+
20638 // create a better exception explanation
+
20639 JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this));
+
20640 } // cppcheck-suppress[missingReturn]
+
20641 }
+
20642 else {
+
20643 JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
+
20644 }
+
20645 }
+
20646
+
20649 reference at(const typename object_t::key_type& key) {
+
20650 // at only works for objects
+
20651 if (JSON_HEDLEY_UNLIKELY(!is_object())) {
+
20652 JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
+
20653 }
+
20654
+
20655 auto it = m_data.m_value.object->find(key);
+
20656 if (it == m_data.m_value.object->end()) {
+
20657 JSON_THROW(out_of_range::create(403, detail::concat("key '", key, "' not found"), this));
+
20658 }
+
20659 return set_parent(it->second);
+
20660 }
+
20661
+
20664 template<class KeyType, detail::enable_if_t<
+
20665 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>
+
20666 reference at(KeyType&& key) {
+
20667 // at only works for objects
+
20668 if (JSON_HEDLEY_UNLIKELY(!is_object())) {
+
20669 JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
+
20670 }
+
20671
+
20672 auto it = m_data.m_value.object->find(std::forward<KeyType>(key));
+
20673 if (it == m_data.m_value.object->end()) {
+
20674 JSON_THROW(out_of_range::create(403, detail::concat("key '", string_t(std::forward<KeyType>(key)), "' not found"), this));
+
20675 }
+
20676 return set_parent(it->second);
+
20677 }
+
20678
+
20681 const_reference at(const typename object_t::key_type& key) const {
+
20682 // at only works for objects
+
20683 if (JSON_HEDLEY_UNLIKELY(!is_object())) {
+
20684 JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
+
20685 }
+
20686
+
20687 auto it = m_data.m_value.object->find(key);
+
20688 if (it == m_data.m_value.object->end()) {
+
20689 JSON_THROW(out_of_range::create(403, detail::concat("key '", key, "' not found"), this));
+
20690 }
+
20691 return it->second;
+
20692 }
+
20693
+
20696 template<class KeyType, detail::enable_if_t<
+
20697 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>
+
20698 const_reference at(KeyType&& key) const {
+
20699 // at only works for objects
+
20700 if (JSON_HEDLEY_UNLIKELY(!is_object())) {
+
20701 JSON_THROW(type_error::create(304, detail::concat("cannot use at() with ", type_name()), this));
+
20702 }
+
20703
+
20704 auto it = m_data.m_value.object->find(std::forward<KeyType>(key));
+
20705 if (it == m_data.m_value.object->end()) {
+
20706 JSON_THROW(out_of_range::create(403, detail::concat("key '", string_t(std::forward<KeyType>(key)), "' not found"), this));
+
20707 }
+
20708 return it->second;
+
20709 }
+
20710
+
20713 reference operator[](size_type idx) {
+
20714 // implicitly convert a null value to an empty array
+
20715 if (is_null()) {
+
20716 m_data.m_type = value_t::array;
+
20717 m_data.m_value.array = create<array_t>();
+
20718 assert_invariant();
+
20719 }
+
20720
+
20721 // operator[] only works for arrays
+
20722 if (JSON_HEDLEY_LIKELY(is_array())) {
+
20723 // fill up the array with null values if given idx is outside the range
+
20724 if (idx >= m_data.m_value.array->size()) {
+
20725#if JSON_DIAGNOSTICS
+
20726 // remember array size & capacity before resizing
+
20727 const auto old_size = m_data.m_value.array->size();
+
20728 const auto old_capacity = m_data.m_value.array->capacity();
+
20729#endif
+
20730 m_data.m_value.array->resize(idx + 1);
+
20731
+
20732#if JSON_DIAGNOSTICS
+
20733 if (JSON_HEDLEY_UNLIKELY(m_data.m_value.array->capacity() != old_capacity)) {
+
20734 // capacity has changed: update all parents
+
20735 set_parents();
+
20736 }
+
20737 else {
+
20738 // set parent for values added above
+
20739 set_parents(begin() + static_cast<typename iterator::difference_type>(old_size), static_cast<typename iterator::difference_type>(idx + 1 - old_size));
+
20740 }
+
20741#endif
+
20742 assert_invariant();
+
20743 }
+
20744
+
20745 return m_data.m_value.array->operator[](idx);
+
20746 }
+
20747
+
20748 JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a numeric argument with ", type_name()), this));
+
20749 }
+
20750
+
20753 const_reference operator[](size_type idx) const {
+
20754 // const operator[] only works for arrays
+
20755 if (JSON_HEDLEY_LIKELY(is_array())) {
+
20756 return m_data.m_value.array->operator[](idx);
+
20757 }
+
20758
+
20759 JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a numeric argument with ", type_name()), this));
+
20760 }
+
20761
+
20764 reference operator[](typename object_t::key_type key) // NOLINT(performance-unnecessary-value-param)
+
20765 {
+
20766 // implicitly convert a null value to an empty object
+
20767 if (is_null()) {
+
20768 m_data.m_type = value_t::object;
+
20769 m_data.m_value.object = create<object_t>();
+
20770 assert_invariant();
+
20771 }
+
20772
+
20773 // operator[] only works for objects
+
20774 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20775 auto result = m_data.m_value.object->emplace(std::move(key), nullptr);
+
20776 return set_parent(result.first->second);
+
20777 }
+
20778
+
20779 JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this));
+
20780 }
+
20781
+
20784 const_reference operator[](const typename object_t::key_type& key) const {
+
20785 // const operator[] only works for objects
+
20786 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20787 auto it = m_data.m_value.object->find(key);
+
20788 JSON_ASSERT(it != m_data.m_value.object->end());
+
20789 return it->second;
+
20790 }
+
20791
+
20792 JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this));
+
20793 }
+
20794
+
20795 // these two functions resolve a (const) char * ambiguity affecting Clang and MSVC
+
20796 // (they seemingly cannot be constrained to resolve the ambiguity)
+
20797 template<typename T>
+
20798 reference operator[](T* key) {
+
20799 return operator[](typename object_t::key_type(key));
+
20800 }
+
20801
+
20802 template<typename T>
+
20803 const_reference operator[](T* key) const {
+
20804 return operator[](typename object_t::key_type(key));
+
20805 }
+
20806
+
20809 template<class KeyType, detail::enable_if_t<
+
20810 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int > = 0 >
+
20811 reference operator[](KeyType&& key) {
+
20812 // implicitly convert a null value to an empty object
+
20813 if (is_null()) {
+
20814 m_data.m_type = value_t::object;
+
20815 m_data.m_value.object = create<object_t>();
+
20816 assert_invariant();
+
20817 }
+
20818
+
20819 // operator[] only works for objects
+
20820 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20821 auto result = m_data.m_value.object->emplace(std::forward<KeyType>(key), nullptr);
+
20822 return set_parent(result.first->second);
+
20823 }
+
20824
+
20825 JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this));
+
20826 }
+
20827
+
20830 template<class KeyType, detail::enable_if_t<
+
20831 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int > = 0 >
+
20832 const_reference operator[](KeyType&& key) const {
+
20833 // const operator[] only works for objects
+
20834 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20835 auto it = m_data.m_value.object->find(std::forward<KeyType>(key));
+
20836 JSON_ASSERT(it != m_data.m_value.object->end());
+
20837 return it->second;
+
20838 }
+
20839
+
20840 JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this));
+
20841 }
+
20842
+
20843private:
+
20844 template<typename KeyType>
+
20845 using is_comparable_with_object_key = detail::is_comparable <
+
20846 object_comparator_t, const typename object_t::key_type&, KeyType >;
+
20847
+
20848 template<typename ValueType>
+
20849 using value_return_type = std::conditional <
+
20850 detail::is_c_string_uncvref<ValueType>::value,
+
20851 string_t, typename std::decay<ValueType>::type >;
+
20852
+
20853public:
+
20856 template < class ValueType, detail::enable_if_t <
+ +
20858 && detail::is_getable<basic_json_t, ValueType>::value
+
20859 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >
+
20860 ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const {
+
20861 // value only works for objects
+
20862 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20863 // If 'key' is found, return its value. Otherwise, return `default_value'.
+
20864 const auto it = find(key);
+
20865 if (it != end()) {
+
20866 return it->template get<ValueType>();
+
20867 }
+
20868
+
20869 return default_value;
+
20870 }
+
20871
+
20872 JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this));
+
20873 }
+
20874
+
20877 template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type,
+
20878 detail::enable_if_t <
+ +
20880 && detail::is_getable<basic_json_t, ReturnType>::value
+
20881 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >
+
20882 ReturnType value(const typename object_t::key_type& key, ValueType&& default_value) const {
+
20883 // value only works for objects
+
20884 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20885 // If 'key' is found, return its value. Otherwise, return `default_value'.
+
20886 const auto it = find(key);
+
20887 if (it != end()) {
+
20888 return it->template get<ReturnType>();
+
20889 }
+
20890
+
20891 return std::forward<ValueType>(default_value);
+
20892 }
+
20893
+
20894 JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this));
+
20895 }
+
20896
+
20899 template < class ValueType, class KeyType, detail::enable_if_t <
+ +
20901 && !detail::is_json_pointer<KeyType>::value
+
20902 && is_comparable_with_object_key<KeyType>::value
+
20903 && detail::is_getable<basic_json_t, ValueType>::value
+
20904 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >
+
20905 ValueType value(KeyType&& key, const ValueType& default_value) const {
+
20906 // value only works for objects
+
20907 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20908 // If 'key' is found, return its value. Otherwise, return `default_value'.
+
20909 const auto it = find(std::forward<KeyType>(key));
+
20910 if (it != end()) {
+
20911 return it->template get<ValueType>();
+
20912 }
+
20913
+
20914 return default_value;
+
20915 }
+
20916
+
20917 JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this));
+
20918 }
+
20919
+
20922 template < class ValueType, class KeyType, class ReturnType = typename value_return_type<ValueType>::type,
+
20923 detail::enable_if_t <
+ +
20925 && !detail::is_json_pointer<KeyType>::value
+
20926 && is_comparable_with_object_key<KeyType>::value
+
20927 && detail::is_getable<basic_json_t, ReturnType>::value
+
20928 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >
+
20929 ReturnType value(KeyType&& key, ValueType&& default_value) const {
+
20930 // value only works for objects
+
20931 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20932 // If 'key' is found, return its value. Otherwise, return `default_value'.
+
20933 const auto it = find(std::forward<KeyType>(key));
+
20934 if (it != end()) {
+
20935 return it->template get<ReturnType>();
+
20936 }
+
20937
+
20938 return std::forward<ValueType>(default_value);
+
20939 }
+
20940
+
20941 JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this));
+
20942 }
+
20943
+
20946 template < class ValueType, detail::enable_if_t <
+
20947 detail::is_getable<basic_json_t, ValueType>::value
+
20948 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >
+
20949 ValueType value(const json_pointer& ptr, const ValueType& default_value) const {
+
20950 // value only works for objects
+
20951 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20952 // If the pointer resolves to a value, return it. Otherwise, return
+
20953 // 'default_value'.
+
20954 JSON_TRY
+
20955 {
+
20956 return ptr.get_checked(this).template get<ValueType>();
+
20957 }
+
20958 JSON_INTERNAL_CATCH(out_of_range&) {
+
20959 return default_value;
+
20960 }
+
20961 }
+
20962
+
20963 JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this));
+
20964 }
+
20965
+
20968 template < class ValueType, class ReturnType = typename value_return_type<ValueType>::type,
+
20969 detail::enable_if_t <
+
20970 detail::is_getable<basic_json_t, ReturnType>::value
+
20971 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >
+
20972 ReturnType value(const json_pointer& ptr, ValueType&& default_value) const {
+
20973 // value only works for objects
+
20974 if (JSON_HEDLEY_LIKELY(is_object())) {
+
20975 // If the pointer resolves to a value, return it. Otherwise, return
+
20976 // 'default_value'.
+
20977 JSON_TRY
+
20978 {
+
20979 return ptr.get_checked(this).template get<ReturnType>();
+
20980 }
+
20981 JSON_INTERNAL_CATCH(out_of_range&) {
+
20982 return std::forward<ValueType>(default_value);
+
20983 }
+
20984 }
+
20985
+
20986 JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this));
+
20987 }
+
20988
+
20989 template < class ValueType, class BasicJsonType, detail::enable_if_t <
+ +
20991 && detail::is_getable<basic_json_t, ValueType>::value
+
20992 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >
+
20993 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)
+
20994 ValueType value(const ::nlohmann::json_pointer<BasicJsonType>& ptr, const ValueType& default_value) const {
+
20995 return value(ptr.convert(), default_value);
+
20996 }
+
20997
+
20998 template < class ValueType, class BasicJsonType, class ReturnType = typename value_return_type<ValueType>::type,
+
20999 detail::enable_if_t <
+ +
21001 && detail::is_getable<basic_json_t, ReturnType>::value
+
21002 && !std::is_same<value_t, detail::uncvref_t<ValueType>>::value, int > = 0 >
+
21003 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)
+
21004 ReturnType value(const ::nlohmann::json_pointer<BasicJsonType>& ptr, ValueType&& default_value) const {
+
21005 return value(ptr.convert(), std::forward<ValueType>(default_value));
+
21006 }
+
21007
+
21010 reference front() {
+
21011 return *begin();
+
21012 }
+
21013
+
21016 const_reference front() const {
+
21017 return *cbegin();
+
21018 }
+
21019
+
21022 reference back() {
+
21023 auto tmp = end();
+
21024 --tmp;
+
21025 return *tmp;
+
21026 }
+
21027
+
21030 const_reference back() const {
+
21031 auto tmp = cend();
+
21032 --tmp;
+
21033 return *tmp;
+
21034 }
+
21035
+
21038 template < class IteratorType, detail::enable_if_t <
+
21039 std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
+
21040 std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int > = 0 >
+
21041 IteratorType erase(IteratorType pos) // NOLINT(performance-unnecessary-value-param)
+
21042 {
+
21043 // make sure the iterator fits the current value
+
21044 if (JSON_HEDLEY_UNLIKELY(this != pos.m_object)) {
+
21045 JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this));
+
21046 }
+
21047
+
21048 IteratorType result = end();
+
21049
+
21050 switch (m_data.m_type) {
+
21051 case value_t::boolean:
+
21052 case value_t::number_float:
+
21053 case value_t::number_integer:
+
21054 case value_t::number_unsigned:
+
21055 case value_t::string:
+
21056 case value_t::binary:
+
21057 {
+
21058 if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin())) {
+
21059 JSON_THROW(invalid_iterator::create(205, "iterator out of range", this));
+
21060 }
+
21061
+
21062 if (is_string()) {
+
21063 AllocatorType<string_t> alloc;
+
21064 std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.string);
+
21065 std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.string, 1);
+
21066 m_data.m_value.string = nullptr;
+
21067 }
+
21068 else if (is_binary()) {
+
21069 AllocatorType<binary_t> alloc;
+
21070 std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.binary);
+
21071 std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.binary, 1);
+
21072 m_data.m_value.binary = nullptr;
+
21073 }
+
21074
+
21075 m_data.m_type = value_t::null;
+
21076 assert_invariant();
+
21077 break;
+
21078 }
+
21079
+
21080 case value_t::object:
+
21081 {
+
21082 result.m_it.object_iterator = m_data.m_value.object->erase(pos.m_it.object_iterator);
+
21083 break;
+
21084 }
+
21085
+
21086 case value_t::array:
+
21087 {
+
21088 result.m_it.array_iterator = m_data.m_value.array->erase(pos.m_it.array_iterator);
+
21089 break;
+
21090 }
+
21091
+
21092 case value_t::null:
+
21093 case value_t::discarded:
+
21094 default:
+
21095 JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this));
+
21096 }
+
21097
+
21098 return result;
+
21099 }
+
21100
+
21103 template < class IteratorType, detail::enable_if_t <
+
21104 std::is_same<IteratorType, typename basic_json_t::iterator>::value ||
+
21105 std::is_same<IteratorType, typename basic_json_t::const_iterator>::value, int > = 0 >
+
21106 IteratorType erase(IteratorType first, IteratorType last) // NOLINT(performance-unnecessary-value-param)
+
21107 {
+
21108 // make sure the iterator fits the current value
+
21109 if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object)) {
+
21110 JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value", this));
+
21111 }
+
21112
+
21113 IteratorType result = end();
+
21114
+
21115 switch (m_data.m_type) {
+
21116 case value_t::boolean:
+
21117 case value_t::number_float:
+
21118 case value_t::number_integer:
+
21119 case value_t::number_unsigned:
+
21120 case value_t::string:
+
21121 case value_t::binary:
+
21122 {
+
21123 if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin()
+
21124 || !last.m_it.primitive_iterator.is_end())) {
+
21125 JSON_THROW(invalid_iterator::create(204, "iterators out of range", this));
+
21126 }
+
21127
+
21128 if (is_string()) {
+
21129 AllocatorType<string_t> alloc;
+
21130 std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.string);
+
21131 std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.string, 1);
+
21132 m_data.m_value.string = nullptr;
+
21133 }
+
21134 else if (is_binary()) {
+
21135 AllocatorType<binary_t> alloc;
+
21136 std::allocator_traits<decltype(alloc)>::destroy(alloc, m_data.m_value.binary);
+
21137 std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_data.m_value.binary, 1);
+
21138 m_data.m_value.binary = nullptr;
+
21139 }
+
21140
+
21141 m_data.m_type = value_t::null;
+
21142 assert_invariant();
+
21143 break;
+
21144 }
+
21145
+
21146 case value_t::object:
+
21147 {
+
21148 result.m_it.object_iterator = m_data.m_value.object->erase(first.m_it.object_iterator,
+
21149 last.m_it.object_iterator);
+
21150 break;
+
21151 }
+
21152
+
21153 case value_t::array:
+
21154 {
+
21155 result.m_it.array_iterator = m_data.m_value.array->erase(first.m_it.array_iterator,
+
21156 last.m_it.array_iterator);
+
21157 break;
+
21158 }
+
21159
+
21160 case value_t::null:
+
21161 case value_t::discarded:
+
21162 default:
+
21163 JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this));
+
21164 }
+
21165
+
21166 return result;
+
21167 }
+
21168
+
21169private:
+
21170 template < typename KeyType, detail::enable_if_t <
+
21171 detail::has_erase_with_key_type<basic_json_t, KeyType>::value, int > = 0 >
+
21172 size_type erase_internal(KeyType&& key) {
+
21173 // this erase only works for objects
+
21174 if (JSON_HEDLEY_UNLIKELY(!is_object())) {
+
21175 JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this));
+
21176 }
+
21177
+
21178 return m_data.m_value.object->erase(std::forward<KeyType>(key));
+
21179 }
+
21180
+
21181 template < typename KeyType, detail::enable_if_t <
+
21182 !detail::has_erase_with_key_type<basic_json_t, KeyType>::value, int > = 0 >
+
21183 size_type erase_internal(KeyType&& key) {
+
21184 // this erase only works for objects
+
21185 if (JSON_HEDLEY_UNLIKELY(!is_object())) {
+
21186 JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this));
+
21187 }
+
21188
+
21189 const auto it = m_data.m_value.object->find(std::forward<KeyType>(key));
+
21190 if (it != m_data.m_value.object->end()) {
+
21191 m_data.m_value.object->erase(it);
+
21192 return 1;
+
21193 }
+
21194 return 0;
+
21195 }
+
21196
+
21197public:
+
21198
+
21201 size_type erase(const typename object_t::key_type& key) {
+
21202 // the indirection via erase_internal() is added to avoid making this
+
21203 // function a template and thus de-rank it during overload resolution
+
21204 return erase_internal(key);
+
21205 }
+
21206
+
21209 template<class KeyType, detail::enable_if_t<
+
21210 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>
+
21211 size_type erase(KeyType&& key) {
+
21212 return erase_internal(std::forward<KeyType>(key));
+
21213 }
+
21214
+
21217 void erase(const size_type idx) {
+
21218 // this erase only works for arrays
+
21219 if (JSON_HEDLEY_LIKELY(is_array())) {
+
21220 if (JSON_HEDLEY_UNLIKELY(idx >= size())) {
+
21221 JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), this));
+
21222 }
+
21223
+
21224 m_data.m_value.array->erase(m_data.m_value.array->begin() + static_cast<difference_type>(idx));
+
21225 }
+
21226 else {
+
21227 JSON_THROW(type_error::create(307, detail::concat("cannot use erase() with ", type_name()), this));
+
21228 }
+
21229 }
+
21230
+
21232
+
21234 // lookup //
+
21236
+
21239
+
21242 iterator find(const typename object_t::key_type& key) {
+
21243 auto result = end();
+
21244
+
21245 if (is_object()) {
+
21246 result.m_it.object_iterator = m_data.m_value.object->find(key);
+
21247 }
+
21248
+
21249 return result;
+
21250 }
+
21251
+
21254 const_iterator find(const typename object_t::key_type& key) const {
+
21255 auto result = cend();
+
21256
+
21257 if (is_object()) {
+
21258 result.m_it.object_iterator = m_data.m_value.object->find(key);
+
21259 }
+
21260
+
21261 return result;
+
21262 }
+
21263
+
21266 template<class KeyType, detail::enable_if_t<
+
21267 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>
+
21268 iterator find(KeyType&& key) {
+
21269 auto result = end();
+
21270
+
21271 if (is_object()) {
+
21272 result.m_it.object_iterator = m_data.m_value.object->find(std::forward<KeyType>(key));
+
21273 }
+
21274
+
21275 return result;
+
21276 }
+
21277
+
21280 template<class KeyType, detail::enable_if_t<
+
21281 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>
+
21282 const_iterator find(KeyType&& key) const {
+
21283 auto result = cend();
+
21284
+
21285 if (is_object()) {
+
21286 result.m_it.object_iterator = m_data.m_value.object->find(std::forward<KeyType>(key));
+
21287 }
+
21288
+
21289 return result;
+
21290 }
+
21291
+
21294 size_type count(const typename object_t::key_type& key) const {
+
21295 // return 0 for all nonobject types
+
21296 return is_object() ? m_data.m_value.object->count(key) : 0;
+
21297 }
+
21298
+
21301 template<class KeyType, detail::enable_if_t<
+
21302 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>
+
21303 size_type count(KeyType&& key) const {
+
21304 // return 0 for all nonobject types
+
21305 return is_object() ? m_data.m_value.object->count(std::forward<KeyType>(key)) : 0;
+
21306 }
+
21307
+
21310 bool contains(const typename object_t::key_type& key) const {
+
21311 return is_object() && m_data.m_value.object->find(key) != m_data.m_value.object->end();
+
21312 }
+
21313
+
21316 template<class KeyType, detail::enable_if_t<
+
21317 detail::is_usable_as_basic_json_key_type<basic_json_t, KeyType>::value, int> = 0>
+
21318 bool contains(KeyType&& key) const {
+
21319 return is_object() && m_data.m_value.object->find(std::forward<KeyType>(key)) != m_data.m_value.object->end();
+
21320 }
+
21321
+
21324 bool contains(const json_pointer& ptr) const {
+
21325 return ptr.contains(this);
+
21326 }
+
21327
+
21328 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>
+
21329 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)
+
21330 bool contains(const typename ::nlohmann::json_pointer<BasicJsonType>& ptr) const {
+
21331 return ptr.contains(this);
+
21332 }
+
21333
+
21335
+
21337 // iterators //
+
21339
+
21342
+
21345 iterator begin() noexcept {
+
21346 iterator result(this);
+
21347 result.set_begin();
+
21348 return result;
+
21349 }
+
21350
+
21353 const_iterator begin() const noexcept {
+
21354 return cbegin();
+
21355 }
+
21356
+
21359 const_iterator cbegin() const noexcept {
+
21360 const_iterator result(this);
+
21361 result.set_begin();
+
21362 return result;
+
21363 }
+
21364
+
21367 iterator end() noexcept {
+
21368 iterator result(this);
+
21369 result.set_end();
+
21370 return result;
+
21371 }
+
21372
+
21375 const_iterator end() const noexcept {
+
21376 return cend();
+
21377 }
+
21378
+
21381 const_iterator cend() const noexcept {
+
21382 const_iterator result(this);
+
21383 result.set_end();
+
21384 return result;
+
21385 }
+
21386
+
21389 reverse_iterator rbegin() noexcept {
+
21390 return reverse_iterator(end());
+
21391 }
+
21392
+
21395 const_reverse_iterator rbegin() const noexcept {
+
21396 return crbegin();
+
21397 }
+
21398
+
21401 reverse_iterator rend() noexcept {
+
21402 return reverse_iterator(begin());
+
21403 }
+
21404
+
21407 const_reverse_iterator rend() const noexcept {
+
21408 return crend();
+
21409 }
+
21410
+
21413 const_reverse_iterator crbegin() const noexcept {
+
21414 return const_reverse_iterator(cend());
+
21415 }
+
21416
+
21419 const_reverse_iterator crend() const noexcept {
+
21420 return const_reverse_iterator(cbegin());
+
21421 }
+
21422
+
21423public:
+
21429 JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())
+
21430 static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept {
+
21431 return ref.items();
+
21432 }
+
21433
+
21439 JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())
+
21440 static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept {
+
21441 return ref.items();
+
21442 }
+
21443
+
21446 iteration_proxy<iterator> items() noexcept {
+
21447 return iteration_proxy<iterator>(*this);
+
21448 }
+
21449
+
21452 iteration_proxy<const_iterator> items() const noexcept {
+
21453 return iteration_proxy<const_iterator>(*this);
+
21454 }
+
21455
+
21457
+
21459 // capacity //
+
21461
+
21464
+
21467 bool empty() const noexcept {
+
21468 switch (m_data.m_type) {
+
21469 case value_t::null:
+
21470 {
+
21471 // null values are empty
+
21472 return true;
+
21473 }
+
21474
+
21475 case value_t::array:
+
21476 {
+
21477 // delegate call to array_t::empty()
+
21478 return m_data.m_value.array->empty();
+
21479 }
+
21480
+
21481 case value_t::object:
+
21482 {
+
21483 // delegate call to object_t::empty()
+
21484 return m_data.m_value.object->empty();
+
21485 }
+
21486
+
21487 case value_t::string:
+
21488 case value_t::boolean:
+
21489 case value_t::number_integer:
+
21490 case value_t::number_unsigned:
+
21491 case value_t::number_float:
+
21492 case value_t::binary:
+
21493 case value_t::discarded:
+
21494 default:
+
21495 {
+
21496 // all other types are nonempty
+
21497 return false;
+
21498 }
+
21499 }
+
21500 }
+
21501
+
21504 size_type size() const noexcept {
+
21505 switch (m_data.m_type) {
+
21506 case value_t::null:
+
21507 {
+
21508 // null values are empty
+
21509 return 0;
+
21510 }
+
21511
+
21512 case value_t::array:
+
21513 {
+
21514 // delegate call to array_t::size()
+
21515 return m_data.m_value.array->size();
+
21516 }
+
21517
+
21518 case value_t::object:
+
21519 {
+
21520 // delegate call to object_t::size()
+
21521 return m_data.m_value.object->size();
+
21522 }
+
21523
+
21524 case value_t::string:
+
21525 case value_t::boolean:
+
21526 case value_t::number_integer:
+
21527 case value_t::number_unsigned:
+
21528 case value_t::number_float:
+
21529 case value_t::binary:
+
21530 case value_t::discarded:
+
21531 default:
+
21532 {
+
21533 // all other types have size 1
+
21534 return 1;
+
21535 }
+
21536 }
+
21537 }
+
21538
+
21541 size_type max_size() const noexcept {
+
21542 switch (m_data.m_type) {
+
21543 case value_t::array:
+
21544 {
+
21545 // delegate call to array_t::max_size()
+
21546 return m_data.m_value.array->max_size();
+
21547 }
+
21548
+
21549 case value_t::object:
+
21550 {
+
21551 // delegate call to object_t::max_size()
+
21552 return m_data.m_value.object->max_size();
+
21553 }
+
21554
+
21555 case value_t::null:
+
21556 case value_t::string:
+
21557 case value_t::boolean:
+
21558 case value_t::number_integer:
+
21559 case value_t::number_unsigned:
+
21560 case value_t::number_float:
+
21561 case value_t::binary:
+
21562 case value_t::discarded:
+
21563 default:
+
21564 {
+
21565 // all other types have max_size() == size()
+
21566 return size();
+
21567 }
+
21568 }
+
21569 }
+
21570
+
21572
+
21574 // modifiers //
+
21576
+
21579
+
21582 void clear() noexcept {
+
21583 switch (m_data.m_type) {
+
21584 case value_t::number_integer:
+
21585 {
+
21586 m_data.m_value.number_integer = 0;
+
21587 break;
+
21588 }
+
21589
+
21590 case value_t::number_unsigned:
+
21591 {
+
21592 m_data.m_value.number_unsigned = 0;
+
21593 break;
+
21594 }
+
21595
+
21596 case value_t::number_float:
+
21597 {
+
21598 m_data.m_value.number_float = 0.0;
+
21599 break;
+
21600 }
+
21601
+
21602 case value_t::boolean:
+
21603 {
+
21604 m_data.m_value.boolean = false;
+
21605 break;
+
21606 }
+
21607
+
21608 case value_t::string:
+
21609 {
+
21610 m_data.m_value.string->clear();
+
21611 break;
+
21612 }
+
21613
+
21614 case value_t::binary:
+
21615 {
+
21616 m_data.m_value.binary->clear();
+
21617 break;
+
21618 }
+
21619
+
21620 case value_t::array:
+
21621 {
+
21622 m_data.m_value.array->clear();
+
21623 break;
+
21624 }
+
21625
+
21626 case value_t::object:
+
21627 {
+
21628 m_data.m_value.object->clear();
+
21629 break;
+
21630 }
+
21631
+
21632 case value_t::null:
+
21633 case value_t::discarded:
+
21634 default:
+
21635 break;
+
21636 }
+
21637 }
+
21638
+
21641 void push_back(basic_json&& val) {
+
21642 // push_back only works for null objects or arrays
+
21643 if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) {
+
21644 JSON_THROW(type_error::create(308, detail::concat("cannot use push_back() with ", type_name()), this));
+
21645 }
+
21646
+
21647 // transform a null object into an array
+
21648 if (is_null()) {
+
21649 m_data.m_type = value_t::array;
+
21650 m_data.m_value = value_t::array;
+
21651 assert_invariant();
+
21652 }
+
21653
+
21654 // add the element to the array (move semantics)
+
21655 const auto old_capacity = m_data.m_value.array->capacity();
+
21656 m_data.m_value.array->push_back(std::move(val));
+
21657 set_parent(m_data.m_value.array->back(), old_capacity);
+
21658 // if val is moved from, basic_json move constructor marks it null, so we do not call the destructor
+
21659 }
+
21660
+
21663 reference operator+=(basic_json&& val) {
+
21664 push_back(std::move(val));
+
21665 return *this;
+
21666 }
+
21667
+
21670 void push_back(const basic_json& val) {
+
21671 // push_back only works for null objects or arrays
+
21672 if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) {
+
21673 JSON_THROW(type_error::create(308, detail::concat("cannot use push_back() with ", type_name()), this));
+
21674 }
+
21675
+
21676 // transform a null object into an array
+
21677 if (is_null()) {
+
21678 m_data.m_type = value_t::array;
+
21679 m_data.m_value = value_t::array;
+
21680 assert_invariant();
+
21681 }
+
21682
+
21683 // add the element to the array
+
21684 const auto old_capacity = m_data.m_value.array->capacity();
+
21685 m_data.m_value.array->push_back(val);
+
21686 set_parent(m_data.m_value.array->back(), old_capacity);
+
21687 }
+
21688
+
21691 reference operator+=(const basic_json& val) {
+
21692 push_back(val);
+
21693 return *this;
+
21694 }
+
21695
+
21698 void push_back(const typename object_t::value_type& val) {
+
21699 // push_back only works for null objects or objects
+
21700 if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) {
+
21701 JSON_THROW(type_error::create(308, detail::concat("cannot use push_back() with ", type_name()), this));
+
21702 }
+
21703
+
21704 // transform a null object into an object
+
21705 if (is_null()) {
+
21706 m_data.m_type = value_t::object;
+
21707 m_data.m_value = value_t::object;
+
21708 assert_invariant();
+
21709 }
+
21710
+
21711 // add the element to the object
+
21712 auto res = m_data.m_value.object->insert(val);
+
21713 set_parent(res.first->second);
+
21714 }
+
21715
+
21718 reference operator+=(const typename object_t::value_type& val) {
+
21719 push_back(val);
+
21720 return *this;
+
21721 }
+
21722
+
21725 void push_back(initializer_list_t init) {
+
21726 if (is_object() && init.size() == 2 && (*init.begin())->is_string()) {
+
21727 basic_json&& key = init.begin()->moved_or_copied();
+
21728 push_back(typename object_t::value_type(
+
21729 std::move(key.get_ref<string_t&>()), (init.begin() + 1)->moved_or_copied()));
+
21730 }
+
21731 else {
+
21732 push_back(basic_json(init));
+
21733 }
+
21734 }
+
21735
+
21738 reference operator+=(initializer_list_t init) {
+
21739 push_back(init);
+
21740 return *this;
+
21741 }
+
21742
+
21745 template<class... Args>
+
21746 reference emplace_back(Args&& ... args) {
+
21747 // emplace_back only works for null objects or arrays
+
21748 if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) {
+
21749 JSON_THROW(type_error::create(311, detail::concat("cannot use emplace_back() with ", type_name()), this));
+
21750 }
+
21751
+
21752 // transform a null object into an array
+
21753 if (is_null()) {
+
21754 m_data.m_type = value_t::array;
+
21755 m_data.m_value = value_t::array;
+
21756 assert_invariant();
+
21757 }
+
21758
+
21759 // add the element to the array (perfect forwarding)
+
21760 const auto old_capacity = m_data.m_value.array->capacity();
+
21761 m_data.m_value.array->emplace_back(std::forward<Args>(args)...);
+
21762 return set_parent(m_data.m_value.array->back(), old_capacity);
+
21763 }
+
21764
+
21767 template<class... Args>
+
21768 std::pair<iterator, bool> emplace(Args&& ... args) {
+
21769 // emplace only works for null objects or arrays
+
21770 if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) {
+
21771 JSON_THROW(type_error::create(311, detail::concat("cannot use emplace() with ", type_name()), this));
+
21772 }
+
21773
+
21774 // transform a null object into an object
+
21775 if (is_null()) {
+
21776 m_data.m_type = value_t::object;
+
21777 m_data.m_value = value_t::object;
+
21778 assert_invariant();
+
21779 }
+
21780
+
21781 // add the element to the array (perfect forwarding)
+
21782 auto res = m_data.m_value.object->emplace(std::forward<Args>(args)...);
+
21783 set_parent(res.first->second);
+
21784
+
21785 // create a result iterator and set iterator to the result of emplace
+
21786 auto it = begin();
+
21787 it.m_it.object_iterator = res.first;
+
21788
+
21789 // return pair of iterator and boolean
+
21790 return { it, res.second };
+
21791 }
+
21792
+
21796 template<typename... Args>
+
21797 iterator insert_iterator(const_iterator pos, Args&& ... args) // NOLINT(performance-unnecessary-value-param)
+
21798 {
+
21799 iterator result(this);
+
21800 JSON_ASSERT(m_data.m_value.array != nullptr);
+
21801
+
21802 auto insert_pos = std::distance(m_data.m_value.array->begin(), pos.m_it.array_iterator);
+
21803 m_data.m_value.array->insert(pos.m_it.array_iterator, std::forward<Args>(args)...);
+
21804 result.m_it.array_iterator = m_data.m_value.array->begin() + insert_pos;
+
21805
+
21806 // This could have been written as:
+
21807 // result.m_it.array_iterator = m_data.m_value.array->insert(pos.m_it.array_iterator, cnt, val);
+
21808 // but the return value of insert is missing in GCC 4.8, so it is written this way instead.
+
21809
+
21810 set_parents();
+
21811 return result;
+
21812 }
+
21813
+
21816 iterator insert(const_iterator pos, const basic_json& val) // NOLINT(performance-unnecessary-value-param)
+
21817 {
+
21818 // insert only works for arrays
+
21819 if (JSON_HEDLEY_LIKELY(is_array())) {
+
21820 // check if iterator pos fits to this JSON value
+
21821 if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) {
+
21822 JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this));
+
21823 }
+
21824
+
21825 // insert to array and return iterator
+
21826 return insert_iterator(pos, val);
+
21827 }
+
21828
+
21829 JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this));
+
21830 }
+
21831
+
21834 iterator insert(const_iterator pos, basic_json&& val) // NOLINT(performance-unnecessary-value-param)
+
21835 {
+
21836 return insert(pos, val);
+
21837 }
+
21838
+
21841 iterator insert(const_iterator pos, size_type cnt, const basic_json& val) // NOLINT(performance-unnecessary-value-param)
+
21842 {
+
21843 // insert only works for arrays
+
21844 if (JSON_HEDLEY_LIKELY(is_array())) {
+
21845 // check if iterator pos fits to this JSON value
+
21846 if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) {
+
21847 JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this));
+
21848 }
+
21849
+
21850 // insert to array and return iterator
+
21851 return insert_iterator(pos, cnt, val);
+
21852 }
+
21853
+
21854 JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this));
+
21855 }
+
21856
+
21859 iterator insert(const_iterator pos, const_iterator first, const_iterator last) // NOLINT(performance-unnecessary-value-param)
+
21860 {
+
21861 // insert only works for arrays
+
21862 if (JSON_HEDLEY_UNLIKELY(!is_array())) {
+
21863 JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this));
+
21864 }
+
21865
+
21866 // check if iterator pos fits to this JSON value
+
21867 if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) {
+
21868 JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this));
+
21869 }
+
21870
+
21871 // check if range iterators belong to the same JSON object
+
21872 if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) {
+
21873 JSON_THROW(invalid_iterator::create(210, "iterators do not fit", this));
+
21874 }
+
21875
+
21876 if (JSON_HEDLEY_UNLIKELY(first.m_object == this)) {
+
21877 JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container", this));
+
21878 }
+
21879
+
21880 // insert to array and return iterator
+
21881 return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator);
+
21882 }
+
21883
+
21886 iterator insert(const_iterator pos, initializer_list_t ilist) // NOLINT(performance-unnecessary-value-param)
+
21887 {
+
21888 // insert only works for arrays
+
21889 if (JSON_HEDLEY_UNLIKELY(!is_array())) {
+
21890 JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this));
+
21891 }
+
21892
+
21893 // check if iterator pos fits to this JSON value
+
21894 if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) {
+
21895 JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value", this));
+
21896 }
+
21897
+
21898 // insert to array and return iterator
+
21899 return insert_iterator(pos, ilist.begin(), ilist.end());
+
21900 }
+
21901
+
21904 void insert(const_iterator first, const_iterator last) // NOLINT(performance-unnecessary-value-param)
+
21905 {
+
21906 // insert only works for objects
+
21907 if (JSON_HEDLEY_UNLIKELY(!is_object())) {
+
21908 JSON_THROW(type_error::create(309, detail::concat("cannot use insert() with ", type_name()), this));
+
21909 }
+
21910
+
21911 // check if range iterators belong to the same JSON object
+
21912 if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) {
+
21913 JSON_THROW(invalid_iterator::create(210, "iterators do not fit", this));
+
21914 }
+
21915
+
21916 // passed iterators must belong to objects
+
21917 if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) {
+
21918 JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects", this));
+
21919 }
+
21920
+
21921 m_data.m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator);
+
21922 set_parents();
+
21923 }
+
21924
+
21927 void update(const_reference j, bool merge_objects = false) {
+
21928 update(j.begin(), j.end(), merge_objects);
+
21929 }
+
21930
+
21933 void update(const_iterator first, const_iterator last, bool merge_objects = false) // NOLINT(performance-unnecessary-value-param)
+
21934 {
+
21935 // implicitly convert a null value to an empty object
+
21936 if (is_null()) {
+
21937 m_data.m_type = value_t::object;
+
21938 m_data.m_value.object = create<object_t>();
+
21939 assert_invariant();
+
21940 }
+
21941
+
21942 if (JSON_HEDLEY_UNLIKELY(!is_object())) {
+
21943 JSON_THROW(type_error::create(312, detail::concat("cannot use update() with ", type_name()), this));
+
21944 }
+
21945
+
21946 // check if range iterators belong to the same JSON object
+
21947 if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) {
+
21948 JSON_THROW(invalid_iterator::create(210, "iterators do not fit", this));
+
21949 }
+
21950
+
21951 // passed iterators must belong to objects
+
21952 if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) {
+
21953 JSON_THROW(type_error::create(312, detail::concat("cannot use update() with ", first.m_object->type_name()), first.m_object));
+
21954 }
+
21955
+
21956 for (auto it = first; it != last; ++it) {
+
21957 if (merge_objects && it.value().is_object()) {
+
21958 auto it2 = m_data.m_value.object->find(it.key());
+
21959 if (it2 != m_data.m_value.object->end()) {
+
21960 it2->second.update(it.value(), true);
+
21961 continue;
+
21962 }
+
21963 }
+
21964 m_data.m_value.object->operator[](it.key()) = it.value();
+
21965#if JSON_DIAGNOSTICS
+
21966 m_data.m_value.object->operator[](it.key()).m_parent = this;
+
21967#endif
+
21968 }
+
21969 }
+
21970
+
21973 void swap(reference other) noexcept (
+
21974 std::is_nothrow_move_constructible<value_t>::value&&
+
21975 std::is_nothrow_move_assignable<value_t>::value&&
+
21976 std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
+
21977 std::is_nothrow_move_assignable<json_value>::value
+
21978 ) {
+
21979 std::swap(m_data.m_type, other.m_data.m_type);
+
21980 std::swap(m_data.m_value, other.m_data.m_value);
+
21981
+
21982 set_parents();
+
21983 other.set_parents();
+
21984 assert_invariant();
+
21985 }
+
21986
+
21989 friend void swap(reference left, reference right) noexcept (
+
21990 std::is_nothrow_move_constructible<value_t>::value&&
+
21991 std::is_nothrow_move_assignable<value_t>::value&&
+
21992 std::is_nothrow_move_constructible<json_value>::value&& // NOLINT(cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
+
21993 std::is_nothrow_move_assignable<json_value>::value
+
21994 ) {
+
21995 left.swap(right);
+
21996 }
+
21997
+
22000 void swap(array_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
+
22001 {
+
22002 // swap only works for arrays
+
22003 if (JSON_HEDLEY_LIKELY(is_array())) {
+
22004 using std::swap;
+
22005 swap(*(m_data.m_value.array), other);
+
22006 }
+
22007 else {
+
22008 JSON_THROW(type_error::create(310, detail::concat("cannot use swap(array_t&) with ", type_name()), this));
+
22009 }
+
22010 }
+
22011
+
22014 void swap(object_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
+
22015 {
+
22016 // swap only works for objects
+
22017 if (JSON_HEDLEY_LIKELY(is_object())) {
+
22018 using std::swap;
+
22019 swap(*(m_data.m_value.object), other);
+
22020 }
+
22021 else {
+
22022 JSON_THROW(type_error::create(310, detail::concat("cannot use swap(object_t&) with ", type_name()), this));
+
22023 }
+
22024 }
+
22025
+
22028 void swap(string_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
+
22029 {
+
22030 // swap only works for strings
+
22031 if (JSON_HEDLEY_LIKELY(is_string())) {
+
22032 using std::swap;
+
22033 swap(*(m_data.m_value.string), other);
+
22034 }
+
22035 else {
+
22036 JSON_THROW(type_error::create(310, detail::concat("cannot use swap(string_t&) with ", type_name()), this));
+
22037 }
+
22038 }
+
22039
+
22042 void swap(binary_t& other) // NOLINT(bugprone-exception-escape,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
+
22043 {
+
22044 // swap only works for strings
+
22045 if (JSON_HEDLEY_LIKELY(is_binary())) {
+
22046 using std::swap;
+
22047 swap(*(m_data.m_value.binary), other);
+
22048 }
+
22049 else {
+
22050 JSON_THROW(type_error::create(310, detail::concat("cannot use swap(binary_t&) with ", type_name()), this));
+
22051 }
+
22052 }
+
22053
+
22056 void swap(typename binary_t::container_type& other) // NOLINT(bugprone-exception-escape)
+
22057 {
+
22058 // swap only works for strings
+
22059 if (JSON_HEDLEY_LIKELY(is_binary())) {
+
22060 using std::swap;
+
22061 swap(*(m_data.m_value.binary), other);
+
22062 }
+
22063 else {
+
22064 JSON_THROW(type_error::create(310, detail::concat("cannot use swap(binary_t::container_type&) with ", type_name()), this));
+
22065 }
+
22066 }
+
22067
+
22069
+
22071 // lexicographical comparison operators //
+
22073
+
22076
+
22077 // note parentheses around operands are necessary; see
+
22078 // https://github.com/nlohmann/json/issues/1530
+
22079#define JSON_IMPLEMENT_OPERATOR(op, null_result, unordered_result, default_result) \
+
22080 const auto lhs_type = lhs.type(); \
+
22081 const auto rhs_type = rhs.type(); \
+
22082 \
+
22083 if (lhs_type == rhs_type) /* NOLINT(readability/braces) */ \
+
22084 { \
+
22085 switch (lhs_type) \
+
22086 { \
+
22087 case value_t::array: \
+
22088 return (*lhs.m_data.m_value.array) op (*rhs.m_data.m_value.array); \
+
22089 \
+
22090 case value_t::object: \
+
22091 return (*lhs.m_data.m_value.object) op (*rhs.m_data.m_value.object); \
+
22092 \
+
22093 case value_t::null: \
+
22094 return (null_result); \
+
22095 \
+
22096 case value_t::string: \
+
22097 return (*lhs.m_data.m_value.string) op (*rhs.m_data.m_value.string); \
+
22098 \
+
22099 case value_t::boolean: \
+
22100 return (lhs.m_data.m_value.boolean) op (rhs.m_data.m_value.boolean); \
+
22101 \
+
22102 case value_t::number_integer: \
+
22103 return (lhs.m_data.m_value.number_integer) op (rhs.m_data.m_value.number_integer); \
+
22104 \
+
22105 case value_t::number_unsigned: \
+
22106 return (lhs.m_data.m_value.number_unsigned) op (rhs.m_data.m_value.number_unsigned); \
+
22107 \
+
22108 case value_t::number_float: \
+
22109 return (lhs.m_data.m_value.number_float) op (rhs.m_data.m_value.number_float); \
+
22110 \
+
22111 case value_t::binary: \
+
22112 return (*lhs.m_data.m_value.binary) op (*rhs.m_data.m_value.binary); \
+
22113 \
+
22114 case value_t::discarded: \
+
22115 default: \
+
22116 return (unordered_result); \
+
22117 } \
+
22118 } \
+
22119 else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) \
+
22120 { \
+
22121 return static_cast<number_float_t>(lhs.m_data.m_value.number_integer) op rhs.m_data.m_value.number_float; \
+
22122 } \
+
22123 else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) \
+
22124 { \
+
22125 return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_integer); \
+
22126 } \
+
22127 else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) \
+
22128 { \
+
22129 return static_cast<number_float_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_float; \
+
22130 } \
+
22131 else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) \
+
22132 { \
+
22133 return lhs.m_data.m_value.number_float op static_cast<number_float_t>(rhs.m_data.m_value.number_unsigned); \
+
22134 } \
+
22135 else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) \
+
22136 { \
+
22137 return static_cast<number_integer_t>(lhs.m_data.m_value.number_unsigned) op rhs.m_data.m_value.number_integer; \
+
22138 } \
+
22139 else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) \
+
22140 { \
+
22141 return lhs.m_data.m_value.number_integer op static_cast<number_integer_t>(rhs.m_data.m_value.number_unsigned); \
+
22142 } \
+
22143 else if(compares_unordered(lhs, rhs))\
+
22144 {\
+
22145 return (unordered_result);\
+
22146 }\
+
22147 \
+
22148 return (default_result);
+
22149
+
22150JSON_PRIVATE_UNLESS_TESTED:
+
22151 // returns true if:
+
22152 // - any operand is NaN and the other operand is of number type
+
22153 // - any operand is discarded
+
22154 // in legacy mode, discarded values are considered ordered if
+
22155 // an operation is computed as an odd number of inverses of others
+
22156 static bool compares_unordered(const_reference lhs, const_reference rhs, bool inverse = false) noexcept {
+
22157 if ((lhs.is_number_float() && std::isnan(lhs.m_data.m_value.number_float) && rhs.is_number())
+
22158 || (rhs.is_number_float() && std::isnan(rhs.m_data.m_value.number_float) && lhs.is_number())) {
+
22159 return true;
+
22160 }
+
22161#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
+
22162 return (lhs.is_discarded() || rhs.is_discarded()) && !inverse;
+
22163#else
+
22164 static_cast<void>(inverse);
+
22165 return lhs.is_discarded() || rhs.is_discarded();
+
22166#endif
+
22167 }
+
22168
+
22169private:
+
22170 bool compares_unordered(const_reference rhs, bool inverse = false) const noexcept {
+
22171 return compares_unordered(*this, rhs, inverse);
+
22172 }
+
22173
+
22174public:
+
22175#if JSON_HAS_THREE_WAY_COMPARISON
+
22178 bool operator==(const_reference rhs) const noexcept {
+
22179#ifdef __GNUC__
+
22180#pragma GCC diagnostic push
+
22181#pragma GCC diagnostic ignored "-Wfloat-equal"
+
22182#endif
+
22183 const_reference lhs = *this;
+
22184 JSON_IMPLEMENT_OPERATOR(== , true, false, false)
+
22185#ifdef __GNUC__
+
22186#pragma GCC diagnostic pop
+
22187#endif
+
22188 }
+
22189
+
22192 template<typename ScalarType>
+
22193 requires std::is_scalar_v<ScalarType>
+
22194 bool operator==(ScalarType rhs) const noexcept {
+
22195 return *this == basic_json(rhs);
+
22196 }
+
22197
+
22200 bool operator!=(const_reference rhs) const noexcept {
+
22201 if (compares_unordered(rhs, true)) {
+
22202 return false;
+
22203 }
+
22204 return !operator==(rhs);
+
22205 }
+
22206
+
22209 std::partial_ordering operator<=>(const_reference rhs) const noexcept // *NOPAD*
+
22210 {
+
22211 const_reference lhs = *this;
+
22212 // default_result is used if we cannot compare values. In that case,
+
22213 // we compare types.
+
22214 JSON_IMPLEMENT_OPERATOR(<=> , // *NOPAD*
+
22215 std::partial_ordering::equivalent,
+
22216 std::partial_ordering::unordered,
+
22217 lhs_type <=> rhs_type) // *NOPAD*
+
22218 }
+
22219
+
22222 template<typename ScalarType>
+
22223 requires std::is_scalar_v<ScalarType>
+
22224 std::partial_ordering operator<=>(ScalarType rhs) const noexcept // *NOPAD*
+
22225 {
+
22226 return *this <=> basic_json(rhs); // *NOPAD*
+
22227 }
+
22228
+
22229#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
+
22230 // all operators that are computed as an odd number of inverses of others
+
22231 // need to be overloaded to emulate the legacy comparison behavior
+
22232
+
22235 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON)
+
22236 bool operator<=(const_reference rhs) const noexcept {
+
22237 if (compares_unordered(rhs, true)) {
+
22238 return false;
+
22239 }
+
22240 return !(rhs < *this);
+
22241 }
+
22242
+
22245 template<typename ScalarType>
+
22246 requires std::is_scalar_v<ScalarType>
+
22247 bool operator<=(ScalarType rhs) const noexcept {
+
22248 return *this <= basic_json(rhs);
+
22249 }
+
22250
+
22253 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON)
+
22254 bool operator>=(const_reference rhs) const noexcept {
+
22255 if (compares_unordered(rhs, true)) {
+
22256 return false;
+
22257 }
+
22258 return !(*this < rhs);
+
22259 }
+
22260
+
22263 template<typename ScalarType>
+
22264 requires std::is_scalar_v<ScalarType>
+
22265 bool operator>=(ScalarType rhs) const noexcept {
+
22266 return *this >= basic_json(rhs);
+
22267 }
+
22268#endif
+
22269#else
+
22272 friend bool operator==(const_reference lhs, const_reference rhs) noexcept {
+
22273#ifdef __GNUC__
+
22274#pragma GCC diagnostic push
+
22275#pragma GCC diagnostic ignored "-Wfloat-equal"
+
22276#endif
+
22277 JSON_IMPLEMENT_OPERATOR(== , true, false, false)
+
22278#ifdef __GNUC__
+
22279#pragma GCC diagnostic pop
+
22280#endif
+
22281 }
+
22282
+
22285 template<typename ScalarType, typename std::enable_if<
+
22286 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22287 friend bool operator==(const_reference lhs, ScalarType rhs) noexcept {
+
22288 return lhs == basic_json(rhs);
+
22289 }
+
22290
+
22293 template<typename ScalarType, typename std::enable_if<
+
22294 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22295 friend bool operator==(ScalarType lhs, const_reference rhs) noexcept {
+
22296 return basic_json(lhs) == rhs;
+
22297 }
+
22298
+
22301 friend bool operator!=(const_reference lhs, const_reference rhs) noexcept {
+
22302 if (compares_unordered(lhs, rhs, true)) {
+
22303 return false;
+
22304 }
+
22305 return !(lhs == rhs);
+
22306 }
+
22307
+
22310 template<typename ScalarType, typename std::enable_if<
+
22311 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22312 friend bool operator!=(const_reference lhs, ScalarType rhs) noexcept {
+
22313 return lhs != basic_json(rhs);
+
22314 }
+
22315
+
22318 template<typename ScalarType, typename std::enable_if<
+
22319 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22320 friend bool operator!=(ScalarType lhs, const_reference rhs) noexcept {
+
22321 return basic_json(lhs) != rhs;
+
22322 }
+
22323
+
22326 friend bool operator<(const_reference lhs, const_reference rhs) noexcept {
+
22327 // default_result is used if we cannot compare values. In that case,
+
22328 // we compare types. Note we have to call the operator explicitly,
+
22329 // because MSVC has problems otherwise.
+
22330 JSON_IMPLEMENT_OPERATOR(< , false, false, operator<(lhs_type, rhs_type))
+
22331 }
+
22332
+
22335 template<typename ScalarType, typename std::enable_if<
+
22336 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22337 friend bool operator<(const_reference lhs, ScalarType rhs) noexcept {
+
22338 return lhs < basic_json(rhs);
+
22339 }
+
22340
+
22343 template<typename ScalarType, typename std::enable_if<
+
22344 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22345 friend bool operator<(ScalarType lhs, const_reference rhs) noexcept {
+
22346 return basic_json(lhs) < rhs;
+
22347 }
+
22348
+
22351 friend bool operator<=(const_reference lhs, const_reference rhs) noexcept {
+
22352 if (compares_unordered(lhs, rhs, true)) {
+
22353 return false;
+
22354 }
+
22355 return !(rhs < lhs);
+
22356 }
+
22357
+
22360 template<typename ScalarType, typename std::enable_if<
+
22361 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22362 friend bool operator<=(const_reference lhs, ScalarType rhs) noexcept {
+
22363 return lhs <= basic_json(rhs);
+
22364 }
+
22365
+
22368 template<typename ScalarType, typename std::enable_if<
+
22369 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22370 friend bool operator<=(ScalarType lhs, const_reference rhs) noexcept {
+
22371 return basic_json(lhs) <= rhs;
+
22372 }
+
22373
+
22376 friend bool operator>(const_reference lhs, const_reference rhs) noexcept {
+
22377 // double inverse
+
22378 if (compares_unordered(lhs, rhs)) {
+
22379 return false;
+
22380 }
+
22381 return !(lhs <= rhs);
+
22382 }
+
22383
+
22386 template<typename ScalarType, typename std::enable_if<
+
22387 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22388 friend bool operator>(const_reference lhs, ScalarType rhs) noexcept {
+
22389 return lhs > basic_json(rhs);
+
22390 }
+
22391
+
22394 template<typename ScalarType, typename std::enable_if<
+
22395 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22396 friend bool operator>(ScalarType lhs, const_reference rhs) noexcept {
+
22397 return basic_json(lhs) > rhs;
+
22398 }
+
22399
+
22402 friend bool operator>=(const_reference lhs, const_reference rhs) noexcept {
+
22403 if (compares_unordered(lhs, rhs, true)) {
+
22404 return false;
+
22405 }
+
22406 return !(lhs < rhs);
+
22407 }
+
22408
+
22411 template<typename ScalarType, typename std::enable_if<
+
22412 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22413 friend bool operator>=(const_reference lhs, ScalarType rhs) noexcept {
+
22414 return lhs >= basic_json(rhs);
+
22415 }
+
22416
+
22419 template<typename ScalarType, typename std::enable_if<
+
22420 std::is_scalar<ScalarType>::value, int>::type = 0>
+
22421 friend bool operator>=(ScalarType lhs, const_reference rhs) noexcept {
+
22422 return basic_json(lhs) >= rhs;
+
22423 }
+
22424#endif
+
22425
+
22426#undef JSON_IMPLEMENT_OPERATOR
+
22427
+
22429
+
22431 // serialization //
+
22433
+
22436#ifndef JSON_NO_IO
+
22439 friend std::ostream& operator<<(std::ostream& o, const basic_json& j) {
+
22440 // read width member and use it as the indentation parameter if nonzero
+
22441 const bool pretty_print = o.width() > 0;
+
22442 const auto indentation = pretty_print ? o.width() : 0;
+
22443
+
22444 // reset width to 0 for subsequent calls to this stream
+
22445 o.width(0);
+
22446
+
22447 // do the actual serialization
+
22448 serializer s(detail::output_adapter<char>(o), o.fill());
+
22449 s.dump(j, pretty_print, false, static_cast<unsigned int>(indentation));
+
22450 return o;
+
22451 }
+
22452
+
22459 JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&))
+
22460 friend std::ostream& operator>>(const basic_json& j, std::ostream& o) {
+
22461 return o << j;
+
22462 }
+
22463#endif // JSON_NO_IO
+
22465
+
22467 // deserialization //
+
22469
+
22472
+
22475 template<typename InputType>
+
22476 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22477 static basic_json parse(InputType&& i,
+
22478 parser_callback_t cb = nullptr,
+
22479 const bool allow_exceptions = true,
+
22480 const bool ignore_comments = false,
+
22481 const bool ignore_trailing_commas = false) {
+
22482 basic_json result;
+
22483 parser(detail::input_adapter(std::forward<InputType>(i)), std::move(cb), allow_exceptions, ignore_comments, ignore_trailing_commas).parse(true, result); // cppcheck-suppress[accessMoved,accessForwarded]
+
22484 return result;
+
22485 }
+
22486
+
22489 template<typename IteratorType>
+
22490 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22491 static basic_json parse(IteratorType first,
+
22492 IteratorType last,
+
22493 parser_callback_t cb = nullptr,
+
22494 const bool allow_exceptions = true,
+
22495 const bool ignore_comments = false,
+
22496 const bool ignore_trailing_commas = false) {
+
22497 basic_json result;
+
22498 parser(detail::input_adapter(std::move(first), std::move(last)), std::move(cb), allow_exceptions, ignore_comments, ignore_trailing_commas).parse(true, result); // cppcheck-suppress[accessMoved]
+
22499 return result;
+
22500 }
+
22501
+
22502 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22503 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len))
+
22504 static basic_json parse(detail::span_input_adapter&& i,
+
22505 parser_callback_t cb = nullptr,
+
22506 const bool allow_exceptions = true,
+
22507 const bool ignore_comments = false,
+
22508 const bool ignore_trailing_commas = false) {
+
22509 basic_json result;
+
22510 parser(i.get(), std::move(cb), allow_exceptions, ignore_comments, ignore_trailing_commas).parse(true, result); // cppcheck-suppress[accessMoved]
+
22511 return result;
+
22512 }
+
22513
+
22516 template<typename InputType>
+
22517 static bool accept(InputType&& i,
+
22518 const bool ignore_comments = false,
+
22519 const bool ignore_trailing_commas = false) {
+
22520 return parser(detail::input_adapter(std::forward<InputType>(i)), nullptr, false, ignore_comments, ignore_trailing_commas).accept(true);
+
22521 }
+
22522
+
22525 template<typename IteratorType>
+
22526 static bool accept(IteratorType first, IteratorType last,
+
22527 const bool ignore_comments = false,
+
22528 const bool ignore_trailing_commas = false) {
+
22529 return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments, ignore_trailing_commas).accept(true);
+
22530 }
+
22531
+
22532 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22533 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len))
+
22534 static bool accept(detail::span_input_adapter&& i,
+
22535 const bool ignore_comments = false,
+
22536 const bool ignore_trailing_commas = false) {
+
22537 return parser(i.get(), nullptr, false, ignore_comments, ignore_trailing_commas).accept(true);
+
22538 }
+
22539
+
22542 template <typename InputType, typename SAX>
+
22543 JSON_HEDLEY_NON_NULL(2)
+
22544 static bool sax_parse(InputType&& i, SAX* sax,
+
22545 input_format_t format = input_format_t::json,
+
22546 const bool strict = true,
+
22547 const bool ignore_comments = false,
+
22548 const bool ignore_trailing_commas = false) {
+
22549#if defined(__clang__)
+
22550#pragma clang diagnostic push
+
22551#pragma clang diagnostic ignored "-Wtautological-pointer-compare"
+
22552#elif defined(__GNUC__)
+
22553#pragma GCC diagnostic push
+
22554#pragma GCC diagnostic ignored "-Wnonnull-compare"
+
22555#endif
+
22556 if (sax == nullptr) {
+
22557 JSON_THROW(other_error::create(502, "SAX handler must not be null", nullptr));
+
22558 }
+
22559#if defined(__clang__)
+
22560#pragma clang diagnostic pop
+
22561#elif defined(__GNUC__)
+
22562#pragma GCC diagnostic pop
+
22563#endif
+
22564 auto ia = detail::input_adapter(std::forward<InputType>(i));
+
22565 return format == input_format_t::json
+
22566 ? parser(std::move(ia), nullptr, true, ignore_comments, ignore_trailing_commas).sax_parse(sax, strict)
+
22567 : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict);
+
22568 }
+
22569
+
22572 template<class IteratorType, class SAX>
+
22573 JSON_HEDLEY_NON_NULL(3)
+
22574 static bool sax_parse(IteratorType first, IteratorType last, SAX* sax,
+
22575 input_format_t format = input_format_t::json,
+
22576 const bool strict = true,
+
22577 const bool ignore_comments = false,
+
22578 const bool ignore_trailing_commas = false) {
+
22579#if defined(__clang__)
+
22580#pragma clang diagnostic push
+
22581#pragma clang diagnostic ignored "-Wtautological-pointer-compare"
+
22582#elif defined(__GNUC__)
+
22583#pragma GCC diagnostic push
+
22584#pragma GCC diagnostic ignored "-Wnonnull-compare"
+
22585#endif
+
22586 if (sax == nullptr) {
+
22587 JSON_THROW(other_error::create(502, "SAX handler must not be null", nullptr));
+
22588 }
+
22589#if defined(__clang__)
+
22590#pragma clang diagnostic pop
+
22591#elif defined(__GNUC__)
+
22592#pragma GCC diagnostic pop
+
22593#endif
+
22594 auto ia = detail::input_adapter(std::move(first), std::move(last));
+
22595 return format == input_format_t::json
+
22596 ? parser(std::move(ia), nullptr, true, ignore_comments, ignore_trailing_commas).sax_parse(sax, strict)
+
22597 : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict);
+
22598 }
+
22599
+
22605 template <typename SAX>
+
22606 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...))
+
22607 JSON_HEDLEY_NON_NULL(2)
+
22608 static bool sax_parse(detail::span_input_adapter&& i, SAX* sax,
+
22609 input_format_t format = input_format_t::json,
+
22610 const bool strict = true,
+
22611 const bool ignore_comments = false,
+
22612 const bool ignore_trailing_commas = false) {
+
22613#if defined(__clang__)
+
22614#pragma clang diagnostic push
+
22615#pragma clang diagnostic ignored "-Wtautological-pointer-compare"
+
22616#elif defined(__GNUC__)
+
22617#pragma GCC diagnostic push
+
22618#pragma GCC diagnostic ignored "-Wnonnull-compare"
+
22619#endif
+
22620 if (sax == nullptr) {
+
22621 JSON_THROW(other_error::create(502, "SAX handler must not be null", nullptr));
+
22622 }
+
22623#if defined(__clang__)
+
22624#pragma clang diagnostic pop
+
22625#elif defined(__GNUC__)
+
22626#pragma GCC diagnostic pop
+
22627#endif
+
22628 auto ia = i.get();
+
22629 return format == input_format_t::json
+
22630 // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
+
22631 ? parser(std::move(ia), nullptr, true, ignore_comments, ignore_trailing_commas).sax_parse(sax, strict)
+
22632 // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
+
22633 : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia), format).sax_parse(format, sax, strict);
+
22634 }
+
22635#ifndef JSON_NO_IO
+
22642 JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&))
+
22643 friend std::istream& operator<<(basic_json& j, std::istream& i) {
+
22644 return operator>>(i, j);
+
22645 }
+
22646
+
22649 friend std::istream& operator>>(std::istream& i, basic_json& j) {
+
22650 parser(detail::input_adapter(i)).parse(false, j);
+
22651 return i;
+
22652 }
+
22653#endif // JSON_NO_IO
+
22655
+
22657 // convenience functions //
+
22659
+
22662 JSON_HEDLEY_RETURNS_NON_NULL
+
22663 const char* type_name() const noexcept {
+
22664 switch (m_data.m_type) {
+
22665 case value_t::null:
+
22666 return "null";
+
22667 case value_t::object:
+
22668 return "object";
+
22669 case value_t::array:
+
22670 return "array";
+
22671 case value_t::string:
+
22672 return "string";
+
22673 case value_t::boolean:
+
22674 return "boolean";
+
22675 case value_t::binary:
+
22676 return "binary";
+
22677 case value_t::discarded:
+
22678 return "discarded";
+
22679 case value_t::number_integer:
+
22680 case value_t::number_unsigned:
+
22681 case value_t::number_float:
+
22682 return "number";
+
22683 default:
+
22684 return "invalid";
+
22685 }
+
22686 }
+
22687
+
22688JSON_PRIVATE_UNLESS_TESTED:
+
22690 // member variables //
+
22692
+
22693 struct data {
+
22695 value_t m_type = value_t::null;
+
22696
+
22698 json_value m_value = {};
+
22699
+
22700 data(const value_t v)
+
22701 : m_type(v), m_value(v) {}
+
22702
+
22703 data(size_type cnt, const basic_json& val)
+
22704 : m_type(value_t::array) {
+
22705 m_value.array = create<array_t>(cnt, val);
+
22706 }
+
22707
+
22708 data() noexcept = default;
+
22709 data(data&&) noexcept = default;
+
22710 data(const data&) noexcept = delete;
+
22711 data& operator=(data&&) noexcept = delete;
+
22712 data& operator=(const data&) noexcept = delete;
+
22713
+
22714 ~data() noexcept {
+
22715 m_value.destroy(m_type);
+
22716 }
+
22717 };
+
22718
+
22719 data m_data = {};
+
22720
+
22721#if JSON_DIAGNOSTICS
+
22723 basic_json* m_parent = nullptr;
+
22724#endif
+
22725
+
22726#if JSON_DIAGNOSTIC_POSITIONS
+
22728 std::size_t start_position = std::string::npos;
+
22730 std::size_t end_position = std::string::npos;
+
22731public:
+
22732 constexpr std::size_t start_pos() const noexcept {
+
22733 return start_position;
+
22734 }
+
22735
+
22736 constexpr std::size_t end_pos() const noexcept {
+
22737 return end_position;
+
22738 }
+
22739#endif
+
22740
+
22742 // binary serialization/deserialization //
+
22744
+
22747
+
22748public:
+
22751 static std::vector<std::uint8_t> to_cbor(const basic_json& j) {
+
22752 std::vector<std::uint8_t> result;
+
22753 to_cbor(j, result);
+
22754 return result;
+
22755 }
+
22756
+
22759 static void to_cbor(const basic_json& j, detail::output_adapter<std::uint8_t> o) {
+
22760 binary_writer<std::uint8_t>(o).write_cbor(j);
+
22761 }
+
22762
+
22765 static void to_cbor(const basic_json& j, detail::output_adapter<char> o) {
+
22766 binary_writer<char>(o).write_cbor(j);
+
22767 }
+
22768
+
22771 static std::vector<std::uint8_t> to_msgpack(const basic_json& j) {
+
22772 std::vector<std::uint8_t> result;
+
22773 to_msgpack(j, result);
+
22774 return result;
+
22775 }
+
22776
+
22779 static void to_msgpack(const basic_json& j, detail::output_adapter<std::uint8_t> o) {
+
22780 binary_writer<std::uint8_t>(o).write_msgpack(j);
+
22781 }
+
22782
+
22785 static void to_msgpack(const basic_json& j, detail::output_adapter<char> o) {
+
22786 binary_writer<char>(o).write_msgpack(j);
+
22787 }
+
22788
+
22791 static std::vector<std::uint8_t> to_ubjson(const basic_json& j,
+
22792 const bool use_size = false,
+
22793 const bool use_type = false) {
+
22794 std::vector<std::uint8_t> result;
+
22795 to_ubjson(j, result, use_size, use_type);
+
22796 return result;
+
22797 }
+
22798
+
22801 static void to_ubjson(const basic_json& j, detail::output_adapter<std::uint8_t> o,
+
22802 const bool use_size = false, const bool use_type = false) {
+
22803 binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type);
+
22804 }
+
22805
+
22808 static void to_ubjson(const basic_json& j, detail::output_adapter<char> o,
+
22809 const bool use_size = false, const bool use_type = false) {
+
22810 binary_writer<char>(o).write_ubjson(j, use_size, use_type);
+
22811 }
+
22812
+
22815 static std::vector<std::uint8_t> to_bjdata(const basic_json& j,
+
22816 const bool use_size = false,
+
22817 const bool use_type = false,
+
22818 const bjdata_version_t version = bjdata_version_t::draft2) {
+
22819 std::vector<std::uint8_t> result;
+
22820 to_bjdata(j, result, use_size, use_type, version);
+
22821 return result;
+
22822 }
+
22823
+
22826 static void to_bjdata(const basic_json& j, detail::output_adapter<std::uint8_t> o,
+
22827 const bool use_size = false, const bool use_type = false,
+
22828 const bjdata_version_t version = bjdata_version_t::draft2) {
+
22829 binary_writer<std::uint8_t>(o).write_ubjson(j, use_size, use_type, true, true, version);
+
22830 }
+
22831
+
22834 static void to_bjdata(const basic_json& j, detail::output_adapter<char> o,
+
22835 const bool use_size = false, const bool use_type = false,
+
22836 const bjdata_version_t version = bjdata_version_t::draft2) {
+
22837 binary_writer<char>(o).write_ubjson(j, use_size, use_type, true, true, version);
+
22838 }
+
22839
+
22842 static std::vector<std::uint8_t> to_bson(const basic_json& j) {
+
22843 std::vector<std::uint8_t> result;
+
22844 to_bson(j, result);
+
22845 return result;
+
22846 }
+
22847
+
22850 static void to_bson(const basic_json& j, detail::output_adapter<std::uint8_t> o) {
+
22851 binary_writer<std::uint8_t>(o).write_bson(j);
+
22852 }
+
22853
+
22856 static void to_bson(const basic_json& j, detail::output_adapter<char> o) {
+
22857 binary_writer<char>(o).write_bson(j);
+
22858 }
+
22859
+
22862 template<typename InputType>
+
22863 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22864 static basic_json from_cbor(InputType&& i,
+
22865 const bool strict = true,
+
22866 const bool allow_exceptions = true,
+
22867 const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) {
+
22868 basic_json result;
+
22869 auto ia = detail::input_adapter(std::forward<InputType>(i));
+
22870 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
22871 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]
+
22872 return res ? result : basic_json(value_t::discarded);
+
22873 }
+
22874
+
22877 template<typename IteratorType>
+
22878 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22879 static basic_json from_cbor(IteratorType first, IteratorType last,
+
22880 const bool strict = true,
+
22881 const bool allow_exceptions = true,
+
22882 const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) {
+
22883 basic_json result;
+
22884 auto ia = detail::input_adapter(std::move(first), std::move(last));
+
22885 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
22886 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]
+
22887 return res ? result : basic_json(value_t::discarded);
+
22888 }
+
22889
+
22890 template<typename T>
+
22891 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22892 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
+
22893 static basic_json from_cbor(const T* ptr, std::size_t len,
+
22894 const bool strict = true,
+
22895 const bool allow_exceptions = true,
+
22896 const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) {
+
22897 return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler);
+
22898 }
+
22899
+
22900 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22901 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
+
22902 static basic_json from_cbor(detail::span_input_adapter&& i,
+
22903 const bool strict = true,
+
22904 const bool allow_exceptions = true,
+
22905 const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) {
+
22906 basic_json result;
+
22907 auto ia = i.get();
+
22908 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
22909 // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
+
22910 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::cbor).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); // cppcheck-suppress[accessMoved]
+
22911 return res ? result : basic_json(value_t::discarded);
+
22912 }
+
22913
+
22916 template<typename InputType>
+
22917 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22918 static basic_json from_msgpack(InputType&& i,
+
22919 const bool strict = true,
+
22920 const bool allow_exceptions = true) {
+
22921 basic_json result;
+
22922 auto ia = detail::input_adapter(std::forward<InputType>(i));
+
22923 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
22924 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]
+
22925 return res ? result : basic_json(value_t::discarded);
+
22926 }
+
22927
+
22930 template<typename IteratorType>
+
22931 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22932 static basic_json from_msgpack(IteratorType first, IteratorType last,
+
22933 const bool strict = true,
+
22934 const bool allow_exceptions = true) {
+
22935 basic_json result;
+
22936 auto ia = detail::input_adapter(std::move(first), std::move(last));
+
22937 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
22938 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]
+
22939 return res ? result : basic_json(value_t::discarded);
+
22940 }
+
22941
+
22942 template<typename T>
+
22943 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22944 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))
+
22945 static basic_json from_msgpack(const T* ptr, std::size_t len,
+
22946 const bool strict = true,
+
22947 const bool allow_exceptions = true) {
+
22948 return from_msgpack(ptr, ptr + len, strict, allow_exceptions);
+
22949 }
+
22950
+
22951 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22952 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))
+
22953 static basic_json from_msgpack(detail::span_input_adapter&& i,
+
22954 const bool strict = true,
+
22955 const bool allow_exceptions = true) {
+
22956 basic_json result;
+
22957 auto ia = i.get();
+
22958 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
22959 // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
+
22960 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::msgpack).sax_parse(input_format_t::msgpack, &sdp, strict); // cppcheck-suppress[accessMoved]
+
22961 return res ? result : basic_json(value_t::discarded);
+
22962 }
+
22963
+
22966 template<typename InputType>
+
22967 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22968 static basic_json from_ubjson(InputType&& i,
+
22969 const bool strict = true,
+
22970 const bool allow_exceptions = true) {
+
22971 basic_json result;
+
22972 auto ia = detail::input_adapter(std::forward<InputType>(i));
+
22973 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
22974 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]
+
22975 return res ? result : basic_json(value_t::discarded);
+
22976 }
+
22977
+
22980 template<typename IteratorType>
+
22981 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22982 static basic_json from_ubjson(IteratorType first, IteratorType last,
+
22983 const bool strict = true,
+
22984 const bool allow_exceptions = true) {
+
22985 basic_json result;
+
22986 auto ia = detail::input_adapter(std::move(first), std::move(last));
+
22987 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
22988 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]
+
22989 return res ? result : basic_json(value_t::discarded);
+
22990 }
+
22991
+
22992 template<typename T>
+
22993 JSON_HEDLEY_WARN_UNUSED_RESULT
+
22994 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))
+
22995 static basic_json from_ubjson(const T* ptr, std::size_t len,
+
22996 const bool strict = true,
+
22997 const bool allow_exceptions = true) {
+
22998 return from_ubjson(ptr, ptr + len, strict, allow_exceptions);
+
22999 }
+
23000
+
23001 JSON_HEDLEY_WARN_UNUSED_RESULT
+
23002 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))
+
23003 static basic_json from_ubjson(detail::span_input_adapter&& i,
+
23004 const bool strict = true,
+
23005 const bool allow_exceptions = true) {
+
23006 basic_json result;
+
23007 auto ia = i.get();
+
23008 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
23009 // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
+
23010 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::ubjson).sax_parse(input_format_t::ubjson, &sdp, strict); // cppcheck-suppress[accessMoved]
+
23011 return res ? result : basic_json(value_t::discarded);
+
23012 }
+
23013
+
23016 template<typename InputType>
+
23017 JSON_HEDLEY_WARN_UNUSED_RESULT
+
23018 static basic_json from_bjdata(InputType&& i,
+
23019 const bool strict = true,
+
23020 const bool allow_exceptions = true) {
+
23021 basic_json result;
+
23022 auto ia = detail::input_adapter(std::forward<InputType>(i));
+
23023 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
23024 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict); // cppcheck-suppress[accessMoved]
+
23025 return res ? result : basic_json(value_t::discarded);
+
23026 }
+
23027
+
23030 template<typename IteratorType>
+
23031 JSON_HEDLEY_WARN_UNUSED_RESULT
+
23032 static basic_json from_bjdata(IteratorType first, IteratorType last,
+
23033 const bool strict = true,
+
23034 const bool allow_exceptions = true) {
+
23035 basic_json result;
+
23036 auto ia = detail::input_adapter(std::move(first), std::move(last));
+
23037 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
23038 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bjdata).sax_parse(input_format_t::bjdata, &sdp, strict); // cppcheck-suppress[accessMoved]
+
23039 return res ? result : basic_json(value_t::discarded);
+
23040 }
+
23041
+
23044 template<typename InputType>
+
23045 JSON_HEDLEY_WARN_UNUSED_RESULT
+
23046 static basic_json from_bson(InputType&& i,
+
23047 const bool strict = true,
+
23048 const bool allow_exceptions = true) {
+
23049 basic_json result;
+
23050 auto ia = detail::input_adapter(std::forward<InputType>(i));
+
23051 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
23052 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]
+
23053 return res ? result : basic_json(value_t::discarded);
+
23054 }
+
23055
+
23058 template<typename IteratorType>
+
23059 JSON_HEDLEY_WARN_UNUSED_RESULT
+
23060 static basic_json from_bson(IteratorType first, IteratorType last,
+
23061 const bool strict = true,
+
23062 const bool allow_exceptions = true) {
+
23063 basic_json result;
+
23064 auto ia = detail::input_adapter(std::move(first), std::move(last));
+
23065 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
23066 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]
+
23067 return res ? result : basic_json(value_t::discarded);
+
23068 }
+
23069
+
23070 template<typename T>
+
23071 JSON_HEDLEY_WARN_UNUSED_RESULT
+
23072 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))
+
23073 static basic_json from_bson(const T* ptr, std::size_t len,
+
23074 const bool strict = true,
+
23075 const bool allow_exceptions = true) {
+
23076 return from_bson(ptr, ptr + len, strict, allow_exceptions);
+
23077 }
+
23078
+
23079 JSON_HEDLEY_WARN_UNUSED_RESULT
+
23080 JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))
+
23081 static basic_json from_bson(detail::span_input_adapter&& i,
+
23082 const bool strict = true,
+
23083 const bool allow_exceptions = true) {
+
23084 basic_json result;
+
23085 auto ia = i.get();
+
23086 detail::json_sax_dom_parser<basic_json, decltype(ia)> sdp(result, allow_exceptions);
+
23087 // NOLINTNEXTLINE(hicpp-move-const-arg,performance-move-const-arg)
+
23088 const bool res = binary_reader<decltype(ia)>(std::move(ia), input_format_t::bson).sax_parse(input_format_t::bson, &sdp, strict); // cppcheck-suppress[accessMoved]
+
23089 return res ? result : basic_json(value_t::discarded);
+
23090 }
+
23092
+
23094 // JSON Pointer support //
+
23096
+
23099
+
23102 reference operator[](const json_pointer& ptr) {
+
23103 return ptr.get_unchecked(this);
+
23104 }
+
23105
+
23106 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>
+
23107 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)
+
23108 reference operator[](const ::nlohmann::json_pointer<BasicJsonType>& ptr) {
+
23109 return ptr.get_unchecked(this);
+
23110 }
+
23111
+
23114 const_reference operator[](const json_pointer& ptr) const {
+
23115 return ptr.get_unchecked(this);
+
23116 }
+
23117
+
23118 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>
+
23119 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)
+
23120 const_reference operator[](const ::nlohmann::json_pointer<BasicJsonType>& ptr) const {
+
23121 return ptr.get_unchecked(this);
+
23122 }
+
23123
+
23126 reference at(const json_pointer& ptr) {
+
23127 return ptr.get_checked(this);
+
23128 }
+
23129
+
23130 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>
+
23131 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)
+
23132 reference at(const ::nlohmann::json_pointer<BasicJsonType>& ptr) {
+
23133 return ptr.get_checked(this);
+
23134 }
+
23135
+
23138 const_reference at(const json_pointer& ptr) const {
+
23139 return ptr.get_checked(this);
+
23140 }
+
23141
+
23142 template<typename BasicJsonType, detail::enable_if_t<detail::is_basic_json<BasicJsonType>::value, int> = 0>
+
23143 JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer<basic_json::string_t>) // NOLINT(readability/alt_tokens)
+
23144 const_reference at(const ::nlohmann::json_pointer<BasicJsonType>& ptr) const {
+
23145 return ptr.get_checked(this);
+
23146 }
+
23147
+
23150 basic_json flatten() const {
+
23151 basic_json result(value_t::object);
+
23152 json_pointer::flatten("", *this, result);
+
23153 return result;
+
23154 }
+
23155
+
23158 basic_json unflatten() const {
+
23159 return json_pointer::unflatten(*this);
+
23160 }
+
23161
+
23163
+
23165 // JSON Patch functions //
+
23167
+
23170
+
23173 void patch_inplace(const basic_json& json_patch) {
+
23174 basic_json& result = *this;
+
23175 // the valid JSON Patch operations
+
23176 enum class patch_operations { add, remove, replace, move, copy, test, invalid };
+
23177
+
23178 const auto get_op = [](const string_t& op) {
+
23179 if (op == "add") {
+
23180 return patch_operations::add;
+
23181 }
+
23182 if (op == "remove") {
+
23183 return patch_operations::remove;
+
23184 }
+
23185 if (op == "replace") {
+
23186 return patch_operations::replace;
+
23187 }
+
23188 if (op == "move") {
+
23189 return patch_operations::move;
+
23190 }
+
23191 if (op == "copy") {
+
23192 return patch_operations::copy;
+
23193 }
+
23194 if (op == "test") {
+
23195 return patch_operations::test;
+
23196 }
+
23197
+
23198 return patch_operations::invalid;
+
23199 };
+
23200
+
23201 // wrapper for "add" operation; add value at ptr
+
23202 const auto operation_add = [&result](json_pointer& ptr, const basic_json& val) {
+
23203 // adding to the root of the target document means replacing it
+
23204 if (ptr.empty()) {
+
23205 result = val;
+
23206 return;
+
23207 }
+
23208
+
23209 // make sure the top element of the pointer exists
+
23210 json_pointer const top_pointer = ptr.top();
+
23211 if (top_pointer != ptr) {
+
23212 result.at(top_pointer);
+
23213 }
+
23214
+
23215 // get reference to the parent of the JSON pointer ptr
+
23216 const auto last_path = ptr.back();
+
23217 ptr.pop_back();
+
23218 // parent must exist when performing patch add per RFC6902 specs
+
23219 basic_json& parent = result.at(ptr);
+
23220
+
23221 switch (parent.m_data.m_type) {
+
23222 case value_t::null:
+
23223 case value_t::object:
+
23224 {
+
23225 // use operator[] to add value
+
23226 parent[last_path] = val;
+
23227 break;
+
23228 }
+
23229
+
23230 case value_t::array:
+
23231 {
+
23232 if (last_path == "-") {
+
23233 // special case: append to back
+
23234 parent.push_back(val);
+
23235 }
+
23236 else {
+
23237 const auto idx = json_pointer::template array_index<basic_json_t>(last_path);
+
23238 if (JSON_HEDLEY_UNLIKELY(idx > parent.size())) {
+
23239 // avoid undefined behavior
+
23240 JSON_THROW(out_of_range::create(401, detail::concat("array index ", std::to_string(idx), " is out of range"), &parent));
+
23241 }
+
23242
+
23243 // default case: insert add offset
+
23244 parent.insert(parent.begin() + static_cast<difference_type>(idx), val);
+
23245 }
+
23246 break;
+
23247 }
+
23248
+
23249 // if there exists a parent, it cannot be primitive
+
23250 case value_t::string: // LCOV_EXCL_LINE
+
23251 case value_t::boolean: // LCOV_EXCL_LINE
+
23252 case value_t::number_integer: // LCOV_EXCL_LINE
+
23253 case value_t::number_unsigned: // LCOV_EXCL_LINE
+
23254 case value_t::number_float: // LCOV_EXCL_LINE
+
23255 case value_t::binary: // LCOV_EXCL_LINE
+
23256 case value_t::discarded: // LCOV_EXCL_LINE
+
23257 default: // LCOV_EXCL_LINE
+
23258 JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE
+
23259 }
+
23260 };
+
23261
+
23262 // wrapper for "remove" operation; remove value at ptr
+
23263 const auto operation_remove = [this, &result](json_pointer& ptr) {
+
23264 // get reference to the parent of the JSON pointer ptr
+
23265 const auto last_path = ptr.back();
+
23266 ptr.pop_back();
+
23267 basic_json& parent = result.at(ptr);
+
23268
+
23269 // remove child
+
23270 if (parent.is_object()) {
+
23271 // perform range check
+
23272 auto it = parent.find(last_path);
+
23273 if (JSON_HEDLEY_LIKELY(it != parent.end())) {
+
23274 parent.erase(it);
+
23275 }
+
23276 else {
+
23277 JSON_THROW(out_of_range::create(403, detail::concat("key '", last_path, "' not found"), this));
+
23278 }
+
23279 }
+
23280 else if (parent.is_array()) {
+
23281 // note erase performs range check
+
23282 parent.erase(json_pointer::template array_index<basic_json_t>(last_path));
+
23283 }
+
23284 };
+
23285
+
23286 // type check: top level value must be an array
+
23287 if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array())) {
+
23288 JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", &json_patch));
+
23289 }
+
23290
+
23291 // iterate and apply the operations
+
23292 for (const auto& val : json_patch) {
+
23293 // wrapper to get a value for an operation
+
23294 const auto get_value = [&val](const string_t& op,
+
23295 const string_t& member,
+
23296 bool string_type) -> basic_json& {
+
23297 // find value
+
23298 auto it = val.m_data.m_value.object->find(member);
+
23299
+
23300 // context-sensitive error message
+
23301 const auto error_msg = (op == "op") ? "operation" : detail::concat("operation '", op, '\''); // NOLINT(bugprone-unused-local-non-trivial-variable)
+
23302
+
23303 // check if the desired value is present
+
23304 if (JSON_HEDLEY_UNLIKELY(it == val.m_data.m_value.object->end())) {
+
23305 // NOLINTNEXTLINE(performance-inefficient-string-concatenation)
+
23306 JSON_THROW(parse_error::create(105, 0, detail::concat(error_msg, " must have member '", member, "'"), &val));
+
23307 }
+
23308
+
23309 // check if the result is of type string
+
23310 if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string())) {
+
23311 // NOLINTNEXTLINE(performance-inefficient-string-concatenation)
+
23312 JSON_THROW(parse_error::create(105, 0, detail::concat(error_msg, " must have string member '", member, "'"), &val));
+
23313 }
+
23314
+
23315 // no error: return value
+
23316 return it->second;
+
23317 };
+
23318
+
23319 // type check: every element of the array must be an object
+
23320 if (JSON_HEDLEY_UNLIKELY(!val.is_object())) {
+
23321 JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects", &val));
+
23322 }
+
23323
+
23324 // collect mandatory members
+
23325 const auto op = get_value("op", "op", true).template get<string_t>();
+
23326 const auto path = get_value(op, "path", true).template get<string_t>();
+
23327 json_pointer ptr(path);
+
23328
+
23329 switch (get_op(op)) {
+
23330 case patch_operations::add:
+
23331 {
+
23332 operation_add(ptr, get_value("add", "value", false));
+
23333 break;
+
23334 }
+
23335
+
23336 case patch_operations::remove:
+
23337 {
+
23338 operation_remove(ptr);
+
23339 break;
+
23340 }
+
23341
+
23342 case patch_operations::replace:
+
23343 {
+
23344 // the "path" location must exist - use at()
+
23345 result.at(ptr) = get_value("replace", "value", false);
+
23346 break;
+
23347 }
+
23348
+
23349 case patch_operations::move:
+
23350 {
+
23351 const auto from_path = get_value("move", "from", true).template get<string_t>();
+
23352 json_pointer from_ptr(from_path);
+
23353
+
23354 // the "from" location must exist - use at()
+
23355 basic_json const v = result.at(from_ptr);
+
23356
+
23357 // The move operation is functionally identical to a
+
23358 // "remove" operation on the "from" location, followed
+
23359 // immediately by an "add" operation at the target
+
23360 // location with the value that was just removed.
+
23361 operation_remove(from_ptr);
+
23362 operation_add(ptr, v);
+
23363 break;
+
23364 }
+
23365
+
23366 case patch_operations::copy:
+
23367 {
+
23368 const auto from_path = get_value("copy", "from", true).template get<string_t>();
+
23369 const json_pointer from_ptr(from_path);
+
23370
+
23371 // the "from" location must exist - use at()
+
23372 basic_json const v = result.at(from_ptr);
+
23373
+
23374 // The copy is functionally identical to an "add"
+
23375 // operation at the target location using the value
+
23376 // specified in the "from" member.
+
23377 operation_add(ptr, v);
+
23378 break;
+
23379 }
+
23380
+
23381 case patch_operations::test:
+
23382 {
+
23383 bool success = false;
+
23384 JSON_TRY
+
23385 {
+
23386 // check if "value" matches the one at "path"
+
23387 // the "path" location must exist - use at()
+
23388 success = (result.at(ptr) == get_value("test", "value", false));
+
23389 }
+
23390 JSON_INTERNAL_CATCH(out_of_range&) {
+
23391 // ignore out of range errors: success remains false
+
23392 }
+
23393
+
23394 // throw an exception if the test fails
+
23395 if (JSON_HEDLEY_UNLIKELY(!success)) {
+
23396 JSON_THROW(other_error::create(501, detail::concat("unsuccessful: ", val.dump()), &val));
+
23397 }
+
23398
+
23399 break;
+
23400 }
+
23401
+
23402 case patch_operations::invalid:
+
23403 default:
+
23404 {
+
23405 // op must be "add", "remove", "replace", "move", "copy", or
+
23406 // "test"
+
23407 JSON_THROW(parse_error::create(105, 0, detail::concat("operation value '", op, "' is invalid"), &val));
+
23408 }
+
23409 }
+
23410 }
+
23411 }
+
23412
+
23415 basic_json patch(const basic_json& json_patch) const {
+
23416 basic_json result = *this;
+
23417 result.patch_inplace(json_patch);
+
23418 return result;
+
23419 }
+
23420
+
23423 JSON_HEDLEY_WARN_UNUSED_RESULT
+
23424 static basic_json diff(const basic_json& source, const basic_json& target,
+
23425 const string_t& path = "") {
+
23426 // the patch
+
23427 basic_json result(value_t::array);
+
23428
+
23429 // if the values are the same, return an empty patch
+
23430 if (source == target) {
+
23431 return result;
+
23432 }
+
23433
+
23434 if (source.type() != target.type()) {
+
23435 // different types: replace value
+
23436 result.push_back(
+
23437 {
+
23438 {"op", "replace"}, {"path", path}, {"value", target}
+
23439 });
+
23440 return result;
+
23441 }
+
23442
+
23443 switch (source.type()) {
+
23444 case value_t::array:
+
23445 {
+
23446 // first pass: traverse common elements
+
23447 std::size_t i = 0;
+
23448 while (i < source.size() && i < target.size()) {
+
23449 // recursive call to compare array values at index i
+
23450 auto temp_diff = diff(source[i], target[i], detail::concat<string_t>(path, '/', detail::to_string<string_t>(i)));
+
23451 result.insert(result.end(), temp_diff.begin(), temp_diff.end());
+
23452 ++i;
+
23453 }
+
23454
+
23455 // We now reached the end of at least one array
+
23456 // in a second pass, traverse the remaining elements
+
23457
+
23458 // remove my remaining elements
+
23459 const auto end_index = static_cast<difference_type>(result.size());
+
23460 while (i < source.size()) {
+
23461 // add operations in reverse order to avoid invalid
+
23462 // indices
+
23463 result.insert(result.begin() + end_index, object(
+
23464 {
+
23465 {"op", "remove"},
+
23466 {"path", detail::concat<string_t>(path, '/', detail::to_string<string_t>(i))}
+
23467 }));
+
23468 ++i;
+
23469 }
+
23470
+
23471 // add other remaining elements
+
23472 while (i < target.size()) {
+
23473 result.push_back(
+
23474 {
+
23475 {"op", "add"},
+
23476 {"path", detail::concat<string_t>(path, "/-")},
+
23477 {"value", target[i]}
+
23478 });
+
23479 ++i;
+
23480 }
+
23481
+
23482 break;
+
23483 }
+
23484
+
23485 case value_t::object:
+
23486 {
+
23487 // first pass: traverse this object's elements
+
23488 for (auto it = source.cbegin(); it != source.cend(); ++it) {
+
23489 // escape the key name to be used in a JSON patch
+
23490 const auto path_key = detail::concat<string_t>(path, '/', detail::escape(it.key()));
+
23491
+
23492 if (target.find(it.key()) != target.end()) {
+
23493 // recursive call to compare object values at key it
+
23494 auto temp_diff = diff(it.value(), target[it.key()], path_key);
+
23495 result.insert(result.end(), temp_diff.begin(), temp_diff.end());
+
23496 }
+
23497 else {
+
23498 // found a key that is not in o -> remove it
+
23499 result.push_back(object(
+
23500 {
+
23501 {"op", "remove"}, {"path", path_key}
+
23502 }));
+
23503 }
+
23504 }
+
23505
+
23506 // second pass: traverse other object's elements
+
23507 for (auto it = target.cbegin(); it != target.cend(); ++it) {
+
23508 if (source.find(it.key()) == source.end()) {
+
23509 // found a key that is not in this -> add it
+
23510 const auto path_key = detail::concat<string_t>(path, '/', detail::escape(it.key()));
+
23511 result.push_back(
+
23512 {
+
23513 {"op", "add"}, {"path", path_key},
+
23514 {"value", it.value()}
+
23515 });
+
23516 }
+
23517 }
+
23518
+
23519 break;
+
23520 }
+
23521
+
23522 case value_t::null:
+
23523 case value_t::string:
+
23524 case value_t::boolean:
+
23525 case value_t::number_integer:
+
23526 case value_t::number_unsigned:
+
23527 case value_t::number_float:
+
23528 case value_t::binary:
+
23529 case value_t::discarded:
+
23530 default:
+
23531 {
+
23532 // both primitive types: replace value
+
23533 result.push_back(
+
23534 {
+
23535 {"op", "replace"}, {"path", path}, {"value", target}
+
23536 });
+
23537 break;
+
23538 }
+
23539 }
+
23540
+
23541 return result;
+
23542 }
+
23544
+
23546 // JSON Merge Patch functions //
+
23548
+
23551
+
23554 void merge_patch(const basic_json& apply_patch) {
+
23555 if (apply_patch.is_object()) {
+
23556 if (!is_object()) {
+
23557 *this = object();
+
23558 }
+
23559 for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it) {
+
23560 if (it.value().is_null()) {
+
23561 erase(it.key());
+
23562 }
+
23563 else {
+
23564 operator[](it.key()).merge_patch(it.value());
+
23565 }
+
23566 }
+
23567 }
+
23568 else {
+
23569 *this = apply_patch;
+
23570 }
+
23571 }
+
23572
+
23574};
+
+
23575
+
23578NLOHMANN_BASIC_JSON_TPL_DECLARATION
+
23579std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) {
+
23580 return j.dump();
+
23581}
+
23582
+
23583inline namespace literals {
+
23584 inline namespace json_literals {
+
23585
+
23588 JSON_HEDLEY_NON_NULL(1)
+
23589#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
+
23590 inline nlohmann::json operator""_json(const char* s, std::size_t n)
+
23591#else
+
23592 // GCC 4.8 requires a space between "" and suffix
+
23593 inline nlohmann::json operator"" _json(const char* s, std::size_t n)
+
23594#endif
+
23595 {
+
23596 return nlohmann::json::parse(s, s + n);
+
23597 }
+
23598
+
23599#if defined(__cpp_char8_t)
+
23600 JSON_HEDLEY_NON_NULL(1)
+
23601 inline nlohmann::json operator""_json(const char8_t* s, std::size_t n) {
+
23602 return nlohmann::json::parse(reinterpret_cast<const char*>(s),
+
23603 reinterpret_cast<const char*>(s) + n);
+
23604 }
+
23605#endif
+
23606
+
23609 JSON_HEDLEY_NON_NULL(1)
+
23610#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
+
23611 inline nlohmann::json::json_pointer operator""_json_pointer(const char* s, std::size_t n)
+
23612#else
+
23613 // GCC 4.8 requires a space between "" and suffix
+
23614 inline nlohmann::json::json_pointer operator"" _json_pointer(const char* s, std::size_t n)
+
23615#endif
+
23616 {
+
23617 return nlohmann::json::json_pointer(std::string(s, n));
+
23618 }
+
23619
+
23620#if defined(__cpp_char8_t)
+
23621 inline nlohmann::json::json_pointer operator""_json_pointer(const char8_t* s, std::size_t n) {
+
23622 return nlohmann::json::json_pointer(std::string(reinterpret_cast<const char*>(s), n));
+
23623 }
+
23624#endif
+
23625
+
23626 } // namespace json_literals
+
23627} // namespace literals
+
23628NLOHMANN_JSON_NAMESPACE_END
+
23629
+
23631// nonmember support //
+
23633
+
23634namespace std // NOLINT(cert-dcl58-cpp)
+
23635{
+
23636
+
23639 NLOHMANN_BASIC_JSON_TPL_DECLARATION
+
23640 struct hash<nlohmann::NLOHMANN_BASIC_JSON_TPL> // NOLINT(cert-dcl58-cpp)
+
23641 {
+
23642 std::size_t operator()(const nlohmann::NLOHMANN_BASIC_JSON_TPL& j) const {
+
23643 return nlohmann::detail::hash(j);
+
23644 }
+
23645 };
+
23646
+
23647 // specialization for std::less<value_t>
+
23648 template<>
+
+
23649 struct less< ::nlohmann::detail::value_t> // do not remove the space after '<', see https://github.com/nlohmann/json/pull/679
+
23650 {
+
+
23655 bool operator()(::nlohmann::detail::value_t lhs,
+
23656 ::nlohmann::detail::value_t rhs) const noexcept {
+
23657#if JSON_HAS_THREE_WAY_COMPARISON
+
23658 return std::is_lt(lhs <=> rhs); // *NOPAD*
+
23659#else
+
23660 return ::nlohmann::detail::operator<(lhs, rhs);
+
23661#endif
+
23662 }
+
+
23663 };
+
+
23664
+
23665 // C++20 prohibit function specialization in the std namespace.
+
23666#ifndef JSON_HAS_CPP_20
+
23667
+
23670 NLOHMANN_BASIC_JSON_TPL_DECLARATION
+
23671 inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC_JSON_TPL& j2) noexcept( // NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp)
+
23672 is_nothrow_move_constructible<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value&& // NOLINT(misc-redundant-expression,cppcoreguidelines-noexcept-swap,performance-noexcept-swap)
+
23673 is_nothrow_move_assignable<nlohmann::NLOHMANN_BASIC_JSON_TPL>::value) {
+
23674 j1.swap(j2);
+
23675 }
+
23676
+
23677#endif
+
23678
+
23679} // namespace std
+
23680
+
23681#if JSON_USE_GLOBAL_UDLS
+
23682#if !defined(JSON_HEDLEY_GCC_VERSION) || JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
+
23683using nlohmann::literals::json_literals::operator""_json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers)
+
23684using nlohmann::literals::json_literals::operator""_json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers)
+
23685#else
+
23686 // GCC 4.8 requires a space between "" and suffix
+
23687using nlohmann::literals::json_literals::operator"" _json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers)
+
23688using nlohmann::literals::json_literals::operator"" _json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers)
+
23689#endif
+
23690#endif
+
23691
+
23692// #include <nlohmann/detail/macro_unscope.hpp>
+
23693// __ _____ _____ _____
+
23694// __| | __| | | | JSON for Modern C++
+
23695// | | |__ | | | | | | version 3.12.0
+
23696// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
23697//
+
23698// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
23699// SPDX-License-Identifier: MIT
+
23700
+
23701
+
23702
+
23703// restore clang diagnostic settings
+
23704#if defined(__clang__)
+
23705#pragma clang diagnostic pop
+
23706#endif
+
23707
+
23708// clean up
+
23709#undef JSON_ASSERT
+
23710#undef JSON_INTERNAL_CATCH
+
23711#undef JSON_THROW
+
23712#undef JSON_PRIVATE_UNLESS_TESTED
+
23713#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
+
23714#undef NLOHMANN_BASIC_JSON_TPL
+
23715#undef JSON_EXPLICIT
+
23716#undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL
+
23717#undef JSON_INLINE_VARIABLE
+
23718#undef JSON_NO_UNIQUE_ADDRESS
+
23719#undef JSON_DISABLE_ENUM_SERIALIZATION
+
23720#undef JSON_USE_GLOBAL_UDLS
+
23721
+
23722#ifndef JSON_TEST_KEEP_MACROS
+
23723#undef JSON_CATCH
+
23724#undef JSON_TRY
+
23725#undef JSON_HAS_CPP_11
+
23726#undef JSON_HAS_CPP_14
+
23727#undef JSON_HAS_CPP_17
+
23728#undef JSON_HAS_CPP_20
+
23729#undef JSON_HAS_CPP_23
+
23730#undef JSON_HAS_CPP_26
+
23731#undef JSON_HAS_FILESYSTEM
+
23732#undef JSON_HAS_EXPERIMENTAL_FILESYSTEM
+
23733#undef JSON_HAS_THREE_WAY_COMPARISON
+
23734#undef JSON_HAS_RANGES
+
23735#undef JSON_HAS_STATIC_RTTI
+
23736#undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
+
23737#endif
+
23738
+
23739// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
+
23740// __ _____ _____ _____
+
23741// __| | __| | | | JSON for Modern C++
+
23742// | | |__ | | | | | | version 3.12.0
+
23743// |_____|_____|_____|_|___| https://github.com/nlohmann/json
+
23744//
+
23745// SPDX-FileCopyrightText: 2013-2026 Niels Lohmann <https://nlohmann.me>
+
23746// SPDX-License-Identifier: MIT
+
23747
+
23748
+
23749
+
23750#undef JSON_HEDLEY_ALWAYS_INLINE
+
23751#undef JSON_HEDLEY_ARM_VERSION
+
23752#undef JSON_HEDLEY_ARM_VERSION_CHECK
+
23753#undef JSON_HEDLEY_ARRAY_PARAM
+
23754#undef JSON_HEDLEY_ASSUME
+
23755#undef JSON_HEDLEY_BEGIN_C_DECLS
+
23756#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
+
23757#undef JSON_HEDLEY_CLANG_HAS_BUILTIN
+
23758#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
+
23759#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
+
23760#undef JSON_HEDLEY_CLANG_HAS_EXTENSION
+
23761#undef JSON_HEDLEY_CLANG_HAS_FEATURE
+
23762#undef JSON_HEDLEY_CLANG_HAS_WARNING
+
23763#undef JSON_HEDLEY_COMPCERT_VERSION
+
23764#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
+
23765#undef JSON_HEDLEY_CONCAT
+
23766#undef JSON_HEDLEY_CONCAT3
+
23767#undef JSON_HEDLEY_CONCAT3_EX
+
23768#undef JSON_HEDLEY_CONCAT_EX
+
23769#undef JSON_HEDLEY_CONST
+
23770#undef JSON_HEDLEY_CONSTEXPR
+
23771#undef JSON_HEDLEY_CONST_CAST
+
23772#undef JSON_HEDLEY_CPP_CAST
+
23773#undef JSON_HEDLEY_CRAY_VERSION
+
23774#undef JSON_HEDLEY_CRAY_VERSION_CHECK
+
23775#undef JSON_HEDLEY_C_DECL
+
23776#undef JSON_HEDLEY_DEPRECATED
+
23777#undef JSON_HEDLEY_DEPRECATED_FOR
+
23778#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
+
23779#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
+
23780#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
+
23781#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
+
23782#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
+
23783#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION
+
23784#undef JSON_HEDLEY_DIAGNOSTIC_POP
+
23785#undef JSON_HEDLEY_DIAGNOSTIC_PUSH
+
23786#undef JSON_HEDLEY_DMC_VERSION
+
23787#undef JSON_HEDLEY_DMC_VERSION_CHECK
+
23788#undef JSON_HEDLEY_EMPTY_BASES
+
23789#undef JSON_HEDLEY_EMSCRIPTEN_VERSION
+
23790#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
+
23791#undef JSON_HEDLEY_END_C_DECLS
+
23792#undef JSON_HEDLEY_FLAGS
+
23793#undef JSON_HEDLEY_FLAGS_CAST
+
23794#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
+
23795#undef JSON_HEDLEY_GCC_HAS_BUILTIN
+
23796#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
+
23797#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
+
23798#undef JSON_HEDLEY_GCC_HAS_EXTENSION
+
23799#undef JSON_HEDLEY_GCC_HAS_FEATURE
+
23800#undef JSON_HEDLEY_GCC_HAS_WARNING
+
23801#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
+
23802#undef JSON_HEDLEY_GCC_VERSION
+
23803#undef JSON_HEDLEY_GCC_VERSION_CHECK
+
23804#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
+
23805#undef JSON_HEDLEY_GNUC_HAS_BUILTIN
+
23806#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
+
23807#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
+
23808#undef JSON_HEDLEY_GNUC_HAS_EXTENSION
+
23809#undef JSON_HEDLEY_GNUC_HAS_FEATURE
+
23810#undef JSON_HEDLEY_GNUC_HAS_WARNING
+
23811#undef JSON_HEDLEY_GNUC_VERSION
+
23812#undef JSON_HEDLEY_GNUC_VERSION_CHECK
+
23813#undef JSON_HEDLEY_HAS_ATTRIBUTE
+
23814#undef JSON_HEDLEY_HAS_BUILTIN
+
23815#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
+
23816#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
+
23817#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
+
23818#undef JSON_HEDLEY_HAS_EXTENSION
+
23819#undef JSON_HEDLEY_HAS_FEATURE
+
23820#undef JSON_HEDLEY_HAS_WARNING
+
23821#undef JSON_HEDLEY_IAR_VERSION
+
23822#undef JSON_HEDLEY_IAR_VERSION_CHECK
+
23823#undef JSON_HEDLEY_IBM_VERSION
+
23824#undef JSON_HEDLEY_IBM_VERSION_CHECK
+
23825#undef JSON_HEDLEY_IMPORT
+
23826#undef JSON_HEDLEY_INLINE
+
23827#undef JSON_HEDLEY_INTEL_CL_VERSION
+
23828#undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK
+
23829#undef JSON_HEDLEY_INTEL_VERSION
+
23830#undef JSON_HEDLEY_INTEL_VERSION_CHECK
+
23831#undef JSON_HEDLEY_IS_CONSTANT
+
23832#undef JSON_HEDLEY_IS_CONSTEXPR_
+
23833#undef JSON_HEDLEY_LIKELY
+
23834#undef JSON_HEDLEY_MALLOC
+
23835#undef JSON_HEDLEY_MCST_LCC_VERSION
+
23836#undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK
+
23837#undef JSON_HEDLEY_MESSAGE
+
23838#undef JSON_HEDLEY_MSVC_VERSION
+
23839#undef JSON_HEDLEY_MSVC_VERSION_CHECK
+
23840#undef JSON_HEDLEY_NEVER_INLINE
+
23841#undef JSON_HEDLEY_NON_NULL
+
23842#undef JSON_HEDLEY_NO_ESCAPE
+
23843#undef JSON_HEDLEY_NO_RETURN
+
23844#undef JSON_HEDLEY_NO_THROW
+
23845#undef JSON_HEDLEY_NULL
+
23846#undef JSON_HEDLEY_PELLES_VERSION
+
23847#undef JSON_HEDLEY_PELLES_VERSION_CHECK
+
23848#undef JSON_HEDLEY_PGI_VERSION
+
23849#undef JSON_HEDLEY_PGI_VERSION_CHECK
+
23850#undef JSON_HEDLEY_PREDICT
+
23851#undef JSON_HEDLEY_PRINTF_FORMAT
+
23852#undef JSON_HEDLEY_PRIVATE
+
23853#undef JSON_HEDLEY_PUBLIC
+
23854#undef JSON_HEDLEY_PURE
+
23855#undef JSON_HEDLEY_REINTERPRET_CAST
+
23856#undef JSON_HEDLEY_REQUIRE
+
23857#undef JSON_HEDLEY_REQUIRE_CONSTEXPR
+
23858#undef JSON_HEDLEY_REQUIRE_MSG
+
23859#undef JSON_HEDLEY_RESTRICT
+
23860#undef JSON_HEDLEY_RETURNS_NON_NULL
+
23861#undef JSON_HEDLEY_SENTINEL
+
23862#undef JSON_HEDLEY_STATIC_ASSERT
+
23863#undef JSON_HEDLEY_STATIC_CAST
+
23864#undef JSON_HEDLEY_STRINGIFY
+
23865#undef JSON_HEDLEY_STRINGIFY_EX
+
23866#undef JSON_HEDLEY_SUNPRO_VERSION
+
23867#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
+
23868#undef JSON_HEDLEY_TINYC_VERSION
+
23869#undef JSON_HEDLEY_TINYC_VERSION_CHECK
+
23870#undef JSON_HEDLEY_TI_ARMCL_VERSION
+
23871#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
+
23872#undef JSON_HEDLEY_TI_CL2000_VERSION
+
23873#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
+
23874#undef JSON_HEDLEY_TI_CL430_VERSION
+
23875#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
+
23876#undef JSON_HEDLEY_TI_CL6X_VERSION
+
23877#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
+
23878#undef JSON_HEDLEY_TI_CL7X_VERSION
+
23879#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
+
23880#undef JSON_HEDLEY_TI_CLPRU_VERSION
+
23881#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
+
23882#undef JSON_HEDLEY_TI_VERSION
+
23883#undef JSON_HEDLEY_TI_VERSION_CHECK
+
23884#undef JSON_HEDLEY_UNAVAILABLE
+
23885#undef JSON_HEDLEY_UNLIKELY
+
23886#undef JSON_HEDLEY_UNPREDICTABLE
+
23887#undef JSON_HEDLEY_UNREACHABLE
+
23888#undef JSON_HEDLEY_UNREACHABLE_RETURN
+
23889#undef JSON_HEDLEY_VERSION
+
23890#undef JSON_HEDLEY_VERSION_DECODE_MAJOR
+
23891#undef JSON_HEDLEY_VERSION_DECODE_MINOR
+
23892#undef JSON_HEDLEY_VERSION_DECODE_REVISION
+
23893#undef JSON_HEDLEY_VERSION_ENCODE
+
23894#undef JSON_HEDLEY_WARNING
+
23895#undef JSON_HEDLEY_WARN_UNUSED_RESULT
+
23896#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
+
23897#undef JSON_HEDLEY_FALL_THROUGH
+
23898
+
23899
+
23900
+
23901#endif // INCLUDE_NLOHMANN_JSON_HPP_
+
namespace for Niels Lohmann
Definition json.hpp:18860
+
an internal type for a backed binary type
Definition json.hpp:6080
+
byte_container_with_subtype() noexcept(noexcept(container_type()))
Definition json.hpp:6086
+
byte_container_with_subtype(container_type &&b, subtype_type subtype_) noexcept(noexcept(container_type(std::move(b))))
Definition json.hpp:6104
+
byte_container_with_subtype(container_type &&b) noexcept(noexcept(container_type(std::move(b))))
Definition json.hpp:6094
+
constexpr subtype_type subtype() const noexcept
return the binary subtype
Definition json.hpp:6127
+
byte_container_with_subtype(const container_type &b, subtype_type subtype_) noexcept(noexcept(container_type(b)))
Definition json.hpp:6098
+
constexpr bool has_subtype() const noexcept
return whether the value has a subtype
Definition json.hpp:6133
+
byte_container_with_subtype(const container_type &b) noexcept(noexcept(container_type(b)))
Definition json.hpp:6090
+
void set_subtype(subtype_type subtype_) noexcept
sets the binary subtype
Definition json.hpp:6120
+
void clear_subtype() noexcept
clears the binary subtype
Definition json.hpp:6139
+
deserialization of CBOR, MessagePack, and UBJSON values
Definition json.hpp:9454
+
binary_reader(InputAdapterType &&adapter, const input_format_t format=input_format_t::json) noexcept
create a binary reader
Definition json.hpp:9470
+
bool sax_parse(const input_format_t format, json_sax_t *sax_, const bool strict=true, const cbor_tag_handler_t tag_handler=cbor_tag_handler_t::error)
Definition json.hpp:9490
+
void write_bson(const BasicJsonType &j)
Definition json.hpp:14962
+
void write_ubjson(const BasicJsonType &j, const bool use_count, const bool use_type, const bool add_prefix=true, const bool use_bjdata=false, const bjdata_version_t bjdata_version=bjdata_version_t::draft2)
Definition json.hpp:15552
+
binary_writer(output_adapter_t< CharType > adapter)
create a binary writer
Definition json.hpp:14954
+
void write_msgpack(const BasicJsonType &j)
Definition json.hpp:15264
+
void write_cbor(const BasicJsonType &j)
Definition json.hpp:14989
+
general exception of the basic_json class
Definition json.hpp:4489
+
const int id
the id of the exception
Definition json.hpp:4497
+
const char * what() const noexcept override
returns the explanatory string
Definition json.hpp:4492
+
Definition json.hpp:6363
+
Definition json.hpp:6404
+
exception indicating errors with iterators
Definition json.hpp:4638
+
iter_impl operator+(difference_type i) const
add to iterator
Definition json.hpp:13488
+
iter_impl(pointer object) noexcept
constructor for a given JSON instance
Definition json.hpp:12992
+
iter_impl & operator=(const iter_impl< typename std::remove_const< BasicJsonType >::type > &other) noexcept
converting assignment
Definition json.hpp:13071
+
bool operator>=(const iter_impl &other) const
comparison: greater than or equal
Definition json.hpp:13437
+
iter_impl(const iter_impl< typename std::remove_const< BasicJsonType >::type > &other) noexcept
converting constructor
Definition json.hpp:13062
+
bool operator<(const iter_impl &other) const
comparison: smaller
Definition json.hpp:13385
+
bool operator<=(const iter_impl &other) const
comparison: less than or equal
Definition json.hpp:13421
+
iter_impl & operator-=(difference_type i)
subtract from iterator
Definition json.hpp:13480
+
iter_impl & operator--()
pre-decrement (–it)
Definition json.hpp:13302
+
const object_t::key_type & key() const
return the key of an object iterator
Definition json.hpp:13580
+
bool operator==(const IterImpl &other) const
comparison: equal
Definition json.hpp:13341
+
iter_impl operator++(int) &
post-increment (it++)
Definition json.hpp:13242
+
iter_impl & operator+=(difference_type i)
add to iterator
Definition json.hpp:13445
+
reference operator[](difference_type n) const
access to successor
Definition json.hpp:13545
+
pointer operator->() const
dereference the iterator
Definition json.hpp:13203
+
difference_type operator-(const iter_impl &other) const
return difference
Definition json.hpp:13518
+
friend iter_impl operator+(difference_type i, const iter_impl &it)
addition of distance and iterator
Definition json.hpp:13498
+
reference value() const
return the value of an iterator
Definition json.hpp:13594
+
bool operator>(const iter_impl &other) const
comparison: greater than
Definition json.hpp:13429
+
iter_impl & operator++()
pre-increment (++it)
Definition json.hpp:13253
+
reference operator*() const
return a reference to the value pointed to by the iterator
Definition json.hpp:13162
+
iter_impl operator-(difference_type i) const
subtract from iterator
Definition json.hpp:13508
+
iter_impl & operator=(const iter_impl< const BasicJsonType > &other) noexcept
converting assignment
Definition json.hpp:13049
+
bool operator!=(const IterImpl &other) const
comparison: not equal
Definition json.hpp:13377
+
iter_impl operator--(int) &
post-decrement (it–)
Definition json.hpp:13291
+
iter_impl(const iter_impl< const BasicJsonType > &other) noexcept
const copy constructor
Definition json.hpp:13040
+
void set_end() noexcept
set the iterator past the last value
Definition json.hpp:13125
+
Definition json.hpp:5417
+
bool operator==(const iteration_proxy_value &o) const
equality operator (needed for InputIterator)
Definition json.hpp:5479
+
bool operator!=(const iteration_proxy_value &o) const
inequality operator (needed for range-based for)
Definition json.hpp:5484
+
iteration_proxy_value & operator++()
increment operator (needed for range-based for)
Definition json.hpp:5463
+
const iteration_proxy_value & operator*() const
dereference operator (needed for range-based for)
Definition json.hpp:5458
+
IteratorType::reference value() const
return value of the iterator
Definition json.hpp:5522
+
const string_type & key() const
return key of the iterator
Definition json.hpp:5489
+
proxy class for the items() function
Definition json.hpp:5528
+
iteration_proxy_value< IteratorType > end() const noexcept
return iterator end (needed for range-based for)
Definition json.hpp:5552
+
iteration_proxy_value< IteratorType > begin() const noexcept
return iterator begin (needed for range-based for)
Definition json.hpp:5547
+
iteration_proxy(typename IteratorType::reference cont) noexcept
construct iteration proxy from a container
Definition json.hpp:5537
+
Definition json.hpp:6461
+
Definition json.hpp:14702
+
Definition json.hpp:9189
+
Definition json.hpp:8798
+
SAX implementation to create a JSON value from SAX events.
Definition json.hpp:8521
+
json_sax_dom_parser(BasicJsonType &r, const bool allow_exceptions_=true, lexer_t *lexer_=nullptr)
Definition json.hpp:8535
+
Definition json.hpp:6861
+
JSON_HEDLEY_RETURNS_NON_NULL static JSON_HEDLEY_CONST const char * token_type_name(const token_type t) noexcept
return name of values of type token_type (only used for errors)
Definition json.hpp:6887
+
token_type
token types for the parser
Definition json.hpp:6864
+
@ value_float
an floating point number – use get_number_float() for actual value
Definition json.hpp:6872
+
@ begin_array
the character for array begin [
Definition json.hpp:6873
+
@ value_string
a string – use get_string() for actual value
Definition json.hpp:6869
+
@ end_array
the character for array end ]
Definition json.hpp:6875
+
@ uninitialized
indicating the scanner is uninitialized
Definition json.hpp:6865
+
@ parse_error
indicating a parse error
Definition json.hpp:6879
+
@ value_integer
a signed integer – use get_number_integer() for actual value
Definition json.hpp:6871
+
@ value_separator
the value separator ,
Definition json.hpp:6878
+
@ end_object
the character for object end }
Definition json.hpp:6876
+
@ literal_true
the true literal
Definition json.hpp:6866
+
@ begin_object
the character for object begin {
Definition json.hpp:6874
+
@ value_unsigned
an unsigned integer – use get_number_unsigned() for actual value
Definition json.hpp:6870
+
@ literal_null
the null literal
Definition json.hpp:6868
+
@ end_of_input
indicating the end of the input buffer
Definition json.hpp:6880
+
@ name_separator
the name separator :
Definition json.hpp:6877
+
@ literal_or_value
a literal or the begin of a value (only for diagnostics)
Definition json.hpp:6881
+
@ literal_false
the false literal
Definition json.hpp:6867
+
lexical analysis
Definition json.hpp:6934
+
bool skip_bom()
skip the UTF-8 byte order mark
Definition json.hpp:8234
+
JSON_HEDLEY_RETURNS_NON_NULL constexpr const char * get_error_message() const noexcept
return syntax error message
Definition json.hpp:8222
+
std::string get_token_string() const
Definition json.hpp:8201
+
constexpr number_integer_t get_number_integer() const noexcept
return integer value
Definition json.hpp:8166
+
constexpr position_t get_position() const noexcept
return position of last read token
Definition json.hpp:8194
+
constexpr number_unsigned_t get_number_unsigned() const noexcept
return unsigned integer value
Definition json.hpp:8171
+
string_t & get_string()
return current string value (implicitly resets the token; useful only once)
Definition json.hpp:8181
+
constexpr number_float_t get_number_float() const noexcept
return floating-point value
Definition json.hpp:8176
+
exception indicating other library errors
Definition json.hpp:4684
+
exception indicating access out of the defined range
Definition json.hpp:4669
+
Definition json.hpp:14898
+
Definition json.hpp:14858
+
Definition json.hpp:14879
+
Definition json.hpp:14837
+
exception indicating a parse error
Definition json.hpp:4589
+
static parse_error create(int id_, const position_t &pos, const std::string &what_arg, BasicJsonContext context)
create a parse error exception
Definition json.hpp:4601
+
const std::size_t byte
byte index of the parse error
Definition json.hpp:4624
+
void parse(const bool strict, BasicJsonType &result)
public parser interface
Definition json.hpp:12340
+
bool accept(const bool strict=true)
public accept interface
Definition json.hpp:12392
+
Definition json.hpp:12773
+
Definition json.hpp:17649
+
serializer(output_adapter_t< char > s, const char ichar, error_handler_t error_handler_=error_handler_t::strict)
Definition json.hpp:17664
+
void dump(const BasicJsonType &val, const bool pretty_print, const bool ensure_ascii, const unsigned int indent_step, const unsigned int current_indent=0)
internal implementation of the serialization function
Definition json.hpp:17703
+
Definition json.hpp:6775
+
exception indicating executing a member function with a wrong type
Definition json.hpp:4654
+
Definition json.hpp:6612
+
JSON Pointer defines a string syntax for identifying a specific value within a JSON document.
Definition json.hpp:3517
+
implements the Grisu2 algorithm for binary to decimal floating-point conversion.
Definition json.hpp:16586
+
int find_largest_pow10(const std::uint32_t n, std::uint32_t &pow10)
Definition json.hpp:17024
+
cached_power get_cached_power_for_binary_exponent(int e)
Definition json.hpp:16861
+
boundaries compute_boundaries(FloatType value)
Definition json.hpp:16723
+
void grisu2(char *buf, int &len, int &decimal_exponent, diyfp m_minus, diyfp v, diyfp m_plus)
Definition json.hpp:17343
+
void grisu2_digit_gen(char *buffer, int &length, int &decimal_exponent, diyfp M_minus, diyfp w, diyfp M_plus)
Definition json.hpp:17107
+
JSON_HEDLEY_RETURNS_NON_NULL char * append_exponent(char *buf, int e)
appends a decimal representation of e to buf
Definition json.hpp:17441
+
JSON_HEDLEY_RETURNS_NON_NULL char * format_buffer(char *buf, int len, int decimal_exponent, int min_exp, int max_exp)
prettify v = buf * 10^decimal_exponent
Definition json.hpp:17487
+
detail namespace with internal helper functions
Definition json.hpp:259
+
input_format_t
the supported input formats
Definition json.hpp:6352
+
JSON_HEDLEY_RETURNS_NON_NULL char * to_chars(char *first, const char *last, FloatType value)
generates a decimal representation of the floating-point number value in [first, last).
Definition json.hpp:17566
+
void replace_substring(StringType &s, const StringType &f, const StringType &t)
replace all occurrences of a substring by another string
Definition json.hpp:3091
+
bool little_endianness(int num=1) noexcept
determine system byte order
Definition json.hpp:9442
+
cbor_tag_handler_t
how to treat CBOR tags
Definition json.hpp:9429
+
@ ignore
ignore tags
Definition json.hpp:9431
+
@ store
store tags as binary type
Definition json.hpp:9432
+
@ error
throw a parse_error exception in case of a tag
Definition json.hpp:9430
+
value_t
the JSON type enumeration
Definition json.hpp:2996
+
@ null
null value
Definition json.hpp:2997
+
@ number_integer
number value (signed integer)
Definition json.hpp:3002
+
@ boolean
boolean value
Definition json.hpp:3001
+
@ discarded
discarded by the parser callback function
Definition json.hpp:3006
+
@ binary
binary array (ordered collection of bytes)
Definition json.hpp:3005
+
@ object
object (unordered set of name/value pairs)
Definition json.hpp:2998
+
@ string
string value
Definition json.hpp:3000
+
@ number_float
number value (floating-point)
Definition json.hpp:3004
+
@ number_unsigned
number value (unsigned integer)
Definition json.hpp:3003
+
@ array
array (ordered collection of values)
Definition json.hpp:2999
+
std::size_t hash(const BasicJsonType &j)
hash a JSON value
Definition json.hpp:6198
+
void unescape(StringType &s)
string unescaping as described in RFC 6901 (Sect. 4)
Definition json.hpp:3124
+
bool operator<(const value_t lhs, const value_t rhs) noexcept
comparison operator for JSON types
Definition json.hpp:3025
+
error_handler_t
Definition json.hpp:17642
+
@ strict
throw a type_error exception in case of invalid UTF-8
Definition json.hpp:17643
+
@ replace
replace invalid UTF-8 sequences with U+FFFD
Definition json.hpp:17644
+
StringType escape(StringType s)
string escaping as described in RFC 6901 (Sect. 4)
Definition json.hpp:3110
+
namespace for Niels Lohmann
Definition json.hpp:6026
+
static auto to_json(BasicJsonType &j, TargetType &&val) noexcept(noexcept(::nlohmann::to_json(j, std::forward< TargetType >(val)))) -> decltype(::nlohmann::to_json(j, std::forward< TargetType >(val)), void())
convert any value type to a JSON value
Definition json.hpp:6048
+
static auto from_json(BasicJsonType &&j) noexcept(noexcept(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))
convert a JSON value to any value type
Definition json.hpp:6039
+
static auto from_json(BasicJsonType &&j, TargetType &val) noexcept(noexcept(::nlohmann::from_json(std::forward< BasicJsonType >(j), val))) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), val), void())
convert a JSON value to any value type
Definition json.hpp:6030
+
Definition json.hpp:3682
+
Definition json.hpp:3698
+
Definition json.hpp:3765
+ +
Definition json.hpp:4814
+
Definition json.hpp:4791
+
Definition json.hpp:4811
+
Definition json.hpp:4802
+
Definition json.hpp:4808
+
Definition json.hpp:4782
+
Definition json.hpp:4805
+
Definition json.hpp:287
+
Definition json.hpp:16710
+
Definition json.hpp:16848
+
Definition json.hpp:16598
+
static diyfp mul(const diyfp &x, const diyfp &y) noexcept
returns x * y
Definition json.hpp:16621
+
static diyfp normalize_to(const diyfp &x, const int target_exponent) noexcept
normalize x such that the result has the exponent E
Definition json.hpp:16700
+
static diyfp normalize(diyfp x) noexcept
normalize x such that the significand is >= 2^(q-1)
Definition json.hpp:16685
+
static diyfp sub(const diyfp &x, const diyfp &y) noexcept
returns x - y
Definition json.hpp:16610
+
Definition json.hpp:5632
+
Definition json.hpp:5297
+
Definition json.hpp:3626
+
Definition json.hpp:3678
+
Definition json.hpp:3649
+
Definition json.hpp:3663
+
Definition json.hpp:4726
+
Definition json.hpp:3236
+
an iterator value
Definition json.hpp:12874
+
Definition json.hpp:3575
+
Definition json.hpp:3563
+
Definition json.hpp:4301
+
Definition json.hpp:4108
+ +
Definition json.hpp:3961
+ +
Definition json.hpp:4032
+ +
Definition json.hpp:3884
+ +
Definition json.hpp:4069
+
Definition json.hpp:3920
+
Definition json.hpp:4035
+
Definition json.hpp:4048
+
Definition json.hpp:3857
+ +
Definition json.hpp:4005
+ +
Definition json.hpp:3917
+
Definition json.hpp:3926
+
Definition json.hpp:4072
+
Definition json.hpp:3797
+
Definition json.hpp:3778
+
Definition json.hpp:302
+
Definition json.hpp:3633
+
Definition json.hpp:6669
+
Definition json.hpp:3812
+
Definition json.hpp:4078
+
Definition json.hpp:4098
+
Definition json.hpp:3585
+
Definition json.hpp:4175
+
Definition json.hpp:4172
+
Definition json.hpp:3829
+
Definition json.hpp:9363
+
Definition json.hpp:9333
+
Definition json.hpp:4088
+
Definition json.hpp:4321
+ +
Definition json.hpp:3396
+
Definition json.hpp:3378
+
Default base class of the basic_json class.
Definition json.hpp:13763
+
Definition json.hpp:261
+
Definition json.hpp:3772
+
Definition json.hpp:274
+
struct to capture the start position of the current token
Definition json.hpp:3152
+
std::size_t chars_read_current_line
the number of characters read in the current line
Definition json.hpp:3156
+
std::size_t lines_read
the number of lines read
Definition json.hpp:3158
+
std::size_t chars_read_total
the total number of characters read
Definition json.hpp:3154
+
Definition json.hpp:3313
+
Definition json.hpp:3318
+
Definition json.hpp:5995
+
Definition json.hpp:3254
+
Definition json.hpp:3270
+
Definition json.hpp:4256
+
Definition json.hpp:4218
+
Definition json.hpp:6507
+
SAX interface.
Definition json.hpp:8389
+
virtual bool binary(binary_t &val)=0
a binary value was read
+
virtual bool number_float(number_float_t val, const string_t &s)=0
a floating-point number was read
+
virtual bool number_unsigned(number_unsigned_t val)=0
an unsigned integer number was read
+
virtual bool key(string_t &val)=0
an object key was read
+
virtual bool string(string_t &val)=0
a string value was read
+
virtual bool number_integer(number_integer_t val)=0
an integer number was read
+
virtual bool start_object(std::size_t elements)=0
the beginning of an object was read
+
virtual bool end_array()=0
the end of an array was read
+
virtual bool boolean(bool val)=0
a boolean value was read
+
virtual bool end_object()=0
the end of an object was read
+
virtual bool null()=0
a null value was read
+
virtual bool parse_error(std::size_t position, const std::string &last_token, const detail::exception &ex)=0
a parse error occurred
+
virtual bool start_array(std::size_t elements)=0
the beginning of an array was read
+
a minimal map-like container that preserves insertion order
Definition json.hpp:3528
+
bool operator()(::nlohmann::detail::value_t lhs, ::nlohmann::detail::value_t rhs) const noexcept
compare two value_t enum values
Definition json.hpp:23655
+
Definition json.hpp:13824
+
+
+
+ + + + diff --git a/doc/html/logo channel.png b/doc/html/logo channel.png new file mode 100644 index 0000000000000000000000000000000000000000..880f732143f63ea10013e8f05ee9bbfb4fd8844f GIT binary patch literal 62562 zcmZU41z1#3+wIUpI&?~>QbU7uD4n99ba#V8cQ?}AASg&EDa`=Vg3?k_0@9Mg-F)|Z z{(J9pdCtHT=j^lhyZ5`^wbqW-RDXt#Lxlr@K=73m<+ULYR2T3Z0mTHr-Im9n zrY-;Uzuy3_Bp7WxJY2+hc;38u!~KSz+u6;U2QDfq%EQaY!^g)3zQN`0?c`yK;Bs)|A!cQ2C1_@0A;@KB%5T91hg+C(nOg9} zxh(kkErbQ(B79bGGsgd3-ow`F|6Je6{lDD+I)vx`6COA>?|qZ+pNna@*;;~D++R`> zF8-g-|DX57dF~tXe>F_9n6+HW&p1JR)|LI*zC(xyDK;LnuX5vC1#}-QRGS3l4 zd;Xre%>7HZI^X%YcmKTc<<50^v$#q|ABMi>z3$XGn;wGQ&b>7Q0)n zfByN|y0C|M^Y6CucgtKp?c7qnKj<5fJ zFSJBpC&9APDW&ARNIR76%>x{0)$SEPgdn?<9adAC$_=|?g)l>=L;6nj&EhDxayo~f zW@#%6s9iq_DhW$k;3!il_sJu+$^NSkX=PR_5Dt7(LqB{>&X}y2bBW+1QPBUedv!fB zFwXD?4TgEhcS3%rHsSe&JV@?z=GPmhEF^rp)#=Rt*qiqsGKK^KW#IoR^pEv&dGlaI z^(7LINH*>&Ydo34TmrHdmV|T{m(17D^f0_5Ww793_(cs7fQT%g|CbR)SuZi`*{%U?YLtO$+P`Zt~z!glaHou_|d}K`Jg| zWkcaVDt51)LaaxYHz*&KoeD6NB5(Rzf@*fp`H+%~O5floZ?<5|W^wz>VK?*OlaQL- zCVr%(g=9XS@(vc1p(!V^;4v>UpCQZx7146pcE`$#l!ee3q+it{OZD1YMvQNSgW-Qg z%pGF1uVhc&+^Lzw?X!d}Vy=vD9^4M|mfOysrG7Iel*Q{G3}gz)F6TmnKSQd^jMdmu^_r6UcsMb%V*>Zg>(i_BD7$9;#%W{(=@ zK8DFwQJTL&iOTL&>8ZwMpdP^*CxtQuKy)FC;DR~QP}4BjU%I{8EnJUD%=*jNJ64#i zUs#e4gy6n$^kK6U=G52>W%rFUDM>X_g4)6ZkBl+HVQx|I&oeg|W8qy4O5dCzBd`^U z$GM!ApNg&H{9nwRjb|lp;ii5&hsk!B`&q@w%-}Xr%R*7g=C;1LFO6B9{rW)D%-D*rv#>vjC`bl%|7w-DVT<=|?DrMI>{pb_PwaGPD2!^Fhd2cbf z?L5dX&w3!iX8QX9$AvQmUDwuR+{xEKmB65P8r!V_!sdIMlx)ya=MOhsY)ao;A*9G) zS*b7qp3oZGd0hytU|{kC#gx-$4Qg+ftkC#8kS!rmD3U~@r52C;o-p~pF2Eq%*9>xc z3bAQTsC@SjMA;MbJtQU8xNI`BtyB;T5=9p3Aha;jaEy*hUt=59&zDoDsa#YQbJ5@6 zE<1*f8iEi{&=YsMwZpW~k0>5&$A*e7*ek9DD&47G8Ho@4>a^~JRPxI37sy4qK4dh~ zU9WW=8(Bw3zv*lUj6bmU6Z)OsjD;!-Wmf7r9E3g{Kx*%1p(|+7s}SkUcSsl7Qt`ai z=I$%w`O}VuA|pUHEbT3}gYRnLfJ83GzMFqoegM%CY1;a6OMk89Y?O;ib z5{%3A=+MaCD5Tk;k2w1;v0$PQMS+-_KeXGbO%Aw*Gn1MxBV)M@5^d6tPW>QdB*bsu zM#(c(vOf+jw4*FglH6@gD2pXu zO($Q<)P-bmSt#}NO_K!N?k<~(iR9I{n#XzK_%`2C8jsL9Deo}IDx!t0G+KREZa*1y zmgl4$zs8x{aaqgnTu$_*L-2lplU9Q)#$&OIKC13l?^AksQ z(7QG{m6XzONkYW$l!AN7jnJWrt3s^JkbCjy-xJq^fBakL9#2%>l^D{3sci`PY2o)n z0RJFhH|OYEMmuy0Ww+b5#zib|_U{OR-{xl?IqM%hp_&RmQ#1r4Ifq|Um}^itzO$t= zy8HcdRgk9>W6BnDr6mN0s-Sh)@4OgXkspApFOi$RkCLc2o%^HE2wCs;*OJMidtQF) zPnL(p7&=e;g;zh+26BZInf%-}X_|8xIRDcpcNZW~M$lRlm=FJ(MTsRU1my}19w%3B{lt3f5O*gsJKP8y5d-hGfqb4cFztGT&L2Jp#qa*BL$)a5`Fx@{C+=!&} z7>2lrI7pV!Cs|_mGL<0qqANZkCS~8h>fk(3CPxc{RmOzyEFW<>_*z9;KC#KhY#WWJ z^}FS_sjPj*Oaw1*Gm=SRR#jDBtNWl~diHh0#?EF?>B0+)Sc~-o$-9l(tmXJ+kf^2j z$GP95)J4L*%I>?dIai(2upLTF{PuoCEZIqV5|-MEcCyP3F>8MKVV9kTZmypM*X-ut zud2;>YDSyMs1WxgvzwVMup3WP_JWm4{f$R%qNiyvGSGX)BlX@hslL0@bVKZae!_i_D zl5c&C21O{@h7})bXV-C17P&x^Z6c1C$Rew%py9nxbkqp}uCv^e%w$CpBMmRQ{GoS{ z^8RAhPh186;s(|ay}z(?a0@N_poY1eg#P>~sp-w(S;wr5XUgOcsfFe4+nC{#oTV(M&2aI>?u zw2TP+H;XrLARWKZ*h?WGHCdUzp6n_P$JI2{4M%V`aE&-HC=r1u7IE7PyR0Sw$rG}| zcyiPd0{<+!v&_!JrQolI-^lq_(mj}Qc$=D{>+ta7Wi`5oVPx;Bw7(-)BjQ%~X9}~a zpBXBe9LK^DHZPL?F<(`6RUxVLzB&uGj?NSX?L&AV#-Vk)VoK@bkpYe}>_pab_t&xY z--te2b2 z+9328HK^AV%Y2b6ov7o>wF3j%%K0S`v7wkMRwxuxE{TPsEN%;x(j0VOB`1$C=vH|= zyrnN+fTJmllMN6Im=a513-8-eVJO3UK%U3PBno_dy8Rj!~%5N!Qk>27op!x^2m z%lGOqoSjgk_5D|%<)(h6hKPkQhaEkkDR>_ zK_b~kGSsDK&Sr8F;YcFqa5y5Jgq*xIAw>_aUOI;vT8YMh9#DI(4`&|@Pt~+(O>ck< zNYlUfF7QPU<~-RiIyJ)`qq5BjEMSjZDB^?3Git$;8Lr_M_A!mg@%q^Tg}PlsgR8eB8h4M+9}kLUqH)gUXw(J?@>)i#0FEsg1cq<%<39F0U&%(2;YI3#<2uO%{Qk$y~JzViths{id=khX-=PyWD;=oJ;eyPH(R}7=ST94kaR=>lS|3h^_t7 z)DFg-hDexp#wjIBzXHhM7}ZQ~m=dk3m}tD7v^zbRbr*b&$}l1DaMgtspT;>*L2JZV zd@E`AkvLUsG>q}bzX)tJgnqhro8)jS!IY;dU8-4mcF57uQDbc57OH^ZGhGFY2h?w6 zf~YAU_HNILq`J4{aSE90l9D!i3@glftcrpBLa||KnVFm0QzPN)x_1%X5E6ZP-attM>i z&S@JPmDTTL3}P#$-8-IJP|C^mZtv1%>W4B@ysFzQe_Eqk&u%SQn#xE-P*Pnn;J1Sw zCsSEelRmKgpZ9yh+nabQYl_?7M5M^b@&IkDy?Cy~5_ zkm*&wqVgT6FXL586}u*B8m`OQ7v6$59Yj5n zgIh=0e{MMAPLN>`YwqHMsvoUpb>+CMwxPxCQ z=AIN)v5S275<4m$Cj#i*(DoaZD5Mcp&!pQ5lEYrcAJ&<^$x3qRKk@0td59w>Zmgyz zOgM>@!W`sNSv6f!az?JNSr06gdS?63udpyjGt|2fb-(TGaq9(@IL@C72)JZPL-o0p zzNM{XCt|v1=f@oLIjJNc>^pTQ*TG8|hcfa|YM;%bk`{g#!_rnJjO~ZTTN21fbA&TK z4(ewPL$nbjhffO@g z`6+>I+e+J4e{dK5GOUYhb`P)p*tv%GqH!P+U;OXt_AOZ3t;~-^Jk;dm3?KgZppT!o zLqS0^IQ+xOU}{3s7^`3=2hOS9L*SG!BhcPII)E#KSy)w%`YbW8YbSwV*70+y`+JH+ zd%X@1Y#M?#Z|bvGkgB7(S45d~KZs=0S?FwR?c{ajB-XMqmC}h*Eh$sK>9?Ix=f|gN zYs$K;@FvbF^QorpNJCq?9<_*;of@VvKZGqhuc0WV(4uLEFk^cw**~_>-+V$vmU3pG z1by(z=l7}YVe!P=~yvRQ(%sY>edW=nlN9|yS$>1ke(Y$!t^35hES&LS-ueD6X&xmKw zD;c||_j5_H(eLUz8Jjy=@H?OBRU)-a~n`jHLg`nZ&D+5!TC#bur-+2r{w zcZ(s&P1e-t{+v|P>j!bTU;A15ZEWnM-FH#dOGbWR*u0tuDNnb0{`}Zc(_Eb|BP}5g z4r;gOFD>6#h)hkP8IC(ra~BANMmyflXHy9X3#?4Q!JzaosEL^yk*k`Vjyv%yavs^; zlzzQt1R)u>6KNp+@%RT7vJ%fDMoxoioTeExWsdSt85*&k{pC#@<(=0YWwmOONQySH zAT=AuT-MfR#B@sm9WP=9|vj2C<>&wm<)!2)hoZF3PN1O zIV3XGFX2CBi-J;E+)mRUAT=ZZYEk1A)lTYjr{%Y*3R;DaaKM_69AM)W$~THq#bhW2 zoXrD%#J4J0p&|){W7Z%`(bGwp2(Y()tAwRUtr%`H`z> zMH0!(dclq;eJ3M8;x-_8ZPKTwYX1qhBNM@u*Vi&>T3B@v1BdB2Kk>%=eiCVoK01RR zE+_7q>~ONJmJCODuhTODDmjCxvAj2C9ng?s8UdH}b>gW0b;*BlEj2I^C2uWs{br7oQ&u%#YL=0Hn2;-juCOmkl?VOQbR>1Gy!m^sdaHdFH zXG2$Wxor-F22E3eLqZy=WaG#uLtM4|TIv#x9%`zoyy77;W=A22A9pmX7Q@LTIZWZY zIOdFga5pojQk$!DJ>J-HwU?{!aIv4_}7>=&>-)%$8GF}Ixs7<+ix6D{$qC?P? zTW2i=DH8$MJRv25Zbn2Dk6m3~Oym2Pu4{k!Uw|zA7>X%`_^G;);f!h1LY?IlCYW8p z+Blu#k(MfC=Id9UALpLurz@q7;(f@oG0&e#uy;w3>HD37^Wm7y`3rtzBJJ?(i@TGU zjMcMRA4^6PTgmRO!bgut^dm-{o_YFn?RojuI12IbB4M#l;d~--`{R3Ek&;IoeP;0C z&l6!8R}YO_@$o%9F{10o`hG9W_Ef(A@Kj3+&P+&>`l@s#o1enj7YQ+(;uV!ls2SrH zq45&`e5T~LcG6U~-z?Fnlp}UTl&2@WQ%fNN0|M1#P!?VxP z;d!Ng?$fm+k)CA5pKRDssWRvP)(b9v%#J>&wIUAf$uumOTN$jxW+E{lE=5_GFrM9F*j@aqcn*+GSb+*0wQs~f3BYhy*ET_^WP-1 zlr(L$R&s^kx*hmm%r|w0zWK5-ikR9pLQ~Qztg5nn0!K=B?Z2W6G<*E>dNpw@s=158 z_tngq8ha4rO)#_46Z~FRKv}(f9s06!4*)w^6S5+D0`Uf4VM)(j@~NMRV4}@Fy!iXF zGip9NTfa=AD9k>d&l6LYgJSBaC^3*~KqJ2~H;Uo+QTj|LS#7`$m%cV*S%`K__o`{* zrzUeZH=I=$3RhF%p}q!A?ql->{wH<*1L`N^*7Sz|@buKY07T^p98v>iVR$jSi^!hK z?Ec4veNe1ES5Q#UWvQyFmS&036Nu1c53>;oQDhF$WJl+sjVxx*#6dsoP7LHTZ8D3P ztoV8Tw`r|k*r4Fp;ubl3V1_!UpYrkr*F68)~5rq^MCEnv9LV?qnY;Aoov31BP(MAzl_ zz1j}*Y6CFRNHKI^EpfZl9vehO(J?7FajM z>l~kW?axIX$GE*W^hF{2#2vKsCuq!S)|7!Lp|GOq!NO<90V!G^ign_*%^oKThga>h z&9-RS)Hy3&ZOy6@>yP+lq+xjB6H8N}`x+AQlapGY9$tM{QJ@5!v)XP=_?ALs(CmfZ zF3I!ay#Ygy6M`#`j=qK%CwyXICUSqFpqu}R*V_E!+AhzR#^IXm7LpP?VDR&Otg!yl zibU1b!5tRrh(CS*KHKPuM#iHbru#U(q;gQIWDMQFURYE#y7yUv*@Di((S^) z_Pc;1Jm~NAk1Q`Eq+9BDuY0X$bpDeFxLsJ* z$3cTRE-lVRJ?Zd!-J`?*xGzSKCYqjXJ$m{BD;W~fwiE$qO}|6pf}UT@iK7+~45^D( zLx~_QoQY%ocA$6AgRbTyl5I$i^f>Fr=+QylcF#tu=Q(Y?nnU2#>Cw0zWxyjq^p|}2 z!n7fY2gYC%iRtjOnXs3M39xjPwI9M4_T`z06nIHwnTdc563QBvir+oA<55&sM~h3= zSXf+)%EHp`(wdu883q&?{)c%K4{5sxx7mN52h#P*XMg4sKqkv>6g=9)#A~{!pBli23bnE$=vXP{T{l54sxmHU2EHLxqBYl zlBWav!0&__o@Pb3;nm`DCq+l}DsV`f$x?a>P!K=X{w_F$Pwfoa7I6dqzr6e~|3M&n zZ!c5&zfidJjG*7j(m`MRjA87%AWy?BwAzJusYU+>0WLG+L<1y69LfQ=$cx;?p&z}V zU(^~5Jx+bMHBQz8o%@)a&9Fi!t@|7=F<~u_?g9qN#0IY@W?qPl=@uqPBf9$02g|pD zB;=%J51A>ay2ExmDdRv@Muq(Q@Cg7*(Vwbcn!4KC&)28OK!bsFQsI0}^!Z>m>#wAM zTJQG^^n8Vi3V=PsUK8**G)zJtlH3U~x0eZXtTIw%0Ix5QWo9}wCfIsVW{ps=4 zZnQH%Gx_YakTC9lS)KmYm=APkx*GLSR^lyP&+5mr!ryLUN2fJQ7kyiuNjlz6P1H?+ zM?Z2$Q7WMk*MSAMoCFU=?dHf}mdiKA)JH#?zF7WfqizY}Nl09iD_D^g94dw?&X6J9 zbMU{VrQuq+ORS4!>j?zxJ~ozD@J^Ut((kcqC|Vz(^gA>!P(_SVDH9o4dwH$#byJjl zYa9YylK~M)9@p~6W?&|K5ekoJoqxsYU@Ie!(1pj!e|BfRkf)nLWan#wv?~&4!Vc&& z=%gMVfd2A#T_&wh6|u~q&Y1V~>Ast(ogGe*=3vUIOV|t(jk+mVU@W~w$%KUErYOx^ zYbIp~QZ4=nPUSNM)dmAe?KpbAm_`K$Tn%}@iu98^_9&1WMG02FSPe;gZ0+(d8F9s~$hn{B_p# zuBwuqOHM_{+^ky4|22Ge-|Ir$h?o0vD=iGxw?>6(R+cYLf5VoEU(d|;O*Jbphli>= zWprR%uz`U#QI0<(pqzmsR85ybg->>s*Z5E`*IKD=BA8-NyMx>_PQEw_x!w|an2AAY zeu!9f*(@xhq^65Zjdj=3o-1SN=lDFm1L~SMO_AKp#nI`k1jd2~RmB#hBv6LT{CwoZ zA@uxfBm1~2@N6x>BmEX8S`=~}V?)}pIVghxsH6_Jjy(7f2f!FwBS zd!fwHv$$QDGF%c4(9l8=8GE%H_`atu3)Swf_4JuTo~`mfJS&(D6T}F21wH8*&-3I~ zn+S%X`R~;$XFe^@(%^czxG|XG?Cm;RRsOtUzm8dAi+=G^lupaR%+8+wI+sba{KI1B znop{$prBz)hZ*_w;+F%8AwpM3SWr60QXCF7ReC{k(QfqorLLKbJ28k9w%Pe_aX-@2 z!+4XhKM8&ZNz$a@{eXilhBCBgl^2sgi~^o-3dVfw$}0P-AQ`qSHF@FyVeAoCXePri z6ipIrqbA%mOG}&g)xALfsWTfgGx%txpib*W+oV!CadH4xN{h#m2!bQKqUbWL!!*Xem z=t5#btYThvqAz}#f1oo;WZTWePu?)`@uAXwHJSl9_Y9a1e{huVE*%9V&COX@8ER*5 zH_~5L7-#}PDXAgb7>R7H={-2J#9vP)utiTeA$mTY_Uz-zaY&2Arpmp}MNY<(ot$cC zWD@t~ z9ea4iHpDQ>nU$cb8s-k-{uczS4phU#!^BR%8aC$YFVbtuccZ97jKmW%$p*SsK<{au zGy}pv9AfR7cP}VzF?$p|NMaU+2WKBJ8IP1ph#JEZPZUrY{CxQ*L;H$*X2+&I@Uv^! zMrff!T#^)Mp;J2$_#9UjA;B{Qs%PD3wuY=j$yNItxmbz$x{0dDYyDJ9R^mGLFGh(i z>?%M-rl6+NIDKou1?}_ObZuKXvfxRKI{#8p`v9iWXD~>i0#(n-9~vBFfBN(pv6b8< zGg|1VlblYke*C2S!)FO}8qkByznMHJKk3rBjPNYHYg&M|RQtR2cKw(652Eh9NxRt& zndgn54vKw6&PWwohF2P1UR<@kv-|9s_21mQtgeF+oHNf);$+GFpWIl=(1Fqk30@j& z!XMevONK`fvuR{ir-wweie3B*kW|utj|o`9bfBoE3&xW}1fZUEmy%-`_eAZ5NO}3U zg~&tQWMVKb)@)z=QnY#VTtCQ=A-?>S-z)vKOfBGGj>lU4qaj&4#)ebK_gTsv%tC+d zbtTz(3XkM#bP=_w=6H(~`tGLFeV3M{`=iwW(5Ujf6tbLT1-izVh(kTy4cEqR3?u|6 zM>*x`aN{1uiVc+l_2Di+56*1APBm9xZS*Z;VF^NPO%XyElcDA1sCun_96yYj33i2y zqCBaEO_n0g^uGK>P0h$CYAi)h+psLp9+h{?^8bg1ef`q?-+K^iRgb>%M|>&-TJ7r3 zf*9=}M=1suA>s1zXIBPtTUp#5=YL5(s6A!e-IdL*=45BiI)UTMPBNbyB|+OKUQ}%o zO8b|-&Gb!r<+XHv*v6^?isV8C@-+A$De^!K&Ed%jIf}*(i+?j;{GJ3AIB(dAQFEP=M+XXn zvF^^G0f%o3*07{5DFYBQ8b`eai{W&)r&|}R8UYc;H-FDBmJ05Am^hfx_nxz6%*}mI z<2BHDSAZc%NL5nW%&x`8A6Iv-`bNXdZ%|lJP0rk3f<(dFtDWa0hyg|?;Yw4lxSrvR zTz7r`BDJK<_Kz&w+=1MD5C7vK;^WWL0tv}yP<_ZM3lw>nozaP>hJO~7XOB-)mh>)6 zYRR7m2)GuxgAKv(h#X@NCNdraUT3vpW~FU$cg$|hs3+9FJ{p!*J!K^?oj)lYNZpI;T-82jJJr`BB@8Jll0$ofoY9@NRRHS(Ll# zeq;a<;s5U+*;Uaq%|W)0WJpG}Xw$&!jcsYYYyjVPlj%E@$aCS?zSoxOk0~ z?dZ4s_M$5H-kPO!*w2xfEWvQK=w7GDVyIf^B@HntFkNj?y2CmtfvB?XRZ`bM_9{D5 z>jZ_6D){dh|7NW=poFn&2YSPmW3M@wTwt&>^~jiGH}l?ZwFs%Gf7f}PJ>s-=R9no^S5#t6W0x)B1(sUm zXAxuiVSdLIdUSli<`42cs(MssbE)0PZ5Rgx;7VsZX*K_ckL;_ojC7;dz7dJ!jm0^Z z?2gmM_pF)^0KXCgSnrCO2NQ`p>B8V)Xj2rFG_r4Al4D|GqG0xwz)w%lT-(@VuZ4&q z4psO+#vq=$<_o59$I7eri-_Gi*N5Zv851ED43PK64ODai%f5#R!kvWo#=N7?!tJ!q zh|%i9`Iqf@wE=S~N5>iM6g<91u`c_%FT1Q7HXN*n@zm@IM74Z4 zAg7I~w}Eg#J-2UrR&VTJ+~FO6gk@~TVc@va3|pn`ygf?kQbW;3mS1>vwL3)Q04cLYnUY!vTqKGq>m;&_%)q6%QxI@ zlHw8@_SVr+`kUtmO&!Dd<9fb7%%+pUn{rAiFr08AQBD4$x*CG2_=+gCmIBnb+A(_K z5#2?nw3V0ux8tM_>ZLQQs$uZ?1X8{I4uGjke_6&#)iC#`U!)mEA;UaBLx6%iP-Q8u z*{Fu#wMJth0Y&3SPE+GC@%*x7f9itU!ARGk&Df8o z|HK@AHWI!x44|y(+@yMM?2htW7o&`%Vt#&d(i_vO4Zo^bny`+jtW=Y1Nb`CAo$y2G zYLPM@7wr~4k_daBAKPWs<=!op#3E|hothv&8-y7mql$}(in0x<+O^kOUW|%JXPp)n zF8<_+lGK=!j15Rz*o;7GYFcsqXR5SMf`G6`DM8oK(Sf3e-XAdnulkCeb`&`j3?02R zrh|)2RpT^B!wm3 zA>+)wavqitug|vKLH=}XIXCZCNDVyrb3+(#{I+1Vsq<3e&)ovr?B8EHB8><1Vj6(2 z_M@pP20dgDrQ~)qXc;0&*G19GCENk4ZQo#FKfWf;(iT|V!6WSU->5IsYp}z}98|0~ zKX=-jYohZ|L_Ia9 zD98+A9v`Ppj|o4$MZ zWw|Fj|GhAr3AB}TLf$ab6h>(KygLepJ4Lm)&3*G;hy&g#ZTVuYJt>5Z6_<5%169iR z=;w@2kF6E7H1&1j!&S&kS5p-9J~or$lJnGC?0!?Iw70vL>Vb8ZqQ00O_zdrgdZX;A zfVDfWe&6fKA~!iWfVfbO8XT9+QA^a2)^_Vh_9R#jpE@jjcgb!TqmaI3e5=Z~`HU-_pR3o`Lo>vZj2aUwrk(ohY1XERa zL*X`*7-Ku^8?(m1U^OG=Hkyuk%<~0(#@H91yY0g4z20XMkc=nRTs=JBm=F9}LLAaP zSRa4094d8pMk{_e9$9Cefz^;4?Lz03v*dS)9#uJTanaX~p`@S%gQ6eSoCiRJ7d>!|F4i*E`gwdw zJ5JA@6vhsT6SJ3zc&#!2ys0@~Q)p_ZnOQ>c*R-s%wr}hoAb<5Sr+VADc-&it6c`(m zNTXZ?0QrX6om|ZE{y62VgOVtxi;Cy#32s0b`+u0izVxjhBU_ zn=EeH%Fc{nPsGIt#XVR6$;U`DX_{otL`V1Z?0kKzQ>~zfoqW5MpkgXIR_Oh}^mE9+ zP&5iET0lkc0(a)*oHwRp#r%X<6@G5)wUJLwRdIC%`J3hQ^FDb?V2cA>JYr78 zDP&-uJ1Qe>$*LFdnsvU*k^p`+W-M>@su&^A3<#ddeE#bIun^3j2ZRp*hZFPPLWVy( zs3Ul(|BY;`2>21bcnv^>1R#9MVlm+NH$ z8zQFm=1R=Xfvq5T zpkO{?AE-vr6`xI)gG2dWLRdqFRJwI~;t2+)&Z!yCV{6=lI3by&I;n4e$J z$xoAkfN1UR&k<&zjWz$widD~S$_ML8HXoQ=m`Uuo4LD_OaE5?l9vIkpSXo)8{t_Z7 ze((PN=)E2x`n{JP0%%V026u9?w$^X+SXQWn2N^O^s`x;$Bm|P%NgOH!Xf5Im_QJr- z!2daNU>^j6vl6GL_HgzSl&&3*mBTu73L4sbyUUVQ4nK=h$f#9luam|lH}%8fPO7ib zvO%yA8-bV&;A;T#f{fP#6ktX-T^P#)BVXtDIj)YtaK;!)-^S3?<@c&oKBd$gqRh}P z1T$WkiGHqe zrCoPThBAm}2XaR61gsN)geI3O$tJWM&J!sugzX|-d3rxf$3dm?3M}*memx1p_8W^Rg z4(YEbWShBucGCLO7)nT_hmy(rE_(EyT?}3?$C?a^6`CUIKVw*h?&B-XQ*@Z^nFj;65hMoJ8X}jh0O(2f#+Nwl*Idp$&oK{93|3s*jsQQ?eQ!0I?~efX4H24)pEI2?KQOqU zku3xElHCyYW7Y9PeL2q3ds{YQ(aE6kNVY~M4+FtDZPdQ;EfA zXkqPR{-7`abu6uQ(DB`C`9ItO@tX9&`T$mXdjVG*4+aBnqh<)__-hwTQUw`}Kx0OY zLee;UVIcu&o+NW=^->a7H5Ej7SqVIuBqUWEy?0f<@2@I5_c8g6VYGY+$9ciy3J`oV z0>Gc7SRXgk_57>o90eW*oD}+tIgG+6#eIoZ}FGs;k58gnWm2~JT{Z6dC~TF0>x<7cjty4gj_c-bjWknPPZJn)J% zDe4g7XYF`+5wbvqeEL>#Qcuz2?6eSQa+N}_m3@DO0zD1jnUflj=6B$tRE+})JMLXswmQTctQdA zl-;AkqI_#(c64SX*|v{GjA5CbnDP?9d|FlgsPG@w+HIajDhqaSmxuc5697yuEiAOg zE~O2pR@_8fchb4AdyP&+^*O{h-6p|KsciT9;}*>+0r}$bghn$MDov`vU`713r*&DAnvAqx%c&^;U3x7rI8d6yS8dB_OKwk#M}#53&#u-eFVb*;h(InX`#7jxuCNRw^w zFHc_7v6}n*cOQO*~oG9Kdc8V+7GgK;l?5GN+D9}A2k?vh`&ZqhM9s73V$-+ zg3T{2lNU`|(edOp>qFC*=i}}Psm$0@Q$@L`7u*iE!3+DFPY=n6xBUQdz)mCcjDVw& z>bKph8#!yzN12?eas+#p=yJDz2M8J_b8~~&3Q;XtR)vkFrG@)~&e}$Ih+N;oa=!vJ zjTf+h#f_=@SD$jj2doXTaE4n^4qtL=>Dz|aM}>`#FmuAQ+whjIAhJ0So( z5E8T`q?Q_b1=wM*u-@b_NQQQzzUB-i@TQ47b$qbLB=vf~*^#UIn8D1!54EJke37AV zt+gcuj+wC#{kux}ghhMe`;@y-#s>xcEwrqU=8umr;Z6vu*SQ(dU^58r>+DrGu_>I1 z%bvQo6+m6>ag5~p%?D^$*Y~gLXw;{^L?K##y0{=H zKw=m7h>Zq2wfuOAwYGG=iablTpajkv=?L;zIHrF3>bZA|37B`@GN>?@9Gdd+x_rhw zEzZzqt#Hb!s+6m1@yX1jPu6Le3AkT2eMJif!zc%U-N0qFRdBX_Ro1}k$m-r_*}S*L zb??Wze^l1Ihx7?~iM_&Bz=SeDg6fWrygQfUcEAQ%b|LJv2(SIn18?$xt1r&$*G++3 z;Zhfy`xk#^I`5S%8>Odzo?9TmmbjHz#n|0VW!7Ak-}d&_)8ja3p>h<|)LXBlVgXr` zo=(CIHb&cfIctPfmV;=y0SOQnpf zV&d{U_6YDG6W^x$rYiMQ`HjEU-&+q7{jS^*>uo<{g*(sv-}#;2^-?ci($YwI$5dd| zvu_zB!I;rSl1?2r-9&+#{1RuRIQJxk9)iNoQpnh@_El8>o>w9oFySgk_Ks!5&;P*X(Xk)Ljk2ZG)M|a$0bBX zNd%7|{lvU8LqR32y5}~9dE6^t0NfQPcLJzI6xa#P$3h3~* zf0_j2>sP2PZBY(ZZFc@G`;_(e({~!iS1&JQil?12Y!lO?A|&|Qi=D{jaC&?D1O>!! z49`dQq^#kah`9`uFA{8h;NbCuUC1;NUiRZXu|q?NPic;KAH&LCe@U z%s?u4T=_`WFq!J#aN5J%)zPPDld zgX8HF=~L{`bUI z!;L?qWaNFIyl>&ppWksLt({PZ&njw~=&E%yc3b_EaFsAnyylN=%nho%aT8_BhNy`c zq`_chKR@$#vrPE5lRjkTy%qB~5GLZrZ=Lly(A`Op**#D|vebM2-J_;pjh_gjd&kO5 zAH6s=0FUR8dORoD7m=a0Z&@rD?e8Xb*9S}Tn?F#jbtZN4VyuV7@D>G`lL(UDHctMJ z0&Q_K?CaNjhj3E+nq=+YnGpp^T3+PE?fa)47WH2IkG#Y;@CjYQ=ZH$XP(>qmpQ&&W zvn7V9=Yze9m8@fRm7!c(=3@dW|#uYjMr5NCJ_-39=RCBN@Fj5G+^7ANUjfN zZk8)z2`@UYuPK1H><7-sg^fY(58m0EXmResR5m%p7$^#BZ=*^|!@L~x40vBd9SI&? z2h1z~f{!ieP#0;w>CAXevm_76N?R#2xqfbx8g1cW{a|AaoVQEpGmYk`MwwZ83(`aA zpd>@LFEMQGLvJwt3r|67{l8lSiqYC2&}Z-c7BCaV1Xub2MSl_+LMDyP`_xmi**jAP z1-!v`?H^Rbq+F9VuIfxZ_ci7tko9%@8t-9tB=y?)5TVq}@Foy4zuRVR{#YDPtp zFs~~LEJ1sU#2X;}ex2yV58{F@w@GV1=SgpWw$-|JjQ%_`L1g|KdhTsQS@IKC+R0Xa*2^_<<%?Ebgxzt6beIBW(+HGa=4HU zC2ZrJlw?rXmXvy|PI+)*R)NyI8-3g!|~htbOayPT^VX!MCJIO{2Kf))uPlJJ3b zpoMo^mG^+<@624!Cwv&pIBO*6L?|)-(%?2P`0@@F`jVbvV?N{o#Ro6~vj?@zBq`fbu=*jem0p2cwq;o0AWz$mlp z-%l==BNzJk1J433|0zA}rZYQsM6i(ZxfxxGLJa=L(OScH(?YLC>xIkZ@0o?}gw`wd z*}rpcD|H${Waa8PK4NUWG+?xIbh7>R%dh}k%PBfKm@|8W*lfyjCKK)>SHz3f#xvPc z&!5AQy4#!lGnK~C50m*aXX@1=iUISBdinEY)}_vSPAC&;0#>}FOLwThDF*96B?UFO z#p5=QxyEi89Zs}n9b-~I3VJ5miJ0@|ClZh+z0>#Q%2>iB1sQ`20A2uR#@yRN&flB6 z$d7H5J+*M0sDp!RsC4A+=WNdA7oLaxA3v6>IhU5CdJ%DIF`&Cz3N@iTHPS}o{`JG; zN$X>-@WI{C$^EdleqytVKNpLKFPR5~xW9hYd}f6A!!^uJbnWcw;GaKua}6=YiWol{ zwbG}XHs3N9b?t^WLDSeYr+>_$wf;+@Al8*3g(53eY|g!e%7#3DEqw~HIX>Tj*6!ou z7-@4K3B14n7Ixtpoe;_rw22G?9Kv)3@tOj8F8U{u^e3zmyR#Rg%l=`I`jyx*sB-4g z=QECZGnnSiX9if@drslG>d?wVVfzHpgnKOl*SP$KI{#aEP*p}F6gM~I738n)3L z0MHSph^yS5FVl}vc+DCq#He4mE4{XGwhWCV9}tdm*EVYL6!(u1&VtjIJh=DP!+sPe zt`1si5;-!7hrKjZBKHfPFQI|8=&^Vn1%F-NuA+wrspIzc=;$os-@4-Wd-n=k-;ojy zsdL`tk>uIQ80-)4L?4DWsP+TJbHcy&_6~9_4T=FecWAS+G)=UnPMua|xJ||qau(4{ z*unSMmyRuvT>%C1hnOgnKQH)@W%B3Gqafo{ zFFsCHGN}JZqurbC^3XiLdzVkSsdEGym)TuBhx0DKlAiiKux3ogfp%=KB?P$qobD76Kisa< zyyv=a)0*dBUDltF*=Y3r-p`_nkeb$asDwj=W$!+Qk8Fo`S!}$iKD+WCkjF|{h6EVQ zKGkCGs(6Xlu#wXms$=Z^@V=cnDv~v#&QAL5ja?2MOQ=QeB+a=4M=uR6t?$1w?@m0* zeYK|=#1!FfT2!GVb^XPZ#rDn)iW8w!B5?UDsydS4`Xaw#rAn@%qPpZQR`r)Fw9qr#$iJs;WQ;FIngqouGZd7+$QDxQgrG14Ins%! zD``0hs;H`JnwSs(vIC64kGi_1>RcrG<{EGze=8#20g*{yRYr zqZYjdavTPlA#-uK$sd3j)N~UP_ZLpi&XN5~KIo<`F&}T(Jk|5|e!leC?G?6ML8Xl; z!QGx5AAj`i$!Edll>*UQHAv5YD>h>{huf89CqoZG1?KqSXXA&F?>{xrhxoC#)`jvS zop>w5O@T3B`0tNNt`r}@R8zC%bqHP!ZN^X@{z(65hD{5%6e1?_#>TzjD9jiSn~s~1 zB}{0iEni-Ks$3xj@xZ3W1C;D9!8RUH_pehR_s1B#jBui}{i$CD3;bKX^q#aFmf39tu+1$jp39 zeaqqVj7+?Yw%q$PD0zKh3qWaU*xjxl`F+}0@vxnyspFE4XZ2q*SFtw-vo&Ed)*R9Z z?`%>}G=b^+cGmU&-m3$~v(=CFLtcdoZKP<|$J3q}r4mkfbYJ@3tO){v@M%wEUIBgpaxo250+MZ3&^Q4%*2O z7KNWb@Gxv2pf5)9l@Cv0x^*_d9~AF4cOF*jVoT5s9o+p&*T0S!kItz@;k+^ndg$u6 zONS?PID)zP3w`;VD<;(Ja`6>t!WK{bbnNiC35FML#x%??Uf&kp>Y|w;TzrqRY8V%J z9FEnlj&qKN!muWKuBslku;0ZWco6ViSD!uf-#U4Dxw*ML&8L?W#??sv1s zrX?JZs497IQ%+}DPz=UDVSzdiBI`qB{3(Sy@ z90I?;Q{D|PT1S2{iHO-j)$UVdAW)4yg>y}L0gi(FZGuCw1YG-wLQXELWLD+M>F>2a zM8B%&XZ}ZibPVAD_pu24Lr6v4N-}Wn4HY#5cir!uz22MVzqi2+J}}~|Hc`ulf@OQn zLix@u=3W{;^;4N&18)nClFLEU(jdSjFj)}xa4s#{?Fk1yf7Whk4q-~(BuKfbj&htXd>Uy^2IW9gv6<&tB zvS%4$QbL(HyjLbAe4bIXhP*;cYCiWNHrPFtH}g|d$!>dA*(8y41qPlf9#|I1*2jwFEOwpBJk2?rD+q2 zTI;9=75tl6DYR5Ri7?j6{WBEAO&zC3%Mc`Uo36#Bq_nA&+&Q2;U*hKr{nYUP^Tw-w zG?}zpR}U_TQF=Ybn7@&CHU4-{79BmbW?cl8)HY*#be(A6?Xk*%$&lafgXw(g-AO{} z!e&QIl@hPO(~dJL%<=6tVFb$taCg8RsX&%x2`-%~wZ^M#N{zZqy` zv;l$S4GO-PHGc0V?%c}ZD&Hrs5jr_gbj!Xb>u zV@?18TzgmN#~3L?_t`8y1T9lgvkF^)JwL|ZWX770gAqhR5bDWkS$LoUR!$x@Ff(g- zsR_oc*L(C*n(yCphtpm^B$q=#fSxsUtZGMa@ltwWy1fB;`Jtl;>*)6K6J5-7xT}VHKywrj^G-eG#XKAtOt#S5vxl^e2DhQbJ_hX%Bs+1i3b{ z;shH^`Fv;jj*E2!gd~gv_Aji_{CDoB2)=l-d|%F9fiC>cBMA~Y0YUNTz4_KqaiQNV ze5NbBR+XELSa~DZK*8I~<&!VcO0*luu(r?h*`G-#VZxV%^P}VIn?%+D=UjJjlqK=E z3}0~Ep=;ZYBW|oH0^x?Nc&f&Yks)AJ@ba8EsAE6qRO#~4uC03{=pX*&wNFrY%1qrO ztJ(EFlTBv;pp5KL&6GOS4a1$RD3^0mRV}po77o!EG$9jg6so%>QRBBMq5d9Ake35NY;B6fWG-alkmIV zajo#W&@d%i73D(-QP&D1JdlQ_c4yy@m^_gNN7bgez?J@YKODofd>q2;^S~q7mATi( z_KTdw4&h~Jk48A#H>J`!+1_4!KAb08Doc8e7)LO~Mx7c#CN_H-vjGBDQBiHSt%1^I zu{36`PhX>DSCWdRr|@elhjy(YX7o1e6`e3*?kM@YUHS4{sH_@E zgaphY0dc~x(MKNT*$eNDy%unZR(hTbfiGi(OW`#$6AkEC@CEHM#}n&8uka6mTbX|i zRU&Krs5MSPEEV5s#h#@Y(s3pyK%@AIVhu$>Z&_Kb+^T1bryLAjXBVR9k#n3NgIT|G+q>fxd7MX^ zTj>PRF-)!E-N8J3M;x``;lP0GaM+_yQk@&Y?k5`wa@ZvE*%I0(TdX-F zQDcp-+{+&Xv}#zrcVDZv2_O24w|FqNB7>#QWJLgDC3{z16BIMZTnI@d>tID3Rck}} zSP>Hk9=V{ZaIKI(h9ioUS3?ld@%UG zO>7b)#L}47&aWnFrPmC7(K@B0KgU9ZO-&&U0_hi~&<-XOV9^m_@4S$Nq&)Zg_nMR6 zqcS5TbieE3>K7H(;o0cD3GQc+L0Cn8`Iro}C{S{}@La&`L!fdd3?C$7?Shb3qO!?s z{X!b}c0chpA}=NMjmzHFns1<_@zrC@O0(0(A00BS1)h27Q)24qpw{L%cD+k+5u5uN z@%rS6xA(Wz&52#Hxfir9E-t_Kc6-`KnIPCHARvIj^3Rf8o+YWqf{u4f$PF#ghON}R zHAN>R)KMNre^OLX#2q^M|8=SdEabKHUh}b1!*<_8EB}{sr8s>h{xA5L(7(orw~Cp=QeJT~*jy)m#FKeU+N3p^W|A^p)%5a{4 z{(LsXc!L-T5WhMWY)3pWEaX)VWz~9|N_<4QW`h(?3dd*)$8fx{banOei@)4bk0-P* z+t}JR;Ej098Z(xpl`R%XpX81K90ZI&3coh?J(~_cDKU0kNFNC%idc{^{n`y$ zxL|1BeEvz6N%eQc7a+JTH-Uwv^`eNebXRqQ9GWW_yaakpCM;IY;E#WTlTL)Thi?Ad z6$({H#irkl*EYRVeYTg2^dTgk_ly7Ztgj&98LvMDEgd&pXTH~wv!&VZ1fQ?_3v&FK_fjHH!K*isIk~SDFtxDaBbTUd5lZOz-=Ov+NI8HDlRXWBKB^y{-L~F z`s7o(Tc24XtEYFlrQ~BdP^jQVds-7hf~Kc;SmM)0-E_Jq9P|Jks0U|P8bN6FGdVAu zGl=8tj$WSzkw~8I3{CODseJY$VGl8~efO~`V0(0#g6}u4%-Qens2QhQ)2tlT+{!Gm z*j!dD;KXx$|6a>b>veT9nJz&3{%fWXedDxYd1z4Xl{wlO4zB8W_23J&A!l-s z4eCx_H2)iNdq7uaBr{Pvh$1Dug00+tM!{M9i50<$Mbk^e*Y?M<`Rw0z!`xftSSEZZ zG_CroyvJC+Pabhz4QyDmykQmSJt)e%Ap-`i1BYBM4Ft^)fHkGWr7ZsPA?`nln8L-U z06cw?E%D}1A`5`PS#JIXYgg-G<%Q<%?l?YITa!59<8FlD7VIgeUI8Dwdbfmd`aQE> zV8r^@tuOWEYO@x-kx%Y<^XaZzhmCPveswb%#Im3T)U?5@mY0=5$$5p~X5r*S+}9B! zlQn-y3nxche1es)H$_-j7Yy=bAc^^FB)bC~x@wpuhu&v$Y-peiib%7 zU_i;1#>O5MAay(Uv)_XBk{)PtEdkI);izMi5~@17E4St4QO zM&dEMii*H)s0hqV`WH*P&aU^f2uF72!@&8IRyUX7o8;DfjS1qukw7F3-1eyy4NI`- z8P4qb!wU+g5WeTCt}5Rr{WXr+*eDKt>4N~z1A_|DB2yZx1QcK1cPbkM$*gl2=HcgJ z@=Y-9q(Y)qK`PUtz*N%6Zl93!VWx_OYM=J~Q{FyEfR25i3SRH+ed|o->@2Tig`P<( zmJS@)jt=IX>9&V1X3WY~Bb{k!sS2+oGV)~E<+?j&gMO0$@*=B_kA!?nFWoevH$s9z zO3E-L9h(e=uax|P_;%+~Q6JfU&D%J^?q!eJgHR_JFi1^MP2o{ZepMOcYdYQS8(ZNR zufw+@06E~P*$XZh5RmZ5M{$uZUIB<@bl#8M#WdMMYDVf#rn>6@HH{V2N6_~9+D^Jk zwRll8{5vgbxXB}40a|h|`i(yh@xx0ThJYR1o#`gxloj&d(i7nmE~R69wezJjPl|Ra zCgV;|{uV&G6hb`0QxlU3;Hqo6AO?@g_u0BD6b5DK#JD((5WzHe8ymUL^)_7*HDraG z%sSD95T68KWNU?}lM$IPXa!F-_=y-Fq?J9AFsXE8o8|M7%g-Q$(BfG)E77X?P2J12 zn3@;<|Ldg67a?2)RE+T#zD2v~wRP;ng2bH1Y(R0f6MLTN#+5?w{Lrt({=+A5smQxL zr!=DGZHHzOnY@805)o1`urU@zKIJ_~hJaH=13iDkmWoNx(2s`0M(V|q?N43tlPxF^ zb;0yq`aHP^49B|QRRym z+3o@BJoKzg13$U^X_#qfm+M|`{!*uw^^d&@yp{si9{-mD3DvQw?EORqnk2c9D5XMU zwQ5A-rIOC@?OQ(#$Lzm18(>pakV4 zeVybEx!Ew>3w6hC={pF1OF{vZ#$oYTO(l|%Cax?F?qV33{@&UY-yX`b6Y4dunFgMt z-0|ATEr6{9Q$I+Uksl*Y+Q8H_K65Mc)`9{HDFG4TN zK-s_Bi`{kc2U7YYjz!5}9pR+{Mhbs31F=5?@%`rd-vpcXI(iT%zyaEdrI1Q^)$OJi ze;q3gn+b#~tZE8cYS4lF<$#@4bK<6oPvsSlV{!ER@Y{(SB&LB@0I|>Rm3Jwc(lQE{ zm30K7Az0-+JevC2p=JH1w}4#;fG={bnw3Mb<;;kN{!y83(X>L&%J$T)*Bvp zZ559F{&vcb-D@c*rjR?~>}DW96FS$MgNPYa`Qj1uz~{Aq!4J*Y@_$AYZz#G-%0cIX ze>7{R63GrAyL zJyh43;*-0nn)*#)HRnf*L?AE~WDPWB!zkDmsLxok-K(feF zxiXE$7rO;7nE!mL5nsQkr17iva~J2l*YWV0iiL1;jE zx2mL^?C(gdZ1LihG|3e*6Iuyo?vU=`}|@K$>=f@^MSPoz$&r_N4I zjZ={dRc~!m?~-MG&ZJ$wVkUXnGEPIyQi4WKmlbz1LmxL3=+p+H5ZoH!e57t+wa!nKcOb8^_rr~z*ykj6Ka0BZd7_VyTR3YdIug|J7 zwU$rkLKQt@vr{MueT2P2^{Tmo@3#MCwPU{DS>jp;V+u4a9$L7y4G~F6q!3E$)Mz_} zNw2ZbqR!2!Me|m1y?NKK&t>n*LkBkzg$MaleCbY4QaO8)f9mrZRkmO9sj!emv3)3} z4kYInxpqN(oT_#Jjz^c&W0=t9&P#(|9MYe4yHnBd9~dz0%+6L>f=L9pGr?9S=Kfn? zujPjEY>zl74ro}cSn=Kf9~Fd_s6dzgguOW)g%GiX5Towlc`k+S4un9fL7%o7P(GPGA4K-I!JHRHgi%c=^X_Y(nRB(zCDha z5x~OsB`EzsAok)2gNX4V*e!*{+|L9U0{(bhuJNBPPPYBK8+dqZwqyrWrogNB3(Fco zXTp0IGYf~m?<834&j*N2%!Mr_k%Dph*jtMw|1*o!VGbV$bm0&cdv3!9w*%0(vLHu* za?S9zW4U#G5b6K1!GtDYD4ma!#)=Wmd}?Bc`h^8%7|i2+rNFLCbDI&f9a-UKZ*F0s z3s5fRj&^7!%gJoucYhIrnb^v6D`3KW`+*w#eh8c3Kk`Lx*ndOANTA*ghmo;k5kV6{ z*R^^wD{@Ogz|9#4u#QkKcRPZ36>m>?xVzy78sPTpZy)*pg; zP}+_Dn2bGar(iLnCslvMTESfIfYVc$K@`c%7RG<17B7 zfJmIA&AVmQ@VoP`@6g~gM~54B9y~=wMUR7iQu{_Mg|t!FBopz^NH;aT2spcIHg<+u z&w8I4zo3IWC0s=anSDlCIUz(OzNJ(_V+Pp(`+}Gr@BptWokpa0=4*&woicWVQ?L?# zXlN!Fn@)GS_F68gye1j`cMbghcsK`mN}lY_B(%-lpuE_fNSx0``j2sUt6Kx-DK zCu-jO{Amd__1@j$4}Lm0b;MGC1WtAq65PcI=2$`l`OM?~*S5obmm|m8;hI!c>Lkx+ zgyjV=HaqMLH(9YSEad*ZyWPilee_g5uECTFGJpMM7)_2{Nq3YyR{OQ+rM)q*PZ+yH z!mz7?7EpJlYltI>7&;F|1;CQbl7g3s3`JE>*;|iNTCo?*q>;#r~d6xd-mMFBv!uPv?&fpS1e(s zrKr6$M%1;7kjxJ$IXu8#zsTeVaRnIQfPgy{pL|mCNbb%XtT;iiw_v2Zw&Hk@Qgw=% z!GZDjk2$oHdc2>iN!GchuI?kSjI{Ez)j~#JH1x^N`pFNxI&?r?%UIZH8AdZ<4cIQ^cdEIY$$4EGf8_pH( zckUm{rr9)@@Bu=clZQv)e|V=YaL-1C-yK4Rf&jWy^aWfpf1iVg{!!9G-l)VA>@YYO zm2MW982r!7&Ne> ze2oWJYQJ6}ds-LR4wjh{fWwTB!<^2>I7sbn8aBD|2vD+(uNuj2J^mlUypuBB#PcMe z*1qVR1jYXuF@x`K3oyN<%sgdB(3{5W7pK_c^EDu4bMf`& z1^xAc%!VhSeXd1q$M*d76KG&KtxTaXJiN%e!r)7P&$KItKsmim2td2JoV?TQiXq(6 z=!pOy!rI;YEBLT~2AGd&b*`H-xUy0VeGg6_MgfQ&sbHvPsiseaAQOw~``1CRMa61n z&T}I6pyRYTc7xkS8Ox0c+{Vz=bwFYaR;?JcK%mWewtZLK4z;&|y1Zi3-29R(E;@)K zg>kaSBg%@m>&yBIY%B5g#n5nmMGNs>`Hu$XGz;;s6gSE1wQ zt_Cat5S{g3A(T2v508Y|hc0DHz?JV`<9Wa{6vPGi>~86uZJxHGv!H!jr_=rK^5vZ5 zd^p%|>^`U>!MB%#c?HeQQl#2kc}$4*HSgt>ye7(^#*O*7=T$SiNatVh+F%+Jg-X1t z9ZqRGO+Pes2Hb0FO6NY`6o1D2sa7RZ- zcg>^-VXU$7VHV>}uv6Q{L8}cqsZa+J-8Xx>`0(4+oLqWz(*0wJ6+;L%hkTbjJ;S%U@xg2xbi=zJvj1_WFrjUikvkrEU1qh1hFLqu+i z+|up#@cOkon>e}q^&6rppPV6q4r!ftwhtZIR;A9lJ($i5&H&;T5+inteSv%T!mau= zkW(GZA$7pfg+nxi9LPx#kxHX)V$mNxda#hptJ(Cpldi5Q(k_e%L02$B`9n`Hn!3aP zquPI+b$97;yY`PmVibbkrm8^XI-LDT*j6sUg>b9%zyB~zFCF()TA1d z+U*w(D5Jx|rWs_iw}&Rb$*bVRTm`1SNy~?q59L}h_<@m0^W{c}gCaAGrly3n+gqc$ zBV8II_eJxI-;u(89!OEgDd1Bfk8y+XMiN!3&z75o3I?sdg8ICsp%N# zGA=R&@R#~SFH~2^!mASe@nCp$keeC=Kdd4I-J#+sY64>25*B#Kk>ow)rijl_RP~k@FXpfhA5l zc61$ZdM&>V%GJGa~;TO7m81MiL3#+Ur$ zM9*RS&8NPw@ns}j4s-sZu6}uM;SvvNQ5SM;qx&ljaC29i6r*&10GAiND_C+C`wuNd z@P!lY5+TZoU~j}X><#>0nq~$@Kwv{QNW1rVVs{syMTl}djb$nFMTX;avu|NR8NW^~ znX`t1f5drl1&^UmQ!(yKYYv{OmVBf9<07#tSJV-+1{?gQ=il6 znBopdP*qCOj~ZHR6~eUbQ|9F>A!3P^@ef|a{{;C|^Ly%YGkZzqtj zlz9UvR*GRmoc8W;i0>g*4T3~)OWQ=Z+smYPWmGLLhL_|cz7beY!`)fq+*y^D*|+dM03b_ zgEZGEhcf`rg6!sw%e7~5!7d11!dn^q5en_UO=t+PfbL$vIlVHk5H31VKJu;{t>oCe z8c}jGXwr`hExPJSMRM-PZy zv~ggRk^##r-zIPr>#xx14MT%Z$4{%C}U7P&~<-0BmBvM*T3=;_o8wEo>&sBLE8G$YCvQw?8gYw~YNQXQNm2fg^$Hs982?Hl3XIy@E zw63$&cASN0jFTk6lPBuPmKX33U5{=8DX!4NVAazjKL@S_BjK+kM3iIpA}&odm0X?p zKMMIqu(lj>-?61wve?42v351}eS@j)A#-(>rqCoQ*yK77XRGMG!vdibYyy0n$)0zkQz=x|jP5)R`lhKBR&z zv64H8N$^{;ljapquyfrVzXWW%nrT7Gj9QA|Xy2bOa{^Xm7}f6wKnj7Jy(R2?6RzOj zat}Yx@T)sPYxsHwHh9?g!1t??VeD}^EI;648RKkx^~$2gqsuO1ctBB44|Zd5lzzam zg+}1rJ7vIUpen~_^FVTQVpGmRc{A<}q^9pe8PU)Zr;u~}D7n(<@zkS?{A~$(B1t1- zqi+4^F9fp8IC+jvs@|=sUgJsbR##RWLf{GENd<6o>l;fx4v1|s$g$>jrCE!fH9t#z zlPWi{P9m000;p|SJxVbJ0`_C^R1*6tu?R)QZ|S+Hw$8+qlwme-^RoGIA9)yL>uBOJ z|FfQPkUAS}JE+IL4r$uIcom8qzIdDloUSDG)fct}p|G*BP1P>RP2GO|_EZr^ZV9KB z-dRCc@2^%mlCF z+%?R+npQ*9;v(sO9!<3j?4vTTa-#@;A70ONMb*smH(xulF&O=hhzhrj*N)i)f3$|i z9Y~Gu(QZE2p1bBVZbws$WY z8SBJnD46wAzmxY+bmmDBmm0CApgh;oW@)y$Tk$4Z!V2C`p@VD7w0QV#_qo4seQ`c* zGsKNWk zYt|`~_XUC>UCm8d;*#;$>doC^DoUe$s3kD*+2rJ979c2e>vM`1EI#zvY`k_l_TaJ4 ztfOv6oS*rd&x_uJ{b?Z`%=8al(1TP_Yf05#^sSlU{B8W0|ndDH^@)@Ay zr7P{e*H?OEo z#%&K%0`Ji7PKL1w|83l2i0wl?h#cCEPswR7{Z3S+!pfV(PmuK5d&bQ!XgcZFPh?0% z%>8#(PO}iXiV-`3URH`qNmYm3wQ=dCiO&zchRbnP_Z~KC4&QS&YN(a&0XR5{E%H9e zf2m9q>(BhA=baz{)j9I2P76ZXELsHdajUg0I70ZS!&7qi-VD+}VhmHRKf7Lo@TiL4 zxZQ|v6r%)Pd~U^LfCjoiV(v~+>(2I3&EB3-fADdQtSItEVr}}o& zsmzlUYDva8MJt2R@z7#b?b>X-;y+(k(Ff47V+BR6F21|gEEVGOtGzFoe102NbpWzZ z$won(hFQ$>QY@E@OZP*A3+UB<{|KM$B?QGGZPg8HpFj1HYq*ST77t;_;b28#35tq} zVl%(SHVh|u{FKl1t5uufte3RC&X*xWz9;BBX}kkv(Mv}8V#D4(;FQXp1MuHuOnG@B zG_VkyGTg4NEXF0mKFt+gm>`IW?l|-Ldg=hPEHU~4<&1Bb_kQSA&iKvi9Df!{!fX0w zE{4%I!gJ(ZlFOk?#?HkK%~_oD9QR5+Vm+%$K5h-ro6X&B^Df6qH59 zUk3a)zpxa75|8>{FXv#e*Bj~|ai$k17B3}m9MVY9Jd2TFrP--UzI&M5Ry*UXBLir& zigNwaiPPX@%2CT`MggVY#Ze;jNO4uP|!?|Y2%*uT<6#c`B+gF7T#lGzQBdbRNzg`Vv zvvDuMg%38~*_oK<9D1Zbj89FFiuGvVB#E@{+KB@a`^C31Q{O;Y&+g!u_I?WBTtrQfJ1*D}zu0v#xi#HIz${injJ$`vtD+ZiKk6H2BCeua7TX>b> zZq>%c+at3@^e?j3^qqmop;4Zhx;VGoEJxaTUHYz-;n}BjxAfRkCs7f^p_%|Yi?Q_V zQ9SCXe{*|kx4w@U8LGSy&#}00RL#4}>JXk{$N#yb!JRoiedlYOb z7bS+hnFVh18q5gv!d~CX|33fl-xP;c;G5zSY|g@rV$@=RN36()U0+7>QHd~Mq-f=v zsbMJ~U9uM^hpn?*KVftY2FMCHpCa8B-v00(kb`JkemQr-13i7wJKJ)2KpcYf2t*uB z0yld&`B!r9b!%5<-j4ch(h|^uOtiI|KSX};gd{=-25{jliQdiiMy62`Zqn9sH&iPG zW0wxJ_SzGP;sgQ3epvSFR_GU%R7-d(g3+U=6Z7F@nutVSRSMAG2rR0L-#J8-7El5O za8(xtdgdoMZtGr1YdrxGv6Zzqf-&n(9BM^fovkagJg0(rCI{k_rs9HXL%AA}RCSmw zb$3ujl}S}9=);$6YoP;8v?q}%PRVzNxkPYL(k-ZM4g>i91Ag{8ZG*E*QMu#K7ghhE zcGkC$*X1eq;VbvjP*{u%ezuWFblG;KqHTzR+;U(f&i}}35Wc8ryc7~6oH0Fq?#YId zko9oeJ2d3*k^q&jI8G`F_yZF_D7C7P!~5Ue!}2@31yoXX=4`#EHbiW43TKIc4Cwq3 zPGawI+orf!d`*5A1}z7_ajXrMxj6VK4638>-Ct(b4PZh<1&sYqhx)uiN*tQL8Pehr zs&K(_19~xUnmY0I55wVLFHxnsD`%q+{$>9S>Xf~|0EXBr&)!$2lfY80bN-c4)5mN@ zV5E}U{l_}4ptO`aLFy3UG2I+Y;@T!6DhkmeLD((@`_$;kQ^+%jFvtpIzl|aiYhMg) zbyIyfXE>JqpPMpK%h@m@sU4&2}I41~KVK_fr2`K``Z zZK~w^Q2mTEO7wtSAeEsnqa~8!t?&IO5hfZ<-(QLVfeU{1tR7 zuJw;C-8^#TixKGP1KJDK$>Z`n{9fV%2%JR;;H|vat{cT*e!RMveTUgHat#gW6PMC- zs4`XW4k#{``1#cdWaKi{Yhu}Cgb)uEjDY^(cld0bwFG2?wzh@(%+?lYXq_Mb6PB{mC)ZyPwHa5kV*}SQ2x4_qNwjFSKhax)L>n{DiPU>9ghz^Vevz&S;PDXC9T#5tRu4@jhMdFX$5UJs=^vEfE@d^OrO5Z`Q){=Iy2i z_K8ikyLZeeIyZoq4s(cDcd_~n1^Mh2XJAPdRvB2%Bx}bM^=ah)S4IOv`?QcBcB)wI zE9Er^T`7;J5L}GIU`2Zzyv;wr;j?QQq>$2(UXr7s58!A%bClSo;q;eIi{ye}{ z!=gC%7l#*ss$m)|_Ar$qv7wrI{{=8;kY#JVZtdpQoBT_$G$aFCi61@C;Gu{w>1`gQ zhB0yyG=1~+RlkhutOajK6OZH`Ig3Aef(hWcYx2@3dFwoUvB%?DdX&Jz-dI%|8=pc+ zAH+1JMq?pYYrL_)Nq`u2Y3@Z76K@a*3=vl3Nn)L_{OR_f~&6ir(4 zV>2`6HHW1d8-^nGoh1Tsd-Kn}|IqbfmYivN6J5w>PVnpzdb+K%2oQ7L(Dn(u<5j`2 z9ODEY<8b)!>aoy|iL%&HA=`;|Qs$lbxYwSNpVZbkOwF{c2?$`9!Xdeow|Zk^H25G3 zz`o1Y^L85@B_IqPl9(eR&i5y6q%qpPZv#3egdVXAph{cEUIPZMU%ddWlNJ7yfV+To zAk;g>Gk&0lQi1B8a2{EMY2`fs!kstLJIK~MS3C?Tw_nipg}%AmBUZelWzt|fH2oVB z4Uwp?r$;S^<1S(tJfVOS#>3x)p}YJ9MRzLwTcoaLnhjv~2n6Vd@a8)%tXU-S~+dZtE{J?$r zsqo-Pm+}s{H0knWknJ8UYSwEwZ1R}%{wuiUUB2sWIdhLZjqe#o3x49Uww@mGba+ZJHcG3Cxj$2cg5}>}B6)SP0?L*Y}^nP%1A3f62dxl-q zx>*Lli&-8&$p#CoN_s4G^f(opVvphbDEGARa~Ejp!eqwKdqbIM^ESQM$i!@E(r0QH z7MkOzVUuJK!E9IV^EA_Y#Vo_i7p=N_@R#~ZxprF#?)<8!hDA6}(#b`eawexCze(#- zRz6#4h9DilDxKiUO?l^bi^9dKW_r;U+ZOZS7C>0EBxp~#unOG0t9^x_LL9zs&k z@~i3pZQ6Ct6M-j=;?%xonrQ$w#>>KbEPD~WrY<5qJ)QkKV{T{r zp2}u68JSbgQf8a06vVfy^NZh3$~Hgb`a2lD+@eE)8JLGNXHgN13ygt8>*$AOR#GaB z_W`2fE)p}-dQAuy9Ht#dUgQDu%U2q-=oH~MAIth(H!xA)*gSxZ8e;VCc3m|8+%D}3 z0jRmuzg6I=**zp~nnQMoO>=J!%=w*N6s z9GqsBJaE3AGs)ln$A|LeBgI`nC-WYk3O!|hjRbGM2IcbTK$GFVi7Pc@>G8=oN|I>H zwHOIeHRIV?yTaZ59C+j zKK5ErSSuc7i;0fr^7ekQ?!9mq?DD3SC^3VmPm_q}$60(;V-~r%LMQe^mRDyebPL_5 zTz)gsw2zThmSOBiZMYq;ZPK9-#%B*kb?sDkD2nPK+wd`svcq#UkHPhv{l~Q$K!sKKv3n ziC!ioH^%u3$*`MrtLV&zut(fukqC1stZ4`8=R@+0y6O1LcVAz_CiWGNxYw@>>w{1P zdl&z_TH-qC(%FgZ+K|mAAs`?u_!QLczlkK^Z@SAAlCg*WA4gXi6=k=DX@>4@6d1a@ zhZK-Tx&=6hkrFBC?gnYN=euk93)jHBan9NM*-uQF#r#@$F&U7> z(Mj^hv3GY9378Q9**kE|^|?dE{cTa*oLw;b>ncZ*%7mmxWpIzzSjg{CNHs?!9>AcK zPELc`e3-4X*_UloQ(M>4o+7w07hELsZEo>vJmm2fETo(7wKkQTQ?-7KdYhpGH*x39 zn^(}7IB%m~cW3f$b=;|ZT41gXdMwtAOz$=}I8svT0RSm;@$rPL)wqOtPzfaRZjsmJ z_Z|dSDw2}XD5yEnL`2*Q+yU<=fZK6X#lk#FOnQ%9=z93#UaP#-@`Q&2kUAika0y5x z)YP~DjHPG86Ij$(I6Gjru=O(B6*VW!zq@YAe}z;?Kmc^qMlaHfG&eRjfHSDv(0aD( zjTo%}aXr%^y?&P$)Q%MY}|4v>BeQkvY=h2{07nvnck zF+k8L{5|f(J{}6FM1(ju8-oZvvher+ zdH=ev1I9?m5-N@bA6JTNqFd3(N%-iI?DYg(&RmB$o+In6KKFpY_&0U)NdS~sOQf@s zTK2%#WvwU-q;7F-|5Tt}iBX{TMNm8W8~-`mCT}EJ@mf zDml2g6zP*Z=)gqd=LidM20(e8+w7B1UuDN7gscNXfAzz+w;B2V%#I#(pwU4hV5F3k z^1i;Pi~~$y_7pO8L^W}FSy}*w_^j;RKdnXp?5i~LQ`X@noEZeExEYlgQgB9^vH9gq5HDCZKoSCS z9^wZgmVkB062G|;Gxb~WAheh0>B&Vi+^_NDw5ty5s69R^}xQYFfOAGNJ zMv_gxjSw6uAWt(ongJK`@ceICRHgEJ2gP%i+sI{YyIpJsgJA>1NUDQFH5T@?6aqX# za2VVNwEltQu#d3iHo6aV-B=EmnNP4?AtZc}CUa%iq}Z3=l?|;uJ*~Zba(z#PJ0-`O zy=<&)JatEdSL$+igbha7cX9$cb_`w4H<7F@G+u6RFF5iEK#O+w4}tS=Z^jxPKnP&7 z{DVHRA$gh=^eIX&(#91)eXm zBH7ZVMlc6~2!4C{JSaM>oA&Ph9v3^jYkxq47XrcTl@iJB_T!1ZalkxlZnmoEfX}Ow z`7t^%!6mPtuv%tMfe@lpME{pDEz&lF^pHl%MkvmRE|DoWKSidV{Y|?imX%P_xq!9Skx<{@g-8zh&Fr-kDgDgyhafItxXumF3Ini<-)#~inh#Cq;anqQuy4b{{(n8vI-?cDaB7N=X z^K-@Sx4;X-FFD;ouyA$7yu>LelnK+d8%QctFwNstla zUf_9GiPh@YZ3fAvGRE2}N)Ez3qt=1`-XjG67C8h_P$Ij8BdrX~vg+A7+tsJz$kD?o zS$GE4G^^P#GLCz8Gc-se=q@5C2^P6sB)vDe7@3$RCMToE5;)R}nMam=9&q>KlDQ+? z8N(eoFhY>!#-_rTOe_mG@_2fBf8$~#6{tgFfCE+R?WWiaW@3;!`V<#2ghMHxg(ap4 zVS5KTzgqjl5psQ1BTcXrE`K58K)Ao@J`UPs148dNb4FrmU0s}>eC+gM_z??Dob^lM zh$7nk3Mm~ObNI~Ryv|OVI5(~le1E7%ZfXRVtcEsGKMejXY_*tUTA*66b2$LX@CVlB zeNV{?Junh7vOY^?hVJt26e4?OT&FZdYn@=r4 zg&n#S1i2+Bx|0{1TfBRx_YFbspI`<~47&DfIgxC69$_X->eL|Ui|&b4Trp2Elad@b z%btQ<{`y%Z+B>6gt1szUIqrYoGXvB5`T6(+XT2F0bJh9xFlIS{%;3R;ls=3uHb(5x ze-jm)Y^V_UZ;J#Lb==9yur!DNJ~BNYo|9vum%0UrLP&dFT2r!bKU>s9?F|tM9x2V zcKY9M6Qp~Ji-M+~s zL5kU*f^PGf-&B$)E2>8vFcgP`Xz@Ag=h5c!G4Cl|C0HVzIXGyCqRp5E@kJ zDY^5KD3wuh^ygS>@^rZ9gy`Pw#Ui!2utOeysH4wuyH76~fk?m44=M0hw z?S-I(U}Xt~vnbkVMvci%E-XZvG;?KPKx4qB7qT~$yz#mXXashT_B@D7|MOVB^`ri* zMF3n&><4FI8rqSHhUm#LSS|t*u_}y94V2X+%vCsrFA8JNw_VR@XvpN)@CJuJGv(Q_ z__XL!+x1Hf7ilv88nAp%@-4-p^qd2gMYwkI3nU_Pwrj&A>a!t^oJP`!4WKS$)l8!s z`LxkcP(>D_sjBk|?Ktm=AUwfYMC;4aPwhgy{@~G!@tmx`q`@B)2&C!@mG74@@ktQ0!XQp5VNZaJ%xj|j486jv#Ov!P2ffhQR;zuFceW{cXzid z`tzU$N7}*|@<{D}TSxE{ybVY0`?>cbq7*VMR~^6L9+Ir|SBkPO0#~yFzuuzJzfQB+ zs7uc!De2!H6VaLrZ3h7ZKp$mPY|S-*iy5KzYQCDxVwJbg+D4sCFz1}q5)v)~l8HVl z_9YF!HBddQgCD5{efH#vBwULugc}CY{Gz=Oo}(;?)-Em%9$6O`X7UJ8q-Y~$`X(jT zC05tL6^Ae>a}hWL=&3EVTIXVoEdsESkh;|&=tMKgtW>;4F_xmDqT@d!7lhR1$ zWn89RnAo|fc*n-FUpmSguDN;s0VK!}4l=2R@aFHHT>0Q(BH^J&tX`u|EG@k-N@klB zv_Ym+rTn#J=F~Q_r{gjP7Pg-%=uTOfzHUxO-Jov>ZJ&7SCXBns z?q9U}$#VP5Tm3r+6*f98*q37e7LsMfdVe{Rikg@$CF94uyy|%o{f*Z)bgF;;hH-~7 zqm1K&RE_zon%+{Wq{aKUEaA0rH)f3>1;?a{gla9J!R^2yL|OGlDeD6NmHQ9F9S7&J z{Gb0sb!laHbJ_dNYxC{)W3b1wxRD;<)nOlpt<_2&!f*+d`x)-z!0dt}>Z&Nm9+lpo zeXP&&+Z#gy8(^AkO_x2)w_*qPS;QMYaP`N}T6}dSjml)O0J3Ub$0p||k<*l$glelw z%Rc%9Wn~L5qKDzW#6R;?32$W^5wV=5EeU3!+l=0hWd)GWw1E!pyI@+e%6?QFuyii& zxVUH^ma}93)!z#WP{^>P*va|ofiuB8&VQ+6^%BnVP#NwCSE`po=H+B+x-zW`cC--O z?g{XDZA-rg_PQfmpGqh_88x+~RMC66xTwCsIzA$%)MyItOn8`^IO-FF{YU$IiktOY z5G$ywD+p6|&H@`szIvCDtK(!Co#xAr>AAgTrZn;qAjT@9028rZQ}0*E_>P>7%}znE zAt2N#ZQ=i}P(vBp{t870v~kQr@#`|Gbi!9ip*&#=WB|Q&5SVgyHD-p;o%;A!f6dWo zy%r`ZFfjIFuh>+B#PlPm)cNZR?F^Bie~KjxqxbK5tb}R&c@sN9ucygWVchxyF)4q+ zpuO?aNe)(2y)tyaipCVfcwdSgc_1vo=)3Ezj82Lbj*bliy``<5fIs++*B2#%s$v9hz>$)>R(5 z@k$e&G8naA%RmWJ**VQlUdhPFux28bz-KJ6~8rnI6) z$MUrCJF*=5&FF=NCci*`X|2A?MsNDVdw6gV>Wk)rSVTCyDR%xr+CgCDyEaSu>zCD@ z4wS~m#$Ye~_J*}Y+j>9pU=oH(c1I zKiW7`mDqQ(+SB-6(m%y`*xQD}!ype&U1SR=Z2TppmP2oUzn8Oh7VsF?7k<|Ot}on= zx|#Su0?vDpx@!%|XL7#g68=F&ih+rXJMA4mBWqlZm-vdytAlP*UrMR_a33;I7{8Q{ zdqIl%s$IW(bXFS+ls5^%Kj%?WT6RH(0eiHie${`^Wy;TTQl*CN0BmX|{lb!yeu)mqf1!|1>UtmM0GFn~Yjjj*Gekp$k0;jB5Mp5Hz&zkjlL zp*b8i#r6k{Aa8L`yOb8D57T;6p>I zyxTp0dXE@;S44y!?$^6lNu3NfDTZVgD<;2jC4sw@H@L8{`vifj`tG?sm(>76kZgg6 zjsjoKR^4d(Wz3+FP}}1+=-LKhfQ)5&E1O+QY0cC3Z^DB0oU8$Flvv-}I{pFkJw=-LJ7Y-yGECWs(~{eq$0qTPg=`iD>4`RXKD)7JW`_c& zMA2h6pB7(Thc?f$>XA=TgH~@p4s>i~J--MVB56&XbdhLYUjzg-oic_ZcZ3iMU>hA~54;&Gl}CNj&a)vOcy4ryjNo)lTO z26y*RE#xF_QZzbnF1@gq$Av(a5L{jp6{OaQN%dR2U^Fk%lrJ3?{9FJX+Nz6UTDPgF z90ko(Kqrm3c>8-2Mqtu5jlLf3J@TpyijF`0^7kHJgTr#1I@gbH93vphRf;ys8H#CL z&w=_@-}RRA{MP6@Jn9g#>Z~z4$$1L>;^buNH)G~+o9e{p!V_A5!V%#b7qF&y(z4nF zx|<0}h+NBwMi}tQD*E+mNj_<_V0Dh;=xCT{l=y%1TQ+l=({6d8@s^N4M)#j~Po)1+Wk<{Xck?r8u_fsuBdHzMNdnZIX)XxSCwvfv1YK^=C|$u#fGd zB)aHh&0@bGUe=Cj7-6`VmzTgLG*~$rA%$|IZn6RUj5wZl)`zn~as9}5RM3IVrx5$q z*ewoFw-CVO_np*BF|0@<)b+$eU#H?uni1ETrK7M+qoao-*wvF8wTx(RV0yU+@kY3} z6zLz4^-`Z!h(rYC8F2v5%^Sa`smcS_Q=hhP({}Gi)8AXjf*%?thidNcehiZ_PiC#S z&?iR%bB}Nfb2LjxH(vR)9jF#c&f>S|AW~G*2KDcK%L$EG;!#8M1+HvybaaZi2Y#o9 z#uRk%ye5nZmt)eV_*cB=*-CM#n~_^OV+TQ%8QQ+EpjJG-a3a{>LH}(2l_iA-y&u7K zp3U`^t!$cwZA#XP%tc}cH@|WWKk3vjSTW&~ExDek2+CALpGiTb>^_V*w%;ljBU0qe zTOntW>e){!)_X!jMg}cjVI-7GIcTy&;^xeU7k6^bAJQ-Y>x1>kIKg>L8Y->kHLmYO zaG$9i=dlG>gj!1iol!ELrg|(I4-YIpH$#9VZbrm$N z-@rNpg-2gnQTKZYaqwXwvPJWiPbYA8;bJ&@17%~3JBVt0e%GOqDCfkV-zEG^9mF2? z@nYX8s@p`q;tkRApxWn@EY%Y3G!;ds)mLwMY&S7r$EMKD?jp*+Tdsu$-wX7NRBPOA zoyTYpok0g%GDbF0ZVvU7L{-0XUO9H5;lKV^JEW zRCHK9tA^FX%U?wJp)_$CUDnY=J71Hjs8k#xydhguH)*8mZMF0J=czWq*C~s%V|;84 zwR}HWe3w3AjC$|lr)CF^0~OGE&RMNxy&yyv?L4>uA1}9#3UAUZRa7mecSkeuTX==_ z&gI!%lNSP?BrgTF=uf2|Koy`^q&4)G2TFJjO;HXxV6ON?rvsO&1VTGaKKwS;j&RG) znDpy>O)o1Oy_#iyG$-`CnXR@tE8UAdC(@zSK_J#u-+3@|A$a5}K|Q8&j3Zyh8{Nvl zwjh~4bAypcUJ8%V1W8kY5A+f5Km+>XixPSwb}??n8x|tMSmd{E`ftJc;Hpm;gPc5K zMe17RC>>Uhl#;OZViFR=zUT@MHB7yd2g^UxiO=%Zgm40l&h%??NBwOCga0@t7Pd@M z@#9E0H6+z4U$X)Gn*`~XE?8=1F?MrV|%0>Oo>1^iK_8= zm0UGkB@%4WEDVKuR$CF6I!l@qJSGm#i?k8WR(U+7k0V>^rO699i^4*LN_f~FY%3=v zXfU+%+pJ59`HnWQ5m-%J*KwDS1mijnfbSSqqnBCJ(;Vfwii0%n9jB+cqbVE3)t&y% zNoVTg_|B$CgRF2H5b{fNb3))7%TwK&7^14j92JJ<4rq{My*FsyLaRI8(Z;UT0I6ZRDrTU zq6dOh0WMT*i~b57@1P|cj(*R1GAB%3T?zLTHT%?0IrwL<6Cb&BjYnV7Co6p?q|=pA zK?C!%-FG-JNOQKPkIV&Dtp4f!11ULWM9Z(P)vQ8ZN_mAQ#AIAj9_>Wi3@#OddIO>@ zCFJ7fyxs3mbkKp&C)rL`$EqQ)M)37N7C(@^Yk40U+pc`804F%T0)~Y}2YPkZ+5?OZ zrn6Jw1&WqQ^Lh&{2EX@?%$_F-<|=IvlQp%!>wr?O%bae+FqB0bYtZ!dv%@AZP#FZ;y632Js-S$&fktM5$Uo}-JjJ$ z0AC3=D8jVJ_7r2L?;v|%FDV$D(#&PnW` zV})W=ZKP&1AHFfZDTb)YzvsBeuWoi}SwI{h`(<~PeD`YFI4@)7oJtAEFKjnm=TjF2 zhfWA!Tw*^4&LRheBbB}KTfYNw9coLlus!MyW--Rzy0-2>K{8tK-JNBRg=nDL4#P$JeFoS=cr-v6}R;Z$C5ybda)(S=+h0Dylp#Xh! z?E%{a`4?dGtcZJyo@&*O)&)Ghe#jgw8zLnC4x|lxIN3f(wF0UbbMJSgWs9*0IWcbud4N!N$)d`MdP6Se@@8S1c(?ztfU$P>Ns=?{o7q4-U_~$&KvNok%ZYElNF&!(Lx#&{JuW-1FJHX!?D#QN)KB;@*lb;nlOIe0y@tDcMqO zN9gy;gHPZ4h@-S&U6_d0@4G*^xk=8ZrMO|oa({DmbRN@SNnudv8(#lmp7_PC-t(tp zFzx*(I8{@@MbYqDSB~x2*@IyEUO0|^D--7Z`))E`BOz^5bPG%^@Ah~%a@Y49X{;su z{~V&4-xbhP$;R6B`+e8VrHesW{&DO&29QO=N-S9u+8Bh2a1+)dFcYE#uiQLJg}s?R zaZ9W3#O%UOa`=e4pGhKW1an-a%3kGwNuk_A!&n_PSbp|8AWRJX`_w>9FWX29cGu$- zNuZ$=b2~70vA?+50>49yI*|Z>)KPcH<#z&u>GPsy-tQuvmm=(cG7Sivz&7%En?l+A zcG&^MuE&RcT*$04OhvAmja|#vDK{g>;k5aUBpR6|U}YA* zuylSUw_1lrFBdtLRGQinX|!L|2QF3c@0BFN^l%y!c()JyfKw|?+ID9#PM5M;BX&6*|u%@KfM zngA(GT`p;+gRVDG%6c^3cZCs&UlZDwc{{>q#mJ(M5;97{c^#K%C))44WZLT>311#m|!XEfH*D# zn#2*#6}s{@_V4-S0!>0&!Q3DO)w!QY6iN3j8td_v)VGOHzlSp>+{AI);J3tCjOff3wn(410VVZyJbPoU4qc$5+FEkj(O-?599=w1n zD_+~3w47^nl5A;hb-vva)fFpoYo_!(2~fe$vnU{sh|W3YFlw-DU6o+3V`ME0(PoKX zYNbIe-6;QK2S^<#&ch5IZW>e0hc_;VE6+v?^}|2dfHSj^OTVfx3Y+>~)Z?UrmteAv zNAngVN3?Wv$A9mBjbCPaJU0rEO;1j85Bi2+)s%4HR$le}Re}gogyG5-OtC*E@C-bK zyFE2xkp#9@YiT4ejgq7xe72ZM;xF8JOH-to!4M^A9yS*iVx?b&dU~-e{ufDU z&k&SgNE2Kc?AF~I|IFSw-(>Ltvv^P(0gNhyd&V=b5yA4%RCtHxeMbiZCUeX=T+r43 z*MOQA4wx8?`H0gU7_bm=^NVk(JehHYX_oFfdm{lE6MwILmfWgCh*IoEX{mg+*!{DN z|068z`*3E*`}eoat&W3oB=4n*YJYSxD-n@K1P4C;DLEUe6j!vVRX2#z0gKS&>}T4> zcHn&{7y>IB2D@}^T&+$jc&<(5c3@25-gjJp_Lb>_B$|K z>2AOFL;GS>Su|~1@kYkfl&0e*eB9hDPt72@#rYDrjf}25Atq2uM*E&Tu~jx%Few$` zYwO4`e(oNW_;>AnUTTvkAd9^^M)+&%+cx$mixSAYHpBfM2JL^plC6|_xi?9V$pY;YVL<^Az#!4UbOt# z({&(3A%U_t+iNiuY z0eG2!^E>cD@HwdJ`CjnscbZA$_|g?w`nfY6dbsmRyJ-)TCOQIVCle z=3zqNtdQoBRM3Cb|7HT!Nmjq%N{J4evCDVa?FDt<`m4w(ZC*^w%j@-2kS>%d;AAkl z_=64O#AnvG+UXhI?~+q8s_}7{CRc+7{y!3j8gK{q+k6oiAIteSM9ptK(9(O9%WmYx zSX&3H*$Df@Zx&42`j8eKyRWACu}DmRAO~Jw)5rt{KG!Chf#)caJ&@b+IL^&W0D$fg z+YFE+)b#d1?q+VqkI>jS8%#sNeNhvuAvy71d0m}#+W_a=hKY5#!TGd4e)j30Qm#fX zq>P0Nli=jT2`X@X(JH_ZLe=5_#*xN*3{Y?$;Y2;L8KocFz;Oh;U{oN*8xb)y@A40X zSZPmYboNcux3^AXv!IExkPu$sxa=njv#6iSE=C5%yI)S7EJvM4teO>h?p)hum$Tgyh^`%f&Q zH!{(zx)aBksz>Rwa*}Mmx|9UxuT4|;X$LmcliVsdf- z@j%^RhL0%CVIjhy zx~iGv;=_QQ(X-P5y+ z%MLnp{#p=?g9mK!z3Et@I>XpovS zJDC?b2sNNlZ(oh5`C{&XugpRO))Hat`VuT3!Xc+qp5SHy^7g{awyYeo(ZlIgreILg zu$2=Tx?Ba3&(fuA`}M#5Fv95}@F*zvNyF9}P{O3~o&3`O$VrS$B^s5$^viYOiUW*O zt|(^A^Ez=RcQHQ=6aL)#S>VL+wf~l{M1?W*tVY9Or2{L~YOO0c6x_TYpNh_hw*Ye1 zKId~L$5m7>(8bLs6a=V8;=a@h^>2(X+qaWPwgC01dZSi3NvSAloCFk<+!7)o?jo^F z)PeZ*8Nn7cVc-K-z)xbT_~N5V@n#b<=-9!Xm+DH4KbQq5;QHE%Sjg?|OO_OLKrYhO z=~oUsVQ?KKelzo{7Opu5-*z%rg@LL*|4sFEhg2T7=Hz?`EF6Am@xh1{F_Y5raH(^v zj{+`PXh%)J)B$-+7@AMIOC!eAmstP>!wax33g3LMFTkr!wR-H{!*}XBca%--1@XHt z!af3UkunsHr9TkhNuaE})BktUCmcDu5f0PY#OT57_@Xt1@M@&?iMXp28Qr*xt;n4w zNbv8`w)0CRjw<8^78 zdC_T;ICRG42`*vmG$fa$m#f-w$-u~M6r;wx*C)$sS^lB>q!Z;}whH-cY`iDhC-tn1 zjEKR5?g%UjE&%~>cL+60`8@;M~+@%25kaSCJwsw%cptuNzSNu$=>0unJ5B&Jc|g@4Bv5gaVhw#hJS zF$HR!CKvHa-{E?ozjnI=6_)ABGaPtxoNvddyt`94r79Sspi0c^(MaI=go8ylaY}1# zvjGOSO{*cVy(eQUdm^w7s<%QeT$WDS=kRPx%VM-e;!PjV1HQ$Cq_u65$0a6qb76uK z3@r8glR&s>JJ5m?r6_qM6|Ngp#9RnCc3oBZgv(&sXT-=vVp~3UAf9@+dym?iAm`2= z^hL0xgy}!*&Ors<|3#YOOH$$==%|>sYuer?u{fBCr6}jPKKy`*ibFl{Vds4x_)W+V zyp9W`S!Z(lXJwx} zUQ34Aag_G1V!$cO_qZ6rLFqXjNg;JqwkwlpXJ?mP~%xc#1PGeN0l zh=+-`qTa&c&Kvl!kxQ33BHZHi(T$%HbNzh8E3c|*T=>rq)(zKTU>)8Z8tJ@#^9pbe z&F=pl0U~Bp`H_HoYhJ1Hjxw`cg+VAd)>7F?R@*KFdWvlGXm^iJ`Wez3-2P^`Nx%Hl zSXFs2;Xwr||7klc1#BvK)N0EeD`3;1nmNM+$2A)6*ViyCeTPm z1N{qlZ9)s8#G;eA=2ksa!`n@8*kaexI`8R9!`WKB5;Huv*yul@lmYVgrK@0$`uEV@5JV%om@A)kPltHi4 zld^?zy$*yNlpA(pKR#Mef)UTuRJ;Q9Qn5ChDi3S<|&ScGBgyjnkduV1MFU9Q;b;jv@O+Uk*5E$Ff-a@SCyrF z^hZoj7t>czWZwjllk$K+JS{0k1=W0Z7U4nWXvPiof6U`aFswJ|Ws*3<@xHpMlB$8a z3xT~XC*Y23jkEIgb9!;~@i9laDQ84NS=p(Nxc6#s<5onl)-CU&S+VL zad9toXRn1gvnj3`&n1J)D>MrLI)HoZcNS~ft=oC$;jq*~l>4wLDU4B$^?E8#k$b12 zaWTOu;K0{=gTgei^Z7n8--uWqslkbM=zRO)!(zY!ReDCofZ@~4Yw!7y0G$5y5bxpT zO)zG+w&Z@eGJO`$3Gk$Ge7a;h`>ET386F~}^~a9CWCaND{&T4tU-H0Nq!wI$e!8}B zaQJVMTvkS(t-8^$AQ7us6J{ilxWU9oTF=|1HtJ2J~tH5VskW)cR(&5@17kG2CvOZlEP}G~9kKS+W zwHR;uu&z7jye!{#mG}$+`^0M3hfDzhS)Ecc6l`%X$g}|wMxg&?K-7a*Cie$k@29JD$uSHQEu>$OkXn=nXFH$R#ZFgy=UnDJ z+YYjw00oze9mCSH5X7etwm5}_gl?-zfL?a7pnc{>0asc=3Q4Oq}%yise`;Q4X1AwyfVg1I{<6c!cNS5j-4d9Cy!x ziDEHKxpT4k-SB>^p@Mm>tqb#*pp(Fs@Pd?w7wS?J+X7l51Z@5UUtFcUnon6_N=#EnCv`c;20K(#(KcCkBIs93_|?7NsAKe|rRc|!y(@;-~Ll75y7M9jAf zbo2HmeeuFR%NN+;-<%OB_7SMp%h!W=y0br8YL+LTeZg`JO>2L+&V#}Z=N1-1Jq`vK zCONkM{&#f+yx{Fr{586fAbKL-b<&IK)PgtLc4G%_pv|MW>n8NmuzdTJ&)oggOa)2r zhD#_ncH=_$AmGu1CPNS$GmcGX?W9yh7uf&q@>t+d+e~ndTTf7%PVOb02L!*;je(1S zI0cMQXjIGqvMNYCV{h~$HodG>+3VVZ(@7G9}a_0dS_Tg#{8;H ze8O)-d(!7e7WDwM2w=+%)22V7GxNL6kr3!R_U6UJp~)5kcnUniD`oj$qk2x@{x?24 ztA<*^=0axqpMfd0!N!fOy{;O)hjnc;8yMlKXyH1fZr0A1gjxgfk{MT&drSRQgOxro z?3aQaFt^WRwjC+(yu`_)T&^7?)18LW ztaqF|OX;Nw*r4NWB)P2?<17bVj4eRtX3IkSI1&vVJE&^(FavKQW;arR(YDfSA2C@G z*R1sPzR}zcB0#tXy-KUgQN6C{_{??u!ckB64)#W6>oE%4qW8vqbwIC=blaa`#rE<@ zY9G?v&THi%lGvNZz(*25-X>0o@otbX1(;awxo8RCfolrYRT1Kcwq zci`yTe18%25;u`rG}x$Pve2tWug`bo-m&e1Dv-Y4Hbm%tU$-LymBtT}X4*jz_|&=F z92Hf64+rPiaVxNRO(Pk`u(Z=;i#0<2* zQXqqr%#Q1ou;-`w@w0@+cB1E&N+Mc_ue3#ER11n}U1 zg2HJDD8Ec@dcLctPRc;&njRa**N2&MLk6ebeHdcUm7Dd@ct;_-II?}dyHB{b>G;rf z&n+PlW2b|E`UUgpNK5cV<|s_ZfB;(LO2*lAj{b0)+lg48LHiPHo&h(xl0BfyPo&J| z{BP2|p;P4}ynH$!>AsyYax^g8amT+H_#6tx-g)TZjLjad1{)(60VmG5s)ZMxr z4 zfV+E`IjM#CA~4C9aGo+1F>;4NNFf$y>Ab~;(s2Y>mW7r!+4u6Lr%xYM#^{o8jRt+_ zKe4(Y!Tju8>Htg6&V;K5dZ8}A+*_3jRl&LmXyx6~h0n?K5zn>GUB z!>l=A2HVfXnSs$kdwcut(UFW0p}a`8qoGe z@`m@$M)LzKyx>RFu-GW#4|XjmL1ssPU4WvvhbwHorPwwE7Im^^Yq3frJkb|C0Ki8V6xq)yJ zz^u;etU7LpqU4g4#0ko)tDBnt_#PzQH4cKp2Fbj`T-@XuwW{B~GLVR4zJaLNR%%vG za{fev39bnusGHRHy%NJ;NEdX%#wY`1Krso-qKZpt;usZZ#4y zYQY|ZpK=(zTF)wEGd7>=M56=I4Xl+Nci~O@Wvmpx`Daby!JZ3IvX!|#@*!4cz}-7$ zOdAo#P9d{|pdjoX9)=Y_V+T637ad6eT}JP3jtrPogFZl?;?UEj+5IK{1y+{7QqW|L z28bHl<)BhB{y}x$zU_49X96DM&=#?UXhv~3=+puC3`is<6*!jmp5HufUil;`{-Tqh z@PfSP<#JyBKmq9W@uiA{Ai=0zd?^nYepmoLkK338V8?K@yu$!6e?MKmoW3!K%fvE3 zqocILxn5&*2horiRg*SFuSsk6rfB)874ou=kI9dt8){K~T)I=ze zi*x3UaDPn`R2&^DS8ve2J(>x&P&sUKWr%bQExr0gKZQSH-)oqA5o|9{)^!c1=hnLNpj%$J1vEN}Lkv&D7ye257>JEx} zt)W2(QYO+k+~57&`d#b7fCkQ%@OAFb5je>)-tRH6(bPD<6bJV`P#Tp*sB=L{#0b`$ zNl$!FTGy`c&Gm`-jAi@;f}fwNXhbD4GcM?BEAH;@a3MF`+}zsri=^l2;kvK|^5__<)96w)$3b}5Q&N%5s z+E+IJo&Ur4y8qAt0W^p*ViJ+yT9=ni4(D9RIF^05F?;*8)WqY5hhG5-0aFuq&DBc4 zBV6$dJcnjy3{R5|nf+&oAaar-;r;cA0!s=EO4v6v1Ofl?-%3veZGTB_0Ls)9-p!+g z_t!*bmXy5{@aGkaKFzgUSr~aw5-YqcvSXoMxIj`>^kR)Lr)=qHTtVITf`bi`zH#qfz&fiSY3pZJlQrHhE5}Qi8^d;o?1*Z@Vr_ZEL)6<b}pYKoa!wtX+8QMCZyV~U-jAeMKWsCH+^5e=0n5(q)&?Rf@$gzCs zIbKQ>UI9)rnWLbkro%m@!^O>?KYR)^a`!rH!(3W2PJpDiMGXEEJBG&0CITG=&paEz z+5Aj6MMT2V+{c6;fN%FSIwMmtNG<`*tV=%#q5(w_nEu%Xe|g1`1?!+LQpigq_5M zcJXjXCbIIt`>qt=jw$&{{sRW1K{JOJHI>glw|HjC$p%_H3YN3n!eG*%!EwTk|7F&D zS3f4iOsq^wMTK|#`lW*K>h;EHQX#hatdVLalqHRI&S&_|u4b-oIs5;+)lJtA4s+Gi z{*V6En{A9?s}tQaLVh<;P@a04)F3W2nub&?H2jBY&=P0%18Z<;IESSMqU4zRv5hl8 zG!VO-aLPIdaF6TsKZ;o&VYHGzMQm`alEP=N3e=+*Gu&|c-moay2W z%mE|oaRH+TD)=JzINbA3+Xo-*RV&`OX*L^49BD&|KMubIM?|6uBbH2=5MLuhP!kwT z!B?+_?y{NTMSByguV!_A;r_RE7aN8P)drG|-bFtIt*OsI>(ce-a?`eCxD-uAHM`G2 z3}rcj6}cwr2xTItM^s!}c*kiYOHwCr(!>v3-}dK=DESuvDm3@;ammQYu`8cSE}z;& zVq{bk_zEnSzE15mcHS2@ujRb*0@9~&KH#fE+bi%*Y+6^mV*gv$Ky+}oPJNSHxKQmeM`BmB#DwwNKoMX z_<^8j4cYAj3<7#W+-aryEfhNf4*>Ik8Au32zjH{}&{|(K5J|-V996`^Q87>(NBoBC zxaETS;hdz?{ij2$bRxBI%=pT^oZrSuXE-c>f|h02x(*EIq&2kT;>v?H2aCYax$|MG z3XF%2`vJ}c(IKGFEz*SF=>jdl+Ols)(23uDtES(Jj_=T(6+M;|V6eSQvx}I70u%?N z{D|OSNw~htFz@0b&tBmf!2M`MZWuW<)~F7Zn&P{>x)M=3Yk=W;}?5|k_3lLY)qTJLj#a+od{8v2)hK_NUvF)hufK_qyIX9@u6Kk03iQ<1kW6x zAnwLdxJNz+QjDxHk@=s~UsPs*ik<=WTWd*4zT>Dz$tPX|C}CCuFFOVm6%`~>W{me^ zrU6Hqj7U3|4H)n1>N27C)8nJ%7yPcQct2-v`Vyaru5f=~ePV(Z4qHcqiy*UKg>B}e zsoQf1;$Q-e*LEkZ5Yc}Sd#?=Qsz(`P7KX8mZd@7=SZD2*U;3I~BRUoXNJdEX^1dAk36w$#%sy z8wJ$p6qUr4S6l#jtw29K?c4_aFel z0%IvL@eVI0hsEbT2_!PB>Xfu z7@icHM7CRnFG8CIxpO5lDT#l~x=>MWX6_do82k@l9ROt)l7h~*C_yYBd3QVofU%Fr zmJT8E#l;1bINZu5FtBrjG*vUk^;Hw82BCD94y#TiZk>4s46Uuul1}MA^^za;R_!V3 zPGjhxsD=8PN%z)oZXqEM(SrfZ#cavh$ow~dvT}m@^nK(=z1fYFRgkAlMDL3*NNCzS z%-c3vVk%toa&uCY?d{L$@l3dx@rCLv(i%E|!~g5o0G`?}VOxP5DGSHtFR1?nu?n|0 zHJ<&%xFhw%f|cZMjLWpYgAZlxgiRS!Wr)f0jccq^a)kvLaF}+fuqBY$iaU(=-t7qQ z&>JQ3$(EXah89hD&{bBbwQ#V}*3DB|cxG>)$=X=_j)IjZY3GB1pqYmeIlafVY&P+} z)9mCn5}3F3*=&q4j#|;W!-!NA3Wl~W#{O!uq=3O&mJONZ>HQ<1S3^@qqDBWu>g$&T zM?G?~a64F!oPbwU$CE^#^+tM(ESF%eY>oDSio=`BSqCE#4AUW*DLxfd75*qo@RY$3 zOyzG!QC7CL8I6`t0G*{8sjc=r5<2h4FZi#K|2%df5S7e!xX`$A<}pM{@TQf-1P%tx z5%vC-kD2A>(CIEJA}R_dzrAOcOsg07U_zi11vb~UpWiFHc6TB8u5HpH$Eu>z&L%0uMuO46Vspu6wPvjm{$6MY#<7TC@e4!s z;7ds=r62`2kc41JMNy9Nyivu=LJ`^toKJ{hik+J;$xRLJC-wb$yRP4-F)&Awx_-)^ zcJ2NfoeRe-NkP?>_=*uIp6>nfToGB*MueUpMw{L)yh&!*k)HLS6!sxZQhb}_jWlMR z+xvtV>3lX5d*&7R%a|(w%~&v`D9vL6>wLN<=`x#xFq8jZ6!F6VMZ-1caIPzX3bJzM~EkvS21O1>lSX1s5f&bCB8>Hlab&Cr_LssLR)N(=inQ2NK!|x+95N zdhaUnD%@XZKOV>R`a6jq1iz7(_lh&F-ezAu(o(;uM+EIA3gw^AVmOUh8&eGfz#+Ei3F#NY6x#J}iY-bMcm+)&P%c?;$>z4e~zit@jd^Z6kK#gZ>ii&IfD z-UZQ>TQK)?Cn3Ch*}^yH;ld}UFkjLk&*1$}rp)BgJZra3z5Zx*-fo7rdtg9CZjTx* z3Z4Xfx3c71A9-BkRizkF>+EgBV?s`O7ENm&K2TVJmE_izi~MD5Sg{3v z1S|#X#?*p{>};7A^)X=f22KQYNo!_*n@WH^+@l#?4XF$PDmai>_zwN`+rkv>Rp#B< z%5td&A45k*$binv)haeQ{3|Kqy}}#AARZGG|I-UJHGwTBD~hN;Nl$xrST#y%YyZ~U zjZBh-+7Jav{URLcw0%?cERRd;+4n8t!lZX`^MJde1qa#FDlTJgw~6`{9MA8*DS{dg zZ`)%x`csIDQmYKN?B#%{-+g~v+P+ZYM#e%AUw9xDEn9`rZ#z%}wjg{D!T?=NE;sK+E1O0w7E#_|kYtnR zTmMm^z*{>@psh(sFYZY{u7rz7j=2IwYyZ5Pa$3%GUx*p{9U?AuD%z352R%N#t#P3c zQcE>8l|X?|h{M2piWSMSH`8Z%o9*;?$S>lVgTsKkl@%U1%(TnNp_dd1;B?3tq1B_7 zb9Z-_d(D{-bVHBTCurZt4X#bvUk8T;bE`-l&SXBZ>aLOXxcsiOGYJwo`4`*A-YkuY z12q~w?Sd-69!Z=Hx7Y5&Q=PtapPd2vL+>3fm+10fM@}W3po!D&$I=(y4qc+AnD|6bD@_f1|3Ph7&{v!OH#i`ZZS7aJW{O?My85s!9c=m7B z?*AB?{rc?Tdfqd~W`?Y~b2V7|82&a&MtWnUK6)RO?mah^G2-G0)~n_Y1*IIQMGQW& z&3p+;y2U{mGW2LnkWZ2!z~(>Cpg{9lH*b=(@@%Vc-|CiI5%Tm-63g^N`FbtB3@UPq zc6}(@NLfqrmpUbh3@mye;T>YXCEHCK8nCnD1VSTGpT`7F|1^;bN6ckWyx>gdn(REB z$^>R5(+*`uHPlqJ)|0VlZ@6#fBDm-k$pQh z>e6wp9~IA|GQ~qmX;16?XG8r`T`ru^$2mbqySQCH)oINiJa~S|(0O^6j4lq3_?|PD zcfB6>nG`-qPGP@LOJ}$=N4YegzE*lmA=_N1H8fz2g+7)+ACqB##37fb&lxeckg@CN zg7$k%z==ZN$V}kJcpDlRa9b7G4i73Phh4i9de{?pyG-P0~ch zwR2x4EX;?{O#`3Zz1)eL{$L^6(IeCR{Eu4$d~$6SzQ=aFT|57h&l&OX@fp4axXeN{ zUFw_jI_VGJ9ajv+w0)27884yw00$6GhltAy<-|VL#@W99DyM}<*4R0T^K)TLZQmCu zKZ_|3oeVNMe`+}RuXKddUY0x}W#V zOAEAUi%OVLfcT*Hh3*@?c*};RhNObJoayS?tkQX;Xibxu$pHW3XVrq1q35bwSP|Gp zf*pCd3i0)qdIpH}0$e2mZuAm&{~6)(nLcR;CO?|y4uEVGFzp$$GT=~{b+NbnxKKcL zpnsCkswyj$`eBF2!ycN4J)+{RBI1t-XfZ#?9LUsZ$*`pd*`!|KkqnmxI+5CbK9@mY zXD?f<^T_y-$%n*1zIDh)Jf}a?sM4FxfAQakf+AlqkMOE(%9&7aDYDoo6Q24S(6 z(4&dvUx=y%K9=uy5^Nn!a3>8waeR-J&1OE6%35GPsO}FA$(5wWh=JhRZ}|f)$*CFu3&md<_$Y0<1Zwuz?toU!_`5N2N-3YWmjn z60S6D{?GNAl_Vc{#h{84Ze9<`sM9Xi;gu2&1vvD{9^vyBURmCB?0NMdLB(UwQz0CA znZrXv0-lAp@2+p{c+Ty=cDguT7GH=iA!_x9Q~_A40DqIpY8LANK=;*g1`pghAETQf zlErnKH?WO45VE%M@Mm|&E0ld}4aLrUAELz_?_ij&ZtfmyAd&$El>vs+(0eE3T74Ew zcd9>RJv038r3`_LaC-aF?t|QhhB5t?wdE#dv6~lP1iRvQ(@v-V9{!2!Bt#zz1jlA! z93lL-B-K|>F)o5!eAl;XS3WcDYCSza&J#UAq22kqq=;rSTriTC^2^PrRP`Q+o!n7M zTHigE_`Mxg(XRTSi3#LK@800{h$?;wN%@9nPEr744f}z8(f(R<&)06v90@b}SlmQ3 zZeukrWIE!kJZs}%_i>r58d~i;_N=kArCLxt+JzslzxPX7TBe%Ebx**5YOgM)k zD6o+o6TD0Aa&-yZdPBf0O8+%RKVR#L-*IY>-oj0&_k(Pt(*uT9kgQ@Ok=ySN&+gm* z*VtR!V3St68#81IsB(R|_%Ux+riONb4GSgF6F*IcSC&e%2UCBgxstx!`VB18O4`lH z6aUstH_;4IFKtpw+ZW{0@vh3&#`B?zj>+)O0uEsh7E!Cqt?Mmp3_8T4WxDv zfQX^K+#JCdcFXbPu@SxU0+YI$`hz3uM2(4<7>4ZNH}^l^3^PqzAqd-cygV6#!h1K9 z59*ks*{};D^@r!&5{xwhh`SS;(d>l<&34v}4z7DQ6S*efPPx)_dyi00quNhr6R7KB zabjMQj*;|N8|-EJ1JOD*BoXC!aasfUBftIHy{gw0*CU9`(Nt6&Pw_5G!4f08NF9bLC^dUS2Z#f zdMZzepS7l$a^OsBY3Q{n@@r%K@)0j4QB&nPK z?1|9C5Mw{g%Z}R)(l$hRU>#2H;@(Yo(zyB3u?@J9pm^7&L~Fmwws60@m=(f>2DYyA~!}zY8Jgv|;;bLEU6*Nfo*~xv^lTiY0i8xt(xIf+MHP z^BeQ)&rk8*dpqC1()q{Gi$cW_2}L2(Q{&em?boX7e6OIoJu$_~$Q)+6bOq42D(a!a zzdrXQL^Ps^NuGGX$-?Nh;RF(ECb-nLqhD}` zqGPTD2?1pce?8uPk2Wg*X?a&p=c!MpkboUJIVs|{^K{xKu zMT-RovD~;jUh-P8JeDFF=Yzn{9V^*hye^t)1cT8pqo2NjnV$zf4!e8y-(ZBUk2QPN z5PtvX?T!U?0KUw2mv(s#tuwG!D|PQaZErv%Z~tL$z9T>S@VIwq``4Bale$zDc(YgE z8jIubtglDSDLg~%blwbn%>F~T>SfSl_U~}~8D{}0IiK9p*fRH_iw1bvz;a@T+X;qi zFQ*WpEIgl(Nbm|mU1Hyu#G%M`z3oQ%sU7*c36yuWd;DZl14~vvf|PP#4$@B=)eg1L zRX^0t|X3W73ei!F?+L zal<3jX7N+q^n+Vm^^r*KfFJhp$g&(sg2e(sKsef4UQ)3Fr>fef`IvNqcH}XGvOX z4r=9ac5_MNB>z96$EVNB-8;s{&){KTi^zF(ao=Er;3$Rf1p zp&aSw>*?}I*S&823*;#Mm^~!w=+69S_Nc%{f5w{n^j+tqvDYVXL?wKZ;nnz!o#{5t zz`VLZ|Jm2hqlpjm9_>+mfpf8zeBVoi67NxQ=!AD|NThdfX!+E{s?^@av`Q;L4UR7M zYc@I}JZqf1d5cQ$z{5`7`+C(+lJ~w#`W})FfTEjt+R`N{ji)vYp0lp8{rjj>va-6` zwLSd7C8ergbLjR{B$bN`p~Wa|(dcq2_(w7@D5$HuW0Mh?+Q8UtP}_wRM@e7;yE;oI zI{d&Nd4h%5l1J203L zwUsLXGmE^2G~=S-XRM?DeA+|z!J_m<(T%vaRf-54@(5Ar*d)F#JLSa}<~7=E;}c zW9IppU7vGNnG#5Ic7AuoIo2Yyd-S8#jM!4Sa5Q{yAe{8UKUekea6%=5wmnFKL_b-? zds?pZp^x`*w^~L=$9F-ohK9w4K;>@HZhQM5x4Ebkt_o^PzBg}TS~scdB?n(Qszv7H z=y2ugAtF93zj_H)uJF}bw{q`UUPAvL>HMcoQxI**AGE;E9*4F9)HX01miYBTk`k`p zJk-h%p_^NZomL<&|6A)x++0H9BPOE^($Ue`;$xrTM?T+JTh&!my^oF-JD3==(mVt{ zm8HM@H^?@cw)?fawzm7BpS|tcTQ!yUX9>{we;oQ*U0W#~YbGftriV-;VN_#xLPK~7 zc%`+bgw%bi_CEb-JfGrC|XI!6!DIH!YKK_SdI_T*%InK7DNUSO-u zIHSoR%XUuTW@L~&Ly;l7pp9voTH(${^ZBqP4jo*9Qc|Heo3{J#?u{eM=5>ZWNQ^qU z-nI1%_uLZvwgscd{WL+HG{EGR*RK%;2g&Fucldt+3l~8;g{sO~s}IM`(Q|XRYb6== z?uBQUYD5CVtp}6~ezK?Jo!mPZ%atjvuQbb9$RqrN#0&O8c;ev8NRcoW-wIB;-dF1J zZ_E4NK67ixg69@lw0tW~ck3)hU;qYpm-J!*QxqZ73o~=(A{{#s=RKMMF*|9rsM|&@ z<$71Qh5(5*|D#-in0-hA!N0*2GPBhgqg(?f5p6H#jXz_tQYI$kzQh zKLH|k!)E5p>*-9H;VS2LyY6Xx{DOPJMq`&*miiE8_ z6x^PTCtF3e!H?tu+*VbbUc9HS0^&6$NW}3|@}&s_a!TNpwHun1Uzk8_G=O~2@nt%f zmVjgF+f>@BrAp!TELI*fd_4SCT5KdG3cbD2jP3Dv*0k1@A=KuqyJK%}J#7Y--hZb5 zdvbw2r_92`?>4WTz7|w;1#^%d_w^9hX9dW?KKWA z?$y+01`Z_s(6Vqi$yUPP(wuVyMHTCQjp3-lAYMKtJ9{CZ%o+a(5oDbwUlzdRK*izF zSCKs3QqkkdD0iQ8$`F=>-npY*LTmGYX+xS%V8NxcB0e6%kQ4t2#;8y$J$$@fyu%ag zE72c=MVN!X{UNs$RHgV+9edz}k#9zpt)XH6Rm;0{{hJs+>JQMu4JHRh!7x1DfD|R1Eg~#7IxDT0O~h7E2pl`mrhXR$8`vkO{wHAe)bqgQ9N@{c;!E*>-KsNV@z7N z^zx(Jqb;Z69$$CQW+q{8pCe7If58!J`K;OZ+qVWiZUAuKj*JMQdSlJ@VJAZlhinf`eh8ps{Ex{Gf8@T)OIm`icyxuyaL+%D~?ep66YqQSMA z@G)-jXVNLFYW+Md8xY02zH)n<@2crr)k~f?nu?cY?xw#Rf(48rj5YfBNDk)-l^D&) zR{86Q1p(!9)JS}cND@>HvZ48=EQK%K$}@ImR<8FZG-!@bsdox<4!;txoZkiB3B`iI zN+)XgFQl&;F8OP(2ovB3-Gq5xeBqIiv0s~?n+7%0lndx(GX)N!T!l|xxJY4;Zl5A_ zss4;-5C_(k=3=Kc4(}obOcUZ_qbBqjh?yL@K>K$^f~G$gp_wG5&Y}y%%$Bn= zuiMFeawq!Of@o}nHctSmi1(occl1opL5~-i&tFiG%R#9OZD70h)3+!5bw&tEB~}#$ ztJwbKxWPYhO4httDzciC!E$X1q2jSVg~eP;@tpGJpG-z8vE$7hc!eQ--Z$+b0M`efdjI=0m>l#sPcIhYD#nwrKOHPYF z3BmTJXsvHQ3TPkG)GG{fDa~g7D1tCgU{c{21h&o!9c6i{9ho4JS|(0OA!VVi+Bhj&)0jvr~0A%OlvAZYKE@TSN_QIBIjQ zrKYPRJgMW?t#9G|9GbG!r6hAMHsq4~=!mV<#*No*_+ovjaf%fkg6aQD!tkQP_-2f9 z+$YqA9sB%IRl-o&3(4HzyBk4a=M%+Yl+PwyL`2z@d&~L{7>Deahk4dKN}d4e9K{Ou zr+QkByRPv$93a$&9es0+^YmxpN!Z}lXQfCT_LMa07~f+0iG6u`bCOOi+RvQoNFB#fA)t!H!O zY?|!^dwkUmVmYs!n#Mw_+_h_;pce}2+=xV$ znc?;e$}!5S6jdVmEe`+1q)6HqW-D`S1!SII}`iAa-ym z`$-U{+=<*XE+}pc%VD4JP-}Cl^)3Ay)-jc+jJ=Uy*bz!Vnt^Q)UAzw0qyQk!AUzVnkfEV z-`ZwL^Y`9jg6ntI46!fK`6vQjO5O46#V7@jX+*6N@x`SYEBwfVCBP7IBj5Ng!sn8# z%$pI+3jxellL{tH$xslH=9FjB4EeThyyDew#z7gCk`XCFuX<{vPl83t+clS@R{d0$ zF}qZhg2J@U9;>gKrjg%!y6;~VNC6V%#{(}uvUaWmGU~b%8u5ZVMo$8hC1TD~L&-D^ z&sEhir5j9a6Z%cfoc|kn`K9|^4o4+Tx@qWsOhnI~m8A;NklkEAm|5y{;S`LLS*s9Q9^12@3G-DNYvQ?QP+4 zq>4bEdN##-?Rw2lYnDHEb)>yA6D$14^;LC1O~uX44X@pJ=93Omag$$Yc|9>nL$6?e zi6XAoQAlDK>rT*}2^+fekn;vn^#(>94E$P4vnhGkocyQzU+jJuDiu|SVI~3BgKl^%`;7{(4gAy=em89dtA}&Qg#hN_il$rHoREl&&TUE z2_};wnfs)=zoS|v&b&l_;+LKriiEj@mxc{q`yxYVV{4mH&BX9pU!t5nPpHR=jI5mxbk4C9@{9iJ#6y@K0rFz%^P6=ZbiyF< z^Ib3HeBBP^2Jf{kmxLiT`NH1{Z4V7wn5PUIb!V7gjgT2E5o5gB5GTuQ9O5sl_!&Iw z{HIv4!I3-3Alpdl+K`4PhJR}B96R-L)rs2+--_m>^evubd(?*wno@^5++R z2{k?LbCTC(d*WqUUluj;>3O)kM~A8qa9dGvloqUKIbxXW>lIA~59c(ZnT33a__x5xqa`+zRAGZoQ2>Cg~Ru9i+9HxlYKReoA2)gV^F@u zs#H@^_35e{P}i#FHAVza4O^-9DxIdQI;7`($5D>6C@?KueDasIH1SS z$ru><+AuX#c5&`W33{oBKPjQY%PwrijDv@2tXF@zpY>Lv)_3lMklxkR3Tf0gxBJNz zKEF(KJ1jPY$mILpA-&T0bjw@(xQhSJ!;s6?+R$A(dwZVjQ;dxrqR{V+G*0!-9DLrt z>pbKgn|6X_qr2S2rCW7%K*M_K{D0rh*N|K?@f$F|u5h3V#(=LU3TpD@vL=E51Jx?R Ag8%>k literal 0 HcmV?d00001 diff --git a/doc/html/menu.js b/doc/html/menu.js new file mode 100644 index 0000000..15f9c52 --- /dev/null +++ b/doc/html/menu.js @@ -0,0 +1,131 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
    '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'+ + '
'+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + $('#main-menu').append('
  • '); + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/html/menudata.js b/doc/html/menudata.js new file mode 100644 index 0000000..2ee1c6f --- /dev/null +++ b/doc/html/menudata.js @@ -0,0 +1,77 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"q",url:"functions.html#index_q"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"b",url:"functions_func.html#index_b"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"w",url:"functions_func.html#index_w"}, +{text:"~",url:"functions_func.html#index__7E"}]}, +{text:"Variables",url:"functions_vars.html"}, +{text:"Typedefs",url:"functions_type.html"}, +{text:"Enumerations",url:"functions_enum.html"}, +{text:"Enumerator",url:"functions_eval.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}, +{text:"Examples",url:"examples.html"}]} diff --git a/doc/html/namespacedetail.html b/doc/html/namespacedetail.html new file mode 100644 index 0000000..f6ba91f --- /dev/null +++ b/doc/html/namespacedetail.html @@ -0,0 +1,1542 @@ + + + + + + + +Minecraft Community Edition: detail Namespace Reference + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    Minecraft Community Edition 0.1.0 +
    +
    +
    + + + + + + + + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    detail Namespace Reference
    +
    +
    + +

    detail namespace with internal helper functions +More...

    + + + + +

    +Namespaces

    namespace  dtoa_impl
     implements the Grisu2 algorithm for binary to decimal floating-point conversion.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    struct  make_void
    struct  nonesuch
    struct  detector
    struct  detector< Default, void_t< Op< Args... > >, Op, Args... >
    struct  is_detected_lazy
    struct  position_t
     struct to capture the start position of the current token More...
    struct  integer_sequence
    struct  priority_tag
    struct  priority_tag< 0 >
    struct  static_const
    struct  iterator_types
    struct  iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >
    struct  iterator_traits
    struct  iterator_traits< T, enable_if_t< !std::is_pointer< T >::value > >
    struct  iterator_traits< T *, enable_if_t< std::is_object< T >::value > >
    struct  is_basic_json
    struct  is_basic_json< NLOHMANN_BASIC_JSON_TPL >
    struct  is_basic_json_context
    class  json_ref
    struct  is_json_ref
    struct  is_json_ref< json_ref< T > >
    struct  has_from_json
    struct  is_getable
    struct  has_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >
    struct  has_non_default_from_json
    struct  has_non_default_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >
    struct  has_to_json
    struct  has_to_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >
    struct  has_key_compare
    struct  actual_object_comparator
    struct  char_traits
    struct  char_traits< unsigned char >
    struct  char_traits< signed char >
    struct  conjunction
    struct  conjunction< B >
    struct  conjunction< B, Bn... >
    struct  negation
    struct  is_default_constructible
    struct  is_default_constructible< std::pair< T1, T2 > >
    struct  is_default_constructible< const std::pair< T1, T2 > >
    struct  is_default_constructible< std::tuple< Ts... > >
    struct  is_default_constructible< const std::tuple< Ts... > >
    struct  is_constructible
    struct  is_constructible< std::pair< T1, T2 > >
    struct  is_constructible< const std::pair< T1, T2 > >
    struct  is_constructible< std::tuple< Ts... > >
    struct  is_constructible< const std::tuple< Ts... > >
    struct  is_iterator_traits
    struct  is_iterator_traits< iterator_traits< T > >
    struct  is_range
    struct  is_complete_type
    struct  is_complete_type< T, decltype(void(sizeof(T)))>
    struct  is_compatible_object_type_impl
    struct  is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, enable_if_t< is_detected< mapped_type_t, CompatibleObjectType >::value &&is_detected< key_type_t, CompatibleObjectType >::value > >
    struct  is_compatible_object_type
    struct  is_constructible_object_type_impl
    struct  is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, enable_if_t< is_detected< mapped_type_t, ConstructibleObjectType >::value &&is_detected< key_type_t, ConstructibleObjectType >::value > >
    struct  is_constructible_object_type
    struct  is_compatible_string_type
    struct  is_constructible_string_type
    struct  is_compatible_array_type_impl
    struct  is_compatible_array_type_impl< BasicJsonType, CompatibleArrayType, enable_if_t< is_detected< iterator_t, CompatibleArrayType >::value &&is_iterator_traits< iterator_traits< detected_t< iterator_t, CompatibleArrayType > > >::value &&!std::is_same< CompatibleArrayType, detected_t< range_value_t, CompatibleArrayType > >::value > >
    struct  is_compatible_array_type
    struct  is_constructible_array_type_impl
    struct  is_constructible_array_type_impl< BasicJsonType, ConstructibleArrayType, enable_if_t< std::is_same< ConstructibleArrayType, typename BasicJsonType::value_type >::value > >
    struct  is_constructible_array_type_impl< BasicJsonType, ConstructibleArrayType, enable_if_t< !std::is_same< ConstructibleArrayType, typename BasicJsonType::value_type >::value &&!is_compatible_string_type< BasicJsonType, ConstructibleArrayType >::value &&is_default_constructible< ConstructibleArrayType >::value &&(std::is_move_assignable< ConstructibleArrayType >::value||std::is_copy_assignable< ConstructibleArrayType >::value) &&is_detected< iterator_t, ConstructibleArrayType >::value &&is_iterator_traits< iterator_traits< detected_t< iterator_t, ConstructibleArrayType > > >::value &&is_detected< range_value_t, ConstructibleArrayType >::value &&!std::is_same< ConstructibleArrayType, detected_t< range_value_t, ConstructibleArrayType > >::value &&is_complete_type< detected_t< range_value_t, ConstructibleArrayType > >::value > >
    struct  is_constructible_array_type
    struct  is_compatible_integer_type_impl
    struct  is_compatible_integer_type_impl< RealIntegerType, CompatibleNumberIntegerType, enable_if_t< std::is_integral< RealIntegerType >::value &&std::is_integral< CompatibleNumberIntegerType >::value &&!std::is_same< bool, CompatibleNumberIntegerType >::value > >
    struct  is_compatible_integer_type
    struct  is_compatible_type_impl
    struct  is_compatible_type_impl< BasicJsonType, CompatibleType, enable_if_t< is_complete_type< CompatibleType >::value > >
    struct  is_compatible_type
    struct  is_compatible_reference_type_impl
    struct  is_compatible_reference_type
    struct  is_constructible_tuple
    struct  is_constructible_tuple< T1, std::tuple< Args... > >
    struct  is_json_iterator_of
    struct  is_json_iterator_of< BasicJsonType, typename BasicJsonType::iterator >
    struct  is_json_iterator_of< BasicJsonType, typename BasicJsonType::const_iterator >
    struct  is_specialization_of
    struct  is_specialization_of< Primary, Primary< Args... > >
    struct  is_json_pointer_of
    struct  is_json_pointer_of< A, ::nlohmann::json_pointer< A > >
    struct  is_json_pointer_of< A, ::nlohmann::json_pointer< A > & >
    struct  is_comparable
    struct  is_comparable< Compare, A, B, enable_if_t< !is_json_pointer_of< A, B >::value &&std::is_constructible< decltype(std::declval< Compare >()(std::declval< A >(), std::declval< B >()))>::value &&std::is_constructible< decltype(std::declval< Compare >()(std::declval< B >(), std::declval< A >()))>::value > >
    struct  is_ordered_map
    struct  value_in_range_of_impl2
    struct  value_in_range_of_impl2< OfType, T, false, false >
    struct  value_in_range_of_impl2< OfType, T, true, false >
    struct  value_in_range_of_impl2< OfType, T, false, true >
    struct  value_in_range_of_impl2< OfType, T, true, true >
    struct  value_in_range_of_impl1
    struct  value_in_range_of_impl1< OfType, T, false >
    struct  value_in_range_of_impl1< OfType, T, true >
    struct  is_c_string
    struct  is_transparent
    class  exception
     general exception of the basic_json class More...
    class  parse_error
     exception indicating a parse error More...
    class  invalid_iterator
     exception indicating errors with iterators More...
    class  type_error
     exception indicating executing a member function with a wrong type More...
    class  out_of_range
     exception indicating access out of the defined range More...
    class  other_error
     exception indicating other library errors More...
    struct  identity_tag
    struct  cxpr_or_impl
    struct  cxpr_or_impl< true, Booleans... >
    struct  cxpr_or_impl< false, Booleans... >
    struct  cxpr_and_impl
    struct  cxpr_and_impl< true, Booleans... >
    struct  cxpr_and_impl< false, Booleans... >
    struct  cxpr_not
    struct  cxpr_or
    struct  cxpr_or_c
    struct  cxpr_and
    struct  cxpr_and_c
    struct  from_json_fn
    class  iteration_proxy_value
    class  iteration_proxy
     proxy class for the items() function More...
    struct  external_constructor
    struct  external_constructor< value_t::boolean >
    struct  external_constructor< value_t::string >
    struct  external_constructor< value_t::binary >
    struct  external_constructor< value_t::number_float >
    struct  external_constructor< value_t::number_unsigned >
    struct  external_constructor< value_t::number_integer >
    struct  external_constructor< value_t::array >
    struct  external_constructor< value_t::object >
    struct  to_json_fn
    class  file_input_adapter
    class  input_stream_adapter
    class  iterator_input_adapter
    struct  wide_string_input_helper
    struct  wide_string_input_helper< BaseInputAdapter, 4 >
    struct  wide_string_input_helper< BaseInputAdapter, 2 >
    class  wide_string_input_adapter
    struct  iterator_input_adapter_factory
    struct  is_iterator_of_multibyte
    struct  iterator_input_adapter_factory< IteratorType, enable_if_t< is_iterator_of_multibyte< IteratorType >::value > >
    class  span_input_adapter
    class  lexer_base
    class  lexer
     lexical analysis More...
    class  json_sax_dom_parser
     SAX implementation to create a JSON value from SAX events. More...
    class  json_sax_dom_callback_parser
    class  json_sax_acceptor
    struct  is_sax
    struct  is_sax_static_asserts
    class  binary_reader
     deserialization of CBOR, MessagePack, and UBJSON values More...
    class  parser
     syntax analysis More...
    class  primitive_iterator_t
    struct  internal_iterator
     an iterator value More...
    class  iter_impl
    class  json_reverse_iterator
    struct  json_default_base
     Default base class of the basic_json class. More...
    struct  output_adapter_protocol
    class  output_vector_adapter
    class  output_stream_adapter
    class  output_string_adapter
    class  output_adapter
    class  binary_writer
     serialization to CBOR and MessagePack values More...
    class  serializer
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Typedefs

    +template<typename ... Ts>
    using void_t = typename make_void<Ts...>::type
    +template<template< class... > class Op, class... Args>
    using is_detected = typename detector<nonesuch, void, Op, Args...>::value_t
    +template<template< class... > class Op, class... Args>
    using detected_t = typename detector<nonesuch, void, Op, Args...>::type
    +template<class Default, template< class... > class Op, class... Args>
    using detected_or = detector<Default, void, Op, Args...>
    +template<class Default, template< class... > class Op, class... Args>
    using detected_or_t = typename detected_or<Default, Op, Args...>::type
    +template<class Expected, template< class... > class Op, class... Args>
    using is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>
    template<class To, template< class... > class Op, class... Args>
    using is_detected_convertible
    +template<typename T>
    using uncvref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type
    +template<bool B, typename T = void>
    using enable_if_t = typename std::enable_if<B, T>::type
    +template<size_t... Ints>
    using index_sequence = integer_sequence<size_t, Ints...>
    +template<typename T, T N>
    using make_integer_sequence = typename utility_internal::Gen<T, N>::type
    +template<size_t N>
    using make_index_sequence = make_integer_sequence<size_t, N>
    +template<typename... Ts>
    using index_sequence_for = make_index_sequence<sizeof...(Ts)>
    +template<typename T>
    using mapped_type_t = typename T::mapped_type
    +template<typename T>
    using key_type_t = typename T::key_type
    +template<typename T>
    using value_type_t = typename T::value_type
    +template<typename T>
    using difference_type_t = typename T::difference_type
    +template<typename T>
    using pointer_t = typename T::pointer
    +template<typename T>
    using reference_t = typename T::reference
    +template<typename T>
    using iterator_category_t = typename T::iterator_category
    +template<typename T, typename... Args>
    using to_json_function = decltype(T::to_json(std::declval<Args>()...))
    +template<typename T, typename... Args>
    using from_json_function = decltype(T::from_json(std::declval<Args>()...))
    +template<typename T, typename U>
    using get_template_function = decltype(std::declval<T>().template get<U>())
    +template<typename T>
    using detect_key_compare = typename T::key_compare
    +template<typename BasicJsonType>
    using actual_object_comparator_t = typename actual_object_comparator<BasicJsonType>::type
    +template<typename R>
    using iterator_t = enable_if_t<is_range<R>::value, result_of_begin<decltype(std::declval<R&>())>>
    +template<typename T>
    using range_value_t = value_type_t<iterator_traits<iterator_t<T>>>
    +template<typename T>
    using is_json_pointer = is_specialization_of<::nlohmann::json_pointer, uncvref_t<T>>
    +template<typename T>
    using detect_is_transparent = typename T::is_transparent
    template<typename Comparator, typename ObjectKeyType, typename KeyTypeCVRef, bool RequireTransparentComparator = true, bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>
    using is_usable_as_key_type
    template<typename BasicJsonType, typename KeyTypeCVRef, bool RequireTransparentComparator = true, bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>
    using is_usable_as_basic_json_key_type
    +template<typename ObjectType, typename KeyType>
    using detect_erase_with_key_type = decltype(std::declval<ObjectType&>().erase(std::declval<KeyType>()))
    template<typename BasicJsonType, typename KeyType>
    using has_erase_with_key_type
    +template<typename... Types>
    using all_integral = conjunction<std::is_integral<Types>...>
    +template<typename... Types>
    using all_signed = conjunction<std::is_signed<Types>...>
    +template<typename... Types>
    using all_unsigned = conjunction<std::is_unsigned<Types>...>
    template<typename... Types>
    using same_sign
    template<typename OfType, typename T>
    using never_out_of_range
    +template<bool Value>
    using bool_constant = std::integral_constant<bool, Value>
    +template<typename T>
    using is_c_string_uncvref = is_c_string<uncvref_t<T>>
    +template<typename StringType, typename Arg>
    using string_can_append = decltype(std::declval<StringType&>().append(std::declval < Arg&& >()))
    +template<typename StringType, typename Arg>
    using detect_string_can_append = is_detected<string_can_append, StringType, Arg>
    +template<typename StringType, typename Arg>
    using string_can_append_op = decltype(std::declval<StringType&>() += std::declval < Arg&& >())
    +template<typename StringType, typename Arg>
    using detect_string_can_append_op = is_detected<string_can_append_op, StringType, Arg>
    +template<typename StringType, typename Arg>
    using string_can_append_iter = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().begin(), std::declval<const Arg&>().end()))
    +template<typename StringType, typename Arg>
    using detect_string_can_append_iter = is_detected<string_can_append_iter, StringType, Arg>
    +template<typename StringType, typename Arg>
    using string_can_append_data = decltype(std::declval<StringType&>().append(std::declval<const Arg&>().data(), std::declval<const Arg&>().size()))
    +template<typename StringType, typename Arg>
    using detect_string_can_append_data = is_detected<string_can_append_data, StringType, Arg>
    +template<std::size_t PTagValue, typename BasicJsonType, typename... Types>
    using tuple_type = std::tuple < decltype(from_json_tuple_get_impl(std::declval<BasicJsonType>(), detail::identity_tag<Types> {}, detail::priority_tag<PTagValue> {}))... >
    +using string_input_adapter_type = decltype(input_adapter(std::declval<std::string>()))
    +using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>()))
    +template<typename T>
    using null_function_t = decltype(std::declval<T&>().null())
    template<typename T>
    using boolean_function_t
    template<typename T, typename Integer>
    using number_integer_function_t
    template<typename T, typename Unsigned>
    using number_unsigned_function_t
    template<typename T, typename Float, typename String>
    using number_float_function_t
    template<typename T, typename String>
    using string_function_t
    template<typename T, typename Binary>
    using binary_function_t
    template<typename T>
    using start_object_function_t
    template<typename T, typename String>
    using key_function_t
    +template<typename T>
    using end_object_function_t = decltype(std::declval<T&>().end_object())
    template<typename T>
    using start_array_function_t
    +template<typename T>
    using end_array_function_t = decltype(std::declval<T&>().end_array())
    template<typename T, typename Exception>
    using parse_error_function_t
    template<typename BasicJsonType>
    using parser_callback_t
    template<class T>
    using json_base_class
    +template<typename CharType>
    using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>
    + + + + + + + + + + +

    +Enumerations

    enum class  value_t : std::uint8_t {
    +  null +, object +, array +, string +,
    +  boolean +, number_integer +, number_unsigned +, number_float +,
    +  binary +, discarded +
    + }
     the JSON type enumeration More...
    enum class  input_format_t {
    +  json +, cbor +, msgpack +, ubjson +,
    +  bson +, bjdata +
    + }
     the supported input formats
    enum class  cbor_tag_handler_t { error +, ignore +, store + }
     how to treat CBOR tags More...
    enum class  parse_event_t : std::uint8_t { read +, array_end +, key +, value + }
    enum class  bjdata_version_t { draft2 +, draft3 + }
    enum class  error_handler_t { strict +, replace +, ignore + }
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    bool operator< (const value_t lhs, const value_t rhs) noexcept
     comparison operator for JSON types
    template<typename StringType>
    void replace_substring (StringType &s, const StringType &f, const StringType &t)
     replace all occurrences of a substring by another string
    template<typename StringType>
    StringType escape (StringType s)
     string escaping as described in RFC 6901 (Sect. 4)
    template<typename StringType>
    void unescape (StringType &s)
     string unescaping as described in RFC 6901 (Sect. 4)
    +template<typename T, typename... Args>
    constexpr std::array< T, sizeof...(Args)> make_array (Args &&... args)
    +template<typename T, typename U, enable_if_t< !std::is_same< T, U >::value, int > = 0>
    conditional_static_cast (U value)
    +template<typename T, typename U, enable_if_t< std::is_same< T, U >::value, int > = 0>
    conditional_static_cast (U value)
    +template<typename OfType, typename T>
    constexpr bool value_in_range_of (T val)
    +std::size_t concat_length ()
    +template<typename... Args>
    std::size_t concat_length (const char *cstr, const Args &... rest)
    +template<typename StringType, typename... Args>
    std::size_t concat_length (const StringType &str, const Args &... rest)
    +template<typename... Args>
    std::size_t concat_length (const char, const Args &... rest)
    +template<typename OutStringType>
    void concat_into (OutStringType &)
    +template<typename OutStringType, typename Arg, typename... Args, enable_if_t< !detect_string_can_append< OutStringType, Arg >::value &&detect_string_can_append_op< OutStringType, Arg >::value, int > = 0>
    void concat_into (OutStringType &out, Arg &&arg, Args &&... rest)
    +template<typename OutStringType, typename Arg, typename... Args, enable_if_t< !detect_string_can_append< OutStringType, Arg >::value &&!detect_string_can_append_op< OutStringType, Arg >::value &&detect_string_can_append_iter< OutStringType, Arg >::value, int > = 0>
    void concat_into (OutStringType &out, const Arg &arg, Args &&... rest)
    +template<typename OutStringType, typename Arg, typename... Args, enable_if_t< !detect_string_can_append< OutStringType, Arg >::value &&!detect_string_can_append_op< OutStringType, Arg >::value &&!detect_string_can_append_iter< OutStringType, Arg >::value &&detect_string_can_append_data< OutStringType, Arg >::value, int > = 0>
    void concat_into (OutStringType &out, const Arg &arg, Args &&... rest)
    +template<typename OutStringType, typename Arg, typename... Args, enable_if_t< detect_string_can_append< OutStringType, Arg >::value, int > = 0>
    void concat_into (OutStringType &out, Arg &&arg, Args &&... rest)
    +template<typename OutStringType = std::string, typename... Args>
    OutStringType concat (Args &&... args)
    +template<typename BasicJsonType>
    void from_json (const BasicJsonType &j, typename std::nullptr_t &n)
    +template<typename BasicJsonType, typename ArithmeticType, enable_if_t< std::is_arithmetic< ArithmeticType >::value &&!std::is_same< ArithmeticType, typename BasicJsonType::boolean_t >::value, int > = 0>
    void get_arithmetic_value (const BasicJsonType &j, ArithmeticType &val)
    +template<typename BasicJsonType>
    void from_json (const BasicJsonType &j, typename BasicJsonType::boolean_t &b)
    +template<typename BasicJsonType>
    void from_json (const BasicJsonType &j, typename BasicJsonType::string_t &s)
    +template<typename BasicJsonType, typename StringType, enable_if_t< std::is_assignable< StringType &, const typename BasicJsonType::string_t >::value &&is_detected_exact< typename BasicJsonType::string_t::value_type, value_type_t, StringType >::value &&!std::is_same< typename BasicJsonType::string_t, StringType >::value &&!is_json_ref< StringType >::value, int > = 0>
    void from_json (const BasicJsonType &j, StringType &s)
    +template<typename BasicJsonType>
    void from_json (const BasicJsonType &j, typename BasicJsonType::number_float_t &val)
    +template<typename BasicJsonType>
    void from_json (const BasicJsonType &j, typename BasicJsonType::number_unsigned_t &val)
    +template<typename BasicJsonType>
    void from_json (const BasicJsonType &j, typename BasicJsonType::number_integer_t &val)
    +template<typename BasicJsonType, typename EnumType, enable_if_t< std::is_enum< EnumType >::value, int > = 0>
    void from_json (const BasicJsonType &j, EnumType &e)
    +template<typename BasicJsonType, typename T, typename Allocator, enable_if_t< is_getable< BasicJsonType, T >::value, int > = 0>
    void from_json (const BasicJsonType &j, std::forward_list< T, Allocator > &l)
    +template<typename BasicJsonType, typename T, enable_if_t< is_getable< BasicJsonType, T >::value, int > = 0>
    void from_json (const BasicJsonType &j, std::valarray< T > &l)
    +template<typename BasicJsonType, typename T, std::size_t N>
    auto from_json (const BasicJsonType &j, T(&arr)[N]) -> decltype(j.template get< T >(), void())
    +template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2>
    auto from_json (const BasicJsonType &j, T(&arr)[N1][N2]) -> decltype(j.template get< T >(), void())
    +template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3>
    auto from_json (const BasicJsonType &j, T(&arr)[N1][N2][N3]) -> decltype(j.template get< T >(), void())
    +template<typename BasicJsonType, typename T, std::size_t N1, std::size_t N2, std::size_t N3, std::size_t N4>
    auto from_json (const BasicJsonType &j, T(&arr)[N1][N2][N3][N4]) -> decltype(j.template get< T >(), void())
    +template<typename BasicJsonType>
    void from_json_array_impl (const BasicJsonType &j, typename BasicJsonType::array_t &arr, priority_tag< 3 >)
    +template<typename BasicJsonType, typename T, std::size_t N>
    auto from_json_array_impl (const BasicJsonType &j, std::array< T, N > &arr, priority_tag< 2 >) -> decltype(j.template get< T >(), void())
    +template<typename BasicJsonType, typename ConstructibleArrayType, enable_if_t< std::is_assignable< ConstructibleArrayType &, ConstructibleArrayType >::value, int > = 0>
    auto from_json_array_impl (const BasicJsonType &j, ConstructibleArrayType &arr, priority_tag< 1 >) -> decltype(arr.reserve(std::declval< typename ConstructibleArrayType::size_type >()), j.template get< typename ConstructibleArrayType::value_type >(), void())
    +template<typename BasicJsonType, typename ConstructibleArrayType, enable_if_t< std::is_assignable< ConstructibleArrayType &, ConstructibleArrayType >::value, int > = 0>
    void from_json_array_impl (const BasicJsonType &j, ConstructibleArrayType &arr, priority_tag< 0 >)
    +template<typename BasicJsonType, typename ConstructibleArrayType, enable_if_t< is_constructible_array_type< BasicJsonType, ConstructibleArrayType >::value &&!is_constructible_object_type< BasicJsonType, ConstructibleArrayType >::value &&!is_constructible_string_type< BasicJsonType, ConstructibleArrayType >::value &&!std::is_same< ConstructibleArrayType, typename BasicJsonType::binary_t >::value &&!is_basic_json< ConstructibleArrayType >::value, int > = 0>
    auto from_json (const BasicJsonType &j, ConstructibleArrayType &arr) -> decltype(from_json_array_impl(j, arr, priority_tag< 3 > {}), j.template get< typename ConstructibleArrayType::value_type >(), void())
    +template<typename BasicJsonType, typename T, std::size_t... Idx>
    std::array< T, sizeof...(Idx)> from_json_inplace_array_impl (BasicJsonType &&j, identity_tag< std::array< T, sizeof...(Idx)> >, index_sequence< Idx... >)
    +template<typename BasicJsonType, typename T, std::size_t N>
    auto from_json (BasicJsonType &&j, identity_tag< std::array< T, N > > tag) -> decltype(from_json_inplace_array_impl(std::forward< BasicJsonType >(j), tag, make_index_sequence< N > {}))
    +template<typename BasicJsonType>
    void from_json (const BasicJsonType &j, typename BasicJsonType::binary_t &bin)
    +template<typename BasicJsonType, typename ConstructibleObjectType, enable_if_t< is_constructible_object_type< BasicJsonType, ConstructibleObjectType >::value, int > = 0>
    void from_json (const BasicJsonType &j, ConstructibleObjectType &obj)
    +template<typename BasicJsonType, typename ArithmeticType, enable_if_t< std::is_arithmetic< ArithmeticType >::value &&!std::is_same< ArithmeticType, typename BasicJsonType::number_unsigned_t >::value &&!std::is_same< ArithmeticType, typename BasicJsonType::number_integer_t >::value &&!std::is_same< ArithmeticType, typename BasicJsonType::number_float_t >::value &&!std::is_same< ArithmeticType, typename BasicJsonType::boolean_t >::value, int > = 0>
    void from_json (const BasicJsonType &j, ArithmeticType &val)
    +template<typename BasicJsonType, typename Type>
    detail::uncvref_t< Type > from_json_tuple_get_impl (BasicJsonType &&j, detail::identity_tag< Type >, detail::priority_tag< 0 >)
    +template<typename BasicJsonType, typename Type, detail::enable_if_t< detail::is_compatible_reference_type< BasicJsonType, Type >::value, int > = 0>
    Type from_json_tuple_get_impl (BasicJsonType &&j, detail::identity_tag< Type >, detail::priority_tag< 1 >)
    +template<typename BasicJsonType, typename Type, detail::enable_if_t< std::is_arithmetic< uncvref_t< Type > >::value, int > = 0>
    detail::uncvref_t< Type > from_json_tuple_get_impl (BasicJsonType &&j, detail::identity_tag< Type >, detail::priority_tag< 2 >)
    +template<std::size_t PTagValue, typename... Args, typename BasicJsonType, std::size_t... Idx>
    tuple_type< PTagValue, BasicJsonType, Args... > from_json_tuple_impl_base (BasicJsonType &&j, index_sequence< Idx... >)
    +template<std::size_t PTagValue, typename BasicJsonType>
    std::tuple from_json_tuple_impl_base (BasicJsonType &, index_sequence<>)
    +template<typename BasicJsonType, class A1, class A2>
    std::pair< A1, A2 > from_json_tuple_impl (BasicJsonType &&j, identity_tag< std::pair< A1, A2 > >, priority_tag< 0 >)
    +template<typename BasicJsonType, typename A1, typename A2>
    void from_json_tuple_impl (BasicJsonType &&j, std::pair< A1, A2 > &p, priority_tag< 1 >)
    +template<typename BasicJsonType, typename... Args>
    std::tuple< Args... > from_json_tuple_impl (BasicJsonType &&j, identity_tag< std::tuple< Args... > >, priority_tag< 2 >)
    +template<typename BasicJsonType, typename... Args>
    void from_json_tuple_impl (BasicJsonType &&j, std::tuple< Args... > &t, priority_tag< 3 >)
    +template<typename BasicJsonType, typename TupleRelated>
    auto from_json (BasicJsonType &&j, TupleRelated &&t) -> decltype(from_json_tuple_impl(std::forward< BasicJsonType >(j), std::forward< TupleRelated >(t), priority_tag< 3 > {}))
    +template<typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, typename = enable_if_t < !std::is_constructible < typename BasicJsonType::string_t, Key >::value >>
    void from_json (const BasicJsonType &j, std::map< Key, Value, Compare, Allocator > &m)
    +template<typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, typename = enable_if_t < !std::is_constructible < typename BasicJsonType::string_t, Key >::value >>
    void from_json (const BasicJsonType &j, std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > &m)
    +template<typename StringType>
    void int_to_string (StringType &target, std::size_t value)
    +template<typename StringType>
    StringType to_string (std::size_t value)
    +template<std::size_t N, typename IteratorType, enable_if_t< N==0, int > = 0>
    auto get (const nlohmann::detail::iteration_proxy_value< IteratorType > &i) -> decltype(i.key())
    +template<std::size_t N, typename IteratorType, enable_if_t< N==1, int > = 0>
    auto get (const nlohmann::detail::iteration_proxy_value< IteratorType > &i) -> decltype(i.value())
    +template<typename BasicJsonType, typename T, enable_if_t< std::is_same< T, typename BasicJsonType::boolean_t >::value, int > = 0>
    void to_json (BasicJsonType &j, T b) noexcept
    +template<typename BasicJsonType, typename BoolRef, enable_if_t<((std::is_same< std::vector< bool >::reference, BoolRef >::value &&!std::is_same< std::vector< bool >::reference, typename BasicJsonType::boolean_t & >::value)||(std::is_same< std::vector< bool >::const_reference, BoolRef >::value &&!std::is_same< detail::uncvref_t< std::vector< bool >::const_reference >, typename BasicJsonType::boolean_t >::value)) &&std::is_convertible< const BoolRef &, typename BasicJsonType::boolean_t >::value, int > = 0>
    void to_json (BasicJsonType &j, const BoolRef &b) noexcept
    +template<typename BasicJsonType, typename CompatibleString, enable_if_t< std::is_constructible< typename BasicJsonType::string_t, CompatibleString >::value, int > = 0>
    void to_json (BasicJsonType &j, const CompatibleString &s)
    +template<typename BasicJsonType>
    void to_json (BasicJsonType &j, typename BasicJsonType::string_t &&s)
    +template<typename BasicJsonType, typename FloatType, enable_if_t< std::is_floating_point< FloatType >::value, int > = 0>
    void to_json (BasicJsonType &j, FloatType val) noexcept
    +template<typename BasicJsonType, typename CompatibleNumberUnsignedType, enable_if_t< is_compatible_integer_type< typename BasicJsonType::number_unsigned_t, CompatibleNumberUnsignedType >::value, int > = 0>
    void to_json (BasicJsonType &j, CompatibleNumberUnsignedType val) noexcept
    +template<typename BasicJsonType, typename CompatibleNumberIntegerType, enable_if_t< is_compatible_integer_type< typename BasicJsonType::number_integer_t, CompatibleNumberIntegerType >::value, int > = 0>
    void to_json (BasicJsonType &j, CompatibleNumberIntegerType val) noexcept
    +template<typename BasicJsonType, typename EnumType, enable_if_t< std::is_enum< EnumType >::value, int > = 0>
    void to_json (BasicJsonType &j, EnumType e) noexcept
    +template<typename BasicJsonType>
    void to_json (BasicJsonType &j, const std::vector< bool > &e)
    +template<typename BasicJsonType, typename CompatibleArrayType, enable_if_t< is_compatible_array_type< BasicJsonType, CompatibleArrayType >::value &&!is_compatible_object_type< BasicJsonType, CompatibleArrayType >::value &&!is_compatible_string_type< BasicJsonType, CompatibleArrayType >::value &&!std::is_same< typename BasicJsonType::binary_t, CompatibleArrayType >::value &&!is_basic_json< CompatibleArrayType >::value, int > = 0>
    void to_json (BasicJsonType &j, const CompatibleArrayType &arr)
    +template<typename BasicJsonType>
    void to_json (BasicJsonType &j, const typename BasicJsonType::binary_t &bin)
    +template<typename BasicJsonType, typename T, enable_if_t< std::is_convertible< T, BasicJsonType >::value, int > = 0>
    void to_json (BasicJsonType &j, const std::valarray< T > &arr)
    +template<typename BasicJsonType>
    void to_json (BasicJsonType &j, typename BasicJsonType::array_t &&arr)
    +template<typename BasicJsonType, typename CompatibleObjectType, enable_if_t< is_compatible_object_type< BasicJsonType, CompatibleObjectType >::value &&!is_basic_json< CompatibleObjectType >::value, int > = 0>
    void to_json (BasicJsonType &j, const CompatibleObjectType &obj)
    +template<typename BasicJsonType>
    void to_json (BasicJsonType &j, typename BasicJsonType::object_t &&obj)
    +template<typename BasicJsonType, typename T, std::size_t N, enable_if_t< !std::is_constructible< typename BasicJsonType::string_t, const T(&)[N]>::value, int > = 0>
    void to_json (BasicJsonType &j, const T(&arr)[N])
    +template<typename BasicJsonType, typename T1, typename T2, enable_if_t< std::is_constructible< BasicJsonType, T1 >::value &&std::is_constructible< BasicJsonType, T2 >::value, int > = 0>
    void to_json (BasicJsonType &j, const std::pair< T1, T2 > &p)
    +template<typename BasicJsonType, typename T, enable_if_t< std::is_same< T, iteration_proxy_value< typename BasicJsonType::iterator > >::value, int > = 0>
    void to_json (BasicJsonType &j, const T &b)
    +template<typename BasicJsonType, typename Tuple, std::size_t... Idx>
    void to_json_tuple_impl (BasicJsonType &j, const Tuple &t, index_sequence< Idx... >)
    +template<typename BasicJsonType, typename Tuple>
    void to_json_tuple_impl (BasicJsonType &j, const Tuple &, index_sequence<>)
    +template<typename BasicJsonType, typename T, enable_if_t< is_constructible_tuple< BasicJsonType, T >::value, int > = 0>
    void to_json (BasicJsonType &j, const T &t)
    +std::size_t combine (std::size_t seed, std::size_t h) noexcept
    template<typename BasicJsonType>
    std::size_t hash (const BasicJsonType &j)
     hash a JSON value
    +template<typename IteratorType>
    iterator_input_adapter_factory< IteratorType >::adapter_type input_adapter (IteratorType first, IteratorType last)
    +template<typename ContainerType>
    container_input_adapter_factory_impl::container_input_adapter_factory< ContainerType >::adapter_type input_adapter (const ContainerType &container)
    +file_input_adapter input_adapter (std::FILE *file)
    +input_stream_adapter input_adapter (std::istream &stream)
    +input_stream_adapter input_adapter (std::istream &&stream)
    +template<typename CharT, typename std::enable_if< std::is_pointer< CharT >::value &&!std::is_array< CharT >::value &&std::is_integral< typename std::remove_pointer< CharT >::type >::value &&sizeof(typename std::remove_pointer< CharT >::type)==1, int >::type = 0>
    contiguous_bytes_input_adapter input_adapter (CharT b)
    +template<typename T, std::size_t N>
    auto input_adapter (T(&array)[N]) -> decltype(input_adapter(array, array+N))
    +constexpr std::size_t unknown_size ()
    bool little_endianness (int num=1) noexcept
     determine system byte order
    template<typename FloatType>
    JSON_HEDLEY_RETURNS_NON_NULL char * to_chars (char *first, const char *last, FloatType value)
     generates a decimal representation of the floating-point number value in [first, last).
    + + + + + +

    +Variables

    +template<typename T>
    constexpr T static_const< T >::value
    +template<typename BasicJsonType, typename InputAdapterType, typename SAX>
    constexpr std::size_t binary_reader< BasicJsonType, InputAdapterType, SAX >::npos
    +

    Detailed Description

    +

    detail namespace with internal helper functions

    +

    This namespace collects functions that should not be exposed, implementations of some basic_json methods, and meta-programming helpers.

    +
    Since
    version 2.1.0
    +

    Typedef Documentation

    + +

    ◆ binary_function_t

    + +
    +
    +
    +template<typename T, typename Binary>
    + + + + +
    using detail::binary_function_t
    +
    +Initial value:
    +
    decltype(std::declval<T&>().binary(std::declval<Binary&>()))
    +
    +
    +
    + +

    ◆ boolean_function_t

    + +
    +
    +
    +template<typename T>
    + + + + +
    using detail::boolean_function_t
    +
    +Initial value:
    +
    decltype(std::declval<T&>().boolean(std::declval<bool>()))
    +
    +
    +
    + +

    ◆ has_erase_with_key_type

    + +
    +
    +
    +template<typename BasicJsonType, typename KeyType>
    + + + + +
    using detail::has_erase_with_key_type
    +
    +Initial value:
    typename std::conditional <
    +
    is_detected <
    +
    detect_erase_with_key_type,
    +
    typename BasicJsonType::object_t, KeyType >::value,
    +
    std::true_type,
    +
    std::false_type >::type
    +
    +
    +
    + +

    ◆ is_detected_convertible

    + +
    +
    +
    +template<class To, template< class... > class Op, class... Args>
    + + + + +
    using detail::is_detected_convertible
    +
    +Initial value:
    +
    std::is_convertible<detected_t<Op, Args...>, To>
    +
    +
    +
    + +

    ◆ is_usable_as_basic_json_key_type

    + +
    +
    +
    +template<typename BasicJsonType, typename KeyTypeCVRef, bool RequireTransparentComparator = true, bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>
    + + + + +
    using detail::is_usable_as_basic_json_key_type
    +
    +Initial value:
    typename std::conditional <
    +
    (is_usable_as_key_type<typename BasicJsonType::object_comparator_t,
    +
    typename BasicJsonType::object_t::key_type, KeyTypeCVRef,
    +
    RequireTransparentComparator, ExcludeObjectKeyType>::value
    + +
    +
    +
    +
    , std::true_type,
    +
    std::false_type >::type
    +
    Definition json.hpp:4078
    +
    +
    +
    + +

    ◆ is_usable_as_key_type

    + +
    +
    +
    +template<typename Comparator, typename ObjectKeyType, typename KeyTypeCVRef, bool RequireTransparentComparator = true, bool ExcludeObjectKeyType = RequireTransparentComparator, typename KeyType = uncvref_t<KeyTypeCVRef>>
    + + + + +
    using detail::is_usable_as_key_type
    +
    +Initial value:
    typename std::conditional <
    + +
    && !(ExcludeObjectKeyType&& std::is_same<KeyType,
    +
    ObjectKeyType>::value)
    +
    && (!RequireTransparentComparator
    +
    || is_detected <detect_is_transparent, Comparator>::value)
    +
    && !is_json_pointer<KeyType>::value,
    +
    std::true_type,
    +
    std::false_type >::type
    +
    Definition json.hpp:4108
    +
    +
    +
    + +

    ◆ json_base_class

    + +
    +
    +
    +template<class T>
    + + + + +
    using detail::json_base_class
    +
    +Initial value:
    typename std::conditional <
    +
    std::is_same<T, void>::value,
    + +
    T
    +
    >::type
    +
    Default base class of the basic_json class.
    Definition json.hpp:13763
    +
    +
    +
    + +

    ◆ key_function_t

    + +
    +
    +
    +template<typename T, typename String>
    + + + + +
    using detail::key_function_t
    +
    +Initial value:
    +
    decltype(std::declval<T&>().key(std::declval<String&>()))
    +
    +
    +
    + +

    ◆ never_out_of_range

    + +
    +
    +
    +template<typename OfType, typename T>
    + + + + +
    using detail::never_out_of_range
    +
    +Initial value:
    std::integral_constant < bool,
    +
    (std::is_signed<OfType>::value && (sizeof(T) < sizeof(OfType)))
    +
    || (same_sign<OfType, T>::value && sizeof(OfType) == sizeof(T)) >
    +
    +
    +
    + +

    ◆ number_float_function_t

    + +
    +
    +
    +template<typename T, typename Float, typename String>
    + + + + +
    using detail::number_float_function_t
    +
    +Initial value:
    decltype(std::declval<T&>().number_float(
    +
    std::declval<Float>(), std::declval<const String&>()))
    +
    +
    +
    + +

    ◆ number_integer_function_t

    + +
    +
    +
    +template<typename T, typename Integer>
    + + + + +
    using detail::number_integer_function_t
    +
    +Initial value:
    +
    decltype(std::declval<T&>().number_integer(std::declval<Integer>()))
    +
    +
    +
    + +

    ◆ number_unsigned_function_t

    + +
    +
    +
    +template<typename T, typename Unsigned>
    + + + + +
    using detail::number_unsigned_function_t
    +
    +Initial value:
    +
    decltype(std::declval<T&>().number_unsigned(std::declval<Unsigned>()))
    +
    +
    +
    + +

    ◆ parse_error_function_t

    + +
    +
    +
    +template<typename T, typename Exception>
    + + + + +
    using detail::parse_error_function_t
    +
    +Initial value:
    decltype(std::declval<T&>().parse_error(
    +
    std::declval<std::size_t>(), std::declval<const std::string&>(),
    +
    std::declval<const Exception&>()))
    +
    +
    +
    + +

    ◆ parser_callback_t

    + +
    +
    +
    +template<typename BasicJsonType>
    + + + + +
    using detail::parser_callback_t
    +
    +Initial value:
    +
    std::function<bool(int , parse_event_t , BasicJsonType& )>
    +
    +
    +
    + +

    ◆ same_sign

    + +
    +
    +
    +template<typename... Types>
    + + + + +
    using detail::same_sign
    +
    +Initial value:
    std::integral_constant < bool,
    +
    all_signed<Types...>::value || all_unsigned<Types...>::value >
    +
    +
    +
    + +

    ◆ start_array_function_t

    + +
    +
    +
    +template<typename T>
    + + + + +
    using detail::start_array_function_t
    +
    +Initial value:
    +
    decltype(std::declval<T&>().start_array(std::declval<std::size_t>()))
    +
    +
    +
    + +

    ◆ start_object_function_t

    + +
    +
    +
    +template<typename T>
    + + + + +
    using detail::start_object_function_t
    +
    +Initial value:
    +
    decltype(std::declval<T&>().start_object(std::declval<std::size_t>()))
    +
    +
    +
    + +

    ◆ string_function_t

    + +
    +
    +
    +template<typename T, typename String>
    + + + + +
    using detail::string_function_t
    +
    +Initial value:
    +
    decltype(std::declval<T&>().string(std::declval<String&>()))
    +
    +
    +
    +

    Enumeration Type Documentation

    + +

    ◆ cbor_tag_handler_t

    + +
    +
    + + + + + +
    + + + + +
    enum class detail::cbor_tag_handler_t
    +
    +strong
    +
    + +

    how to treat CBOR tags

    + + + + +
    Enumerator
    error 

    throw a parse_error exception in case of a tag

    +
    ignore 

    ignore tags

    +
    store 

    store tags as binary type

    +
    + +
    +
    + +

    ◆ error_handler_t

    + +
    +
    + + + + + +
    + + + + +
    enum class detail::error_handler_t
    +
    +strong
    +
    + + + + +
    Enumerator
    strict 

    throw a type_error exception in case of invalid UTF-8

    +
    replace 

    replace invalid UTF-8 sequences with U+FFFD

    +
    ignore 

    ignore invalid UTF-8 sequences

    +
    + +
    +
    + +

    ◆ value_t

    + +
    +
    + + + + + +
    + + + + +
    enum class detail::value_t : std::uint8_t
    +
    +strong
    +
    + +

    the JSON type enumeration

    +

    This enumeration collects the different JSON types. It is internally used to distinguish the stored values, and the functions basic_json::is_null(), basic_json::is_object(), basic_json::is_array(), basic_json::is_string(), basic_json::is_boolean(), basic_json::is_number() (with basic_json::is_number_integer(), basic_json::is_number_unsigned(), and basic_json::is_number_float()), basic_json::is_discarded(), basic_json::is_primitive(), and basic_json::is_structured() rely on it.

    +
    Note
    There are three enumeration entries (number_integer, number_unsigned, and number_float), because the library distinguishes these three types for numbers: basic_json::number_unsigned_t is used for unsigned integers, basic_json::number_integer_t is used for signed integers, and basic_json::number_float_t is used for floating-point numbers or to approximate integers which do not fit in the limits of their respective type.
    +
    See also
    see basic_json::basic_json(const value_t value_type) – create a JSON value with the default value for a given type
    +
    Since
    version 1.0.0
    + + + + + + + + + + + +
    Enumerator
    null 

    null value

    +
    object 

    object (unordered set of name/value pairs)

    +
    array 

    array (ordered collection of values)

    +
    string 

    string value

    +
    boolean 

    boolean value

    +
    number_integer 

    number value (signed integer)

    +
    number_unsigned 

    number value (unsigned integer)

    +
    number_float 

    number value (floating-point)

    +
    binary 

    binary array (ordered collection of bytes)

    +
    discarded 

    discarded by the parser callback function

    +
    + +
    +
    +

    Function Documentation

    + +

    ◆ escape()

    + +
    +
    +
    +template<typename StringType>
    + + + + + +
    + + + + + + + +
    StringType detail::escape (StringType s)
    +
    +inline
    +
    + +

    string escaping as described in RFC 6901 (Sect. 4)

    +
    Parameters
    + + +
    [in]sstring to escape
    +
    +
    +
    Returns
    escaped string
    +

    Note the order of escaping "~" to "~0" and "/" to "~1" is important.

    + +
    +
    + +

    ◆ hash()

    + +
    +
    +
    +template<typename BasicJsonType>
    + + + + + + + +
    std::size_t detail::hash (const BasicJsonType & j)
    +
    + +

    hash a JSON value

    +

    The hash function tries to rely on std::hash where possible. Furthermore, the type of the JSON value is taken into account to have different hash values for null, 0, 0U, and false, etc.

    +
    Template Parameters
    + + +
    BasicJsonTypebasic_json specialization
    +
    +
    +
    Parameters
    + + +
    jJSON value to hash
    +
    +
    +
    Returns
    hash value of j
    + +
    +
    + +

    ◆ little_endianness()

    + +
    +
    + + + + + +
    + + + + + + + +
    bool detail::little_endianness (int num = 1)
    +
    +inlinenoexcept
    +
    + +

    determine system byte order

    +
    Returns
    true if and only if system's byte order is little endian
    +
    Note
    from https://stackoverflow.com/a/1001328/266378
    + +
    +
    + +

    ◆ operator<()

    + +
    +
    + + + + + +
    + + + + + + + + + + + +
    bool detail::operator< (const value_t lhs,
    const value_t rhs )
    +
    +inlinenoexcept
    +
    + +

    comparison operator for JSON types

    +

    Returns an ordering that is similar to Python:

      +
    • order: null < boolean < number < object < array < string < binary
    • +
    • furthermore, each type is not smaller than itself
    • +
    • discarded values are not comparable
    • +
    • binary is represented as a b"" string in python and directly comparable to a string; however, making a binary array directly comparable with a string would be surprising behavior in a JSON file.
    • +
    +
    Since
    version 1.0.0
    + +
    +
    + +

    ◆ replace_substring()

    + +
    +
    +
    +template<typename StringType>
    + + + + + +
    + + + + + + + + + + + + + + + + +
    void detail::replace_substring (StringType & s,
    const StringType & f,
    const StringType & t )
    +
    +inline
    +
    + +

    replace all occurrences of a substring by another string

    +
    Parameters
    + + + + +
    [in,out]sthe string to manipulate; changed so that all occurrences of f are replaced with t
    [in]fthe substring to replace with t
    [in]tthe string to replace f
    +
    +
    +
    Precondition
    The search string f must not be empty. This precondition is enforced with an assertion.
    +
    Since
    version 2.0.0
    + +
    +
    + +

    ◆ to_chars()

    + +
    +
    +
    +template<typename FloatType>
    + + + + + + + + + + + + + + + + +
    JSON_HEDLEY_RETURNS_NON_NULL char * detail::to_chars (char * first,
    const char * last,
    FloatType value )
    +
    + +

    generates a decimal representation of the floating-point number value in [first, last).

    +

    The format of the resulting decimal representation is similar to printf's g format. Returns an iterator pointing past-the-end of the decimal representation.

    +
    Note
    The input number must be finite, i.e. NaN's and Inf's are not supported.
    +
    +The buffer must be large enough.
    +
    +The result is NOT null-terminated.
    + +
    +
    + +

    ◆ unescape()

    + +
    +
    +
    +template<typename StringType>
    + + + + + +
    + + + + + + + +
    void detail::unescape (StringType & s)
    +
    +inline
    +
    + +

    string unescaping as described in RFC 6901 (Sect. 4)

    +
    Parameters
    + + +
    [in]sstring to unescape
    +
    +
    +
    Returns
    unescaped string
    +

    Note the order of escaping "~1" to "/" and "~0" to "~" is important.

    + +
    +
    +
    +
    + +
    + + + + diff --git a/doc/html/navtree.css b/doc/html/navtree.css new file mode 100644 index 0000000..0ea3a07 --- /dev/null +++ b/doc/html/navtree.css @@ -0,0 +1,327 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0; + padding:0; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); + line-height: 22px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--page-link-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; +} + +#nav-sync { + position:absolute; + top:0px; + right:0px; + z-index:1; +} + +#nav-sync img { + opacity:0.3; +} + +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/doc/html/navtree.js b/doc/html/navtree.js new file mode 100644 index 0000000..fac8d01 --- /dev/null +++ b/doc/html/navtree.js @@ -0,0 +1,901 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath,allMembersFile) { + let navTreeSubIndices = []; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function getScrollBarWidth () { + let outer = $('
    ').css({visibility: 'hidden', width: 100, overflow: 'scroll', scrollbarWidth: 'thin'}).appendTo('body'); + let widthWithScroll = $('
    ').css({width: '100%'}).appendTo(outer).outerWidth(); + outer.remove(); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + $("#nav-sync").css({right:parseInt(hasVerticalScrollbar?scrollbarWidth:0)}); + } + } + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + const e = n.replace(/-/g,'_'); + return window[e]; + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = function() { func(); adjustSyncIconPosition(); } + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).removeClass('opened').addClass('closed'); + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.offset().top; + } else if (anchor.position()) { + pos = anchor.offset().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(htmlToNode(''+text+'')); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).addClass('opened').removeClass('closed'); + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + $(node.plus_img.childNodes[0]).removeClass('closed').addClass('opened'); + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = $.extend(true, [], nti); + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } + } + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const navTo = function(o,root,hash,relpath) { + const link = cachedLink(); + if (link) { + const parts = link.split('#'); + root = parts[0]; + hash = parts.length>1 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + gotoUrl(o,root,hash,relpath); + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav.length ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseFloat(widths.leftPanelWidth)+"px"; + content.css({marginLeft:widthStr}); + if (fullSidebar) { + footer.css({marginLeft:widthStr}); + if (mainnav) { + mainnav.css({marginLeft:widthStr}); + } + } + sidenav.css({width:widthStr}); + if (pagenav.length) { + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + if (!dragLeft) { + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + } + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = $(sidenav).outerWidth()-barWidth; + let pagenavWidth = pagenav.length ? $(pagenav).outerWidth() : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav.length) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.outerHeight(); + } + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + content.css({height:contentHeight + "px"}); + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(true); } }); + $(sidenav).resizable({ minWidth: 0 }); + if (pagenav.length) { + pagehandle = $("#page-nav-resize-handle"); + pagehandle.on('mousedown touchstart',function(e) { + $('body').addClass('resizing'); + pagehandle.addClass('dragging'); + $(document).on('mousemove touchmove',function(e) { + const clientX = e.clientX || e.originalEvent.touches[0].clientX; + let pagenavWidth = container[0].offsetWidth-clientX+barWidth/2; + const sidenavWidth = sidenav.width(); + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + content.css({marginLeft:parseFloat(widths.leftPanelWidth)+'px'}); + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }); + $(document).on('mouseup touchend', function(e) { + $('body').removeClass('resizing'); + pagehandle.removeClass('dragging'); + $(document).off('mousemove mouseup touchmove touchend'); + }); + }); + } else { + container.css({gridTemplateColumns:'auto'}); + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(window).ready(function() { + let lastWidth = -1; + let lastHeight = -1; + $(window).resize(function() { + const newWidth = $(this).width(), newHeight = $(this).height(); + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = $(window).width(); + lastHeight = $(window).height(); + content.scroll(function() { + navtree_trampoline.updateContentTop(); + }); + }); + } + + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content=$('
      ').addClass('page-outline'); + + var entityMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + function escapeHtml (string) { + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + // for ClassDef/GroupDef/ModuleDef/ConceptDef/DirDef + const groupSections = []; + let currentGroup = null; + $('h2.groupheader, h2.memtitle').each(function(){ + const $element = $(this); + if ($element.hasClass('groupheader')) { + currentGroup = { groupHeader: $element, memTitles: [] }; + groupSections.push(currentGroup); + } else if ($element.hasClass('memtitle') && currentGroup) { + currentGroup.memTitles.push($element); + } + }); + groupSections.forEach(function(item){ + const title = item.groupHeader.text().trim(); + let id = item.groupHeader.attr('id'); + const table = item.groupHeader.parents('table.memberdecls'); + let rows = $(); + if (table.length>0) { + rows = table.find("tr[class^='memitem:'] td.memItemRight, tr[class^='memitem:'] td.memItemLeft.anon, tr[class=groupHeader] td"); + } + function hasSubItems() { + return item.memTitles.length>0 || rows.toArray().some(function(el) { return $(el).is(':visible'); }); + } + const li = $('
    • ').attr('id','nav-'+id); + const div = $('
      ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + if (hasSubItems()) { + span.append($('').addClass('arrowhead opened')); + } + const ahref = $('').attr('href','#'+id).append(title); + content.append(li.append(div.append(span).append(ahref))); + topMapping.push(id); + const ulStack = []; + ulStack.push(content); + if (hasSubItems()) { + let last_id = undefined; + let inMemberGroup = false; + // declaration sections have rows for items + rows.each(function(){ + let td = $(this); + let tr = $(td).parent(); + const is_anon_enum = td.contents().first().text().trim()=='{'; + if (tr.hasClass('template')) { + tr = tr.prev(); + } + id = $(tr).attr('id'); + let text = is_anon_enum ? 'anonymous enum' : $(this).find(':first-child').text(); + let isMemberGroupHeader = $(tr).hasClass('groupHeader'); + if ($(tr).is(":visible") && last_id!=id && id!==undefined) { + if (isMemberGroupHeader && inMemberGroup) { + ulStack.pop(); + inMemberGroup=false; + } + const li2 = $('
    • ').attr('id','nav-'+id); + const div2 = $('
      ').addClass('item'); + const span2 = $('').addClass('arrow').css({ paddingLeft:parseInt(ulStack.length*16)+'px' }); + const ahref = $('').attr('href','#'+id).append(escapeHtml(text)); + li2.append(div2.append(span2).append(ahref)); + topMapping.push(id); + if (isMemberGroupHeader) { + span2.append($('').addClass('arrowhead opened')); + ulStack[ulStack.length-1].append(li2); + const ul2 = $('
        '); + ulStack.push(ul2); + li2.append(div2).append(ul2); + inMemberGroup=true; + } else { + ulStack[ulStack.length-1].append(li2); + } + last_id=id; + } + }); + // detailed documentation has h2.memtitle sections for items + item.memTitles.forEach(function(data) { + const text = $(data).contents().not($(data).children().first()).text(); + const name = text.replace(/\(\)(\s*\[\d+\/\d+\])?$/, '') // func() [2/8] -> func + id = $(data).find('span.permalink a').attr('href') + if (id!==undefined && name!==undefined) { + const li2 = $('
      • ').attr('id','nav-'+id.substring(1)); + const div2 = $('
      • '); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').css({ paddingLeft:'0' }); + const ahref = $('').attr('href',srcBaseUrl+dstBaseUrl+pageName).addClass('noscroll'); + content.append(li.append(div.append(span).append(ahref.append(LISTOFALLMEMBERS)))); + } + + if (groupSections.length==0) { + // for PageDef + const sectionTree = [], sectionStack = []; + $('h1.doxsection, h2.doxsection, h3.doxsection, h4.doxsection, h5.doxsection, h6.doxsection').each(function(){ + const level = parseInt(this.tagName[1]); + const anchor = $(this).find('a.anchor').attr('id'); + const node = { text: $(this).html(), id: anchor, children: [] }; + while (sectionStack.length && sectionStack[sectionStack.length - 1].level >= level) sectionStack.pop(); + (sectionStack.length ? sectionStack[sectionStack.length - 1].children : sectionTree).push(node); + sectionStack.push({ ...node, level }); + }); + if (sectionTree.length>0) { + function render(nodes, level=0) { + nodes.map(n => { + const li = $('
      • ').attr('id','nav-'+n.id); + const div = $('
        ').addClass('item'); + const span = $('').addClass('arrow').attr('style','padding-left:'+parseInt(level*16)+'px;'); + if (n.children.length > 0) { span.append($('').addClass('arrowhead opened')); } + const url = $('').attr('href','#'+n.id); + content.append(li.append(div.append(span).append(url.append(n.text)))); + topMapping.push(n.id); + render(n.children,level+1); + }); + } + render(sectionTree); + } + } + + toc_contents.append(content); + + $(".page-outline a[href]:not(.noscroll)").click(function(e) { + e.preventDefault(); + const aname = $(this).attr("href"); + gotoAnchor($(aname),aname); + }); + + let lastScrollSourceOffset = -1; + let lastScrollTargetOffset = -1; + let lastScrollTargetId = ''; + + navtree_trampoline.updateContentTop = function() { + const pagenavcontents = $("#page-nav-contents"); + if (pagenavcontents.length) { + const content = $("#doc-content"); + const height = content.height(); + const navy = pagenavcontents.offset().top; + const yc = content.offset().top; + let offsets = [] + for (let i=0;imargin || ye>margin) && (yslastScrollTargetOffset) || + (!scrollDown && targetOffset { + navtree_trampoline.updateContentTop(); + },200); + } + $(document).ready(function() { initPageToc(); initResizable(); }); + +} +/* @license-end */ diff --git a/doc/html/navtreedata.js b/doc/html/navtreedata.js new file mode 100644 index 0000000..b05db57 --- /dev/null +++ b/doc/html/navtreedata.js @@ -0,0 +1,59 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var NAVTREE = +[ + [ "Minecraft Community Edition", "index.html", [ + [ "Todo List", "todo.html", null ], + [ "Bug List", "bug.html", null ], + [ "Deprecated List", "deprecated.html", null ], + [ "Topics", "topics.html", "topics" ], + [ "Classes", "annotated.html", [ + [ "Class List", "annotated.html", "annotated_dup" ], + [ "Class Index", "classes.html", null ], + [ "Class Hierarchy", "hierarchy.html", "hierarchy" ], + [ "Class Members", "functions.html", [ + [ "All", "functions.html", null ], + [ "Functions", "functions_func.html", null ], + [ "Variables", "functions_vars.html", null ], + [ "Typedefs", "functions_type.html", null ], + [ "Enumerations", "functions_enum.html", null ], + [ "Enumerator", "functions_eval.html", null ] + ] ] + ] ], + [ "Files", "files.html", [ + [ "File List", "files.html", "files_dup" ] + ] ], + [ "Examples", "examples.html", "examples" ] + ] ] +]; + +var NAVTREEINDEX = +[ +"_assert_8hpp_source.html" +]; + +var SYNCONMSG = 'click to disable panel synchronization'; +var SYNCOFFMSG = 'click to enable panel synchronization'; +var LISTOFALLMEMBERS = 'List of all members'; \ No newline at end of file diff --git a/doc/html/navtreeindex0.js b/doc/html/navtreeindex0.js new file mode 100644 index 0000000..7653786 --- /dev/null +++ b/doc/html/navtreeindex0.js @@ -0,0 +1,195 @@ +var NAVTREEINDEX0 = +{ +"_assert_8hpp_source.html":[5,0,0,0], +"_coroutine_scheduler_8hpp.html":[5,0,1,0], +"_coroutine_scheduler_8hpp_source.html":[5,0,1,0], +"_file_input_stream_8hpp_source.html":[5,0,3,0,0], +"_file_output_stream_8hpp_source.html":[5,0,3,0,1], +"_function_container_8hpp_source.html":[5,0,1,2], +"_g_l_graphics_context_8hpp_source.html":[5,0,2,0,0], +"_g_l_renderer_8hpp_source.html":[5,0,2,0,1], +"_graphics_context_8hpp_source.html":[5,0,2,1], +"_i_event_8hpp_source.html":[5,0,1,3], +"_input_stream_8hpp_source.html":[5,0,3,0,2], +"_logger_8hpp_source.html":[5,0,3,1], +"_logger_sinks_8hpp_source.html":[5,0,3,2], +"_memory_input_stream_8hpp_source.html":[5,0,3,0,3], +"_output_stream_8hpp_source.html":[5,0,3,0,4], +"_platform_8hpp_source.html":[5,0,0,1], +"_q_event_bus_8hpp.html":[5,0,1,4], +"_q_event_bus_8hpp_source.html":[5,0,1,4], +"_renderer_8hpp_source.html":[5,0,2,2], +"_thread_8hpp.html":[5,0,1,5], +"_thread_8hpp_source.html":[5,0,1,5], +"_thread_impl_8hpp.html":[5,0,1,6], +"_thread_impl_8hpp_source.html":[5,0,1,6], +"_thread_manager_8hpp.html":[5,0,1,7], +"_thread_manager_8hpp_source.html":[5,0,1,7], +"_virtual_file_system_8hpp_source.html":[5,0,3,3], +"annotated.html":[4,0], +"bug.html":[1], +"class_example_class.html":[3,0,0], +"class_example_class.html#a9d2ee12372f2f25050ffd0283a7c6a8d":[3,0,0,0], +"classes.html":[4,1], +"classmce_1_1_coroutine_scheduler.html":[4,0,0,1], +"classmce_1_1_coroutine_scheduler.html#a08b0a86a4940c34b5db26acefa3e316c":[4,0,0,1,2], +"classmce_1_1_coroutine_scheduler.html#a172c9650e9b298a3e2e03ff0e9571dfb":[4,0,0,1,4], +"classmce_1_1_coroutine_scheduler.html#a4720b9b79d6dc3182f531837d364453d":[4,0,0,1,3], +"classmce_1_1_coroutine_scheduler.html#acd70e48944e7dadad6ec0514f587432a":[4,0,0,1,1], +"classmce_1_1_file_input_stream.html":[4,0,0,22], +"classmce_1_1_file_input_stream.html#a26a715bb8bb53cb3cb1b1de6059af07a":[4,0,0,22,2], +"classmce_1_1_file_input_stream.html#a271ddb30e8c58bbb759c03a6970277e1":[4,0,0,22,1], +"classmce_1_1_file_input_stream.html#a3eb6e463ae37bd285915c3b41fd5f53e":[4,0,0,22,3], +"classmce_1_1_file_input_stream.html#a3f974238eeb105b85e455145cc85518a":[4,0,0,22,6], +"classmce_1_1_file_input_stream.html#a6bf0dffd4568ef1638aed7aafa2ecd00":[4,0,0,22,4], +"classmce_1_1_file_input_stream.html#a8a46a90250858695bf282ed1fc601cc8":[4,0,0,22,5], +"classmce_1_1_file_input_stream.html#abe975adc14ec46da5085aa396bf6bb17":[4,0,0,22,0], +"classmce_1_1_file_output_stream.html":[4,0,0,23], +"classmce_1_1_file_output_stream.html#a0ab5f8d7e010b94a072bc13b52e5dd1c":[4,0,0,23,0], +"classmce_1_1_file_output_stream.html#a4160ad51b9d0d867e45bba2a3a4d30db":[4,0,0,23,2], +"classmce_1_1_file_output_stream.html#a695bf4b8e186fcd40a666487e4e4b8f1":[4,0,0,23,1], +"classmce_1_1_file_output_stream.html#aa198c5d7ebede14fa06d0de7a05a2028":[4,0,0,23,5], +"classmce_1_1_file_output_stream.html#aa6659c362021935717bbfc176075877a":[4,0,0,23,6], +"classmce_1_1_file_output_stream.html#ac6e82fc9655a7a1dfd3d981519f18583":[4,0,0,23,7], +"classmce_1_1_file_output_stream.html#acc1a4e675eba02a8dad17a6acd1d4265":[4,0,0,23,4], +"classmce_1_1_file_output_stream.html#ae17a2bca1876c50cb5725b41551dd43b":[4,0,0,23,3], +"classmce_1_1_file_sink.html":[4,0,0,18], +"classmce_1_1_function_container.html":[4,0,0,2], +"classmce_1_1_function_container.html#a302e97f87b554bbaac24ca5d7f884385":[4,0,0,2,3], +"classmce_1_1_function_container.html#a3d754d6d89dc40e1bb7c178941687b16":[4,0,0,2,5], +"classmce_1_1_function_container.html#a56021097f6d60531a37b7c6158b88ec7":[4,0,0,2,1], +"classmce_1_1_function_container.html#ab0271b06ab337b65ae2a4ac79c80c55c":[4,0,0,2,6], +"classmce_1_1_function_container.html#abaabfec7793c0a261354f592f20062ce":[4,0,0,2,2], +"classmce_1_1_function_container.html#ad88b85713ffa87b60972a43be7da9517":[4,0,0,2,0], +"classmce_1_1_function_container.html#aeb8c83b9b780a1990007da8e8e5f3133":[4,0,0,2,4], +"classmce_1_1_g_l_graphics_context.html":[4,0,0,20], +"classmce_1_1_g_l_renderer.html":[4,0,0,21], +"classmce_1_1_graphics_context.html":[4,0,0,13], +"classmce_1_1_input_stream.html":[4,0,0,24], +"classmce_1_1_input_stream.html#a38cee7380aef36c4db0287e38609b4d7":[4,0,0,24,3], +"classmce_1_1_input_stream.html#a4c7ee56f44922aa52b608d44cbc4235c":[4,0,0,24,2], +"classmce_1_1_input_stream.html#a548e3aeadfb9222019bcb59a39848d9e":[4,0,0,24,1], +"classmce_1_1_input_stream.html#a661d85973a2683a217252c36f47da682":[4,0,0,24,0], +"classmce_1_1_logger.html":[4,0,0,15], +"classmce_1_1_logger_sink.html":[4,0,0,16], +"classmce_1_1_memory_input_stream.html":[4,0,0,25], +"classmce_1_1_memory_input_stream.html#a11da8b6c2f59d0a5987bf06b93245bb1":[4,0,0,25,2], +"classmce_1_1_memory_input_stream.html#a220e82b4a2096923f91b02058a354c1a":[4,0,0,25,1], +"classmce_1_1_memory_input_stream.html#a229ade412a4c8843a77d68b5a99814c0":[4,0,0,25,5], +"classmce_1_1_memory_input_stream.html#a30df68220fde1b86deee930444e729d1":[4,0,0,25,4], +"classmce_1_1_memory_input_stream.html#a6f8edd8bbe3b0fe735cce8f43f2a41b4":[4,0,0,25,0], +"classmce_1_1_memory_input_stream.html#ac3771e7c4a9f8bb4a6e10581683fb97b":[4,0,0,25,3], +"classmce_1_1_output_stream.html":[4,0,0,26], +"classmce_1_1_output_stream.html#a4b19dae8e434c51a7d79058994c035c7":[4,0,0,26,0], +"classmce_1_1_output_stream.html#a549f1ca23e39341f9a3cc23927644d81":[4,0,0,26,3], +"classmce_1_1_output_stream.html#a738833d8f02a3442f2cd317bd64bb0c4":[4,0,0,26,2], +"classmce_1_1_output_stream.html#af2b439b646d1c6262fa2fb5e5025c0f4":[4,0,0,26,1], +"classmce_1_1_q_event_bus.html":[4,0,0,5], +"classmce_1_1_q_event_bus.html#a030f589e472aa12873a6302677878d67":[4,0,0,5,1], +"classmce_1_1_q_event_bus.html#a06db1890efe5587da99b9d45b6436b88":[4,0,0,5,5], +"classmce_1_1_q_event_bus.html#a13302d26ca2e8b91e075e5430ea9ce97":[4,0,0,5,2], +"classmce_1_1_q_event_bus.html#a292b5d677b6dc2b483339e5ff6fc8497":[4,0,0,5,4], +"classmce_1_1_q_event_bus.html#a37196ad021d476479362bfe51ffc1b59":[4,0,0,5,3], +"classmce_1_1_q_event_bus.html#a7f5a80e3f10f95ab433dd04942778e5b":[4,0,0,5,0], +"classmce_1_1_q_event_bus.html#a8a47e0ac9ec1cb0430c19ab9aae2bc21":[4,0,0,5,7], +"classmce_1_1_q_event_bus.html#ae4a067bd3f491f948307f688acabd905":[4,0,0,5,6], +"classmce_1_1_renderer.html":[4,0,0,14], +"classmce_1_1_stdout_sink.html":[4,0,0,17], +"classmce_1_1_thread.html":[4,0,0,10], +"classmce_1_1_thread.html#a35eebc21874cf98c954d0f06f5fa8cb3":[4,0,0,10,1], +"classmce_1_1_thread.html#a6857a0007eb44e985a11b76e8b2ab81d":[4,0,0,10,4], +"classmce_1_1_thread.html#a7167ced2613ce6e9e3ae0ee942277c87":[4,0,0,10,5], +"classmce_1_1_thread.html#a90e3636f9c64c36a6935a849445b17c1":[4,0,0,10,0], +"classmce_1_1_thread.html#ad53fb135e59203bea7469f8ec3bde46b":[4,0,0,10,3], +"classmce_1_1_thread.html#ad96edc70278355f33805f7826bcea466":[4,0,0,10,2], +"classmce_1_1_thread_impl.html":[4,0,0,11], +"classmce_1_1_thread_impl.html#a2608abc24e2f18be8e25eb3a4265cdda":[4,0,0,11,2], +"classmce_1_1_thread_impl.html#a671887ec3998eab1d2f0262a85a3b087":[4,0,0,11,0], +"classmce_1_1_thread_impl.html#ae003bae531fde909b1cb13d6159b1fcb":[4,0,0,11,1], +"classmce_1_1_thread_manager.html":[4,0,0,12], +"classmce_1_1_thread_manager.html#a0739a1906bf371bf8a729ab0d0ce4929":[4,0,0,12,9], +"classmce_1_1_thread_manager.html#a07cbeefe7d5b5d4845e0b2f1e59fef21":[4,0,0,12,6], +"classmce_1_1_thread_manager.html#a10b8efbe312127af02418c3942b0e7b6":[4,0,0,12,2], +"classmce_1_1_thread_manager.html#a3cfaaa1edb1dd0ded4a99553972cd93c":[4,0,0,12,5], +"classmce_1_1_thread_manager.html#a43beb921636d53a6efd22d4ef8982165":[4,0,0,12,3], +"classmce_1_1_thread_manager.html#a44af86c56b28fdcb5aeadfee871d3773":[4,0,0,12,1], +"classmce_1_1_thread_manager.html#a72319f5b2505aa6e0fe75cfdc1231032":[4,0,0,12,4], +"classmce_1_1_thread_manager.html#a7b58969244f296e97a21656b563cf231":[4,0,0,12,10], +"classmce_1_1_thread_manager.html#ab500bf731fff307e4e7a06928b865167":[4,0,0,12,8], +"classmce_1_1_thread_manager.html#ad5e09cdd0695f8587b041a618284b018":[4,0,0,12,7], +"classmce_1_1_virtual_file_system.html":[4,0,0,19], +"classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726":[4,0,0,19,2], +"classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a7c98cab84fc00353d5d242cfa5c257d4":[4,0,0,19,2,2], +"classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a9f4b2e54fa9d67e203bf38f78d0ff067":[4,0,0,19,2,1], +"classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726ad7dc87fe0ad41cd2d441e509c81ea486":[4,0,0,19,2,3], +"classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726af4117d29bc8623330732b880e03c422b":[4,0,0,19,2,0], +"classmce_1_1_virtual_file_system.html#a7dd599ce69981b9e8efc4bf01d7c4c06":[4,0,0,19,3], +"classmce_1_1_virtual_file_system.html#a8f65e6706de32cdbe5c68f6e7053222a":[4,0,0,19,5], +"classmce_1_1_virtual_file_system.html#ae5c0d15aed23eb8651abcce2190fb7ac":[4,0,0,19,6], +"classmce_1_1_virtual_file_system.html#af593de4f0ffc1a84a66ed160cbc26fe2":[4,0,0,19,4], +"deprecated.html":[2], +"dir_26891a649404ec89e7d5863c163240e9.html":[5,0,2,0], +"dir_4ab6b4cc6a7edbff49100e9123df213f.html":[5,0,0], +"dir_5533e7f136d8aec169f8a924fe5a6516.html":[5,0,3,0], +"dir_64f7452aef2cdad98d34a70f5ea329e2.html":[5,0,2], +"dir_c6310732a22f63c0c2fc5595561e68f1.html":[5,0,1], +"dir_f0b8d3380d5649deec2d780f35ec3ac5.html":[5,0,3], +"example_8hpp.html":[5,0,1,1], +"example_8hpp_source.html":[5,0,1,1], +"examples.html":[6], +"examples_2example1_8cpp-example.html":[6,0], +"files.html":[5,0], +"functions.html":[4,3,0], +"functions_enum.html":[4,3,4], +"functions_eval.html":[4,3,5], +"functions_func.html":[4,3,1], +"functions_type.html":[4,3,3], +"functions_vars.html":[4,3,2], +"group___example_group.html":[3,0], +"hierarchy.html":[4,2], +"index.html":[], +"pages.html":[], +"structmce_1_1_coroutine_scheduler_1_1_task.html":[4,0,0,1,0], +"structmce_1_1_coroutine_scheduler_1_1_task.html#a368f3214e4561e84b6a4cc091409b770":[4,0,0,1,0,1], +"structmce_1_1_coroutine_scheduler_1_1_task.html#a883f91e465a098322335417c86e308ff":[4,0,0,1,0,0], +"structmce_1_1_coroutine_scheduler_1_1_task.html#aac988d329eb108a812656b26fe6a445c":[4,0,0,1,0,2], +"structmce_1_1_i_event.html":[4,0,0,3], +"structmce_1_1_subscription_token.html":[4,0,0,4], +"structmce_1_1_subscription_token.html#aa7c3dce6c3a9d70bcb5eef10e9d6a712":[4,0,0,4,1], +"structmce_1_1_subscription_token.html#ae8014c0fd7075e841b2b62762e51fba2":[4,0,0,4,0], +"structmce_1_1_thread_func.html":[4,0,0,6], +"structmce_1_1_thread_func.html#a326effacbebaefebd61fd3b57a480d39":[4,0,0,6,0], +"structmce_1_1_thread_func.html#a845789c58b4cd7e73c7a99d15c2337f6":[4,0,0,6,1], +"structmce_1_1_thread_functor.html":[4,0,0,7], +"structmce_1_1_thread_functor.html#a15516d7b0dbda4d412ffdbea0eb2bc30":[4,0,0,7,1], +"structmce_1_1_thread_functor.html#a9146327d84308e61f348693894cc4345":[4,0,0,7,2], +"structmce_1_1_thread_functor.html#adf20b2d25c1d267d6201abc5ee019112":[4,0,0,7,0], +"structmce_1_1_thread_manager_1_1_thread_info.html":[4,0,0,12,0], +"structmce_1_1_thread_manager_1_1_thread_info.html#a5eef90a23c053aa432cd9b0e6f776676":[4,0,0,12,0,0], +"structmce_1_1_thread_manager_1_1_thread_info.html#aadf689cbdeea6113d039d8cad5c72591":[4,0,0,12,0,3], +"structmce_1_1_thread_manager_1_1_thread_info.html#abd381cf47c56be2cf32ac833a4f06197":[4,0,0,12,0,2], +"structmce_1_1_thread_manager_1_1_thread_info.html#aee473db051066cd05bbc9225a7238982":[4,0,0,12,0,1], +"structmce_1_1_thread_member_functor.html":[4,0,0,8], +"structmce_1_1_thread_member_functor.html#a1dc618e61e73f82c5898e873e486e480":[4,0,0,8,0], +"structmce_1_1_thread_member_functor.html#a3720c4df81fb32687f5b836232b7f044":[4,0,0,8,2], +"structmce_1_1_thread_member_functor.html#a53486e3258e69a89e50a62e47ab3edfd":[4,0,0,8,1], +"structmce_1_1_thread_member_functor.html#a6cf5ef7fac6e9cca36187edc9e52c6c6":[4,0,0,8,3], +"structmce_1_1_thread_member_functor_with_args.html":[4,0,0,9], +"structmce_1_1_thread_member_functor_with_args.html#a437472525ce47993742f5063277aa3c5":[4,0,0,9,3], +"structmce_1_1_thread_member_functor_with_args.html#a5719012094127c1e0808b71f3b668038":[4,0,0,9,4], +"structmce_1_1_thread_member_functor_with_args.html#a8256fbf40767aa3a44a6362d4575e540":[4,0,0,9,2], +"structmce_1_1_thread_member_functor_with_args.html#ad7b3374d69d6e0a3c606a299c47ccdf4":[4,0,0,9,0], +"structmce_1_1_thread_member_functor_with_args.html#aff17a973bcfacc0ee487458c0ca5f228":[4,0,0,9,1], +"structmce_1_1_virtual_file_system_1_1_config.html":[4,0,0,19,1], +"structmce_1_1_virtual_file_system_1_1_config.html#a68337b00a6b442330be53200de7c8253":[4,0,0,19,1,0], +"structmce_1_1_virtual_file_system_1_1_config.html#a7194f22656273211636586825f301573":[4,0,0,19,1,2], +"structmce_1_1_virtual_file_system_1_1_config.html#ae4bb57adc6625136aa75f6e94fe18307":[4,0,0,19,1,1], +"structmce_1_1event_1_1_logger_output.html":[4,0,0,0,0], +"structmce_1_1event_1_1_thread_finished.html":[4,0,0,0,1], +"structmce_1_1event_1_1_thread_started.html":[4,0,0,0,2], +"todo.html":[0], +"topics.html":[3], +"unionmce_1_1_virtual_file_system_1_1_version.html":[4,0,0,19,0], +"unionmce_1_1_virtual_file_system_1_1_version.html#a3fb983d2e7943c95d54d1fbcd5ecd5d3":[4,0,0,19,0,0], +"unionmce_1_1_virtual_file_system_1_1_version.html#a9738beeedb1f5be4ab8108f658c70414":[4,0,0,19,0,1] +}; diff --git a/doc/html/pages.html b/doc/html/pages.html new file mode 100644 index 0000000..9ed1698 --- /dev/null +++ b/doc/html/pages.html @@ -0,0 +1,112 @@ + + + + + + + +Minecraft Community Edition: Related Pages + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Related Pages
        +
        +
        +
        Here is a list of all related documentation pages:
        +
        +
        +
        + +
        + + diff --git a/doc/html/requirements.html b/doc/html/requirements.html new file mode 100644 index 0000000..d35a350 --- /dev/null +++ b/doc/html/requirements.html @@ -0,0 +1,129 @@ + + + + + + + +Minecraft Community Edition: Requirements + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Requirements
        +
        +
        +
        + + + + +
        ID
        The
        class satisfies the following concept requirements:
        a template for a bidirectional iterator for the basic_json class This class implements a both iterators (iterator and const_iterator) for the basic_json class.
        Note
        An iterator is called initialized when a pointer to a JSON value has been set (e.g., by a constructor or a copy assignment). If the iterator is default-constructed, it is uninitialized and most methods are undefined. The library uses assertions to detect calls on uninitialized iterators.**
        + +
        +

        +

        +
        Unsatisfied Requirements

        +
        The requirement The does not have a 'satisfies' relation.

        +
        Unverified Requirements

        +
        The requirement The does not have a 'verifies' relation.
        +
        +
        + +
        + + + + diff --git a/doc/html/search/all_0.js b/doc/html/search/all_0.js new file mode 100644 index 0000000..23fbb05 --- /dev/null +++ b/doc/html/search/all_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['activecount_0',['activeCount',['../classmce_1_1_thread_manager.html#a43beb921636d53a6efd22d4ef8982165',1,'mce::ThreadManager']]], + ['add_1',['add',['../class_example_class.html#a9d2ee12372f2f25050ffd0283a7c6a8d',1,'ExampleClass']]], + ['addfunction_2',['addFunction',['../classmce_1_1_function_container.html#abaabfec7793c0a261354f592f20062ce',1,'mce::FunctionContainer']]], + ['addtask_3',['addTask',['../classmce_1_1_coroutine_scheduler.html#a4720b9b79d6dc3182f531837d364453d',1,'mce::CoroutineScheduler']]], + ['args_4',['args',['../structmce_1_1_thread_member_functor_with_args.html#a8256fbf40767aa3a44a6362d4575e540',1,'mce::ThreadMemberFunctorWithArgs']]], + ['assets_5ffile_5',['ASSETS_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a9f4b2e54fa9d67e203bf38f78d0ff067',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/all_1.js b/doc/html/search/all_1.js new file mode 100644 index 0000000..b2a62f4 --- /dev/null +++ b/doc/html/search/all_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['bug_20list_0',['Bug List',['../bug.html',1,'']]], + ['buildjsonmappingfile_1',['buildJSONMappingFile',['../classmce_1_1_virtual_file_system.html#a7dd599ce69981b9e8efc4bf01d7c4c06',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/all_10.js b/doc/html/search/all_10.js new file mode 100644 index 0000000..2332dcb --- /dev/null +++ b/doc/html/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['seek_0',['seek',['../classmce_1_1_file_input_stream.html#a8a46a90250858695bf282ed1fc601cc8',1,'mce::FileInputStream::seek()'],['../classmce_1_1_file_output_stream.html#aa198c5d7ebede14fa06d0de7a05a2028',1,'mce::FileOutputStream::seek()'],['../classmce_1_1_input_stream.html#a4c7ee56f44922aa52b608d44cbc4235c',1,'mce::InputStream::seek()'],['../classmce_1_1_memory_input_stream.html#a30df68220fde1b86deee930444e729d1',1,'mce::MemoryInputStream::seek()'],['../classmce_1_1_output_stream.html#af2b439b646d1c6262fa2fb5e5025c0f4',1,'mce::OutputStream::seek()']]], + ['source_5ffile_1',['SOURCE_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a7c98cab84fc00353d5d242cfa5c257d4',1,'mce::VirtualFileSystem']]], + ['starttime_2',['startTime',['../structmce_1_1_thread_manager_1_1_thread_info.html#abd381cf47c56be2cf32ac833a4f06197',1,'mce::ThreadManager::ThreadInfo']]], + ['stdoutsink_3',['StdoutSink',['../classmce_1_1_stdout_sink.html',1,'mce']]], + ['stop_4',['stop',['../classmce_1_1_q_event_bus.html#a06db1890efe5587da99b9d45b6436b88',1,'mce::QEventBus']]], + ['subscribe_5',['subscribe',['../classmce_1_1_q_event_bus.html#ae4a067bd3f491f948307f688acabd905',1,'mce::QEventBus']]], + ['subscriberaii_6',['subscribeRAII',['../classmce_1_1_q_event_bus.html#a8a47e0ac9ec1cb0430c19ab9aae2bc21',1,'mce::QEventBus']]], + ['subscriptiontoken_7',['SubscriptionToken',['../structmce_1_1_subscription_token.html',1,'mce']]] +]; diff --git a/doc/html/search/all_11.js b/doc/html/search/all_11.js new file mode 100644 index 0000000..93eb4fc --- /dev/null +++ b/doc/html/search/all_11.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['task_0',['Task',['../structmce_1_1_coroutine_scheduler_1_1_task.html',1,'mce::CoroutineScheduler']]], + ['tell_1',['tell',['../classmce_1_1_file_input_stream.html#a3f974238eeb105b85e455145cc85518a',1,'mce::FileInputStream::tell()'],['../classmce_1_1_file_output_stream.html#aa6659c362021935717bbfc176075877a',1,'mce::FileOutputStream::tell()'],['../classmce_1_1_input_stream.html#a38cee7380aef36c4db0287e38609b4d7',1,'mce::InputStream::tell()'],['../classmce_1_1_memory_input_stream.html#a229ade412a4c8843a77d68b5a99814c0',1,'mce::MemoryInputStream::tell()'],['../classmce_1_1_output_stream.html#a738833d8f02a3442f2cd317bd64bb0c4',1,'mce::OutputStream::tell()']]], + ['terminate_2',['terminate',['../classmce_1_1_thread_impl.html#ae003bae531fde909b1cb13d6159b1fcb',1,'mce::ThreadImpl']]], + ['thread_3',['Thread',['../classmce_1_1_thread.html',1,'mce::Thread'],['../classmce_1_1_thread.html#a90e3636f9c64c36a6935a849445b17c1',1,'mce::Thread::Thread(QEventBus &qBus, F function)'],['../classmce_1_1_thread.html#a35eebc21874cf98c954d0f06f5fa8cb3',1,'mce::Thread::Thread(QEventBus &qBus, void(C::*function)(), C *object)'],['../classmce_1_1_thread.html#ad96edc70278355f33805f7826bcea466',1,'mce::Thread::Thread(QEventBus &qBus, void(C::*function)(), C *object, Args &&... args)']]], + ['thread_4',['thread',['../structmce_1_1_thread_manager_1_1_thread_info.html#aadf689cbdeea6113d039d8cad5c72591',1,'mce::ThreadManager::ThreadInfo']]], + ['thread_2ehpp_5',['Thread.hpp',['../_thread_8hpp.html',1,'']]], + ['threadfinished_6',['ThreadFinished',['../structmce_1_1event_1_1_thread_finished.html',1,'mce::event']]], + ['threadfunc_7',['ThreadFunc',['../structmce_1_1_thread_func.html',1,'mce']]], + ['threadfunctor_8',['ThreadFunctor',['../structmce_1_1_thread_functor.html',1,'mce::ThreadFunctor< F >'],['../structmce_1_1_thread_functor.html#adf20b2d25c1d267d6201abc5ee019112',1,'mce::ThreadFunctor::ThreadFunctor()']]], + ['threadimpl_9',['ThreadImpl',['../classmce_1_1_thread_impl.html',1,'mce::ThreadImpl'],['../classmce_1_1_thread_impl.html#a671887ec3998eab1d2f0262a85a3b087',1,'mce::ThreadImpl::ThreadImpl()']]], + ['threadimpl_2ehpp_10',['ThreadImpl.hpp',['../_thread_impl_8hpp.html',1,'']]], + ['threadinfo_11',['ThreadInfo',['../structmce_1_1_thread_manager_1_1_thread_info.html',1,'mce::ThreadManager']]], + ['threadmanager_12',['ThreadManager',['../classmce_1_1_thread_manager.html',1,'mce::ThreadManager'],['../classmce_1_1_thread_manager.html#a44af86c56b28fdcb5aeadfee871d3773',1,'mce::ThreadManager::ThreadManager()']]], + ['threadmanager_2ehpp_13',['ThreadManager.hpp',['../_thread_manager_8hpp.html',1,'']]], + ['threadmemberfunctor_14',['ThreadMemberFunctor',['../structmce_1_1_thread_member_functor.html',1,'mce::ThreadMemberFunctor< C >'],['../structmce_1_1_thread_member_functor.html#a1dc618e61e73f82c5898e873e486e480',1,'mce::ThreadMemberFunctor::ThreadMemberFunctor()']]], + ['threadmemberfunctorwithargs_15',['ThreadMemberFunctorWithArgs',['../structmce_1_1_thread_member_functor_with_args.html',1,'mce::ThreadMemberFunctorWithArgs< C, Args >'],['../structmce_1_1_thread_member_functor_with_args.html#ad7b3374d69d6e0a3c606a299c47ccdf4',1,'mce::ThreadMemberFunctorWithArgs::ThreadMemberFunctorWithArgs()']]], + ['threadstarted_16',['ThreadStarted',['../structmce_1_1event_1_1_thread_started.html',1,'mce::event']]], + ['todo_20list_17',['Todo List',['../todo.html',1,'']]] +]; diff --git a/doc/html/search/all_12.js b/doc/html/search/all_12.js new file mode 100644 index 0000000..6a43e31 --- /dev/null +++ b/doc/html/search/all_12.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['unsubscribe_0',['unsubscribe',['../structmce_1_1_subscription_token.html#aa7c3dce6c3a9d70bcb5eef10e9d6a712',1,'mce::SubscriptionToken']]], + ['usestreaminput_1',['useStreamInput',['../structmce_1_1_virtual_file_system_1_1_config.html#ae4bb57adc6625136aa75f6e94fe18307',1,'mce::VirtualFileSystem::Config']]] +]; diff --git a/doc/html/search/all_13.js b/doc/html/search/all_13.js new file mode 100644 index 0000000..31ce0f3 --- /dev/null +++ b/doc/html/search/all_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['version_0',['Version',['../unionmce_1_1_virtual_file_system_1_1_version.html',1,'mce::VirtualFileSystem']]], + ['version_1',['version',['../structmce_1_1_virtual_file_system_1_1_config.html#a7194f22656273211636586825f301573',1,'mce::VirtualFileSystem::Config']]], + ['virtualfilesystem_2',['VirtualFileSystem',['../classmce_1_1_virtual_file_system.html',1,'mce']]] +]; diff --git a/doc/html/search/all_14.js b/doc/html/search/all_14.js new file mode 100644 index 0000000..8a5f78d --- /dev/null +++ b/doc/html/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['wait_0',['wait',['../classmce_1_1_thread.html#a7167ced2613ce6e9e3ae0ee942277c87',1,'mce::Thread::wait()'],['../classmce_1_1_thread_impl.html#a2608abc24e2f18be8e25eb3a4265cdda',1,'mce::ThreadImpl::wait()']]], + ['waitall_1',['waitAll',['../classmce_1_1_thread_manager.html#a7b58969244f296e97a21656b563cf231',1,'mce::ThreadManager']]], + ['world_5ffile_2',['WORLD_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726ad7dc87fe0ad41cd2d441e509c81ea486',1,'mce::VirtualFileSystem']]], + ['write_3',['write',['../classmce_1_1_file_output_stream.html#ac6e82fc9655a7a1dfd3d981519f18583',1,'mce::FileOutputStream::write()'],['../classmce_1_1_output_stream.html#a549f1ca23e39341f9a3cc23927644d81',1,'mce::OutputStream::write()']]] +]; diff --git a/doc/html/search/all_15.js b/doc/html/search/all_15.js new file mode 100644 index 0000000..cc085c2 --- /dev/null +++ b/doc/html/search/all_15.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['_7eqeventbus_0',['~QEventBus',['../classmce_1_1_q_event_bus.html#a030f589e472aa12873a6302677878d67',1,'mce::QEventBus']]], + ['_7esubscriptiontoken_1',['~SubscriptionToken',['../structmce_1_1_subscription_token.html#ae8014c0fd7075e841b2b62762e51fba2',1,'mce::SubscriptionToken']]], + ['_7ethread_2',['~Thread',['../classmce_1_1_thread.html#ad53fb135e59203bea7469f8ec3bde46b',1,'mce::Thread']]], + ['_7ethreadfunc_3',['~ThreadFunc',['../structmce_1_1_thread_func.html#a326effacbebaefebd61fd3b57a480d39',1,'mce::ThreadFunc']]], + ['_7ethreadmanager_4',['~ThreadManager',['../classmce_1_1_thread_manager.html#a10b8efbe312127af02418c3942b0e7b6',1,'mce::ThreadManager']]] +]; diff --git a/doc/html/search/all_16.js b/doc/html/search/all_16.js new file mode 100644 index 0000000..db367fe --- /dev/null +++ b/doc/html/search/all_16.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['wait_0',['wait',['../classmce_1_1_thread.html#a7167ced2613ce6e9e3ae0ee942277c87',1,'mce::Thread::wait()'],['../classmce_1_1_thread_impl.html#a2608abc24e2f18be8e25eb3a4265cdda',1,'mce::ThreadImpl::wait()']]], + ['waitall_1',['waitAll',['../classmce_1_1_thread_manager.html#a7b58969244f296e97a21656b563cf231',1,'mce::ThreadManager']]], + ['what_2',['what',['../classdetail_1_1exception.html#ae75d7315f5f2d85958da6d961375caf0',1,'detail::exception']]], + ['wide_5fstring_5finput_5fadapter_3',['wide_string_input_adapter',['../classdetail_1_1wide__string__input__adapter.html',1,'detail']]], + ['wide_5fstring_5finput_5fadapter_3c_20base_5fadapter_5ftype_2c_20char_5ftype_20_3e_4',['wide_string_input_adapter< base_adapter_type, char_type >',['../classdetail_1_1wide__string__input__adapter.html',1,'detail']]], + ['wide_5fstring_5finput_5fhelper_5',['wide_string_input_helper',['../structdetail_1_1wide__string__input__helper.html',1,'detail']]], + ['wide_5fstring_5finput_5fhelper_3c_20baseinputadapter_2c_202_20_3e_6',['wide_string_input_helper< BaseInputAdapter, 2 >',['../structdetail_1_1wide__string__input__helper_3_01_base_input_adapter_00_012_01_4.html',1,'detail']]], + ['wide_5fstring_5finput_5fhelper_3c_20baseinputadapter_2c_204_20_3e_7',['wide_string_input_helper< BaseInputAdapter, 4 >',['../structdetail_1_1wide__string__input__helper_3_01_base_input_adapter_00_014_01_4.html',1,'detail']]], + ['world_5ffile_8',['WORLD_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726ad7dc87fe0ad41cd2d441e509c81ea486',1,'mce::VirtualFileSystem']]], + ['write_9',['write',['../classmce_1_1_file_output_stream.html#ac6e82fc9655a7a1dfd3d981519f18583',1,'mce::FileOutputStream::write()'],['../classmce_1_1_output_stream.html#a549f1ca23e39341f9a3cc23927644d81',1,'mce::OutputStream::write()']]], + ['write_5fbson_10',['write_bson',['../classdetail_1_1binary__writer.html#a1aae361b7492825979cbb80245b9c0d6',1,'detail::binary_writer']]], + ['write_5fcbor_11',['write_cbor',['../classdetail_1_1binary__writer.html#ae6ab36b61e8ad346e75d9f9abc983d4c',1,'detail::binary_writer']]], + ['write_5fmsgpack_12',['write_msgpack',['../classdetail_1_1binary__writer.html#adc3dbefa80134d3530a1b3f1c9629586',1,'detail::binary_writer']]], + ['write_5fubjson_13',['write_ubjson',['../classdetail_1_1binary__writer.html#a377616a7e3ca05a134a4cbbed79e3db8',1,'detail::binary_writer']]] +]; diff --git a/doc/html/search/all_17.js b/doc/html/search/all_17.js new file mode 100644 index 0000000..cc085c2 --- /dev/null +++ b/doc/html/search/all_17.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['_7eqeventbus_0',['~QEventBus',['../classmce_1_1_q_event_bus.html#a030f589e472aa12873a6302677878d67',1,'mce::QEventBus']]], + ['_7esubscriptiontoken_1',['~SubscriptionToken',['../structmce_1_1_subscription_token.html#ae8014c0fd7075e841b2b62762e51fba2',1,'mce::SubscriptionToken']]], + ['_7ethread_2',['~Thread',['../classmce_1_1_thread.html#ad53fb135e59203bea7469f8ec3bde46b',1,'mce::Thread']]], + ['_7ethreadfunc_3',['~ThreadFunc',['../structmce_1_1_thread_func.html#a326effacbebaefebd61fd3b57a480d39',1,'mce::ThreadFunc']]], + ['_7ethreadmanager_4',['~ThreadManager',['../classmce_1_1_thread_manager.html#a10b8efbe312127af02418c3942b0e7b6',1,'mce::ThreadManager']]] +]; diff --git a/doc/html/search/all_2.js b/doc/html/search/all_2.js new file mode 100644 index 0000000..2a2acb5 --- /dev/null +++ b/doc/html/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['callback_0',['Callback',['../classmce_1_1_coroutine_scheduler.html#acd70e48944e7dadad6ec0514f587432a',1,'mce::CoroutineScheduler']]], + ['callback_1',['callback',['../structmce_1_1_coroutine_scheduler_1_1_task.html#a883f91e465a098322335417c86e308ff',1,'mce::CoroutineScheduler::Task']]], + ['callfunction_2',['callFunction',['../classmce_1_1_function_container.html#a302e97f87b554bbaac24ca5d7f884385',1,'mce::FunctionContainer']]], + ['cleanupfinished_3',['cleanupFinished',['../classmce_1_1_thread_manager.html#a72319f5b2505aa6e0fe75cfdc1231032',1,'mce::ThreadManager']]], + ['clock_4',['clock',['../structmce_1_1_coroutine_scheduler_1_1_task.html#a368f3214e4561e84b6a4cc091409b770',1,'mce::CoroutineScheduler::Task']]], + ['close_5',['close',['../classmce_1_1_file_input_stream.html#abe975adc14ec46da5085aa396bf6bb17',1,'mce::FileInputStream::close()'],['../classmce_1_1_file_output_stream.html#a695bf4b8e186fcd40a666487e4e4b8f1',1,'mce::FileOutputStream::close()']]], + ['config_6',['Config',['../structmce_1_1_virtual_file_system_1_1_config.html',1,'mce::VirtualFileSystem']]], + ['coroutinescheduler_7',['CoroutineScheduler',['../classmce_1_1_coroutine_scheduler.html',1,'mce::CoroutineScheduler'],['../classmce_1_1_coroutine_scheduler.html#a08b0a86a4940c34b5db26acefa3e316c',1,'mce::CoroutineScheduler::CoroutineScheduler()']]], + ['coroutinescheduler_2ehpp_8',['CoroutineScheduler.hpp',['../_coroutine_scheduler_8hpp.html',1,'']]], + ['createthread_9',['createThread',['../classmce_1_1_thread_manager.html#a3cfaaa1edb1dd0ded4a99553972cd93c',1,'mce::ThreadManager::createThread(const eastl::string &name, F func)'],['../classmce_1_1_thread_manager.html#a07cbeefe7d5b5d4845e0b2f1e59fef21',1,'mce::ThreadManager::createThread(const eastl::string &name, void(C::*func)(), C *object)']]] +]; diff --git a/doc/html/search/all_3.js b/doc/html/search/all_3.js new file mode 100644 index 0000000..4d85845 --- /dev/null +++ b/doc/html/search/all_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['deprecated_20list_0',['Deprecated List',['../deprecated.html',1,'']]] +]; diff --git a/doc/html/search/all_4.js b/doc/html/search/all_4.js new file mode 100644 index 0000000..ac8119c --- /dev/null +++ b/doc/html/search/all_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['example_20group_0',['Example Group',['../group___example_group.html',1,'']]], + ['example_2ehpp_1',['example.hpp',['../example_8hpp.html',1,'']]], + ['exampleclass_2',['ExampleClass',['../class_example_class.html',1,'']]] +]; diff --git a/doc/html/search/all_5.js b/doc/html/search/all_5.js new file mode 100644 index 0000000..664a8fd --- /dev/null +++ b/doc/html/search/all_5.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['filebinarytype_0',['FileBinaryType',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726',1,'mce::VirtualFileSystem']]], + ['fileinputstream_1',['FileInputStream',['../classmce_1_1_file_input_stream.html',1,'mce']]], + ['fileoutputstream_2',['FileOutputStream',['../classmce_1_1_file_output_stream.html',1,'mce::FileOutputStream'],['../classmce_1_1_file_output_stream.html#a0ab5f8d7e010b94a072bc13b52e5dd1c',1,'mce::FileOutputStream::FileOutputStream()']]], + ['filesink_3',['FileSink',['../classmce_1_1_file_sink.html',1,'mce']]], + ['filetype_4',['fileType',['../structmce_1_1_virtual_file_system_1_1_config.html#a68337b00a6b442330be53200de7c8253',1,'mce::VirtualFileSystem::Config']]], + ['findfunction_5',['findFunction',['../classmce_1_1_function_container.html#aeb8c83b9b780a1990007da8e8e5f3133',1,'mce::FunctionContainer']]], + ['finished_6',['finished',['../structmce_1_1_thread_manager_1_1_thread_info.html#a5eef90a23c053aa432cd9b0e6f776676',1,'mce::ThreadManager::ThreadInfo']]], + ['functioncontainer_7',['FunctionContainer',['../classmce_1_1_function_container.html',1,'mce::FunctionContainer'],['../classmce_1_1_function_container.html#ad88b85713ffa87b60972a43be7da9517',1,'mce::FunctionContainer::FunctionContainer()=default'],['../classmce_1_1_function_container.html#a56021097f6d60531a37b7c6158b88ec7',1,'mce::FunctionContainer::FunctionContainer(QEventBus &qBus, std::initializer_list< std::pair< eastl::string, eastl::any > > initlist)']]], + ['functor_8',['functor',['../structmce_1_1_thread_functor.html#a9146327d84308e61f348693894cc4345',1,'mce::ThreadFunctor::functor'],['../structmce_1_1_thread_member_functor.html#a3720c4df81fb32687f5b836232b7f044',1,'mce::ThreadMemberFunctor::functor'],['../structmce_1_1_thread_member_functor_with_args.html#a437472525ce47993742f5063277aa3c5',1,'mce::ThreadMemberFunctorWithArgs::functor']]] +]; diff --git a/doc/html/search/all_6.js b/doc/html/search/all_6.js new file mode 100644 index 0000000..73f6cc8 --- /dev/null +++ b/doc/html/search/all_6.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['getconfig_0',['getConfig',['../classmce_1_1_virtual_file_system.html#af593de4f0ffc1a84a66ed160cbc26fe2',1,'mce::VirtualFileSystem']]], + ['getfile_1',['getFile',['../classmce_1_1_virtual_file_system.html#a8f65e6706de32cdbe5c68f6e7053222a',1,'mce::VirtualFileSystem']]], + ['getfunction_2',['getFunction',['../classmce_1_1_function_container.html#a3d754d6d89dc40e1bb7c178941687b16',1,'mce::FunctionContainer']]], + ['getsize_3',['getSize',['../classmce_1_1_file_input_stream.html#a271ddb30e8c58bbb759c03a6970277e1',1,'mce::FileInputStream::getSize()'],['../classmce_1_1_file_output_stream.html#a4160ad51b9d0d867e45bba2a3a4d30db',1,'mce::FileOutputStream::getSize()'],['../classmce_1_1_input_stream.html#a661d85973a2683a217252c36f47da682',1,'mce::InputStream::getSize()'],['../classmce_1_1_memory_input_stream.html#a220e82b4a2096923f91b02058a354c1a',1,'mce::MemoryInputStream::getSize()'],['../classmce_1_1_output_stream.html#a4b19dae8e434c51a7d79058994c035c7',1,'mce::OutputStream::getSize()']]], + ['glgraphicscontext_4',['GLGraphicsContext',['../classmce_1_1_g_l_graphics_context.html',1,'mce']]], + ['glrenderer_5',['GLRenderer',['../classmce_1_1_g_l_renderer.html',1,'mce']]], + ['graphicscontext_6',['GraphicsContext',['../classmce_1_1_graphics_context.html',1,'mce']]], + ['group_7',['Example Group',['../group___example_group.html',1,'']]] +]; diff --git a/doc/html/search/all_7.js b/doc/html/search/all_7.js new file mode 100644 index 0000000..c2c4a77 --- /dev/null +++ b/doc/html/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handler_0',['Handler',['../classmce_1_1_q_event_bus.html#a7f5a80e3f10f95ab433dd04942778e5b',1,'mce::QEventBus']]] +]; diff --git a/doc/html/search/all_8.js b/doc/html/search/all_8.js new file mode 100644 index 0000000..a0ed463 --- /dev/null +++ b/doc/html/search/all_8.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ievent_0',['IEvent',['../structmce_1_1_i_event.html',1,'mce']]], + ['inputstream_1',['InputStream',['../classmce_1_1_input_stream.html',1,'mce']]], + ['interval_2',['interval',['../structmce_1_1_coroutine_scheduler_1_1_task.html#aac988d329eb108a812656b26fe6a445c',1,'mce::CoroutineScheduler::Task']]], + ['invalid_5ffile_5fposition_3',['INVALID_FILE_POSITION',['../classmce_1_1_file_output_stream.html#a9f7a39df922d54da6c8cfaa279efa5e3',1,'mce::FileOutputStream']]], + ['invalid_5ffile_5fsize_4',['INVALID_FILE_SIZE',['../classmce_1_1_file_output_stream.html#a107dc72b1bc3c42eba3700f7b8533012',1,'mce::FileOutputStream']]], + ['isopen_5',['isOpen',['../classmce_1_1_file_input_stream.html#a26a715bb8bb53cb3cb1b1de6059af07a',1,'mce::FileInputStream::isOpen()'],['../classmce_1_1_file_output_stream.html#ae17a2bca1876c50cb5725b41551dd43b',1,'mce::FileOutputStream::isOpen()']]] +]; diff --git a/doc/html/search/all_9.js b/doc/html/search/all_9.js new file mode 100644 index 0000000..c0e3592 --- /dev/null +++ b/doc/html/search/all_9.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['launch_0',['launch',['../classmce_1_1_thread.html#a6857a0007eb44e985a11b76e8b2ab81d',1,'mce::Thread::launch()'],['../classmce_1_1_thread_manager.html#ab500bf731fff307e4e7a06928b865167',1,'mce::ThreadManager::launch(Thread *th)'],['../classmce_1_1_thread_manager.html#ad5e09cdd0695f8587b041a618284b018',1,'mce::ThreadManager::launch(const eastl::string &name)']]], + ['list_1',['List',['../bug.html',1,'Bug List'],['../deprecated.html',1,'Deprecated List'],['../todo.html',1,'Todo List']]], + ['loadfile_2',['loadFile',['../classmce_1_1_virtual_file_system.html#ae5c0d15aed23eb8651abcce2190fb7ac',1,'mce::VirtualFileSystem']]], + ['logger_3',['Logger',['../classmce_1_1_logger.html',1,'mce']]], + ['loggeroutput_4',['LoggerOutput',['../structmce_1_1event_1_1_logger_output.html',1,'mce::event']]], + ['loggersink_5',['LoggerSink',['../classmce_1_1_logger_sink.html',1,'mce']]] +]; diff --git a/doc/html/search/all_a.js b/doc/html/search/all_a.js new file mode 100644 index 0000000..0a32b8f --- /dev/null +++ b/doc/html/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['makeversion_0',['makeVersion',['../unionmce_1_1_virtual_file_system_1_1_version.html#a7674f5a1656039e67890095b1a2d9458',1,'mce::VirtualFileSystem::Version']]], + ['memoryinputstream_1',['MemoryInputStream',['../classmce_1_1_memory_input_stream.html',1,'mce::MemoryInputStream'],['../classmce_1_1_memory_input_stream.html#a6f8edd8bbe3b0fe735cce8f43f2a41b4',1,'mce::MemoryInputStream::MemoryInputStream()']]] +]; diff --git a/doc/html/search/all_b.js b/doc/html/search/all_b.js new file mode 100644 index 0000000..325b900 --- /dev/null +++ b/doc/html/search/all_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['name_0',['name',['../structmce_1_1_thread_manager_1_1_thread_info.html#aee473db051066cd05bbc9225a7238982',1,'mce::ThreadManager::ThreadInfo']]], + ['none_1',['NONE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726af4117d29bc8623330732b880e03c422b',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/all_c.js b/doc/html/search/all_c.js new file mode 100644 index 0000000..588d409 --- /dev/null +++ b/doc/html/search/all_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['object_0',['object',['../structmce_1_1_thread_member_functor.html#a6cf5ef7fac6e9cca36187edc9e52c6c6',1,'mce::ThreadMemberFunctor::object'],['../structmce_1_1_thread_member_functor_with_args.html#a5719012094127c1e0808b71f3b668038',1,'mce::ThreadMemberFunctorWithArgs::object']]], + ['open_1',['open',['../classmce_1_1_file_input_stream.html#a3eb6e463ae37bd285915c3b41fd5f53e',1,'mce::FileInputStream::open()'],['../classmce_1_1_file_output_stream.html#acc1a4e675eba02a8dad17a6acd1d4265',1,'mce::FileOutputStream::open()']]], + ['operator_5b_5d_2',['operator[]',['../classmce_1_1_function_container.html#ab0271b06ab337b65ae2a4ac79c80c55c',1,'mce::FunctionContainer']]], + ['outputstream_3',['OutputStream',['../classmce_1_1_output_stream.html',1,'mce']]] +]; diff --git a/doc/html/search/all_d.js b/doc/html/search/all_d.js new file mode 100644 index 0000000..be2d2b5 --- /dev/null +++ b/doc/html/search/all_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['patch_0',['patch',['../unionmce_1_1_virtual_file_system_1_1_version.html#a3fb983d2e7943c95d54d1fbcd5ecd5d3',1,'mce::VirtualFileSystem::Version']]], + ['post_1',['post',['../classmce_1_1_q_event_bus.html#a13302d26ca2e8b91e075e5430ea9ce97',1,'mce::QEventBus']]], + ['printstats_2',['printStats',['../classmce_1_1_thread_manager.html#a0739a1906bf371bf8a729ab0d0ce4929',1,'mce::ThreadManager']]], + ['process_3',['process',['../classmce_1_1_q_event_bus.html#a37196ad021d476479362bfe51ffc1b59',1,'mce::QEventBus']]], + ['processtasks_4',['processTasks',['../classmce_1_1_coroutine_scheduler.html#a172c9650e9b298a3e2e03ff0e9571dfb',1,'mce::CoroutineScheduler']]] +]; diff --git a/doc/html/search/all_e.js b/doc/html/search/all_e.js new file mode 100644 index 0000000..29a4163 --- /dev/null +++ b/doc/html/search/all_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['qeventbus_0',['QEventBus',['../classmce_1_1_q_event_bus.html',1,'mce']]], + ['qeventbus_2ehpp_1',['QEventBus.hpp',['../_q_event_bus_8hpp.html',1,'']]], + ['quad_2',['quad',['../unionmce_1_1_virtual_file_system_1_1_version.html#a9738beeedb1f5be4ab8108f658c70414',1,'mce::VirtualFileSystem::Version']]] +]; diff --git a/doc/html/search/all_f.js b/doc/html/search/all_f.js new file mode 100644 index 0000000..f9fab06 --- /dev/null +++ b/doc/html/search/all_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['read_0',['read',['../classmce_1_1_file_input_stream.html#a6bf0dffd4568ef1638aed7aafa2ecd00',1,'mce::FileInputStream::read()'],['../classmce_1_1_input_stream.html#a548e3aeadfb9222019bcb59a39848d9e',1,'mce::InputStream::read()'],['../classmce_1_1_memory_input_stream.html#a11da8b6c2f59d0a5987bf06b93245bb1',1,'mce::MemoryInputStream::read(void *buffer, size_t size) override']]], + ['readstring_1',['readString',['../classmce_1_1_memory_input_stream.html#ac3771e7c4a9f8bb4a6e10581683fb97b',1,'mce::MemoryInputStream']]], + ['renderer_2',['Renderer',['../classmce_1_1_renderer.html',1,'mce']]], + ['run_3',['run',['../structmce_1_1_thread_func.html#a845789c58b4cd7e73c7a99d15c2337f6',1,'mce::ThreadFunc::run()'],['../structmce_1_1_thread_functor.html#a15516d7b0dbda4d412ffdbea0eb2bc30',1,'mce::ThreadFunctor::run()'],['../structmce_1_1_thread_member_functor.html#a53486e3258e69a89e50a62e47ab3edfd',1,'mce::ThreadMemberFunctor::run()'],['../structmce_1_1_thread_member_functor_with_args.html#aff17a973bcfacc0ee487458c0ca5f228',1,'mce::ThreadMemberFunctorWithArgs::run()']]], + ['runasync_4',['runAsync',['../classmce_1_1_q_event_bus.html#a292b5d677b6dc2b483339e5ff6fc8497',1,'mce::QEventBus']]] +]; diff --git a/doc/html/search/classes_0.js b/doc/html/search/classes_0.js new file mode 100644 index 0000000..056f0ed --- /dev/null +++ b/doc/html/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['config_0',['Config',['../structmce_1_1_virtual_file_system_1_1_config.html',1,'mce::VirtualFileSystem']]], + ['coroutinescheduler_1',['CoroutineScheduler',['../classmce_1_1_coroutine_scheduler.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_1.js b/doc/html/search/classes_1.js new file mode 100644 index 0000000..5af86e7 --- /dev/null +++ b/doc/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exampleclass_0',['ExampleClass',['../class_example_class.html',1,'']]] +]; diff --git a/doc/html/search/classes_10.js b/doc/html/search/classes_10.js new file mode 100644 index 0000000..2f460d5 --- /dev/null +++ b/doc/html/search/classes_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['renderer_0',['Renderer',['../classmce_1_1_renderer.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_11.js b/doc/html/search/classes_11.js new file mode 100644 index 0000000..1b242d2 --- /dev/null +++ b/doc/html/search/classes_11.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['serializer_0',['serializer',['../classdetail_1_1serializer.html',1,'detail']]], + ['span_5finput_5fadapter_1',['span_input_adapter',['../classdetail_1_1span__input__adapter.html',1,'detail']]], + ['static_5fconst_2',['static_const',['../structdetail_1_1static__const.html',1,'detail']]], + ['stdoutsink_3',['StdoutSink',['../classmce_1_1_stdout_sink.html',1,'mce']]], + ['string_5ft_5fhelper_4',['string_t_helper',['../structstring__t__helper.html',1,'']]], + ['string_5ft_5fhelper_3c_20nlohmann_5fbasic_5fjson_5ftpl_20_3e_5',['string_t_helper< NLOHMANN_BASIC_JSON_TPL >',['../structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.html',1,'']]], + ['subscriptiontoken_6',['SubscriptionToken',['../structmce_1_1_subscription_token.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_12.js b/doc/html/search/classes_12.js new file mode 100644 index 0000000..74c1fd9 --- /dev/null +++ b/doc/html/search/classes_12.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['task_0',['Task',['../structmce_1_1_coroutine_scheduler_1_1_task.html',1,'mce::CoroutineScheduler']]], + ['thread_1',['Thread',['../classmce_1_1_thread.html',1,'mce']]], + ['threadfinished_2',['ThreadFinished',['../structmce_1_1event_1_1_thread_finished.html',1,'mce::event']]], + ['threadfunc_3',['ThreadFunc',['../structmce_1_1_thread_func.html',1,'mce']]], + ['threadfunctor_4',['ThreadFunctor',['../structmce_1_1_thread_functor.html',1,'mce']]], + ['threadimpl_5',['ThreadImpl',['../classmce_1_1_thread_impl.html',1,'mce']]], + ['threadinfo_6',['ThreadInfo',['../structmce_1_1_thread_manager_1_1_thread_info.html',1,'mce::ThreadManager']]], + ['threadmanager_7',['ThreadManager',['../classmce_1_1_thread_manager.html',1,'mce']]], + ['threadmemberfunctor_8',['ThreadMemberFunctor',['../structmce_1_1_thread_member_functor.html',1,'mce']]], + ['threadmemberfunctorwithargs_9',['ThreadMemberFunctorWithArgs',['../structmce_1_1_thread_member_functor_with_args.html',1,'mce']]], + ['threadstarted_10',['ThreadStarted',['../structmce_1_1event_1_1_thread_started.html',1,'mce::event']]], + ['to_5fjson_5ffn_11',['to_json_fn',['../structdetail_1_1to__json__fn.html',1,'detail']]], + ['tuple_5felement_3c_20n_2c_20_3a_3anlohmann_3a_3adetail_3a_3aiteration_5fproxy_5fvalue_3c_20iteratortype_20_3e_20_3e_12',['tuple_element< N, ::nlohmann::detail::iteration_proxy_value< IteratorType > >',['../classstd_1_1tuple__element_3_01_n_00_01_1_1nlohmann_1_1detail_1_1iteration__proxy__value_3_01_iterator_type_01_4_01_4.html',1,'std']]], + ['tuple_5fsize_3c_3a_3anlohmann_3a_3adetail_3a_3aiteration_5fproxy_5fvalue_3c_20iteratortype_20_3e_20_3e_13',['tuple_size<::nlohmann::detail::iteration_proxy_value< IteratorType > >',['../classstd_1_1tuple__size_3_1_1nlohmann_1_1detail_1_1iteration__proxy__value_3_01_iterator_type_01_4_01_4.html',1,'std']]], + ['two_14',['two',['../structdetail_1_1is__ordered__map_1_1two.html',1,'detail::is_ordered_map']]], + ['type_5ferror_15',['type_error',['../classdetail_1_1type__error.html',1,'detail']]] +]; diff --git a/doc/html/search/classes_13.js b/doc/html/search/classes_13.js new file mode 100644 index 0000000..6ee0297 --- /dev/null +++ b/doc/html/search/classes_13.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['value_5fin_5frange_5fof_5fimpl1_0',['value_in_range_of_impl1',['../structdetail_1_1value__in__range__of__impl1.html',1,'detail']]], + ['value_5fin_5frange_5fof_5fimpl1_3c_20oftype_2c_20t_2c_20false_20_3e_1',['value_in_range_of_impl1< OfType, T, false >',['../structdetail_1_1value__in__range__of__impl1_3_01_of_type_00_01_t_00_01false_01_4.html',1,'detail']]], + ['value_5fin_5frange_5fof_5fimpl1_3c_20oftype_2c_20t_2c_20true_20_3e_2',['value_in_range_of_impl1< OfType, T, true >',['../structdetail_1_1value__in__range__of__impl1_3_01_of_type_00_01_t_00_01true_01_4.html',1,'detail']]], + ['value_5fin_5frange_5fof_5fimpl2_3',['value_in_range_of_impl2',['../structdetail_1_1value__in__range__of__impl2.html',1,'detail']]], + ['value_5fin_5frange_5fof_5fimpl2_3c_20oftype_2c_20t_2c_20false_2c_20false_20_3e_4',['value_in_range_of_impl2< OfType, T, false, false >',['../structdetail_1_1value__in__range__of__impl2_3_01_of_type_00_01_t_00_01false_00_01false_01_4.html',1,'detail']]], + ['value_5fin_5frange_5fof_5fimpl2_3c_20oftype_2c_20t_2c_20false_2c_20true_20_3e_5',['value_in_range_of_impl2< OfType, T, false, true >',['../structdetail_1_1value__in__range__of__impl2_3_01_of_type_00_01_t_00_01false_00_01true_01_4.html',1,'detail']]], + ['value_5fin_5frange_5fof_5fimpl2_3c_20oftype_2c_20t_2c_20true_2c_20false_20_3e_6',['value_in_range_of_impl2< OfType, T, true, false >',['../structdetail_1_1value__in__range__of__impl2_3_01_of_type_00_01_t_00_01true_00_01false_01_4.html',1,'detail']]], + ['value_5fin_5frange_5fof_5fimpl2_3c_20oftype_2c_20t_2c_20true_2c_20true_20_3e_7',['value_in_range_of_impl2< OfType, T, true, true >',['../structdetail_1_1value__in__range__of__impl2_3_01_of_type_00_01_t_00_01true_00_01true_01_4.html',1,'detail']]], + ['version_8',['Version',['../unionmce_1_1_virtual_file_system_1_1_version.html',1,'mce::VirtualFileSystem']]], + ['virtualfilesystem_9',['VirtualFileSystem',['../classmce_1_1_virtual_file_system.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_14.js b/doc/html/search/classes_14.js new file mode 100644 index 0000000..ea0dcdf --- /dev/null +++ b/doc/html/search/classes_14.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['wide_5fstring_5finput_5fadapter_0',['wide_string_input_adapter',['../classdetail_1_1wide__string__input__adapter.html',1,'detail']]], + ['wide_5fstring_5finput_5fadapter_3c_20base_5fadapter_5ftype_2c_20char_5ftype_20_3e_1',['wide_string_input_adapter< base_adapter_type, char_type >',['../classdetail_1_1wide__string__input__adapter.html',1,'detail']]], + ['wide_5fstring_5finput_5fhelper_2',['wide_string_input_helper',['../structdetail_1_1wide__string__input__helper.html',1,'detail']]], + ['wide_5fstring_5finput_5fhelper_3c_20baseinputadapter_2c_202_20_3e_3',['wide_string_input_helper< BaseInputAdapter, 2 >',['../structdetail_1_1wide__string__input__helper_3_01_base_input_adapter_00_012_01_4.html',1,'detail']]], + ['wide_5fstring_5finput_5fhelper_3c_20baseinputadapter_2c_204_20_3e_4',['wide_string_input_helper< BaseInputAdapter, 4 >',['../structdetail_1_1wide__string__input__helper_3_01_base_input_adapter_00_014_01_4.html',1,'detail']]] +]; diff --git a/doc/html/search/classes_2.js b/doc/html/search/classes_2.js new file mode 100644 index 0000000..e21658f --- /dev/null +++ b/doc/html/search/classes_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['fileinputstream_0',['FileInputStream',['../classmce_1_1_file_input_stream.html',1,'mce']]], + ['fileoutputstream_1',['FileOutputStream',['../classmce_1_1_file_output_stream.html',1,'mce']]], + ['filesink_2',['FileSink',['../classmce_1_1_file_sink.html',1,'mce']]], + ['functioncontainer_3',['FunctionContainer',['../classmce_1_1_function_container.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_3.js b/doc/html/search/classes_3.js new file mode 100644 index 0000000..af02804 --- /dev/null +++ b/doc/html/search/classes_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['glgraphicscontext_0',['GLGraphicsContext',['../classmce_1_1_g_l_graphics_context.html',1,'mce']]], + ['glrenderer_1',['GLRenderer',['../classmce_1_1_g_l_renderer.html',1,'mce']]], + ['graphicscontext_2',['GraphicsContext',['../classmce_1_1_graphics_context.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_4.js b/doc/html/search/classes_4.js new file mode 100644 index 0000000..89590f0 --- /dev/null +++ b/doc/html/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ievent_0',['IEvent',['../structmce_1_1_i_event.html',1,'mce']]], + ['inputstream_1',['InputStream',['../classmce_1_1_input_stream.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_5.js b/doc/html/search/classes_5.js new file mode 100644 index 0000000..6ba41a7 --- /dev/null +++ b/doc/html/search/classes_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['logger_0',['Logger',['../classmce_1_1_logger.html',1,'mce']]], + ['loggeroutput_1',['LoggerOutput',['../structmce_1_1event_1_1_logger_output.html',1,'mce::event']]], + ['loggersink_2',['LoggerSink',['../classmce_1_1_logger_sink.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_6.js b/doc/html/search/classes_6.js new file mode 100644 index 0000000..aa1a069 --- /dev/null +++ b/doc/html/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['memoryinputstream_0',['MemoryInputStream',['../classmce_1_1_memory_input_stream.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_7.js b/doc/html/search/classes_7.js new file mode 100644 index 0000000..a392dad --- /dev/null +++ b/doc/html/search/classes_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['outputstream_0',['OutputStream',['../classmce_1_1_output_stream.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_8.js b/doc/html/search/classes_8.js new file mode 100644 index 0000000..05ddd36 --- /dev/null +++ b/doc/html/search/classes_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['qeventbus_0',['QEventBus',['../classmce_1_1_q_event_bus.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_9.js b/doc/html/search/classes_9.js new file mode 100644 index 0000000..2f460d5 --- /dev/null +++ b/doc/html/search/classes_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['renderer_0',['Renderer',['../classmce_1_1_renderer.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_a.js b/doc/html/search/classes_a.js new file mode 100644 index 0000000..42c5fb7 --- /dev/null +++ b/doc/html/search/classes_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['stdoutsink_0',['StdoutSink',['../classmce_1_1_stdout_sink.html',1,'mce']]], + ['subscriptiontoken_1',['SubscriptionToken',['../structmce_1_1_subscription_token.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_b.js b/doc/html/search/classes_b.js new file mode 100644 index 0000000..f7bfcf5 --- /dev/null +++ b/doc/html/search/classes_b.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['task_0',['Task',['../structmce_1_1_coroutine_scheduler_1_1_task.html',1,'mce::CoroutineScheduler']]], + ['thread_1',['Thread',['../classmce_1_1_thread.html',1,'mce']]], + ['threadfinished_2',['ThreadFinished',['../structmce_1_1event_1_1_thread_finished.html',1,'mce::event']]], + ['threadfunc_3',['ThreadFunc',['../structmce_1_1_thread_func.html',1,'mce']]], + ['threadfunctor_4',['ThreadFunctor',['../structmce_1_1_thread_functor.html',1,'mce']]], + ['threadimpl_5',['ThreadImpl',['../classmce_1_1_thread_impl.html',1,'mce']]], + ['threadinfo_6',['ThreadInfo',['../structmce_1_1_thread_manager_1_1_thread_info.html',1,'mce::ThreadManager']]], + ['threadmanager_7',['ThreadManager',['../classmce_1_1_thread_manager.html',1,'mce']]], + ['threadmemberfunctor_8',['ThreadMemberFunctor',['../structmce_1_1_thread_member_functor.html',1,'mce']]], + ['threadmemberfunctorwithargs_9',['ThreadMemberFunctorWithArgs',['../structmce_1_1_thread_member_functor_with_args.html',1,'mce']]], + ['threadstarted_10',['ThreadStarted',['../structmce_1_1event_1_1_thread_started.html',1,'mce::event']]] +]; diff --git a/doc/html/search/classes_c.js b/doc/html/search/classes_c.js new file mode 100644 index 0000000..60c2923 --- /dev/null +++ b/doc/html/search/classes_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['version_0',['Version',['../unionmce_1_1_virtual_file_system_1_1_version.html',1,'mce::VirtualFileSystem']]], + ['virtualfilesystem_1',['VirtualFileSystem',['../classmce_1_1_virtual_file_system.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_d.js b/doc/html/search/classes_d.js new file mode 100644 index 0000000..f1e9cf9 --- /dev/null +++ b/doc/html/search/classes_d.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['ordered_5fmap_0',['ordered_map',['../structordered__map.html',1,'']]], + ['other_5ferror_1',['other_error',['../classdetail_1_1other__error.html',1,'detail']]], + ['out_5fof_5frange_2',['out_of_range',['../classdetail_1_1out__of__range.html',1,'detail']]], + ['output_5fadapter_3',['output_adapter',['../classdetail_1_1output__adapter.html',1,'detail']]], + ['output_5fadapter_5fprotocol_4',['output_adapter_protocol',['../structdetail_1_1output__adapter__protocol.html',1,'detail']]], + ['output_5fstream_5fadapter_5',['output_stream_adapter',['../classdetail_1_1output__stream__adapter.html',1,'detail']]], + ['output_5fstring_5fadapter_6',['output_string_adapter',['../classdetail_1_1output__string__adapter.html',1,'detail']]], + ['output_5fvector_5fadapter_7',['output_vector_adapter',['../classdetail_1_1output__vector__adapter.html',1,'detail']]], + ['outputstream_8',['OutputStream',['../classmce_1_1_output_stream.html',1,'mce']]] +]; diff --git a/doc/html/search/classes_e.js b/doc/html/search/classes_e.js new file mode 100644 index 0000000..1a516d2 --- /dev/null +++ b/doc/html/search/classes_e.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['parse_5ferror_0',['parse_error',['../classdetail_1_1parse__error.html',1,'detail']]], + ['parser_1',['parser',['../classdetail_1_1parser.html',1,'detail']]], + ['position_5ft_2',['position_t',['../structdetail_1_1position__t.html',1,'detail']]], + ['primitive_5fiterator_5ft_3',['primitive_iterator_t',['../classdetail_1_1primitive__iterator__t.html',1,'detail']]], + ['priority_5ftag_4',['priority_tag',['../structdetail_1_1priority__tag.html',1,'detail']]], + ['priority_5ftag_3c_200_20_3e_5',['priority_tag< 0 >',['../structdetail_1_1priority__tag_3_010_01_4.html',1,'detail']]] +]; diff --git a/doc/html/search/classes_f.js b/doc/html/search/classes_f.js new file mode 100644 index 0000000..05ddd36 --- /dev/null +++ b/doc/html/search/classes_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['qeventbus_0',['QEventBus',['../classmce_1_1_q_event_bus.html',1,'mce']]] +]; diff --git a/doc/html/search/enums_0.js b/doc/html/search/enums_0.js new file mode 100644 index 0000000..6d5187b --- /dev/null +++ b/doc/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['filebinarytype_0',['FileBinaryType',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/enums_1.js b/doc/html/search/enums_1.js new file mode 100644 index 0000000..745153f --- /dev/null +++ b/doc/html/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['error_5fhandler_5ft_0',['error_handler_t',['../namespacedetail.html#abe7cfa1fd8fa706ff4392bff9d1a8298',1,'detail']]] +]; diff --git a/doc/html/search/enums_2.js b/doc/html/search/enums_2.js new file mode 100644 index 0000000..6d5187b --- /dev/null +++ b/doc/html/search/enums_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['filebinarytype_0',['FileBinaryType',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/enums_3.js b/doc/html/search/enums_3.js new file mode 100644 index 0000000..86753d6 --- /dev/null +++ b/doc/html/search/enums_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['input_5fformat_5ft_0',['input_format_t',['../namespacedetail.html#a0ab3b338d0eadc6890b72cccef0ea04f',1,'detail']]] +]; diff --git a/doc/html/search/enums_4.js b/doc/html/search/enums_4.js new file mode 100644 index 0000000..59f0a5d --- /dev/null +++ b/doc/html/search/enums_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['token_5ftype_0',['token_type',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540',1,'detail::lexer_base']]] +]; diff --git a/doc/html/search/enums_5.js b/doc/html/search/enums_5.js new file mode 100644 index 0000000..a01d5a0 --- /dev/null +++ b/doc/html/search/enums_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['value_5ft_0',['value_t',['../namespacedetail.html#a917c3efabea8a20dc72d9ae2c673d632',1,'detail']]] +]; diff --git a/doc/html/search/enumvalues_0.js b/doc/html/search/enumvalues_0.js new file mode 100644 index 0000000..158be54 --- /dev/null +++ b/doc/html/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['assets_5ffile_0',['ASSETS_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a9f4b2e54fa9d67e203bf38f78d0ff067',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/enumvalues_1.js b/doc/html/search/enumvalues_1.js new file mode 100644 index 0000000..2b2d2a5 --- /dev/null +++ b/doc/html/search/enumvalues_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['none_0',['NONE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726af4117d29bc8623330732b880e03c422b',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/enumvalues_2.js b/doc/html/search/enumvalues_2.js new file mode 100644 index 0000000..a1367a3 --- /dev/null +++ b/doc/html/search/enumvalues_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['source_5ffile_0',['SOURCE_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a7c98cab84fc00353d5d242cfa5c257d4',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/enumvalues_3.js b/doc/html/search/enumvalues_3.js new file mode 100644 index 0000000..0a1059d --- /dev/null +++ b/doc/html/search/enumvalues_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['world_5ffile_0',['WORLD_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726ad7dc87fe0ad41cd2d441e509c81ea486',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/enumvalues_4.js b/doc/html/search/enumvalues_4.js new file mode 100644 index 0000000..6570e79 --- /dev/null +++ b/doc/html/search/enumvalues_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ignore_0',['ignore',['../namespacedetail.html#a7c070b2bf3d61e3d8b8013f6fb18d592a567bc1d268f135496de3d5b946b691f3',1,'detail::ignore'],['../namespacedetail.html#abe7cfa1fd8fa706ff4392bff9d1a8298a567bc1d268f135496de3d5b946b691f3',1,'detail::ignore']]] +]; diff --git a/doc/html/search/enumvalues_5.js b/doc/html/search/enumvalues_5.js new file mode 100644 index 0000000..6fd1be4 --- /dev/null +++ b/doc/html/search/enumvalues_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['literal_5ffalse_0',['literal_false',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540afab1694b1b3937a079f4625fe0b6108b',1,'detail::lexer_base']]], + ['literal_5fnull_1',['literal_null',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540ab7ae4c0e46d86f884677768160b26e9e',1,'detail::lexer_base']]], + ['literal_5for_5fvalue_2',['literal_or_value',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540ad2a8e6f6721cccec0b466301dd9495a5',1,'detail::lexer_base']]], + ['literal_5ftrue_3',['literal_true',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540a85cc1a37b0aaa52de40e72f0ed4e0c0d',1,'detail::lexer_base']]] +]; diff --git a/doc/html/search/enumvalues_6.js b/doc/html/search/enumvalues_6.js new file mode 100644 index 0000000..c792d65 --- /dev/null +++ b/doc/html/search/enumvalues_6.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['name_5fseparator_0',['name_separator',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540acc3c64f8ae08c00de1b33f19a4d2913a',1,'detail::lexer_base']]], + ['none_1',['NONE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726af4117d29bc8623330732b880e03c422b',1,'mce::VirtualFileSystem']]], + ['null_2',['null',['../namespacedetail.html#a917c3efabea8a20dc72d9ae2c673d632a37a6259cc0c1dae299a7866489dff0bd',1,'detail']]], + ['number_5ffloat_3',['number_float',['../namespacedetail.html#a917c3efabea8a20dc72d9ae2c673d632ad9966ecb59667235a57b4b999a649eef',1,'detail']]], + ['number_5finteger_4',['number_integer',['../namespacedetail.html#a917c3efabea8a20dc72d9ae2c673d632a5763da164f8659d94a56e29df64b4bcc',1,'detail']]], + ['number_5funsigned_5',['number_unsigned',['../namespacedetail.html#a917c3efabea8a20dc72d9ae2c673d632adce7cc8ec29055c4158828921f2f265e',1,'detail']]] +]; diff --git a/doc/html/search/enumvalues_7.js b/doc/html/search/enumvalues_7.js new file mode 100644 index 0000000..6da8d8d --- /dev/null +++ b/doc/html/search/enumvalues_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['object_0',['object',['../namespacedetail.html#a917c3efabea8a20dc72d9ae2c673d632aa8cfde6331bd59eb2ac96f8911c4b666',1,'detail']]] +]; diff --git a/doc/html/search/enumvalues_8.js b/doc/html/search/enumvalues_8.js new file mode 100644 index 0000000..97bd7f6 --- /dev/null +++ b/doc/html/search/enumvalues_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['parse_5ferror_0',['parse_error',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540a456e19aeafa334241c7ff3f589547f9d',1,'detail::lexer_base']]] +]; diff --git a/doc/html/search/enumvalues_9.js b/doc/html/search/enumvalues_9.js new file mode 100644 index 0000000..5614e84 --- /dev/null +++ b/doc/html/search/enumvalues_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['replace_0',['replace',['../namespacedetail.html#abe7cfa1fd8fa706ff4392bff9d1a8298a9dde360102c103867bd2f45872f1129c',1,'detail']]] +]; diff --git a/doc/html/search/enumvalues_a.js b/doc/html/search/enumvalues_a.js new file mode 100644 index 0000000..b0a83fa --- /dev/null +++ b/doc/html/search/enumvalues_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['source_5ffile_0',['SOURCE_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726a7c98cab84fc00353d5d242cfa5c257d4',1,'mce::VirtualFileSystem']]], + ['store_1',['store',['../namespacedetail.html#a7c070b2bf3d61e3d8b8013f6fb18d592a8cd892b7b97ef9489ae4479d3f4ef0fc',1,'detail']]], + ['strict_2',['strict',['../namespacedetail.html#abe7cfa1fd8fa706ff4392bff9d1a8298a2133fd717402a7966ee88d06f9e0b792',1,'detail']]], + ['string_3',['string',['../namespacedetail.html#a917c3efabea8a20dc72d9ae2c673d632ab45cffe084dd3d20d928bee85e7b0f21',1,'detail']]] +]; diff --git a/doc/html/search/enumvalues_b.js b/doc/html/search/enumvalues_b.js new file mode 100644 index 0000000..373ea65 --- /dev/null +++ b/doc/html/search/enumvalues_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['uninitialized_0',['uninitialized',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540a42dd1a73d072bb6bf3f494f22b15db8e',1,'detail::lexer_base']]] +]; diff --git a/doc/html/search/enumvalues_c.js b/doc/html/search/enumvalues_c.js new file mode 100644 index 0000000..cf57f2a --- /dev/null +++ b/doc/html/search/enumvalues_c.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['value_5ffloat_0',['value_float',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540a0d2671a6f81efb91e77f6ac3bdb11443',1,'detail::lexer_base']]], + ['value_5finteger_1',['value_integer',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540a5064b6655d88a50ae16665cf7751c0ee',1,'detail::lexer_base']]], + ['value_5fseparator_2',['value_separator',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540a745373036100d7392ad62c617cab59af',1,'detail::lexer_base']]], + ['value_5fstring_3',['value_string',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540a2b490e8bf366b4cbe3ebd99b26ce15ce',1,'detail::lexer_base']]], + ['value_5funsigned_4',['value_unsigned',['../classdetail_1_1lexer__base.html#add65fa7a85aa15052963809fbcc04540aaf1f040fcd2f674d2e5893d7a731078f',1,'detail::lexer_base']]] +]; diff --git a/doc/html/search/enumvalues_d.js b/doc/html/search/enumvalues_d.js new file mode 100644 index 0000000..0a1059d --- /dev/null +++ b/doc/html/search/enumvalues_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['world_5ffile_0',['WORLD_FILE',['../classmce_1_1_virtual_file_system.html#a7dc8dab11792813b017afe1e75888726ad7dc87fe0ad41cd2d441e509c81ea486',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/files_0.js b/doc/html/search/files_0.js new file mode 100644 index 0000000..8df159f --- /dev/null +++ b/doc/html/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['coroutinescheduler_2ehpp_0',['CoroutineScheduler.hpp',['../_coroutine_scheduler_8hpp.html',1,'']]] +]; diff --git a/doc/html/search/files_1.js b/doc/html/search/files_1.js new file mode 100644 index 0000000..92499eb --- /dev/null +++ b/doc/html/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['example_2ehpp_0',['example.hpp',['../example_8hpp.html',1,'']]] +]; diff --git a/doc/html/search/files_2.js b/doc/html/search/files_2.js new file mode 100644 index 0000000..3cc8bec --- /dev/null +++ b/doc/html/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['qeventbus_2ehpp_0',['QEventBus.hpp',['../_q_event_bus_8hpp.html',1,'']]] +]; diff --git a/doc/html/search/files_3.js b/doc/html/search/files_3.js new file mode 100644 index 0000000..e324cac --- /dev/null +++ b/doc/html/search/files_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['thread_2ehpp_0',['Thread.hpp',['../_thread_8hpp.html',1,'']]], + ['threadimpl_2ehpp_1',['ThreadImpl.hpp',['../_thread_impl_8hpp.html',1,'']]], + ['threadmanager_2ehpp_2',['ThreadManager.hpp',['../_thread_manager_8hpp.html',1,'']]] +]; diff --git a/doc/html/search/functions_0.js b/doc/html/search/functions_0.js new file mode 100644 index 0000000..f49afcc --- /dev/null +++ b/doc/html/search/functions_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['activecount_0',['activeCount',['../classmce_1_1_thread_manager.html#a43beb921636d53a6efd22d4ef8982165',1,'mce::ThreadManager']]], + ['add_1',['add',['../class_example_class.html#a9d2ee12372f2f25050ffd0283a7c6a8d',1,'ExampleClass']]], + ['addfunction_2',['addFunction',['../classmce_1_1_function_container.html#abaabfec7793c0a261354f592f20062ce',1,'mce::FunctionContainer']]], + ['addtask_3',['addTask',['../classmce_1_1_coroutine_scheduler.html#a4720b9b79d6dc3182f531837d364453d',1,'mce::CoroutineScheduler']]] +]; diff --git a/doc/html/search/functions_1.js b/doc/html/search/functions_1.js new file mode 100644 index 0000000..92fc834 --- /dev/null +++ b/doc/html/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['buildjsonmappingfile_0',['buildJSONMappingFile',['../classmce_1_1_virtual_file_system.html#a7dd599ce69981b9e8efc4bf01d7c4c06',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/functions_10.js b/doc/html/search/functions_10.js new file mode 100644 index 0000000..775c426 --- /dev/null +++ b/doc/html/search/functions_10.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['read_0',['read',['../classmce_1_1_file_input_stream.html#a6bf0dffd4568ef1638aed7aafa2ecd00',1,'mce::FileInputStream::read()'],['../classmce_1_1_input_stream.html#a548e3aeadfb9222019bcb59a39848d9e',1,'mce::InputStream::read()'],['../classmce_1_1_memory_input_stream.html#a11da8b6c2f59d0a5987bf06b93245bb1',1,'mce::MemoryInputStream::read(void *buffer, size_t size) override']]], + ['readstring_1',['readString',['../classmce_1_1_memory_input_stream.html#ac3771e7c4a9f8bb4a6e10581683fb97b',1,'mce::MemoryInputStream']]], + ['replace_5fsubstring_2',['replace_substring',['../namespacedetail.html#a6fd295e53b1dd4f46e235e6afee26d5e',1,'detail']]], + ['run_3',['run',['../structmce_1_1_thread_func.html#a845789c58b4cd7e73c7a99d15c2337f6',1,'mce::ThreadFunc::run()'],['../structmce_1_1_thread_functor.html#a15516d7b0dbda4d412ffdbea0eb2bc30',1,'mce::ThreadFunctor::run()'],['../structmce_1_1_thread_member_functor.html#a53486e3258e69a89e50a62e47ab3edfd',1,'mce::ThreadMemberFunctor::run()'],['../structmce_1_1_thread_member_functor_with_args.html#aff17a973bcfacc0ee487458c0ca5f228',1,'mce::ThreadMemberFunctorWithArgs::run()']]], + ['runasync_4',['runAsync',['../classmce_1_1_q_event_bus.html#a292b5d677b6dc2b483339e5ff6fc8497',1,'mce::QEventBus']]] +]; diff --git a/doc/html/search/functions_11.js b/doc/html/search/functions_11.js new file mode 100644 index 0000000..48a42e3 --- /dev/null +++ b/doc/html/search/functions_11.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['sax_5fparse_0',['sax_parse',['../classdetail_1_1binary__reader.html#a8e1b5452ae426e1d7b48761859e7f52d',1,'detail::binary_reader']]], + ['seek_1',['seek',['../classmce_1_1_file_input_stream.html#a8a46a90250858695bf282ed1fc601cc8',1,'mce::FileInputStream::seek()'],['../classmce_1_1_file_output_stream.html#aa198c5d7ebede14fa06d0de7a05a2028',1,'mce::FileOutputStream::seek()'],['../classmce_1_1_input_stream.html#a4c7ee56f44922aa52b608d44cbc4235c',1,'mce::InputStream::seek()'],['../classmce_1_1_memory_input_stream.html#a30df68220fde1b86deee930444e729d1',1,'mce::MemoryInputStream::seek()'],['../classmce_1_1_output_stream.html#af2b439b646d1c6262fa2fb5e5025c0f4',1,'mce::OutputStream::seek()']]], + ['serializer_2',['serializer',['../classdetail_1_1serializer.html#a3d025f3aa1e8661554858b8aaab08c3b',1,'detail::serializer']]], + ['set_5fend_3',['set_end',['../classdetail_1_1iter__impl.html#afc94db3b8f35616347c25fae68e09509',1,'detail::iter_impl']]], + ['set_5fsubtype_4',['set_subtype',['../classbyte__container__with__subtype.html#aa211ecfe3f0a626e96c54ea7e160491b',1,'byte_container_with_subtype']]], + ['skip_5fbom_5',['skip_bom',['../classdetail_1_1lexer.html#a04ae0c7807a761f4162ff42290be5490',1,'detail::lexer']]], + ['start_5farray_6',['start_array',['../structjson__sax.html#afc4d5c0d123f2e3c939060a778c4f22c',1,'json_sax']]], + ['start_5fobject_7',['start_object',['../structjson__sax.html#a54a0883df64f40664395e3dad674aaa5',1,'json_sax']]], + ['stop_8',['stop',['../classmce_1_1_q_event_bus.html#a06db1890efe5587da99b9d45b6436b88',1,'mce::QEventBus']]], + ['string_9',['string',['../structjson__sax.html#a3da9ee0c61f1a37e6c6a3d2dccb16765',1,'json_sax']]], + ['sub_10',['sub',['../structdetail_1_1dtoa__impl_1_1diyfp.html#a75142bace0b78b1e1433b1d35a7ff252',1,'detail::dtoa_impl::diyfp']]], + ['subscribe_11',['subscribe',['../classmce_1_1_q_event_bus.html#ae4a067bd3f491f948307f688acabd905',1,'mce::QEventBus']]], + ['subscriberaii_12',['subscribeRAII',['../classmce_1_1_q_event_bus.html#a8a47e0ac9ec1cb0430c19ab9aae2bc21',1,'mce::QEventBus']]], + ['subtype_13',['subtype',['../classbyte__container__with__subtype.html#a678460360dd494c33fbfde782e7c8201',1,'byte_container_with_subtype']]] +]; diff --git a/doc/html/search/functions_12.js b/doc/html/search/functions_12.js new file mode 100644 index 0000000..03aca88 --- /dev/null +++ b/doc/html/search/functions_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tell_0',['tell',['../classmce_1_1_file_input_stream.html#a3f974238eeb105b85e455145cc85518a',1,'mce::FileInputStream::tell()'],['../classmce_1_1_file_output_stream.html#aa6659c362021935717bbfc176075877a',1,'mce::FileOutputStream::tell()'],['../classmce_1_1_input_stream.html#a38cee7380aef36c4db0287e38609b4d7',1,'mce::InputStream::tell()'],['../classmce_1_1_memory_input_stream.html#a229ade412a4c8843a77d68b5a99814c0',1,'mce::MemoryInputStream::tell()'],['../classmce_1_1_output_stream.html#a738833d8f02a3442f2cd317bd64bb0c4',1,'mce::OutputStream::tell()']]], + ['terminate_1',['terminate',['../classmce_1_1_thread_impl.html#ae003bae531fde909b1cb13d6159b1fcb',1,'mce::ThreadImpl']]], + ['thread_2',['Thread',['../classmce_1_1_thread.html#a90e3636f9c64c36a6935a849445b17c1',1,'mce::Thread::Thread(QEventBus &qBus, F function)'],['../classmce_1_1_thread.html#a35eebc21874cf98c954d0f06f5fa8cb3',1,'mce::Thread::Thread(QEventBus &qBus, void(C::*function)(), C *object)'],['../classmce_1_1_thread.html#ad96edc70278355f33805f7826bcea466',1,'mce::Thread::Thread(QEventBus &qBus, void(C::*function)(), C *object, Args &&... args)']]], + ['threadfunctor_3',['ThreadFunctor',['../structmce_1_1_thread_functor.html#adf20b2d25c1d267d6201abc5ee019112',1,'mce::ThreadFunctor']]], + ['threadimpl_4',['ThreadImpl',['../classmce_1_1_thread_impl.html#a671887ec3998eab1d2f0262a85a3b087',1,'mce::ThreadImpl']]], + ['threadmanager_5',['ThreadManager',['../classmce_1_1_thread_manager.html#a44af86c56b28fdcb5aeadfee871d3773',1,'mce::ThreadManager']]], + ['threadmemberfunctor_6',['ThreadMemberFunctor',['../structmce_1_1_thread_member_functor.html#a1dc618e61e73f82c5898e873e486e480',1,'mce::ThreadMemberFunctor']]], + ['threadmemberfunctorwithargs_7',['ThreadMemberFunctorWithArgs',['../structmce_1_1_thread_member_functor_with_args.html#ad7b3374d69d6e0a3c606a299c47ccdf4',1,'mce::ThreadMemberFunctorWithArgs']]], + ['to_5fchars_8',['to_chars',['../namespacedetail.html#a3f0588f1a546b169113e6e1e293168f4',1,'detail']]], + ['to_5fjson_9',['to_json',['../structadl__serializer.html#a0216149429fe899cf45cbf14e08e2166',1,'adl_serializer']]], + ['token_5ftype_5fname_10',['token_type_name',['../classdetail_1_1lexer__base.html#aadef66e89ad828e5f69479c85887fa6d',1,'detail::lexer_base']]] +]; diff --git a/doc/html/search/functions_13.js b/doc/html/search/functions_13.js new file mode 100644 index 0000000..417cdda --- /dev/null +++ b/doc/html/search/functions_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['unescape_0',['unescape',['../namespacedetail.html#aa45018148d8569ca6f4d10a983221df1',1,'detail']]] +]; diff --git a/doc/html/search/functions_14.js b/doc/html/search/functions_14.js new file mode 100644 index 0000000..b07c784 --- /dev/null +++ b/doc/html/search/functions_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['value_0',['value',['../classdetail_1_1iteration__proxy__value.html#aac08993af9f4f0bf3d058b4beae36a45',1,'detail::iteration_proxy_value::value()'],['../classdetail_1_1iter__impl.html#a96557c87bc9b3adf6aa0b1a6b6209525',1,'detail::iter_impl::value()']]] +]; diff --git a/doc/html/search/functions_15.js b/doc/html/search/functions_15.js new file mode 100644 index 0000000..51b83ad --- /dev/null +++ b/doc/html/search/functions_15.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['wait_0',['wait',['../classmce_1_1_thread.html#a7167ced2613ce6e9e3ae0ee942277c87',1,'mce::Thread::wait()'],['../classmce_1_1_thread_impl.html#a2608abc24e2f18be8e25eb3a4265cdda',1,'mce::ThreadImpl::wait()']]], + ['waitall_1',['waitAll',['../classmce_1_1_thread_manager.html#a7b58969244f296e97a21656b563cf231',1,'mce::ThreadManager']]], + ['what_2',['what',['../classdetail_1_1exception.html#ae75d7315f5f2d85958da6d961375caf0',1,'detail::exception']]], + ['write_3',['write',['../classmce_1_1_file_output_stream.html#ac6e82fc9655a7a1dfd3d981519f18583',1,'mce::FileOutputStream::write()'],['../classmce_1_1_output_stream.html#a549f1ca23e39341f9a3cc23927644d81',1,'mce::OutputStream::write()']]], + ['write_5fbson_4',['write_bson',['../classdetail_1_1binary__writer.html#a1aae361b7492825979cbb80245b9c0d6',1,'detail::binary_writer']]], + ['write_5fcbor_5',['write_cbor',['../classdetail_1_1binary__writer.html#ae6ab36b61e8ad346e75d9f9abc983d4c',1,'detail::binary_writer']]], + ['write_5fmsgpack_6',['write_msgpack',['../classdetail_1_1binary__writer.html#adc3dbefa80134d3530a1b3f1c9629586',1,'detail::binary_writer']]], + ['write_5fubjson_7',['write_ubjson',['../classdetail_1_1binary__writer.html#a377616a7e3ca05a134a4cbbed79e3db8',1,'detail::binary_writer']]] +]; diff --git a/doc/html/search/functions_16.js b/doc/html/search/functions_16.js new file mode 100644 index 0000000..cc085c2 --- /dev/null +++ b/doc/html/search/functions_16.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['_7eqeventbus_0',['~QEventBus',['../classmce_1_1_q_event_bus.html#a030f589e472aa12873a6302677878d67',1,'mce::QEventBus']]], + ['_7esubscriptiontoken_1',['~SubscriptionToken',['../structmce_1_1_subscription_token.html#ae8014c0fd7075e841b2b62762e51fba2',1,'mce::SubscriptionToken']]], + ['_7ethread_2',['~Thread',['../classmce_1_1_thread.html#ad53fb135e59203bea7469f8ec3bde46b',1,'mce::Thread']]], + ['_7ethreadfunc_3',['~ThreadFunc',['../structmce_1_1_thread_func.html#a326effacbebaefebd61fd3b57a480d39',1,'mce::ThreadFunc']]], + ['_7ethreadmanager_4',['~ThreadManager',['../classmce_1_1_thread_manager.html#a10b8efbe312127af02418c3942b0e7b6',1,'mce::ThreadManager']]] +]; diff --git a/doc/html/search/functions_2.js b/doc/html/search/functions_2.js new file mode 100644 index 0000000..a1d7d72 --- /dev/null +++ b/doc/html/search/functions_2.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['callfunction_0',['callFunction',['../classmce_1_1_function_container.html#a302e97f87b554bbaac24ca5d7f884385',1,'mce::FunctionContainer']]], + ['cleanupfinished_1',['cleanupFinished',['../classmce_1_1_thread_manager.html#a72319f5b2505aa6e0fe75cfdc1231032',1,'mce::ThreadManager']]], + ['close_2',['close',['../classmce_1_1_file_input_stream.html#abe975adc14ec46da5085aa396bf6bb17',1,'mce::FileInputStream::close()'],['../classmce_1_1_file_output_stream.html#a695bf4b8e186fcd40a666487e4e4b8f1',1,'mce::FileOutputStream::close()']]], + ['coroutinescheduler_3',['CoroutineScheduler',['../classmce_1_1_coroutine_scheduler.html#a08b0a86a4940c34b5db26acefa3e316c',1,'mce::CoroutineScheduler']]], + ['createthread_4',['createThread',['../classmce_1_1_thread_manager.html#a3cfaaa1edb1dd0ded4a99553972cd93c',1,'mce::ThreadManager::createThread(const eastl::string &name, F func)'],['../classmce_1_1_thread_manager.html#a07cbeefe7d5b5d4845e0b2f1e59fef21',1,'mce::ThreadManager::createThread(const eastl::string &name, void(C::*func)(), C *object)']]] +]; diff --git a/doc/html/search/functions_3.js b/doc/html/search/functions_3.js new file mode 100644 index 0000000..204c67f --- /dev/null +++ b/doc/html/search/functions_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['fileoutputstream_0',['FileOutputStream',['../classmce_1_1_file_output_stream.html#a0ab5f8d7e010b94a072bc13b52e5dd1c',1,'mce::FileOutputStream']]], + ['findfunction_1',['findFunction',['../classmce_1_1_function_container.html#aeb8c83b9b780a1990007da8e8e5f3133',1,'mce::FunctionContainer']]], + ['functioncontainer_2',['FunctionContainer',['../classmce_1_1_function_container.html#ad88b85713ffa87b60972a43be7da9517',1,'mce::FunctionContainer::FunctionContainer()=default'],['../classmce_1_1_function_container.html#a56021097f6d60531a37b7c6158b88ec7',1,'mce::FunctionContainer::FunctionContainer(QEventBus &qBus, std::initializer_list< std::pair< eastl::string, eastl::any > > initlist)']]] +]; diff --git a/doc/html/search/functions_4.js b/doc/html/search/functions_4.js new file mode 100644 index 0000000..d72151b --- /dev/null +++ b/doc/html/search/functions_4.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['getconfig_0',['getConfig',['../classmce_1_1_virtual_file_system.html#af593de4f0ffc1a84a66ed160cbc26fe2',1,'mce::VirtualFileSystem']]], + ['getfile_1',['getFile',['../classmce_1_1_virtual_file_system.html#a8f65e6706de32cdbe5c68f6e7053222a',1,'mce::VirtualFileSystem']]], + ['getfunction_2',['getFunction',['../classmce_1_1_function_container.html#a3d754d6d89dc40e1bb7c178941687b16',1,'mce::FunctionContainer']]], + ['getsize_3',['getSize',['../classmce_1_1_file_input_stream.html#a271ddb30e8c58bbb759c03a6970277e1',1,'mce::FileInputStream::getSize()'],['../classmce_1_1_file_output_stream.html#a4160ad51b9d0d867e45bba2a3a4d30db',1,'mce::FileOutputStream::getSize()'],['../classmce_1_1_input_stream.html#a661d85973a2683a217252c36f47da682',1,'mce::InputStream::getSize()'],['../classmce_1_1_memory_input_stream.html#a220e82b4a2096923f91b02058a354c1a',1,'mce::MemoryInputStream::getSize()'],['../classmce_1_1_output_stream.html#a4b19dae8e434c51a7d79058994c035c7',1,'mce::OutputStream::getSize()']]] +]; diff --git a/doc/html/search/functions_5.js b/doc/html/search/functions_5.js new file mode 100644 index 0000000..5b0f678 --- /dev/null +++ b/doc/html/search/functions_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['isopen_0',['isOpen',['../classmce_1_1_file_input_stream.html#a26a715bb8bb53cb3cb1b1de6059af07a',1,'mce::FileInputStream::isOpen()'],['../classmce_1_1_file_output_stream.html#ae17a2bca1876c50cb5725b41551dd43b',1,'mce::FileOutputStream::isOpen()']]] +]; diff --git a/doc/html/search/functions_6.js b/doc/html/search/functions_6.js new file mode 100644 index 0000000..ea564a5 --- /dev/null +++ b/doc/html/search/functions_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['launch_0',['launch',['../classmce_1_1_thread.html#a6857a0007eb44e985a11b76e8b2ab81d',1,'mce::Thread::launch()'],['../classmce_1_1_thread_manager.html#ab500bf731fff307e4e7a06928b865167',1,'mce::ThreadManager::launch(Thread *th)'],['../classmce_1_1_thread_manager.html#ad5e09cdd0695f8587b041a618284b018',1,'mce::ThreadManager::launch(const eastl::string &name)']]], + ['loadfile_1',['loadFile',['../classmce_1_1_virtual_file_system.html#ae5c0d15aed23eb8651abcce2190fb7ac',1,'mce::VirtualFileSystem']]] +]; diff --git a/doc/html/search/functions_7.js b/doc/html/search/functions_7.js new file mode 100644 index 0000000..b13d18c --- /dev/null +++ b/doc/html/search/functions_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['makeversion_0',['makeVersion',['../unionmce_1_1_virtual_file_system_1_1_version.html#a7674f5a1656039e67890095b1a2d9458',1,'mce::VirtualFileSystem::Version']]], + ['memoryinputstream_1',['MemoryInputStream',['../classmce_1_1_memory_input_stream.html#a6f8edd8bbe3b0fe735cce8f43f2a41b4',1,'mce::MemoryInputStream']]] +]; diff --git a/doc/html/search/functions_8.js b/doc/html/search/functions_8.js new file mode 100644 index 0000000..a3535c5 --- /dev/null +++ b/doc/html/search/functions_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['open_0',['open',['../classmce_1_1_file_input_stream.html#a3eb6e463ae37bd285915c3b41fd5f53e',1,'mce::FileInputStream::open()'],['../classmce_1_1_file_output_stream.html#acc1a4e675eba02a8dad17a6acd1d4265',1,'mce::FileOutputStream::open()']]], + ['operator_5b_5d_1',['operator[]',['../classmce_1_1_function_container.html#ab0271b06ab337b65ae2a4ac79c80c55c',1,'mce::FunctionContainer']]] +]; diff --git a/doc/html/search/functions_9.js b/doc/html/search/functions_9.js new file mode 100644 index 0000000..a25c889 --- /dev/null +++ b/doc/html/search/functions_9.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['post_0',['post',['../classmce_1_1_q_event_bus.html#a13302d26ca2e8b91e075e5430ea9ce97',1,'mce::QEventBus']]], + ['printstats_1',['printStats',['../classmce_1_1_thread_manager.html#a0739a1906bf371bf8a729ab0d0ce4929',1,'mce::ThreadManager']]], + ['process_2',['process',['../classmce_1_1_q_event_bus.html#a37196ad021d476479362bfe51ffc1b59',1,'mce::QEventBus']]], + ['processtasks_3',['processTasks',['../classmce_1_1_coroutine_scheduler.html#a172c9650e9b298a3e2e03ff0e9571dfb',1,'mce::CoroutineScheduler']]] +]; diff --git a/doc/html/search/functions_a.js b/doc/html/search/functions_a.js new file mode 100644 index 0000000..a3029a7 --- /dev/null +++ b/doc/html/search/functions_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['read_0',['read',['../classmce_1_1_file_input_stream.html#a6bf0dffd4568ef1638aed7aafa2ecd00',1,'mce::FileInputStream::read()'],['../classmce_1_1_input_stream.html#a548e3aeadfb9222019bcb59a39848d9e',1,'mce::InputStream::read()'],['../classmce_1_1_memory_input_stream.html#a11da8b6c2f59d0a5987bf06b93245bb1',1,'mce::MemoryInputStream::read(void *buffer, size_t size) override']]], + ['readstring_1',['readString',['../classmce_1_1_memory_input_stream.html#ac3771e7c4a9f8bb4a6e10581683fb97b',1,'mce::MemoryInputStream']]], + ['run_2',['run',['../structmce_1_1_thread_func.html#a845789c58b4cd7e73c7a99d15c2337f6',1,'mce::ThreadFunc::run()'],['../structmce_1_1_thread_functor.html#a15516d7b0dbda4d412ffdbea0eb2bc30',1,'mce::ThreadFunctor::run()'],['../structmce_1_1_thread_member_functor.html#a53486e3258e69a89e50a62e47ab3edfd',1,'mce::ThreadMemberFunctor::run()'],['../structmce_1_1_thread_member_functor_with_args.html#aff17a973bcfacc0ee487458c0ca5f228',1,'mce::ThreadMemberFunctorWithArgs::run()']]], + ['runasync_3',['runAsync',['../classmce_1_1_q_event_bus.html#a292b5d677b6dc2b483339e5ff6fc8497',1,'mce::QEventBus']]] +]; diff --git a/doc/html/search/functions_b.js b/doc/html/search/functions_b.js new file mode 100644 index 0000000..8382d2e --- /dev/null +++ b/doc/html/search/functions_b.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['seek_0',['seek',['../classmce_1_1_file_input_stream.html#a8a46a90250858695bf282ed1fc601cc8',1,'mce::FileInputStream::seek()'],['../classmce_1_1_file_output_stream.html#aa198c5d7ebede14fa06d0de7a05a2028',1,'mce::FileOutputStream::seek()'],['../classmce_1_1_input_stream.html#a4c7ee56f44922aa52b608d44cbc4235c',1,'mce::InputStream::seek()'],['../classmce_1_1_memory_input_stream.html#a30df68220fde1b86deee930444e729d1',1,'mce::MemoryInputStream::seek()'],['../classmce_1_1_output_stream.html#af2b439b646d1c6262fa2fb5e5025c0f4',1,'mce::OutputStream::seek()']]], + ['stop_1',['stop',['../classmce_1_1_q_event_bus.html#a06db1890efe5587da99b9d45b6436b88',1,'mce::QEventBus']]], + ['subscribe_2',['subscribe',['../classmce_1_1_q_event_bus.html#ae4a067bd3f491f948307f688acabd905',1,'mce::QEventBus']]], + ['subscriberaii_3',['subscribeRAII',['../classmce_1_1_q_event_bus.html#a8a47e0ac9ec1cb0430c19ab9aae2bc21',1,'mce::QEventBus']]] +]; diff --git a/doc/html/search/functions_c.js b/doc/html/search/functions_c.js new file mode 100644 index 0000000..e2b7ab4 --- /dev/null +++ b/doc/html/search/functions_c.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['tell_0',['tell',['../classmce_1_1_file_input_stream.html#a3f974238eeb105b85e455145cc85518a',1,'mce::FileInputStream::tell()'],['../classmce_1_1_file_output_stream.html#aa6659c362021935717bbfc176075877a',1,'mce::FileOutputStream::tell()'],['../classmce_1_1_input_stream.html#a38cee7380aef36c4db0287e38609b4d7',1,'mce::InputStream::tell()'],['../classmce_1_1_memory_input_stream.html#a229ade412a4c8843a77d68b5a99814c0',1,'mce::MemoryInputStream::tell()'],['../classmce_1_1_output_stream.html#a738833d8f02a3442f2cd317bd64bb0c4',1,'mce::OutputStream::tell()']]], + ['terminate_1',['terminate',['../classmce_1_1_thread_impl.html#ae003bae531fde909b1cb13d6159b1fcb',1,'mce::ThreadImpl']]], + ['thread_2',['Thread',['../classmce_1_1_thread.html#a90e3636f9c64c36a6935a849445b17c1',1,'mce::Thread::Thread(QEventBus &qBus, F function)'],['../classmce_1_1_thread.html#a35eebc21874cf98c954d0f06f5fa8cb3',1,'mce::Thread::Thread(QEventBus &qBus, void(C::*function)(), C *object)'],['../classmce_1_1_thread.html#ad96edc70278355f33805f7826bcea466',1,'mce::Thread::Thread(QEventBus &qBus, void(C::*function)(), C *object, Args &&... args)']]], + ['threadfunctor_3',['ThreadFunctor',['../structmce_1_1_thread_functor.html#adf20b2d25c1d267d6201abc5ee019112',1,'mce::ThreadFunctor']]], + ['threadimpl_4',['ThreadImpl',['../classmce_1_1_thread_impl.html#a671887ec3998eab1d2f0262a85a3b087',1,'mce::ThreadImpl']]], + ['threadmanager_5',['ThreadManager',['../classmce_1_1_thread_manager.html#a44af86c56b28fdcb5aeadfee871d3773',1,'mce::ThreadManager']]], + ['threadmemberfunctor_6',['ThreadMemberFunctor',['../structmce_1_1_thread_member_functor.html#a1dc618e61e73f82c5898e873e486e480',1,'mce::ThreadMemberFunctor']]], + ['threadmemberfunctorwithargs_7',['ThreadMemberFunctorWithArgs',['../structmce_1_1_thread_member_functor_with_args.html#ad7b3374d69d6e0a3c606a299c47ccdf4',1,'mce::ThreadMemberFunctorWithArgs']]] +]; diff --git a/doc/html/search/functions_d.js b/doc/html/search/functions_d.js new file mode 100644 index 0000000..911dbcc --- /dev/null +++ b/doc/html/search/functions_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['wait_0',['wait',['../classmce_1_1_thread.html#a7167ced2613ce6e9e3ae0ee942277c87',1,'mce::Thread::wait()'],['../classmce_1_1_thread_impl.html#a2608abc24e2f18be8e25eb3a4265cdda',1,'mce::ThreadImpl::wait()']]], + ['waitall_1',['waitAll',['../classmce_1_1_thread_manager.html#a7b58969244f296e97a21656b563cf231',1,'mce::ThreadManager']]], + ['write_2',['write',['../classmce_1_1_file_output_stream.html#ac6e82fc9655a7a1dfd3d981519f18583',1,'mce::FileOutputStream::write()'],['../classmce_1_1_output_stream.html#a549f1ca23e39341f9a3cc23927644d81',1,'mce::OutputStream::write()']]] +]; diff --git a/doc/html/search/functions_e.js b/doc/html/search/functions_e.js new file mode 100644 index 0000000..cc085c2 --- /dev/null +++ b/doc/html/search/functions_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['_7eqeventbus_0',['~QEventBus',['../classmce_1_1_q_event_bus.html#a030f589e472aa12873a6302677878d67',1,'mce::QEventBus']]], + ['_7esubscriptiontoken_1',['~SubscriptionToken',['../structmce_1_1_subscription_token.html#ae8014c0fd7075e841b2b62762e51fba2',1,'mce::SubscriptionToken']]], + ['_7ethread_2',['~Thread',['../classmce_1_1_thread.html#ad53fb135e59203bea7469f8ec3bde46b',1,'mce::Thread']]], + ['_7ethreadfunc_3',['~ThreadFunc',['../structmce_1_1_thread_func.html#a326effacbebaefebd61fd3b57a480d39',1,'mce::ThreadFunc']]], + ['_7ethreadmanager_4',['~ThreadManager',['../classmce_1_1_thread_manager.html#a10b8efbe312127af02418c3942b0e7b6',1,'mce::ThreadManager']]] +]; diff --git a/doc/html/search/functions_f.js b/doc/html/search/functions_f.js new file mode 100644 index 0000000..b2860b8 --- /dev/null +++ b/doc/html/search/functions_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['parse_0',['parse',['../classdetail_1_1parser.html#a59f4b745d4aa146bf7a60a30060f592f',1,'detail::parser']]], + ['parse_5ferror_1',['parse_error',['../structjson__sax.html#af165920966b60b78e57a2e4d92a63897',1,'json_sax']]], + ['post_2',['post',['../classmce_1_1_q_event_bus.html#a13302d26ca2e8b91e075e5430ea9ce97',1,'mce::QEventBus']]], + ['printstats_3',['printStats',['../classmce_1_1_thread_manager.html#a0739a1906bf371bf8a729ab0d0ce4929',1,'mce::ThreadManager']]], + ['process_4',['process',['../classmce_1_1_q_event_bus.html#a37196ad021d476479362bfe51ffc1b59',1,'mce::QEventBus']]], + ['processtasks_5',['processTasks',['../classmce_1_1_coroutine_scheduler.html#a172c9650e9b298a3e2e03ff0e9571dfb',1,'mce::CoroutineScheduler']]] +]; diff --git a/doc/html/search/groups_0.js b/doc/html/search/groups_0.js new file mode 100644 index 0000000..6a5c3de --- /dev/null +++ b/doc/html/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['example_20group_0',['Example Group',['../group___example_group.html',1,'']]] +]; diff --git a/doc/html/search/groups_1.js b/doc/html/search/groups_1.js new file mode 100644 index 0000000..aa83799 --- /dev/null +++ b/doc/html/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['group_0',['Example Group',['../group___example_group.html',1,'']]] +]; diff --git a/doc/html/search/namespaces_0.js b/doc/html/search/namespaces_0.js new file mode 100644 index 0000000..c2a8b0f --- /dev/null +++ b/doc/html/search/namespaces_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['detail_0',['detail',['../namespacedetail.html',1,'']]], + ['detail_3a_3adtoa_5fimpl_1',['dtoa_impl',['../namespacedetail_1_1dtoa__impl.html',1,'detail']]] +]; diff --git a/doc/html/search/pages_0.js b/doc/html/search/pages_0.js new file mode 100644 index 0000000..8a2ba60 --- /dev/null +++ b/doc/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bug_20list_0',['Bug List',['../bug.html',1,'']]] +]; diff --git a/doc/html/search/pages_1.js b/doc/html/search/pages_1.js new file mode 100644 index 0000000..4d85845 --- /dev/null +++ b/doc/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['deprecated_20list_0',['Deprecated List',['../deprecated.html',1,'']]] +]; diff --git a/doc/html/search/pages_2.js b/doc/html/search/pages_2.js new file mode 100644 index 0000000..20d7d8f --- /dev/null +++ b/doc/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['list_0',['List',['../bug.html',1,'Bug List'],['../deprecated.html',1,'Deprecated List'],['../todo.html',1,'Todo List']]] +]; diff --git a/doc/html/search/pages_3.js b/doc/html/search/pages_3.js new file mode 100644 index 0000000..83220ef --- /dev/null +++ b/doc/html/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['todo_20list_0',['Todo List',['../todo.html',1,'']]] +]; diff --git a/doc/html/search/pages_4.js b/doc/html/search/pages_4.js new file mode 100644 index 0000000..034a820 --- /dev/null +++ b/doc/html/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['the_20following_20concept_20requirements_3a_0',['class satisfies the following concept requirements:',['../requirements.html#The',1,'']]] +]; diff --git a/doc/html/search/pages_5.js b/doc/html/search/pages_5.js new file mode 100644 index 0000000..9f99c4c --- /dev/null +++ b/doc/html/search/pages_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['unsatisfied_20requirements_0',['Unsatisfied Requirements',['../requirements.html#missing_satisfies',1,'']]], + ['unverified_20requirements_1',['Unverified Requirements',['../requirements.html#missing_verifies',1,'']]] +]; diff --git a/doc/html/search/related_0.js b/doc/html/search/related_0.js new file mode 100644 index 0000000..867556f --- /dev/null +++ b/doc/html/search/related_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['operator_2b_0',['operator+',['../classdetail_1_1iter__impl.html#a94108d1a7563e103534f23eb5c1ee175',1,'detail::iter_impl']]] +]; diff --git a/doc/html/search/search.css b/doc/html/search/search.css new file mode 100644 index 0000000..043d32d --- /dev/null +++ b/doc/html/search/search.css @@ -0,0 +1,377 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
      • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 43px; + margin-right: 0; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + border: 1px solid var(--search-box-border-color); + z-index: 102; + margin-right: 4px; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.6em; +} + +#MSearchField { + display: inline-block; + vertical-align: top; + width: 7.5em; + height: 22px; + margin: 0 0 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.6em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + margin: 6px 0 0 4px; +} + +.close-icon { + width: 11px; + height: 11px; + background-color: var(--search-close-icon-bg-color); + border-radius: 50%; + position: relative; + display: flex; + justify-content: center; + align-items: center; + box-sizing: content-box; +} + +.close-icon:before, +.close-icon:after { + content: ''; + position: absolute; + width: 7px; + height: 1px; + background-color: var(--search-close-icon-fg-color); +} + +.close-icon:before { + transform: rotate(45deg); +} + +.close-icon:after { + transform: rotate(-45deg); +} + + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + +.search-icon { + width: 20px; + height: 20px; + display: inline-block; + position: relative; + margin-left: 3px; +} + +#MSearchSelectExt.search-icon { + width: 10px; +} + +#MSearchSelectExt + input { + margin-left: 5px; +} + +.search-icon::before, .search-icon::after { + content: ''; + position: absolute; + border: 1.5px solid var(--search-foreground-color); + box-sizing: content-box; +} + +.search-icon::before { + width: 6px; + height: 6px; + border-radius: 50%; + top: 7px; + left: 2px; + background: var(--search-background-color); +} + +.search-icon::after { + border: 1px solid var(--search-foreground-color); + width: 0px; + height: 3px; + border-radius: 2px; + top: 15px; + left: 8px; + transform: rotate(-45deg); + transform-origin: top left; +} + +.search-icon-dropdown { + content: ''; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 3px solid var(--search-foreground-color); + top: 8px; + left: 15px; + transform: translateX(-50%); + position: absolute; +} + + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + backdrop-filter: var(--search-filter-backdrop-filter); + -webkit-backdrop-filter: var(--search-filter-backdrop-filter); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + border-radius: 4px; +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: auto; + right: 4px; + top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + backdrop-filter: var(--search-results-backdrop-filter); + -webkit-backdrop-filter: var(--search-results-backdrop-filter); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; + border-radius: 8px; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResults; + box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); +} + + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 10pt; + padding: 2px 5px; +} + +div.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +#searchBoxPos1 dark-mode-toggle { + margin-top: 4px; +} + +/*---------------- External search page results */ + +.pages b { + color: var(--nav-foreground-color); + padding: 5px 5px 3px 5px; + background-color: var(--nav-menu-active-bg); + border-radius: 4px; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/html/search/search.js b/doc/html/search/search.js new file mode 100644 index 0000000..dc14410 --- /dev/null +++ b/doc/html/search/search.js @@ -0,0 +1,708 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const decodeHtml = (html) => { + const txt = document.createElement("textarea"); + txt.innerHTML = html; + return txt.value; + }; + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = decodeHtml(elem[1][0]); + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + if (elem[1][1][0].startsWith('http://') || elem[1][1][0].startsWith('https://')) { // absolute path + srLink.setAttribute('href',elem[1][1][0]); + } else { // relative path + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + } + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = decodeHtml(elem[1][1][2]); + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        adl_serializer< ValueType, typename > Member List
        +
        +
        + +

        This is the complete list of members for adl_serializer< ValueType, typename >, including all inherited members.

        + + + + +
        from_json(BasicJsonType &&j, TargetType &val) noexcept(noexcept(::nlohmann::from_json(std::forward< BasicJsonType >(j), val))) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), val), void())adl_serializer< ValueType, typename >inlinestatic
        from_json(BasicJsonType &&j) noexcept(noexcept(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))adl_serializer< ValueType, typename >inlinestatic
        to_json(BasicJsonType &j, TargetType &&val) noexcept(noexcept(::nlohmann::to_json(j, std::forward< TargetType >(val)))) -> decltype(::nlohmann::to_json(j, std::forward< TargetType >(val)), void())adl_serializer< ValueType, typename >inlinestatic
        +
        +
        + + + + diff --git a/doc/html/structadl__serializer.html b/doc/html/structadl__serializer.html new file mode 100644 index 0000000..b69a334 --- /dev/null +++ b/doc/html/structadl__serializer.html @@ -0,0 +1,247 @@ + + + + + + + +Minecraft Community Edition: adl_serializer< ValueType, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        adl_serializer< ValueType, typename > Struct Template Reference
        +
        +
        + +

        namespace for Niels Lohmann + More...

        + +

        #include <json.hpp>

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

        +Static Public Member Functions

        template<typename BasicJsonType, typename TargetType = ValueType>
        static auto from_json (BasicJsonType &&j, TargetType &val) noexcept(noexcept(::nlohmann::from_json(std::forward< BasicJsonType >(j), val))) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), val), void())
         convert a JSON value to any value type
        template<typename BasicJsonType, typename TargetType = ValueType>
        static auto from_json (BasicJsonType &&j) noexcept(noexcept(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))
         convert a JSON value to any value type
        template<typename BasicJsonType, typename TargetType = ValueType>
        static auto to_json (BasicJsonType &j, TargetType &&val) noexcept(noexcept(::nlohmann::to_json(j, std::forward< TargetType >(val)))) -> decltype(::nlohmann::to_json(j, std::forward< TargetType >(val)), void())
         convert any value type to a JSON value
        +

        Detailed Description

        +
        template<typename ValueType, typename>
        +struct adl_serializer< ValueType, typename >

        namespace for Niels Lohmann

        +
        See also
        https://github.com/nlohmann
        +
        Since
        version 1.0.0
        +

        default JSONSerializer template argument

        +

        This serializer ignores the template arguments and uses ADL (argument-dependent lookup) for serialization.

        +
        See also
        https://json.nlohmann.me/api/adl_serializer/
        +

        Member Function Documentation

        + +

        ◆ from_json() [1/2]

        + +
        +
        +
        +template<typename ValueType, typename>
        +
        +template<typename BasicJsonType, typename TargetType = ValueType>
        + + + + + +
        + + + + + + + +
        auto adl_serializer< ValueType, typename >::from_json (BasicJsonType && j) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), detail::identity_tag< TargetType > {}))
        +
        +inlinestaticnoexcept
        +
        + +

        convert a JSON value to any value type

        +
        See also
        https://json.nlohmann.me/api/adl_serializer/from_json/
        + +
        +
        + +

        ◆ from_json() [2/2]

        + +
        +
        +
        +template<typename ValueType, typename>
        +
        +template<typename BasicJsonType, typename TargetType = ValueType>
        + + + + + +
        + + + + + + + + + + + +
        auto adl_serializer< ValueType, typename >::from_json (BasicJsonType && j,
        TargetType & val ) -> decltype(::nlohmann::from_json(std::forward< BasicJsonType >(j), val), void())
        +
        +inlinestaticnoexcept
        +
        + +

        convert a JSON value to any value type

        +
        See also
        https://json.nlohmann.me/api/adl_serializer/from_json/
        + +
        +
        + +

        ◆ to_json()

        + +
        +
        +
        +template<typename ValueType, typename>
        +
        +template<typename BasicJsonType, typename TargetType = ValueType>
        + + + + + +
        + + + + + + + + + + + +
        auto adl_serializer< ValueType, typename >::to_json (BasicJsonType & j,
        TargetType && val ) -> decltype(::nlohmann::to_json(j, std::forward< TargetType >(val)), void())
        +
        +inlinestaticnoexcept
        +
        + +

        convert any value type to a JSON value

        +
        See also
        https://json.nlohmann.me/api/adl_serializer/to_json/
        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1actual__object__comparator-members.html b/doc/html/structdetail_1_1actual__object__comparator-members.html new file mode 100644 index 0000000..bf3a22e --- /dev/null +++ b/doc/html/structdetail_1_1actual__object__comparator-members.html @@ -0,0 +1,111 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::actual_object_comparator< BasicJsonType > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1actual__object__comparator.html b/doc/html/structdetail_1_1actual__object__comparator.html new file mode 100644 index 0000000..0d0066f --- /dev/null +++ b/doc/html/structdetail_1_1actual__object__comparator.html @@ -0,0 +1,144 @@ + + + + + + + +Minecraft Community Edition: detail::actual_object_comparator< BasicJsonType > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::actual_object_comparator< BasicJsonType > Struct Template Reference
        +
        +
        + + + + + +

        +Public Types

        +using object_t = typename BasicJsonType::object_t
        +using object_comparator_t = typename BasicJsonType::default_object_comparator_t
        using type
        +

        Member Typedef Documentation

        + +

        ◆ type

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + +
        using detail::actual_object_comparator< BasicJsonType >::type
        +
        +Initial value:
        typename std::conditional < has_key_compare<object_t>::value,
        +
        typename object_t::key_compare, object_comparator_t>::type
        +
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1char__traits.html b/doc/html/structdetail_1_1char__traits.html new file mode 100644 index 0000000..20a1ffd --- /dev/null +++ b/doc/html/structdetail_1_1char__traits.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::char_traits< T > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::char_traits< T > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::char_traits< T >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1char__traits.png b/doc/html/structdetail_1_1char__traits.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6a572e9ee521736bcd901992dae444fe0ac379 GIT binary patch literal 637 zcmeAS@N?(olHy`uVBq!ia0vp^-9Q|`!3-qj?8+2@lyrbki0l9V|AEZcuV44{^ene9 z&@7Oce&)r42M>Vaug>M|1j=!i1o;Is0Qq2G&NTZ90|OI>r;B4q1>@Vff&Gsacv_C@ z&;9v-|Bp)!3dffCuHPP2QZzL(vH5U&?xyty#?dYYlVY4sI!y`$;o@npq?fPT*go^@ zoPFE=coZ$0pSUyb_bRT&r=5E@=f4VmYBD>${Oabftf~qA?$Hr(j+bobZ;-e-fAd3G zSM_U;MILM4`pM+YGIzt5s_iR-&ps+JVHeoHQo3Jt=G7On-nj=Py=PiIN}kJhdgkPN zUt4EvFj;cqQI?4J&&ar*H~qg~7Jp51wCofonVIiZBdtgeFwROgG>&#=_^?-wVMB*lQl-tc#>kFT=Sa3R)oFX&84Q9q zF*t+}iLcb3NJ`t*kuYgX%OuxHi$GY$TYlF?k7{50Gd@Y>mB|Sbgtx2+5 z{RM0O>c5u~EoL!yobQv~-Z61$N$A>Z+0$+{7>kKpue_Xab&u~SqqG-IOBG$G8J1~0 z?cKBI#q`xy_Y!~ZiN9mJDzmn#=JB>gGSmLI$Sk)!`tPjmq$Tm!_9yQAHOcEz?bH8m mo?TvI5PU1*%$aK!z4 literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4-members.html b/doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4-members.html new file mode 100644 index 0000000..f8eb503 --- /dev/null +++ b/doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4-members.html @@ -0,0 +1,113 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::char_traits< signed char > Member List
        +
        +
        + +

        This is the complete list of members for detail::char_traits< signed char >, including all inherited members.

        + + + + + + +
        char_type typedef (defined in detail::char_traits< signed char >)detail::char_traits< signed char >
        eof() noexcept (defined in detail::char_traits< signed char >)detail::char_traits< signed char >inlinestatic
        int_type typedef (defined in detail::char_traits< signed char >)detail::char_traits< signed char >
        to_char_type(int_type i) noexcept (defined in detail::char_traits< signed char >)detail::char_traits< signed char >inlinestatic
        to_int_type(char_type c) noexcept (defined in detail::char_traits< signed char >)detail::char_traits< signed char >inlinestatic
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4.html b/doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4.html new file mode 100644 index 0000000..570b819 --- /dev/null +++ b/doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4.html @@ -0,0 +1,139 @@ + + + + + + + +Minecraft Community Edition: detail::char_traits< signed char > Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::char_traits< signed char > Struct Reference
        +
        +
        +
        +Inheritance diagram for detail::char_traits< signed char >:
        +
        +
        + +
        + + + + +

        +Public Types

        +using char_type = signed char
        +using int_type = uint64_t
        + + + + +

        +Static Public Member Functions

        +static int_type to_int_type (char_type c) noexcept
        +static char_type to_char_type (int_type i) noexcept
        +static constexpr int_type eof () noexcept
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4.png b/doc/html/structdetail_1_1char__traits_3_01signed_01char_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..af6b9e322765099fbc3c4893b53f2eda895e9d9c GIT binary patch literal 1093 zcmeAS@N?(olHy`uVBq!ia0y~yV4MYH2XHV0N%1?*=0Hk1z$e7@|Ns9$=Iht5dwP17 zTNr2-NK8NT;=zLlK=D`S@^%8{I7@>3f*F8(FfeDDeT9L6`GTj5V@L(#+qrjVEiw>b z)i$5^`JexuR}C#JqA_>hcG}9D3f1kJEb{VBke8DVhK?GV`rk=YoKL0 zDxPV~+^&EIzG!>Zy1ZoRnb|KHc{nxl`%+s$$#q9Mzk*pUYPJN^jS`UT(CndVS?@gZ@&WE$>9O%$K{KU3PW#?Y+O& zRxX|IzbZB^s8lC0PjK3Y%SV5nJT9rawr@Jut>_W!KG3S6P6IbbNrTHPGC@B zus$it%;C9;ksNH{qq($);Xs1O?SFrlNZsc1T($8n&|)ZqXI+|Q?A)!N-kr{Qm$PTL z_L(q++jU38SKXX3<8IbB-&MKWm&}Ut)x0jL@%;X)`@c@l*N?4Vc5P|o{e5QB+1K;l zUY*=$qngXCCpbU#50~j>5k0f8^w-|2!)!kn7eBuH>tK?;yZDA_KUI?FN+lSGnZAA* zdG_I|b!UvX*yYadoqjE0_S)Y!XMX&qav;GZORxU(_Q={b(ZXLpA6Pc)>h9XW)!wOl zrKaDhHom7+e|%Nu^0$4nZr6Oxx>Y`V*Y-e@>pS1CxOwV_?CNI+zwe9j9xrei{4f + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::char_traits< unsigned char > Member List
        +
        +
        + +

        This is the complete list of members for detail::char_traits< unsigned char >, including all inherited members.

        + + + + + + +
        char_type typedef (defined in detail::char_traits< unsigned char >)detail::char_traits< unsigned char >
        eof() noexcept (defined in detail::char_traits< unsigned char >)detail::char_traits< unsigned char >inlinestatic
        int_type typedef (defined in detail::char_traits< unsigned char >)detail::char_traits< unsigned char >
        to_char_type(int_type i) noexcept (defined in detail::char_traits< unsigned char >)detail::char_traits< unsigned char >inlinestatic
        to_int_type(char_type c) noexcept (defined in detail::char_traits< unsigned char >)detail::char_traits< unsigned char >inlinestatic
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1char__traits_3_01unsigned_01char_01_4.html b/doc/html/structdetail_1_1char__traits_3_01unsigned_01char_01_4.html new file mode 100644 index 0000000..1391118 --- /dev/null +++ b/doc/html/structdetail_1_1char__traits_3_01unsigned_01char_01_4.html @@ -0,0 +1,139 @@ + + + + + + + +Minecraft Community Edition: detail::char_traits< unsigned char > Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::char_traits< unsigned char > Struct Reference
        +
        +
        +
        +Inheritance diagram for detail::char_traits< unsigned char >:
        +
        +
        + +
        + + + + +

        +Public Types

        +using char_type = unsigned char
        +using int_type = uint64_t
        + + + + +

        +Static Public Member Functions

        +static int_type to_int_type (char_type c) noexcept
        +static char_type to_char_type (int_type i) noexcept
        +static constexpr int_type eof () noexcept
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1char__traits_3_01unsigned_01char_01_4.png b/doc/html/structdetail_1_1char__traits_3_01unsigned_01char_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..983de20ca46d0dfd38b7060fe74bd4374967a525 GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0y~yVB7{|2XHV0NvFLFGJ%wIfKQ0)|NsAi%-649_w@8E zw=mEwkeGhv#e)YAfa0&tm)}1}k>+^D!PhGC-Pmgr|} zS$g~OrytW>cYKez{e6D=>uYE9@6SHn+pnpTdi-&e+4(EqC8B-j>pt+U@zna^cYEQ^ z`Z>)iUsr5Z&9waFcGEDo?4j~*L-`qZZ=4A}rq#SxD*Rad%|-cJfYN>E|Hkr7x{~aA zJ81s&_Prf3bFZDvy6f9^)cqlU^Am3`bvs>Lss8i9E}dumS>d;% z{@C8z_PF@J2D|60kMC|@)6R>YwlC_wb$sKd-QROxAF+RNdt3Fp`A-!*ZLM5CZT#?O zs=kU4!K+@KPu-^33 zsTmAR4e=ehECucv%;ex3?NfrJ_!|~_rlkRs(wQ^BWQ0N#YUQ5JEDY;@+r4hxnjTZ* z=%-hE-)>1uTW_&<+tl1!YjSUk&7QeeZ42WRpV<>G)!JYBYW_QXpJDLzzt3;(GW~q| z`?I3QdlS=s8lJa4Yy8#rSlDI#&-=UUopR5=jr9>tPYu6#YOT-NsT+Uxp0zoB(Pw^k zy|8^e$AJqvw@#gnvhzEAIPOjqFy)+zOy1rVx^4FS-jC0%8QYd!D*HWq-lI1g<8E&| z&b#_n*GAukYkHm>wWwb{eQHjx{c+33x5M(2+;8uxUc0U8O_c6g_Uow|V?5n~DaCkS zuKvE{J$DTiSjn$|- z6p}dfo|XO)&N4Rs{r%0BSr^jMzV*E>uKx|>H?Dd#Yi6x?29T*-XD$y4K_S#&1cz!N iQ?BMx6B&m3ll3}xnsnzLRg(i22n?RCelF{r5}E+)t32QU literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1conjunction.html b/doc/html/structdetail_1_1conjunction.html new file mode 100644 index 0000000..e41ac9a --- /dev/null +++ b/doc/html/structdetail_1_1conjunction.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::conjunction<... > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::conjunction<... > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::conjunction<... >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1conjunction.png b/doc/html/structdetail_1_1conjunction.png new file mode 100644 index 0000000000000000000000000000000000000000..2f83f0b43b60920eeb57a7658b7da00b9451f689 GIT binary patch literal 604 zcmeAS@N?(olHy`uVBq!ia0vp^6M#5?gBeI3Ea0&NQqloFA+G=b{|7Q(zkc1*)3e;d zK(jz%`k5CG9y|bwzdDz<6DY@7666=m0OW&#In(Sb3=E9VJzX3_Dj46+y}NC(0#9ps z-mdSz?LS6@@N`|gyfJ&m=1XPK9zT9^Fy<$wnN3PivFsD-P*GMD@O1mdc;V89ZT!}C zd(Qk9IkC*`vS=Vz_V1l>`#%3U`e06Xt(M5{^2tv+^B5&}{;f$}d-c^i@7oW+*+{f%dYuP<)2<)JhAkW;0tcc zEjf|4slHX$7hlggx$ES8%T$%0oni`;_N-mr==Dx-;|KpqdzR|EWz=t;{ABB=T>nWE zK~C)DNJ%rB!0bX%XK=N?!-D%&{uJ1{o zkoo)P!snAzOpDz3x6Iz`_<46hM%Bgg-`4%Xr7{io=5O5`{Yly3;WpiKaV=G!|4!y$ zwJh1THhSHho6!s8p9B=2diJq)N}XR5;t$nE!Tb>%UfR`Y+rNvzuki6@vT3% oO<&@{sp2`&jm5}V+M}Lf@5l8X%;y`Q0@DG5r>mdKI;Vst00V6h;Q#;t literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1conjunction_3_01_b_00_01_bn_8_8_8_01_4.html b/doc/html/structdetail_1_1conjunction_3_01_b_00_01_bn_8_8_8_01_4.html new file mode 100644 index 0000000..02ab90a --- /dev/null +++ b/doc/html/structdetail_1_1conjunction_3_01_b_00_01_bn_8_8_8_01_4.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::conjunction< B, Bn... > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::conjunction< B, Bn... > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::conjunction< B, Bn... >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1conjunction_3_01_b_00_01_bn_8_8_8_01_4.png b/doc/html/structdetail_1_1conjunction_3_01_b_00_01_bn_8_8_8_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad9da2c6813942045ac87c94d206ad0f783cb5d GIT binary patch literal 1005 zcmeAS@N?(olHy`uVBq!ia0y~yU@QT$12~w0q}}(ruRuyVz$e7@|Ns9$=Iht5dwP17 zTNr2-NK8NT;=zLlK=D`S@^%8{I7@>3f*F8(FfeDDeT9L6xx&-MF{Fa=?cCcundSmY03OCIoF$F<Etcd5Uo~T_arEXr+mm~!3 zQemBZNmX;k6g|&_b0*uJo16FXOWgex&pW=Pu9>vu)b);+6PB>wi(aRaJK>V*%0!8e zDRR%6$@Vng4e?R}d;-YBhtCrj9WAEI0o#$CKd+w#{NptIJf6Q>+#ctuY`^Db% zZ?1IpdFfxOG2wsmBlp*?8JGMlX6XE0BA#h?D_Ae5?6n?}{@}JYM zsO>6yPv^aq-e}jdYf-7;#&uua!%J4}*)yfC)>iFK6-c)6(+StJ8_syoWDk9sx*_IoGkaLcqCFm$@{S3p zzGT^bx?AP10DG8-!ryJXdn5zqtG-mI_xLqY^k`bu)=JMyiU0b(IBR$5=}#(|w?8CK zB~x89c2bk)%Sj?Wu%P~|x_3%Y)#6EUUYdIuKRCxQ{91bcL$H;D&UEkV*M9TZFJ(UR zNwnlVgxNA#TGPQmQ&wTd6g~kTFLn;KrOYgoFEIj*WH`8_q#+^53L<^_Y0*o`29_0l zQ<(6o!)eR`El|Q>uno@HZ5*^Kmwoc3TUDrFYvPYlKKSS{p&Jyv>r3958uAc>;8rh%f9s;o?SBU_N|TC zsx?{h*S@HK{hPex_BX+E=j@A`fxcC@F#2CVz0T@lZnggZ+GV%POf>IqYxaD(P1eV2 r`&(dE$z{L1|4We9OWub0PvmE?d9F(JSU($>F&R8v{an^LB{Ts5q7LmV literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1conjunction_3_01_b_01_4.html b/doc/html/structdetail_1_1conjunction_3_01_b_01_4.html new file mode 100644 index 0000000..063e8fd --- /dev/null +++ b/doc/html/structdetail_1_1conjunction_3_01_b_01_4.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::conjunction< B > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::conjunction< B > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::conjunction< B >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1conjunction_3_01_b_01_4.png b/doc/html/structdetail_1_1conjunction_3_01_b_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..09f92ca572f6e93230cf45f9afdec74801562828 GIT binary patch literal 797 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!12~w03f*F8(FfeDDeT9L6X@#eYV@L(#+qt)!78wYz zYU|JW{6BtA7YFB}Z&qjW4$NC>^5jvOmgn=SL0&Jpp6v&bT`Hw6y55tllu|u|CQMQF zbPSrN!s;10N#sd>im&Z+Mt%1>n~Qr>d#}$>`8!8{!q>$aD!Tpw*GhAbvF<96FQ}IP ze|OQ!@DEY*Ug@_+AK1uhw`Yx#uK(Yn`q}Z}&bJsB&N#1-?R;X-;(I4+c$sn zvH$Ppu2EZ6W^HTYeaYAFtju=c~eMuh{-g`*hNMj~DFYogHEy zKk=;LZuvX^>!tsFo}=n1|Ka4ScR(kXC6z}$cJlL%toI7)$e*Ui*tRe_`fuyBO$ZUv81OdOLoF<|2!HsIOIR1oK9XWQ`CBa*=}NX%iv6jlM1R7Mt0g4}&hVVX-z zSRK}j+u=qq&m+#B1=hD}{XX`VcpS#{-(;9KBoZpu3 z-Fn|j&*f8mz3I&LM?3DEcHix|Y;QsSO6#8Z(9d6!|LxuRQf1SzpP`@gykDR{Qm?m1uItkB!}GO||twTk8HoxJ(Q^4YgCw{K4jy`MLK>AJVK z?^NZUvzn%J`(MlazU_ByG*549o)dZP-nw&pH|JFQqj(GC&tKC*y) + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::detector< Default, AlwaysVoid, Op, Args > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1detector.html b/doc/html/structdetail_1_1detector.html new file mode 100644 index 0000000..88c949f --- /dev/null +++ b/doc/html/structdetail_1_1detector.html @@ -0,0 +1,124 @@ + + + + + + + +Minecraft Community Edition: detail::detector< Default, AlwaysVoid, Op, Args > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::detector< Default, AlwaysVoid, Op, Args > Struct Template Reference
        +
        +
        + + + + +

        +Public Types

        +using value_t = std::false_type
        +using type = Default
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1detector_3_01_default_00_01void__t_3_01_op_3_01_args_8_8_8_01_4_01_4_00_01_op_00_01_args_8_8_8_01_4-members.html b/doc/html/structdetail_1_1detector_3_01_default_00_01void__t_3_01_op_3_01_args_8_8_8_01_4_01_4_00_01_op_00_01_args_8_8_8_01_4-members.html new file mode 100644 index 0000000..582b30a --- /dev/null +++ b/doc/html/structdetail_1_1detector_3_01_default_00_01void__t_3_01_op_3_01_args_8_8_8_01_4_01_4_00_01_op_00_01_args_8_8_8_01_4-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::detector< Default, void_t< Op< Args... > >, Op, Args... > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1detector_3_01_default_00_01void__t_3_01_op_3_01_args_8_8_8_01_4_01_4_00_01_op_00_01_args_8_8_8_01_4.html b/doc/html/structdetail_1_1detector_3_01_default_00_01void__t_3_01_op_3_01_args_8_8_8_01_4_01_4_00_01_op_00_01_args_8_8_8_01_4.html new file mode 100644 index 0000000..187fd44 --- /dev/null +++ b/doc/html/structdetail_1_1detector_3_01_default_00_01void__t_3_01_op_3_01_args_8_8_8_01_4_01_4_00_01_op_00_01_args_8_8_8_01_4.html @@ -0,0 +1,124 @@ + + + + + + + +Minecraft Community Edition: detail::detector< Default, void_t< Op< Args... > >, Op, Args... > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::detector< Default, void_t< Op< Args... > >, Op, Args... > Struct Template Reference
        +
        +
        + + + + +

        +Public Types

        +using value_t = std::true_type
        +using type = Op<Args...>
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1has__from__json.html b/doc/html/structdetail_1_1has__from__json.html new file mode 100644 index 0000000..70e2278 --- /dev/null +++ b/doc/html/structdetail_1_1has__from__json.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::has_from_json< BasicJsonType, T, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_from_json< BasicJsonType, T, typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::has_from_json< BasicJsonType, T, typename >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1has__from__json.png b/doc/html/structdetail_1_1has__from__json.png new file mode 100644 index 0000000000000000000000000000000000000000..820588f839aeaec2ec83ef1e11e9535ca3a22fb6 GIT binary patch literal 1006 zcmeAS@N?(olHy`uVBq!ia0y~yV6+Fa12~w0WW?I0ML3f*F8(FfeDDeT9L6xzf|cF{Fa=?cCebW?Koc zu8vQ8|NsA^iZi}Ujy7{;jEgU22bwM54q6#qrK+^3qr=0|BS_Jc^VEEmr<(PXrY!&C z88q*cx@YCPZ|3#2(k^SZt26(Od;RzBAJfG^`I2+#OOAfo>{V%}zdzf=?|gLc&M$?< z8q=1P7tP;4VcY838(-es+xqrb*mu^aYyVkE*OujF>HXoo<$cL|r)B-|e{!5V_sqY% z)Axb%oU)^nzPRPt+Oz$<{ye|>@^yab--(bRDt16)2`IGsF@F_Wmd7s!PEdRs!M6;fu@{~MP zx%uz)Apw1(Eb%rlpmU#V)^D4;{Ljs@d7sj6S6bEI&Mn_=7qhbOb!kQ7)Op8ezJ2#9 zzNdPozte5I=K(L@A32-z%&N?cc3;v!Aby+qSJeaGu0(9a%FA8{NJ9$~9lV$S z`-e_mMp>U~vaQhNPA zzM_Q51{oLpH_iO<^=J0&|BCs4PSr)`Y`^~F#^$#?^{?JbnjD_`^7Q>j`TI5ZFMA(W zzwIy6`#&dM-~Uy_eEVHx_`h4<{!awO8A>F!@9*ePQc^msUm?-4DXN_39581xc)I$z JtaD0e0s!RE98&-Q literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_c539cc270c7761d4d170d3ccbc682abe.html b/doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_c539cc270c7761d4d170d3ccbc682abe.html new file mode 100644 index 0000000..2a72186 --- /dev/null +++ b/doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_c539cc270c7761d4d170d3ccbc682abe.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_fce8b8f93d45fb838eee91b696633019.html b/doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_fce8b8f93d45fb838eee91b696633019.html new file mode 100644 index 0000000..815bb11 --- /dev/null +++ b/doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_fce8b8f93d45fb838eee91b696633019.html @@ -0,0 +1,160 @@ + + + + + + + +Minecraft Community Edition: detail::has_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::has_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >:
        +
        +
        + +
        + + + +

        +Public Types

        +using serializer = typename BasicJsonType::template json_serializer<T, void>
        + + +

        +Static Public Attributes

        static constexpr bool value
        +

        Member Data Documentation

        + +

        ◆ value

        + +
        +
        +
        +template<typename BasicJsonType, typename T>
        + + + + + +
        + + + + +
        bool detail::has_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >::value
        +
        +staticconstexpr
        +
        +Initial value:
        =
        +
        is_detected_exact<void, from_json_function, serializer,
        +
        const BasicJsonType&, T&>::value
        +
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_fce8b8f93d45fb838eee91b696633019.png b/doc/html/structdetail_1_1has__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic_fce8b8f93d45fb838eee91b696633019.png new file mode 100644 index 0000000000000000000000000000000000000000..53462b119fc050a6c7a2ee34ab36f8847cc3ad3c GIT binary patch literal 1205 zcmb_cYc$&j6#rvG5HdR78*-tf>a^xm}GeNEiiULwuD=C8YBC{Gy_wX5763l-2GO5~WT*&g1tdOFGq3P+ZNJifdGw%=N?kv!2~3BRJsBx% z|9w?C%(aU~kI*0Xe}SgChp<4GaxHhT32$!04zb%n&@ocqSMu-r;*SNRn+SHD#=Z4; zC=|(ym^zd%x;svBg;C;;t((7i$otL|fFk_?OQK~-D;fDPO}Hdfgk5y_P;HS8kh!RD zemJZ13d-E>p?F<6*`DPdcTe@!lDE}wS0RK?A}w@|dkDJ%N}cn#CHs=?>j+cxx|&TR zkp~A9WjA&wI1w}I+6L<7B-6>_Z6Cm!u01QC&%{K;Ic>LBXHE)Ygi2$on;~+*G zxEI1wIZM|<0*!ccjr-6Z04fFo;u%ymZ#xL)|I|ktVEhe&mi51aqBi2p+?Cm|ub=oP-;(W5$QP_rV0m05 zYOjE+TbnGQ5NNafr6wm|sS%4?sK?2!4|A~2szO#)FllL(4=F6Ge!j4KlDQd?rzpjC zT+6Z+oXmvE?APZ%5!C8&u2ws7+>;UHa>PBc+PRRjUVxng)T__3_M=9 zHh)l{@HuaLo$1pO^P3WAQMhqoH^!cCASsW3MgS zUzAV{$dA4>AxZlV%#CLZvYf1kChp^oVvtFZkKv*{&gorUMGM--`L`innTscf%R|lA zm$#2G^E3B(hQuH%Ek85H8jGo`rvxicsWpDfJuOj@+3zJit~wjNC<)wwi<*W~lvlP$ z;>y7Lj6Tnq_~}`v z**e)|&x_%foyEIa{|CZuo`oj)G_nF)&;6okP`3(r4k9d-?Ke1ph(8z)m|i_046 z+8Z>9keAykp(7YWs4hK_)EvFUuCs{7h!LGV2PJ(AbuHPrcQ2)ri}tQ46FpEQ4=&Fp zmMU>)0;aDqyQhNO(m*?Kx}){K*Ja9@7{|oLffAjemPA!4JoW|jU;xk;hi>=z`oUkL C|4_*Q literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1has__key__compare.html b/doc/html/structdetail_1_1has__key__compare.html new file mode 100644 index 0000000..139a1bf --- /dev/null +++ b/doc/html/structdetail_1_1has__key__compare.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::has_key_compare< T > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_key_compare< T > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::has_key_compare< T >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1has__key__compare.png b/doc/html/structdetail_1_1has__key__compare.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ad456e8f6cbffad362b344d0ac0b884c44f2e7 GIT binary patch literal 1240 zcmb_c|2JC)6n{n+Y*f#*hBmX)mnqs)rKOc-WsUMmiB!s{FYQX!hNwx-i)f^WI<3u$ zXBDcc(hy%79r0yo*s4w&MB1oMSu^Te5)G{-jm5~`{0+N5-21s-&OP^@`#CqC6c%J- z?PLuAfDIH(Bm;n%1jQsvb5wW5#ok7ZGbuDO&}1^9aA9GgprAl_(9`YWr@SH6wTK>z@X_t?QA$#NWri8;#%C<8P7_|*a~B7yq^CKH?d?%k6jO5CJDX6RB@-(R8{dzU6D@Nvkz%Hz?Mg|Ha$AZ zStRs~KcOY^-x^`HroBGng|%sh5=<%n2Izhju2yqA=7 zB&fSK!;@Lk!e4Sx$J9{I(T=sh;4(N#cM5*d4sws#%3#CcF6GOCH7D&v_ko+XSVIMW zyuECEJ8kJ+2yrDtH!)O_rGN9rVpK3aHd4W2wUW78#0tDJ@1v4!BU!xWptMiwPGYFE z9rX5QCfpVx|1mQKOno|>)ss%!Jpb*a$Gnwfww}4z+GNgVYUyl|w6c1B_l2jtKs@Gg zl|=SFl_2p+JDOOiJWJ+c34NTZ_rGh_{s2>Ie69Ep3uzS%tF$~}_?$9+_9kxl(X@Pw z?oNd}qg2}YR{@Ku*7_NzWvY?RM3)g>bIN+S=fHi;M(C^1urjln)S})!D+ab zFM9<{QB%agwZ>b0#TV)wb9?TQM84UE+CFRXz}Gv{2jzI5DJ~sfI+oh+OxPo0^89ys z!|qfEFWi8JpwC7aqWibN%!o9{;u*a0nJjqO-{I1svgJ|N%v@z_QSa^1^OuTdxN28} z--G~EJX>GA&gmRnno)NAxgAoHdBbbDyuXrXL8(2ozCj6!VyCq3I2&}NK!xC4O@MrZ zLE*sLt9moQ4X~^eV1NMqyW$nVr53>g7Nh3zugxzP9cKe}QBqr=+FfntABiIX*Ba15 zlxctq+7=*E6y}%FwtyW4+WdbOY3`4Bdxw;lZ?X?X$cTLy6po-HKxA|T==%nND-^-> zWy_omjoI5-t0yqcv*8F`XsI(6RtgOwj}Qe{bxMcbvaXxks@7J1ZYbR!Ev}O1Gh^D+ zdnI8B#=+-jnxjmh47m;RRZLj_`f&oSqG12eHWk8od}Tlj@?A!^jFZUdrJt%_43w9g zcbs(>I;WRs5&xqck`me5y2^3Qh6RRy8YvgAD!pENQ0sH<%G@L^(FZ=Wvq|vnYR;Nd zmgVh~H2r$Qox0jZOdIO9sU9Lge$U=@cbtri%Vg~OkS&H8`=xL=qI@n+-ZM&*)J1JA zk+%6!C8pG=SEb!;;!{r)F|gH@vporiaOy9*wh|ztSKPs + + + + + + +Minecraft Community Edition: detail::has_non_default_from_json< BasicJsonType, T, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_non_default_from_json< BasicJsonType, T, typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::has_non_default_from_json< BasicJsonType, T, typename >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1has__non__default__from__json.png b/doc/html/structdetail_1_1has__non__default__from__json.png new file mode 100644 index 0000000000000000000000000000000000000000..01923de333fff827aa6b1d420d7a29ff5ecf5745 GIT binary patch literal 1107 zcmeAS@N?(olHy`uVBq!ia0y~yVC(?012~w0q)EHbBOoOm;1lBd|Nnm=^Y!c3Jv}|k zEetdZB&MHv@!-J&p!lnEc{_n}oFzei!3;n?7??B7zQVx3e9zOxF{Fa=?cCc%uN8P) zx5w@J{=fdCr;N2nL+tY9!rHQ>n}URUcIXJKH!#*db7mc@+ay-cIL}UnlPps>CiytP z7zf-tBHC}bWt~4h_hS9McfULY^G>KXsoXzM`~LRh*E@H4SN^V>*YCb_@5XEQ>|RB&)BHR?6d!-#Yc1)Ak$vKXTh`Zy!Hy@wRzg6NkNDxLwz!TYQ)A zM*gaPyX9cOtwsLl?*tz)DmHKXv87JURBz#qRdth(U%30YLg~-z(>1?BEMIG_`E-tF zo5SwFrjCU-?{&^Flkn=V{88Z7DK5w^e@yzG&Dr0Ude%aV@A!~zGr_{42MLX(k z=dI41^3G+CR?_;pp8qcAKG@lDT;*Ex9_6ID8THAv>WfF-CWKSkew%bw9r&@5*GS{mi)T|GLff-^7l{@P95P-8WfZ*2}rt z2vya$^y|HjY`&?|UT|5su)zIIyPbN{_r4eWcTZk1dHw2*tRc%i(ZXMSGt4Xm3QOE` z!jr7eeqa8!>Sf>ks<%BWGqdH~rJdKW%-nr&o}HE8+pm>bv&u!^aoC?TYxtHgboA}B z^kcX0$@`~9pY?3s5tYZf+vR%qgeCkBY!AN;tGiXKabC*fQs%$#Bb$CN>*{~4qWR(O z>FB@FE?>+aSn^Nrny{q&lN-POm#;<4o?SIDS(BFR_voCk1eowVy&PbS1HLUYBNNlg cH2*XFYI+=Rd?`d5nEe?%UHx3vIVCg!04Q_#?EnA( literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1has__non__default__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_2d17f33a54f009ebd0a99d19cdccdb1f.html b/doc/html/structdetail_1_1has__non__default__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_2d17f33a54f009ebd0a99d19cdccdb1f.html new file mode 100644 index 0000000..d195f8b --- /dev/null +++ b/doc/html/structdetail_1_1has__non__default__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_2d17f33a54f009ebd0a99d19cdccdb1f.html @@ -0,0 +1,160 @@ + + + + + + + +Minecraft Community Edition: detail::has_non_default_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_non_default_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::has_non_default_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >:
        +
        +
        + +
        + + + +

        +Public Types

        +using serializer = typename BasicJsonType::template json_serializer<T, void>
        + + +

        +Static Public Attributes

        static constexpr bool value
        +

        Member Data Documentation

        + +

        ◆ value

        + +
        +
        +
        +template<typename BasicJsonType, typename T>
        + + + + + +
        + + + + +
        bool detail::has_non_default_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >::value
        +
        +staticconstexpr
        +
        +Initial value:
        =
        +
        is_detected_exact<T, from_json_function, serializer,
        +
        const BasicJsonType&>::value
        +
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1has__non__default__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_2d17f33a54f009ebd0a99d19cdccdb1f.png b/doc/html/structdetail_1_1has__non__default__from__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_2d17f33a54f009ebd0a99d19cdccdb1f.png new file mode 100644 index 0000000000000000000000000000000000000000..79e6d8870bfc39f795c86c6bc9d78ace6d58934b GIT binary patch literal 1401 zcmc(feNfVO9LIn5aHUHvTbT;Ab2@X)NEw;^%;z3ZL#J7p8O|=1M9L`-l~}jBnUic0 zice6U5^3Uckf4~ZDACGjnhE|S%~T=;@=6Ja7=zz(5B;;F0|b}^-&7j;}IXbXS>yEwMmUeL!;5STQ>O~U&DO# zYHV!GR)77N&}Q@O^Aj+MfQ>($zy;M$0bubWbX52rik+6FB-I5kUlbDvSw6;n@ZP-H zg^p(+e8fTd5#DFQLhI6}$`hjPISiL*-y?RvdM!pf(DSQAU!%k6dy7H(mtMHC&mddO z=TV)*Pp~m}=?Fg^P1%sXg6yUCW)f9M3B!DayIiP|j%KcI$LizoymdaQe6Q4^8|{hp zmg@)-%E|EBFf44YqHUbU9F9o2MDjZ%LQ=5wW(g}Gow(b#}1uYY(v znf!})121_NZH_Y3c%_zpG1O$K5FvlNLCSpk9h&)K9Hk*(UiN0LYJ4Zck~zAJ_|f_D zT~rLcvwN!4E49+ryx!Qe@k*$8Yp#!OSHFA8pDx1BCi)LB9_KO=B78aL5~72g!+Z@|nO>G*)Ee2cR_)}$~!_b}9eV+ktL=jibSKYThX<9oe-@WbLRRxJyQxR$W z(4vHCFXSSGuA{Wmx>_k9!A&F9RY75~KBkPER_eq^y({@W51hR(6b+F3&rN&ukMT+n z?v$hNkssN^rsr^|Z-$!mLcDkLPb$d+^Uj&JGFfO*N8Ua%QZy&ZIeDfP2b|R3evIzjnRoHcp@5_eIby6voD2VufldcTx;@l0thVDlyGWF(B=o>4FsVXcX3)h(k7+G99T(iy{+z_@*vMO8#=qj zF=cJ*tfuvFRggkZ2@+E{<4;%_{+9l#p^F1sFa<6{t}#Kbmkav`VO8+Trju#1_4?S$ z5t-dLMgs7fj`wu1uC`QR+#)MnAh8d1cj60D;ga2MJJQ&mQzum052{$5CB5J4^RwZQ zaijiS!x#soZmkdxkdy^w*v90#+SgkLWqE(_5K6aIEHX-CRIqu;scak*l+(~$#NmJq zVbn?jIh%l)e5~s83ktbbAWob%Q9}5R{yn^$6>#d4Xv~;AjLND>)uc71~! z*wzyOGmhGiV5@qqMAh7dxMkGA49HQxwoqW*RpV4V>G2fDG=v0j(+ze0E!y(Ya&loj z>-72-`CLsGN`~FX$Aj`YtdDN~ODBz&<}85@dH)+GC9Hq8*<`TQPCaz*_s9;Dqisn7 N= + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_non_default_from_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1has__to__json.html b/doc/html/structdetail_1_1has__to__json.html new file mode 100644 index 0000000..69852eb --- /dev/null +++ b/doc/html/structdetail_1_1has__to__json.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::has_to_json< BasicJsonType, T, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_to_json< BasicJsonType, T, typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::has_to_json< BasicJsonType, T, typename >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1has__to__json.png b/doc/html/structdetail_1_1has__to__json.png new file mode 100644 index 0000000000000000000000000000000000000000..3d44d722b37ea11685a89d60d9df8ae4c02b3bfb GIT binary patch literal 990 zcmeAS@N?(olHy`uVBq!ia0y~yU^D=-12~w0dS9=Bd5?(OC3*RsDX-5bChojf-(M5G{=C@j%g;SO z&ro^)fb~$14S#*%uNCip?l5}wZ%cLWhNNGq2j}YPwUj>c{KOX*I;l4CywvUY`J%6~ zH=R84$k6lNfo!qAex6fRU;3XC^R=F|XQFw;;i^My**Emw{Es^Pt>|{S=k~0%)`|7g zZM1&wzpd)|Y5mQXiBGbBupXMWwf3~?fA2}(KkqimkBp5V%RG60-OyZev z$iwJB@Qj&}Noi)R40}}h89W#g`b5|mKHJD;@-Qs(Ok^-Pe>q%=xgj!0f}zDDmO((F zmC>OAr~()c3@jdrG!l4_+d6ZmYFb+H0Ts=OOC*D4sIYn@P7+aQ^$cndQS)TvN_?JK zSQZnrBUjG1rakrY#1NUMy>r_3HXSv;&#;`}48!UyF{J9hTDgRdI_qW8JrV zyDe)tqSf9U3z(Pd{@gQi=U3kAzcS)(NbJdcpK-%maSf+*YJ~ZMol$3hy{pNxNPPOB z`=eOytEF$9A}$wBofdcR;+`{?^Yla8Tw8k|`Fv`hf6nki)D5f7wFYd5wsnSy-ry)U z-S%HJ@}2i3^Y^0PJZ98i%VDui%yqET4);qf{~dMV&p+%}5l_zOm!=OVc-Vo<5NZyD!H*JMQo + + + + + + +Minecraft Community Edition: detail::has_to_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_to_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::has_to_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >:
        +
        +
        + +
        + + + +

        +Public Types

        +using serializer = typename BasicJsonType::template json_serializer<T, void>
        + + +

        +Static Public Attributes

        static constexpr bool value
        +

        Member Data Documentation

        + +

        ◆ value

        + +
        +
        +
        +template<typename BasicJsonType, typename T>
        + + + + + +
        + + + + +
        bool detail::has_to_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > >::value
        +
        +staticconstexpr
        +
        +Initial value:
        =
        +
        is_detected_exact<void, to_json_function, serializer, BasicJsonType&,
        +
        T>::value
        +
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1has__to__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic__j28a68f7ad118503a2d1e9663db2d9323.png b/doc/html/structdetail_1_1has__to__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic__j28a68f7ad118503a2d1e9663db2d9323.png new file mode 100644 index 0000000000000000000000000000000000000000..c650132f1b3a69e91d1074d976d78ac9d39cf43e GIT binary patch literal 1191 zcmeAS@N?(olHy`uVBq!ia0y~yV0;W@2XHV0N!f3f*F8(FfeDDeT9L6#mLjeF{Fa=?cAGHuMId_ z+Gn5J^Iv$rPFzci%yRE4rC+t4k ze6ky}|7N=#1aRJrecbcRat zY9KpLG*AI;o3=<-cN-zYyZrY*1 z?2sgy%y43z5)Z@9&>ltwV1O_@2?Htw1_;B1XrQv9)e_7OKw}wBtWBb-qOa_dvu92{ zbLJA4ny0F#*Qz8PPoNW2HMe(dRCyX^IBm(DqMq;J-?!Du$h0qfedOZC*Yj1r|7g2$ zD)*5^Xwc_5Qd{%{@{;G@Dcx>pdERJ<%@o^JpT4r^4O#=4%;n{3oqZh{F-&~ zIX^`yN$;Zb-$M_-|D=;tV`=;SaJB8y+y2v!e^=f%XUnrarowG55pQ{p7boAjmA$Wj z&70!(+_M)ggx{TBziZ3;y7IQ^Grm0jeSyVI{#Z)adFhyPfl6IZKk3KPi`8=e!n+Kz4hM~?WvyucrFEZ2Ps z`?2pk^j#AURU}@Xx=_)>_h{7r-g{rZsU4hanD={@vanHJO!nQ|T_M(c@4M~)c;G+# zx;fn^cf3sFUoE~*tYSU$sX#e*b(?c7kE3MMBIBo4Rp;>sYe&0_8+x7SkDb4J{NMfbcaKl}_rH65 z;>#T$`mRrAFMDOT&rI)V+TBlUk1qLk^O%meg?#&?tzqKz^Lf4(X6N5O{7-+wC19Ms zyY?~pUe4>EtE!6E$D5|es8vo+bze89&-2a&xz|&>*ws9Z-}b1!l>X|Rrn=Ri-8AN> zsrAGq?!T7Kt(p2!SG?BgzI5Cp|9b5@*^S@RKln|WBiCP1>Z5Y<_3}?YT08zPcA2_l zXI=Ju`>@rjD^)!Auft4Hy9~^XwP(&uy=wokI6NS3gTe~DWM4fk8DSi literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1has__to__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic__j503889e5c318926621b30ae5ed02bfe4.html b/doc/html/structdetail_1_1has__to__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic__j503889e5c318926621b30ae5ed02bfe4.html new file mode 100644 index 0000000..c78f531 --- /dev/null +++ b/doc/html/structdetail_1_1has__to__json_3_01_basic_json_type_00_01_t_00_01enable__if__t_3_01_9is__basic__j503889e5c318926621b30ae5ed02bfe4.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::has_to_json< BasicJsonType, T, enable_if_t< !is_basic_json< T >::value > > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1integer__sequence-members.html b/doc/html/structdetail_1_1integer__sequence-members.html new file mode 100644 index 0000000..d28d790 --- /dev/null +++ b/doc/html/structdetail_1_1integer__sequence-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::integer_sequence< T, Ints > Member List
        +
        +
        + +

        This is the complete list of members for detail::integer_sequence< T, Ints >, including all inherited members.

        + + + +
        size() noexcept (defined in detail::integer_sequence< T, Ints >)detail::integer_sequence< T, Ints >inlinestatic
        value_type typedef (defined in detail::integer_sequence< T, Ints >)detail::integer_sequence< T, Ints >
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1integer__sequence.html b/doc/html/structdetail_1_1integer__sequence.html new file mode 100644 index 0000000..36a5270 --- /dev/null +++ b/doc/html/structdetail_1_1integer__sequence.html @@ -0,0 +1,127 @@ + + + + + + + +Minecraft Community Edition: detail::integer_sequence< T, Ints > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::integer_sequence< T, Ints > Struct Template Reference
        +
        +
        + + + +

        +Public Types

        +using value_type = T
        + + +

        +Static Public Member Functions

        +static constexpr std::size_t size () noexcept
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__basic__json.html b/doc/html/structdetail_1_1is__basic__json.html new file mode 100644 index 0000000..b916bd7 --- /dev/null +++ b/doc/html/structdetail_1_1is__basic__json.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_basic_json< typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_basic_json< typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_basic_json< typename >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__basic__json.png b/doc/html/structdetail_1_1is__basic__json.png new file mode 100644 index 0000000000000000000000000000000000000000..7733cd2b427404a116073b2776a55aaf7c402425 GIT binary patch literal 740 zcmeAS@N?(olHy`uVBq!ia0vp^r+_$sgBeKXyGiW_QqloFA+G=b{|7Q(zkc1*)3e;d zK(jz%`k5CG9y|bwzdDz<6DY@7666=m0OW&#In(Sb3=B;9o-U3d6^w7^-Yh$;z~kbs zKlA5*{dKQdyN_nhxv}=t!sC-Sam7yf!ehMIjz#&ToJoL((JVGDPq)ja8moKnPFeb_ z@u#%j2RV`S&+-dv?*9+D{QOv2*1P=uFMFr`+m|$VuGCc%&w1CDYq-6e|NhN9vE;h= zeXkEM-^HL>tiwP5?rC+6-oGl9QPWu>q*J?Q%O_raoqAcNGE96)t+K->hR?k< zu3P(5?q9vS^OBS0iK)D*Uh8rWZVok=F6%utD|~~<^hPZS&wXn}TUGQgHe^U?FbMcEvob8gQ1qbX%$Z*TK9j00 zI80muR5wY)SMt=oGf^vpgSO`_l&XHXYTeGW@`3Z_mRxO)>rFD7J?GWt|10BC<$V4w z-M%Kq>ZIG=Oyd{n+dr0sWM{rwyD#Ni_LQ67zdm3|2>N{cC4X3$;Hzn>!Y3DIeOj^I zp!zr8sl`w7QuD4vzuLn*U1;Rt9!4eAW(b2-VR0 zvaLR{Yhn||PsTC0?vng6j+2Hn5ur8((_#-uOS;NW0(owO*^$ + + + + + + +Minecraft Community Edition: detail::is_basic_json< NLOHMANN_BASIC_JSON_TPL > Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_basic_json< NLOHMANN_BASIC_JSON_TPL > Struct Reference
        +
        +
        +
        +Inheritance diagram for detail::is_basic_json< NLOHMANN_BASIC_JSON_TPL >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__basic__json_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.png b/doc/html/structdetail_1_1is__basic__json_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..20b585c71be2f13311348c6e964b0f82fb14650d GIT binary patch literal 1448 zcmbVMX;hL~82&)bBG){kE!vDnrHm%eD2Z0m0xF}T7#7(AWl?V6xR6RI=9HS~l#Mxw zOOZ2t|CyRJv=-N z<+VM`HV9ji7Dd_#K>JU_56)KsfQ1hczm1Xs8?RDlT@A1^PhbvB86!^2EnPN@ed;0_ zy)Yf@!9ASIKQwl+V6lTe8QzU@>%!x|+Zs}Oz7`%s_IMBy1w%%cYMa1PU!cf~m`p1nZJWP|aZJIOR z@|t9Ud;Mokqk7sIX~>5)$;2$PzQS4eL8)EXYMrmhL{+8s#UW(+ zWd5<084xjx-qml4QrQ-yBgnR!3}eMC_Uv*=X6c6@PX~Q;bImfHyC_FpU66H-&42x< z$^DnyH!-H7M4WqnVT@_LnDj7oAa1+FWwQMlW?+5+Uc1+{aS-!@)7p10fT%04#c8TR zcV%aqh*p}dNV}FT0AD%H{jtYP43>UqQMl;xcdHDdy%b_yY!?+L)rUT&%;91>+{4fO zM?*T<<0l(PVlzlUj+G6=FZ%I+W$J~@AgWP@PdC8Nf-}U$r|Oot}-C3m|)=z?2IMD ztYj)G1u*l*ARYgII@`zI-qTHB4wyxTA7)f26mYbc%nlvTU^pTj>5GvVpBsoGgtvK7 z#ic!`2^P+$2uekLmjG^c#Xemh4uXbpeUkY-#}f<{f}DYxLH(#l&k zt)e!o<^fvI#24!NOxMi%`IkrcP`IDpveU17Qg`7BfP0%8;v8e4svu?I;!nmCvR$ZY;ufuP|)bf*eBLl#p~~{W-Lv z_H0q(*Y^a0PKmp(eTx)>0IN3BH$nMyg20eq%HCx#SmC%NJxi<+gCEy+OWv&~^Vz2D zD#qPjLelfi&;`EO|ytmDS%HU!aav+j=!fWq8J4-F7P#Sai9f7_{BMlr+ZVY?>-uI)2|Pe!%Et*-;1Tc>QJimj?+a zojLFN$MNcpD{4U!L0#Cs>o6p^QYv63B%rj-ci1B1{nHJ<28uwOUHXk-C&4tvNL5WA zH?@HcAP^g8c)P1t-v6Tcw|NC=Xus3Ac*1p7qdiF+qGn&FNv5pH95q|OJTCQ!=fo`# zm(Gb!)bF3WK0vwl!(?;B1UrrY)ORNPu_iQ0-lIt0dphf;cGMI~mQ;-j>&s&%!1Ij* zjU6M##}Rln8nRYU$~iWJvHa>lucFd&K^>gko0#wt?Sn_PIcu~n6FOmP&UFy7!)^Nc z?A_ZSy<=yNcphQc+=iUdDPS;m9VElf(8)eNKR1EEjwbNZrD!Vj@KlvT;k95eH@7f6 dehIKzp5xY%xPgeu;z55ZKqQdx4cqCb{sg$ZspbFx literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__basic__json__context.html b/doc/html/structdetail_1_1is__basic__json__context.html new file mode 100644 index 0000000..730ff73 --- /dev/null +++ b/doc/html/structdetail_1_1is__basic__json__context.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_basic_json_context< BasicJsonContext > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_basic_json_context< BasicJsonContext > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_basic_json_context< BasicJsonContext >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__basic__json__context.png b/doc/html/structdetail_1_1is__basic__json__context.png new file mode 100644 index 0000000000000000000000000000000000000000..d30b01452b258c0ed9cfd7181ca195a021a13aff GIT binary patch literal 2204 zcmc&!Ygm$77XG{(GR-_sW*5!yj97W>VmhQoVWp;M8ea0&DQqki6(z4JiJmBZoH0$a zd>XuDcu7m~iY0^S)X6z2T8O3~$mya25_tg%MCQ}ZGxKBq%)hgLtapEFueH8+t!M8y zAMNL9Y-nx>0Dv*d%RK-9^o_wi+CUGq9xK;Bf?$C@6Xc=QYQe2UA}J^+sCTxv#qTH^ zniC3zpkF+k@Eknbm=fR@2!P+~%So5a0RV%&DEE^=*L0*6{7muDP3~oh!$WG<1?v3cWr6FDcjnc0p1&HOWXEsMH!ZCh1q(sOWch?2)I*oFW-C( ztWb8Q@HIGD61*pN4Q{}i&eTK7@+5T4d*3(DeEcDlPrsxTtF9#4lRw`xMg4s=?;vV= zzzOk85;HJcR1?*4Xmj*Pogfura`Q{PL)2k;Sz1!QjYvmuhruhWDO_w`EDpMT$hQYg zLWHPx!tZbjWCy0E>mcbLe_IyO`YF_<2ByC;Ok@itFg=WswevO6P)@$)8kbp4I%ZK$ ztiqg2Xg;$2F77nrROjXPx0&K+i<4MsV->y=TR=le?}uAf-4wj)s(8`!q%Tk@RaQU>cQ@YJ<8sss-N{-V8fI>`5Q+%xFBYCcY4Z+Alf7Tw3Ac3R32yN&uVzgmCJ0$j zntxM!nQVU|=CW^qV{dS)fu1mcJ^5G zkH(O{_-(M~Px;SL@%D(^BQt*+oM|H#Q^!V zE`!grtox~WJl=}+fK&NoHTe#Oq;IUuScb=r&5sYAlkOa>)-`FA2)CG|THj0CG^`DjvdQa8EFiRT8Na7zq!ZdgQ5IgLGh@a7;_-~IvTDbKkw zk9eWmOFj`im*CS>xLrfMMY4uZB)!fMbn|ZSVwt8$kZEzg2hUN_xLs$%E;_VLKTJEt z|EbOlevlizy1dde&!13}V)5DIs*QB>Wlu+cQg!WZI3k2(Q6YPErK+LtDs{dq!|M6n zZT2QvjZZGLdUHJ~5NZ;>2Ex)v3*S3?Y9w?z4>tJ%Lx}yGxvS*G3;d2<&lrDwy!qGxy-w9 zOG}gVupC?qE87u%4HidQ!NuYmKDVb9i?3dIe{3PXMP5CUml;U*wcerTk~7ZlDEkl; zNH=Rf+}Rx>tuA>y9z*`~!HJkisA@OnZvG&b$G{G^e^qEUbM;w8rvr{7FHR4=AwG({ zA#R{hrAU)>s)Ai5f`*Rod@kPuD3md;&LLcNd~PF%E-A zhUlTX$@P0sY{!-2b|}9A#weUN8wjd^VTD8=@RbJV!Zh1pK?=`He*OFC#at2n`dFpDn{ssvGJ9HliE?NBD7r4XSAIWg6FZdgqvF>}L_Cg!mn^ ziX-gs|@zaBgi+g8TenZS*nKA zmTvL3wJ8no-d9@+*D(NmmY^p913)Lj{}BYxu>$rFWotb)1G*=G(6YxmYez;)KR}B0 za)9rF`!=zl)$QfF8?6UC_!aXISVV)2ip95g#H+u%UJJpf zk*cFr=3qYa_T!&%%>1ItuMaeVvZ?H>9{TQquY?Qm*?J!)f4*y$$fiY%R#20biDTR9 zq$}ao_=5MrTlb?o3Ue`gK zR(3n%Ql&=OO^cHt^Qu3^M(||Sc7x52#r>E3mKwUSJ!d-qBF;)w`qodYGMhFzGB@~b zfIBO;A8(PSZ&~XSFTG#yjoALGgF=Icgk7}5qDhT)vS3mgtM13M+GzzrxSVUA66awO zuWnkW)FF3RW;Lep0usdZ_Qbu%>mYLEQ8O+_*qf+TA>nfx52JW>#W(hzNwRa zept+KLToJ+sB1qR>SVCQV0a%# + + + + + + +Minecraft Community Edition: detail::is_compatible_array_type_impl< BasicJsonType, CompatibleArrayType, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_compatible_array_type_impl< BasicJsonType, CompatibleArrayType, typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_compatible_array_type_impl< BasicJsonType, CompatibleArrayType, typename >:
        +
        +
        + + +detail::is_compatible_array_type< BasicJsonType, CompatibleArrayType > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__compatible__array__type__impl.png b/doc/html/structdetail_1_1is__compatible__array__type__impl.png new file mode 100644 index 0000000000000000000000000000000000000000..07907821c1800be1f928e20d273cd81708b01ecc GIT binary patch literal 2120 zcmbuAdo)|=8pfkKCvDFmji#g3HVi6MUE0(=Ep<3VjVcbtEwrgK>e7^wxE0e&GH59+ z4Rsq-l~n86Oav`qrtWnq;*!urn-CF0NJ`EQ^Y2+});jx-{XFlxzvo@w`quYb`)5}d z2c>;#`#>O&657$u4FuW+0X%7sBJlPaTptJIh^w=Qy-X$pET7L$PfxEfH`c=)%I*2g zVzGceuP=fMeA|1|&BYxA)Z35QuKZyT2t0(gJMTeISS(;>@y++x=Q@t0$YitV4=u?j z5fO;Q;AeHTu@H>5&5wuaAACaHLMiBv)_FAACxIcAfWzl@+?IQWT(senQ^)Z}YkDZ> zDnC_bPItks1TJ1wi7NYd8nJ(tJ-T<|V}I@MV(A9{%eNRYpY&yM_43NZ)TS9vyfQH9 z)osR)!S{=rE%{=z`x&f~g^06Cqm)~1?SU;c>GfgaQ`IZ*m*BRq36|$XDX+h1aT;h+ zqhYYn7^TdMeQ3lZ^_t_wnCc93BTptf2;|HS`U4oQ%Dd8+W~BChdd4NWo`VtRU*Wni z*0!S#PgMni`7_Hb!Pa3Fh#+8L;+u#hedXD=Q~o|S`ym2B7EM}#M!lh3khdbmm*oO1 z1p2Bp(ZJ4WP!t@6V4Gc;9g4}1aO+wcAnj$4hC-G9js5#USp-mKa@a2lHYyO1imNjU z9fqX^XP6bDaH7?k~$l1pgP8XGqr9qLR+V=OdyGpPknWOSPIG-7uW-S8C~M z&sx?YN8jj<{IGR)ALd+{d-;>tG0MA@qcNfN)O@; z!aeJ@_Bpqcf|x4YNg_MB0A@N=VRL)S_(w|Yc*FRTYDrSFMa28q!I>V1Yic9mqs1`k zX3$WK)9KAQ14za@>v{GKJtto^FLt1Ese+Z>&4Wi*iE+65vATt8w#O{bTok>U!@^KT zQM)&WHr0f$qPU9^Yq!)Tk#S#8&A%W7?-$ul7Av@T^M=RcoK0YRqYdoJ-tx8lxYbXA zqStG)_tU64A)Za69@R%9$J9sPu6n$mmSS^~u3B(V>UaCW!VR~75I$GoG>CLHj(3O^ zEqqM0AG!>ucg=NPXi|hi73oP9kaw~KQ|8cWkaE{G81!|iJ8H7E@w)(Gny`Z*d3>@| zw4{izX0&U3P4TV?My852h=a)_(wwAbjd%mUE|#NV+kc65vXY`egekX0jm3yXDmAv4svcJ3x8TW;OogZrtww zCP+i!FJt&y4Asx@1E-%8Np(~;3=YmBld-dJdz@7ua)0oETnNUU*lEPfa2sD)Pt&j~%I}O%S6pxPifI-_yy&m3;4D**EY) z$Yi2aN0#BqEbQHc9tvQwo#qY7t;)ASBO%KEH)y7HBRQKsSrZ+;E11(RQn9(M#M6Zm z!wtfhfFq5O(nc2%?xOK=kD9z68vSNgXA%!q74eFlXWl&Fc?E|w}-FFD)^2QxqUGzKfVCcLvBM_P=7*hhs|};w5h0aBwT8WNVrGMsMCe30c$>;?b1t ze^(M0vn=WIg?B<9h=hcOa)bM-k~75CX?0$uDYpbmbx*y5;GyAhh>i3^|5?Gc{tdNo zG?ccLQN2b(g+-a8+e6?H3KgBEh?_|tdTOK3#_>`r&1S+A6Iug`DA3w8YG8;bo>1Y$ z%`}lc>a9muOp9u;etj#K?j+nQ!Yn2eZ!Q@W>rj-EHDJ1t8GBkRC%UDrCN*bcGg zhuMtud+VEq@SYxRWS#7%j@x9i_I9DKBbVjCU>))guk|6h-5gDS!`!r+)US$+4MBKB Teal1OpASOYyV$+74gBf9)zcmf literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__compatible__array__type__impl_3_01_basic_json_type_00_01_compatible_array_ty5a05c25fff6f823ac88824a10a386dcf.html b/doc/html/structdetail_1_1is__compatible__array__type__impl_3_01_basic_json_type_00_01_compatible_array_ty5a05c25fff6f823ac88824a10a386dcf.html new file mode 100644 index 0000000..e69de29 diff --git a/doc/html/structdetail_1_1is__compatible__object__type.html b/doc/html/structdetail_1_1is__compatible__object__type.html new file mode 100644 index 0000000..a433bd9 --- /dev/null +++ b/doc/html/structdetail_1_1is__compatible__object__type.html @@ -0,0 +1,125 @@ + + + + + + + +Minecraft Community Edition: detail::is_compatible_object_type< BasicJsonType, CompatibleObjectType > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_compatible_object_type< BasicJsonType, CompatibleObjectType > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_compatible_object_type< BasicJsonType, CompatibleObjectType >:
        +
        +
        + + +detail::is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, typename > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__compatible__object__type.png b/doc/html/structdetail_1_1is__compatible__object__type.png new file mode 100644 index 0000000000000000000000000000000000000000..16e66f3d390b5232fa99b4536da384eaef4dd0fe GIT binary patch literal 1991 zcmb`IX;hO}8pnehBZ!<-76pMB6bfpg5Fu5zfy1IGp)6sMum}=FB!txxNP-|51co9A z4I!k8ioDQ(M&M0p!fI(*5-Q3&Fba`^lDrVD5HJalc~3vgoSD;)y&vvJ1ZC$fD`aVG96w>aonBNl`z z8Erw|rBfD73O}ce7$kv4)x*&_emT7z32lHXYT=@VJd=946;>xkiLi6TXk!jisJWiJ zOyVuL*UwfTs!Ioe9)i0VGKcz<-)EGs;PHy4WlqT4b+(wovgr~B1jw)f{x zqv$@dsK24Yb+{<`s=_c%>jztK8#u8&rC=xdfka0V-nS8;Im% z2zlrGCPWa}_ooQ944~w?2jj;Bs*XC8Fs^xfAG8H;GLR~U=--+oM=a-%xA7k2=y03q zU2aQhKHhe+g*XSZ-2GH};$h2Y4_Ek<+YNNfV8TKvt!%2@$q;Rul{)^=v_%2#3ts_$ zRM?4zRVLx+O0Qb}O-3ldZ^%196MV8!s3{^{p1i>ZXRfi~1nW^62NSPJo=kB#KY60F zjPRp-)8v{;iRphzNArb8Dg zKvV71G|;>g*`P0i-FN$Zi|4 z)exYTUpA~u=EFO>1Pw;4&FNV2y1LuVOL}*+KD8!KbS7QNkW*f18(;nKWS5ritRY1D z_yN^3TRx_GxKBHmaf-G~@bPwUj5&y|%w$J~u?^7DMOr?(a=W6R9^!l>%y^ny3cD)0 zC+0J(sK#a^`EgXC{zkqrg!`!b$X(n~dxK#BRh(=4^t#gSu%+WOY`VZC#`^;t=KMB7 zqlFmaYsODK|8KLx76!w^4a7|xFMg0*=ek?cwy68p9TI=U>ujNL+pz*Hg2NR`oL)Oh zgaF}sw!1&&qWDBZ}e4B+Fq>C_fUd@uOV30L0>fuQglZwdVw)W5tNdgLE3(kmN6uMj9zXI6t~YkSE-$ znvo`H^3Bveq2x|hJ-h8!*BSR%j?qZWV@mz(VcrJdEQBWFd9i9(Nuzi9*+f6#@Yq@Q z7n@xzf@;1#U@u6e8ofbSxQ4J0`<_S*UGg+15);b7IwsY3eUlRzmg(+GT^`iDBZkr~~YT p&1A$aUPPj%=?`7>pD#kA6~S&`?s>wxjeNPN(>^$Fu2)>)zXAE=0s#O3 literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__compatible__object__type__impl.html b/doc/html/structdetail_1_1is__compatible__object__type__impl.html new file mode 100644 index 0000000..7ded237 --- /dev/null +++ b/doc/html/structdetail_1_1is__compatible__object__type__impl.html @@ -0,0 +1,125 @@ + + + + + + + +Minecraft Community Edition: detail::is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, typename >:
        +
        +
        + + +detail::is_compatible_object_type< BasicJsonType, CompatibleObjectType > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__compatible__object__type__impl.png b/doc/html/structdetail_1_1is__compatible__object__type__impl.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd17d46497b37d48c0360c62edfcc6083d05396 GIT binary patch literal 2220 zcmchZSyYor8iu2sjQXK zutzo3{-y?l!8DH_!+6198<9|)zF7sTvm(7#p+?8U-N!|#R6?OdBFW0is<5>%joDSm zogNz-gT`mxU2cZvR0&>KZy417UTiiN_rhSCZH{9O`y_0bD-m4j*sFor`k?ZdQpq~> zV<2UNAlBHASwxICIj=*}V*h!<^l|6oyFks4Ea5pKsZi_&HZeKUQX|x`FpR|ChLlR{ zm=UV#B+{U;-a(a$r%Natd7K9&XD!r0n|dHFcwBm1|0e5v;NBWX&RNHK@k`E#tR>LT zJ$l~p!GKhn+*@|TB{uM0biePY9cOJOK%bGCq=D=M299>LOdJ9UUzkj#XL7f}d-ep` zjLWaEG%5plPrcfRBxUis7OEuzb3J`hKb}f2VXlrYv3CPiaFEc{1uh0a3r{BZ8pv;! zJCDVp9^Fe8+C=cTXD>BC!bM0Zl@8cJ$6Nme31#6os-UnNybPecrmod!ea~yv#P2V% zm4bJ@GW}1O%CBtbtdXcY!E;l8NYUtC7$|Il<=*gZ-{=ItBlSsFhv7h2C+vv28ce%$ z8xpoZ*9Zj*-QxxgIu+DHN>uQMJu0|w@;VB%L8z+w|41nDJz;tUx=x8pMtZIxFuAe~ zi9lSzgsM{0Hy;G*C@vVvZUn9!0GzYatJSEVBR)qpH)Fbgdes}hBY3f;&=Z3Zy_4{0 z@+P3%YwcIZH}&TQRzSJD*_9T_ZDZfFEo3LYkRL&j?cP@@4x#|Stn3W{gow1~|am((K*P<^KgXU)b5$zQP-hxdZI3jkLc;VpC@DsJ37g$qn zqZ|5a@7JCEqMTX~enE~Cp9%Bbcb2rQHm2SO9vu8vN37oOXe(0OGwFJLkZd>lHcn}V zz%^${UWz-T9-^K4+B6y0+l=b;Ds(Dr$n6O~<0At4DxVo%DxleXT@tKZwtC<)eP+U6 zPYCA;HKvE`H{4-NSK#LAh_}nQk|pgRPl1bHV1wK7%VME?aVk9!-4;W*Bz|Do)Z9!CpZW8dH#Q z0DNTL`VUsj@^*0cG>z)wml1cBpri5rLd&U9mx#vc;9`0}&8H?U0h_0NVAy=7yLmjE zhwj@ok1W1JgjW-D;ncSA9L9&5H`qZPRQAHO)via3Cn3>|$2>F{A4(O%f4+N2=N-3m z@NE1;x8u|8vWTIo)$zLc0$MUXM^sknI>aHG#R55=CB$0L?C#rx=Vb}Dm-feXiu1SS zH4NSlBzc$lN<`xM&x2@Z-SX=t#4lFjC)Uj_q()HZjLOtAxXNjU4M<4iZ(2B2$ygkz z>d3HjjemRikIKuZX)FMkuz#T^`%N5f003yRGK+Xi`S>C+QTJo)Q!E0Z64*YmG9GVw z=v+EE9m^lKPzo~^{6NAj$6xwa8Ma*7z#d?tRq4%S9cH(tx?-}vx`7XM9e}!@!{Xdo z*nDcny7hO{b}0M*V^mZy0%33zQ&5}!&C_lm2Gfbii)WYL^_uiLkyohhL_QY?+n<7h zm`f>r`Jw|Ntol2JgbHVWSm!tFcAfS3zq9yX&j45>m?P$w4Ghc?nO!;5;-aF9;l}*J zS_{j39?A{8U(^*|V1(jwLoGSmkm2EVMPX|&>U(9waP=u37yD&r&WJoP^gGUg(~Pp|mXdMM%%QCBJNckXO4*%EmM|6$P~Ewuv$qHb4pwJWU6=R@S1#CCSFO(wkB0NKdbRpTbR3p)obt@ zFmkn=M5jiMUF(4x{@rz-d%{#Gsm?@hVY&KzUx{x#CZJBeP4wpQizZ@uji}oYf~6A^V5n3!vb0D+*$h< z4r#Q~V&DCiiS>zwySF5m(}V%hWuIQAuokLzZ%+!hUehWmZ4O?K3SS~CTy6E{*TB|f zx>6*Z`1SlqAdfpTPc`&^JAFUX@mA_LpDpRv{e{njj3(h_n-wBcI63uY)8b>rZJ&)R R0_a}>JMMzTJarDb`ESAVLC*jH literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__compatible__object__type__impl_3_01_basic_json_type_00_01_compatible_object_c9788cfc69b1e1eda6ea05aee660649a.html b/doc/html/structdetail_1_1is__compatible__object__type__impl_3_01_basic_json_type_00_01_compatible_object_c9788cfc69b1e1eda6ea05aee660649a.html new file mode 100644 index 0000000..71bb0c0 --- /dev/null +++ b/doc/html/structdetail_1_1is__compatible__object__type__impl_3_01_basic_json_type_00_01_compatible_object_c9788cfc69b1e1eda6ea05aee660649a.html @@ -0,0 +1,163 @@ + + + + + + + +Minecraft Community Edition: detail::is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, enable_if_t< is_detected< mapped_type_t, CompatibleObjectType >::value &&is_detected< key_type_t, CompatibleObjectType >::value > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, enable_if_t< is_detected< mapped_type_t, CompatibleObjectType >::value &&is_detected< key_type_t, CompatibleObjectType >::value > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, enable_if_t< is_detected< mapped_type_t, CompatibleObjectType >::value &&is_detected< key_type_t, CompatibleObjectType >::value > >:
        +
        +
        + +
        + + + +

        +Public Types

        +using object_t = typename BasicJsonType::object_t
        + + +

        +Static Public Attributes

        static constexpr bool value
        +

        Member Data Documentation

        + +

        ◆ value

        + +
        +
        +
        +template<typename BasicJsonType, typename CompatibleObjectType>
        + + + + + +
        + + + + +
        bool detail::is_compatible_object_type_impl< BasicJsonType, CompatibleObjectType, enable_if_t< is_detected< mapped_type_t, CompatibleObjectType >::value &&is_detected< key_type_t, CompatibleObjectType >::value > >::value
        +
        +staticconstexpr
        +
        +Initial value:
        =
        +
        is_constructible<typename object_t::key_type,
        +
        typename CompatibleObjectType::key_type>::value&&
        +
        is_constructible<typename object_t::mapped_type,
        +
        typename CompatibleObjectType::mapped_type>::value
        +
        Definition json.hpp:3797
        +
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__compatible__object__type__impl_3_01_basic_json_type_00_01_compatible_object_c9788cfc69b1e1eda6ea05aee660649a.png b/doc/html/structdetail_1_1is__compatible__object__type__impl_3_01_basic_json_type_00_01_compatible_object_c9788cfc69b1e1eda6ea05aee660649a.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6fcdd44fac0c0a5ff91d0516e24b94fc243aa4 GIT binary patch literal 2191 zcmd5-c~p~E77t(xQiTdmMG){<73s9HNSi7KWC|0(uo$R-3glpg5|Us9!V)ko@vs#E zDaaC19F~Md6Axg5fh17C9EME^dq{$%g4w`@uw`MsgxWK6&Ybys-XGuly?gJw_rBkK z?|ykf0nojs)}|m3Xs_>iZ#W3FO9J2^6C>b@S3X|`CYvBwh|l)+HUMQZSwTSo^=oIx z8&>5*ujc3H0l9Pp^90cCPJ#yngMhVufDK9GAdrc*ueVo7s)2$mNU!VqWY+~SU!x7| zvaETw``52WJVky>iKnfK+s7^Xzi246@N+y?3imtFP#Watc){y#{b66PlB}a2_+HMf z2+#x5l6E^6G9WQ6*?%++5`9Jw9M6xX_ay-m$Mf*wdS$Kz0Aqt4=q7Y*8SljiX7G3^ z;L6h*<^cGM{Cffm`BT5nT*5s@`5DmA?`NQ>H#O<6WN%g4%+4h(zHXRKirO#UOW&2oq17AvP^!er%spaLtc*L-z)czQurmq!=PP1 zY~S_-8R!7$(S8@(b08Ct0phe)ohJnu>J}~g_y&OPW6-^YZ;~$lp?8TsqZ1i+=l3Oo z40M};dV&mf_CWLZ^bKz<{h>?&o4aRa?VTGTG+UFhOZ)3EtA{C=*{BZnB4-*CXb@x z?wMpjzv5@+D!1~t_h{cteBP@}m&q0428{yYuGvgJO;}Ng8YR(PSIcf}Z=RsqJr;eX z*uYcpdz{DHhUrbs5v`Kf!}l_d+(DNgI*zR^q^+`3TT+nBis1rQL)CKeOrDEcL0wS@nSt;e{;^sdv1T>oofx6>>fWL8jNAYpnc8PRJhmltCP zS2H1F-+we4mxAdLf2LB9Q>$Uuir5S%lZ?dfky!SwieDbI{1T|7oF}QQ%4I26WdEW z&3_+x2_EE-mp4q5duguCW|7t#^>bni`CKwlLi6ZYymSz^b|T|Ci$&a0v>l9PR9!Jh zEK4r4tEAB$o373-Z+%G^UxzW>)p`Edil<4z1-{iyb(g!-$JwhSiTNpMXs2WR1Ge46 zl@{^0%I^eKqbE0PV#MJO(r&XpWR`9bLqE`3aq-zx<~SY@5qI{ge}>6*hiq+Ui@JK(@V@iORbWqbA%gl#y#EwiL#4#03o8?-g5^1sXHj|1 z!4O#+A1G5grEQ#hwS6FZDBDxI9bzrOdHVh4ZJSsor-~tlXoSX8t|%V3l1Zi0?vrs# zpQsFEpIocdPFFJNV`+ z%>!nYHCDgU*8+osYBFt?-efW18`K$dOQFb`32hvvU2fzJY%VCt-E@+A`7Wk1)J*?8 zX4c|UIXtHp$b?1~o8+uE|2A=2+H?k`LN}%`(JR=l`IQnjnhXA>hwC&=g{?P9jq-kx zU`74)*E1J3ZdI+l3qd%8@@!2OBIa_ZW|O}i+Dg1gwAv~)ln(aKbWzTN7kV>Qc& z8doyf{&iAOl-t?Vv#5j``+S-FHA6NUJdwe6xU~`2rm+8g?hpsU|IX8C9sHrn^3PUe zEYPO(B>^o*-=}~M{k~xVJ$mMk&NcPvpXT)c@`w11K(+kKL|zz{2m*$$Pk=Y=Z-}ga E0ZzO + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + + + + + + diff --git a/doc/html/structdetail_1_1is__compatible__string__type-members.html b/doc/html/structdetail_1_1is__compatible__string__type-members.html new file mode 100644 index 0000000..100bc95 --- /dev/null +++ b/doc/html/structdetail_1_1is__compatible__string__type-members.html @@ -0,0 +1,109 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_compatible_string_type< BasicJsonType, CompatibleStringType > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1is__compatible__string__type.html b/doc/html/structdetail_1_1is__compatible__string__type.html new file mode 100644 index 0000000..ff01b3b --- /dev/null +++ b/doc/html/structdetail_1_1is__compatible__string__type.html @@ -0,0 +1,149 @@ + + + + + + + +Minecraft Community Edition: detail::is_compatible_string_type< BasicJsonType, CompatibleStringType > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_compatible_string_type< BasicJsonType, CompatibleStringType > Struct Template Reference
        +
        +
        + + + +

        +Static Public Attributes

        static constexpr auto value
        +

        Member Data Documentation

        + +

        ◆ value

        + +
        +
        +
        +template<typename BasicJsonType, typename CompatibleStringType>
        + + + + + +
        + + + + +
        auto detail::is_compatible_string_type< BasicJsonType, CompatibleStringType >::value
        +
        +staticconstexpr
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__complete__type.html b/doc/html/structdetail_1_1is__complete__type.html new file mode 100644 index 0000000..8212c99 --- /dev/null +++ b/doc/html/structdetail_1_1is__complete__type.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_complete_type< T, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_complete_type< T, typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_complete_type< T, typename >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__complete__type.png b/doc/html/structdetail_1_1is__complete__type.png new file mode 100644 index 0000000000000000000000000000000000000000..81bd96baba22c7073aeafc57343d4eb6cab2423f GIT binary patch literal 797 zcmeAS@N?(olHy`uVBq!ia0vp^?}0dggBeI3GrFV=q@)9ULR|m<{|{uoe*L7#NsVc)B=-R4~4sd%Enf0*{OP z>@$DLL?$19ffA%c@TjQsF=yqn%9<`I&CARA)X8vez+5GG5 z?WbYa<$vk!iTqNzRc(swy)IkNxP`M{?L22K`r=cyMt=MSSJ{;Ho}ZZRURtm9b;kA0 z^PgyUm8w)Oe7AqU>Al|HyFdI}{d@P7SC{7B?XCUxpsK#_`h)#n(221BNh!N$Rh&KZOOWADn;gT1iB^wmZGJJm z>nT6g%R_w7;lW=GH6x!?QE`aAbmo#lIf@9)`PpD#cC)9qRJ=G$|NPyb~0 zK7Cm?OYYlqoflob_fNG}UzxA^QfclNiKOXEY^Tb8QWxBR)cSi<)-S$_y$^RudIY&n zwQuSF>~*Qnud?K>+a$l2veKS)cMfWM)`!A_(e&f2nO_&{zd4}N!O=ZC7nqP4JYD@< J);T3K0RW3Vq9XtR literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__complete__type_3_01_t_00_01decltype_07void_07sizeof_07_t_08_08_08_4.html b/doc/html/structdetail_1_1is__complete__type_3_01_t_00_01decltype_07void_07sizeof_07_t_08_08_08_4.html new file mode 100644 index 0000000..a735ea9 --- /dev/null +++ b/doc/html/structdetail_1_1is__complete__type_3_01_t_00_01decltype_07void_07sizeof_07_t_08_08_08_4.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_complete_type< T, decltype(void(sizeof(T)))> Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_complete_type< T, decltype(void(sizeof(T)))> Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_complete_type< T, decltype(void(sizeof(T)))>:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__complete__type_3_01_t_00_01decltype_07void_07sizeof_07_t_08_08_08_4.png b/doc/html/structdetail_1_1is__complete__type_3_01_t_00_01decltype_07void_07sizeof_07_t_08_08_08_4.png new file mode 100644 index 0000000000000000000000000000000000000000..f319d41b3026bc3f9adaa4360cdf14a210f99b33 GIT binary patch literal 1431 zcmeAS@N?(olHy`uVBq!ia0y~yU}^%g12~w03f*F8(FfeDDeT9L6Rms!EF{Fa=?c9rHt1Sdr zvg7W2{vW@m)7PP4L-P~UQ+dAw_6fACxviBJ*V$npDEK__pNq?kj*ia)lTuV(>MU&n zQ(*yYSXEaFYHN7zjd1kLI>O}@q%W>*@%P83wi*8X*Gw

        n}0_Cyz^`2>U*yRMR+nTugw$<Af%=pJY zuTB1w_0j9naS4}$%`(^5e_kLMcdz3$SKZduN3Q$g^FC`oj=ei=Nxz|wa^1=Y8wBH4 zC2T#Pckj-l6x$?oze#rI1i1E{DtyDCpLgVR;erI!+eZ6u<$C^-Xf}ByZpkP6kfHa- z#EV|r-|q`>`Lg5Q*SXbQzi&_aV#t3HV){PesumFH52>PwSm zmmkwb{!|6-xA(3Adik6|QcL|7ECzijdK+dM8kiTd+`j+1%hD$2N+^nL|F_N z#1mN=c@DTnIFc{?qhDAsQAz0>a{|Mzjx#=!XI6@7b6n^bJ#!}K5Es*zWL9J2*&CV| z{ze=;b4G2Af`fgSf$?Tepc4Ou4~lkK&DKA6GivtR@4`nPPo8-+aQ2Ieb#Lds{Ppkr z`Mrymzu#}O_F-Y%Y@mBfJ~|z|{A{o1!B;DSx#Vtr?Pk@PbuNDDagd3{wjJ)L?!W)@ zY3u5y)rU-`uAD#d@{RSAE6ib zvwKcgXmfnf-@Ijc^^ec@)}B+^Y;)~v%Dq#W&C4sZHm~izp7o|=w~49o^yKXadSd$i z#KWSSATKXlg^cQ`f8$R&Bgb$#b%u7BV)={lEQvCrFeN#}~HFZaCW(&Jtua_DWxqPOo@ z;%0rm((v7N+qwrbO(0G2tl3MGH_NK8N?2Our)+jK{c_vLldfsIe>N9cX(T$qBRv)J3j3h + + + + + + +Minecraft Community Edition: detail::is_constructible< T, Args > Struct Template Reference + + + + + + + + + + + + + + + +

        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible< T, Args > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_constructible< T, Args >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible.png b/doc/html/structdetail_1_1is__constructible.png new file mode 100644 index 0000000000000000000000000000000000000000..cf97deb1bfc5a952988c51332aad12bb770ab591 GIT binary patch literal 840 zcmeAS@N?(olHy`uVBq!ia0vp^r-3+tgBeIRv=lZ1Dd_;85ZC|z{{xw?U%&3@=~-@J zpjjX>{mhF84;}!;U!BX_36$e33GxeO0P?}WoN4wI1_q|fo-U3d6^w7^-tAj$z|(Tv zd~W4`b-Nr+6*JGqto|pi6OD9Rj{NAZ-_bhrrZbE3N%xFR6H@Ga#U`Cuej@1Ix0BLK z{w_WJ#;VQROIRuLcsP5_F{er5rYV-@($C*ovum9`e{s+G^oiZw)|-o(Uf$ty0u;0bk$z@_D0_=-hJHW?t8B`gq>e;*LRYi z?!x3kzb!3yWxnK1c3Zy7sHwEcca!AQrwM&3dsi)-kZdb<{$6sX(2F@wW1r9Wu6@sX z?ulma>c2BsH0p^%CFz_#qONS&u%FRdDljjy+%h{ zRjhZ_wA44Ws_19J1ElrnnKzP54gc4RGuXKBCspp9$NX7g8tYR-1OKF%wLA<)S(_Lf zfMLgQV);oXhMy*p3<~qrxEY>YPGM}QnWe)p!GAI3GiMGvN(IU}buL&er%PsFzVUbI>W!b)>|Ro$;#nF~`&RR`ZAWN*v8*Ikx;_)&b-iT4bTCadP%<*!RPzxhXkca~eK + + + + + + +Minecraft Community Edition: detail::is_constructible< const std::pair< T1, T2 > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible< const std::pair< T1, T2 > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_constructible< const std::pair< T1, T2 > >:
        +
        +
        + + +detail::is_default_constructible< const std::pair< T1, T2 > > +detail::conjunction< is_default_constructible< T1 >, is_default_constructible< T2 > > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png b/doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ecce83336bf2c26ac4c8f9dbf91149ade7a5d8a4 GIT binary patch literal 4478 zcmd5=eOQv&wm0+iO&>N{Dbh?c6;!0j%FNUzeX~K0J~bpn#4l8&PMKM0r*XlZs`R6cm5S75xa zyZ+?1=M(hW`8%jrR(3h>I;DYing_T&fIo=VB^k_#3tn^in&&~xe&}1wGO+3Xf|0%wQ$Ki~nNWR`R5jn_f^ptmw z4tgT0hi2Dr^S)>>N9|2og%*^*2-gk-=c!bK%7>49YaXhawb7JNR*XLswTm%tPAU8G zkU8fbK^smhMd#nMvTQ2N;=E{2H#u6D`$+{&$MEgUdtQk{D zwPn#Q_avOqQc>!%vOg3&Hbel`jd*41Vug@d{BsS5v-HZ0$^HUI6w}52_2|cc4Ahkr zye6)fwbREL2*h+G_>r~;L?RGRZtx~>i!4^KAt;H% zaZQn638VX;;vwi~4#%el>~uB;+gf8N3uyr-2oJt*e>6sq*ZM`bUlcuVL-|3p%YByy zzH`V*R)xr^1lI`&nl^6tHY--%OO|2-RQD%xQv#Tei%-aPC)WF@P~wV@#HIXmb?J_i zH7M3f61T`*f0#lTlCUGHbJ^!grn&*n;Ybr|!R!QMo}z5HV+wZ|*eOov#QP8gMN-6j zTrhfnSNzoWarDb~As=60vxDgC2X4@nAftxNs5X7R=t^=xw_k&5+?ttjp`@MAP&qET zj2kPk$oFX*WLFNGW=K7+Qz?)zf54Vi-Vo74o#tc(EpvJD$)3YWOop+`Z+&>MGfX$i zx)%T4?Toleb<=!CMX+3{>*$e}9;tnDR^WO3d6(%lbrYK|miW-y?C+hs_oHL$_yt#O zgotcq37NqVn%fnTBRm34w4cS(^MSl zctY}&oDmY1-RDwvL&D)y-0-|0-n#>hX>N&Vxh+97Wxft~2;nl@ulUp_Om1pCBl20i z5gj8t`NrlbQG(w}lxOrk>|ghmL>UuwWVjyH^te8=!?@hBvujL0=U^-gm&rmuH)^8S zf#9H7u$wz}RtXYqPIY1&w+50heY|!j7Fo7gZ83VTcB;#3tT{;gqYtwmpy&?B?37*Jw-|h?dEMuk_(Bz@6cZqTT~TqlozdXNzdO@UCp-HS^Ikb z*&4iO?zEh-?)%u^9n<3iX%D%1wH1bnnIxR!R)NAgSO_Oqu;wYMgZ36*jY+Xht#qtY z-4S=5&Wip1F(WN$$OQMb97E7^bxkUrNqeF!l&n+?m2a{I*&*<^rfe!gJ z8#W8r`I)HEzP`SV0x%+BMo7bg&>N_o6pkR&RbJy!WGHAe>YDyp#89N zsr!28rE^N(jGiC3QgcEtcWqdhY;hAv%YRV8W~7rFEa7Q;qTz-gJ-m_dlo6!S+jK@a z()cxb!3#@Ncld_F-sL~}L{xY0|KgxO6#a3`zZ5lqwt)~!qtVby^d$nZAMf`6QX=3< zpr~zMQuD%5l2!>^bSVRjiVLT9_~}7AC({`K`fdVu{NSI#^e=B^To|}sVe+Z^K)ag) zD{fnzOZ19GoXMpk=~8A%KLrQ1n&_tJY3rh7k7zORcd#Y>yc2Q^s~tzPYA@?*!By#MX$$Q`t9opziP6rEOXjOTw(rv zMBtPuNRgVEVpRu_#jSNH%QdVBG{ zgAqYiN1$uN?1K}hyq#B1pU&-*zmQGE?F@-3L%1kSvDrAY3)XEBEndE?6snMHA)PcY zupL;MIL2!rK3*{)C31^&*Yug&{^Zs1FyMF^?=y!n)1hmOF6K^_sHHKStn0S32t2>aJT zzQn|W-W;m0@e^cDqZhI1cKb&$aVUhL)>7{?xp&rWh#5*yR-`@gm$9Y0nXL%HX{qR3Dkmdxm@)BBwRY%LpHB4j({chhp5h^>gw_|1zel9?G7yjONls1bKohag&%G%zKJ(RJz(~OsiRd@>PVL8uwpbYh8O+cl_ zb@9fZx>pM*vge7I5Z+AHUkh5&{M00@gMDF(@Qk)l8P;;{=CYHn9%0*>va1}DG%a|- zRym4Td=%Q2&$5+?okq*y8H@NaGOTYSO63vYU1la|5gu9U%g8JYi;G84ZmKp)Pv^kc zXk&eSxc^d*hRQd7ne6B0q4x)|w@1Pgo#^r>Ugbtk7#!ATRPrf)uFDOL6(8SoM#$m( zWigxUH{qbP&g7pB$q|%Go<~9urtSs`oa<9W+tTPOWMMB$`$5sjpoq2&Y%WQ$b7v^o zRVCs6H|2fd0Nxd5z0@WTyMc+!%7&fq3xf&VZAX#ByQLCafV(VxRyggzY1g{icEA6- zLids`0@KlJDn@c~#zzTU?iEm16H_EQsAe5y&|jia9*8Ho-j`TAE3kxhs=HMnoXryK zne;n}AW5T6C%zB)Wa+9~sc#2qs`{_=nXOl`8-iF*^_n-#)`M0{GM2zKPXTV<;s=d; zFr-+5`+8u^BG4olvx}s%n_q5A8{z$iUiNnE^54-b|AK*g*D6E!r7v)KV?hC`Cmj9- zGG_?P-@(bqC12pSe?-Nf!0kU*0H^@qVFh3$16Hu$#oWzAJ&nkjr4jL)^eoJ9M9<~` zi3rg%m;W>2Nn;{gxCM`H|i(@i+<;hWO)57d7R3U z+)FZvDM_~3P>B8rA8DTGYr}f~JDw|$X}y)-fWIPF`7qVEH>xK5I@wuxJsAKn(EdJ0 z(iI=W%+~d0r}ZKe7tat-#RFc+0nDxO_*x&GphPakOxW}{S-p4AeTamGPnLO?@p9T% z3wx0w&{Y>aI5t<59^ma#fJy5eiR-GWT?`aySI+R=%ER~&w?K1Vg;^arQE2W+gY_aS zkGv12HGb#lMcdSG-+Py7`gcOm}JB{N!m?)8lTQdv(GPkA9p7 z;st(Qv6)jML#K54)mVPZz+NUZaE->8WfdZR#NtP*)Ge;FZDM+`XtO9id($x~xRAg{ z;j#l!Bvqmpt{0gWGvfm-{%&e7a_nz5x&!plkW@YSoEODITns>zOYIq&hOZ%u??XyCpTt0mYo0X9!Qy&8ZcT0tZ{a TvIcKT3_SLF@5$eN{BQpS2QAa3 literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html b/doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html new file mode 100644 index 0000000..e59bc89 --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html @@ -0,0 +1,126 @@ + + + + + + + +Minecraft Community Edition: detail::is_constructible< const std::tuple< Ts... > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible< const std::tuple< Ts... > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_constructible< const std::tuple< Ts... > >:
        +
        +
        + + +detail::is_default_constructible< const std::tuple< Ts... > > +detail::conjunction< is_default_constructible< Ts >... > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png b/doc/html/structdetail_1_1is__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..a408bf9fcd0cfca23486524ced97ba6be2a4e2e2 GIT binary patch literal 3796 zcmd6qdpuP87Qi=pobtX3QK@Ol5e+Ia6)JqB9RCj@_4-X`1o8SJuQD# zLd)lYfdTOODB~Ihl&uRy**O5<{mNk|nbrvaa&Ab((Nm!k{0v_5CmjWILypT%qY_n&#&@dHSD)7* zKn)r&5~}o_$b@1v(11arJV5ch4(0a4D&;b2NgGb{Gz{>dK=bsIrE6})qeqJ4IwPyg zM%t(}Rt_oqrO}kBT%~Zb1iI`7DhjkPJH4-P-iFQ`%&^VVykP+^MFYdpLoSM+9gF3L zT&Oxok&@U@9QxceJc&1dMwvQI$4{AFpa3n6O$LNZ1(>dSn6FzhQM3+RpNTmMYU^uD z^77j0s>O^W;HM&2G*6Kj&lq^S6lCeOARL#Sd)mh|n_2jk46|+*{hcGJr?G-5NcYHtY|3)A<7+ zbsl(i^H7w89`r10Zw6p-@@;f-D%~ zH8sF~@qD0A;hWG5T;cz#kdM^b`2b~Alrl3DOzmso2UE)>2ksunUxen#=Aac7cR`-W zCR^iS@tn9=qqX2yq|$&fN2EuCQI+3Q7-aiT#h@m4T(`+!sv5?RACcoSHMo9o zs>!n~W4CB%wVCnYIMRuoE8KxJUB!}bU8-QN?2ner+n)Xaz(f8U^{ z=f#SOv`=nH*7#u?6+)fxG|7;;4T*JWnoe63-a#K)Kp?IP($1($U*5qC^yT6d6ekY7 zLX)_QmEqo|&rl^{_vKY$Zj$R>3A&qSh5m={skSwY^!0}(J`RaJ8En1#V?;}<<|cQI zMh#ifPafeIW7m&uL!+*&4(E)Hx-?uBO73$+9KDU~T*b^ev&%W-?rIxt)$Ffi;^J6t zNF>|%X_t*P=~k=EQiezW9%ua1Wa1fZ3)w9l_5ns3Xjdy#x07U1FD{d}RzERwNKg2# z_~cD%j#E{Casj;t@_?6p-C6%e(GHYNk<2;bSRl?rLeSGH-P2%Y;m!2aO-55Y)erW0 zS(kPR$%KLfPY?G`=4>tB#cW7FMt8U4AJPBBPl>U|Y>32L7t2Eg7KiaWHfoPYKOB* zc*M6okF!Qp>!JH4C9zt&ZO2`?<+BmLGJqD%O>HN zu8M<&Xlcth%=Pl-hs3;AR7o?x(#|pHyg4Z$9p(ii?XlRXeK7X=9Mp265mNAufP)yMg6 z(rytv<7u}S+ZSB0x!=uxc@PnR>WY4wn18KBQ${=G31MqtA(3XHRv!9@6sbmYZ>oLa z!kJe>Al|=1!;qD$a*by*!4#lfFl0j@uv(f9lWjY-bi7^PR80pNNw9uvu%rut+?#(t z5F1O2(I!A~CjC%?G=YPMVlBYT(i5jx!oQJXL71Es*jsGC^j)h+qktz1kWVjqC1j3Z zt11AMhIN3y9P4Zp4?{a71u$yDrTs6Y0|0lRdi6_KqKLK+7+Ceao;5qtv<4pPCjpCB z0tPmJFOp`j0*uyv-Ba^ZfFzI}J*zxWYa{_MUVm>=&kl&fj- zx<=*x%8$_sB$f>Vp$`5P&#BTkDh9~?CEErUIcj09DiM$R7v5R=^+%}s`qmD9`UWz; z$;A*xCE9!WbI{&tQtO@lG*?DK?62;)6Qj!P$j{9V;faRb zNj&-57eDhFXKiT}JRIfT-@-lY)G1D7v9X~s%9!QhS8gz-fWxXD)HpSNwt6~7?VafG z8aXd^=k|Sz-e!LNZb9DwRxewe$WFXX8)*rRiQv>3v(l&#CR=v7g*awwjN7x@c^cx@ zlDcbJiT-B5d$-HU8pDm!~BU0+*q;@G-`0;|cr1>EdpNu-rQM-#{6Llo^sM{ zNSZH8*=HMOPcrFE!vqx*@@QMIRtptFE)8y4mlRLF*jW9_g)~p4!8TDLolcvbNN4P} zzUe*JdxhgNy!6Ex_5MnL6MZ}lJFCs~oX+#9ZBC!YJl8ztTYrJ`3rBFYrI}c%&TWL9un=7y6m zy2Gn~>6o2za8v{#%kNEkd&IkEPBRH}4}Cet5XgbKD-`I+ zS?}>}J=-G`ZkU7Nm&Tm80>AC~5KdSXE>i=!fDqoepspCqOM-SSrK0P0St2$IvR^AI zMyk*`%{!6Qr7sDenlDj=aL|&{b8*dZ9vs!425n)Vqw#?kbes`y;HN>N>LqJKK5hPI zn!0H^TWO^xp{^jdGk?qKRUkj;Tfl0o@p~e{W~m_KWWEO(Z*ooq!qDz_Fx)SkmHN-2 z_8VURij8Bli+#OcXBXE2U=29lZFElJe?+=Jn!O>dm2(kgmA7%FDM-g2fOC7-hcpu#BBl#@1u5NOSN6ZdG5kHlVAP$jU=Yh@JZ!CG3*{- z8IkuuP}7omhRR>wmOn9Pz-eaEl!$pFIJXL{byGYjTgd`$)L6O63Vc3jT&Xd_99EYK zjAWNRuJ}r>#4^l#65+5QnK_qUg+(LbjDK9$-+ilhTGz+|VPQ>|4 zKRd{jcfV(SE}{H@_Xx_57q(ja;h_(0;7lPy`FozVzdW45jOxlGw-+mt|HOrKtm~vw zHE8|%SrXT)r73UK29M^Uvr3OOCZ3}EjFW$t>~L;LHJJc9XPSrh`6{Zs_$BVd*?`j& zPxuXm(!C=^&E@_?SQMO_PZ75hS^iLF!9{+PBWDhhifwjCiyK_}Ek7^GtmLPeC4ZFM z3HBkwvXo3pC&!)OfV*cBj$&L&+jvuWHD%xA`sd0ocv%g)`$A2JlV+kV%1iv-kgsZg zy^m#>)~y5+!mM$P9Etz{ literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html b/doc/html/structdetail_1_1is__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html new file mode 100644 index 0000000..16d093e --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html @@ -0,0 +1,126 @@ + + + + + + + +Minecraft Community Edition: detail::is_constructible< std::pair< T1, T2 > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible< std::pair< T1, T2 > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_constructible< std::pair< T1, T2 > >:
        +
        +
        + + +detail::is_default_constructible< std::pair< T1, T2 > > +detail::conjunction< is_default_constructible< T1 >, is_default_constructible< T2 > > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png b/doc/html/structdetail_1_1is__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..e93e5c6dc5021d92173b7441355ca3bace4ebe60 GIT binary patch literal 4375 zcmd5=c~q0vwnyt!5kYN10dZ`(icBI9X6FeAwi=KyL{WwSVG45~(W+32VyOyM5|Anc zJ`5@(VMrh%f+7M+AVQeO0AVU&G9k%5ALzZWYrXqN*Lv%%d;UnioPEyTJA3%;y}yJr z$P-Fy)z>O0C@7sedGtpGg%w=z{9?^l;B(92W>@f~amMc4F}Yk09)&{T&6_u=2!lOA zn^WHnb$54z{gL{B5@~g3&0{+$*fgLqabdg2ofL+Yf@DC{)KL>Y*#+!;RQf{V+*@1E+t- z6D@crfeWswT$q@4{7~7Zrd}`a@DC%}NG)_mn+!GB(;O?ZSWt;VZB<#k{vwEOyY;4 zQTAi)pMr`ZU-_c8<~rS(zP>IKbwtyuNXBc=ou?Y|qSl2;VOe z@53tocM=h6D-G6N+#Ht~n7xS<6&3ZhK3K6|y}q0Stwo`%j3Ur}v>QCM@IDB>z2{If zr^r0C--(^Trhpu~k;>rllYa&-IgCPOyu#8L;k)681R<*(3~p{s0M|w&CH~=Uct4SI z*E1~=L4K~h?U0~Vs0l%imddR|TJ;$--86}%BWlLQ-vZY{eBh4u!___daQpiJrFwDP z%zS);Wu3rMvY)vn#EhcdHKZ(vL9!V;X_F@AiX2PKuKd7{!&K5oE4{K*v*U;8}b^vx>^mx zfJRbVg7_|bGEVo+ddpqg6ARc)lCaBKL1IGEsqip zcZJ>FleTBTJ}ma(Z4MbvUe&g6hNgr%s{uLURKtdUC%)7ASRu;H^zAfJ<+n%++Usyf znww102NU&U7p`)@FRI%)eh-bB(QUUFJ9o6u!_}I`^6GKfit{;}rf+rjn`sKpp z_iX0^6SEJc+e zc>-cfj!c)Tt2E_=CwlY<@c>kSs-a_2GcBDsv;H&S@rP zkRNAy4W~Yv%OzI%D3fQ2@}i@RAb!fr@j+&$Jq}e-^p>svNpdVDFYs-DMN%5Z2kpHp zQ;Dj3Yc>K;yxh~eD1}BIncE$o8TWu+@T}olpiMw;B+2#N18o0-<;t!U)-V2yPS0C= zWbS*F8_D6N`_7{n7kcRTMmh(j56c0_7f0|VQk!q$! zUiM_|glfsY>VfOFtGFYgA3NXlTN3ZR>`*hGarn~@gEPY!PkQ66J92nvf*ttB-$Ibd z{M5wIg!D&KIHBb?lznpYp-r z)`PYcAfFtH+X7dc74cMcm#{!1bkaf`fs~A)aWuwzv|mHQXH;0Q03d<(p)ol2OOnOA zk$yDBE;xH{K#+9;7wtE860TmE5aiHH=bH%coBTAT$%mh!sP> z6)C3ctdHLT=;Ga`nn_1t>gjRQCF-5_AjC$q;5F~HOL~HKhxDpEbO@>JIobbe$H9#L zxXR==2}iD2*C@sBO8%dM{>|uLV*btODOf!-U>U%*Bzk+65?nLjA`VJQ!%|7Hg6kwG zD0WK)<^O^h^v#zNW~VI!Cfeu@mUvZC%^BF?(O%=gwu-=_Mt?Ey(ZA!B<_LW22(wR( z*||PeXjOFEk)T!Z!HR4ntZU?@>NIri>W-D#P-D zD3Cmx`OI3Q5$&glte6`&k06CT=bB!prYn<8N^m+J1%G-JLTGx1QHQem z*yxR#l(b{-w0UiqI}MVH zWD8?ftm}2dqWbA_&*ZEiC=P9KEPth`S`(L&>Swo6{1{+%?eEwU*7ZCnW#Mi!k%!gU z&`!Yil7lmYm z^08xCj`>_u3iF+3?jtI=BYWHow+4ZpJsCJFQ0Vs*3y^J1udY$lj2e#E8e0YP-x7sm zknj0m&U**-F(1SuPsRCqZeTE~a6X0;_qmR&-~y`oryE>Hh>#Xh#C`Wi;VAXGQ#OFpL&W#k ziEjyejfe}@zO67P}I($FX zTqa{RcCz|F&bRf4OasI=#H+oD!2JwIAK#H@zra!Hs^ywjoz?`Y`~_%J+2w=3R0jVAYTc&7EAUl427du! z_Zn&3-vHvjh3NeNu#MT}<>gwdKo5UV`7wRR|5Fb?ln6R-gLRefO@Z8ob$y7Wi<+;W z!?Oe!_4tUSOJ8QaV9nQGhCOg-Y1&KRRtIac7Dprz0ht!=ZrR~p{%dRaP}K9hpkK|}N;FIG$Ab?}1D;vgnV;g)9?fW`~P)cr|)#ogb;OyuL|NDJzKao16Ja1x~Y zPS~%az9pr;obDoY>1K-NJ?iat2a5CqKdwZ|^SOFu0@<-SL{gzi8>w6rLKXG)A?jgN zEZ7DF?OGH>q|VlFEHU?y9=O@ZuG?xV-CP~q=_stLPWi#~PRCTs8dpIm#Q@*C8kyE^ zl346Cf=KGSy*P$`GN#g=Jb%_UI)hYmIs23uP48^PMtGs;1DH*|KADdNNSC9sm3dY0 z6iobxoyf@Z(Q~jZd>8v{fR2BqO$p~;%DpF?wx`w=u(%)KR#SeZdC{aCA-yEVYdycI zlKG{3-1i5QS*)ZxXoUwT#0i9FO3f=6Jf9GyAB&%$e-bjWDaZNf*~aHh-S&ZbFKR3` zkf1j%L`pUtPvmZYv1~qTKS5{WjtHe8DTA%HY1PP%5x+ zuy9k=d>!oiEQo(PEKo%J0R!wEvE-BUW4HPcGINZKvLMBHz%KA!JrF6o2{u(Q9e%4x zYK!VylA!O8wuPx`gy=LN$P9)JmKO%2z`EA@V|!8x=MrVAneMoDxByc ab?*#)Ar&~}fL9m_r;Z_y<{!TB(?0?0M7~%6 literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html b/doc/html/structdetail_1_1is__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html new file mode 100644 index 0000000..d35aef9 --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html @@ -0,0 +1,126 @@ + + + + + + + +Minecraft Community Edition: detail::is_constructible< std::tuple< Ts... > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible< std::tuple< Ts... > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_constructible< std::tuple< Ts... > >:
        +
        +
        + + +detail::is_default_constructible< std::tuple< Ts... > > +detail::conjunction< is_default_constructible< Ts >... > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png b/doc/html/structdetail_1_1is__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ca94d27da12bbe8c8a335d4fa82735b7c598fb GIT binary patch literal 3764 zcmdT{YdlnI7au8|E|iK;@@otZ4ds$@Kc|Rs&5-Qm@-jn6VIq{_R5UTd%-F+;afBq* zFiHjurA!Q?$R)2_&cwJzMs73l?%|xym-oZ_;hYce{;=12p1q#6pUYbR=f7^9bhMV< zth5;hgGr-oEYUESBofl=evpLT@62~|AhGA9y{pyA$_k{8kB<|H#G<2zG(#1r%_9Q? z15p1M_W~38w&@bu(FF#zSDz#6?!1S=WGqmYKf6XrOy-P(Gg{j>Bu8o=nOb>e?O>3$ zCCr!G9KcWxvX57{sTw#KFL6{-vk-%}4crNn8rX_J>5-mDaMpz?A(IgyuNkmxDGnUv zQHF#SyD)$@tmCv=Dt2lwvPRPMAar^C5}qRWd@;?Y@-D=S3cf8HWpuNdO_@Z!2|HW z5tZ}f0Y>v-yEeKntJl0Zt_vZoWI#cr*uE>FE3lF{VSI)r3Y(>PZg`Y8>)3XZ4#=J94AkPN<|j2j zq&J+hnr9~2=u*N*;Bq(T5;hT4j+jTu`_E89bz<~}dQ!NRgGP2eyS{qs*oFKQT}xSs zpc?`5zMET;GL0vb_wjUh-($*~zJa4$`rcvP!1QhHdzFKVP`w0gTrKDq-bUOQ*vQ!K za;`J8rTK;w;Qy3B$g3Hv1wb7We@3Ze9)CGjXzDT*u?QmR{2En`--K}p^`21%Ry``_ zy^R*9N{7SfwP-cfx}D^S$-?*px;b@+uFqpe6R)^{>~7WF>eek)I^NoxDC@^ZW=0$J z9OmaS#Vvpta4*orqUCk8y%YGleuziLh8^!0Vv6U!pk_t5GmQ7CXUqU~on7n?ijE*c z8cRtywcN$Gd79DshLP5Q{ZtUrR+8yVO4OqbpP3dQv#CSMr{pnN7kK)NW~T0~lwHRa z3vub`JW;L;I@LV5^X1NfxVMM6%{OT557$tFqL$OS$W+mY;1RbnC>U?h$MRxE)jqtN z^nT*;O)hEc z#>&0TEW=zTyNhr0HM}mAV>4|CpsnDBGAVlEb8^M2HX%GXErZyu>Pnao((e@fE0tS5^udacGP}}+bR9Jbuy45(=sV1RFk}#w0p-u z_kyzIL_DO7EJ&{@-+TTxX4>%P^bFy?w-y~eFZFjS1@vOuE*n;Q zFB1sTdmZFaF=Q*CZ%^bMqy;T_sTa)UFi7|9bcJv9{Ek_^B7`s=ek&yquq<~_xGd@} zxag|s5z_n3urKzb@!aLsx8{n~rL2k)`U5pN?B~YVftYC*_7UYM^SnE5D@2v03M40l z{9L2euUvWA!4V8PNPD&QXHOqy#C%ulzSio11>V#mkyW9R|L`{9?k;kyL;1F|+wfzR zud}8y)KJG!ZTBfNTfI?QobtO9dXq;Trx4O=C@diT`M?8Ir;@EwQ}7M`Z#E|vYhct_wHWynNR@3U|CXgQ zE{3lfCBxynPFcsunfph~fU3bh%8+hkPDSf<1mJ(I$lAe@Qkcit&C%;)jeFK=+J$h( zARwz>)M%w4+eIp|c3MrJj7V*SdEdB529hRIZ&bQnzc&BbpFroKvbTkd-ElTMK~`2( zCWe6s{4t;M2n*Qo&=l0a3r>GYgAh*i>FEIL?ysN1tDG>34PZgiYr#ED&a8cAlOA`) z_+C#_00tVM7v5$#daB?;l0s9|ufZ=`%R{}uds^PH3{z6R6W7?RB(|n{oaI$>O!!Nc zkTvIQF`KJCC?Y2d-9oWWv0lg=bNW7dR)w!xu`d8#Ibo_dmagb|?_)695;)<3lWXs| zw4YuFKU_VYCkU=A+D|qz9lN>QUZAaRGBchs&_oMI%gP?OS_Tm)Cr15w>do#$QOBWs zJpYUTu(hQqEx#%J-!7k3P)iZ!abqukxR|3#axG6qeoH!G`49p(=<4@{0MKJ$#lPAi zF84bX$hL=ktZe*WIl~SBZQEEtX_Ma!K-Q^g^&q;l{=>+EpQl5 zP;qBCH~N(!V8}hp&!&p&hr#FTt0v#f-%ibmUN~X|JV>eTZ^$*vz1%9XFRpbBns8hz zP1;IKxJuAC13#(SOc$jZu1Y?O@>S<6dd4oU6>R^ zdYXvqf)+s(7XnjF=zxd}=Fnu+o?PkJ$>lA)jzx3sTu(ydbTR}SMtoCjvW}R$i)=t4 zKkG)lj@PWFAjA=T%)Y}gr8yT(>Rua@e+~{jg(8-n7RWoXCQxcIwlLm3PrsIk-C1Fq=r&nq6^N6`M^1Y{B$s&94 zHpBZk$sS9lZBywdJkRt6qq$hcN!~|K6~U*&b-ksjOL;2>fyw+-QH-jXVz@#_QV*44 ziLE3xe)h_K{5Q6Et4puoKUT~NHTc>~;{5)H$RT_=>t2NtS#fteS3s&c~i?mbD<}m0%SvguhKIU`nKikghy8r+H literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__constructible__object__type.html b/doc/html/structdetail_1_1is__constructible__object__type.html new file mode 100644 index 0000000..d6fc77f --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible__object__type.html @@ -0,0 +1,125 @@ + + + + + + + +Minecraft Community Edition: detail::is_constructible_object_type< BasicJsonType, ConstructibleObjectType > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible_object_type< BasicJsonType, ConstructibleObjectType > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_constructible_object_type< BasicJsonType, ConstructibleObjectType >:
        +
        +
        + + +detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, typename > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible__object__type.png b/doc/html/structdetail_1_1is__constructible__object__type.png new file mode 100644 index 0000000000000000000000000000000000000000..27399da1d7448ff6773c14584feccd819e120b97 GIT binary patch literal 2015 zcmb`Idr;HI7RQ5F@lizdN>HAn7|>f3L82f~YJ^4*A0;A0K&XcDem_D?;#9amK~g{p z5ksy8M1B;4MhP^5pn#DifFRGnlck zHur+Bm;TnhTVXJmKKfhKB^XRc0ogg5b)k8szql4!OfLBNozZHwkU2Lum!F?sbKfkOV^pFy-!r0`qGoqSDToz`;1oP+xxxqLeqXX@SHg#j)2DxP4bV8SeiI#SEQ) zJ-c8Bs4<}I1Ur0*Fps6P-n$p2oo37ryYRQf%@RLLvX_(Ss%IXIzS8AjP zqp&yq@+I4=l!Ru!B?@rsGxA|9z{th(S#Im3W`L(Ha+^rLk z2+EPp6eQ`qsN9rO2?@Nq{}#auW!qJ|(!uG(mdqV+!@|2c-@>fp3=5%ebwZIZYm=q6!^}&(k-G!?_)D!JttEHi_x|gDW+byK#kkp30*iRKHE)N3h zqKNlR%Xd;LeivoP)%r>r-|x8)NZk3|nYNjEbwr11__0dbWMm-gNq5$e6W%H&S z#~X0mtO;bUJwQ6*%2Utt9V>a5lXoHnsgvuEItQFQ#pm49@czWvQ+0scT;XbL@dJD* zKaCLYx6aw#BB<}ZK1qD1`B`OBl7OdR@CP6A?y$J6Utp&DHzXb!z`F%>1?AF0DQQHQ zb87E$8oc^#V_(&@YZ6(gUgG=2f61w_URYL1)>6mWpvV0l)wWsHy@~!6*VT;wtSui~ zz^i9j--rAp8`)M;>)b!KLNqN-BZ202X0gQgnyQ>Z{}H%Fn!x4Ui0GU5LU~ULdE%Z) zcHKiZk9#1nFJ7f`Ye{&@Wewt!M@Qx9Z28=xvgQyo;2!42&f=WGkzOoH5>f=OXJw;M z1u4!RD2W+fPVN~iwyUt|#&Q(n9YJnZR!0QL*)j%V7~JK;&1z53k|!%xKZNZpoLLQ5 zsn843?FX$At3tv){6;V=qz|5ybNN`*0c$H|kBEP&zr}RZ3!T zMqb_H!haSNv8Vy2=h79rJ&gI8tgNZ?L}TpBg5S*a3H?;+${`kodfZ<VneVMZWTz1OVZo;-Mty?tjk`LMiET==7~2EyMEYgn*PWL zL>7bacE<%o*f9r_ly-G&^OI4{A>0xM9Zcb+jfC9TJEWmoBQ%eA5ARsDC< z9fya8^PYmbAi8ZU?w3z!AD)DQS9?5d!RJj7Qm~KomT??f?rC=mVrox~+Xv|*k*8?m zcyy(%K{f~UZQJAOyXN?C{}h5_aU(E;|B7utr);=4famZ22SsI`-@$ew(?=`xG46~? z=?lhfvvdPwG+> zH?CZEy}v+mT|sy0iJ4`=AXvOO9-|-;5}d#z_ra(cMFkk#=oY74OO;_CuV?IA0d~=7 zAkV(_CJ7W@5rL5lnyRuP{}IPO!0;ZQk_p9h#iALM$Du-%r{^Eq1^2D$rGu(ohbVzicD3y! z@22Zxjgx~Kk2lv)>W?ihcn*`Vlj$1+SV#vZeMCVx3RR>)y&qprtriN~YX8zq)^QHZ l6Td6%s_**QR-;~%D~~>>rZn?Pp|2Q*KI4mO_~zP={{_cr9^L=| literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__constructible__object__type__impl.html b/doc/html/structdetail_1_1is__constructible__object__type__impl.html new file mode 100644 index 0000000..4ff0e89 --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible__object__type__impl.html @@ -0,0 +1,125 @@ + + + + + + + +Minecraft Community Edition: detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, typename >:
        +
        +
        + + +detail::is_constructible_object_type< BasicJsonType, ConstructibleObjectType > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible__object__type__impl.png b/doc/html/structdetail_1_1is__constructible__object__type__impl.png new file mode 100644 index 0000000000000000000000000000000000000000..d02d6e68492313edb673ac0d70b56ca20f3be6c2 GIT binary patch literal 2312 zcmcgudstFw8b4_>nwgHe6KQEh>vfBn!n~DYJ(!n_9MX&otqe3TdE=6zsWlarjn@?c zt4T~tN6oxLU}jBgK$d6>h8B}(fS~4zd1a2a&px~V?EbZT{`kJ%d*1hXzwf>L-g9z- zP`>Motc(BvSm*DDL<4{x48&AJeQ=#Y<-3C0#-PApADvDILX}FDo10tZ_Pt}`2AbgG z`}gm`_sW;&+CkkK0vdG$0Ogg(Rgc*R0ER{W$bG@*SE+BlPHyxt{#tyxvUeUa>2F~k z7nxgFc{3BmD?X&}@^Jh5`4V)1+1+AjfFsW2*&w!!vz9z#*}H=5^I;mzlR?jHLJ}FG z(X6Ss&fz4I4^P}@|I#>Q7h!`iH7XYeuyZ#RfOe5yL9}sVg_LJwa-wJaU0(ADi8p;L z>^lTWsL^bGJgPuTTUlO`xQ})HGtJ}-Y2j1>+u5{ZFvi8gj%}0dA#AmS8nv zG57w^4N^^zXiT%D8`URTYIdvf!MbS5*jzg&(`0kIW&HDOnEve;>;cfbF4KzyXLtAB zo8)qX4@h5BB@mB>Km}PJtN`| z!)qFU#U^yVX<s55WkZ!XMwWWzDM=u}2 zhHp|la44eRHm1F?g_g6#^1Uxk#o{M03!_d`ROi|NXcbwNJUPX9(^~abe2#e5naAwV zKDs@qe?q5etqn~OGx^xIjFi8=T>N{%@tgY=E9+82I}hx>VElj|#f;s<8Chj=HR0*f zDV$4YWr%x^;sKu1NNJL#O}~TXc>f#iz-1Ma5_>h0BosR} zSv&QQ%dG_ssr%;(*uHQpUS`JyG<~qka{2lXx-?@j4T)lls^z;0Nm^EGG(q*@kQ>!i zgnO0LYN>uc#++%651%`J)Az-qd2>&7W>E_J(FuCxbemIq*%fP(q5Qh?ywlTcsZo1f zDh10BM&CQw9DNINH!W@(w&l#PUIa`J;Vf+=23~zcGjg=&Och@?ah3fjh<*n)Up<^` zMY>07GjFh7RM)63_2Vj1Lau0MO^gQQ#7`!~!_lwy_TC*@Fi3iNlm_E>W-SID$Kty- zt3IXU?D8V3_^BwCNtb6*=6#Un{rhUF20iIq zn3Ht0cxL$b9d0}&Lvd7c2sCI@Aa??a1OiW9OjzB&Y<#w%mBDPkI`{~msD zLLd9$v-raqP7K}!C!Jm&7r*Bksc-L#mx8#!*`-oUN)yB+`B8>IP#Ngq={`%T_>dEo zvI|ZrbX9#SvmO1GSu8)(W>0h(GV^^e=BGk{RSq9sJHA{(~m4a>7slAg0WR3Y4ttq0P-)l5B2dXh2pvLu)0;PFe{q1`Jd-LI=^( zw{zXYHD~Y^h;9WgDO`-(d$q-x6&eQ;cDMV#5VnMu)>z*dL(aC7jM#c@kOk3b_V1c( z4lg)YK`zhUfwel-ul+roW><3u)_*N6yg^C-i6AMo{D{8VL5g#20g2kE?5!^vR6N`$ z3#LKr5PdkrWFV^EaB8X_H=Gv20{K}zC{zxA#oV4)YtIdxpAag0ZFf;6_HUKDY-EA7 zQG3Mw&nOxOmC0i_y;UEh+3{rqZs(_aTE;JAGvj1jSVmczz7>AAKj{~~gXmQHUs|jW z2l9>^*e}QCg9(2lr#vRAdG-V@8q7-AR8E^rE>196cqxs?+3rLE>;|IuDs zumZu4bc~+jG~P}i06%7M_$hqJ`*Qxn?bnZ$;LO1N$dW$Z!K$on|LkV)p9S#uK_Tn* HpS<`7)bCi3 literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_o47d3f1d858163de67321be81dde3c5a8.html b/doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_o47d3f1d858163de67321be81dde3c5a8.html new file mode 100644 index 0000000..8ac7112 --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_o47d3f1d858163de67321be81dde3c5a8.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, enable_if_t< is_detected< mapped_type_t, ConstructibleObjectType >::value &&is_detected< key_type_t, ConstructibleObjectType >::value > > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_oe3af2486927b63ecadb7a7d2ea385f2a.html b/doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_oe3af2486927b63ecadb7a7d2ea385f2a.html new file mode 100644 index 0000000..00ac6a8 --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_oe3af2486927b63ecadb7a7d2ea385f2a.html @@ -0,0 +1,175 @@ + + + + + + + +Minecraft Community Edition: detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, enable_if_t< is_detected< mapped_type_t, ConstructibleObjectType >::value &&is_detected< key_type_t, ConstructibleObjectType >::value > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, enable_if_t< is_detected< mapped_type_t, ConstructibleObjectType >::value &&is_detected< key_type_t, ConstructibleObjectType >::value > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, enable_if_t< is_detected< mapped_type_t, ConstructibleObjectType >::value &&is_detected< key_type_t, ConstructibleObjectType >::value > >:
        +
        +
        + +
        + + + +

        +Public Types

        +using object_t = typename BasicJsonType::object_t
        + + +

        +Static Public Attributes

        static constexpr bool value
        +

        Member Data Documentation

        + +

        ◆ value

        + +
        +
        +
        +template<typename BasicJsonType, typename ConstructibleObjectType>
        + + + + + +
        + + + + +
        bool detail::is_constructible_object_type_impl< BasicJsonType, ConstructibleObjectType, enable_if_t< is_detected< mapped_type_t, ConstructibleObjectType >::value &&is_detected< key_type_t, ConstructibleObjectType >::value > >::value
        +
        +staticconstexpr
        +
        +Initial value:
        =
        + +
        (std::is_move_assignable<ConstructibleObjectType>::value ||
        +
        std::is_copy_assignable<ConstructibleObjectType>::value) &&
        +
        (is_constructible<typename ConstructibleObjectType::key_type,
        +
        typename object_t::key_type>::value &&
        +
        std::is_same <
        +
        typename object_t::mapped_type,
        +
        typename ConstructibleObjectType::mapped_type >::value)) ||
        +
        (has_from_json<BasicJsonType,
        +
        typename ConstructibleObjectType::mapped_type>::value ||
        + +
        BasicJsonType,
        +
        typename ConstructibleObjectType::mapped_type >::value)
        +
        Definition json.hpp:3626
        +
        Definition json.hpp:3649
        +
        Definition json.hpp:3797
        +
        Definition json.hpp:3778
        +
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_oe3af2486927b63ecadb7a7d2ea385f2a.png b/doc/html/structdetail_1_1is__constructible__object__type__impl_3_01_basic_json_type_00_01_constructible_oe3af2486927b63ecadb7a7d2ea385f2a.png new file mode 100644 index 0000000000000000000000000000000000000000..757e789d716b65957822a14253f4eb14fbafd907 GIT binary patch literal 2166 zcmd5-dpMhE77wFat7S|tS~aT1r5AcJDN&>|E-jfVmPTuhOM{?)PoE^03{uEods?dLH?J{snu#wl}IEc5~;@Z)X}f@ zQ~F;`O-+I4;(?SV(Dujl;D8Va_^n+qecG=Oh@l?B$Me!RdeRC$>b{$)K~f~Ju4b>< zwp&|&hd{-*^;F<8ob(eQ92h5Elyqqr zUON|>+a2{AhSnCl)XBLQ2{l5ltk0P%?AuEjD$cul1q{0lk$FVN_le!{Dn-vH?ITT! z_N{vKJEQG8DM{TO` z66&A85O7K)76x_cPBu|F+?43*iq{o(ICywv?9_};1;aePLtFE(O_46=Gq0CoS>#t{ zoSYxlJkl)Bsv`w>yeRhfX(3ObHKlu&RO*V4EOb*JN0GD)GF=F+Xt*jd1nlb@hySIm z|JDDctKIK^7xEE3GajPIdL5^y-g@vnnOmV_}Uyc)$TLv((r|tQXjTCWQH*O_4t1AF=`@smX zszfiV@3<{^?Bsse_uPie-Yw3u8w0j4mM_x;tz{(@Il`n8D}&RLqRlWD-(tshn40@( z8Z8m#@Yx&A)(k#YvCnyi9bC|MDD@-DS3k2+-NduK0Q@KFvUg|Ay|ekP**Lp1#jCfY zw$}Hk-b(S6Q*UIM{MiL%HX+kl;5u<5Z8KvBnshgZ{Uc6rNKy%zMwp))ZKjQQq~+7AaE;ebD^xuP`Bi8DcbLAqbw9t2G1!0%pr@|gCaw0mg>w_2zg z{Sh<8x`4i@>JSC~GpEOPP~b{kULd8JSlA36ywhYpc==<0M9ibGQcCokIQ(2&e7DP@ zebfAUz4c&vLtHm!7Dk)3C@XX6qn6q@Ip<^k+JY=PvA1J!G~z|RbN6IDP?;paNYU%m zVl#D@q~WK?RVpLpAF;_fOOHgt(J1)5tW;zSGeJ)*;mJ3wJ@X3I8)U7Hi>+!^T&OX# zJa>@PQ5S25WmhYcUb{6kZQz;NaH#w2{_@!%|6d5w^M8O{a+O@KPP@tDM+`=x#Q?<21{uIIpN;bc4e1UN@*u=Q8*_F*YP?X-xz>qiJL-kGd=uWia@Ese#6^s&c30UEHi@qe(?$ zxgx#2R^cjeZSDNElQ@RW>gp$Px&&T*IowKfvxT|Hvag%7$)g2vb1uI`hTiUcYBKxf zM21}``r|AN5F!~&bqFGO^ z2CT69*J>5(!_TDN{WUayVWeyO{6o2i1CBgPoDJiJ&&)f$HE#`>+fH~6haS{mMad2*FMwWN~dxX<{-QY@g&!#rgkNx{4pDa^DZoz|}T@!`nL%@YN L7vNLx6@C3*W!M6L literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__constructible__string__type-members.html b/doc/html/structdetail_1_1is__constructible__string__type-members.html new file mode 100644 index 0000000..5d3f492 --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible__string__type-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible_string_type< BasicJsonType, ConstructibleStringType > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structdetail_1_1is__constructible__string__type.html b/doc/html/structdetail_1_1is__constructible__string__type.html new file mode 100644 index 0000000..f36ecba --- /dev/null +++ b/doc/html/structdetail_1_1is__constructible__string__type.html @@ -0,0 +1,158 @@ + + + + + + + +Minecraft Community Edition: detail::is_constructible_string_type< BasicJsonType, ConstructibleStringType > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_constructible_string_type< BasicJsonType, ConstructibleStringType > Struct Template Reference
        +
        +
        + + + +

        +Public Types

        +using laundered_type = ConstructibleStringType
        + + +

        +Static Public Attributes

        static constexpr auto value
        +

        Member Data Documentation

        + +

        ◆ value

        + +
        +
        +
        +template<typename BasicJsonType, typename ConstructibleStringType>
        + + + + + +
        + + + + +
        auto detail::is_constructible_string_type< BasicJsonType, ConstructibleStringType >::value
        +
        +staticconstexpr
        +
        +Initial value:
        =
        + + +
        is_detected_exact<typename BasicJsonType::string_t::value_type,
        +
        value_type_t, laundered_type >>::value
        +
        Definition json.hpp:3765
        +
        Definition json.hpp:3797
        +
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__default__constructible.html b/doc/html/structdetail_1_1is__default__constructible.html new file mode 100644 index 0000000..38eca4c --- /dev/null +++ b/doc/html/structdetail_1_1is__default__constructible.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_default_constructible< T > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_default_constructible< T > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_default_constructible< T >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__default__constructible.png b/doc/html/structdetail_1_1is__default__constructible.png new file mode 100644 index 0000000000000000000000000000000000000000..811aeafd27a278227f2246005229ad9133929a23 GIT binary patch literal 819 zcmeAS@N?(olHy`uVBq!ia0vp^SAaNxgBeJMDXxA3q@)9ULR|m<{|{uoe*LZc+T&cR>j+;viMbk{5QiZf2Gzvd%vLW=XT$U6_zX0l20XY z+Uz<%egE0_$uHjv{=PhK-`{ulHS$l({4@2uf3MMKlbNz}ao|(ezvoMnH^>`Z+McrL z$?M-QQ@_3F6kbubbmiP#t}Sc$Ua1_5ir|kFOJFo_ed6`Bdd= zxvbgNYiw+`R^N*k`FJMzWm@-+&GG!Az177*cTe57)Kt#q{#LzqS(fgcs;#T1z+Z2qgPzck9%IjzN&BT*~y3H0{9=@f9DqW|E1rmn=|y5tJwl>;1It%)@x^Pj98NW*^gC{&wb*+18zEMkSyiKM4%-OSe|MDBhp08DgE7 z{`#I@<~h+To_)9bzC6|qc|G--xq86)Q`*b#I-3T6vow8as_}en^@`kg2?sxfm}y$B zynHv$%l!0Cc#x}BR|kokPTlo!)3QgJ>ib@=QjI?BZhG}j%JHQkdJ6(BynI`JW4+GO zb(;JC?)kf_^0sMB)o;&BI=_Uk+>9^seDx)4gG%kX(x6EuO=442dKa*&dMdwQOieSJ b`Hzux%|ET1)i3q|lQ)B>tDnm{r-UW|*=CL; literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html b/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html new file mode 100644 index 0000000..0ce59bf --- /dev/null +++ b/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.html @@ -0,0 +1,126 @@ + + + + + + + +Minecraft Community Edition: detail::is_default_constructible< const std::pair< T1, T2 > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_default_constructible< const std::pair< T1, T2 > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_default_constructible< const std::pair< T1, T2 > >:
        +
        +
        + + +detail::conjunction< is_default_constructible< T1 >, is_default_constructible< T2 > > +detail::is_constructible< const std::pair< T1, T2 > > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png b/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..e07cee0dda6e35f37f4110004d920769fc1ea50d GIT binary patch literal 3607 zcmds4Sy)ro7LMqxRz*>(s7#8AO%ZTFCV^lDu^=D`lVMU3ki^J5gfM6=hy_I}5ELX9 z8bB~a(8G`b(JDk`h)PH_ObSAjBn$=;AVBUu;@5un?cRrbAMSZL=j^@L{#VZ0YyIob z?SoM<5WYKOM0}BM^%P;Qi6E#o*q0R#p0vr{US;8i3NWn^TOnC(V} zZ6vpTeE04hm>+IGR|nRlUp1ztg&qON(>E3#o{G5OH~8bKzJHN zDm2Nk<5obtk;{VJ8(f(@EORIBiI=Se7!?4cS5yK25(CxMaY?g(a07I5S78h{72*5J z`;^P*YGdE|9%_RRMQNx<(b#aCFO%PhR8#?s16u$_RL)ZjO)T^wis7we=nuMT zG#8?v)e{Y#B6XZjG#@Ksxo}e}KN?=job4`~6FxASVD~`0nbCE?Q+&&NT3Ke9jPcSX zlZmHI_Q5|aDu)d~!~c*`nzLn&(CXgh5KpiO#${?Y9*E~f=giLDAveqEO#%KvKHFIj z>5RX&lAi)-Vg-(m#glCb8`Hx(ljv>9)(_sgYN$-ul*zvDNzJf@6KGMIfSR>;Eu2D2x8TU=7e^Ax z1^k!t1DZX!S0)5SA073OF>sLlwrf8ZE3)@;iPIjuLu4dW- zQJ;dzZS*XT^>8O;5A)mYwDR&4 z6@08Z`y&7GFdw+3ytk3aGpvK3H7x6Pe4|S=3P~0nUuBkTz);RI+00l%L_}w;_oMos zy(fhF=1SI4l(J`J4?W25^Y4$1cFpARXT5PQP&?aAG~|`RFlqHq?~uF;cc*SP*Wjk->sl%eSw_b7eZp-xN&u>A^!uUo zoo@|d=P=gpq>h=n2$Y9{Bg{FNzIS#9ZZsky`xoXvTJ@)L^~hm5+z*;0O!jJHbFYEE z+M(#K>)m}+S+$#X(4=!y;#>k%CU{PECl$4)=W-~geT67b$kgaUUxi@x3XZ3z#NBx$ zNT*MDQ%~gGaPK^`Z1#HDoM*-K^Olc!!mgAz0!GEF^39|>vU6hshHt%leo9?z z3x%EVd3%?<+4sW}c{2t|{!zRXH`>y6L13>pI+Sy_m92Mu^jijJHt|~Y#Gw-H?(wk; zLuN}?SR5l^wkietQSqA$+F9i|O60_@M{Xq+I(dJ_j3g+r+=iAZ#l4gt$Wr2%Rd<`v zsUDv}ob}5W?x9#cw;Ye>VDY|{Xi~teqJH#2Ee{(j?wr5z4Ve*NUXk41PDp>s`0ygS zRo6arfVXvnI`egvLI2Wq75ceFM*C(?>>$tQX)u>s)NlrB1lpdG=$1alP^3yW`b9va zBh2KvF3K~kd3_zYaFr?QNO$nC)Uq6)mnJ3+COpI?;=(`yE}{6gj~XeB&uKXxSp@Rx$Euhw-H9l8vc%A>NOm zO&tZjFik*%cvhgH>Edbtm%)9ivV%H!Wb+z` zryXwjaj!xk|8&XsU#S&OOEd*|{lVNMYUf3B|00ZIU}Cf46^&FUZ66|B zSz1}miA%3bSa0P?@<`ZoO8Gg21}W2l`WPR?h5nXE7dmv>M;6?jJJH@x4U3aP0=7)6 zDWByTn%dN3;;X-pQr@t6`gVjpa5(A;_@ww{VRc(TPDp*;K9`wX0pJohg{IdARUihg2(8PSR~Yk_|A>@1RBwPPxI}qj*$+GKXE5X z*B_j?A!cNqdYMnV@UcA1loE?K1H~)vx6Cx} ziXj#Z-e_G%m!G9U>-8biW)?^BO}aOpU=N@C?_3-W8kw31m6K3Fid9ZEonOPf9tV@9=`ESyv+jaKlJ!kpN@9M|dfs^2g4R0+wl8Qsh{ssadOWNM)_QB8uSWkb zq6R3esMb$W7FU|Pz+LqlP-z$>^%u0mrv?4%h@>vW1Q65Lm}H^9#snC_F&PhlMTtDU z4$49oL|9I&6$|8-&)Bakus1(bU`Qbd8>U}-Iv`m(d?IKR8d#Y8rnReLwyYz*rAsWR@nb87%IXo&6z@xXYcwDn{q9^?D0K zt%lEu>`#H6YIvsDyS1rnAVu(?KYfjY?1H2wEQVR2gxi~2`CCFb(Q8Q!M)-oL8A_8? zg31t%cIKT7uW{nPXcgk8r_4mI>a|7FTLgF@!AA~saxYK>Et#2WF zoRRj4;6V&zN<$gO!U6bH)?kpUPs&-YiLZ_M9N5`gD%Bmb9KImvx~x+n$Rpd7nJk&I zPI8b0LZm-rFYX`8}0(L%uxhuS`me@a8K+UQ;MU^#A$%&|- za3ocn21)@{1UIXe1Z<1{WNjAO1ZF0dvn29@qGv5QJiIkCpVcNVRlNvWoCA_RC2}*M zW^vTMFfNiB1v4%zZeK6ZG8yf#K+C}PD=mLDGP~_u5@vDRIdSo!&nT5KyI~s9#Sr|3 PL;PgtY+Lc;iJ$)ofeS+R literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html b/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html new file mode 100644 index 0000000..bb94a26 --- /dev/null +++ b/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.html @@ -0,0 +1,126 @@ + + + + + + + +Minecraft Community Edition: detail::is_default_constructible< const std::tuple< Ts... > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_default_constructible< const std::tuple< Ts... > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_default_constructible< const std::tuple< Ts... > >:
        +
        +
        + + +detail::conjunction< is_default_constructible< Ts >... > +detail::is_constructible< const std::tuple< Ts... > > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png b/doc/html/structdetail_1_1is__default__constructible_3_01const_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..73327c62fc47c13d2b8622eb2755fe82f1bff15d GIT binary patch literal 3234 zcmds4c~leU79UVsgd(61OF_jAtVECy7FR$7WsyY@FlY#h1R(+nNoYt|THKIS5DXAd zVwHd*B-*egDT@}NK#)kl5Cx%tWf=%!2wM_(6Fu$eIq$UZocI2C=e+sj&ToG6&3yO! z=HC0elj`GjSXJy@=vK_g3PLdHDj+^~b|bJ--tGzA$%lK5+aSwTU}m_9HXh&(a8G z){{#O+foe=_+*J6$L*4aKA^;e>zTEo0X4z5x=y;AE(tVMuwP=))B9#4N-cg9s<+o@ z^WTH1{agzK(Q^cc>662%G8;=aSH~`Hf6%~zeNu1(n4X|B$6eKQB6VGWcNT` zED2>yx7sAi@9kaE>(IaZCHl#8lJdrn*n*6oFS2=Z2Pdxj^ng+2?&@ep5qRIqVPXvm zR`kbQA!+Eh`}KPo5?(|x$?In2dhF`hgjeH|#qfzkgF9lQ>8P~*TQT_;#& z#hs$?)k15}vW?X|t+-j+LT(;yC4z118W1;I z5{7Pto#A9f#$=z*Ze$FCF--C;YddohHeD9Aeo=9f{-o0a-VqV!-9qI5Y==C9ZbBy^ z93Iac5s}Ui&x;UG&!age9y7?39jn@t+@yn`{$y8q?3PD6Odq!ef1hZdH9WgdF<)gL zlHX?gZb$cvQ96<*vZ;_2=~3l^@|tfLnO;AS(uLz>d5Y@SVAJ{#m(xj zh3iaCO4rXd0<2w$Ko)#tbG(&lmD%VNf!}J!xn2haXHbmkIET4+i-$)hd%Avnth=-J zRD0{n+oSQ8rh3Y=w$zo8+@NbnRv);qXVYx{?MXr2-RwcKy^q67o874_d_to|=$;$I z1ycqyRN>CW&z7&#l3!t_w}aK^OR>Km3Owo+od1->HQlDHV77Pf1+U}esgEx+->sx! zO00O<&uWUX5^*S@Y<*V~+`Dh+LP>>j!-4OV(((A*&cHCyjvW2_VEb;NO;Tql!MxPt z*aAIF)L%>OH4UpA;#jx(>7#UZxE)>_>B2gD=u7y{z9F;4__Lk({aG@1krmYsS0+YM zDuPdnS5l3ov~NQ*_QiKiq-^s?pG)(l3GzC0PSv(lyAbZA3y6EA+HEoI?5T^CS^{Bo z$&fm(AlKmEu99?J-S>8N2#CHoVEtQj{?^&BDMXSmteQuUy$6Qq{HCbFJRJ@Xe_HvY zH8Wv#z^g>!wIS11Wd22D)Ek`>n8z;OZ6*A(QRwyNK_kdI8EaR-T>jFondo4Q+jbm2 zZb=_Unna+WczrgyA&;h9Z7-B9Vu|FQUe^2rs9^QI3mD~&U#5v|jPbSzIq7R2muJUF zVY)Nxf}oVLnEr){!8k#YZg&XEG}!?aa``LtD-)}+>6)(7Ip=$zwP#jtQFz4idV?Nd zxnpd3CE)ooQ+@gXR!fli#uKY4SXO54=v!V0BnV!smk-t63-nE1buLmZ@1Dtuk(5_! z@4^FplI{OYY!5v4-xF1DCQPHM-jpo^)cfN$s{zaF0aZD)1XN}4i)7piU0@lcJO44= zU$w?bWAi25K(&p)9^EsPqYVZjMk<{t#8Tk4&X77daT^Un4*mtT8dcRgK8E*2>|I|Q z?cLO9FsLWC>FUTeZ|`Sym~Z1=m2p_&+|azuSqyZVvsgYwv! zx`I&ORN*E-{qC~n-83U#v#P$zv0Ma7r*Z4O0OJC%JZE$lCUb+YQQF(9Q+B8j%9BE~ zQkC;jt;Teb_{3P=qz@cpG+n@Kb|aU82*P&ZMZV|#DxCRXKu076Zmxft0c~H4xdT6g z__l=du(%Xa5z}tL#!fu2zd_^7`xDH2_*pm#9M-}FlBmu%UW==R_~>AJ(?6$gCq}{qg_|q(Y)Py~WK;>c%Z7Zodz|l1oKNnj85x(hO1kS)*aFOiH-GvL7FQ zU)r~j6ZV0~_bhbbD-ORuq~P~We+6&+=Hn-LKG0+^xI~*_?NoIQDN1hf4^7(|4WQ(T zrN9?ag|PZvU-N$d;E5b2ys>-jN98sQp?qvnGE~$j4gVMF|3SN(2CF^@EMex%)fc>6QI!K?Ej zn3-YMfaD;BtBC#$z6k4LjbO)}`vKHJH}OkV={9gmL~0?PA415^qg@DXR>I8UR|R0N zVgG#9s*@4J3#G65nK2t;?~EC~x8az~;1x1EVSS*g`|?E%xAhVB)oEhF-DJIsE7;}Z z116C~R!>1%E_nRWlZX`eyC|=f_J00*UeTs=_IiPDGE+YKVFJ^g44Ze6T!#2nQ+N5x?= z;Y9Qa)m!7(So6d0!Y7WG^{`vV1NWAshhU;=sVFV*!`4U)@+e`&+-FQ&0;6jU3W04| zBk$VcS8)y&Z-P11z%P2z&=SEK*s0G^I%KK>e(<=cNy2ZE#LwBcAJxjHqVDBQX2Zo# zYZe~s$W?*vb-Ss@Ik17Bv^=_@UExVTjhXpM)#naFHDBp4M + + + + + + +Minecraft Community Edition: detail::is_default_constructible< std::pair< T1, T2 > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_default_constructible< std::pair< T1, T2 > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_default_constructible< std::pair< T1, T2 > >:
        +
        +
        + + +detail::conjunction< is_default_constructible< T1 >, is_default_constructible< T2 > > +detail::is_constructible< std::pair< T1, T2 > > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__default__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png b/doc/html/structdetail_1_1is__default__constructible_3_01std_1_1pair_3_01_t1_00_01_t2_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb6661c50fc6f7a0dd9b6f13e4711d69baa9ce1 GIT binary patch literal 3505 zcmcgvX;f3!77pkWss?aicmm?kr$w0*3rHcLq9~(=$s|IgRILdlG6o0%#HzG_R0U&2 zK;Z=vFhq?P1PoYFDG&)r2sID_A;=IzB$O}&l6M1rt6i(>O+WhXk9*I#XPU??3O?9=uDb%fvm+&j;KTH|PvBv-S`9WO5=nM;cDa+C z}B|N z5j}a|KFKFt7I*0T{+DYab9%4eQlNG1)^_dl4Zl-H!*6+R=L7IIVd%iQ5{K-=+$w-K z@h#uZ=tMmaS-%t0bkakL#7c{((1>*amJSd#Mq~^cJ+8v}qhm6gtd~rvP_4R>njBYF zV@KRvELkB>QHA-yjIDMthGmW;@-y*tAiCOY4h65JqkCJ)=yr zR9slcOcCAfxRP4OL#DZ%FnwK8@0ubW36{DQlS021FFE9tTy6b<6<@k9<>2_%SJ2d_XnNQcg%jfTu zHC%*fIS)g%SL$}GIAN;2a`bXd%~PnBcHBYk6^K^ypx}e1_saoI&w1OIhteSe18~=L zTqfUOi@T#ol&--&(-H@8I&^9J6%b|ZxI-HAx~-T$-`wu+{C`HtdqcNEzw!&tg?^-n z3V?SUOLt`k*5|o_Mt?G=S{{}{s|0w(qLb3GSzPL8 zlsxNPjN5o(VC`oG)zcQM0Ixe9_bg-+6hCVHmCjrH{X}DL?%e1lSE$NM=EvIJ0`{uL%M#+0My?#&H z0x_+aKO>%Q--TsFJ`J{k3+}GvgxL<)_6w1HMK}RR*lX7FR$|g7LP|u*2Je&0+6DmL ztLXu!lPoZUR0cYjM%n0;UhU3{#MP+C{L1LTxUA!T-<_G-#8)Kcjb) zvwgps73Y?Qk7akVw_0pkxOkXhHYK6Db~~d3=mpr$aipCZ)rT{+tt>;5dwz7+VG8%o zMR94oIp?P+y$0AV*l}WTO6QkpkGV*RTR20JWNWPu&*M-}zD^B1UbYwAcHj6cds<)n zXTKWX@AbFUjuE&-V>zmJLK z_sU27G+2%KlcP;(hoyp|Q&BHMA+alqyTp6@c7DD;m(|j$bI0uE?00(@ZP&yq7*Io# zUl@`F_Kk>hxnV?AIIq8VdJ8*~teF}&>iIOZx$L9SnZ2xb5}As2#E| z4b6k$hnU*~3dd8TVuZEwMd7y3!}vm?b!1&1Cr8#KNa@cem`C6m36cZ1r+j*}z}$G{ zCC!=Km>dX4oftHko zWaq?Y;}gmhU6R8i5-l1GTwzLlm9dKr`lwVgpATvO$g`ko^RvC(fjX#I4s z>FDo<)2;UXFT;sMB5@5KyqX{&)p{m4{R!lIFQV-HofrFj1BCAB;kS`k>nA)UM^mk+ z0`T-V0O3|831CcU%3UU(4)9#TYPbzk!$Zz!jAX}&MG^6YG^g*vPdG$L$Rre2x~@6L zhQ)~IyiV#D-%G4Zsm`Afd4q>f`U0FPD(9-)D?Lf7YkZ4j<+~kppjyn50biJ6DH`5zi1S6&6G>6|K#0SKd3K?VIaz*6hPTG~*G!DaqOM`b;EZCQB&A4>2s;90y zbd(6uf!5ewkUVrbS5)b`yW#6cZU|6b$ku~j-Ecsfqfc}Vsep}7`ABt0Mps`9im?D8 z11#!m0UGj$xl_`hHhlgUpu;I-kTo1H8;#*{Aj{OlV#_%+(qAWTE)h(;B$cXgzBR2s z8z}W1Bea@p7T<$)V?XQ7X_PQIEfzGEVxj2)s|H)xsb4mm%{65W(MIJz3go^`i03PSkh7`5Qkfy>#n%hUls%zVPWS<)`N$0# zFbuSiDq-Xs-eh9)WnZ$gc9Qh8fKzYMJ{+rLp|Vbs!`tmcbt372;cme3b>oauFAIf@ z^3>o)WATvK#%x=4pzSZcN5Eqafh+IwUEQnD<~P+0nsG~?pvz_0oZ;MFbbw_lC+_;zgsBX52cs6_G{bwP=tza%k?`};*2 zk@3m0Mjf7dF5t~thEVrq62?wht8|6VJ7{VF?!s~ayTdx zl)(&&q9ht0aBIJd!zK~y zpchpAb)nw2!<8a<`3PQGCFpv0DvXS`LDdD(npGHw@6RtCS-1D~D~ z2DZxi*)>#DP2Cz&?$EtKhceXFSDha(@|mJ6Bjrs>9=zc)sCg$NFnBTISVN)<`(|%d zY>ew>JYC_}k*~iiv6b=I0ZpM~2RERm?U{>s^8pL5XeA zeATC|ZCwB-M+xz4Dgw(DvBqf1_FU1qI=z!#mb-&7`0O;<%q1gGI$qPba!4a0+vI1g z(d;3(*E<6+hr`g)SiJ?F)ogcdnD7G?dg=NDu&7~EFIG_U + + + + + + +Minecraft Community Edition: detail::is_default_constructible< std::tuple< Ts... > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_default_constructible< std::tuple< Ts... > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_default_constructible< std::tuple< Ts... > >:
        +
        +
        + + +detail::conjunction< is_default_constructible< Ts >... > +detail::is_constructible< std::tuple< Ts... > > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__default__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png b/doc/html/structdetail_1_1is__default__constructible_3_01std_1_1tuple_3_01_ts_8_8_8_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..8983c05243aaac156740fd2d6791751794a427dc GIT binary patch literal 3141 zcmd5;d03L^7XRFBaRkk!adIKEa@7C{NaqlyK-1|J2KltA5ocBHF{LcBEv_tML zS}Q+a2>^hW>wdH+04P(zajm8b_Fx!9^QGT5x@cBg2@E(Nn>b-~u{3!%n>7psTyE`e9 z3OHY-DiqcG(G;`&Xwp=WIiePJ`!df)T9(dQH50YCRR?}lQ>VGR+8|BSE|uY8)M%?+ zc|`k3)KuGzYoxaH2;vaxNWkpaG13$V1L{8}L#j``9KAN%{Wf0LQ(f%#1Ee4Z6Y*^F zS*ix2;$nAq%^FBmN73{lVLi*eUw5nkWI+ipH-Txn4lL|}GG)uJsRBLSq zRZYQkz}Aytm{MM zF;>`fKQk}jC!utj#Ss7$Ym>ASgsni@J4H_h+QHt40(r;!-1hkSx8npYT~o3E+~9tymXN#Z9-{OSW#GQJ)DIawO) zER5O0`$G7S&4ow$r#WliI(?7jE&OuPw#K+AX?3J~^}AyItA~lnGh^8S$#3d7s3}t6 ztHKQi+MVq)=^04~5XLF9w?ny-^zn`SF89VuDM>w_Yo8R5+3rNFHE(dpE@7zMwX^E_ z?9UQJ5cbPm6Qd_Pv%ijx^SS$S)aCfofHn0Jc+Hs9y&!lmbbwi1+O~&ALl0>0{?+#{?M)1^Q0EzKv9Uet@V#}l!U zF?ARGLl?gEJmf4~hZ%i#vN$ihWD}275jfyMv}`DGOu#%|2bYhx!piys^}-){cHZ&S z?=Ht}6E|q&Nfd&z=?g6}pRYPlR23Gs>!5MgK&LOApJGS(mL^34~2r`aXF!*`@Sj1pIj2CZ*@Oz#Azc}>clyVj`!+g z5W-4TBzlFc!A6I}<@5nuJNs4flkKyX1iByFA-aXj&>M0Mizh9>3*C$LY(IDO~xc4q^a|B8{lo^t@gVHN`4^_7L7u|I&)5x_Nh`=7H!bnJzulM zZhanOKJf46lNDamj0)TL&P?~za$=4HBg`F2nv|v&Un!5@npZKTY}L7Wt<}{?a|HQ% zKjqxLWIzSnijC=UiZrcdomj6l)4ZUxdXLeHkrl5UDN27?c#$!weH8eM&>#9thD>UK zdzrxeiA6yD<`vat0vG zOkMo$j4Mcy!3Y*E=Gvp)$uy+sGl+cg7nnchCXB4PJU6N5SIJg0sd?iuKEO zU$?YStG2)&-kE_BIPq~Z<8xL^S&i~odIV~{f^a{pCLW)DAjVo&amOS?=$97RPyQax zmRenUYWP+?6ir#gTH~4Zc|}!3Hf{4?lQayDcZ=kUZ%J`^{s^a6hd{FmW=v4ul=?>o zRxbF}iC9kXpC4q?Z_&B~udb&<_@cJ@bbG^DX9NZBK@ zbnwcI{zbA2MAh1#z0VJ{xnUT*8%!CbXge%TbELuJtKXx#kU~X@J|+MCnE#2F{(L|c zB-slP$=dH=hCqx=U7jRuf_QoN60g!6{x3-Q4|-2NAL>hw7Ki!L`;AnfjsZ%|kOQ3wHt4Ca%eD&61B9Gx%TH||46YlYX(RS^5; zGOjp-;p<%we=|1hBfJ<&AQ;V{KLmi3>jY`zq$M<(=XePSS>x>IR7{<3YZG~3Ua>%t zH#tTORZkdn6X^Fp%x7%loPYX=^h#r96BN(ysg*xqp9Ti0aRvSO+o(rY(bon;gCTq$ zrTf{{cODyg?O|1p6U0RlDl(uavJrIAn!|mS4ayI+$RQ=n!EBqzuPq(f#x+LyU_Zfr zzXaP}Yq;$Vmwq+h03+($KVE + + + + + + +Minecraft Community Edition: detail::is_detected_lazy< Op, Args > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_detected_lazy< Op, Args > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_detected_lazy< Op, Args >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__detected__lazy.png b/doc/html/structdetail_1_1is__detected__lazy.png new file mode 100644 index 0000000000000000000000000000000000000000..e5320ffaa44ff00fff558ca17ef6111703473d91 GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^w}Ci-gBeIJ*ZPnNq@)9ULR|m<{|{uoe*L7#NtYc)B=-R4~4s8(a2Tfv2T? z`nfmtN3U;ec2tm=wc~B8GymjI{dSyB!dnCmEpbvfsk!xrN0E)L*(4c%+njqnSHgR5 z^;K2;R`zr^-~IFMj=g8MZU1Y0_-w)6LgRh+q}=a+n_YLO@6w(0&xS|e&D{9*|9NAN zPqw9-WL2~6tuF;Eew=wbGwE2`w;sKo$(LEayOs!k-yG_;Bj;(r%RgCt$J5R$ob<9S zd4K0*#k+~3K5u(Y-VBV{tG#VTs?j#?w(BK-D=+=p#}%BqJwIW#?%YYMXO_R~zMcDC zcX#R0sjF|)z23X^^OHoUY3jM|zkiGAuRd#3>E!wRmdB)&{(FD-O?;BBWu)#Y_Up=~ z_Z!~!|DDXwcQWLSvTEk3?~7d~h1JWOPbw*C7XIJYt5P4<-K%o^a+31Nk6Sjj3LKil z)Nuc@ID^ls&YS!8J!_pkBiDJhSYFz;sp^agF1lt668_!1496}fF*khNa)TiO7+!>h z9*6-AUg9)i2{4FNGJ#q=rTp7;Lw(=oROEfQwnJ82SaszU<@27C7T?R*lTy9)I{(JE z#eX^%itBC6&8rG2FJC%eEAQCsUeh@DgWvA_nGu|9Gy8Xf#7Z{!Go6I`QeOQ=9Hw zUwZWB>6bmxn-<=AY?LSd{_NgG^Y?H6{3c>!UXS3;l-CvcYR_f4zs*y4x^%AkdDFV~ z$?Ec&2C@2{m7dOJU8%26PoDH8ebWI5U}BvBmN$e^DUk`qo9>8-a + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_getable< BasicJsonType, T > Member List
        +
        +
        + +

        This is the complete list of members for detail::is_getable< BasicJsonType, T >, including all inherited members.

        + + +
        value (defined in detail::is_getable< BasicJsonType, T >)detail::is_getable< BasicJsonType, T >static
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1is__getable.html b/doc/html/structdetail_1_1is__getable.html new file mode 100644 index 0000000..66de516 --- /dev/null +++ b/doc/html/structdetail_1_1is__getable.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_getable< BasicJsonType, T > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_getable< BasicJsonType, T > Struct Template Reference
        +
        +
        + + + +

        +Static Public Attributes

        +static constexpr bool value = is_detected<get_template_function, const BasicJsonType&, T>::value
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__iterator__traits.html b/doc/html/structdetail_1_1is__iterator__traits.html new file mode 100644 index 0000000..d3ae58d --- /dev/null +++ b/doc/html/structdetail_1_1is__iterator__traits.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_iterator_traits< T, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_iterator_traits< T, typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_iterator_traits< T, typename >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__iterator__traits.png b/doc/html/structdetail_1_1is__iterator__traits.png new file mode 100644 index 0000000000000000000000000000000000000000..8105283391946232776f2c80b9682f5c9170f11e GIT binary patch literal 774 zcmV+h1Nr=kP)x_(yr#LVva2S`&=-}Ys|NsB$&ThE?000SeQchC<|NsC0|NsC0Hv*f~0007! zNklwAgkTn3>@TXlFi2?$sHg+XtOuaT$-1Y-6{%`QkH4?$q(c zs1tf+=-NhU(b$pXK{`1{d!Q>hx`6&hjxJ%jR9%ymb7k#U-4yXZQ*}x5V?|JsJYN49 z^igx--Pt!u9;?4|qj4YpK}qsN4N#Kwqyb8jo-~1m5W)on0AJS)0Ir~`fZlEwA-xLd z#CZ+U%Ycrm3jn?}Kmov$1}Fe{(f|bjPa2>A;7J1%06b}c0)QtCPyq0x0SW+~G(Z8s zlLjaNc+vm`08bjA0C1K<2;mAskR<;appxWC15}bcsQ}H*qLn)Jnb>cV^7GQ@%IsJq zx134RJK6-@SZN37y61BEXwc~p@6E?y=2vs0*@T7|BelHz6?v@~kNw+Cwc**#X?%yuf&-i_Ah zR#n|z=vt0V(Asl-ew|{J(zM*;N{Y3ZFXw1Ck~>K6gT9ob3uwKwHPB}{T2$Q_Pxp}^ z*{2CzTVGR+tVi>*)~Fk{ZRD7|sOoGAUAxb%sw+u0364yjyBEC2ui07*qoM6N<$ Ef;5J1tN;K2 literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4-members.html b/doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4-members.html new file mode 100644 index 0000000..6776f66 --- /dev/null +++ b/doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4-members.html @@ -0,0 +1,109 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_iterator_traits< iterator_traits< T > > Member List
        +
        +
        + +

        This is the complete list of members for detail::is_iterator_traits< iterator_traits< T > >, including all inherited members.

        + + +
        value (defined in detail::is_iterator_traits< iterator_traits< T > >)detail::is_iterator_traits< iterator_traits< T > >static
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4.html b/doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4.html new file mode 100644 index 0000000..cfb4414 --- /dev/null +++ b/doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4.html @@ -0,0 +1,158 @@ + + + + + + + +Minecraft Community Edition: detail::is_iterator_traits< iterator_traits< T > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_iterator_traits< iterator_traits< T > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_iterator_traits< iterator_traits< T > >:
        +
        +
        + +
        + + + +

        +Static Public Attributes

        static constexpr auto value
        +

        Member Data Documentation

        + +

        ◆ value

        + +
        +
        +
        +template<typename T>
        + + + + + +
        + + + + +
        auto detail::is_iterator_traits< iterator_traits< T > >::value
        +
        +staticconstexpr
        +
        +Initial value:
        =
        +
        is_detected<value_type_t, traits>::value&&
        +
        is_detected<difference_type_t, traits>::value&&
        +
        is_detected<pointer_t, traits>::value&&
        +
        is_detected<iterator_category_t, traits>::value&&
        +
        is_detected<reference_t, traits>::value
        +
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4.png b/doc/html/structdetail_1_1is__iterator__traits_3_01iterator__traits_3_01_t_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..a4db909658996a8995623c167765fbd354c0daa9 GIT binary patch literal 766 zcmeAS@N?(olHy`uVBq!ia0y~yVB`j}12~w0q~+EH4}g?(fKQ0)|NsAi%-649_w@8E zw=mEwkeGhv#e)YAfa0&tUkkV@L(#+qoAvZC2oE znLhj7zW>7ivjP>8s%@0F75^)}!j$#Z)9y#nK!n1%BUf zqI$~OOJ+7V{t5rTkRB0I{m)!@I$h?G$HIdPbPmSX@yjY`t@^z_q@0Um)&;93~Pg>cXGTr`c_M|;A z=3mbF^=&r|;*aW{E9=R3`R?CE#~&?-U!(KSXMe=!dRzBZd>?JJe?31D7FGXJM)734 z_GX2X)?adUrisloUhq%#kKuRqqYs&TlyJ`t)=2#VS|JC->jnuzwHVs_ZS6 zcX*ChDlshhJSw>UjV3&BTklE-OCl-m`6CdFGo48*86+(`>r~l&?-& z9=Z92#;a=@X0lIm(ttpUqUc`hA_-t9$dNpI^IYuI}w?Zg+j;o_@VDQ_J)J_PV1 + + + + + + +Minecraft Community Edition: detail::is_json_ref< typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_json_ref< typename > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_json_ref< typename >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__json__ref.png b/doc/html/structdetail_1_1is__json__ref.png new file mode 100644 index 0000000000000000000000000000000000000000..fb6a79b21a16ec3892c29952f5a43d4e0a51bf44 GIT binary patch literal 734 zcmeAS@N?(olHy`uVBq!ia0vp^dw@8AgBeIp5qzHjq@)9ULR|m<{|{uoe*L7#Nr`JzX3_Dj46+y?tqk0#A#z z`Q^X={P*;!3#ItI%A2P3Z`0qzh7XdrD!7d|$FVA(v@?C+Y2?g2PsO-Iur4+x>BhYp z!SCl{?()2E`g{Guc^UtuWqCP<&;FI&KcDz=y5#E@S1foYKlyIOo1e0?X8DHD{Xa_! zuikvTgGoMMktWx5=^w|cCjE)Ko^!dazHZ0d+-LkhKOQ;7IOp5hsp8uT-&{1?Czvkt zY~qviyUu>r{UJW@{)5jp`y-Q9o1J^=?V1@r`)=;at8FU&*{$j)wST35_*}j7*^T?2 zpVk-|#n(^s{4}K~$9a-@#(~KxZEQB4X&FuC#;-#dK8Sy1Xo$ON{O9pS!`ky7gsb;| zi9Ot(#mrzS^?_l+LPmZDNm3ZOGiQF)nxXP_C8NG4P~)U23mM{PE!iM6CJ9W?P zRZo_G`2Ob0L&@HkxJ7?xnxB6bV*B^)gv$AcF5Q3D#&Vu9R->Npby})#&xY^U?!IOa z{j=xjsm;o>uk2}BdgqQo)KTtdmTM}nM$apHd!6me2SLjVvVY}&6&6}Zn4itReapbj z;AFgA`tRZ^AI|STE1<{!KKC=*K9|nEPoG!UuHJh(qxb%)nz`MpZe3YlYMgKP`S$)9 zKaXBKUK<~=Ep+F;FEy84ji$clzU^{8|HE1i-5=%i_^+mMTK-R(wBIgdHuD~7OO<@d ze76f=zV;ur`1C5 uZ4;OH@K$)9y3jCv36JlGw6wXe_}SB*+RZ$+C?A*-89ZJ6T-G@yGywpBXlh0P literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1is__json__ref_3_01json__ref_3_01_t_01_4_01_4.html b/doc/html/structdetail_1_1is__json__ref_3_01json__ref_3_01_t_01_4_01_4.html new file mode 100644 index 0000000..0be1633 --- /dev/null +++ b/doc/html/structdetail_1_1is__json__ref_3_01json__ref_3_01_t_01_4_01_4.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_json_ref< json_ref< T > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_json_ref< json_ref< T > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::is_json_ref< json_ref< T > >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1is__json__ref_3_01json__ref_3_01_t_01_4_01_4.png b/doc/html/structdetail_1_1is__json__ref_3_01json__ref_3_01_t_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..43b1c0c5b2d09f5a20f91c5bc21ffcd0321d0f80 GIT binary patch literal 987 zcmeAS@N?(olHy`uVBq!ia0y~yVB7#?2XHV0N&m$c^njFffKQ0)|NsAi%-649_w@8E zw=mEwkeGhv#e)YAfa0&t%V=c{B7y|rJFcu3-4@>-D{TasI`s%TJ`rw z-Ma0!zkWFK_ubEwvgk?IHtyUo{ioh^=L5`(a+P(KJd}v%(YO71e@E=?tnQsVw{Dow zw)m`3SAoZtvn{%Nz7%WO}DiSp*Y-95V@t?OmD;>7*dOzBQEhX6$t63(YQIT!N1q+qcd9&QOYOG}s)_pFHn^_}slH)z zKk=fOZs&IM{3kJ52VWe`zrNY4_^jD}UC-4wR;u`Y=9PTU$ltLo(sRm^(mTPPm%`oz z2&uk2{zl+!eoL(RgWoOE_1>4n{w&;* zB`#A8JiT0Cj3bc|E-vvsEv_zKSPvM^VW?Vqyg-#lfq!}M@ncmy;fEML74%(Mzftb+ zRD*_)k{H3?ATeOTCcr%@IckavYk1WKu#R%Q!`F-JZ z$%X4%=S(}onkv8j(6a2cf@YeXn@e|Y@RO@gOU?B?9hG?h)?qR2C5I1x>^<}?kN05{AB}?>seYx><{eRBt8lCA!+*kkH(ErZo^sQafy#H^swX<`Xk^6tbSKs=Ni?{uq zCzQ6^@?7!%PnCvm`gd>p+x1m9_cyoKj9mQ>^Yu0erQM#Xk+^Mc2awSTXS|37#Vv!( Z345Q + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_range< T > Member List
        +
        +
        + +

        This is the complete list of members for detail::is_range< T >, including all inherited members.

        + + +
        value (defined in detail::is_range< T >)detail::is_range< T >static
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1is__range.html b/doc/html/structdetail_1_1is__range.html new file mode 100644 index 0000000..8ec244e --- /dev/null +++ b/doc/html/structdetail_1_1is__range.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::is_range< T > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::is_range< T > Struct Template Reference
        +
        +
        + + + +

        +Static Public Attributes

        +static constexpr bool value = !std::is_same<iterator, nonesuch>::value && !std::is_same<sentinel, nonesuch>::value&& is_iterator_begin
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1iterator__traits.html b/doc/html/structdetail_1_1iterator__traits.html new file mode 100644 index 0000000..0ca679c --- /dev/null +++ b/doc/html/structdetail_1_1iterator__traits.html @@ -0,0 +1,116 @@ + + + + + + + +Minecraft Community Edition: detail::iterator_traits< T, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::iterator_traits< T, typename > Struct Template Reference
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1iterator__traits_3_01_t_00_01enable__if__t_3_01_9std_1_1is__pointer_3_01_t_01_4_1_1value_01_4_01_4.html b/doc/html/structdetail_1_1iterator__traits_3_01_t_00_01enable__if__t_3_01_9std_1_1is__pointer_3_01_t_01_4_1_1value_01_4_01_4.html new file mode 100644 index 0000000..7c7ae84 --- /dev/null +++ b/doc/html/structdetail_1_1iterator__traits_3_01_t_00_01enable__if__t_3_01_9std_1_1is__pointer_3_01_t_01_4_1_1value_01_4_01_4.html @@ -0,0 +1,125 @@ + + + + + + + +Minecraft Community Edition: detail::iterator_traits< T, enable_if_t< !std::is_pointer< T >::value > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::iterator_traits< T, enable_if_t< !std::is_pointer< T >::value > > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::iterator_traits< T, enable_if_t< !std::is_pointer< T >::value > >:
        +
        +
        + + +detail::iterator_types< T > + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1iterator__traits_3_01_t_00_01enable__if__t_3_01_9std_1_1is__pointer_3_01_t_01_4_1_1value_01_4_01_4.png b/doc/html/structdetail_1_1iterator__traits_3_01_t_00_01enable__if__t_3_01_9std_1_1is__pointer_3_01_t_01_4_1_1value_01_4_01_4.png new file mode 100644 index 0000000000000000000000000000000000000000..86ca4b79d9fe77b17a632001618a0418e2a66f89 GIT binary patch literal 1156 zcmeAS@N?(olHy`uVBq!ia0y~yVC(_112~w0q;1Zo89+)pz$e7@|Ns9$=Iht5dwP17 zTNr2-NK8NT;=zLlK=D`S@^%8{I7@>3f*F8(FfeDDeT9L6h2PV~F{Fa=?cBG0pS5^e z+8v|L{*C{bX|B@HXmWS4R-N|x8F@}W4C*%g6}NmYbIS7h?^d5lij($4Gd8Qt)kv7I zM3|LlQputQ$4P!qnA~RB%j&;1K6&fjOI6RsTmDX5!o9OKG0u+Z@!5?kKLhXbKQ1($ zFZXlr!mr0&+&(}2X~uWI>ih3~Yj^nG*}ZM8N11MdME;*$Up~}-pK@ZGXwKw^YZuRc zKUuYXJ zBeE%V=CZtF4>gV6n9g%?Gk$Dh$)&5XL!o77jKeNf(s~OGWKfk^3$F<$@^U4C|>Uz#y!{7h#@a@Ef zhAZb;m2Fi%)_ZIpmt0`H z&LiU&oW_^`+imlm^f14m>yuKV_I5lwaryGPHTU+oF7Gxr=th7>9Abtd+Q)?e_n@zUkq2yLW_c zp0&~HdgR#`c3;}-HmBKGXP>=a1WbpXpmfL+GRgV&ZP|^nnLOW4x~`2ZFweNZcw+%y za?@7NUfT + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + + + + + + diff --git a/doc/html/structdetail_1_1iterator__traits_3_01_t_01_5_00_01enable__if__t_3_01std_1_1is__object_3_01_t_01_4_1_1value_01_4_01_4.html b/doc/html/structdetail_1_1iterator__traits_3_01_t_01_5_00_01enable__if__t_3_01std_1_1is__object_3_01_t_01_4_1_1value_01_4_01_4.html new file mode 100644 index 0000000..ff19f8c --- /dev/null +++ b/doc/html/structdetail_1_1iterator__traits_3_01_t_01_5_00_01enable__if__t_3_01std_1_1is__object_3_01_t_01_4_1_1value_01_4_01_4.html @@ -0,0 +1,130 @@ + + + + + + + +Minecraft Community Edition: detail::iterator_traits< T *, enable_if_t< std::is_object< T >::value > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::iterator_traits< T *, enable_if_t< std::is_object< T >::value > > Struct Template Reference
        +
        +
        + + + + + + + +

        +Public Types

        +using iterator_category = std::random_access_iterator_tag
        +using value_type = T
        +using difference_type = ptrdiff_t
        +using pointer = T*
        +using reference = T&
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1iterator__types.html b/doc/html/structdetail_1_1iterator__types.html new file mode 100644 index 0000000..b2c28a8 --- /dev/null +++ b/doc/html/structdetail_1_1iterator__types.html @@ -0,0 +1,116 @@ + + + + + + + +Minecraft Community Edition: detail::iterator_types< It, typename > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::iterator_types< It, typename > Struct Template Reference
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1iterator__types_3_01_it_00_01void__t_3_01typename_01_it_1_1difference__type_00_064dac4a14931e9e3b7bc8e1311de4a39.html b/doc/html/structdetail_1_1iterator__types_3_01_it_00_01void__t_3_01typename_01_it_1_1difference__type_00_064dac4a14931e9e3b7bc8e1311de4a39.html new file mode 100644 index 0000000..b4cc42a --- /dev/null +++ b/doc/html/structdetail_1_1iterator__types_3_01_it_00_01void__t_3_01typename_01_it_1_1difference__type_00_064dac4a14931e9e3b7bc8e1311de4a39.html @@ -0,0 +1,130 @@ + + + + + + + +Minecraft Community Edition: detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > > Struct Template Reference
        +
        +
        + + + + + + + +

        +Public Types

        +using difference_type = typename It::difference_type
        +using value_type = typename It::value_type
        +using pointer = typename It::pointer
        +using reference = typename It::reference
        +using iterator_category = typename It::iterator_category
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1iterator__types_3_01_it_00_01void__t_3_01typename_01_it_1_1difference__type_00_0e94592c78302fc510e0aa24e9e691b9b.html b/doc/html/structdetail_1_1iterator__types_3_01_it_00_01void__t_3_01typename_01_it_1_1difference__type_00_0e94592c78302fc510e0aa24e9e691b9b.html new file mode 100644 index 0000000..9d8ea7c --- /dev/null +++ b/doc/html/structdetail_1_1iterator__types_3_01_it_00_01void__t_3_01typename_01_it_1_1difference__type_00_0e94592c78302fc510e0aa24e9e691b9b.html @@ -0,0 +1,113 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > > Member List
        +
        +
        + +

        This is the complete list of members for detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >, including all inherited members.

        + + + + + + +
        difference_type typedef (defined in detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >)detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >
        iterator_category typedef (defined in detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >)detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >
        pointer typedef (defined in detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >)detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >
        reference typedef (defined in detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >)detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >
        value_type typedef (defined in detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >)detail::iterator_types< It, void_t< typename It::difference_type, typename It::value_type, typename It::pointer, typename It::reference, typename It::iterator_category > >
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1make__void-members.html b/doc/html/structdetail_1_1make__void-members.html new file mode 100644 index 0000000..d0d2260 --- /dev/null +++ b/doc/html/structdetail_1_1make__void-members.html @@ -0,0 +1,109 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::make_void< Ts > Member List
        +
        +
        + +

        This is the complete list of members for detail::make_void< Ts >, including all inherited members.

        + + +
        type typedef (defined in detail::make_void< Ts >)detail::make_void< Ts >
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1make__void.html b/doc/html/structdetail_1_1make__void.html new file mode 100644 index 0000000..4e4804d --- /dev/null +++ b/doc/html/structdetail_1_1make__void.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::make_void< Ts > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::make_void< Ts > Struct Template Reference
        +
        +
        + + + +

        +Public Types

        +using type = void
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1negation.html b/doc/html/structdetail_1_1negation.html new file mode 100644 index 0000000..e5090e0 --- /dev/null +++ b/doc/html/structdetail_1_1negation.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::negation< B > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::negation< B > Struct Template Reference
        +
        +
        +
        +Inheritance diagram for detail::negation< B >:
        +
        +
        + +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1negation.png b/doc/html/structdetail_1_1negation.png new file mode 100644 index 0000000000000000000000000000000000000000..44d12cb1e7f6f22ee58a3e121ea8ebc9b11d1392 GIT binary patch literal 802 zcmeAS@N?(olHy`uVBq!ia0vp^uYov#gBeJkzgZLrq@)9ULR|m<{|}OT{ko^8XSs!e zW`V@?GcO)IcmNcCbuMowP>!=C$S;@y$Oi*+rrB2*7?{?2x;TbZFut98``T&+o)&fU zxt0Ib@BNcgP>_pyo5-AP8LGfyCv+)##!OQs2~V?y=e#C;UAcKuO6{qL=WZ{$n|Hex zz1kDz7U_Pm^S#Wz<3(PRSY`7bHGEyN{QSmuYre6(zF*nfZg%2$X~xlsnQKob{F%G! zj?uw1v&ggx{&T6D!tG1nR-WA@!E$*^bIK={Fy+U|DK#~Rzv?n4a@YNQnws)$$=%Jf zD{g4>r(WZ|%wt(Nf73eNa$DB?*6i3@1w|_!Zmsl5z4m0^uGpMSzYhBp{b(qS(n#!$ zwO(^@yD|Uv$ClUjBrKcFQ8`)d3jevH z46lOISsQ*`iDX=0M~u*ewMNF-E(V@iPIE&i0rgH@@~dR7={f&>emiY9Nv~e6a(B`9 z4bONzwO*dcklD}sP3d*PtNPE!FZbJf?qTcBJbhYwuAtPx5AKo2|N8Bo8F%vfpEYh= zW&7%XMQx5d_w4i*WRrME84>62b_PHnSygz&sjzW7CZ zb=OsX@ha4Ht+Zbk`SEvAO!>RlVs{x|_usp|WR;&la=+)lLbJMKGdAqwTc7oA{onmw zmx_P=>AIh&%i=%DZc+d7ujiIbS)%@>S7zFh{1uzMf@)u_nG`agEzEec*%$srH{|}Y TzFZg#OwA0Qu6{1-oD!M<6kdzl literal 0 HcmV?d00001 diff --git a/doc/html/structdetail_1_1nonesuch-members.html b/doc/html/structdetail_1_1nonesuch-members.html new file mode 100644 index 0000000..c521886 --- /dev/null +++ b/doc/html/structdetail_1_1nonesuch-members.html @@ -0,0 +1,114 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::nonesuch Member List
        +
        +
        + +

        This is the complete list of members for detail::nonesuch, including all inherited members.

        + + + + + + + +
        nonesuch()=delete (defined in detail::nonesuch)detail::nonesuch
        nonesuch(nonesuch const &)=delete (defined in detail::nonesuch)detail::nonesuch
        nonesuch(nonesuch const &&)=delete (defined in detail::nonesuch)detail::nonesuch
        operator=(nonesuch const &)=delete (defined in detail::nonesuch)detail::nonesuch
        operator=(nonesuch &&)=delete (defined in detail::nonesuch)detail::nonesuch
        ~nonesuch()=delete (defined in detail::nonesuch)detail::nonesuch
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1nonesuch.html b/doc/html/structdetail_1_1nonesuch.html new file mode 100644 index 0000000..947bc0e --- /dev/null +++ b/doc/html/structdetail_1_1nonesuch.html @@ -0,0 +1,128 @@ + + + + + + + +Minecraft Community Edition: detail::nonesuch Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::nonesuch Struct Reference
        +
        +
        + + + + + + +

        +Public Member Functions

        nonesuch (nonesuch const &)=delete
        nonesuch (nonesuch const &&)=delete
        +void operator= (nonesuch const &)=delete
        +void operator= (nonesuch &&)=delete
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1position__t-members.html b/doc/html/structdetail_1_1position__t-members.html new file mode 100644 index 0000000..463a275 --- /dev/null +++ b/doc/html/structdetail_1_1position__t-members.html @@ -0,0 +1,112 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::position_t Member List
        +
        +
        + +

        This is the complete list of members for detail::position_t, including all inherited members.

        + + + + + +
        chars_read_current_linedetail::position_t
        chars_read_totaldetail::position_t
        lines_readdetail::position_t
        operator size_t() constdetail::position_tinline
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1position__t.html b/doc/html/structdetail_1_1position__t.html new file mode 100644 index 0000000..93b9aec --- /dev/null +++ b/doc/html/structdetail_1_1position__t.html @@ -0,0 +1,142 @@ + + + + + + + +Minecraft Community Edition: detail::position_t Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::position_t Struct Reference
        +
        +
        + +

        struct to capture the start position of the current token + More...

        + +

        #include <json.hpp>

        + + + + +

        +Public Member Functions

        +constexpr operator size_t () const
         conversion to size_t to preserve SAX interface
        + + + + + + + +

        +Public Attributes

        +std::size_t chars_read_total = 0
         the total number of characters read
        +std::size_t chars_read_current_line = 0
         the number of characters read in the current line
        +std::size_t lines_read = 0
         the number of lines read
        +

        Detailed Description

        +

        struct to capture the start position of the current token

        +

        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1priority__tag.html b/doc/html/structdetail_1_1priority__tag.html new file mode 100644 index 0000000..8dfa453 --- /dev/null +++ b/doc/html/structdetail_1_1priority__tag.html @@ -0,0 +1,116 @@ + + + + + + + +Minecraft Community Edition: detail::priority_tag< N > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::priority_tag< N > Struct Template Reference
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1priority__tag_3_010_01_4.html b/doc/html/structdetail_1_1priority__tag_3_010_01_4.html new file mode 100644 index 0000000..fc5fda2 --- /dev/null +++ b/doc/html/structdetail_1_1priority__tag_3_010_01_4.html @@ -0,0 +1,116 @@ + + + + + + + +Minecraft Community Edition: detail::priority_tag< 0 > Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::priority_tag< 0 > Struct Reference
        +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structdetail_1_1static__const-members.html b/doc/html/structdetail_1_1static__const-members.html new file mode 100644 index 0000000..f41d321 --- /dev/null +++ b/doc/html/structdetail_1_1static__const-members.html @@ -0,0 +1,109 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::static_const< T > Member List
        +
        +
        + +

        This is the complete list of members for detail::static_const< T >, including all inherited members.

        + + +
        value (defined in detail::static_const< T >)detail::static_const< T >static
        +
        +
        + + + + diff --git a/doc/html/structdetail_1_1static__const.html b/doc/html/structdetail_1_1static__const.html new file mode 100644 index 0000000..06beb12 --- /dev/null +++ b/doc/html/structdetail_1_1static__const.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: detail::static_const< T > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        detail::static_const< T > Struct Template Reference
        +
        +
        + + + +

        +Static Public Attributes

        +static JSON_INLINE_VARIABLE constexpr T value {}
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structjson__sax-members.html b/doc/html/structjson__sax-members.html new file mode 100644 index 0000000..43b04f1 --- /dev/null +++ b/doc/html/structjson__sax-members.html @@ -0,0 +1,132 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        json_sax< BasicJsonType > Member List
        +
        +
        + +

        This is the complete list of members for json_sax< BasicJsonType >, including all inherited members.

        + + + + + + + + + + + + + + + + + + + + + + + + + +
        binary(binary_t &val)=0json_sax< BasicJsonType >pure virtual
        binary_t typedef (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        boolean(bool val)=0json_sax< BasicJsonType >pure virtual
        end_array()=0json_sax< BasicJsonType >pure virtual
        end_object()=0json_sax< BasicJsonType >pure virtual
        json_sax()=default (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        json_sax(const json_sax &)=default (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        json_sax(json_sax &&) noexcept=default (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        key(string_t &val)=0json_sax< BasicJsonType >pure virtual
        null()=0json_sax< BasicJsonType >pure virtual
        number_float(number_float_t val, const string_t &s)=0json_sax< BasicJsonType >pure virtual
        number_float_t typedef (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        number_integer(number_integer_t val)=0json_sax< BasicJsonType >pure virtual
        number_integer_t typedef (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        number_unsigned(number_unsigned_t val)=0json_sax< BasicJsonType >pure virtual
        number_unsigned_t typedef (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        operator=(const json_sax &)=default (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        operator=(json_sax &&) noexcept=default (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        parse_error(std::size_t position, const std::string &last_token, const detail::exception &ex)=0json_sax< BasicJsonType >pure virtual
        start_array(std::size_t elements)=0json_sax< BasicJsonType >pure virtual
        start_object(std::size_t elements)=0json_sax< BasicJsonType >pure virtual
        string(string_t &val)=0json_sax< BasicJsonType >pure virtual
        string_t typedef (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >
        ~json_sax()=default (defined in json_sax< BasicJsonType >)json_sax< BasicJsonType >virtual
        +
        +
        + + + + diff --git a/doc/html/structjson__sax.html b/doc/html/structjson__sax.html new file mode 100644 index 0000000..76c0f35 --- /dev/null +++ b/doc/html/structjson__sax.html @@ -0,0 +1,648 @@ + + + + + + + +Minecraft Community Edition: json_sax< BasicJsonType > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        json_sax< BasicJsonType > Struct Template Referenceabstract
        +
        +
        + +

        SAX interface. + More...

        + +

        #include <json.hpp>

        + + + + + + + +

        +Public Types

        +using number_integer_t = typename BasicJsonType::number_integer_t
        +using number_unsigned_t = typename BasicJsonType::number_unsigned_t
        +using number_float_t = typename BasicJsonType::number_float_t
        +using string_t = typename BasicJsonType::string_t
        +using binary_t = typename BasicJsonType::binary_t
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        +Public Member Functions

        virtual bool null ()=0
         a null value was read
        virtual bool boolean (bool val)=0
         a boolean value was read
        virtual bool number_integer (number_integer_t val)=0
         an integer number was read
        virtual bool number_unsigned (number_unsigned_t val)=0
         an unsigned integer number was read
        virtual bool number_float (number_float_t val, const string_t &s)=0
         a floating-point number was read
        virtual bool string (string_t &val)=0
         a string value was read
        virtual bool binary (binary_t &val)=0
         a binary value was read
        virtual bool start_object (std::size_t elements)=0
         the beginning of an object was read
        virtual bool key (string_t &val)=0
         an object key was read
        virtual bool end_object ()=0
         the end of an object was read
        virtual bool start_array (std::size_t elements)=0
         the beginning of an array was read
        virtual bool end_array ()=0
         the end of an array was read
        virtual bool parse_error (std::size_t position, const std::string &last_token, const detail::exception &ex)=0
         a parse error occurred
        json_sax (const json_sax &)=default
        json_sax (json_sax &&) noexcept=default
        +json_saxoperator= (const json_sax &)=default
        +json_saxoperator= (json_sax &&) noexcept=default
        +

        Detailed Description

        +
        template<typename BasicJsonType>
        +struct json_sax< BasicJsonType >

        SAX interface.

        +

        This class describes the SAX interface used by nlohmann::json::sax_parse. Each function is called in different situations while the input is parsed. The boolean return value informs the parser whether to continue processing the input.

        +

        Member Function Documentation

        + +

        ◆ binary()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::binary (binary_t & val)
        +
        +pure virtual
        +
        + +

        a binary value was read

        +
        Parameters
        + + +
        [in]valbinary value
        +
        +
        +
        Returns
        whether parsing should proceed
        +
        Note
        It is safe to move the passed binary value.
        + +
        +
        + +

        ◆ boolean()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::boolean (bool val)
        +
        +pure virtual
        +
        + +

        a boolean value was read

        +
        Parameters
        + + +
        [in]valboolean value
        +
        +
        +
        Returns
        whether parsing should proceed
        + +
        +
        + +

        ◆ end_array()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::end_array ()
        +
        +pure virtual
        +
        + +

        the end of an array was read

        +
        Returns
        whether parsing should proceed
        + +
        +
        + +

        ◆ end_object()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::end_object ()
        +
        +pure virtual
        +
        + +

        the end of an object was read

        +
        Returns
        whether parsing should proceed
        + +
        +
        + +

        ◆ key()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::key (string_t & val)
        +
        +pure virtual
        +
        + +

        an object key was read

        +
        Parameters
        + + +
        [in]valobject key
        +
        +
        +
        Returns
        whether parsing should proceed
        +
        Note
        It is safe to move the passed string.
        + +
        +
        + +

        ◆ null()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::null ()
        +
        +pure virtual
        +
        + +

        a null value was read

        +
        Returns
        whether parsing should proceed
        + +
        +
        + +

        ◆ number_float()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + + + + + +
        virtual bool json_sax< BasicJsonType >::number_float (number_float_t val,
        const string_t & s )
        +
        +pure virtual
        +
        + +

        a floating-point number was read

        +
        Parameters
        + + + +
        [in]valfloating-point value
        [in]sraw token value
        +
        +
        +
        Returns
        whether parsing should proceed
        + +
        +
        + +

        ◆ number_integer()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::number_integer (number_integer_t val)
        +
        +pure virtual
        +
        + +

        an integer number was read

        +
        Parameters
        + + +
        [in]valinteger value
        +
        +
        +
        Returns
        whether parsing should proceed
        + +
        +
        + +

        ◆ number_unsigned()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::number_unsigned (number_unsigned_t val)
        +
        +pure virtual
        +
        + +

        an unsigned integer number was read

        +
        Parameters
        + + +
        [in]valunsigned integer value
        +
        +
        +
        Returns
        whether parsing should proceed
        + +
        +
        + +

        ◆ parse_error()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + + + + + + + + + + +
        virtual bool json_sax< BasicJsonType >::parse_error (std::size_t position,
        const std::string & last_token,
        const detail::exception & ex )
        +
        +pure virtual
        +
        + +

        a parse error occurred

        +
        Parameters
        + + + + +
        [in]positionthe position in the input where the error occurs
        [in]last_tokenthe last read token
        [in]exan exception object describing the error
        +
        +
        +
        Returns
        whether parsing should proceed (must return false)
        + +
        +
        + +

        ◆ start_array()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::start_array (std::size_t elements)
        +
        +pure virtual
        +
        + +

        the beginning of an array was read

        +
        Parameters
        + + +
        [in]elementsnumber of array elements or -1 if unknown
        +
        +
        +
        Returns
        whether parsing should proceed
        +
        Note
        binary formats may report the number of elements
        + +
        +
        + +

        ◆ start_object()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::start_object (std::size_t elements)
        +
        +pure virtual
        +
        + +

        the beginning of an object was read

        +
        Parameters
        + + +
        [in]elementsnumber of object elements or -1 if unknown
        +
        +
        +
        Returns
        whether parsing should proceed
        +
        Note
        binary formats may report the number of elements
        + +
        +
        + +

        ◆ string()

        + +
        +
        +
        +template<typename BasicJsonType>
        + + + + + +
        + + + + + + + +
        virtual bool json_sax< BasicJsonType >::string (string_t & val)
        +
        +pure virtual
        +
        + +

        a string value was read

        +
        Parameters
        + + +
        [in]valstring value
        +
        +
        +
        Returns
        whether parsing should proceed
        +
        Note
        It is safe to move the passed string value.
        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_coroutine_scheduler_1_1_task-members.html b/doc/html/structmce_1_1_coroutine_scheduler_1_1_task-members.html new file mode 100644 index 0000000..d0873fd --- /dev/null +++ b/doc/html/structmce_1_1_coroutine_scheduler_1_1_task-members.html @@ -0,0 +1,111 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::CoroutineScheduler::Task Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structmce_1_1_coroutine_scheduler_1_1_task.html b/doc/html/structmce_1_1_coroutine_scheduler_1_1_task.html new file mode 100644 index 0000000..f635204 --- /dev/null +++ b/doc/html/structmce_1_1_coroutine_scheduler_1_1_task.html @@ -0,0 +1,177 @@ + + + + + + + +Minecraft Community Edition: mce::CoroutineScheduler::Task Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::CoroutineScheduler::Task Struct Reference
        +
        +
        + +

        Represents a single scheduled task. + More...

        + +

        #include <CoroutineScheduler.hpp>

        + + + + + +

        +Public Attributes

        Callback callback
        sf::Time interval
        sf::Clock clock
        +

        Detailed Description

        +

        Represents a single scheduled task.

        +

        Holds the callback to invoke, the next execution interval, and a clock used to measure elapsed time since the last invocation.

        +

        Member Data Documentation

        + +

        ◆ callback

        + +
        +
        + + + + +
        Callback mce::CoroutineScheduler::Task::callback
        +
        +

        Task callback invoked when interval elapses.

        + +
        +
        + +

        ◆ clock

        + +
        +
        + + + + +
        sf::Clock mce::CoroutineScheduler::Task::clock
        +
        +

        Clock used to measure elapsed time for this task.

        + +
        +
        + +

        ◆ interval

        + +
        +
        + + + + +
        sf::Time mce::CoroutineScheduler::Task::interval
        +
        +

        Time interval until the next invocation.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_coroutine_scheduler_1_1_task.js b/doc/html/structmce_1_1_coroutine_scheduler_1_1_task.js new file mode 100644 index 0000000..3cee2b3 --- /dev/null +++ b/doc/html/structmce_1_1_coroutine_scheduler_1_1_task.js @@ -0,0 +1,6 @@ +var structmce_1_1_coroutine_scheduler_1_1_task = +[ + [ "callback", "structmce_1_1_coroutine_scheduler_1_1_task.html#a883f91e465a098322335417c86e308ff", null ], + [ "clock", "structmce_1_1_coroutine_scheduler_1_1_task.html#a368f3214e4561e84b6a4cc091409b770", null ], + [ "interval", "structmce_1_1_coroutine_scheduler_1_1_task.html#aac988d329eb108a812656b26fe6a445c", null ] +]; \ No newline at end of file diff --git a/doc/html/structmce_1_1_i_event-members.html b/doc/html/structmce_1_1_i_event-members.html new file mode 100644 index 0000000..04a0fb0 --- /dev/null +++ b/doc/html/structmce_1_1_i_event-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::IEvent Member List
        +
        +
        + +

        This is the complete list of members for mce::IEvent, including all inherited members.

        + + + +
        name() const =0 (defined in mce::IEvent)mce::IEventpure virtual
        ~IEvent()=default (defined in mce::IEvent)mce::IEventvirtual
        +
        +
        + + + + diff --git a/doc/html/structmce_1_1_i_event.html b/doc/html/structmce_1_1_i_event.html new file mode 100644 index 0000000..d80da96 --- /dev/null +++ b/doc/html/structmce_1_1_i_event.html @@ -0,0 +1,133 @@ + + + + + + + +Minecraft Community Edition: mce::IEvent Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::IEvent Struct Referenceabstract
        +
        +
        +
        +Inheritance diagram for mce::IEvent:
        +
        +
        + + +mce::event::LoggerOutput +mce::event::ThreadFinished +mce::event::ThreadStarted + +
        + + + +

        +Public Member Functions

        +virtual const char const * name () const =0
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_i_event.png b/doc/html/structmce_1_1_i_event.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea58afaf54fe01470b6c43826dfaaea8c5a81d7 GIT binary patch literal 1183 zcmeAS@N?(olHy`uVBq!ia0y~yU}6KZ12~w0WavuYKp-U@;1lBd|Nnm=^W3SgnsN)5 zTNr2-NK8NT;=zLlK=F!0ep`WZoFzei!3;n?7??B7zQVx3qUGu07*fIbcJAwQs|-X~ z+g+W0{qwJxlFdE!y!Y#aC6ekZrfj++TlSynk4WtG((CL87(y0tE4Hjo=4HrA;$@h1 zT#CV@-;^OkE}P+k%~8`GzBhW;3pkzlaE^B^ql53N3;`#O{tavl;g8pbMqaO~d+|8k z{?daw8A<>9>t?wMF2Nb_8?7teQ0k%Pg`C zYCkPwD9E+D^x)q6=dp?#lkci7yLtWc<&y$V6};ID0h7y3I22pfgY3ZY#5INmm1`Is zJ_AjA_Hx&{-F6IY56UGNcpOdxMXpJ*RWn?$0IDg?6T89Oux%q71DiL{>&Uu*VrPNj zgBmtK1r~=5c+w==778(3e|~+Q-g8!szSCR*{6P1}P>tQX@BQyXJhk_~rxxBjRax!1 z%c?L^_2sKSadFc_Cvhe7s;soQ<}m41B9zeu5|L{)dBG>I@^Z?%Z>P>q_`5J6a(df`XQ-3b1GN9%S-rW`s>?$6A5;=#rxMesx_;;^_UhvNoe2N zgV{6tZ_dAx@FizfQdP)g^)lg{Z@IgYsuKF{`L$Q(l$@-XUU{cx_ivrY>u>X3iYwH4 z{XFn`QtryKV&9F6_lv3DS$60D?RKde+s{{yUfX!``jX{uOeCJiUstnwQa9VkBlcI^ z?;xXu-6?--b{v0bmo8N!QyM$bBvkLxHhYiQKlkqEMXqO;s?q%{^d#bI^0gTA6YHMU zWqxkoAw8$JH~sGQN36VdeNtDy+T7fBep#ga-~E&GKCC?xz1u5q%GqBnY{jgT^s}4q z@BFcyE!tK)<3rJv7|-dii^Sgu9b4*qZ2tnst!F$REO~W&&H2)1lLON}Z@A}Q+I-hJ zV4L(Fv9AXwPxY<8qG0@JZC-$3anRM{k^e6wyg&0x)$h}Cw$szLa8L2ubU*X4?oUbH zdtJYF9F)71KDBm-zWs8?zi0SOJvPtFD0nYhyxeP-_m(TW!#1DWyKO~f^DOI(KaX#* zO!v*1skl$WuX5SJ+kwWaz0bYc=jCzjuK&HA?W*y5>w{ZV3ST&1Tg)~oWL6CGlqJgQ z&Yx1JF3J8>U73CCjH$inDPRo0+#j%0TIH<&q;nhCCVh!tv0u~U((wpp&sFWF6P7#z zGPL@Dj4BudB(mzbZ!<6{ofe+D_5JUEpZ-MMt7r1O`uLUnmt(-9gu&C*&t;ucLK6Vp CWF_wa literal 0 HcmV?d00001 diff --git a/doc/html/structmce_1_1_subscription_token-members.html b/doc/html/structmce_1_1_subscription_token-members.html new file mode 100644 index 0000000..37ba41e --- /dev/null +++ b/doc/html/structmce_1_1_subscription_token-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_subscription_token.html b/doc/html/structmce_1_1_subscription_token.html new file mode 100644 index 0000000..9b84b33 --- /dev/null +++ b/doc/html/structmce_1_1_subscription_token.html @@ -0,0 +1,183 @@ + + + + + + + +Minecraft Community Edition: mce::SubscriptionToken Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::SubscriptionToken Struct Reference
        +
        +
        + +

        Token object that controls the lifetime of an event subscription. + More...

        + +

        #include <QEventBus.hpp>

        + + + + +

        +Public Member Functions

         ~SubscriptionToken ()
         Destructor.
        + + + +

        +Public Attributes

        eastl::function< void()> unsubscribe
         Callable invoked to perform the unsubscribe action.
        +

        Detailed Description

        +

        Token object that controls the lifetime of an event subscription.

        +

        The destructor will call the stored unsubscribe callable if it is set, causing the associated handler to be removed from the event bus.

        +

        This type is move- and copy-assignable depending on the semantics of the stored eastl::function. Use subscribeRAII to obtain a token.

        +

        Constructor & Destructor Documentation

        + +

        ◆ ~SubscriptionToken()

        + +
        +
        + + + + + +
        + + + + + + + +
        mce::SubscriptionToken::~SubscriptionToken ()
        +
        +inline
        +
        + +

        Destructor.

        +

        Automatically unsubscribes if an unsubscribe callable is present.

        + +
        +
        +

        Member Data Documentation

        + +

        ◆ unsubscribe

        + +
        +
        + + + + +
        eastl::function<void()> mce::SubscriptionToken::unsubscribe
        +
        + +

        Callable invoked to perform the unsubscribe action.

        +

        If empty, destruction of the token has no effect.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_subscription_token.js b/doc/html/structmce_1_1_subscription_token.js new file mode 100644 index 0000000..01e5de8 --- /dev/null +++ b/doc/html/structmce_1_1_subscription_token.js @@ -0,0 +1,5 @@ +var structmce_1_1_subscription_token = +[ + [ "~SubscriptionToken", "structmce_1_1_subscription_token.html#ae8014c0fd7075e841b2b62762e51fba2", null ], + [ "unsubscribe", "structmce_1_1_subscription_token.html#aa7c3dce6c3a9d70bcb5eef10e9d6a712", null ] +]; \ No newline at end of file diff --git a/doc/html/structmce_1_1_thread_func-members.html b/doc/html/structmce_1_1_thread_func-members.html new file mode 100644 index 0000000..9fd2597 --- /dev/null +++ b/doc/html/structmce_1_1_thread_func-members.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadFunc Member List
        +
        +
        + +

        This is the complete list of members for mce::ThreadFunc, including all inherited members.

        + + + +
        run()=0mce::ThreadFuncpure virtual
        ~ThreadFunc()mce::ThreadFuncinlinevirtual
        +
        +
        + + + + diff --git a/doc/html/structmce_1_1_thread_func.html b/doc/html/structmce_1_1_thread_func.html new file mode 100644 index 0000000..de78bc8 --- /dev/null +++ b/doc/html/structmce_1_1_thread_func.html @@ -0,0 +1,175 @@ + + + + + + + +Minecraft Community Edition: mce::ThreadFunc Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadFunc Struct Referenceabstract
        +
        +
        + +

        Abstract type-erased callable interface used as a thread entry point. + More...

        + +

        #include <Thread.hpp>

        +
        +Inheritance diagram for mce::ThreadFunc:
        +
        +
        + + +mce::ThreadFunctor< F > +mce::ThreadMemberFunctor< C > +mce::ThreadMemberFunctorWithArgs< C, Args > + +
        + + + + + + +

        +Public Member Functions

        +virtual ~ThreadFunc ()
         Virtual destructor to allow safe deletion via base pointer.
        virtual void run ()=0
         Execute the wrapped callable.
        +

        Detailed Description

        +

        Abstract type-erased callable interface used as a thread entry point.

        +

        Concrete adapters derive from ThreadFunc and implement run() to invoke the wrapped callable.

        +

        Member Function Documentation

        + +

        ◆ run()

        + +
        +
        + + + + + +
        + + + + + + + +
        virtual void mce::ThreadFunc::run ()
        +
        +pure virtual
        +
        + +

        Execute the wrapped callable.

        +

        Implementations must run the stored callable when this method is invoked.

        + +

        Implemented in mce::ThreadFunctor< F >, mce::ThreadMemberFunctor< C >, and mce::ThreadMemberFunctorWithArgs< C, Args >.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_thread_func.js b/doc/html/structmce_1_1_thread_func.js new file mode 100644 index 0000000..3b74f07 --- /dev/null +++ b/doc/html/structmce_1_1_thread_func.js @@ -0,0 +1,5 @@ +var structmce_1_1_thread_func = +[ + [ "~ThreadFunc", "structmce_1_1_thread_func.html#a326effacbebaefebd61fd3b57a480d39", null ], + [ "run", "structmce_1_1_thread_func.html#a845789c58b4cd7e73c7a99d15c2337f6", null ] +]; \ No newline at end of file diff --git a/doc/html/structmce_1_1_thread_func.png b/doc/html/structmce_1_1_thread_func.png new file mode 100644 index 0000000000000000000000000000000000000000..641d9e134f7da181275a2fe3cbc5a4282a30f190 GIT binary patch literal 1663 zcmb_b{WsHl9RJR)NH&doadJ>IX&p~DJ)lPS=4sM&M7Yisbf=M{uED66uz#8Y$&yQjv+#^Cd~ z4$@;7+jx;o@&MpiG4?6l>IZ-gYD9i`V4ga=3e`z&gIY#7#!9;Qtyr=E#!#nv` ziwn7fD_K)tWpn5DLxhNbWKxBcHya!3vcmJa3D5R~UmLZDW@<#bn0cplY#H)DWLqoJ z9{L!}E0TLiP7N#qXUD1d6X^XhAh2P~f)W8{7e;_@1WlN@R>3#}i~X?f)~1eK7g5k} zZqY>F3-PMVSUiup`H)yHmAbUO{ zH`4-pFa1ZFXmzCTOy#*^G{RCY&I+juAcFu>2V5CIQn2C~DWIN$uvRo&os*ID{PX$& zO8x@soR(&SJin)FJ%77ghHi>g6s&;*+|G~-*f8cM?~Nr8G6BCITuW=6S|s=Jotm<( zTYTVFd})YPulT@b_+qL)0>?5^IBNkXjaxkZ> z9*_)T?Jp$&ax^)hW$mmVL=QGDwO%nl>>5@;N3}_CUkFddQKk9y zw^>bP(UBj~+qI2|{xY9|NWJ^hzO$S=25RZTUVrOm_Um->Odr$78fn5^b?M9)rcL5% zPOH?XMEtFHQSZum@HE{sG17+89&QvGzvlf*L@?N#dUnw)=G)@QC2XOx=^e9b+55bL zCzLp_Fm|-$kyt9TACr9lGjF9~V#^EckvZ?1^r|=p`&Y8p3ggMF*Xzw`y|yFOqE6HW z^ni(HX3bpm4n|RBtIpn2+#dGOc|z|nrmgbv>Z*r*me=KxxR&IqPr0`B?K&Z&s`%ly zruTbzr3vIRx?~BTp4b4F={KT)<-CcAChLNMc1rBBuh3VS^)4yqV!V%;)i$O;UvJZ- zM9+6Lj~t;VN=Ry08d}}!G;W2~g24P#64(^mn7Q)D(0rO6OH>L9W9RJ08vhIcDai{n ziB7LT(d@{jn(%8KmwVXmyWVy`fCR&74DwL?nOO4!VT;E`Sye62u&dvZE?(X_$Z^rR z71!3?ED6Z151ELH3t5phbZ}1vP`(`k?}Tpk350CY|Gp#)Gr!Qqu3(Do34@FY)71)l;H3$4R7+?Jc&aT%A>?GVIJL% z=}x0bkNNa1bWY{b2?;t+z9(h`6Umx<6C(Ju42S;@0j*BrihrI@eud#(-&ygqhb!J$ b@gJ5o5D(&(RGjSU0eBD{Ne;~4gRcGy)`b$C literal 0 HcmV?d00001 diff --git a/doc/html/structmce_1_1_thread_functor-members.html b/doc/html/structmce_1_1_thread_functor-members.html new file mode 100644 index 0000000..34a9fa8 --- /dev/null +++ b/doc/html/structmce_1_1_thread_functor-members.html @@ -0,0 +1,112 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadFunctor< F > Member List
        +
        +
        + +

        This is the complete list of members for mce::ThreadFunctor< F >, including all inherited members.

        + + + + + +
        functormce::ThreadFunctor< F >
        run() overridemce::ThreadFunctor< F >inlinevirtual
        ThreadFunctor(F functor)mce::ThreadFunctor< F >inline
        ~ThreadFunc()mce::ThreadFuncinlinevirtual
        +
        +
        + + + + diff --git a/doc/html/structmce_1_1_thread_functor.html b/doc/html/structmce_1_1_thread_functor.html new file mode 100644 index 0000000..0407175 --- /dev/null +++ b/doc/html/structmce_1_1_thread_functor.html @@ -0,0 +1,225 @@ + + + + + + + +Minecraft Community Edition: mce::ThreadFunctor< F > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadFunctor< F > Struct Template Reference
        +
        +
        + +

        Adapter that wraps a generic functor/lambda. + More...

        + +

        #include <Thread.hpp>

        +
        +Inheritance diagram for mce::ThreadFunctor< F >:
        +
        +
        + + +mce::ThreadFunc + +
        + + + + + + + + + +

        +Public Member Functions

         ThreadFunctor (F functor)
         Construct the adapter with the provided functor.
        virtual void run () override
         Invoke the stored functor.
        Public Member Functions inherited from mce::ThreadFunc
        +virtual ~ThreadFunc ()
         Virtual destructor to allow safe deletion via base pointer.
        + + + +

        +Public Attributes

        +F functor
         The stored functor instance.
        +

        Detailed Description

        +
        template<typename F>
        +struct mce::ThreadFunctor< F >

        Adapter that wraps a generic functor/lambda.

        +
        Template Parameters
        + + +
        FType of the functor or lambda.
        +
        +
        +

        Constructor & Destructor Documentation

        + +

        ◆ ThreadFunctor()

        + +
        +
        +
        +template<typename F>
        + + + + + +
        + + + + + + + +
        mce::ThreadFunctor< F >::ThreadFunctor (F functor)
        +
        +inline
        +
        + +

        Construct the adapter with the provided functor.

        +
        Parameters
        + + +
        functorThe functor or lambda to invoke from run().
        +
        +
        + +
        +
        +

        Member Function Documentation

        + +

        ◆ run()

        + +
        +
        +
        +template<typename F>
        + + + + + +
        + + + + + + + +
        virtual void mce::ThreadFunctor< F >::run ()
        +
        +inlineoverridevirtual
        +
        + +

        Invoke the stored functor.

        + +

        Implements mce::ThreadFunc.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_thread_functor.js b/doc/html/structmce_1_1_thread_functor.js new file mode 100644 index 0000000..91d766f --- /dev/null +++ b/doc/html/structmce_1_1_thread_functor.js @@ -0,0 +1,6 @@ +var structmce_1_1_thread_functor = +[ + [ "ThreadFunctor", "structmce_1_1_thread_functor.html#adf20b2d25c1d267d6201abc5ee019112", null ], + [ "run", "structmce_1_1_thread_functor.html#a15516d7b0dbda4d412ffdbea0eb2bc30", null ], + [ "functor", "structmce_1_1_thread_functor.html#a9146327d84308e61f348693894cc4345", null ] +]; \ No newline at end of file diff --git a/doc/html/structmce_1_1_thread_functor.png b/doc/html/structmce_1_1_thread_functor.png new file mode 100644 index 0000000000000000000000000000000000000000..f917d66d194e090fc2d4ffb5ad841a395de6aff7 GIT binary patch literal 635 zcmV->0)+jEP)(Uk0000RP)t-s|Ns90 z007R)^(h{qr#LVva2S`&=-}Ys|NsAZ!cMgS000SeQchC<|NsC0|NsC0Hv*f~00068 zNklpdx()M8@$y4rEYaB^_#+S7#kDS|)q=%VZsm$iE?cNrl+SN<7PA0mwd#vSj zl!_#eOzldl`UJD=WqUlN{5}jD*zE}>dh^<~GF{4-;t?xZ+pbe5$tym#v;E!MJw?iL z@c4Z@lFc!!-Kod#+V#zH_GVA}uJ28fJmYOUJB)TJ+PXDin@n3JGhjb3vn2U!3@Dg?a;3Mn+z(?2t zfRC^P03Tro06xMF0DOcU0Qd+y0PqoZ0N^9+0KiAs0f3MH%PysqmIXHz6F^nSI*Nm9?n-Dmf`Te}i9x09qZuIwafz{{>wW^>qfVK-Cl>ZMvI6W!W9 z)^gg!>|Zs(M|LGueS%r`vX%VpYQhF~djj)Um3}SuyC%`(&7St%xHk`5 z`@HY$FxsiGTYoK^O#2_j4A?VOJF}9SV>+{vv>ah4Nj}0(l6-`nB>7n0E~S)K + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadManager::ThreadInfo Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structmce_1_1_thread_manager_1_1_thread_info.html b/doc/html/structmce_1_1_thread_manager_1_1_thread_info.html new file mode 100644 index 0000000..9ea09ed --- /dev/null +++ b/doc/html/structmce_1_1_thread_manager_1_1_thread_info.html @@ -0,0 +1,142 @@ + + + + + + + +Minecraft Community Edition: mce::ThreadManager::ThreadInfo Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadManager::ThreadInfo Struct Reference
        +
        +
        + +

        Metadata stored per managed thread. + More...

        + +

        #include <ThreadManager.hpp>

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

        +Public Attributes

        +Threadthread
         Non-owning pointer to the tracked Thread.
        +eastl::string name
         Human readable thread name.
        +std::chrono::steady_clock::time_point startTime
         Time point when the thread was started.
        +std::chrono::steady_clock::time_point endTime
        +bool finished = false
         True when the thread has finished execution.
        +

        Detailed Description

        +

        Metadata stored per managed thread.

        +

        ThreadInfo contains a pointer to the Thread instance (non-owning), a human-readable name, timestamps for start/end and a finished flag.

        +

        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_thread_manager_1_1_thread_info.js b/doc/html/structmce_1_1_thread_manager_1_1_thread_info.js new file mode 100644 index 0000000..ce96a2a --- /dev/null +++ b/doc/html/structmce_1_1_thread_manager_1_1_thread_info.js @@ -0,0 +1,7 @@ +var structmce_1_1_thread_manager_1_1_thread_info = +[ + [ "finished", "structmce_1_1_thread_manager_1_1_thread_info.html#a5eef90a23c053aa432cd9b0e6f776676", null ], + [ "name", "structmce_1_1_thread_manager_1_1_thread_info.html#aee473db051066cd05bbc9225a7238982", null ], + [ "startTime", "structmce_1_1_thread_manager_1_1_thread_info.html#abd381cf47c56be2cf32ac833a4f06197", null ], + [ "thread", "structmce_1_1_thread_manager_1_1_thread_info.html#aadf689cbdeea6113d039d8cad5c72591", null ] +]; \ No newline at end of file diff --git a/doc/html/structmce_1_1_thread_member_functor-members.html b/doc/html/structmce_1_1_thread_member_functor-members.html new file mode 100644 index 0000000..2bfb70b --- /dev/null +++ b/doc/html/structmce_1_1_thread_member_functor-members.html @@ -0,0 +1,113 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadMemberFunctor< C > Member List
        +
        +
        + +

        This is the complete list of members for mce::ThreadMemberFunctor< C >, including all inherited members.

        + + + + + + +
        functormce::ThreadMemberFunctor< C >
        objectmce::ThreadMemberFunctor< C >
        run() overridemce::ThreadMemberFunctor< C >inlinevirtual
        ThreadMemberFunctor(void(C::*function)(), C *object)mce::ThreadMemberFunctor< C >inline
        ~ThreadFunc()mce::ThreadFuncinlinevirtual
        +
        +
        + + + + diff --git a/doc/html/structmce_1_1_thread_member_functor.html b/doc/html/structmce_1_1_thread_member_functor.html new file mode 100644 index 0000000..4f4be2e --- /dev/null +++ b/doc/html/structmce_1_1_thread_member_functor.html @@ -0,0 +1,234 @@ + + + + + + + +Minecraft Community Edition: mce::ThreadMemberFunctor< C > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadMemberFunctor< C > Struct Template Reference
        +
        +
        + +

        Adapter that wraps a member function without extra arguments. + More...

        + +

        #include <Thread.hpp>

        +
        +Inheritance diagram for mce::ThreadMemberFunctor< C >:
        +
        +
        + + +mce::ThreadFunc + +
        + + + + + + + + + +

        +Public Member Functions

         ThreadMemberFunctor (void(C::*function)(), C *object)
         Construct with member function pointer and target object.
        virtual void run () override
         Invoke the stored member function on the stored object.
        Public Member Functions inherited from mce::ThreadFunc
        +virtual ~ThreadFunc ()
         Virtual destructor to allow safe deletion via base pointer.
        + + + + + +

        +Public Attributes

        +void(C::* functor )()
         Pointer to the member function to invoke.
        +C * object
         Pointer to the object instance used when invoking the member function.
        +

        Detailed Description

        +
        template<typename C>
        +struct mce::ThreadMemberFunctor< C >

        Adapter that wraps a member function without extra arguments.

        +
        Template Parameters
        + + +
        CClass type that owns the member function.
        +
        +
        +

        Constructor & Destructor Documentation

        + +

        ◆ ThreadMemberFunctor()

        + +
        +
        +
        +template<typename C>
        + + + + + +
        + + + + + + + + + + + +
        mce::ThreadMemberFunctor< C >::ThreadMemberFunctor (void(C::* function )(),
        C * object )
        +
        +inline
        +
        + +

        Construct with member function pointer and target object.

        +
        Parameters
        + + + +
        functionMember function pointer to call.
        objectTarget object on which to call the member function.
        +
        +
        + +
        +
        +

        Member Function Documentation

        + +

        ◆ run()

        + +
        +
        +
        +template<typename C>
        + + + + + +
        + + + + + + + +
        virtual void mce::ThreadMemberFunctor< C >::run ()
        +
        +inlineoverridevirtual
        +
        + +

        Invoke the stored member function on the stored object.

        +

        Note: the exact invocation expression depends on how the pointer-to-member is stored and used by the adapter.

        + +

        Implements mce::ThreadFunc.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_thread_member_functor.js b/doc/html/structmce_1_1_thread_member_functor.js new file mode 100644 index 0000000..1070b9a --- /dev/null +++ b/doc/html/structmce_1_1_thread_member_functor.js @@ -0,0 +1,7 @@ +var structmce_1_1_thread_member_functor = +[ + [ "ThreadMemberFunctor", "structmce_1_1_thread_member_functor.html#a1dc618e61e73f82c5898e873e486e480", null ], + [ "run", "structmce_1_1_thread_member_functor.html#a53486e3258e69a89e50a62e47ab3edfd", null ], + [ "functor", "structmce_1_1_thread_member_functor.html#a3720c4df81fb32687f5b836232b7f044", null ], + [ "object", "structmce_1_1_thread_member_functor.html#a6cf5ef7fac6e9cca36187edc9e52c6c6", null ] +]; \ No newline at end of file diff --git a/doc/html/structmce_1_1_thread_member_functor.png b/doc/html/structmce_1_1_thread_member_functor.png new file mode 100644 index 0000000000000000000000000000000000000000..a130443667e88008238aca78e206033932ff2e96 GIT binary patch literal 715 zcmeAS@N?(olHy`uVBq!ia0vp^XMi|>gBeIBMP&T|QqloFA+G=b{|7S9o%*UNw{W?I zfo6fk^fNCWJa_;UuQ=ql6)4A9666=m0OW&#In(Sb3=B+Ro-U3d6^w7^CicBn;Av^^ z4Egy_y)IVaAls$1&$p(w#*~VgS{##azPbO#w%lmf8y-cxtUR7oAqOTbaj#`oo60Zj zIq#Ka^ka`t%D*NV?>zL~K;@_7-PV)8nDG>O&$!BXSThOFE3;Pe=2$M_vw(IkSsc-q( zmi+RYYpHu%^i0Kt^L;ln&-c{2PTGH^{_u_LQ*jKpL`B20uFK8X{p5YV@uZUF4T_%q zToRMMtN<~hc++lg%N1liApe4qVReS;jN{3Qv!*7@(|LVChgEpHB*Tx80}KuBtUL@A zq%i*YX)fK;HNnN@TEKyh4xm;baYc1TRrrb57oNY7GvJ(Ks}d3@z72B6yuzRKCnQ#kf zpL3;a*0gQouVl2HwIQgVH6SzEXs*-Y86A3Izwa*GI{%bpZ1w3Y*0)zDOC{_&b>{Wg z7yQ4ICU5JtDO?sf@6Zi3>BMhdry2t!%NBp* + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadMemberFunctorWithArgs< C, Args > Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structmce_1_1_thread_member_functor_with_args.html b/doc/html/structmce_1_1_thread_member_functor_with_args.html new file mode 100644 index 0000000..8dde456 --- /dev/null +++ b/doc/html/structmce_1_1_thread_member_functor_with_args.html @@ -0,0 +1,243 @@ + + + + + + + +Minecraft Community Edition: mce::ThreadMemberFunctorWithArgs< C, Args > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::ThreadMemberFunctorWithArgs< C, Args > Struct Template Reference
        +
        +
        + +

        Adapter that wraps a member function with arbitrary arguments. + More...

        + +

        #include <Thread.hpp>

        +
        +Inheritance diagram for mce::ThreadMemberFunctorWithArgs< C, Args >:
        +
        +
        + + +mce::ThreadFunc + +
        + + + + + + + + + +

        +Public Member Functions

         ThreadMemberFunctorWithArgs (void(C::*function)(Args...), C *object, Args &&... args)
         Construct with member function pointer, target object and arguments.
        virtual void run () override
         Invoke the stored member function forwarding the stored arguments.
        Public Member Functions inherited from mce::ThreadFunc
        +virtual ~ThreadFunc ()
         Virtual destructor to allow safe deletion via base pointer.
        + + + + + + + +

        +Public Attributes

        +void(C::* functor )(Args...)
         Pointer to the member function to invoke.
        +C * object
         Pointer to the object instance used when invoking the member function.
        +std::tuple< Args... > args
         Tuple holding the arguments to forward to the member function.
        +

        Detailed Description

        +
        template<typename C, typename... Args>
        +struct mce::ThreadMemberFunctorWithArgs< C, Args >

        Adapter that wraps a member function with arbitrary arguments.

        +
        Template Parameters
        + + + +
        CClass type that owns the member function.
        ArgsTypes of the arguments to forward when invoking the member function.
        +
        +
        +

        Constructor & Destructor Documentation

        + +

        ◆ ThreadMemberFunctorWithArgs()

        + +
        +
        +
        +template<typename C, typename... Args>
        + + + + + +
        + + + + + + + + + + + + + + + + +
        mce::ThreadMemberFunctorWithArgs< C, Args >::ThreadMemberFunctorWithArgs (void(C::* function )(Args...),
        C * object,
        Args &&... args )
        +
        +inline
        +
        + +

        Construct with member function pointer, target object and arguments.

        +
        Parameters
        + + + + +
        functionMember function pointer to call.
        objectTarget object on which to call the member function.
        argsArguments to forward when invoking the member function.
        +
        +
        + +
        +
        +

        Member Function Documentation

        + +

        ◆ run()

        + +
        +
        +
        +template<typename C, typename... Args>
        + + + + + +
        + + + + + + + +
        virtual void mce::ThreadMemberFunctorWithArgs< C, Args >::run ()
        +
        +inlineoverridevirtual
        +
        + +

        Invoke the stored member function forwarding the stored arguments.

        + +

        Implements mce::ThreadFunc.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_thread_member_functor_with_args.js b/doc/html/structmce_1_1_thread_member_functor_with_args.js new file mode 100644 index 0000000..d7825ba --- /dev/null +++ b/doc/html/structmce_1_1_thread_member_functor_with_args.js @@ -0,0 +1,8 @@ +var structmce_1_1_thread_member_functor_with_args = +[ + [ "ThreadMemberFunctorWithArgs", "structmce_1_1_thread_member_functor_with_args.html#ad7b3374d69d6e0a3c606a299c47ccdf4", null ], + [ "run", "structmce_1_1_thread_member_functor_with_args.html#aff17a973bcfacc0ee487458c0ca5f228", null ], + [ "args", "structmce_1_1_thread_member_functor_with_args.html#a8256fbf40767aa3a44a6362d4575e540", null ], + [ "functor", "structmce_1_1_thread_member_functor_with_args.html#a437472525ce47993742f5063277aa3c5", null ], + [ "object", "structmce_1_1_thread_member_functor_with_args.html#a5719012094127c1e0808b71f3b668038", null ] +]; \ No newline at end of file diff --git a/doc/html/structmce_1_1_thread_member_functor_with_args.png b/doc/html/structmce_1_1_thread_member_functor_with_args.png new file mode 100644 index 0000000000000000000000000000000000000000..d443fa1f44ba3d423d1dccb0641ab9380bc6e82b GIT binary patch literal 953 zcmeAS@N?(olHy`uVBq!ia0y~yU{nUO12~w0WUBq+BS13f*F8(FfeDDeT9L6*~QbvF{Fa=?cCRSkF9vv z+~+qmz5jni{cGqHonz@6eRpei``nG1lGLa9N`LFMSy!T7i>y*non)dY>lx%@HEGF= z5*1IwmmZUn_T3DOtPfGiJe6G1J$cFW&wop|sQkM#QKeQ`zhFzq$*iQcEb#)f7w2ZI zmK48h^=psb|2SP$&-eq{GP<0(mAg(yI?Z3H_g(+6p3GeCn!QV=UkO~D;_*h{>f_Md zw;2K&p7CeOEk4~XFWK@sLT_&G{YM@_pLecVyt4QHgNz)d&3nz>x+kBXv_${O)V@EB zPpiwKoqcbtTC!H+`oH_nVkR%Cp9OR0rHLv>mneI7dAd&$ncSzMsRs1OnZto=x2kQu zX2tv<{UhT91|Ls%21R*!O-=mnP1P^szEB?%w${ zBm2EryPezjhVBEaqhGH|OH;o4_k6v1-}#zUvu)VmcP#Eta_KxyTj|xy|vbT ze_mJoDO7Lne!ky)W9gPN5#dq6U+!&xf1@o--fma<7CxENa>eIWZ>@@6G^^wDb;;XD zbhnqqpDoq?7Oh&Gy{LRk&C7`s^xqu5SN7j1r?%$((#UTyYho9bK2h2gQUAKft~-1F zy}YB!Pd!Eb)vcm^WqUJ;P{~h>bdwct?$3=6v@1}j3wX1lo?Y_THa`|`PI2XA4^{#)`mh*1SE#3NJZt>YO zZ*(grov*2|`V`lgTe~DWM4fvBAk9 literal 0 HcmV?d00001 diff --git a/doc/html/structmce_1_1_virtual_file_system_1_1_config-members.html b/doc/html/structmce_1_1_virtual_file_system_1_1_config-members.html new file mode 100644 index 0000000..851ac92 --- /dev/null +++ b/doc/html/structmce_1_1_virtual_file_system_1_1_config-members.html @@ -0,0 +1,111 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::VirtualFileSystem::Config Member List
        +
        + +
        +
        + + + + diff --git a/doc/html/structmce_1_1_virtual_file_system_1_1_config.html b/doc/html/structmce_1_1_virtual_file_system_1_1_config.html new file mode 100644 index 0000000..bf7c7cf --- /dev/null +++ b/doc/html/structmce_1_1_virtual_file_system_1_1_config.html @@ -0,0 +1,176 @@ + + + + + + + +Minecraft Community Edition: mce::VirtualFileSystem::Config Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::VirtualFileSystem::Config Struct Reference
        +
        +
        + +

        Configuration for how the VirtualFileSystem should operate. + More...

        + +

        #include <VirtualFileSystem.hpp>

        + + + + + +

        +Public Attributes

        bool useStreamInput = false
        FileBinaryType fileType = FileBinaryType::NONE
        Version version = { 0 }
        +

        Detailed Description

        +

        Configuration for how the VirtualFileSystem should operate.

        +

        Member Data Documentation

        + +

        ◆ fileType

        + +
        +
        + + + + +
        FileBinaryType mce::VirtualFileSystem::Config::fileType = FileBinaryType::NONE
        +
        +

        Type of stored file collection.

        + +
        +
        + +

        ◆ useStreamInput

        + +
        +
        + + + + +
        bool mce::VirtualFileSystem::Config::useStreamInput = false
        +
        +

        If true, files are accessed via streams; otherwise VFS binary may be used in-memory.

        + +
        +
        + +

        ◆ version

        + +
        +
        + + + + +
        Version mce::VirtualFileSystem::Config::version = { 0 }
        +
        +

        Version of the VFS format to expect.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1_virtual_file_system_1_1_config.js b/doc/html/structmce_1_1_virtual_file_system_1_1_config.js new file mode 100644 index 0000000..f305e4c --- /dev/null +++ b/doc/html/structmce_1_1_virtual_file_system_1_1_config.js @@ -0,0 +1,6 @@ +var structmce_1_1_virtual_file_system_1_1_config = +[ + [ "fileType", "structmce_1_1_virtual_file_system_1_1_config.html#a68337b00a6b442330be53200de7c8253", null ], + [ "useStreamInput", "structmce_1_1_virtual_file_system_1_1_config.html#ae4bb57adc6625136aa75f6e94fe18307", null ], + [ "version", "structmce_1_1_virtual_file_system_1_1_config.html#a7194f22656273211636586825f301573", null ] +]; \ No newline at end of file diff --git a/doc/html/structmce_1_1event_1_1_logger_output-members.html b/doc/html/structmce_1_1event_1_1_logger_output-members.html new file mode 100644 index 0000000..fce3d98 --- /dev/null +++ b/doc/html/structmce_1_1event_1_1_logger_output-members.html @@ -0,0 +1,115 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::event::LoggerOutput Member List
        +
        +
        + +

        This is the complete list of members for mce::event::LoggerOutput, including all inherited members.

        + + + + + + + + +
        location (defined in mce::event::LoggerOutput)mce::event::LoggerOutput
        LoggerOutput(Severity s=Severity::INFO, const std::string m="", eastl::optional< std::source_location > loc=eastl::nullopt) (defined in mce::event::LoggerOutput)mce::event::LoggerOutputinlineexplicit
        msg (defined in mce::event::LoggerOutput)mce::event::LoggerOutput
        name() const override (defined in mce::event::LoggerOutput)mce::event::LoggerOutputinlinevirtual
        Severity enum name (defined in mce::event::LoggerOutput)mce::event::LoggerOutput
        severity (defined in mce::event::LoggerOutput)mce::event::LoggerOutput
        ~IEvent()=default (defined in mce::IEvent)mce::IEventvirtual
        +
        +
        + + + + diff --git a/doc/html/structmce_1_1event_1_1_logger_output.html b/doc/html/structmce_1_1event_1_1_logger_output.html new file mode 100644 index 0000000..00f477f --- /dev/null +++ b/doc/html/structmce_1_1event_1_1_logger_output.html @@ -0,0 +1,181 @@ + + + + + + + +Minecraft Community Edition: mce::event::LoggerOutput Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::event::LoggerOutput Struct Reference
        +
        +
        +
        +Inheritance diagram for mce::event::LoggerOutput:
        +
        +
        + + +mce::IEvent + +
        + + + +

        +Public Types

        enum class  Severity {
        +  INFO +, WARN +, ERROR +, DEBUG +,
        +  FATAL +
        + }
        + + + +

        +Public Member Functions

        LoggerOutput (Severity s=Severity::INFO, const std::string m="", eastl::optional< std::source_location > loc=eastl::nullopt)
        virtual const char const * name () const override
        + + + + +

        +Public Attributes

        +Severity severity
        +std::string msg
        +eastl::optional< std::source_location > location
        +

        Member Function Documentation

        + +

        ◆ name()

        + +
        +
        + + + + + +
        + + + + + + + +
        virtual const char const * mce::event::LoggerOutput::name () const
        +
        +inlinenodiscardoverridevirtual
        +
        + +

        Implements mce::IEvent.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1event_1_1_logger_output.png b/doc/html/structmce_1_1event_1_1_logger_output.png new file mode 100644 index 0000000000000000000000000000000000000000..26ab854c3913f3c04f6ef62bbfa24283859b7bb9 GIT binary patch literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^vw=8(gBeI#PWXNjNJ$6ygt-3y{~yRacj~LA+`{D+ z2ATyD)6cwk@ZbSZyyB4GR-hbbNswPK1CS2}=1jA%FfcHF@pN$vsbG9N_jcZ41p$|K z$F67p_wO)c<1x$JyHlxj^_+EQzE&ho4nHFCc!|QKCsTGvd)_KEpS0z3(Dn^Am*hS9 zc3k(H#2oj|ZPNFO&Cx5EENyeANo_Y(3;J%9eOl8q?%11Y+fE9_u9$yqZOgvND*6fM zqxAzn74OMc|C+yJYxw@VcBQBCn(@oianRD_J*Lg*^4=?cB?)CH3%x|T;w68ng zbIB^#tpp4LFi%I@^4yw%AwJZ7QJ@WCpN!9Y`Z_uahDr+nXRTj8s1 zzIpa_O$M8$-HZ*g<;)D$@7Ng1?(j0a*&)qvqtKjT!{a=LgyVM^4)h@__%|_{L(zw; zNyWEwx923;^2sXJ=XYQId0jjzyI{+qg%73kG82q{`ETE_Eobw#>96kPR4{vP9KAnm_oaE;ABr9S zdu*X~XZ*2ktL5(Be{?PG#;1Vu%TFFP-M;I9_Z_$Iw!7!5=skT~Al1LibomAS$p5h? zZ@<_#SIqL>_HS + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::event::ThreadFinished Member List
        +
        +
        + +

        This is the complete list of members for mce::event::ThreadFinished, including all inherited members.

        + + + + + +
        name() const override (defined in mce::event::ThreadFinished)mce::event::ThreadFinishedinlinevirtual
        thread (defined in mce::event::ThreadFinished)mce::event::ThreadFinished
        ThreadFinished(Thread *ptr) (defined in mce::event::ThreadFinished)mce::event::ThreadFinishedinline
        ~IEvent()=default (defined in mce::IEvent)mce::IEventvirtual
        +
        +
        + + + + diff --git a/doc/html/structmce_1_1event_1_1_thread_finished.html b/doc/html/structmce_1_1event_1_1_thread_finished.html new file mode 100644 index 0000000..edc20c0 --- /dev/null +++ b/doc/html/structmce_1_1event_1_1_thread_finished.html @@ -0,0 +1,165 @@ + + + + + + + +Minecraft Community Edition: mce::event::ThreadFinished Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::event::ThreadFinished Struct Reference
        +
        +
        +
        +Inheritance diagram for mce::event::ThreadFinished:
        +
        +
        + + +mce::IEvent + +
        + + + + +

        +Public Member Functions

        ThreadFinished (Thread *ptr)
        virtual const char const * name () const override
        + + +

        +Public Attributes

        +Threadthread
        +

        Member Function Documentation

        + +

        ◆ name()

        + +
        +
        + + + + + +
        + + + + + + + +
        virtual const char const * mce::event::ThreadFinished::name () const
        +
        +inlineoverridevirtual
        +
        + +

        Implements mce::IEvent.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1event_1_1_thread_finished.png b/doc/html/structmce_1_1event_1_1_thread_finished.png new file mode 100644 index 0000000000000000000000000000000000000000..8ff52bd92fd5ad7fa96e026e80ecac616d6d239b GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0vp^%YZn5gBeIJnfuQXNJ$6ygt-3y{~yRacj~LA+`{D+ z2ATyD)6cwk@ZbSZyyB4GR-hbbNswPK1CS2}=1jA%FfcIw@pN$vsbG9N_wA;|3IZ;( zmuX#n|Nls~fPg@9QTaQ!Z1ty_F8lbHgMW5QB=527P^m19nXIz5z<1J?N8%=jKP{2> z^t1ToH_83aBsEXDkMB*KOHVpxCtuI7JMEGc=eBmD+R5`j7N$iR{w{H?jXE3jrB~&r zo_%lH``|@p_s-tc+qdRsnoss5r?^@B*H=z)iYzW?_4p*rW3oMI(#!0o+TRy```mx? zS~p^DR`E%dNq<=WZ&vZthPmL7spq9GSL0(6`uq$LpBWln7xSMz{#b0@_X{yP?;lhO z`<^dh*l^gC@c`F#76$DYVTLsYz6=`<;T8DNZ|cnP@Rx$erK^R$o|_Jts-EoHe_iKs zvDdX-DsLmBiuW%|uD#uVHvWyt>DN1#shqXE?vogCy)tjBm}y9*kJ9xZpILd4#{K6f zzFwANdik~4d$Xq(_Fwmj{iG9X_wV#D4lvsj(JYn5wfs=wBHt!ScIuq^V}SvDTKvpebFDU%GOO(tG(|AMeVD&HFY#``gW%_1eGR`Db`6%!|GqQ+s`S`#+`2sxNo#Sf&#B qaMq-h)@-jyqTes_D7Kvb%zpY&=QRFkqf@}d!QkoY=d#Wzp$Py$VJFZ4 literal 0 HcmV?d00001 diff --git a/doc/html/structmce_1_1event_1_1_thread_started-members.html b/doc/html/structmce_1_1event_1_1_thread_started-members.html new file mode 100644 index 0000000..7b20d2b --- /dev/null +++ b/doc/html/structmce_1_1event_1_1_thread_started-members.html @@ -0,0 +1,113 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::event::ThreadStarted Member List
        +
        +
        + +

        This is the complete list of members for mce::event::ThreadStarted, including all inherited members.

        + + + + + + +
        name() const override (defined in mce::event::ThreadStarted)mce::event::ThreadStartedinlinevirtual
        threadName (defined in mce::event::ThreadStarted)mce::event::ThreadStarted
        threadPtr (defined in mce::event::ThreadStarted)mce::event::ThreadStarted
        ThreadStarted(Thread const *p, const eastl::string &n) (defined in mce::event::ThreadStarted)mce::event::ThreadStartedinline
        ~IEvent()=default (defined in mce::IEvent)mce::IEventvirtual
        +
        +
        + + + + diff --git a/doc/html/structmce_1_1event_1_1_thread_started.html b/doc/html/structmce_1_1event_1_1_thread_started.html new file mode 100644 index 0000000..96ad8cf --- /dev/null +++ b/doc/html/structmce_1_1event_1_1_thread_started.html @@ -0,0 +1,167 @@ + + + + + + + +Minecraft Community Edition: mce::event::ThreadStarted Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::event::ThreadStarted Struct Reference
        +
        +
        +
        +Inheritance diagram for mce::event::ThreadStarted:
        +
        +
        + + +mce::IEvent + +
        + + + + +

        +Public Member Functions

        ThreadStarted (Thread const *p, const eastl::string &n)
        virtual const char const * name () const override
        + + + +

        +Public Attributes

        +Thread const * threadPtr
        +const eastl::string threadName
        +

        Member Function Documentation

        + +

        ◆ name()

        + +
        +
        + + + + + +
        + + + + + + + +
        virtual const char const * mce::event::ThreadStarted::name () const
        +
        +inlineoverridevirtual
        +
        + +

        Implements mce::IEvent.

        + +
        +
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structmce_1_1event_1_1_thread_started.png b/doc/html/structmce_1_1event_1_1_thread_started.png new file mode 100644 index 0000000000000000000000000000000000000000..4e26979e9c98b57509fe3fe00851fd71aaa66b9f GIT binary patch literal 618 zcmV-w0+s!VP)E+FO>G_l&NgifF4Pn@p-+}9cq%sTn&1!worzjQA=h?@;(l|vQqUh zO@Btc*4ROkyn`ou)}v)ZVKgWyZo}WxJ1dQxT*yvrZ;*5;scm%{nh z;o8bwt@~*&E`7LF2ua>0{;83qm(U|gFQG@0UP6x~y*%}D&Usn@;GH}GU|#0ddpxH0 zn_KT`H?!a5dQrIm;3xC|z)R=>fS1q%0572j0A4~50K9}A0C)*K0Pqre0N^F`0KiM= z0f3j#0{}1onO;gM%?pww%}VG=l9$kvBrkv0Yw@+zdS8^{aSz1cN z(|6bQa5PsNF$2R?<99ZD<3elX*g0*shr7kfG)ueCZsMQy>IF8PCF!+yN3X?=0mjzc z8awf2_V(4e$;X}S9VW+Kn$1*~dYi4Tol)Ta;o3X(v)}tz1c(kI<7OFQF$%UP4cjyv(ncQcBbE4^uOOwd-{r>i_@%07*qoM6N<$ Ef?6jse*gdg literal 0 HcmV?d00001 diff --git a/doc/html/structordered__map.html b/doc/html/structordered__map.html new file mode 100644 index 0000000..ca97b1c --- /dev/null +++ b/doc/html/structordered__map.html @@ -0,0 +1,123 @@ + + + + + + + +Minecraft Community Edition: ordered_map< Key, T, IgnoredLess, Allocator > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        ordered_map< Key, T, IgnoredLess, Allocator > Struct Template Reference
        +
        +
        + +

        a minimal map-like container that preserves insertion order + More...

        +

        Detailed Description

        +
        template<class Key, class T, class IgnoredLess, class Allocator>
        +struct ordered_map< Key, T, IgnoredLess, Allocator >

        a minimal map-like container that preserves insertion order

        +
        See also
        https://json.nlohmann.me/api/ordered_map/
        +

        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structstring__t__helper-members.html b/doc/html/structstring__t__helper-members.html new file mode 100644 index 0000000..2997dca --- /dev/null +++ b/doc/html/structstring__t__helper-members.html @@ -0,0 +1,109 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        string_t_helper< T > Member List
        +
        +
        + +

        This is the complete list of members for string_t_helper< T >, including all inherited members.

        + + +
        type typedef (defined in string_t_helper< T >)string_t_helper< T >
        +
        +
        + + + + diff --git a/doc/html/structstring__t__helper.html b/doc/html/structstring__t__helper.html new file mode 100644 index 0000000..0bdc0a6 --- /dev/null +++ b/doc/html/structstring__t__helper.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: string_t_helper< T > Struct Template Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        string_t_helper< T > Struct Template Reference
        +
        +
        + + + +

        +Public Types

        +using type = T
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4-members.html b/doc/html/structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4-members.html new file mode 100644 index 0000000..5edbe64 --- /dev/null +++ b/doc/html/structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4-members.html @@ -0,0 +1,109 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        string_t_helper< NLOHMANN_BASIC_JSON_TPL > Member List
        +
        +
        + +

        This is the complete list of members for string_t_helper< NLOHMANN_BASIC_JSON_TPL >, including all inherited members.

        + + +
        type typedef (defined in string_t_helper< NLOHMANN_BASIC_JSON_TPL >)string_t_helper< NLOHMANN_BASIC_JSON_TPL >
        +
        +
        + + + + diff --git a/doc/html/structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.html b/doc/html/structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.html new file mode 100644 index 0000000..e9908d6 --- /dev/null +++ b/doc/html/structstring__t__helper_3_01_n_l_o_h_m_a_n_n___b_a_s_i_c___j_s_o_n___t_p_l_01_4.html @@ -0,0 +1,122 @@ + + + + + + + +Minecraft Community Edition: string_t_helper< NLOHMANN_BASIC_JSON_TPL > Struct Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        string_t_helper< NLOHMANN_BASIC_JSON_TPL > Struct Reference
        +
        +
        + + + +

        +Public Types

        +using type = StringType
        +
        The documentation for this struct was generated from the following file: +
        +
        + +
        + + + + diff --git a/doc/html/tabs.css b/doc/html/tabs.css new file mode 100644 index 0000000..84f33ae --- /dev/null +++ b/doc/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-color:var(--nav-menu-background-color)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;line-height:36px;text-decoration:none;color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-color:var(--nav-menu-background-color);line-height:36px}.sm-dox a span.sub-arrow{top:15px;right:10px;box-sizing:content-box;padding:0;margin:0;display:inline-block;width:5px;height:5px;background-color:var(--nav-menu-background-color);border-right:2px solid var(--nav-arrow-color);border-bottom:2px solid var(--nav-arrow-color);transform:rotate(45deg);-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 6px}.sm-dox a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px !important}.sm-dox a:hover span.sub-arrow{background-color:var(--nav-menu-active-bg);border-right:2px solid var(--nav-arrow-selected-color);border-bottom:2px solid var(--nav-arrow-selected-color)}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0;padding:3px}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{transform:rotate(-45deg)}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-color:var(--nav-menu-active-bg);border-radius:5px}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:6px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:6px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/html/todo.html b/doc/html/todo.html new file mode 100644 index 0000000..427e552 --- /dev/null +++ b/doc/html/todo.html @@ -0,0 +1,112 @@ + + + + + + + +Minecraft Community Edition: Todo List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Todo List
        +
        +
        +
        +
        File example.hpp
        +

        Add more functions in the future.

        +

        +
        +
        +
        +
        +
        +
        + + + + diff --git a/doc/html/topics.html b/doc/html/topics.html new file mode 100644 index 0000000..b298f27 --- /dev/null +++ b/doc/html/topics.html @@ -0,0 +1,110 @@ + + + + + + + +Minecraft Community Edition: Topics + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        Topics
        +
        +
        +
        Here is a list of all topics with brief descriptions:
        + + +
         Example GroupA group containing example functions and classes
        +
        +
        +
        +
        + + + + diff --git a/doc/html/topics.js b/doc/html/topics.js new file mode 100644 index 0000000..7f56fa4 --- /dev/null +++ b/doc/html/topics.js @@ -0,0 +1,4 @@ +var topics = +[ + [ "Example Group", "group___example_group.html", "group___example_group" ] +]; \ No newline at end of file diff --git a/doc/html/unionmce_1_1_virtual_file_system_1_1_version-members.html b/doc/html/unionmce_1_1_virtual_file_system_1_1_version-members.html new file mode 100644 index 0000000..e711e10 --- /dev/null +++ b/doc/html/unionmce_1_1_virtual_file_system_1_1_version-members.html @@ -0,0 +1,113 @@ + + + + + + + +Minecraft Community Edition: Member List + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::VirtualFileSystem::Version Member List
        +
        +
        + +

        This is the complete list of members for mce::VirtualFileSystem::Version, including all inherited members.

        + + + + + + +
        major (defined in mce::VirtualFileSystem::Version)mce::VirtualFileSystem::Version
        makeVersion(unsigned char major, unsigned char minor, unsigned char patch)mce::VirtualFileSystem::Versionstatic
        minor (defined in mce::VirtualFileSystem::Version)mce::VirtualFileSystem::Version
        patchmce::VirtualFileSystem::Version
        quadmce::VirtualFileSystem::Version
        +
        +
        + + + + diff --git a/doc/html/unionmce_1_1_virtual_file_system_1_1_version.html b/doc/html/unionmce_1_1_virtual_file_system_1_1_version.html new file mode 100644 index 0000000..ae2d4cd --- /dev/null +++ b/doc/html/unionmce_1_1_virtual_file_system_1_1_version.html @@ -0,0 +1,219 @@ + + + + + + + +Minecraft Community Edition: mce::VirtualFileSystem::Version Union Reference + + + + + + + + + + + + + + + +
        +
        + + + + + + +
        +
        Minecraft Community Edition 0.1.0 +
        +
        +
        + + + + + + + + +
        +
        + +
        +
        +
        + +
        +
        + +
        +
        + + +
        +
        +
        +
        +
        +
        Loading...
        +
        Searching...
        +
        No Matches
        +
        +
        +
        +
        + +
        +
        mce::VirtualFileSystem::Version Union Reference
        +
        +
        + +

        Version information for the virtual file system format. + More...

        + +

        #include <VirtualFileSystem.hpp>

        + + + + +

        +Static Public Member Functions

        static Version makeVersion (unsigned char major, unsigned char minor, unsigned char patch)
         Create a Version from components.
        + + + + + + + +

        +Public Attributes

        +struct { 
        +   unsigned char   major 
        +   unsigned char   minor 
           unsigned char   patch 
        }; 
        unsigned int quad
        +

        Detailed Description

        +

        Version information for the virtual file system format.

        +

        The Version is a small union allowing access either to individual components or as a 32-bit quad value.

        +

        Member Function Documentation

        + +

        ◆ makeVersion()

        + +
        +
        + + + + + +
        + + + + + + + + + + + + + + + + +
        VirtualFileSystem::Version mce::VirtualFileSystem::Version::makeVersion (unsigned char major,
        unsigned char minor,
        unsigned char patch )
        +
        +static
        +
        + +

        Create a Version from components.

        +
        Parameters
        + + + + +
        majorMajor version.
        minorMinor version.
        patchPatch version.
        +
        +
        + +
        +
        +

        Member Data Documentation

        + +

        ◆ patch

        + +
        +
        + + + + +
        unsigned char mce::VirtualFileSystem::Version::patch
        +
        +

        Version components.

        + +
        +
        + +

        ◆ quad

        + +
        +
        + + + + +
        unsigned int mce::VirtualFileSystem::Version::quad
        +
        +

        Packed 32-bit representation of the version.

        + +
        +
        +
        The documentation for this union was generated from the following files: +
        +
        + +
        + + + + diff --git a/doc/html/unionmce_1_1_virtual_file_system_1_1_version.js b/doc/html/unionmce_1_1_virtual_file_system_1_1_version.js new file mode 100644 index 0000000..eb61840 --- /dev/null +++ b/doc/html/unionmce_1_1_virtual_file_system_1_1_version.js @@ -0,0 +1,5 @@ +var unionmce_1_1_virtual_file_system_1_1_version = +[ + [ "patch", "unionmce_1_1_virtual_file_system_1_1_version.html#a3fb983d2e7943c95d54d1fbcd5ecd5d3", null ], + [ "quad", "unionmce_1_1_virtual_file_system_1_1_version.html#a9738beeedb1f5be4ab8108f658c70414", null ] +]; \ No newline at end of file