From 8634accda5d581e49c6768f72f50303861829988 Mon Sep 17 00:00:00 2001 From: Amar Mahmutbegovic Date: Thu, 6 Feb 2025 00:19:59 +0100 Subject: [PATCH] add Chapter18 --- Chapter18/cib/.clang-format | 9 + Chapter18/cib/.clang-tidy | 27 + Chapter18/cib/CMakeLists.txt | 162 + Chapter18/cib/app/src/main.cpp | 119 + Chapter18/cib/cstdlib_support/retarget.cpp | 81 + Chapter18/cib/cstdlib_support/retarget.hpp | 10 + Chapter18/cib/hal/adc/inc/adc.hpp | 18 + Chapter18/cib/hal/adc/inc/adc_stm32.hpp | 22 + Chapter18/cib/hal/adc/src/adc_stm32.cpp | 47 + Chapter18/cib/hal/gpio/inc/gpio.hpp | 19 + .../hal/gpio/inc/gpio_interrupt_manager.hpp | 19 + Chapter18/cib/hal/gpio/inc/gpio_stm32.hpp | 70 + Chapter18/cib/hal/gpio/src/gpio.cpp | 21 + .../hal/gpio/src/gpio_interrupt_manager.cpp | 17 + Chapter18/cib/hal/inc/hal.hpp | 33 + .../cib/hal/uart/inc/stm32f0xx_hal_uart.hpp | 21 + Chapter18/cib/hal/uart/inc/uart.hpp | 14 + Chapter18/cib/hal/uart/inc/uart_stm32.hpp | 46 + Chapter18/cib/hal/uart/src/uart_stm32.cpp | 34 + Chapter18/cib/libs/boost/mp11.hpp | 22 + Chapter18/cib/libs/boost/mp11/algorithm.hpp | 1327 + Chapter18/cib/libs/boost/mp11/bind.hpp | 111 + .../cib/libs/boost/mp11/detail/config.hpp | 149 + .../cib/libs/boost/mp11/detail/mp_append.hpp | 321 + .../cib/libs/boost/mp11/detail/mp_copy_if.hpp | 48 + .../cib/libs/boost/mp11/detail/mp_count.hpp | 147 + .../cib/libs/boost/mp11/detail/mp_defer.hpp | 119 + .../cib/libs/boost/mp11/detail/mp_fold.hpp | 164 + .../cib/libs/boost/mp11/detail/mp_front.hpp | 50 + .../cib/libs/boost/mp11/detail/mp_is_list.hpp | 39 + .../boost/mp11/detail/mp_is_value_list.hpp | 41 + .../cib/libs/boost/mp11/detail/mp_list.hpp | 24 + .../cib/libs/boost/mp11/detail/mp_list_v.hpp | 27 + .../libs/boost/mp11/detail/mp_map_find.hpp | 87 + .../libs/boost/mp11/detail/mp_min_element.hpp | 51 + .../cib/libs/boost/mp11/detail/mp_plus.hpp | 84 + .../libs/boost/mp11/detail/mp_remove_if.hpp | 48 + .../cib/libs/boost/mp11/detail/mp_rename.hpp | 54 + .../cib/libs/boost/mp11/detail/mp_value.hpp | 25 + .../cib/libs/boost/mp11/detail/mp_void.hpp | 32 + .../libs/boost/mp11/detail/mp_with_index.hpp | 385 + .../cib/libs/boost/mp11/detail/mpl_common.hpp | 160 + Chapter18/cib/libs/boost/mp11/function.hpp | 222 + .../cib/libs/boost/mp11/integer_sequence.hpp | 112 + Chapter18/cib/libs/boost/mp11/integral.hpp | 42 + Chapter18/cib/libs/boost/mp11/list.hpp | 472 + Chapter18/cib/libs/boost/mp11/map.hpp | 119 + Chapter18/cib/libs/boost/mp11/mpl.hpp | 14 + Chapter18/cib/libs/boost/mp11/mpl_list.hpp | 28 + Chapter18/cib/libs/boost/mp11/mpl_tuple.hpp | 29 + Chapter18/cib/libs/boost/mp11/set.hpp | 188 + Chapter18/cib/libs/boost/mp11/tuple.hpp | 183 + Chapter18/cib/libs/boost/mp11/utility.hpp | 169 + Chapter18/cib/libs/boost/mp11/version.hpp | 16 + Chapter18/cib/libs/boost/sml.hpp | 2900 + Chapter18/cib/libs/cib/builder_meta.hpp | 15 + Chapter18/cib/libs/cib/built.hpp | 8 + Chapter18/cib/libs/cib/callback.hpp | 131 + Chapter18/cib/libs/cib/cib.hpp | 45 + Chapter18/cib/libs/cib/config.hpp | 74 + Chapter18/cib/libs/cib/detail/components.hpp | 18 + .../cib/libs/cib/detail/config_details.hpp | 36 + Chapter18/cib/libs/cib/detail/config_item.hpp | 15 + .../libs/cib/detail/constexpr_conditional.hpp | 51 + Chapter18/cib/libs/cib/detail/exports.hpp | 25 + Chapter18/cib/libs/cib/detail/extend.hpp | 22 + .../cib/libs/cib/detail/nexus_details.hpp | 45 + .../libs/cib/detail/runtime_conditional.hpp | 94 + Chapter18/cib/libs/cib/func_decl.hpp | 12 + Chapter18/cib/libs/cib/nexus.hpp | 52 + Chapter18/cib/libs/cib/top.hpp | 72 + Chapter18/cib/libs/conc/atomic.hpp | 196 + Chapter18/cib/libs/conc/concepts.hpp | 56 + Chapter18/cib/libs/conc/concurrency.hpp | 67 + Chapter18/cib/libs/etl/.clang-format | 51 + Chapter18/cib/libs/etl/CMakeLists.txt | 82 + Chapter18/cib/libs/etl/Doxyfile | 2401 + Chapter18/cib/libs/etl/LICENSE | 19 + Chapter18/cib/libs/etl/README.md | 147 + Chapter18/cib/libs/etl/appveyor.yml | 26 + .../etl/arduino/Embedded_Template_Library.h | 80 + .../Example_0_import_etl.ino | 12 + .../Example_Vector_1_simple_use.ino | 46 + .../cib/libs/etl/arduino/library-arduino.json | 39 + .../etl/arduino/library-arduino.properties | 10 + .../etl/cmake/GetGitRevisionDescription.cmake | 284 + .../cmake/GetGitRevisionDescription.cmake.in | 43 + .../cib/libs/etl/cmake/etlConfig.cmake.in | 4 + Chapter18/cib/libs/etl/cmake/helpers.cmake | 35 + .../ArmTimerCallbacks - C++/.gitignore | 4 + .../ArmTimerCallbacks.uvprojx | 487 + .../ArmTimerCallbacks - C++/etl_profile.h | 15 + .../examples/ArmTimerCallbacks - C++/main.cpp | 167 + .../etl/examples/Blink/Blink1/__vm/.gitignore | 2 + .../libs/etl/examples/BlinkList/BlinkList.ino | 53 + .../BlinkList/VisualMicro/BlinkList.sln | 22 + .../BlinkList/VisualMicro/BlinkList.vcxproj | 86 + .../VisualMicro/BlinkList.vcxproj.filters | 28 + .../BlinkList/VisualMicro/__vm/.gitignore | 1 + .../etl/examples/BlinkList/__vm/.gitignore | 1 + .../libs/etl/examples/Debounce/Debounce.ino | 39 + .../CMakeLists.txt | 17 + .../FunctionInterruptSimulation.cpp | 149 + .../etl_profile.h | 48 + .../v15/.gitignore | 1 + .../v15/.gitignore | 1 + .../FunctionInterruptSimulation-Delegates.sln | 31 + ...ctionInterruptSimulation-Delegates.vcxproj | 156 + .../FunctionInterruptSimulation-Delegates.sln | 31 + ...ctionInterruptSimulation-Delegates.vcxproj | 157 + .../CMakeLists.txt | 17 + .../FunctionInterruptSimulation.cpp | 149 + .../FunctionInterruptSimulation/etl_profile.h | 48 + .../vs2017/FunctionInterruptSimulation.sln | 31 + .../FunctionInterruptSimulation.vcxproj | 156 + ...unctionInterruptSimulation.vcxproj.filters | 27 + .../MutexMessageRouter/CMakeLists.txt | 12 + .../MutexMessageRouter/MutexMessageRouter.cpp | 110 + .../MutexMessageRouter/MutexMessageRouter.sln | 31 + .../MutexMessageRouter.vcxproj | 140 + .../etl/examples/QueuedFSM/CMakeLists.txt | 17 + .../libs/etl/examples/QueuedFSM/QueuedFSM.cpp | 288 + .../libs/etl/examples/QueuedFSM/etl_profile.h | 43 + .../examples/QueuedFSM/vs2019/QueuedFSM.sln | 30 + .../QueuedFSM/vs2019/QueuedFSM.vcxproj | 160 + .../vs2019/QueuedFSM.vcxproj.filters | 27 + .../QueuedMessageRouter/CMakeLists.txt | 17 + .../QueuedMessageRouter.cpp | 151 + .../QueuedMessageRouter/etl_profile.h | 43 + .../vs2019/QueuedMessageRouter.sln | 31 + .../vs2019/QueuedMessageRouter.vcxproj | 158 + .../etl/examples/Scheduler/CMakeLists.txt | 17 + .../libs/etl/examples/Scheduler/Scheduler.cpp | 184 + .../libs/etl/examples/Scheduler/etl_profile.h | 43 + .../examples/Scheduler/vs2017/Scheduler.sln | 30 + .../Scheduler/vs2017/Scheduler.vcxproj | 160 + .../examples/Scheduler/vs2019/Scheduler.sln | 30 + .../Scheduler/vs2019/Scheduler.vcxproj | 160 + .../etl/examples/SharedMessage/CMakeLists.txt | 17 + .../examples/SharedMessage/SharedMessage.cpp | 285 + .../examples/SharedMessage/SharedMessage.sln | 31 + .../SharedMessage/SharedMessage.vcxproj | 165 + .../etl/examples/SharedMessage/etl_profile.h | 0 .../libs/etl/examples/platformio/.gitignore | 7 + .../libs/etl/examples/platformio/README.md | 16 + .../examples/platformio/include/etl_profile.h | 1 + .../etl/examples/platformio/platformio.ini | 27 + .../libs/etl/examples/platformio/src/main.cpp | 142 + .../cib/libs/etl/images/ArcticCodeVault.png | Bin 0 -> 65953 bytes .../etl/images/ArcticCodeVaultTransparent.png | Bin 0 -> 67930 bytes .../cib/libs/etl/images/Coverty Shields.txt | 9 + Chapter18/cib/libs/etl/images/etl-round.png | Bin 0 -> 33955 bytes Chapter18/cib/libs/etl/images/etl.ico | Bin 0 -> 1150 bytes Chapter18/cib/libs/etl/images/etl.png | Bin 0 -> 20267 bytes Chapter18/cib/libs/etl/images/etl.xar | Bin 0 -> 28896 bytes Chapter18/cib/libs/etl/images/etl16.png | Bin 0 -> 15993 bytes Chapter18/cib/libs/etl/images/etl32.png | Bin 0 -> 19081 bytes Chapter18/cib/libs/etl/images/etl48.png | Bin 0 -> 24217 bytes Chapter18/cib/libs/etl/images/etl64.png | Bin 0 -> 2047 bytes Chapter18/cib/libs/etl/images/favicon-32.png | Bin 0 -> 19081 bytes Chapter18/cib/libs/etl/images/favicon-64.png | Bin 0 -> 2047 bytes Chapter18/cib/libs/etl/images/favicon.ico | Bin 0 -> 1150 bytes Chapter18/cib/libs/etl/include/etl/absolute.h | 96 + .../cib/libs/etl/include/etl/algorithm.h | 3425 + .../cib/libs/etl/include/etl/alignment.h | 339 + Chapter18/cib/libs/etl/include/etl/array.h | 741 + .../cib/libs/etl/include/etl/array_view.h | 655 + .../cib/libs/etl/include/etl/array_wrapper.h | 418 + Chapter18/cib/libs/etl/include/etl/atomic.h | 48 + .../libs/etl/include/etl/atomic/atomic_arm.h | 34 + .../include/etl/atomic/atomic_clang_sync.h | 34 + .../etl/include/etl/atomic/atomic_gcc_sync.h | 2236 + .../libs/etl/include/etl/atomic/atomic_std.h | 120 + Chapter18/cib/libs/etl/include/etl/base64.h | 218 + .../cib/libs/etl/include/etl/base64_decoder.h | 868 + .../cib/libs/etl/include/etl/base64_encoder.h | 843 + .../libs/etl/include/etl/basic_format_spec.h | 496 + .../cib/libs/etl/include/etl/basic_string.h | 2652 + .../etl/include/etl/basic_string_stream.h | 281 + Chapter18/cib/libs/etl/include/etl/binary.h | 2689 + .../etl/include/etl/bip_buffer_spsc_atomic.h | 541 + Chapter18/cib/libs/etl/include/etl/bit.h | 252 + .../cib/libs/etl/include/etl/bit_stream.h | 1409 + Chapter18/cib/libs/etl/include/etl/bitset.h | 42 + .../cib/libs/etl/include/etl/bloom_filter.h | 190 + .../cib/libs/etl/include/etl/bresenham_line.h | 361 + .../libs/etl/include/etl/buffer_descriptors.h | 304 + Chapter18/cib/libs/etl/include/etl/byte.h | 323 + .../cib/libs/etl/include/etl/byte_stream.h | 903 + Chapter18/cib/libs/etl/include/etl/callback.h | 81 + .../libs/etl/include/etl/callback_service.h | 159 + .../cib/libs/etl/include/etl/callback_timer.h | 842 + .../etl/include/etl/callback_timer_atomic.h | 670 + .../include/etl/callback_timer_interrupt.h | 671 + .../etl/include/etl/callback_timer_locked.h | 698 + .../cib/libs/etl/include/etl/char_traits.h | 387 + Chapter18/cib/libs/etl/include/etl/checksum.h | 307 + .../libs/etl/include/etl/circular_buffer.h | 1461 + .../libs/etl/include/etl/circular_iterator.h | 753 + .../cib/libs/etl/include/etl/combinations.h | 63 + Chapter18/cib/libs/etl/include/etl/compare.h | 112 + Chapter18/cib/libs/etl/include/etl/constant.h | 57 + .../cib/libs/etl/include/etl/container.h | 40 + .../cib/libs/etl/include/etl/correlation.h | 292 + .../cib/libs/etl/include/etl/covariance.h | 240 + Chapter18/cib/libs/etl/include/etl/crc.h | 88 + Chapter18/cib/libs/etl/include/etl/crc1.h | 105 + Chapter18/cib/libs/etl/include/etl/crc16.h | 78 + Chapter18/cib/libs/etl/include/etl/crc16_a.h | 78 + .../cib/libs/etl/include/etl/crc16_arc.h | 78 + .../libs/etl/include/etl/crc16_aug_ccitt.h | 80 + .../cib/libs/etl/include/etl/crc16_buypass.h | 78 + .../cib/libs/etl/include/etl/crc16_ccitt.h | 78 + .../cib/libs/etl/include/etl/crc16_cdma2000.h | 78 + .../cib/libs/etl/include/etl/crc16_dds110.h | 78 + .../cib/libs/etl/include/etl/crc16_dectr.h | 78 + .../cib/libs/etl/include/etl/crc16_dectx.h | 78 + .../cib/libs/etl/include/etl/crc16_dnp.h | 78 + .../cib/libs/etl/include/etl/crc16_en13757.h | 78 + .../cib/libs/etl/include/etl/crc16_genibus.h | 78 + .../cib/libs/etl/include/etl/crc16_kermit.h | 78 + .../cib/libs/etl/include/etl/crc16_m17.h | 78 + .../cib/libs/etl/include/etl/crc16_maxim.h | 78 + .../cib/libs/etl/include/etl/crc16_mcrf4xx.h | 78 + .../cib/libs/etl/include/etl/crc16_modbus.h | 78 + .../cib/libs/etl/include/etl/crc16_profibus.h | 78 + .../cib/libs/etl/include/etl/crc16_riello.h | 78 + .../cib/libs/etl/include/etl/crc16_t10dif.h | 78 + .../cib/libs/etl/include/etl/crc16_teledisk.h | 78 + .../cib/libs/etl/include/etl/crc16_tms37157.h | 78 + .../cib/libs/etl/include/etl/crc16_usb.h | 78 + .../cib/libs/etl/include/etl/crc16_x25.h | 78 + .../cib/libs/etl/include/etl/crc16_xmodem.h | 78 + Chapter18/cib/libs/etl/include/etl/crc32.h | 78 + .../cib/libs/etl/include/etl/crc32_bzip2.h | 78 + Chapter18/cib/libs/etl/include/etl/crc32_c.h | 78 + Chapter18/cib/libs/etl/include/etl/crc32_d.h | 78 + .../cib/libs/etl/include/etl/crc32_jamcrc.h | 78 + .../cib/libs/etl/include/etl/crc32_mpeg2.h | 78 + .../cib/libs/etl/include/etl/crc32_posix.h | 78 + Chapter18/cib/libs/etl/include/etl/crc32_q.h | 78 + .../cib/libs/etl/include/etl/crc32_xfer.h | 78 + .../cib/libs/etl/include/etl/crc64_ecma.h | 78 + .../cib/libs/etl/include/etl/crc8_ccitt.h | 76 + .../cib/libs/etl/include/etl/crc8_cdma2000.h | 79 + .../cib/libs/etl/include/etl/crc8_darc.h | 79 + .../cib/libs/etl/include/etl/crc8_dvbs2.h | 79 + Chapter18/cib/libs/etl/include/etl/crc8_ebu.h | 79 + .../cib/libs/etl/include/etl/crc8_icode.h | 79 + Chapter18/cib/libs/etl/include/etl/crc8_itu.h | 79 + .../cib/libs/etl/include/etl/crc8_j1850.h | 79 + .../libs/etl/include/etl/crc8_j1850_zero.h | 79 + .../cib/libs/etl/include/etl/crc8_maxim.h | 79 + .../cib/libs/etl/include/etl/crc8_rohc.h | 79 + .../cib/libs/etl/include/etl/crc8_wcdma.h | 79 + Chapter18/cib/libs/etl/include/etl/cstring.h | 37 + .../cib/libs/etl/include/etl/cyclic_value.h | 617 + Chapter18/cib/libs/etl/include/etl/debounce.h | 587 + .../cib/libs/etl/include/etl/debug_count.h | 180 + Chapter18/cib/libs/etl/include/etl/delegate.h | 42 + .../libs/etl/include/etl/delegate_observer.h | 262 + .../libs/etl/include/etl/delegate_service.h | 215 + .../libs/etl/include/etl/deprecated/factory.h | 468 + Chapter18/cib/libs/etl/include/etl/deque.h | 2636 + Chapter18/cib/libs/etl/include/etl/doxygen.h | 55 + .../cib/libs/etl/include/etl/endianness.h | 192 + .../cib/libs/etl/include/etl/enum_type.h | 116 + .../cib/libs/etl/include/etl/error_handler.h | 342 + .../cib/libs/etl/include/etl/exception.h | 121 + Chapter18/cib/libs/etl/include/etl/expected.h | 1108 + .../etl/include/etl/experimental/bit_cast.h | 33 + .../include/etl/experimental/class_traits.h | 181 + .../etl/include/etl/experimental/icache.h | 115 + .../etl/include/etl/experimental/mem_cast.h | 78 + ...oint flt (typo abs(a) should be abs(b).png | Bin 0 -> 926107 bytes .../etl/experimental/mid_point ptr.png | Bin 0 -> 325251 bytes .../include/etl/experimental/mid_point.png | Bin 0 -> 501223 bytes .../etl/include/etl/experimental/singleton.h | 87 + .../cib/libs/etl/include/etl/factorial.h | 73 + .../cib/libs/etl/include/etl/fibonacci.h | 82 + .../libs/etl/include/etl/file_error_numbers.h | 107 + .../cib/libs/etl/include/etl/fixed_iterator.h | 277 + .../etl/fixed_sized_memory_block_allocator.h | 126 + Chapter18/cib/libs/etl/include/etl/flags.h | 389 + Chapter18/cib/libs/etl/include/etl/flat_map.h | 1261 + .../cib/libs/etl/include/etl/flat_multimap.h | 1070 + .../cib/libs/etl/include/etl/flat_multiset.h | 1038 + Chapter18/cib/libs/etl/include/etl/flat_set.h | 1140 + Chapter18/cib/libs/etl/include/etl/fnv_1.h | 286 + .../cib/libs/etl/include/etl/format_spec.h | 45 + .../cib/libs/etl/include/etl/forward_list.h | 2051 + .../etl/include/etl/frame_check_sequence.h | 193 + Chapter18/cib/libs/etl/include/etl/fsm.h | 1523 + Chapter18/cib/libs/etl/include/etl/function.h | 420 + .../cib/libs/etl/include/etl/functional.h | 602 + Chapter18/cib/libs/etl/include/etl/gamma.h | 108 + Chapter18/cib/libs/etl/include/etl/gcd.h | 144 + .../include/etl/generators/fsm_generator.h | 853 + .../etl/include/etl/generators/generate.bat | 9 + .../include/etl/generators/generate_fsm.bat | 1 + .../etl/generators/generate_largest.bat | 1 + .../generators/generate_message_packet.bat | 1 + .../generators/generate_message_router.bat | 1 + .../etl/generators/generate_smallest.bat | 1 + .../etl/generators/generate_type_lookup.bat | 1 + .../etl/generators/generate_type_select.bat | 1 + .../etl/generators/generate_type_traits.bat | 1 + .../etl/generators/generate_variant_pool.bat | 1 + .../etl/generators/largest_generator.h | 452 + .../etl/generators/message_packet_generator.h | 1008 + .../etl/generators/message_router_generator.h | 898 + .../etl/generators/smallest_generator.h | 432 + .../etl/generators/type_lookup_generator.h | 337 + .../etl/generators/type_select_generator.h | 177 + .../etl/generators/type_traits_generator.h | 2373 + .../etl/generators/variant_pool_generator.h | 620 + .../cib/libs/etl/include/etl/generic_pool.h | 359 + Chapter18/cib/libs/etl/include/etl/hash.h | 545 + Chapter18/cib/libs/etl/include/etl/hfsm.h | 256 + .../cib/libs/etl/include/etl/histogram.h | 603 + Chapter18/cib/libs/etl/include/etl/ihash.h | 76 + .../etl/include/etl/imemory_block_allocator.h | 135 + .../libs/etl/include/etl/indirect_vector.h | 1612 + .../libs/etl/include/etl/initializer_list.h | 228 + .../cib/libs/etl/include/etl/instance_count.h | 117 + .../libs/etl/include/etl/integral_limits.h | 626 + .../etl/include/etl/intrusive_forward_list.h | 1188 + .../libs/etl/include/etl/intrusive_links.h | 1325 + .../cib/libs/etl/include/etl/intrusive_list.h | 1205 + .../libs/etl/include/etl/intrusive_queue.h | 292 + .../libs/etl/include/etl/intrusive_stack.h | 271 + Chapter18/cib/libs/etl/include/etl/invert.h | 83 + Chapter18/cib/libs/etl/include/etl/io_port.h | 1378 + Chapter18/cib/libs/etl/include/etl/ipool.h | 475 + .../etl/ireference_counted_message_pool.h | 73 + Chapter18/cib/libs/etl/include/etl/iterator.h | 1217 + Chapter18/cib/libs/etl/include/etl/jenkins.h | 121 + Chapter18/cib/libs/etl/include/etl/largest.h | 379 + Chapter18/cib/libs/etl/include/etl/lcm.h | 141 + Chapter18/cib/libs/etl/include/etl/limiter.h | 87 + Chapter18/cib/libs/etl/include/etl/limits.h | 1187 + Chapter18/cib/libs/etl/include/etl/list.h | 2487 + Chapter18/cib/libs/etl/include/etl/log.h | 130 + Chapter18/cib/libs/etl/include/etl/macros.h | 47 + Chapter18/cib/libs/etl/include/etl/map.h | 2900 + Chapter18/cib/libs/etl/include/etl/math.h | 156 + .../cib/libs/etl/include/etl/math_constants.h | 89 + Chapter18/cib/libs/etl/include/etl/mean.h | 204 + Chapter18/cib/libs/etl/include/etl/mem_cast.h | 596 + Chapter18/cib/libs/etl/include/etl/memory.h | 2568 + .../cib/libs/etl/include/etl/memory_model.h | 78 + Chapter18/cib/libs/etl/include/etl/message.h | 268 + .../cib/libs/etl/include/etl/message_broker.h | 390 + .../cib/libs/etl/include/etl/message_bus.h | 450 + .../cib/libs/etl/include/etl/message_packet.h | 4748 + .../cib/libs/etl/include/etl/message_router.h | 2770 + .../etl/include/etl/message_router_registry.h | 578 + .../cib/libs/etl/include/etl/message_timer.h | 705 + .../etl/include/etl/message_timer_atomic.h | 653 + .../etl/include/etl/message_timer_interrupt.h | 660 + .../etl/include/etl/message_timer_locked.h | 684 + .../cib/libs/etl/include/etl/message_types.h | 48 + .../cib/libs/etl/include/etl/multi_array.h | 69 + .../cib/libs/etl/include/etl/multi_range.h | 529 + .../cib/libs/etl/include/etl/multi_span.h | 343 + .../cib/libs/etl/include/etl/multi_vector.h | 68 + Chapter18/cib/libs/etl/include/etl/multimap.h | 2548 + Chapter18/cib/libs/etl/include/etl/multiset.h | 2531 + Chapter18/cib/libs/etl/include/etl/murmur3.h | 241 + Chapter18/cib/libs/etl/include/etl/mutex.h | 103 + .../libs/etl/include/etl/mutex/mutex_arm.h | 34 + .../etl/include/etl/mutex/mutex_clang_sync.h | 34 + .../etl/include/etl/mutex/mutex_cmsis_os2.h | 82 + .../etl/include/etl/mutex/mutex_freertos.h | 80 + .../etl/include/etl/mutex/mutex_gcc_sync.h | 78 + .../libs/etl/include/etl/mutex/mutex_std.h | 45 + Chapter18/cib/libs/etl/include/etl/negative.h | 62 + Chapter18/cib/libs/etl/include/etl/nth_type.h | 54 + .../cib/libs/etl/include/etl/null_type.h | 44 + Chapter18/cib/libs/etl/include/etl/nullptr.h | 67 + Chapter18/cib/libs/etl/include/etl/numeric.h | 218 + Chapter18/cib/libs/etl/include/etl/observer.h | 548 + Chapter18/cib/libs/etl/include/etl/optional.h | 2178 + Chapter18/cib/libs/etl/include/etl/overload.h | 108 + Chapter18/cib/libs/etl/include/etl/packet.h | 165 + .../cib/libs/etl/include/etl/parameter_pack.h | 150 + .../cib/libs/etl/include/etl/parameter_type.h | 57 + Chapter18/cib/libs/etl/include/etl/pearson.h | 181 + .../cib/libs/etl/include/etl/permutations.h | 74 + .../cib/libs/etl/include/etl/placement_new.h | 67 + Chapter18/cib/libs/etl/include/etl/platform.h | 521 + .../cib/libs/etl/include/etl/poly_span.h | 1044 + Chapter18/cib/libs/etl/include/etl/pool.h | 315 + Chapter18/cib/libs/etl/include/etl/power.h | 221 + .../cib/libs/etl/include/etl/priority_queue.h | 552 + .../libs/etl/include/etl/private/addressof.h | 62 + .../etl/include/etl/private/bitset_legacy.h | 1544 + .../libs/etl/include/etl/private/bitset_new.h | 3958 + .../include/etl/private/choose_namespace.h | 86 + .../etl/private/comparator_is_transparent.h | 51 + .../include/etl/private/crc_implementation.h | 713 + .../etl/include/etl/private/crc_parameters.h | 129 + .../etl/include/etl/private/delegate_cpp03.h | 1177 + .../etl/include/etl/private/delegate_cpp11.h | 632 + .../private/diagnostic_array_bounds_push.h | 44 + .../private/diagnostic_cxx_20_compat_push.h | 44 + .../etl/private/diagnostic_deprecated_push.h | 44 + .../etl/private/diagnostic_float_equal_push.h | 44 + .../diagnostic_null_dereference_push.h | 44 + .../diagnostic_pessimizing_move_push.h | 44 + .../etl/include/etl/private/diagnostic_pop.h | 42 + .../diagnostic_self_assign_overloaded_push.h | 43 + .../diagnostic_stringop_overread_push.h | 43 + .../private/diagnostic_uninitialized_push.h | 45 + .../private/diagnostic_unused_function_push.h | 44 + .../private/diagnostic_useless_cast_push.h | 43 + .../etl/include/etl/private/dynamic_extent.h | 42 + .../etl/include/etl/private/ivectorpointer.h | 1045 + .../libs/etl/include/etl/private/minmax_pop.h | 55 + .../etl/include/etl/private/minmax_push.h | 59 + .../etl/include/etl/private/pvoidvector.h | 820 + .../include/etl/private/to_string_helper.h | 629 + .../etl/include/etl/private/variant_legacy.h | 1011 + .../include/etl/private/variant_variadic.h | 2103 + .../etl/include/etl/private/vector_base.h | 175 + .../etl/include/etl/profiles/arduino_arm.h | 48 + .../cib/libs/etl/include/etl/profiles/armv5.h | 48 + .../etl/include/etl/profiles/armv5_no_stl.h | 49 + .../cib/libs/etl/include/etl/profiles/armv6.h | 48 + .../etl/include/etl/profiles/armv6_no_stl.h | 49 + .../cib/libs/etl/include/etl/profiles/armv7.h | 48 + .../etl/include/etl/profiles/armv7_no_stl.h | 49 + .../cib/libs/etl/include/etl/profiles/auto.h | 34 + .../etl/include/etl/profiles/clang_generic.h | 41 + .../etl/profiles/clang_generic_no_stl.h | 41 + .../cib/libs/etl/include/etl/profiles/cpp03.h | 48 + .../etl/include/etl/profiles/cpp03_no_stl.h | 49 + .../cib/libs/etl/include/etl/profiles/cpp11.h | 48 + .../etl/include/etl/profiles/cpp11_no_stl.h | 49 + .../cib/libs/etl/include/etl/profiles/cpp14.h | 48 + .../etl/include/etl/profiles/cpp14_no_stl.h | 49 + .../cib/libs/etl/include/etl/profiles/cpp17.h | 48 + .../etl/include/etl/profiles/cpp17_no_stl.h | 49 + .../etl/profiles/determine_builtin_support.h | 113 + .../include/etl/profiles/determine_compiler.h | 210 + .../determine_compiler_language_support.h | 209 + .../etl/profiles/determine_compiler_version.h | 76 + .../etl/profiles/determine_development_os.h | 83 + .../etl/include/etl/profiles/gcc_generic.h | 41 + .../include/etl/profiles/gcc_generic_no_stl.h | 42 + .../etl/include/etl/profiles/gcc_linux_x86.h | 41 + .../etl/profiles/gcc_linux_x86_no_stl.h | 42 + .../include/etl/profiles/gcc_windows_x86.h | 41 + .../etl/profiles/gcc_windows_x86_no_stl.h | 42 + .../libs/etl/include/etl/profiles/msvc_x86.h | 41 + .../include/etl/profiles/msvc_x86_no_stl.h | 42 + .../include/etl/profiles/segger_gcc_stlport.h | 54 + .../cib/libs/etl/include/etl/profiles/ticc.h | 47 + .../etl/include/etl/profiles/ticc_no_stl.h | 48 + .../etl/include/etl/pseudo_moving_average.h | 425 + Chapter18/cib/libs/etl/include/etl/quantize.h | 87 + Chapter18/cib/libs/etl/include/etl/queue.h | 682 + .../cib/libs/etl/include/etl/queue_lockable.h | 862 + .../libs/etl/include/etl/queue_mpmc_mutex.h | 718 + .../libs/etl/include/etl/queue_spsc_atomic.h | 573 + .../cib/libs/etl/include/etl/queue_spsc_isr.h | 841 + .../libs/etl/include/etl/queue_spsc_locked.h | 903 + Chapter18/cib/libs/etl/include/etl/radix.h | 67 + Chapter18/cib/libs/etl/include/etl/random.h | 594 + Chapter18/cib/libs/etl/include/etl/ratio.h | 103 + .../include/etl/reference_counted_message.h | 230 + .../etl/reference_counted_message_pool.h | 322 + .../include/etl/reference_counted_object.h | 291 + .../libs/etl/include/etl/reference_flat_map.h | 1176 + .../etl/include/etl/reference_flat_multimap.h | 1069 + .../etl/include/etl/reference_flat_multiset.h | 1043 + .../libs/etl/include/etl/reference_flat_set.h | 1033 + Chapter18/cib/libs/etl/include/etl/rescale.h | 83 + Chapter18/cib/libs/etl/include/etl/result.h | 479 + Chapter18/cib/libs/etl/include/etl/rms.h | 211 + .../libs/etl/include/etl/scaled_rounding.h | 355 + .../cib/libs/etl/include/etl/scheduler.h | 406 + Chapter18/cib/libs/etl/include/etl/set.h | 2779 + .../cib/libs/etl/include/etl/shared_message.h | 226 + .../cib/libs/etl/include/etl/singleton.h | 336 + Chapter18/cib/libs/etl/include/etl/smallest.h | 402 + Chapter18/cib/libs/etl/include/etl/span.h | 821 + Chapter18/cib/libs/etl/include/etl/sqrt.h | 74 + Chapter18/cib/libs/etl/include/etl/stack.h | 623 + .../libs/etl/include/etl/standard_deviation.h | 262 + .../cib/libs/etl/include/etl/state_chart.h | 1119 + .../cib/libs/etl/include/etl/static_assert.h | 52 + Chapter18/cib/libs/etl/include/etl/string.h | 510 + .../cib/libs/etl/include/etl/string_stream.h | 48 + .../libs/etl/include/etl/string_utilities.h | 851 + .../cib/libs/etl/include/etl/string_view.h | 922 + .../cib/libs/etl/include/etl/stringify.h | 20 + .../cib/libs/etl/include/etl/successor.h | 195 + Chapter18/cib/libs/etl/include/etl/task.h | 129 + .../cib/libs/etl/include/etl/threshold.h | 79 + Chapter18/cib/libs/etl/include/etl/timer.h | 121 + .../cib/libs/etl/include/etl/to_arithmetic.h | 1041 + .../cib/libs/etl/include/etl/to_string.h | 149 + .../cib/libs/etl/include/etl/to_u16string.h | 150 + .../cib/libs/etl/include/etl/to_u32string.h | 149 + .../cib/libs/etl/include/etl/to_u8string.h | 150 + .../cib/libs/etl/include/etl/to_wstring.h | 149 + Chapter18/cib/libs/etl/include/etl/type_def.h | 296 + .../cib/libs/etl/include/etl/type_lookup.h | 373 + .../cib/libs/etl/include/etl/type_select.h | 633 + .../cib/libs/etl/include/etl/type_traits.h | 2369 + .../cib/libs/etl/include/etl/u16format_spec.h | 45 + .../cib/libs/etl/include/etl/u16string.h | 490 + .../libs/etl/include/etl/u16string_stream.h | 48 + .../cib/libs/etl/include/etl/u32format_spec.h | 45 + .../cib/libs/etl/include/etl/u32string.h | 490 + .../libs/etl/include/etl/u32string_stream.h | 48 + .../cib/libs/etl/include/etl/u8format_spec.h | 45 + Chapter18/cib/libs/etl/include/etl/u8string.h | 514 + .../libs/etl/include/etl/u8string_stream.h | 48 + .../cib/libs/etl/include/etl/unaligned_type.h | 865 + .../cib/libs/etl/include/etl/unordered_map.h | 1756 + .../libs/etl/include/etl/unordered_multimap.h | 1624 + .../libs/etl/include/etl/unordered_multiset.h | 1601 + .../cib/libs/etl/include/etl/unordered_set.h | 1618 + .../cib/libs/etl/include/etl/user_type.h | 125 + Chapter18/cib/libs/etl/include/etl/utility.h | 677 + Chapter18/cib/libs/etl/include/etl/variance.h | 236 + Chapter18/cib/libs/etl/include/etl/variant.h | 43 + .../cib/libs/etl/include/etl/variant_pool.h | 470 + Chapter18/cib/libs/etl/include/etl/vector.h | 1849 + Chapter18/cib/libs/etl/include/etl/version.h | 79 + Chapter18/cib/libs/etl/include/etl/visitor.h | 597 + .../cib/libs/etl/include/etl/wformat_spec.h | 45 + Chapter18/cib/libs/etl/include/etl/wstring.h | 490 + .../cib/libs/etl/include/etl/wstring_stream.h | 48 + Chapter18/cib/libs/etl/library.json | 38 + Chapter18/cib/libs/etl/library.properties | 10 + Chapter18/cib/libs/etl/meson.build | 27 + Chapter18/cib/libs/etl/meson_options.txt | 1 + .../cib/libs/etl/scripts/generator_test.bat | 1 + .../cib/libs/etl/scripts/generator_test.py | 45 + .../cib/libs/etl/scripts/update_release.bat | 1 + .../cib/libs/etl/scripts/update_release.py | 237 + .../cib/libs/etl/scripts/update_version.bat | 1 + .../cib/libs/etl/scripts/update_version.py | 154 + .../libs/etl/subprojects/unittest-cpp.wrap | 9 + .../cib/libs/etl/support/Class diagrams.docx | Bin 0 -> 26284 bytes .../etl/support/Flat map class diagram.odg | Bin 0 -> 15195 bytes .../etl/support/Flat_map_class_diagram.doc | 13 + .../libs/etl/support/List class diagram.odg | Bin 0 -> 17818 bytes .../libs/etl/support/List_class_diagram.doc | 17 + .../cib/libs/etl/support/Release notes.txt | 2394 + Chapter18/cib/libs/etl/support/hfsm.docx | Bin 0 -> 24750 bytes Chapter18/cib/libs/etl/support/hfsm.png | Bin 0 -> 30754 bytes Chapter18/cib/libs/etl/test/CMakeLists.txt | 455 + .../test/Deprecated/test_embedded_compile.cpp | 426 + .../libs/etl/test/Deprecated/test_factory.cpp | 355 + .../unordered_map/unordered_map.sln | 28 + .../unordered_map/unordered_map/ReadMe.txt | 40 + .../unordered_map/unordered_map/stdafx.cpp | 8 + .../unordered_map/unordered_map/stdafx.h | 15 + .../unordered_map/unordered_map/targetver.h | 8 + .../unordered_map/unordered_map.cpp | 82 + .../unordered_map/unordered_map.vcxproj | 164 + .../unordered_map.vcxproj.filters | 42 + .../etl/test/UnitTest++/AssertException.cpp | 15 + .../etl/test/UnitTest++/AssertException.h | 23 + .../libs/etl/test/UnitTest++/CMakeLists.txt | 51 + .../libs/etl/test/UnitTest++/CheckMacros.h | 410 + .../cib/libs/etl/test/UnitTest++/Checks.cpp | 50 + .../cib/libs/etl/test/UnitTest++/Checks.h | 389 + .../test/UnitTest++/CompositeTestReporter.cpp | 66 + .../test/UnitTest++/CompositeTestReporter.h | 34 + .../cib/libs/etl/test/UnitTest++/Config.h | 84 + .../libs/etl/test/UnitTest++/CurrentTest.cpp | 18 + .../libs/etl/test/UnitTest++/CurrentTest.h | 19 + .../test/UnitTest++/DeferredTestReporter.cpp | 33 + .../test/UnitTest++/DeferredTestReporter.h | 35 + .../test/UnitTest++/DeferredTestResult.cpp | 43 + .../etl/test/UnitTest++/DeferredTestResult.h | 52 + .../etl/test/UnitTest++/ExceptionMacros.h | 20 + .../libs/etl/test/UnitTest++/ExecuteTest.h | 61 + .../libs/etl/test/UnitTest++/HelperMacros.h | 52 + .../etl/test/UnitTest++/MemoryOutStream.cpp | 218 + .../etl/test/UnitTest++/MemoryOutStream.h | 87 + .../UnitTest++/Posix/SignalTranslator.cpp | 46 + .../test/UnitTest++/Posix/SignalTranslator.h | 41 + .../etl/test/UnitTest++/Posix/TimeHelpers.cpp | 33 + .../etl/test/UnitTest++/Posix/TimeHelpers.h | 28 + .../libs/etl/test/UnitTest++/ReportAssert.cpp | 71 + .../libs/etl/test/UnitTest++/ReportAssert.h | 12 + .../etl/test/UnitTest++/ReportAssertImpl.h | 46 + .../libs/etl/test/UnitTest++/RequireMacros.h | 16 + .../UnitTest++/RequiredCheckException.cpp | 17 + .../test/UnitTest++/RequiredCheckException.h | 23 + .../UnitTest++/RequiredCheckTestReporter.cpp | 26 + .../UnitTest++/RequiredCheckTestReporter.h | 33 + .../cib/libs/etl/test/UnitTest++/Test.cpp | 38 + Chapter18/cib/libs/etl/test/UnitTest++/Test.h | 35 + .../libs/etl/test/UnitTest++/TestDetails.cpp | 22 + .../libs/etl/test/UnitTest++/TestDetails.h | 27 + .../cib/libs/etl/test/UnitTest++/TestList.cpp | 38 + .../cib/libs/etl/test/UnitTest++/TestList.h | 33 + .../cib/libs/etl/test/UnitTest++/TestMacros.h | 126 + .../libs/etl/test/UnitTest++/TestReporter.cpp | 8 + .../libs/etl/test/UnitTest++/TestReporter.h | 22 + .../test/UnitTest++/TestReporterStdout.cpp | 44 + .../etl/test/UnitTest++/TestReporterStdout.h | 19 + .../libs/etl/test/UnitTest++/TestResults.cpp | 59 + .../libs/etl/test/UnitTest++/TestResults.h | 41 + .../libs/etl/test/UnitTest++/TestRunner.cpp | 82 + .../cib/libs/etl/test/UnitTest++/TestRunner.h | 61 + .../cib/libs/etl/test/UnitTest++/TestSuite.h | 12 + .../test/UnitTest++/ThrowingTestReporter.cpp | 61 + .../test/UnitTest++/ThrowingTestReporter.h | 26 + .../etl/test/UnitTest++/TimeConstraint.cpp | 29 + .../libs/etl/test/UnitTest++/TimeConstraint.h | 37 + .../libs/etl/test/UnitTest++/TimeHelpers.h | 7 + .../cib/libs/etl/test/UnitTest++/UnitTest++.h | 1 + .../cib/libs/etl/test/UnitTest++/UnitTestPP.h | 12 + .../etl/test/UnitTest++/Win32/TimeHelpers.cpp | 49 + .../etl/test/UnitTest++/Win32/TimeHelpers.h | 45 + .../etl/test/UnitTest++/XmlTestReporter.cpp | 130 + .../etl/test/UnitTest++/XmlTestReporter.h | 38 + Chapter18/cib/libs/etl/test/data.h | 284 + .../exceptions/CMakeLists.txt | 120 + .../exceptions/etl_profile.h | 0 .../exceptions/test_error_handler.cpp | 223 + .../log_errors/CMakeLists.txt | 123 + .../log_errors/etl_profile.h | 0 .../log_errors/test_error_handler.cpp | 174 + .../log_errors_and_exceptions/CMakeLists.txt | 124 + .../log_errors_and_exceptions/etl_profile.h | 0 .../test_error_handler.cpp | 244 + .../test/etl_initializer_list/CMakeLists.txt | 121 + .../etl_initializer_list.sln | 31 + .../etl_initializer_list.vcxproj | 157 + .../test/etl_initializer_list/etl_profile.h | 0 .../test_initializer_list.cpp | 100 + Chapter18/cib/libs/etl/test/etl_profile.h | 135 + .../libs/etl/test/iterators_for_unit_tests.h | 219 + .../cib/libs/etl/test/list_header_files.bat | 14 + .../cib/libs/etl/test/list_test_files.bat | 10 + .../cib/libs/etl/test/list_test_files.ps1 | 1 + .../cib/libs/etl/test/list_test_files.sh | 3 + Chapter18/cib/libs/etl/test/main.cpp | 33 + .../cib/libs/etl/test/maincpp03check.cpp | 169 + Chapter18/cib/libs/etl/test/meson.build | 316 + Chapter18/cib/libs/etl/test/murmurhash3.cpp | 343 + Chapter18/cib/libs/etl/test/murmurhash3.h | 42 + .../cib/libs/etl/test/run-syntax-checks.sh | 1108 + Chapter18/cib/libs/etl/test/run-tests.sh | 558 + .../etl/test/syntax_check/absolute.h.t.cpp | 29 + .../etl/test/syntax_check/algorithm.h.t.cpp | 29 + .../etl/test/syntax_check/alignment.h.t.cpp | 29 + .../libs/etl/test/syntax_check/array.h.t.cpp | 29 + .../etl/test/syntax_check/array_view.h.t.cpp | 29 + .../test/syntax_check/array_wrapper.h.t.cpp | 29 + .../libs/etl/test/syntax_check/atomic.h.t.cpp | 29 + .../libs/etl/test/syntax_check/base64.h.t.cpp | 29 + .../test/syntax_check/base64_decoder.h.t.cpp | 29 + .../test/syntax_check/base64_encoder.h.t.cpp | 29 + .../syntax_check/basic_format_spec.h.t.cpp | 29 + .../test/syntax_check/basic_string.h.t.cpp | 29 + .../syntax_check/basic_string_stream.h.t.cpp | 29 + .../libs/etl/test/syntax_check/binary.h.t.cpp | 29 + .../bip_buffer_spsc_atomic.h.t.cpp | 29 + .../libs/etl/test/syntax_check/bit.h.t.cpp | 29 + .../etl/test/syntax_check/bit_stream.h.t.cpp | 29 + .../libs/etl/test/syntax_check/bitset.h.t.cpp | 29 + .../test/syntax_check/bitset_legacy.h.t.cpp | 29 + .../etl/test/syntax_check/bitset_new.h.t.cpp | 29 + .../test/syntax_check/bloom_filter.h.t.cpp | 29 + .../test/syntax_check/bresenham_line.h.t.cpp | 29 + .../syntax_check/buffer_descriptors.h.t.cpp | 29 + .../libs/etl/test/syntax_check/byte.h.t.cpp | 29 + .../etl/test/syntax_check/byte_stream.h.t.cpp | 29 + .../test/syntax_check/c++03/CMakeLists.txt | 314 + .../etl/test/syntax_check/c++03/etl_profile.h | 70 + .../test/syntax_check/c++11/CMakeLists.txt | 314 + .../etl/test/syntax_check/c++11/etl_profile.h | 70 + .../test/syntax_check/c++14/CMakeLists.txt | 314 + .../etl/test/syntax_check/c++14/etl_profile.h | 70 + .../test/syntax_check/c++17/CMakeLists.txt | 314 + .../etl/test/syntax_check/c++17/etl_profile.h | 69 + .../test/syntax_check/c++20/CMakeLists.txt | 314 + .../etl/test/syntax_check/c++20/etl_profile.h | 69 + .../etl/test/syntax_check/callback.h.t.cpp | 29 + .../syntax_check/callback_service.h.t.cpp | 29 + .../test/syntax_check/callback_timer.h.t.cpp | 29 + .../callback_timer_atomic.h.t.cpp | 29 + .../callback_timer_interrupt.h.t.cpp | 29 + .../callback_timer_locked.h.t.cpp | 29 + .../etl/test/syntax_check/char_traits.h.t.cpp | 29 + .../etl/test/syntax_check/checksum.h.t.cpp | 29 + .../test/syntax_check/circular_buffer.h.t.cpp | 29 + .../syntax_check/circular_iterator.h.t.cpp | 29 + .../test/syntax_check/combinations.h.t.cpp | 29 + .../etl/test/syntax_check/compare.h.t.cpp | 29 + .../etl/test/syntax_check/constant.h.t.cpp | 29 + .../etl/test/syntax_check/container.h.t.cpp | 29 + .../etl/test/syntax_check/correlation.h.t.cpp | 29 + .../etl/test/syntax_check/covariance.h.t.cpp | 29 + .../libs/etl/test/syntax_check/crc1.h.t.cpp | 29 + .../libs/etl/test/syntax_check/crc16.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_a.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_arc.h.t.cpp | 29 + .../test/syntax_check/crc16_aug_ccitt.h.t.cpp | 29 + .../test/syntax_check/crc16_buypass.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_ccitt.h.t.cpp | 29 + .../test/syntax_check/crc16_cdma2000.h.t.cpp | 29 + .../test/syntax_check/crc16_dds110.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_dectr.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_dectx.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_dnp.h.t.cpp | 29 + .../test/syntax_check/crc16_en13757.h.t.cpp | 29 + .../test/syntax_check/crc16_genibus.h.t.cpp | 29 + .../test/syntax_check/crc16_kermit.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_m17.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_maxim.h.t.cpp | 29 + .../test/syntax_check/crc16_mcrf4xx.h.t.cpp | 29 + .../test/syntax_check/crc16_modbus.h.t.cpp | 29 + .../test/syntax_check/crc16_profibus.h.t.cpp | 29 + .../test/syntax_check/crc16_riello.h.t.cpp | 29 + .../test/syntax_check/crc16_t10dif.h.t.cpp | 29 + .../test/syntax_check/crc16_teledisk.h.t.cpp | 29 + .../test/syntax_check/crc16_tms37157.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_usb.h.t.cpp | 29 + .../etl/test/syntax_check/crc16_x25.h.t.cpp | 29 + .../test/syntax_check/crc16_xmodem.h.t.cpp | 29 + .../libs/etl/test/syntax_check/crc32.h.t.cpp | 29 + .../etl/test/syntax_check/crc32_bzip2.h.t.cpp | 29 + .../etl/test/syntax_check/crc32_c.h.t.cpp | 29 + .../etl/test/syntax_check/crc32_d.h.t.cpp | 29 + .../test/syntax_check/crc32_jamcrc.h.t.cpp | 29 + .../etl/test/syntax_check/crc32_mpeg2.h.t.cpp | 29 + .../etl/test/syntax_check/crc32_posix.h.t.cpp | 29 + .../etl/test/syntax_check/crc32_q.h.t.cpp | 29 + .../etl/test/syntax_check/crc32_xfer.h.t.cpp | 29 + .../etl/test/syntax_check/crc64_ecma.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_ccitt.h.t.cpp | 29 + .../test/syntax_check/crc8_cdma2000.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_darc.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_dvbs2.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_ebu.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_icode.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_itu.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_j1850.h.t.cpp | 29 + .../test/syntax_check/crc8_j1850_zero.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_maxim.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_rohc.h.t.cpp | 29 + .../etl/test/syntax_check/crc8_wcdma.h.t.cpp | 29 + .../test/syntax_check/cyclic_value.h.t.cpp | 29 + .../etl/test/syntax_check/debounce.h.t.cpp | 29 + .../etl/test/syntax_check/debug_count.h.t.cpp | 29 + .../etl/test/syntax_check/delegate.h.t.cpp | 29 + .../test/syntax_check/delegate_cpp03.h.t.cpp | 29 + .../syntax_check/delegate_service.h.t.cpp | 29 + .../libs/etl/test/syntax_check/deque.h.t.cpp | 29 + .../etl/test/syntax_check/endianness.h.t.cpp | 29 + .../etl/test/syntax_check/enum_type.h.t.cpp | 29 + .../test/syntax_check/error_handler.h.t.cpp | 29 + .../etl/test/syntax_check/exception.h.t.cpp | 29 + .../etl/test/syntax_check/expected.h.t.cpp | 29 + .../etl/test/syntax_check/factorial.h.t.cpp | 29 + .../etl/test/syntax_check/fibonacci.h.t.cpp | 29 + .../syntax_check/file_error_numbers.h.t.cpp | 29 + .../test/syntax_check/fixed_iterator.h.t.cpp | 29 + ...fixed_sized_memory_block_allocator.h.t.cpp | 29 + .../libs/etl/test/syntax_check/flags.h.t.cpp | 29 + .../etl/test/syntax_check/flat_map.h.t.cpp | 29 + .../test/syntax_check/flat_multimap.h.t.cpp | 29 + .../test/syntax_check/flat_multiset.h.t.cpp | 29 + .../etl/test/syntax_check/flat_set.h.t.cpp | 29 + .../libs/etl/test/syntax_check/fnv_1.h.t.cpp | 29 + .../etl/test/syntax_check/format_spec.h.t.cpp | 29 + .../test/syntax_check/forward_list.h.t.cpp | 29 + .../syntax_check/frame_check_sequence.h.t.cpp | 29 + .../libs/etl/test/syntax_check/fsm.h.t.cpp | 29 + .../etl/test/syntax_check/function.h.t.cpp | 29 + .../etl/test/syntax_check/functional.h.t.cpp | 29 + .../libs/etl/test/syntax_check/gamma.h.t.cpp | 29 + .../libs/etl/test/syntax_check/gcd.h.t.cpp | 29 + .../test/syntax_check/generic_pool.h.t.cpp | 29 + .../libs/etl/test/syntax_check/hash.h.t.cpp | 29 + .../libs/etl/test/syntax_check/hfsm.h.t.cpp | 29 + .../etl/test/syntax_check/histogram.h.t.cpp | 29 + .../libs/etl/test/syntax_check/ihash.h.t.cpp | 29 + .../imemory_block_allocator.h.t.cpp | 29 + .../test/syntax_check/indirect_vector.h.t.cpp | 29 + .../syntax_check/initializer_list.h.t.cpp | 32 + .../test/syntax_check/instance_count.h.t.cpp | 29 + .../test/syntax_check/integral_limits.h.t.cpp | 29 + .../intrusive_forward_list.h.t.cpp | 29 + .../test/syntax_check/intrusive_links.h.t.cpp | 29 + .../test/syntax_check/intrusive_list.h.t.cpp | 29 + .../test/syntax_check/intrusive_queue.h.t.cpp | 29 + .../test/syntax_check/intrusive_stack.h.t.cpp | 29 + .../libs/etl/test/syntax_check/invert.h.t.cpp | 29 + .../etl/test/syntax_check/io_port.h.t.cpp | 29 + .../libs/etl/test/syntax_check/ipool.h.t.cpp | 29 + .../ireference_counted_message_pool.h.t.cpp | 29 + .../etl/test/syntax_check/iterator.h.t.cpp | 29 + .../etl/test/syntax_check/jenkins.h.t.cpp | 29 + .../etl/test/syntax_check/largest.h.t.cpp | 29 + .../libs/etl/test/syntax_check/lcm.h.t.cpp | 29 + .../etl/test/syntax_check/limiter.h.t.cpp | 29 + .../libs/etl/test/syntax_check/limits.h.t.cpp | 29 + .../libs/etl/test/syntax_check/list.h.t.cpp | 29 + .../libs/etl/test/syntax_check/log.h.t.cpp | 29 + .../libs/etl/test/syntax_check/macros.h.t.cpp | 29 + .../libs/etl/test/syntax_check/map.h.t.cpp | 29 + .../libs/etl/test/syntax_check/math.h.t.cpp | 29 + .../test/syntax_check/math_constants.h.t.cpp | 29 + .../libs/etl/test/syntax_check/mean.h.t.cpp | 29 + .../etl/test/syntax_check/mem_cast.h.t.cpp | 29 + .../libs/etl/test/syntax_check/memory.h.t.cpp | 29 + .../test/syntax_check/memory_model.h.t.cpp | 29 + .../etl/test/syntax_check/message.h.t.cpp | 29 + .../test/syntax_check/message_broker.h.t.cpp | 29 + .../etl/test/syntax_check/message_bus.h.t.cpp | 29 + .../test/syntax_check/message_packet.h.t.cpp | 29 + .../test/syntax_check/message_router.h.t.cpp | 29 + .../message_router_registry.h.t.cpp | 29 + .../test/syntax_check/message_timer.h.t.cpp | 29 + .../syntax_check/message_timer_atomic.h.t.cpp | 29 + .../message_timer_interrupt.h.t.cpp | 29 + .../syntax_check/message_timer_locked.h.t.cpp | 29 + .../test/syntax_check/message_types.h.t.cpp | 29 + .../etl/test/syntax_check/multi_array.h.t.cpp | 29 + .../etl/test/syntax_check/multi_range.h.t.cpp | 29 + .../etl/test/syntax_check/multi_span.h.t.cpp | 29 + .../test/syntax_check/multi_vector.h.t.cpp | 29 + .../etl/test/syntax_check/multimap.h.t.cpp | 29 + .../etl/test/syntax_check/multiset.h.t.cpp | 29 + .../etl/test/syntax_check/murmur3.h.t.cpp | 29 + .../libs/etl/test/syntax_check/mutex.h.t.cpp | 29 + .../etl/test/syntax_check/negative.h.t.cpp | 29 + .../etl/test/syntax_check/nth_type.h.t.cpp | 29 + .../etl/test/syntax_check/null_type.h.t.cpp | 29 + .../etl/test/syntax_check/nullptr.h.t.cpp | 29 + .../etl/test/syntax_check/numeric.h.t.cpp | 29 + .../etl/test/syntax_check/observer.h.t.cpp | 29 + .../etl/test/syntax_check/optional.h.t.cpp | 29 + .../etl/test/syntax_check/overload.h.t.cpp | 29 + .../libs/etl/test/syntax_check/packet.h.t.cpp | 29 + .../test/syntax_check/parameter_pack.h.t.cpp | 29 + .../test/syntax_check/parameter_type.h.t.cpp | 29 + .../etl/test/syntax_check/pearson.h.t.cpp | 29 + .../test/syntax_check/permutations.h.t.cpp | 29 + .../test/syntax_check/placement_new.h.t.cpp | 29 + .../etl/test/syntax_check/platform.h.t.cpp | 29 + .../etl/test/syntax_check/poly_span.h.t.cpp | 29 + .../libs/etl/test/syntax_check/pool.h.t.cpp | 29 + .../libs/etl/test/syntax_check/power.h.t.cpp | 29 + .../test/syntax_check/priority_queue.h.t.cpp | 29 + .../pseudo_moving_average.h.t.cpp | 29 + .../etl/test/syntax_check/quantize.h.t.cpp | 29 + .../libs/etl/test/syntax_check/queue.h.t.cpp | 29 + .../test/syntax_check/queue_lockable.h.t.cpp | 29 + .../syntax_check/queue_mpmc_mutex.h.t.cpp | 29 + .../syntax_check/queue_spsc_atomic.h.t.cpp | 29 + .../test/syntax_check/queue_spsc_isr.h.t.cpp | 29 + .../syntax_check/queue_spsc_locked.h.t.cpp | 29 + .../libs/etl/test/syntax_check/radix.h.t.cpp | 29 + .../libs/etl/test/syntax_check/random.h.t.cpp | 29 + .../libs/etl/test/syntax_check/ratio.h.t.cpp | 29 + .../reference_counted_message.h.t.cpp | 29 + .../reference_counted_message_pool.h.t.cpp | 29 + .../reference_counted_object.h.t.cpp | 29 + .../syntax_check/reference_flat_map.h.t.cpp | 29 + .../reference_flat_multimap.h.t.cpp | 29 + .../reference_flat_multiset.h.t.cpp | 29 + .../syntax_check/reference_flat_set.h.t.cpp | 29 + .../etl/test/syntax_check/rescale.h.t.cpp | 29 + .../libs/etl/test/syntax_check/result.h.t.cpp | 29 + .../libs/etl/test/syntax_check/rms.h.t.cpp | 29 + .../test/syntax_check/scaled_rounding.h.t.cpp | 29 + .../etl/test/syntax_check/scheduler.h.t.cpp | 29 + .../libs/etl/test/syntax_check/set.h.t.cpp | 29 + .../test/syntax_check/shared_message.h.t.cpp | 29 + .../etl/test/syntax_check/singleton.h.t.cpp | 29 + .../etl/test/syntax_check/smallest.h.t.cpp | 29 + .../libs/etl/test/syntax_check/span.h.t.cpp | 29 + .../libs/etl/test/syntax_check/sqrt.h.t.cpp | 29 + .../libs/etl/test/syntax_check/stack.h.t.cpp | 29 + .../syntax_check/standard_deviation.h.t.cpp | 29 + .../etl/test/syntax_check/state_chart.h.t.cpp | 29 + .../test/syntax_check/static_assert.h.t.cpp | 29 + .../libs/etl/test/syntax_check/string.h.t.cpp | 29 + .../test/syntax_check/string_stream.h.t.cpp | 29 + .../syntax_check/string_utilities.h.t.cpp | 29 + .../etl/test/syntax_check/string_view.h.t.cpp | 29 + .../etl/test/syntax_check/stringify.h.t.cpp | 29 + .../etl/test/syntax_check/successor.h.t.cpp | 29 + .../libs/etl/test/syntax_check/task.h.t.cpp | 29 + .../etl/test/syntax_check/threshold.h.t.cpp | 29 + .../libs/etl/test/syntax_check/timer.h.t.cpp | 29 + .../test/syntax_check/to_arithmetic.h.t.cpp | 28 + .../etl/test/syntax_check/to_string.h.t.cpp | 29 + .../test/syntax_check/to_u16string.h.t.cpp | 29 + .../test/syntax_check/to_u32string.h.t.cpp | 29 + .../etl/test/syntax_check/to_u8string.h.t.cpp | 29 + .../etl/test/syntax_check/to_wstring.h.t.cpp | 29 + .../etl/test/syntax_check/type_def.h.t.cpp | 29 + .../etl/test/syntax_check/type_lookup.h.t.cpp | 29 + .../etl/test/syntax_check/type_select.h.t.cpp | 29 + .../etl/test/syntax_check/type_traits.h.t.cpp | 29 + .../test/syntax_check/u16format_spec.h.t.cpp | 29 + .../etl/test/syntax_check/u16string.h.t.cpp | 29 + .../syntax_check/u16string_stream.h.t.cpp | 29 + .../test/syntax_check/u32format_spec.h.t.cpp | 29 + .../etl/test/syntax_check/u32string.h.t.cpp | 29 + .../syntax_check/u32string_stream.h.t.cpp | 29 + .../test/syntax_check/u8format_spec.h.t.cpp | 29 + .../etl/test/syntax_check/u8string.h.t.cpp | 29 + .../test/syntax_check/u8string_stream.h.t.cpp | 29 + .../test/syntax_check/unaligned_type.h.t.cpp | 29 + .../test/syntax_check/unordered_map.h.t.cpp | 29 + .../syntax_check/unordered_multimap.h.t.cpp | 29 + .../syntax_check/unordered_multiset.h.t.cpp | 29 + .../test/syntax_check/unordered_set.h.t.cpp | 29 + .../etl/test/syntax_check/user_type.h.t.cpp | 29 + .../etl/test/syntax_check/utility.h.t.cpp | 29 + .../etl/test/syntax_check/variance.h.t.cpp | 29 + .../etl/test/syntax_check/variant.h.t.cpp | 29 + .../test/syntax_check/variant_legacy.h.t.cpp | 29 + .../etl/test/syntax_check/variant_old.h.t.cpp | 29 + .../test/syntax_check/variant_pool.h.t.cpp | 29 + .../syntax_check/variant_variadic.h.t.cpp | 29 + .../libs/etl/test/syntax_check/vector.h.t.cpp | 29 + .../etl/test/syntax_check/version.h.t.cpp | 29 + .../etl/test/syntax_check/visitor.h.t.cpp | 29 + .../test/syntax_check/wformat_spec.h.t.cpp | 29 + .../etl/test/syntax_check/wstring.h.t.cpp | 29 + .../test/syntax_check/wstring_stream.h.t.cpp | 29 + Chapter18/cib/libs/etl/test/test.sh | 179 + .../cib/libs/etl/test/test_algorithm.cpp | 2424 + .../cib/libs/etl/test/test_alignment.cpp | 159 + Chapter18/cib/libs/etl/test/test_array.cpp | 893 + .../cib/libs/etl/test/test_array_view.cpp | 771 + .../cib/libs/etl/test/test_array_wrapper.cpp | 576 + Chapter18/cib/libs/etl/test/test_atomic.cpp | 743 + .../etl/test/test_base64_RFC2152_decoder.cpp | 777 + .../etl/test/test_base64_RFC2152_encoder.cpp | 747 + .../etl/test/test_base64_RFC3501_decoder.cpp | 774 + .../etl/test/test_base64_RFC3501_encoder.cpp | 743 + ...64_RFC4648_URL_decoder_with_no_padding.cpp | 789 + ...ase64_RFC4648_URL_decoder_with_padding.cpp | 788 + ...64_RFC4648_URL_encoder_with_no_padding.cpp | 741 + ...ase64_RFC4648_URL_encoder_with_padding.cpp | 741 + ...base64_RFC4648_decoder_with_no_padding.cpp | 789 + ...st_base64_RFC4648_decoder_with_padding.cpp | 789 + ...base64_RFC4648_encoder_with_no_padding.cpp | 741 + ...st_base64_RFC4648_encoder_with_padding.cpp | 741 + Chapter18/cib/libs/etl/test/test_binary.cpp | 3059 + .../etl/test/test_bip_buffer_spsc_atomic.cpp | 398 + Chapter18/cib/libs/etl/test/test_bit.cpp | 1569 + .../cib/libs/etl/test/test_bit_stream.cpp | 1078 + .../test_bit_stream_reader_big_endian.cpp | 1511 + .../test_bit_stream_reader_little_endian.cpp | 1199 + .../test_bit_stream_writer_big_endian.cpp | 800 + .../test_bit_stream_writer_little_endian.cpp | 887 + .../cib/libs/etl/test/test_bitset_legacy.cpp | 1528 + .../etl/test/test_bitset_new_comparisons.cpp | 239 + .../test_bitset_new_default_element_type.cpp | 2726 + ...itset_new_explicit_single_element_type.cpp | 2819 + ...st_bitset_new_ext_default_element_type.cpp | 2475 + ...t_new_ext_explicit_single_element_type.cpp | 2623 + .../cib/libs/etl/test/test_bloom_filter.cpp | 265 + .../cib/libs/etl/test/test_bresenham_line.cpp | 440 + .../cib/libs/etl/test/test_bsd_checksum.cpp | 169 + .../libs/etl/test/test_buffer_descriptors.cpp | 407 + Chapter18/cib/libs/etl/test/test_byte.cpp | 236 + .../cib/libs/etl/test/test_byte_stream.cpp | 1352 + .../libs/etl/test/test_callback_service.cpp | 333 + .../cib/libs/etl/test/test_callback_timer.cpp | 898 + .../etl/test/test_callback_timer_atomic.cpp | 906 + .../test/test_callback_timer_interrupt.cpp | 949 + .../etl/test/test_callback_timer_locked.cpp | 1099 + .../cib/libs/etl/test/test_char_traits.cpp | 746 + Chapter18/cib/libs/etl/test/test_checksum.cpp | 186 + .../libs/etl/test/test_circular_buffer.cpp | 1068 + .../test_circular_buffer_external_buffer.cpp | 1066 + .../libs/etl/test/test_circular_iterator.cpp | 703 + Chapter18/cib/libs/etl/test/test_compare.cpp | 195 + Chapter18/cib/libs/etl/test/test_constant.cpp | 65 + .../cib/libs/etl/test/test_container.cpp | 151 + .../cib/libs/etl/test/test_correlation.cpp | 284 + .../cib/libs/etl/test/test_covariance.cpp | 242 + Chapter18/cib/libs/etl/test/test_crc1.cpp | 140 + Chapter18/cib/libs/etl/test/test_crc16.cpp | 263 + Chapter18/cib/libs/etl/test/test_crc16_a.cpp | 263 + .../cib/libs/etl/test/test_crc16_arc.cpp | 263 + .../libs/etl/test/test_crc16_aug_ccitt.cpp | 263 + .../cib/libs/etl/test/test_crc16_buypass.cpp | 263 + .../cib/libs/etl/test/test_crc16_ccitt.cpp | 263 + .../cib/libs/etl/test/test_crc16_cdma2000.cpp | 263 + .../cib/libs/etl/test/test_crc16_dds110.cpp | 263 + .../cib/libs/etl/test/test_crc16_dectr.cpp | 263 + .../cib/libs/etl/test/test_crc16_dectx.cpp | 263 + .../cib/libs/etl/test/test_crc16_dnp.cpp | 263 + .../cib/libs/etl/test/test_crc16_en13757.cpp | 263 + .../cib/libs/etl/test/test_crc16_genibus.cpp | 263 + .../cib/libs/etl/test/test_crc16_kermit.cpp | 263 + .../cib/libs/etl/test/test_crc16_m17.cpp | 263 + .../cib/libs/etl/test/test_crc16_maxim.cpp | 263 + .../cib/libs/etl/test/test_crc16_mcrf4xx.cpp | 263 + .../cib/libs/etl/test/test_crc16_modbus.cpp | 263 + .../cib/libs/etl/test/test_crc16_profibus.cpp | 263 + .../cib/libs/etl/test/test_crc16_riello.cpp | 263 + .../cib/libs/etl/test/test_crc16_t10dif.cpp | 263 + .../cib/libs/etl/test/test_crc16_teledisk.cpp | 263 + .../cib/libs/etl/test/test_crc16_tms37157.cpp | 263 + .../cib/libs/etl/test/test_crc16_usb.cpp | 263 + .../cib/libs/etl/test/test_crc16_x25.cpp | 263 + .../cib/libs/etl/test/test_crc16_xmodem.cpp | 263 + Chapter18/cib/libs/etl/test/test_crc32.cpp | 263 + .../cib/libs/etl/test/test_crc32_bzip2.cpp | 263 + Chapter18/cib/libs/etl/test/test_crc32_c.cpp | 263 + Chapter18/cib/libs/etl/test/test_crc32_d.cpp | 263 + .../cib/libs/etl/test/test_crc32_jamcrc.cpp | 263 + .../cib/libs/etl/test/test_crc32_mpeg2.cpp | 263 + .../cib/libs/etl/test/test_crc32_posix.cpp | 263 + Chapter18/cib/libs/etl/test/test_crc32_q.cpp | 263 + .../cib/libs/etl/test/test_crc32_xfer.cpp | 263 + .../cib/libs/etl/test/test_crc64_ecma.cpp | 263 + .../cib/libs/etl/test/test_crc8_ccitt.cpp | 263 + .../cib/libs/etl/test/test_crc8_cdma2000.cpp | 263 + .../cib/libs/etl/test/test_crc8_darc.cpp | 263 + .../cib/libs/etl/test/test_crc8_dvbs2.cpp | 263 + Chapter18/cib/libs/etl/test/test_crc8_ebu.cpp | 263 + .../cib/libs/etl/test/test_crc8_icode.cpp | 263 + Chapter18/cib/libs/etl/test/test_crc8_itu.cpp | 263 + .../cib/libs/etl/test/test_crc8_j1850.cpp | 263 + .../libs/etl/test/test_crc8_j1850_zero.cpp | 263 + .../cib/libs/etl/test/test_crc8_maxim.cpp | 263 + .../cib/libs/etl/test/test_crc8_rohc.cpp | 263 + .../cib/libs/etl/test/test_crc8_wcdma.cpp | 263 + .../cib/libs/etl/test/test_cyclic_value.cpp | 496 + Chapter18/cib/libs/etl/test/test_debounce.cpp | 879 + Chapter18/cib/libs/etl/test/test_delegate.cpp | 1437 + .../cib/libs/etl/test/test_delegate_cpp03.cpp | 924 + .../libs/etl/test/test_delegate_service.cpp | 337 + .../test_delegate_service_compile_time.cpp | 165 + .../etl/test/test_delegate_service_cpp03.cpp | 337 + Chapter18/cib/libs/etl/test/test_deque.cpp | 2269 + Chapter18/cib/libs/etl/test/test_endian.cpp | 49 + .../cib/libs/etl/test/test_enum_type.cpp | 154 + .../cib/libs/etl/test/test_error_handler.cpp | 192 + .../cib/libs/etl/test/test_etl_traits.cpp | 104 + .../cib/libs/etl/test/test_exception.cpp | 65 + Chapter18/cib/libs/etl/test/test_expected.cpp | 763 + .../cib/libs/etl/test/test_fixed_iterator.cpp | 232 + ...est_fixed_sized_memory_block_allocator.cpp | 289 + Chapter18/cib/libs/etl/test/test_flags.cpp | 614 + Chapter18/cib/libs/etl/test/test_flat_map.cpp | 1559 + .../cib/libs/etl/test/test_flat_multimap.cpp | 1368 + .../cib/libs/etl/test/test_flat_multiset.cpp | 1360 + Chapter18/cib/libs/etl/test/test_flat_set.cpp | 1320 + Chapter18/cib/libs/etl/test/test_fnv_1.cpp | 323 + .../cib/libs/etl/test/test_format_spec.cpp | 123 + .../cib/libs/etl/test/test_forward_list.cpp | 1424 + .../test/test_forward_list_shared_pool.cpp | 1930 + Chapter18/cib/libs/etl/test/test_fsm.cpp | 684 + Chapter18/cib/libs/etl/test/test_function.cpp | 510 + .../cib/libs/etl/test/test_functional.cpp | 383 + Chapter18/cib/libs/etl/test/test_gamma.cpp | 125 + Chapter18/cib/libs/etl/test/test_hash.cpp | 314 + Chapter18/cib/libs/etl/test/test_hfsm.cpp | 990 + ...t_hfsm_recurse_to_inner_state_on_start.cpp | 260 + .../cib/libs/etl/test/test_histogram.cpp | 380 + .../libs/etl/test/test_indirect_vector.cpp | 1557 + .../test_indirect_vector_external_buffer.cpp | 1704 + .../cib/libs/etl/test/test_instance_count.cpp | 110 + .../libs/etl/test/test_integral_limits.cpp | 105 + .../etl/test/test_intrusive_forward_list.cpp | 1170 + .../libs/etl/test/test_intrusive_links.cpp | 1398 + .../cib/libs/etl/test/test_intrusive_list.cpp | 1416 + .../libs/etl/test/test_intrusive_queue.cpp | 442 + .../libs/etl/test/test_intrusive_stack.cpp | 332 + Chapter18/cib/libs/etl/test/test_invert.cpp | 134 + Chapter18/cib/libs/etl/test/test_io_port.cpp | 527 + Chapter18/cib/libs/etl/test/test_iterator.cpp | 584 + Chapter18/cib/libs/etl/test/test_jenkins.cpp | 160 + Chapter18/cib/libs/etl/test/test_largest.cpp | 255 + Chapter18/cib/libs/etl/test/test_limiter.cpp | 102 + Chapter18/cib/libs/etl/test/test_limits.cpp | 704 + Chapter18/cib/libs/etl/test/test_list.cpp | 2237 + .../libs/etl/test/test_list_shared_pool.cpp | 2228 + Chapter18/cib/libs/etl/test/test_macros.cpp | 61 + .../cib/libs/etl/test/test_make_string.cpp | 188 + Chapter18/cib/libs/etl/test/test_map.cpp | 1637 + Chapter18/cib/libs/etl/test/test_math.cpp | 134 + .../cib/libs/etl/test/test_math_functions.cpp | 539 + Chapter18/cib/libs/etl/test/test_mean.cpp | 116 + Chapter18/cib/libs/etl/test/test_mem_cast.cpp | 299 + .../cib/libs/etl/test/test_mem_cast_ptr.cpp | 351 + Chapter18/cib/libs/etl/test/test_memory.cpp | 1531 + Chapter18/cib/libs/etl/test/test_message.cpp | 132 + .../cib/libs/etl/test/test_message_broker.cpp | 562 + .../cib/libs/etl/test/test_message_bus.cpp | 1011 + .../cib/libs/etl/test/test_message_packet.cpp | 485 + .../cib/libs/etl/test/test_message_router.cpp | 645 + .../etl/test/test_message_router_registry.cpp | 396 + .../cib/libs/etl/test/test_message_timer.cpp | 769 + .../etl/test/test_message_timer_atomic.cpp | 769 + .../etl/test/test_message_timer_interrupt.cpp | 852 + .../etl/test/test_message_timer_locked.cpp | 908 + .../cib/libs/etl/test/test_multi_array.cpp | 492 + .../cib/libs/etl/test/test_multi_range.cpp | 435 + .../cib/libs/etl/test/test_multi_span.cpp | 209 + .../cib/libs/etl/test/test_multi_vector.cpp | 578 + Chapter18/cib/libs/etl/test/test_multimap.cpp | 1695 + Chapter18/cib/libs/etl/test/test_multiset.cpp | 1677 + Chapter18/cib/libs/etl/test/test_murmur3.cpp | 127 + Chapter18/cib/libs/etl/test/test_nth_type.cpp | 46 + Chapter18/cib/libs/etl/test/test_numeric.cpp | 208 + Chapter18/cib/libs/etl/test/test_observer.cpp | 576 + Chapter18/cib/libs/etl/test/test_optional.cpp | 902 + Chapter18/cib/libs/etl/test/test_overload.cpp | 168 + Chapter18/cib/libs/etl/test/test_packet.cpp | 214 + .../cib/libs/etl/test/test_parameter_pack.cpp | 91 + .../cib/libs/etl/test/test_parameter_type.cpp | 90 + .../libs/etl/test/test_parity_checksum.cpp | 147 + Chapter18/cib/libs/etl/test/test_pearson.cpp | 170 + .../test/test_poly_span_dynamic_extent.cpp | 550 + .../etl/test/test_poly_span_fixed_extent.cpp | 569 + Chapter18/cib/libs/etl/test/test_pool.cpp | 479 + .../etl/test/test_pool_external_buffer.cpp | 527 + .../cib/libs/etl/test/test_priority_queue.cpp | 654 + .../etl/test/test_pseudo_moving_average.cpp | 348 + Chapter18/cib/libs/etl/test/test_quantize.cpp | 123 + Chapter18/cib/libs/etl/test/test_queue.cpp | 573 + .../cib/libs/etl/test/test_queue_lockable.cpp | 758 + .../etl/test/test_queue_lockable_small.cpp | 761 + .../test/test_queue_memory_model_small.cpp | 554 + .../libs/etl/test/test_queue_mpmc_mutex.cpp | 556 + .../etl/test/test_queue_mpmc_mutex_small.cpp | 581 + .../libs/etl/test/test_queue_spsc_atomic.cpp | 462 + .../etl/test/test_queue_spsc_atomic_small.cpp | 480 + .../cib/libs/etl/test/test_queue_spsc_isr.cpp | 716 + .../etl/test/test_queue_spsc_isr_small.cpp | 734 + .../libs/etl/test/test_queue_spsc_locked.cpp | 724 + .../etl/test/test_queue_spsc_locked_small.cpp | 741 + Chapter18/cib/libs/etl/test/test_random.cpp | 416 + .../libs/etl/test/test_reference_flat_map.cpp | 980 + .../etl/test/test_reference_flat_multimap.cpp | 922 + .../etl/test/test_reference_flat_multiset.cpp | 841 + .../libs/etl/test/test_reference_flat_set.cpp | 840 + Chapter18/cib/libs/etl/test/test_rescale.cpp | 97 + Chapter18/cib/libs/etl/test/test_result.cpp | 374 + Chapter18/cib/libs/etl/test/test_rms.cpp | 70 + .../libs/etl/test/test_scaled_rounding.cpp | 345 + Chapter18/cib/libs/etl/test/test_set.cpp | 1509 + .../cib/libs/etl/test/test_shared_message.cpp | 387 + .../cib/libs/etl/test/test_singleton.cpp | 103 + Chapter18/cib/libs/etl/test/test_smallest.cpp | 460 + .../etl/test/test_span_dynamic_extent.cpp | 1210 + .../libs/etl/test/test_span_fixed_extent.cpp | 1128 + Chapter18/cib/libs/etl/test/test_stack.cpp | 555 + .../libs/etl/test/test_standard_deviation.cpp | 164 + .../cib/libs/etl/test/test_state_chart.cpp | 603 + .../test/test_state_chart_compile_time.cpp | 612 + ...chart_compile_time_with_data_parameter.cpp | 508 + .../test_state_chart_with_data_parameter.cpp | 499 + ...state_chart_with_rvalue_data_parameter.cpp | 515 + .../cib/libs/etl/test/test_string_char.cpp | 4453 + .../test/test_string_char_external_buffer.cpp | 4794 + .../cib/libs/etl/test/test_string_stream.cpp | 331 + .../libs/etl/test/test_string_stream_u16.cpp | 291 + .../libs/etl/test/test_string_stream_u32.cpp | 291 + .../libs/etl/test/test_string_stream_u8.cpp | 295 + .../etl/test/test_string_stream_wchar_t.cpp | 292 + .../cib/libs/etl/test/test_string_u16.cpp | 4468 + .../test/test_string_u16_external_buffer.cpp | 4854 + .../cib/libs/etl/test/test_string_u32.cpp | 4468 + .../test/test_string_u32_external_buffer.cpp | 4825 + .../cib/libs/etl/test/test_string_u8.cpp | 4473 + .../test/test_string_u8_external_buffer.cpp | 4859 + .../libs/etl/test/test_string_utilities.cpp | 1664 + .../etl/test/test_string_utilities_std.cpp | 1620 + .../test/test_string_utilities_std_u16.cpp | 1595 + .../test/test_string_utilities_std_u32.cpp | 1593 + .../etl/test/test_string_utilities_std_u8.cpp | 1595 + .../test_string_utilities_std_wchar_t.cpp | 1593 + .../etl/test/test_string_utilities_u16.cpp | 1636 + .../etl/test/test_string_utilities_u32.cpp | 1636 + .../etl/test/test_string_utilities_u8.cpp | 1641 + .../test/test_string_utilities_wchar_t.cpp | 1636 + .../cib/libs/etl/test/test_string_view.cpp | 1084 + .../cib/libs/etl/test/test_string_wchar_t.cpp | 4468 + .../test_string_wchar_t_external_buffer.cpp | 4825 + .../cib/libs/etl/test/test_successor.cpp | 515 + .../cib/libs/etl/test/test_task_scheduler.cpp | 291 + .../cib/libs/etl/test/test_threshold.cpp | 137 + .../cib/libs/etl/test/test_to_arithmetic.cpp | 1045 + .../libs/etl/test/test_to_arithmetic_u16.cpp | 1021 + .../libs/etl/test/test_to_arithmetic_u32.cpp | 1021 + .../libs/etl/test/test_to_arithmetic_u8.cpp | 1025 + .../etl/test/test_to_arithmetic_wchar_t.cpp | 1021 + .../cib/libs/etl/test/test_to_string.cpp | 667 + .../cib/libs/etl/test/test_to_u16string.cpp | 570 + .../cib/libs/etl/test/test_to_u32string.cpp | 575 + .../cib/libs/etl/test/test_to_u8string.cpp | 573 + .../cib/libs/etl/test/test_to_wstring.cpp | 637 + Chapter18/cib/libs/etl/test/test_type_def.cpp | 263 + .../cib/libs/etl/test/test_type_lookup.cpp | 431 + .../cib/libs/etl/test/test_type_select.cpp | 186 + .../cib/libs/etl/test/test_type_traits.cpp | 1382 + .../cib/libs/etl/test/test_unaligned_type.cpp | 987 + .../test/test_unaligned_type_constexpr.cpp | 650 + .../cib/libs/etl/test/test_unordered_map.cpp | 1211 + .../libs/etl/test/test_unordered_multimap.cpp | 1072 + .../libs/etl/test/test_unordered_multiset.cpp | 947 + .../cib/libs/etl/test/test_unordered_set.cpp | 913 + .../cib/libs/etl/test/test_user_type.cpp | 224 + Chapter18/cib/libs/etl/test/test_utility.cpp | 670 + Chapter18/cib/libs/etl/test/test_variance.cpp | 146 + .../cib/libs/etl/test/test_variant_legacy.cpp | 939 + .../cib/libs/etl/test/test_variant_pool.cpp | 314 + .../test_variant_pool_external_buffer.cpp | 329 + .../libs/etl/test/test_variant_variadic.cpp | 2146 + Chapter18/cib/libs/etl/test/test_vector.cpp | 1531 + .../etl/test/test_vector_external_buffer.cpp | 1262 + .../libs/etl/test/test_vector_non_trivial.cpp | 1325 + .../cib/libs/etl/test/test_vector_pointer.cpp | 2024 + .../test_vector_pointer_external_buffer.cpp | 1877 + Chapter18/cib/libs/etl/test/test_visitor.cpp | 751 + .../cib/libs/etl/test/test_xor_checksum.cpp | 149 + .../etl/test/test_xor_rotate_checksum.cpp | 149 + .../cib/libs/etl/test/unit_test_framework.h | 34 + Chapter18/cib/libs/etl/test/vs2019/.gitignore | 7 + .../libs/etl/test/vs2019/NatvisFile.natvis | 3 + Chapter18/cib/libs/etl/test/vs2019/cpp.hint | 53 + Chapter18/cib/libs/etl/test/vs2019/etl.sln | 157 + .../cib/libs/etl/test/vs2019/etl.vcxproj | 13584 + .../libs/etl/test/vs2019/etl.vcxproj.filters | 3599 + .../etl_initialiser_list.vcxproj | 149 + .../etl_initialiser_list.vcxproj.filters | 22 + Chapter18/cib/libs/etl/test/vs2022/.gitignore | 7 + Chapter18/cib/libs/etl/test/vs2022/cpp.hint | 40 + Chapter18/cib/libs/etl/test/vs2022/etl.sln | 91 + .../cib/libs/etl/test/vs2022/etl.vcxproj | 9257 + .../libs/etl/test/vs2022/etl.vcxproj.filters | 3617 + .../etl_initialiser_list.vcxproj | 149 + .../etl_initialiser_list.vcxproj.filters | 22 + .../cib/libs/etl/test/vs2022/io_port.natvis | 62 + Chapter18/cib/libs/etl/test/words.txt | 291419 +++++++++++++++ Chapter18/cib/libs/etl/todo.txt | 7 + Chapter18/cib/libs/etl/uml/FSM example.png | 0 Chapter18/cib/libs/etl/uml/Framework.png | 0 .../cib/libs/etl/uml/MessageFramework.png | 0 .../cib/libs/etl/uml/source/FSM example.zargo | 0 .../etl/uml/source/Message Framework.zargo | 0 Chapter18/cib/libs/etl/version.txt | 1 + Chapter18/cib/libs/flow/builder.hpp | 27 + Chapter18/cib/libs/flow/common.hpp | 5 + Chapter18/cib/libs/flow/detail/par.hpp | 72 + Chapter18/cib/libs/flow/detail/seq.hpp | 86 + Chapter18/cib/libs/flow/detail/walk.hpp | 103 + Chapter18/cib/libs/flow/flow.hpp | 9 + Chapter18/cib/libs/flow/graph_builder.hpp | 296 + Chapter18/cib/libs/flow/graphviz_builder.hpp | 77 + Chapter18/cib/libs/flow/impl.hpp | 79 + Chapter18/cib/libs/flow/log.hpp | 36 + Chapter18/cib/libs/flow/run.hpp | 14 + Chapter18/cib/libs/flow/step.hpp | 95 + Chapter18/cib/libs/flow/subgraph_identity.hpp | 5 + Chapter18/cib/libs/fmt/args.h | 235 + Chapter18/cib/libs/fmt/chrono.h | 2240 + Chapter18/cib/libs/fmt/color.h | 643 + Chapter18/cib/libs/fmt/compile.h | 535 + Chapter18/cib/libs/fmt/core.h | 2969 + Chapter18/cib/libs/fmt/format-inl.h | 1678 + Chapter18/cib/libs/fmt/format.h | 4535 + Chapter18/cib/libs/fmt/os.h | 455 + Chapter18/cib/libs/fmt/ostream.h | 245 + Chapter18/cib/libs/fmt/printf.h | 675 + Chapter18/cib/libs/fmt/ranges.h | 738 + Chapter18/cib/libs/fmt/std.h | 537 + Chapter18/cib/libs/fmt/xchar.h | 259 + Chapter18/cib/libs/interrupt/concepts.hpp | 64 + Chapter18/cib/libs/interrupt/config.hpp | 133 + .../cib/libs/interrupt/dynamic_controller.hpp | 231 + Chapter18/cib/libs/interrupt/fwd.hpp | 18 + Chapter18/cib/libs/interrupt/hal.hpp | 67 + Chapter18/cib/libs/interrupt/impl.hpp | 107 + Chapter18/cib/libs/interrupt/manager.hpp | 57 + Chapter18/cib/libs/interrupt/policies.hpp | 80 + Chapter18/cib/libs/log/README.md | 95 + Chapter18/cib/libs/log/catalog/catalog.hpp | 19 + .../cib/libs/log/catalog/mipi_encoder.hpp | 224 + Chapter18/cib/libs/log/env.hpp | 116 + Chapter18/cib/libs/log/fmt/logger.hpp | 68 + Chapter18/cib/libs/log/level.hpp | 44 + Chapter18/cib/libs/log/log.hpp | 115 + Chapter18/cib/libs/log/module.hpp | 27 + Chapter18/cib/libs/sc/README.md | 179 + Chapter18/cib/libs/sc/format.hpp | 103 + Chapter18/cib/libs/sc/fwd.hpp | 46 + Chapter18/cib/libs/sc/lazy_string_format.hpp | 56 + Chapter18/cib/libs/sc/string_constant.hpp | 108 + Chapter18/cib/libs/stdx/algorithm.hpp | 74 + Chapter18/cib/libs/stdx/atomic.hpp | 128 + Chapter18/cib/libs/stdx/atomic_bitset.hpp | 244 + Chapter18/cib/libs/stdx/bit.hpp | 396 + Chapter18/cib/libs/stdx/bitset.hpp | 428 + Chapter18/cib/libs/stdx/byterator.hpp | 228 + Chapter18/cib/libs/stdx/cached.hpp | 86 + Chapter18/cib/libs/stdx/compiler.hpp | 68 + Chapter18/cib/libs/stdx/concepts.hpp | 228 + Chapter18/cib/libs/stdx/ct_conversions.hpp | 48 + Chapter18/cib/libs/stdx/ct_format.hpp | 237 + Chapter18/cib/libs/stdx/ct_string.hpp | 148 + Chapter18/cib/libs/stdx/cx_map.hpp | 143 + Chapter18/cib/libs/stdx/cx_multimap.hpp | 112 + Chapter18/cib/libs/stdx/cx_queue.hpp | 115 + Chapter18/cib/libs/stdx/cx_set.hpp | 118 + Chapter18/cib/libs/stdx/cx_vector.hpp | 189 + .../cib/libs/stdx/detail/bitset_common.hpp | 10 + .../cib/libs/stdx/detail/list_common.hpp | 123 + Chapter18/cib/libs/stdx/for_each_n_args.hpp | 64 + Chapter18/cib/libs/stdx/function_traits.hpp | 85 + Chapter18/cib/libs/stdx/functional.hpp | 174 + .../cib/libs/stdx/intrusive_forward_list.hpp | 141 + Chapter18/cib/libs/stdx/intrusive_list.hpp | 207 + Chapter18/cib/libs/stdx/iterator.hpp | 47 + Chapter18/cib/libs/stdx/memory.hpp | 33 + Chapter18/cib/libs/stdx/numeric.hpp | 71 + Chapter18/cib/libs/stdx/optional.hpp | 262 + Chapter18/cib/libs/stdx/panic.hpp | 46 + Chapter18/cib/libs/stdx/priority.hpp | 12 + Chapter18/cib/libs/stdx/ranges.hpp | 39 + Chapter18/cib/libs/stdx/rollover.hpp | 131 + Chapter18/cib/libs/stdx/span.hpp | 286 + Chapter18/cib/libs/stdx/static_assert.hpp | 48 + Chapter18/cib/libs/stdx/tuple.hpp | 509 + Chapter18/cib/libs/stdx/tuple_algorithms.hpp | 447 + Chapter18/cib/libs/stdx/tuple_destructure.hpp | 29 + Chapter18/cib/libs/stdx/type_traits.hpp | 231 + Chapter18/cib/libs/stdx/udls.hpp | 167 + Chapter18/cib/libs/stdx/utility.hpp | 248 + .../Device/ST/STM32F0xx/Include/stm32f030x6.h | 5368 + .../Device/ST/STM32F0xx/Include/stm32f030x8.h | 5435 + .../Device/ST/STM32F0xx/Include/stm32f030xc.h | 5814 + .../Device/ST/STM32F0xx/Include/stm32f031x6.h | 5694 + .../Device/ST/STM32F0xx/Include/stm32f038xx.h | 5659 + .../Device/ST/STM32F0xx/Include/stm32f042x6.h | 10677 + .../Device/ST/STM32F0xx/Include/stm32f048xx.h | 10641 + .../Device/ST/STM32F0xx/Include/stm32f051x8.h | 6776 + .../Device/ST/STM32F0xx/Include/stm32f058xx.h | 6741 + .../Device/ST/STM32F0xx/Include/stm32f070x6.h | 5620 + .../Device/ST/STM32F0xx/Include/stm32f070xb.h | 5806 + .../Device/ST/STM32F0xx/Include/stm32f071xb.h | 7374 + .../Device/ST/STM32F0xx/Include/stm32f072xb.h | 11307 + .../Device/ST/STM32F0xx/Include/stm32f078xx.h | 11277 + .../Device/ST/STM32F0xx/Include/stm32f091xc.h | 11858 + .../Device/ST/STM32F0xx/Include/stm32f098xx.h | 11825 + .../Device/ST/STM32F0xx/Include/stm32f0xx.h | 275 + .../ST/STM32F0xx/Include/system_stm32f0xx.h | 105 + .../CMSIS/Device/ST/STM32F0xx/License.md | 83 + .../cib/platform/CMSIS/Include/cmsis_armcc.h | 865 + .../platform/CMSIS/Include/cmsis_armclang.h | 1869 + .../platform/CMSIS/Include/cmsis_compiler.h | 266 + .../cib/platform/CMSIS/Include/cmsis_gcc.h | 2085 + .../cib/platform/CMSIS/Include/cmsis_iccarm.h | 935 + .../platform/CMSIS/Include/cmsis_version.h | 39 + .../platform/CMSIS/Include/core_armv8mbl.h | 1918 + .../platform/CMSIS/Include/core_armv8mml.h | 2927 + .../cib/platform/CMSIS/Include/core_cm0.h | 949 + .../cib/platform/CMSIS/Include/core_cm0plus.h | 1083 + .../cib/platform/CMSIS/Include/core_cm1.h | 976 + .../cib/platform/CMSIS/Include/core_cm23.h | 1993 + .../cib/platform/CMSIS/Include/core_cm3.h | 1941 + .../cib/platform/CMSIS/Include/core_cm33.h | 3002 + .../cib/platform/CMSIS/Include/core_cm4.h | 2129 + .../cib/platform/CMSIS/Include/core_cm7.h | 2671 + .../cib/platform/CMSIS/Include/core_sc000.h | 1022 + .../cib/platform/CMSIS/Include/core_sc300.h | 1915 + .../cib/platform/CMSIS/Include/mpu_armv7.h | 270 + .../cib/platform/CMSIS/Include/mpu_armv8.h | 333 + .../cib/platform/CMSIS/Include/tz_context.h | 70 + Chapter18/cib/platform/CMSIS/LICENSE.txt | 201 + Chapter18/cib/platform/STM32F072C8Tx_FLASH.ld | 189 + .../Inc/Legacy/stm32_hal_legacy.h | 3850 + .../Inc/Legacy/stm32f0xx_hal_can_legacy.h | 794 + .../Inc/stm32_assert_template.h | 57 + .../STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h | 585 + .../Inc/stm32f0xx_hal_adc.h | 1019 + .../Inc/stm32f0xx_hal_adc_ex.h | 299 + .../Inc/stm32f0xx_hal_can.h | 842 + .../Inc/stm32f0xx_hal_cec.h | 794 + .../Inc/stm32f0xx_hal_comp.h | 700 + .../Inc/stm32f0xx_hal_conf_template.h | 326 + .../Inc/stm32f0xx_hal_cortex.h | 133 + .../Inc/stm32f0xx_hal_crc.h | 359 + .../Inc/stm32f0xx_hal_crc_ex.h | 153 + .../Inc/stm32f0xx_hal_dac.h | 429 + .../Inc/stm32f0xx_hal_dac_ex.h | 292 + .../Inc/stm32f0xx_hal_def.h | 178 + .../Inc/stm32f0xx_hal_dma.h | 563 + .../Inc/stm32f0xx_hal_dma_ex.h | 811 + .../Inc/stm32f0xx_hal_exti.h | 375 + .../Inc/stm32f0xx_hal_flash.h | 353 + .../Inc/stm32f0xx_hal_flash_ex.h | 448 + .../Inc/stm32f0xx_hal_gpio.h | 322 + .../Inc/stm32f0xx_hal_gpio_ex.h | 800 + .../Inc/stm32f0xx_hal_i2c.h | 838 + .../Inc/stm32f0xx_hal_i2c_ex.h | 193 + .../Inc/stm32f0xx_hal_i2s.h | 546 + .../Inc/stm32f0xx_hal_irda.h | 856 + .../Inc/stm32f0xx_hal_irda_ex.h | 399 + .../Inc/stm32f0xx_hal_iwdg.h | 240 + .../Inc/stm32f0xx_hal_pcd.h | 1004 + .../Inc/stm32f0xx_hal_pcd_ex.h | 91 + .../Inc/stm32f0xx_hal_pwr.h | 189 + .../Inc/stm32f0xx_hal_pwr_ex.h | 459 + .../Inc/stm32f0xx_hal_rcc.h | 1686 + .../Inc/stm32f0xx_hal_rcc_ex.h | 2085 + .../Inc/stm32f0xx_hal_rtc.h | 854 + .../Inc/stm32f0xx_hal_rtc_ex.h | 1048 + .../Inc/stm32f0xx_hal_smartcard.h | 1058 + .../Inc/stm32f0xx_hal_smartcard_ex.h | 568 + .../Inc/stm32f0xx_hal_smbus.h | 789 + .../Inc/stm32f0xx_hal_spi.h | 852 + .../Inc/stm32f0xx_hal_spi_ex.h | 75 + .../Inc/stm32f0xx_hal_tim.h | 2131 + .../Inc/stm32f0xx_hal_tim_ex.h | 268 + .../Inc/stm32f0xx_hal_tsc.h | 800 + .../Inc/stm32f0xx_hal_uart.h | 1633 + .../Inc/stm32f0xx_hal_uart_ex.h | 592 + .../Inc/stm32f0xx_hal_usart.h | 795 + .../Inc/stm32f0xx_hal_usart_ex.h | 520 + .../Inc/stm32f0xx_hal_wwdg.h | 301 + .../Inc/stm32f0xx_ll_adc.h | 3411 + .../Inc/stm32f0xx_ll_bus.h | 845 + .../Inc/stm32f0xx_ll_comp.h | 831 + .../Inc/stm32f0xx_ll_cortex.h | 320 + .../Inc/stm32f0xx_ll_crc.h | 474 + .../Inc/stm32f0xx_ll_crs.h | 783 + .../Inc/stm32f0xx_ll_dac.h | 1422 + .../Inc/stm32f0xx_ll_dma.h | 2236 + .../Inc/stm32f0xx_ll_exti.h | 1016 + .../Inc/stm32f0xx_ll_gpio.h | 940 + .../Inc/stm32f0xx_ll_i2c.h | 2277 + .../Inc/stm32f0xx_ll_iwdg.h | 341 + .../Inc/stm32f0xx_ll_pwr.h | 552 + .../Inc/stm32f0xx_ll_rcc.h | 2261 + .../Inc/stm32f0xx_ll_rtc.h | 3169 + .../Inc/stm32f0xx_ll_spi.h | 2286 + .../Inc/stm32f0xx_ll_system.h | 1852 + .../Inc/stm32f0xx_ll_tim.h | 4015 + .../Inc/stm32f0xx_ll_usart.h | 3840 + .../Inc/stm32f0xx_ll_utils.h | 274 + .../Inc/stm32f0xx_ll_wwdg.h | 319 + .../platform/STM32F0xx_HAL_Driver/License.md | 3 + .../STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c | 514 + .../Src/stm32f0xx_hal_adc.c | 2497 + .../Src/stm32f0xx_hal_adc_ex.c | 192 + .../Src/stm32f0xx_hal_can.c | 2432 + .../Src/stm32f0xx_hal_cec.c | 997 + .../Src/stm32f0xx_hal_comp.c | 984 + .../Src/stm32f0xx_hal_cortex.c | 341 + .../Src/stm32f0xx_hal_crc.c | 520 + .../Src/stm32f0xx_hal_crc_ex.c | 227 + .../Src/stm32f0xx_hal_dac.c | 1090 + .../Src/stm32f0xx_hal_dac_ex.c | 1183 + .../Src/stm32f0xx_hal_dma.c | 901 + .../Src/stm32f0xx_hal_exti.c | 549 + .../Src/stm32f0xx_hal_flash.c | 694 + .../Src/stm32f0xx_hal_flash_ex.c | 984 + .../Src/stm32f0xx_hal_gpio.c | 540 + .../Src/stm32f0xx_hal_i2c.c | 6794 + .../Src/stm32f0xx_hal_i2c_ex.c | 365 + .../Src/stm32f0xx_hal_i2s.c | 1800 + .../Src/stm32f0xx_hal_irda.c | 2998 + .../Src/stm32f0xx_hal_iwdg.c | 285 + .../Src/stm32f0xx_hal_msp_template.c | 101 + .../Src/stm32f0xx_hal_pcd.c | 2184 + .../Src/stm32f0xx_hal_pcd_ex.c | 336 + .../Src/stm32f0xx_hal_pwr.c | 454 + .../Src/stm32f0xx_hal_pwr_ex.c | 274 + .../Src/stm32f0xx_hal_rcc.c | 1365 + .../Src/stm32f0xx_hal_rcc_ex.c | 964 + .../Src/stm32f0xx_hal_rtc.c | 1733 + .../Src/stm32f0xx_hal_rtc_ex.c | 1600 + .../Src/stm32f0xx_hal_smartcard.c | 2933 + .../Src/stm32f0xx_hal_smartcard_ex.c | 198 + .../Src/stm32f0xx_hal_smbus.c | 2750 + .../Src/stm32f0xx_hal_spi.c | 4404 + .../Src/stm32f0xx_hal_spi_ex.c | 115 + .../Src/stm32f0xx_hal_tim.c | 7635 + .../Src/stm32f0xx_hal_tim_ex.c | 2390 + ...tm32f0xx_hal_timebase_rtc_alarm_template.c | 318 + ...m32f0xx_hal_timebase_rtc_wakeup_template.c | 295 + .../Src/stm32f0xx_hal_timebase_tim_template.c | 179 + .../Src/stm32f0xx_hal_tsc.c | 1080 + .../Src/stm32f0xx_hal_uart.c | 4128 + .../Src/stm32f0xx_hal_uart_ex.c | 816 + .../Src/stm32f0xx_hal_usart.c | 3265 + .../Src/stm32f0xx_hal_usart_ex.c | 138 + .../Src/stm32f0xx_hal_wwdg.c | 422 + .../Src/stm32f0xx_ll_adc.c | 562 + .../Src/stm32f0xx_ll_comp.c | 316 + .../Src/stm32f0xx_ll_crc.c | 122 + .../Src/stm32f0xx_ll_crs.c | 87 + .../Src/stm32f0xx_ll_dac.c | 276 + .../Src/stm32f0xx_ll_dma.c | 397 + .../Src/stm32f0xx_ll_exti.c | 223 + .../Src/stm32f0xx_ll_gpio.c | 277 + .../Src/stm32f0xx_ll_i2c.c | 229 + .../Src/stm32f0xx_ll_pwr.c | 86 + .../Src/stm32f0xx_ll_rcc.c | 609 + .../Src/stm32f0xx_ll_rtc.c | 714 + .../Src/stm32f0xx_ll_spi.c | 537 + .../Src/stm32f0xx_ll_tim.c | 1170 + .../Src/stm32f0xx_ll_usart.c | 504 + .../Src/stm32f0xx_ll_utils.c | 622 + .../cib/platform/inc/stm32f0xx_hal_conf.h | 322 + Chapter18/cib/platform/inc/stm32f0xx_it.h | 74 + .../cib/platform/src/stm32f0xx_hal_msp.c | 89 + Chapter18/cib/platform/src/stm32f0xx_it.c | 133 + Chapter18/cib/platform/src/system_stm32f0xx.c | 305 + Chapter18/cib/platform/startup_stm32f072xb.s | 294 + Chapter18/cib/renode_scripts/stm32f0.repl | 222 + Chapter18/cib/renode_scripts/stm32f072.repl | 10 + Chapter18/cib/renode_scripts/stm32f072.resc | 23 + .../cib/renode_scripts/stm32f072_debug.resc | 23 + Chapter18/cib/util/inc/signal.hpp | 102 + Chapter18/cib/util/inc/units.hpp | 33 + Chapter18/cib/util/src/units.cpp | 11 + 1533 files changed, 1092521 insertions(+) create mode 100644 Chapter18/cib/.clang-format create mode 100644 Chapter18/cib/.clang-tidy create mode 100644 Chapter18/cib/CMakeLists.txt create mode 100644 Chapter18/cib/app/src/main.cpp create mode 100644 Chapter18/cib/cstdlib_support/retarget.cpp create mode 100644 Chapter18/cib/cstdlib_support/retarget.hpp create mode 100644 Chapter18/cib/hal/adc/inc/adc.hpp create mode 100644 Chapter18/cib/hal/adc/inc/adc_stm32.hpp create mode 100644 Chapter18/cib/hal/adc/src/adc_stm32.cpp create mode 100644 Chapter18/cib/hal/gpio/inc/gpio.hpp create mode 100644 Chapter18/cib/hal/gpio/inc/gpio_interrupt_manager.hpp create mode 100644 Chapter18/cib/hal/gpio/inc/gpio_stm32.hpp create mode 100644 Chapter18/cib/hal/gpio/src/gpio.cpp create mode 100644 Chapter18/cib/hal/gpio/src/gpio_interrupt_manager.cpp create mode 100644 Chapter18/cib/hal/inc/hal.hpp create mode 100644 Chapter18/cib/hal/uart/inc/stm32f0xx_hal_uart.hpp create mode 100644 Chapter18/cib/hal/uart/inc/uart.hpp create mode 100644 Chapter18/cib/hal/uart/inc/uart_stm32.hpp create mode 100644 Chapter18/cib/hal/uart/src/uart_stm32.cpp create mode 100644 Chapter18/cib/libs/boost/mp11.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/algorithm.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/bind.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/config.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_append.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_copy_if.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_count.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_defer.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_fold.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_front.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_is_list.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_is_value_list.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_list.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_list_v.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_map_find.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_min_element.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_plus.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_remove_if.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_rename.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_value.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_void.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mp_with_index.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/detail/mpl_common.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/function.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/integer_sequence.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/integral.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/list.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/map.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/mpl.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/mpl_list.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/mpl_tuple.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/set.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/tuple.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/utility.hpp create mode 100644 Chapter18/cib/libs/boost/mp11/version.hpp create mode 100644 Chapter18/cib/libs/boost/sml.hpp create mode 100644 Chapter18/cib/libs/cib/builder_meta.hpp create mode 100644 Chapter18/cib/libs/cib/built.hpp create mode 100644 Chapter18/cib/libs/cib/callback.hpp create mode 100644 Chapter18/cib/libs/cib/cib.hpp create mode 100644 Chapter18/cib/libs/cib/config.hpp create mode 100644 Chapter18/cib/libs/cib/detail/components.hpp create mode 100644 Chapter18/cib/libs/cib/detail/config_details.hpp create mode 100644 Chapter18/cib/libs/cib/detail/config_item.hpp create mode 100644 Chapter18/cib/libs/cib/detail/constexpr_conditional.hpp create mode 100644 Chapter18/cib/libs/cib/detail/exports.hpp create mode 100644 Chapter18/cib/libs/cib/detail/extend.hpp create mode 100644 Chapter18/cib/libs/cib/detail/nexus_details.hpp create mode 100644 Chapter18/cib/libs/cib/detail/runtime_conditional.hpp create mode 100644 Chapter18/cib/libs/cib/func_decl.hpp create mode 100644 Chapter18/cib/libs/cib/nexus.hpp create mode 100644 Chapter18/cib/libs/cib/top.hpp create mode 100644 Chapter18/cib/libs/conc/atomic.hpp create mode 100644 Chapter18/cib/libs/conc/concepts.hpp create mode 100644 Chapter18/cib/libs/conc/concurrency.hpp create mode 100644 Chapter18/cib/libs/etl/.clang-format create mode 100644 Chapter18/cib/libs/etl/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/Doxyfile create mode 100644 Chapter18/cib/libs/etl/LICENSE create mode 100644 Chapter18/cib/libs/etl/README.md create mode 100644 Chapter18/cib/libs/etl/appveyor.yml create mode 100644 Chapter18/cib/libs/etl/arduino/Embedded_Template_Library.h create mode 100644 Chapter18/cib/libs/etl/arduino/examples/Example_0_import_etl/Example_0_import_etl.ino create mode 100644 Chapter18/cib/libs/etl/arduino/examples/Vector_Examples/Example_Vector_1_simple_use/Example_Vector_1_simple_use.ino create mode 100644 Chapter18/cib/libs/etl/arduino/library-arduino.json create mode 100644 Chapter18/cib/libs/etl/arduino/library-arduino.properties create mode 100644 Chapter18/cib/libs/etl/cmake/GetGitRevisionDescription.cmake create mode 100644 Chapter18/cib/libs/etl/cmake/GetGitRevisionDescription.cmake.in create mode 100644 Chapter18/cib/libs/etl/cmake/etlConfig.cmake.in create mode 100644 Chapter18/cib/libs/etl/cmake/helpers.cmake create mode 100644 Chapter18/cib/libs/etl/examples/ArmTimerCallbacks - C++/.gitignore create mode 100644 Chapter18/cib/libs/etl/examples/ArmTimerCallbacks - C++/ArmTimerCallbacks.uvprojx create mode 100644 Chapter18/cib/libs/etl/examples/ArmTimerCallbacks - C++/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/examples/ArmTimerCallbacks - C++/main.cpp create mode 100644 Chapter18/cib/libs/etl/examples/Blink/Blink1/__vm/.gitignore create mode 100644 Chapter18/cib/libs/etl/examples/BlinkList/BlinkList.ino create mode 100644 Chapter18/cib/libs/etl/examples/BlinkList/VisualMicro/BlinkList.sln create mode 100644 Chapter18/cib/libs/etl/examples/BlinkList/VisualMicro/BlinkList.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/BlinkList/VisualMicro/BlinkList.vcxproj.filters create mode 100644 Chapter18/cib/libs/etl/examples/BlinkList/VisualMicro/__vm/.gitignore create mode 100644 Chapter18/cib/libs/etl/examples/BlinkList/__vm/.gitignore create mode 100644 Chapter18/cib/libs/etl/examples/Debounce/Debounce.ino create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/FunctionInterruptSimulation.cpp create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/vs2017/.vs/FunctionInterruptSimulation-Delegates/v15/.gitignore create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/vs2017/.vs/FunctionInterruptSimulation/v15/.gitignore create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/vs2017/FunctionInterruptSimulation-Delegates.sln create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/vs2017/FunctionInterruptSimulation-Delegates.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.sln create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation-Delegates/vs2019/FunctionInterruptSimulation-Delegates.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation/FunctionInterruptSimulation.cpp create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation/vs2017/FunctionInterruptSimulation.sln create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation/vs2017/FunctionInterruptSimulation.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/FunctionInterruptSimulation/vs2017/FunctionInterruptSimulation.vcxproj.filters create mode 100644 Chapter18/cib/libs/etl/examples/MutexMessageRouter/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/examples/MutexMessageRouter/MutexMessageRouter.cpp create mode 100644 Chapter18/cib/libs/etl/examples/MutexMessageRouter/MutexMessageRouter.sln create mode 100644 Chapter18/cib/libs/etl/examples/MutexMessageRouter/MutexMessageRouter.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/QueuedFSM/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/examples/QueuedFSM/QueuedFSM.cpp create mode 100644 Chapter18/cib/libs/etl/examples/QueuedFSM/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/examples/QueuedFSM/vs2019/QueuedFSM.sln create mode 100644 Chapter18/cib/libs/etl/examples/QueuedFSM/vs2019/QueuedFSM.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/QueuedFSM/vs2019/QueuedFSM.vcxproj.filters create mode 100644 Chapter18/cib/libs/etl/examples/QueuedMessageRouter/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/examples/QueuedMessageRouter/QueuedMessageRouter.cpp create mode 100644 Chapter18/cib/libs/etl/examples/QueuedMessageRouter/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/examples/QueuedMessageRouter/vs2019/QueuedMessageRouter.sln create mode 100644 Chapter18/cib/libs/etl/examples/QueuedMessageRouter/vs2019/QueuedMessageRouter.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/Scheduler/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/examples/Scheduler/Scheduler.cpp create mode 100644 Chapter18/cib/libs/etl/examples/Scheduler/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/examples/Scheduler/vs2017/Scheduler.sln create mode 100644 Chapter18/cib/libs/etl/examples/Scheduler/vs2017/Scheduler.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/Scheduler/vs2019/Scheduler.sln create mode 100644 Chapter18/cib/libs/etl/examples/Scheduler/vs2019/Scheduler.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/SharedMessage/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/examples/SharedMessage/SharedMessage.cpp create mode 100644 Chapter18/cib/libs/etl/examples/SharedMessage/SharedMessage.sln create mode 100644 Chapter18/cib/libs/etl/examples/SharedMessage/SharedMessage.vcxproj create mode 100644 Chapter18/cib/libs/etl/examples/SharedMessage/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/examples/platformio/.gitignore create mode 100644 Chapter18/cib/libs/etl/examples/platformio/README.md create mode 100644 Chapter18/cib/libs/etl/examples/platformio/include/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/examples/platformio/platformio.ini create mode 100644 Chapter18/cib/libs/etl/examples/platformio/src/main.cpp create mode 100644 Chapter18/cib/libs/etl/images/ArcticCodeVault.png create mode 100644 Chapter18/cib/libs/etl/images/ArcticCodeVaultTransparent.png create mode 100644 Chapter18/cib/libs/etl/images/Coverty Shields.txt create mode 100644 Chapter18/cib/libs/etl/images/etl-round.png create mode 100644 Chapter18/cib/libs/etl/images/etl.ico create mode 100644 Chapter18/cib/libs/etl/images/etl.png create mode 100644 Chapter18/cib/libs/etl/images/etl.xar create mode 100644 Chapter18/cib/libs/etl/images/etl16.png create mode 100644 Chapter18/cib/libs/etl/images/etl32.png create mode 100644 Chapter18/cib/libs/etl/images/etl48.png create mode 100644 Chapter18/cib/libs/etl/images/etl64.png create mode 100644 Chapter18/cib/libs/etl/images/favicon-32.png create mode 100644 Chapter18/cib/libs/etl/images/favicon-64.png create mode 100644 Chapter18/cib/libs/etl/images/favicon.ico create mode 100644 Chapter18/cib/libs/etl/include/etl/absolute.h create mode 100644 Chapter18/cib/libs/etl/include/etl/algorithm.h create mode 100644 Chapter18/cib/libs/etl/include/etl/alignment.h create mode 100644 Chapter18/cib/libs/etl/include/etl/array.h create mode 100644 Chapter18/cib/libs/etl/include/etl/array_view.h create mode 100644 Chapter18/cib/libs/etl/include/etl/array_wrapper.h create mode 100644 Chapter18/cib/libs/etl/include/etl/atomic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/atomic/atomic_arm.h create mode 100644 Chapter18/cib/libs/etl/include/etl/atomic/atomic_clang_sync.h create mode 100644 Chapter18/cib/libs/etl/include/etl/atomic/atomic_gcc_sync.h create mode 100644 Chapter18/cib/libs/etl/include/etl/atomic/atomic_std.h create mode 100644 Chapter18/cib/libs/etl/include/etl/base64.h create mode 100644 Chapter18/cib/libs/etl/include/etl/base64_decoder.h create mode 100644 Chapter18/cib/libs/etl/include/etl/base64_encoder.h create mode 100644 Chapter18/cib/libs/etl/include/etl/basic_format_spec.h create mode 100644 Chapter18/cib/libs/etl/include/etl/basic_string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/basic_string_stream.h create mode 100644 Chapter18/cib/libs/etl/include/etl/binary.h create mode 100644 Chapter18/cib/libs/etl/include/etl/bip_buffer_spsc_atomic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/bit.h create mode 100644 Chapter18/cib/libs/etl/include/etl/bit_stream.h create mode 100644 Chapter18/cib/libs/etl/include/etl/bitset.h create mode 100644 Chapter18/cib/libs/etl/include/etl/bloom_filter.h create mode 100644 Chapter18/cib/libs/etl/include/etl/bresenham_line.h create mode 100644 Chapter18/cib/libs/etl/include/etl/buffer_descriptors.h create mode 100644 Chapter18/cib/libs/etl/include/etl/byte.h create mode 100644 Chapter18/cib/libs/etl/include/etl/byte_stream.h create mode 100644 Chapter18/cib/libs/etl/include/etl/callback.h create mode 100644 Chapter18/cib/libs/etl/include/etl/callback_service.h create mode 100644 Chapter18/cib/libs/etl/include/etl/callback_timer.h create mode 100644 Chapter18/cib/libs/etl/include/etl/callback_timer_atomic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/callback_timer_interrupt.h create mode 100644 Chapter18/cib/libs/etl/include/etl/callback_timer_locked.h create mode 100644 Chapter18/cib/libs/etl/include/etl/char_traits.h create mode 100644 Chapter18/cib/libs/etl/include/etl/checksum.h create mode 100644 Chapter18/cib/libs/etl/include/etl/circular_buffer.h create mode 100644 Chapter18/cib/libs/etl/include/etl/circular_iterator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/combinations.h create mode 100644 Chapter18/cib/libs/etl/include/etl/compare.h create mode 100644 Chapter18/cib/libs/etl/include/etl/constant.h create mode 100644 Chapter18/cib/libs/etl/include/etl/container.h create mode 100644 Chapter18/cib/libs/etl/include/etl/correlation.h create mode 100644 Chapter18/cib/libs/etl/include/etl/covariance.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc1.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_a.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_arc.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_aug_ccitt.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_buypass.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_ccitt.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_cdma2000.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_dds110.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_dectr.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_dectx.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_dnp.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_en13757.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_genibus.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_kermit.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_m17.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_maxim.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_mcrf4xx.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_modbus.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_profibus.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_riello.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_t10dif.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_teledisk.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_tms37157.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_usb.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_x25.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc16_xmodem.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32_bzip2.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32_c.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32_d.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32_jamcrc.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32_mpeg2.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32_posix.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32_q.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc32_xfer.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc64_ecma.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_ccitt.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_cdma2000.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_darc.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_dvbs2.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_ebu.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_icode.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_itu.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_j1850.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_j1850_zero.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_maxim.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_rohc.h create mode 100644 Chapter18/cib/libs/etl/include/etl/crc8_wcdma.h create mode 100644 Chapter18/cib/libs/etl/include/etl/cstring.h create mode 100644 Chapter18/cib/libs/etl/include/etl/cyclic_value.h create mode 100644 Chapter18/cib/libs/etl/include/etl/debounce.h create mode 100644 Chapter18/cib/libs/etl/include/etl/debug_count.h create mode 100644 Chapter18/cib/libs/etl/include/etl/delegate.h create mode 100644 Chapter18/cib/libs/etl/include/etl/delegate_observer.h create mode 100644 Chapter18/cib/libs/etl/include/etl/delegate_service.h create mode 100644 Chapter18/cib/libs/etl/include/etl/deprecated/factory.h create mode 100644 Chapter18/cib/libs/etl/include/etl/deque.h create mode 100644 Chapter18/cib/libs/etl/include/etl/doxygen.h create mode 100644 Chapter18/cib/libs/etl/include/etl/endianness.h create mode 100644 Chapter18/cib/libs/etl/include/etl/enum_type.h create mode 100644 Chapter18/cib/libs/etl/include/etl/error_handler.h create mode 100644 Chapter18/cib/libs/etl/include/etl/exception.h create mode 100644 Chapter18/cib/libs/etl/include/etl/expected.h create mode 100644 Chapter18/cib/libs/etl/include/etl/experimental/bit_cast.h create mode 100644 Chapter18/cib/libs/etl/include/etl/experimental/class_traits.h create mode 100644 Chapter18/cib/libs/etl/include/etl/experimental/icache.h create mode 100644 Chapter18/cib/libs/etl/include/etl/experimental/mem_cast.h create mode 100644 Chapter18/cib/libs/etl/include/etl/experimental/mid_point flt (typo abs(a) should be abs(b).png create mode 100644 Chapter18/cib/libs/etl/include/etl/experimental/mid_point ptr.png create mode 100644 Chapter18/cib/libs/etl/include/etl/experimental/mid_point.png create mode 100644 Chapter18/cib/libs/etl/include/etl/experimental/singleton.h create mode 100644 Chapter18/cib/libs/etl/include/etl/factorial.h create mode 100644 Chapter18/cib/libs/etl/include/etl/fibonacci.h create mode 100644 Chapter18/cib/libs/etl/include/etl/file_error_numbers.h create mode 100644 Chapter18/cib/libs/etl/include/etl/fixed_iterator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/fixed_sized_memory_block_allocator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/flags.h create mode 100644 Chapter18/cib/libs/etl/include/etl/flat_map.h create mode 100644 Chapter18/cib/libs/etl/include/etl/flat_multimap.h create mode 100644 Chapter18/cib/libs/etl/include/etl/flat_multiset.h create mode 100644 Chapter18/cib/libs/etl/include/etl/flat_set.h create mode 100644 Chapter18/cib/libs/etl/include/etl/fnv_1.h create mode 100644 Chapter18/cib/libs/etl/include/etl/format_spec.h create mode 100644 Chapter18/cib/libs/etl/include/etl/forward_list.h create mode 100644 Chapter18/cib/libs/etl/include/etl/frame_check_sequence.h create mode 100644 Chapter18/cib/libs/etl/include/etl/fsm.h create mode 100644 Chapter18/cib/libs/etl/include/etl/function.h create mode 100644 Chapter18/cib/libs/etl/include/etl/functional.h create mode 100644 Chapter18/cib/libs/etl/include/etl/gamma.h create mode 100644 Chapter18/cib/libs/etl/include/etl/gcd.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/fsm_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_fsm.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_largest.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_message_packet.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_message_router.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_smallest.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_type_lookup.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_type_select.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_type_traits.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/generate_variant_pool.bat create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/largest_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/message_packet_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/message_router_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/smallest_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/type_lookup_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/type_select_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/type_traits_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generators/variant_pool_generator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/generic_pool.h create mode 100644 Chapter18/cib/libs/etl/include/etl/hash.h create mode 100644 Chapter18/cib/libs/etl/include/etl/hfsm.h create mode 100644 Chapter18/cib/libs/etl/include/etl/histogram.h create mode 100644 Chapter18/cib/libs/etl/include/etl/ihash.h create mode 100644 Chapter18/cib/libs/etl/include/etl/imemory_block_allocator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/indirect_vector.h create mode 100644 Chapter18/cib/libs/etl/include/etl/initializer_list.h create mode 100644 Chapter18/cib/libs/etl/include/etl/instance_count.h create mode 100644 Chapter18/cib/libs/etl/include/etl/integral_limits.h create mode 100644 Chapter18/cib/libs/etl/include/etl/intrusive_forward_list.h create mode 100644 Chapter18/cib/libs/etl/include/etl/intrusive_links.h create mode 100644 Chapter18/cib/libs/etl/include/etl/intrusive_list.h create mode 100644 Chapter18/cib/libs/etl/include/etl/intrusive_queue.h create mode 100644 Chapter18/cib/libs/etl/include/etl/intrusive_stack.h create mode 100644 Chapter18/cib/libs/etl/include/etl/invert.h create mode 100644 Chapter18/cib/libs/etl/include/etl/io_port.h create mode 100644 Chapter18/cib/libs/etl/include/etl/ipool.h create mode 100644 Chapter18/cib/libs/etl/include/etl/ireference_counted_message_pool.h create mode 100644 Chapter18/cib/libs/etl/include/etl/iterator.h create mode 100644 Chapter18/cib/libs/etl/include/etl/jenkins.h create mode 100644 Chapter18/cib/libs/etl/include/etl/largest.h create mode 100644 Chapter18/cib/libs/etl/include/etl/lcm.h create mode 100644 Chapter18/cib/libs/etl/include/etl/limiter.h create mode 100644 Chapter18/cib/libs/etl/include/etl/limits.h create mode 100644 Chapter18/cib/libs/etl/include/etl/list.h create mode 100644 Chapter18/cib/libs/etl/include/etl/log.h create mode 100644 Chapter18/cib/libs/etl/include/etl/macros.h create mode 100644 Chapter18/cib/libs/etl/include/etl/map.h create mode 100644 Chapter18/cib/libs/etl/include/etl/math.h create mode 100644 Chapter18/cib/libs/etl/include/etl/math_constants.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mean.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mem_cast.h create mode 100644 Chapter18/cib/libs/etl/include/etl/memory.h create mode 100644 Chapter18/cib/libs/etl/include/etl/memory_model.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_broker.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_bus.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_packet.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_router.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_router_registry.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_timer.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_timer_atomic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_timer_interrupt.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_timer_locked.h create mode 100644 Chapter18/cib/libs/etl/include/etl/message_types.h create mode 100644 Chapter18/cib/libs/etl/include/etl/multi_array.h create mode 100644 Chapter18/cib/libs/etl/include/etl/multi_range.h create mode 100644 Chapter18/cib/libs/etl/include/etl/multi_span.h create mode 100644 Chapter18/cib/libs/etl/include/etl/multi_vector.h create mode 100644 Chapter18/cib/libs/etl/include/etl/multimap.h create mode 100644 Chapter18/cib/libs/etl/include/etl/multiset.h create mode 100644 Chapter18/cib/libs/etl/include/etl/murmur3.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mutex.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mutex/mutex_arm.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mutex/mutex_clang_sync.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mutex/mutex_cmsis_os2.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mutex/mutex_freertos.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mutex/mutex_gcc_sync.h create mode 100644 Chapter18/cib/libs/etl/include/etl/mutex/mutex_std.h create mode 100644 Chapter18/cib/libs/etl/include/etl/negative.h create mode 100644 Chapter18/cib/libs/etl/include/etl/nth_type.h create mode 100644 Chapter18/cib/libs/etl/include/etl/null_type.h create mode 100644 Chapter18/cib/libs/etl/include/etl/nullptr.h create mode 100644 Chapter18/cib/libs/etl/include/etl/numeric.h create mode 100644 Chapter18/cib/libs/etl/include/etl/observer.h create mode 100644 Chapter18/cib/libs/etl/include/etl/optional.h create mode 100644 Chapter18/cib/libs/etl/include/etl/overload.h create mode 100644 Chapter18/cib/libs/etl/include/etl/packet.h create mode 100644 Chapter18/cib/libs/etl/include/etl/parameter_pack.h create mode 100644 Chapter18/cib/libs/etl/include/etl/parameter_type.h create mode 100644 Chapter18/cib/libs/etl/include/etl/pearson.h create mode 100644 Chapter18/cib/libs/etl/include/etl/permutations.h create mode 100644 Chapter18/cib/libs/etl/include/etl/placement_new.h create mode 100644 Chapter18/cib/libs/etl/include/etl/platform.h create mode 100644 Chapter18/cib/libs/etl/include/etl/poly_span.h create mode 100644 Chapter18/cib/libs/etl/include/etl/pool.h create mode 100644 Chapter18/cib/libs/etl/include/etl/power.h create mode 100644 Chapter18/cib/libs/etl/include/etl/priority_queue.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/addressof.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/bitset_legacy.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/bitset_new.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/choose_namespace.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/comparator_is_transparent.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/crc_implementation.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/crc_parameters.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/delegate_cpp03.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/delegate_cpp11.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_array_bounds_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_cxx_20_compat_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_deprecated_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_float_equal_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_null_dereference_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_pessimizing_move_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_pop.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_self_assign_overloaded_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_stringop_overread_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_uninitialized_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_unused_function_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/diagnostic_useless_cast_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/dynamic_extent.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/ivectorpointer.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/minmax_pop.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/minmax_push.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/pvoidvector.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/to_string_helper.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/variant_legacy.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/variant_variadic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/private/vector_base.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/arduino_arm.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/armv5.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/armv5_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/armv6.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/armv6_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/armv7.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/armv7_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/auto.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/clang_generic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/clang_generic_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/cpp03.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/cpp03_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/cpp11.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/cpp11_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/cpp14.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/cpp14_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/cpp17.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/cpp17_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/determine_builtin_support.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/determine_compiler.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/determine_compiler_language_support.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/determine_compiler_version.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/determine_development_os.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/gcc_generic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/gcc_generic_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/gcc_linux_x86.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/gcc_linux_x86_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/gcc_windows_x86.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/gcc_windows_x86_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/msvc_x86.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/msvc_x86_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/segger_gcc_stlport.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/ticc.h create mode 100644 Chapter18/cib/libs/etl/include/etl/profiles/ticc_no_stl.h create mode 100644 Chapter18/cib/libs/etl/include/etl/pseudo_moving_average.h create mode 100644 Chapter18/cib/libs/etl/include/etl/quantize.h create mode 100644 Chapter18/cib/libs/etl/include/etl/queue.h create mode 100644 Chapter18/cib/libs/etl/include/etl/queue_lockable.h create mode 100644 Chapter18/cib/libs/etl/include/etl/queue_mpmc_mutex.h create mode 100644 Chapter18/cib/libs/etl/include/etl/queue_spsc_atomic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/queue_spsc_isr.h create mode 100644 Chapter18/cib/libs/etl/include/etl/queue_spsc_locked.h create mode 100644 Chapter18/cib/libs/etl/include/etl/radix.h create mode 100644 Chapter18/cib/libs/etl/include/etl/random.h create mode 100644 Chapter18/cib/libs/etl/include/etl/ratio.h create mode 100644 Chapter18/cib/libs/etl/include/etl/reference_counted_message.h create mode 100644 Chapter18/cib/libs/etl/include/etl/reference_counted_message_pool.h create mode 100644 Chapter18/cib/libs/etl/include/etl/reference_counted_object.h create mode 100644 Chapter18/cib/libs/etl/include/etl/reference_flat_map.h create mode 100644 Chapter18/cib/libs/etl/include/etl/reference_flat_multimap.h create mode 100644 Chapter18/cib/libs/etl/include/etl/reference_flat_multiset.h create mode 100644 Chapter18/cib/libs/etl/include/etl/reference_flat_set.h create mode 100644 Chapter18/cib/libs/etl/include/etl/rescale.h create mode 100644 Chapter18/cib/libs/etl/include/etl/result.h create mode 100644 Chapter18/cib/libs/etl/include/etl/rms.h create mode 100644 Chapter18/cib/libs/etl/include/etl/scaled_rounding.h create mode 100644 Chapter18/cib/libs/etl/include/etl/scheduler.h create mode 100644 Chapter18/cib/libs/etl/include/etl/set.h create mode 100644 Chapter18/cib/libs/etl/include/etl/shared_message.h create mode 100644 Chapter18/cib/libs/etl/include/etl/singleton.h create mode 100644 Chapter18/cib/libs/etl/include/etl/smallest.h create mode 100644 Chapter18/cib/libs/etl/include/etl/span.h create mode 100644 Chapter18/cib/libs/etl/include/etl/sqrt.h create mode 100644 Chapter18/cib/libs/etl/include/etl/stack.h create mode 100644 Chapter18/cib/libs/etl/include/etl/standard_deviation.h create mode 100644 Chapter18/cib/libs/etl/include/etl/state_chart.h create mode 100644 Chapter18/cib/libs/etl/include/etl/static_assert.h create mode 100644 Chapter18/cib/libs/etl/include/etl/string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/string_stream.h create mode 100644 Chapter18/cib/libs/etl/include/etl/string_utilities.h create mode 100644 Chapter18/cib/libs/etl/include/etl/string_view.h create mode 100644 Chapter18/cib/libs/etl/include/etl/stringify.h create mode 100644 Chapter18/cib/libs/etl/include/etl/successor.h create mode 100644 Chapter18/cib/libs/etl/include/etl/task.h create mode 100644 Chapter18/cib/libs/etl/include/etl/threshold.h create mode 100644 Chapter18/cib/libs/etl/include/etl/timer.h create mode 100644 Chapter18/cib/libs/etl/include/etl/to_arithmetic.h create mode 100644 Chapter18/cib/libs/etl/include/etl/to_string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/to_u16string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/to_u32string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/to_u8string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/to_wstring.h create mode 100644 Chapter18/cib/libs/etl/include/etl/type_def.h create mode 100644 Chapter18/cib/libs/etl/include/etl/type_lookup.h create mode 100644 Chapter18/cib/libs/etl/include/etl/type_select.h create mode 100644 Chapter18/cib/libs/etl/include/etl/type_traits.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u16format_spec.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u16string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u16string_stream.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u32format_spec.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u32string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u32string_stream.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u8format_spec.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u8string.h create mode 100644 Chapter18/cib/libs/etl/include/etl/u8string_stream.h create mode 100644 Chapter18/cib/libs/etl/include/etl/unaligned_type.h create mode 100644 Chapter18/cib/libs/etl/include/etl/unordered_map.h create mode 100644 Chapter18/cib/libs/etl/include/etl/unordered_multimap.h create mode 100644 Chapter18/cib/libs/etl/include/etl/unordered_multiset.h create mode 100644 Chapter18/cib/libs/etl/include/etl/unordered_set.h create mode 100644 Chapter18/cib/libs/etl/include/etl/user_type.h create mode 100644 Chapter18/cib/libs/etl/include/etl/utility.h create mode 100644 Chapter18/cib/libs/etl/include/etl/variance.h create mode 100644 Chapter18/cib/libs/etl/include/etl/variant.h create mode 100644 Chapter18/cib/libs/etl/include/etl/variant_pool.h create mode 100644 Chapter18/cib/libs/etl/include/etl/vector.h create mode 100644 Chapter18/cib/libs/etl/include/etl/version.h create mode 100644 Chapter18/cib/libs/etl/include/etl/visitor.h create mode 100644 Chapter18/cib/libs/etl/include/etl/wformat_spec.h create mode 100644 Chapter18/cib/libs/etl/include/etl/wstring.h create mode 100644 Chapter18/cib/libs/etl/include/etl/wstring_stream.h create mode 100644 Chapter18/cib/libs/etl/library.json create mode 100644 Chapter18/cib/libs/etl/library.properties create mode 100644 Chapter18/cib/libs/etl/meson.build create mode 100644 Chapter18/cib/libs/etl/meson_options.txt create mode 100644 Chapter18/cib/libs/etl/scripts/generator_test.bat create mode 100644 Chapter18/cib/libs/etl/scripts/generator_test.py create mode 100644 Chapter18/cib/libs/etl/scripts/update_release.bat create mode 100644 Chapter18/cib/libs/etl/scripts/update_release.py create mode 100644 Chapter18/cib/libs/etl/scripts/update_version.bat create mode 100644 Chapter18/cib/libs/etl/scripts/update_version.py create mode 100644 Chapter18/cib/libs/etl/subprojects/unittest-cpp.wrap create mode 100644 Chapter18/cib/libs/etl/support/Class diagrams.docx create mode 100644 Chapter18/cib/libs/etl/support/Flat map class diagram.odg create mode 100644 Chapter18/cib/libs/etl/support/Flat_map_class_diagram.doc create mode 100644 Chapter18/cib/libs/etl/support/List class diagram.odg create mode 100644 Chapter18/cib/libs/etl/support/List_class_diagram.doc create mode 100644 Chapter18/cib/libs/etl/support/Release notes.txt create mode 100644 Chapter18/cib/libs/etl/support/hfsm.docx create mode 100644 Chapter18/cib/libs/etl/support/hfsm.png create mode 100644 Chapter18/cib/libs/etl/test/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/Deprecated/test_embedded_compile.cpp create mode 100644 Chapter18/cib/libs/etl/test/Deprecated/test_factory.cpp create mode 100644 Chapter18/cib/libs/etl/test/Performance/unordered_map/unordered_map.sln create mode 100644 Chapter18/cib/libs/etl/test/Performance/unordered_map/unordered_map/ReadMe.txt create mode 100644 Chapter18/cib/libs/etl/test/Performance/unordered_map/unordered_map/stdafx.cpp create mode 100644 Chapter18/cib/libs/etl/test/Performance/unordered_map/unordered_map/stdafx.h create mode 100644 Chapter18/cib/libs/etl/test/Performance/unordered_map/unordered_map/targetver.h create mode 100644 Chapter18/cib/libs/etl/test/Performance/unordered_map/unordered_map/unordered_map.cpp create mode 100644 Chapter18/cib/libs/etl/test/Performance/unordered_map/unordered_map/unordered_map.vcxproj create mode 100644 Chapter18/cib/libs/etl/test/Performance/unordered_map/unordered_map/unordered_map.vcxproj.filters create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/AssertException.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/AssertException.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/CheckMacros.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Checks.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Checks.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/CompositeTestReporter.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/CompositeTestReporter.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Config.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/CurrentTest.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/CurrentTest.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/DeferredTestReporter.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/DeferredTestReporter.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/DeferredTestResult.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/DeferredTestResult.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/ExceptionMacros.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/ExecuteTest.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/HelperMacros.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/MemoryOutStream.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/MemoryOutStream.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Posix/SignalTranslator.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Posix/SignalTranslator.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Posix/TimeHelpers.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Posix/TimeHelpers.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/ReportAssert.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/ReportAssert.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/ReportAssertImpl.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/RequireMacros.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/RequiredCheckException.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/RequiredCheckException.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/RequiredCheckTestReporter.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/RequiredCheckTestReporter.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Test.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Test.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestDetails.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestDetails.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestList.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestList.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestMacros.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestReporter.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestReporter.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestReporterStdout.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestReporterStdout.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestResults.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestResults.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestRunner.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestRunner.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TestSuite.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/ThrowingTestReporter.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/ThrowingTestReporter.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TimeConstraint.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TimeConstraint.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/TimeHelpers.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/UnitTest++.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/UnitTestPP.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Win32/TimeHelpers.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/Win32/TimeHelpers.h create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/XmlTestReporter.cpp create mode 100644 Chapter18/cib/libs/etl/test/UnitTest++/XmlTestReporter.h create mode 100644 Chapter18/cib/libs/etl/test/data.h create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/exceptions/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/exceptions/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/exceptions/test_error_handler.cpp create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/log_errors/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/log_errors/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/log_errors/test_error_handler.cpp create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/log_errors_and_exceptions/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/log_errors_and_exceptions/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/etl_error_handler/log_errors_and_exceptions/test_error_handler.cpp create mode 100644 Chapter18/cib/libs/etl/test/etl_initializer_list/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/etl_initializer_list/etl_initializer_list.sln create mode 100644 Chapter18/cib/libs/etl/test/etl_initializer_list/etl_initializer_list.vcxproj create mode 100644 Chapter18/cib/libs/etl/test/etl_initializer_list/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/etl_initializer_list/test_initializer_list.cpp create mode 100644 Chapter18/cib/libs/etl/test/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/iterators_for_unit_tests.h create mode 100644 Chapter18/cib/libs/etl/test/list_header_files.bat create mode 100644 Chapter18/cib/libs/etl/test/list_test_files.bat create mode 100644 Chapter18/cib/libs/etl/test/list_test_files.ps1 create mode 100644 Chapter18/cib/libs/etl/test/list_test_files.sh create mode 100644 Chapter18/cib/libs/etl/test/main.cpp create mode 100644 Chapter18/cib/libs/etl/test/maincpp03check.cpp create mode 100644 Chapter18/cib/libs/etl/test/meson.build create mode 100644 Chapter18/cib/libs/etl/test/murmurhash3.cpp create mode 100644 Chapter18/cib/libs/etl/test/murmurhash3.h create mode 100644 Chapter18/cib/libs/etl/test/run-syntax-checks.sh create mode 100644 Chapter18/cib/libs/etl/test/run-tests.sh create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/absolute.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/algorithm.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/alignment.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/array.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/array_view.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/array_wrapper.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/atomic.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/base64.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/base64_decoder.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/base64_encoder.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/basic_format_spec.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/basic_string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/basic_string_stream.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/binary.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/bip_buffer_spsc_atomic.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/bit.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/bit_stream.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/bitset.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/bitset_legacy.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/bitset_new.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/bloom_filter.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/bresenham_line.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/buffer_descriptors.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/byte.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/byte_stream.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++03/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++03/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++11/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++11/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++14/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++14/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++17/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++17/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++20/CMakeLists.txt create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/c++20/etl_profile.h create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/callback.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/callback_service.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/callback_timer.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/callback_timer_atomic.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/callback_timer_interrupt.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/callback_timer_locked.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/char_traits.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/checksum.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/circular_buffer.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/circular_iterator.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/combinations.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/compare.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/constant.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/container.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/correlation.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/covariance.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc1.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_a.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_arc.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_aug_ccitt.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_buypass.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_ccitt.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_cdma2000.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_dds110.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_dectr.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_dectx.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_dnp.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_en13757.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_genibus.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_kermit.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_m17.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_maxim.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_mcrf4xx.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_modbus.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_profibus.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_riello.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_t10dif.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_teledisk.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_tms37157.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_usb.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_x25.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc16_xmodem.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32_bzip2.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32_c.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32_d.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32_jamcrc.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32_mpeg2.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32_posix.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32_q.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc32_xfer.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc64_ecma.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_ccitt.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_cdma2000.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_darc.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_dvbs2.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_ebu.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_icode.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_itu.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_j1850.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_j1850_zero.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_maxim.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_rohc.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/crc8_wcdma.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/cyclic_value.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/debounce.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/debug_count.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/delegate.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/delegate_cpp03.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/delegate_service.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/deque.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/endianness.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/enum_type.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/error_handler.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/exception.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/expected.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/factorial.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/fibonacci.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/file_error_numbers.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/fixed_iterator.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/fixed_sized_memory_block_allocator.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/flags.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/flat_map.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/flat_multimap.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/flat_multiset.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/flat_set.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/fnv_1.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/format_spec.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/forward_list.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/frame_check_sequence.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/fsm.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/function.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/functional.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/gamma.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/gcd.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/generic_pool.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/hash.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/hfsm.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/histogram.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/ihash.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/imemory_block_allocator.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/indirect_vector.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/initializer_list.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/instance_count.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/integral_limits.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/intrusive_forward_list.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/intrusive_links.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/intrusive_list.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/intrusive_queue.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/intrusive_stack.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/invert.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/io_port.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/ipool.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/ireference_counted_message_pool.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/iterator.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/jenkins.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/largest.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/lcm.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/limiter.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/limits.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/list.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/log.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/macros.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/map.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/math.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/math_constants.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/mean.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/mem_cast.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/memory.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/memory_model.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_broker.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_bus.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_packet.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_router.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_router_registry.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_timer.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_timer_atomic.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_timer_interrupt.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_timer_locked.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/message_types.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/multi_array.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/multi_range.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/multi_span.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/multi_vector.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/multimap.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/multiset.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/murmur3.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/mutex.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/negative.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/nth_type.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/null_type.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/nullptr.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/numeric.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/observer.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/optional.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/overload.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/packet.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/parameter_pack.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/parameter_type.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/pearson.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/permutations.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/placement_new.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/platform.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/poly_span.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/pool.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/power.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/priority_queue.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/pseudo_moving_average.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/quantize.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/queue.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/queue_lockable.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/queue_mpmc_mutex.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/queue_spsc_atomic.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/queue_spsc_isr.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/queue_spsc_locked.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/radix.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/random.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/ratio.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/reference_counted_message.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/reference_counted_message_pool.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/reference_counted_object.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/reference_flat_map.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/reference_flat_multimap.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/reference_flat_multiset.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/reference_flat_set.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/rescale.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/result.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/rms.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/scaled_rounding.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/scheduler.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/set.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/shared_message.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/singleton.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/smallest.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/span.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/sqrt.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/stack.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/standard_deviation.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/state_chart.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/static_assert.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/string_stream.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/string_utilities.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/string_view.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/stringify.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/successor.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/task.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/threshold.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/timer.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/to_arithmetic.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/to_string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/to_u16string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/to_u32string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/to_u8string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/to_wstring.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/type_def.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/type_lookup.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/type_select.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/type_traits.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u16format_spec.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u16string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u16string_stream.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u32format_spec.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u32string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u32string_stream.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u8format_spec.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u8string.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/u8string_stream.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/unaligned_type.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/unordered_map.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/unordered_multimap.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/unordered_multiset.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/unordered_set.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/user_type.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/utility.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/variance.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/variant.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/variant_legacy.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/variant_old.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/variant_pool.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/variant_variadic.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/vector.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/version.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/visitor.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/wformat_spec.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/wstring.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/syntax_check/wstring_stream.h.t.cpp create mode 100644 Chapter18/cib/libs/etl/test/test.sh create mode 100644 Chapter18/cib/libs/etl/test/test_algorithm.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_alignment.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_array.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_array_view.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_array_wrapper.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_atomic.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC2152_decoder.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC2152_encoder.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC3501_decoder.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC3501_encoder.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC4648_URL_decoder_with_no_padding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC4648_URL_decoder_with_padding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC4648_URL_encoder_with_no_padding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC4648_URL_encoder_with_padding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC4648_decoder_with_no_padding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC4648_decoder_with_padding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC4648_encoder_with_no_padding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_base64_RFC4648_encoder_with_padding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_binary.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bip_buffer_spsc_atomic.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bit.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bit_stream.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bit_stream_reader_big_endian.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bit_stream_reader_little_endian.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bit_stream_writer_big_endian.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bit_stream_writer_little_endian.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bitset_legacy.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bitset_new_comparisons.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bitset_new_default_element_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bitset_new_explicit_single_element_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bitset_new_ext_default_element_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bitset_new_ext_explicit_single_element_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bloom_filter.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bresenham_line.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_bsd_checksum.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_buffer_descriptors.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_byte.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_byte_stream.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_callback_service.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_callback_timer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_callback_timer_atomic.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_callback_timer_interrupt.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_callback_timer_locked.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_char_traits.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_checksum.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_circular_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_circular_buffer_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_circular_iterator.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_compare.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_constant.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_container.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_correlation.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_covariance.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc1.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_a.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_arc.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_aug_ccitt.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_buypass.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_ccitt.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_cdma2000.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_dds110.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_dectr.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_dectx.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_dnp.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_en13757.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_genibus.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_kermit.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_m17.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_maxim.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_mcrf4xx.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_modbus.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_profibus.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_riello.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_t10dif.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_teledisk.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_tms37157.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_usb.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_x25.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc16_xmodem.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32_bzip2.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32_c.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32_d.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32_jamcrc.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32_mpeg2.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32_posix.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32_q.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc32_xfer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc64_ecma.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_ccitt.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_cdma2000.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_darc.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_dvbs2.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_ebu.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_icode.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_itu.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_j1850.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_j1850_zero.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_maxim.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_rohc.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_crc8_wcdma.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_cyclic_value.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_debounce.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_delegate.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_delegate_cpp03.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_delegate_service.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_delegate_service_compile_time.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_delegate_service_cpp03.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_deque.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_endian.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_enum_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_error_handler.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_etl_traits.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_exception.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_expected.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_fixed_iterator.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_fixed_sized_memory_block_allocator.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_flags.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_flat_map.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_flat_multimap.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_flat_multiset.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_flat_set.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_fnv_1.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_format_spec.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_forward_list.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_forward_list_shared_pool.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_fsm.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_function.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_functional.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_gamma.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_hash.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_hfsm.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_hfsm_recurse_to_inner_state_on_start.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_histogram.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_indirect_vector.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_indirect_vector_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_instance_count.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_integral_limits.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_intrusive_forward_list.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_intrusive_links.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_intrusive_list.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_intrusive_queue.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_intrusive_stack.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_invert.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_io_port.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_iterator.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_jenkins.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_largest.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_limiter.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_limits.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_list.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_list_shared_pool.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_macros.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_make_string.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_map.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_math.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_math_functions.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_mean.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_mem_cast.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_mem_cast_ptr.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_memory.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_broker.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_bus.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_packet.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_router.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_router_registry.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_timer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_timer_atomic.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_timer_interrupt.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_message_timer_locked.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_multi_array.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_multi_range.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_multi_span.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_multi_vector.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_multimap.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_multiset.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_murmur3.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_nth_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_numeric.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_observer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_optional.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_overload.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_packet.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_parameter_pack.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_parameter_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_parity_checksum.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_pearson.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_poly_span_dynamic_extent.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_poly_span_fixed_extent.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_pool.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_pool_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_priority_queue.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_pseudo_moving_average.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_quantize.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_lockable.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_lockable_small.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_memory_model_small.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_mpmc_mutex.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_mpmc_mutex_small.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_spsc_atomic.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_spsc_atomic_small.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_spsc_isr.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_spsc_isr_small.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_spsc_locked.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_queue_spsc_locked_small.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_random.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_reference_flat_map.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_reference_flat_multimap.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_reference_flat_multiset.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_reference_flat_set.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_rescale.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_result.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_rms.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_scaled_rounding.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_set.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_shared_message.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_singleton.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_smallest.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_span_dynamic_extent.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_span_fixed_extent.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_stack.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_standard_deviation.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_state_chart.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_state_chart_compile_time.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_state_chart_compile_time_with_data_parameter.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_state_chart_with_data_parameter.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_state_chart_with_rvalue_data_parameter.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_char.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_char_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_stream.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_stream_u16.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_stream_u32.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_stream_u8.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_stream_wchar_t.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_u16.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_u16_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_u32.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_u32_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_u8.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_u8_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_std.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_std_u16.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_std_u32.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_std_u8.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_std_wchar_t.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_u16.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_u32.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_u8.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_utilities_wchar_t.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_view.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_wchar_t.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_string_wchar_t_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_successor.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_task_scheduler.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_threshold.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_arithmetic.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_arithmetic_u16.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_arithmetic_u32.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_arithmetic_u8.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_arithmetic_wchar_t.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_string.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_u16string.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_u32string.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_u8string.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_to_wstring.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_type_def.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_type_lookup.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_type_select.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_type_traits.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_unaligned_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_unaligned_type_constexpr.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_unordered_map.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_unordered_multimap.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_unordered_multiset.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_unordered_set.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_user_type.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_utility.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_variance.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_variant_legacy.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_variant_pool.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_variant_pool_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_variant_variadic.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_vector.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_vector_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_vector_non_trivial.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_vector_pointer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_vector_pointer_external_buffer.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_visitor.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_xor_checksum.cpp create mode 100644 Chapter18/cib/libs/etl/test/test_xor_rotate_checksum.cpp create mode 100644 Chapter18/cib/libs/etl/test/unit_test_framework.h create mode 100644 Chapter18/cib/libs/etl/test/vs2019/.gitignore create mode 100644 Chapter18/cib/libs/etl/test/vs2019/NatvisFile.natvis create mode 100644 Chapter18/cib/libs/etl/test/vs2019/cpp.hint create mode 100644 Chapter18/cib/libs/etl/test/vs2019/etl.sln create mode 100644 Chapter18/cib/libs/etl/test/vs2019/etl.vcxproj create mode 100644 Chapter18/cib/libs/etl/test/vs2019/etl.vcxproj.filters create mode 100644 Chapter18/cib/libs/etl/test/vs2019/etl_initialiser_list/etl_initialiser_list.vcxproj create mode 100644 Chapter18/cib/libs/etl/test/vs2019/etl_initialiser_list/etl_initialiser_list.vcxproj.filters create mode 100644 Chapter18/cib/libs/etl/test/vs2022/.gitignore create mode 100644 Chapter18/cib/libs/etl/test/vs2022/cpp.hint create mode 100644 Chapter18/cib/libs/etl/test/vs2022/etl.sln create mode 100644 Chapter18/cib/libs/etl/test/vs2022/etl.vcxproj create mode 100644 Chapter18/cib/libs/etl/test/vs2022/etl.vcxproj.filters create mode 100644 Chapter18/cib/libs/etl/test/vs2022/etl_initialiser_list/etl_initialiser_list.vcxproj create mode 100644 Chapter18/cib/libs/etl/test/vs2022/etl_initialiser_list/etl_initialiser_list.vcxproj.filters create mode 100644 Chapter18/cib/libs/etl/test/vs2022/io_port.natvis create mode 100644 Chapter18/cib/libs/etl/test/words.txt create mode 100644 Chapter18/cib/libs/etl/todo.txt create mode 100644 Chapter18/cib/libs/etl/uml/FSM example.png create mode 100644 Chapter18/cib/libs/etl/uml/Framework.png create mode 100644 Chapter18/cib/libs/etl/uml/MessageFramework.png create mode 100644 Chapter18/cib/libs/etl/uml/source/FSM example.zargo create mode 100644 Chapter18/cib/libs/etl/uml/source/Message Framework.zargo create mode 100644 Chapter18/cib/libs/etl/version.txt create mode 100644 Chapter18/cib/libs/flow/builder.hpp create mode 100644 Chapter18/cib/libs/flow/common.hpp create mode 100644 Chapter18/cib/libs/flow/detail/par.hpp create mode 100644 Chapter18/cib/libs/flow/detail/seq.hpp create mode 100644 Chapter18/cib/libs/flow/detail/walk.hpp create mode 100644 Chapter18/cib/libs/flow/flow.hpp create mode 100644 Chapter18/cib/libs/flow/graph_builder.hpp create mode 100644 Chapter18/cib/libs/flow/graphviz_builder.hpp create mode 100644 Chapter18/cib/libs/flow/impl.hpp create mode 100644 Chapter18/cib/libs/flow/log.hpp create mode 100644 Chapter18/cib/libs/flow/run.hpp create mode 100644 Chapter18/cib/libs/flow/step.hpp create mode 100644 Chapter18/cib/libs/flow/subgraph_identity.hpp create mode 100644 Chapter18/cib/libs/fmt/args.h create mode 100644 Chapter18/cib/libs/fmt/chrono.h create mode 100644 Chapter18/cib/libs/fmt/color.h create mode 100644 Chapter18/cib/libs/fmt/compile.h create mode 100644 Chapter18/cib/libs/fmt/core.h create mode 100644 Chapter18/cib/libs/fmt/format-inl.h create mode 100644 Chapter18/cib/libs/fmt/format.h create mode 100644 Chapter18/cib/libs/fmt/os.h create mode 100644 Chapter18/cib/libs/fmt/ostream.h create mode 100644 Chapter18/cib/libs/fmt/printf.h create mode 100644 Chapter18/cib/libs/fmt/ranges.h create mode 100644 Chapter18/cib/libs/fmt/std.h create mode 100644 Chapter18/cib/libs/fmt/xchar.h create mode 100644 Chapter18/cib/libs/interrupt/concepts.hpp create mode 100644 Chapter18/cib/libs/interrupt/config.hpp create mode 100644 Chapter18/cib/libs/interrupt/dynamic_controller.hpp create mode 100644 Chapter18/cib/libs/interrupt/fwd.hpp create mode 100644 Chapter18/cib/libs/interrupt/hal.hpp create mode 100644 Chapter18/cib/libs/interrupt/impl.hpp create mode 100644 Chapter18/cib/libs/interrupt/manager.hpp create mode 100644 Chapter18/cib/libs/interrupt/policies.hpp create mode 100644 Chapter18/cib/libs/log/README.md create mode 100644 Chapter18/cib/libs/log/catalog/catalog.hpp create mode 100644 Chapter18/cib/libs/log/catalog/mipi_encoder.hpp create mode 100644 Chapter18/cib/libs/log/env.hpp create mode 100644 Chapter18/cib/libs/log/fmt/logger.hpp create mode 100644 Chapter18/cib/libs/log/level.hpp create mode 100644 Chapter18/cib/libs/log/log.hpp create mode 100644 Chapter18/cib/libs/log/module.hpp create mode 100644 Chapter18/cib/libs/sc/README.md create mode 100644 Chapter18/cib/libs/sc/format.hpp create mode 100644 Chapter18/cib/libs/sc/fwd.hpp create mode 100644 Chapter18/cib/libs/sc/lazy_string_format.hpp create mode 100644 Chapter18/cib/libs/sc/string_constant.hpp create mode 100644 Chapter18/cib/libs/stdx/algorithm.hpp create mode 100644 Chapter18/cib/libs/stdx/atomic.hpp create mode 100644 Chapter18/cib/libs/stdx/atomic_bitset.hpp create mode 100644 Chapter18/cib/libs/stdx/bit.hpp create mode 100644 Chapter18/cib/libs/stdx/bitset.hpp create mode 100644 Chapter18/cib/libs/stdx/byterator.hpp create mode 100644 Chapter18/cib/libs/stdx/cached.hpp create mode 100644 Chapter18/cib/libs/stdx/compiler.hpp create mode 100644 Chapter18/cib/libs/stdx/concepts.hpp create mode 100644 Chapter18/cib/libs/stdx/ct_conversions.hpp create mode 100644 Chapter18/cib/libs/stdx/ct_format.hpp create mode 100644 Chapter18/cib/libs/stdx/ct_string.hpp create mode 100644 Chapter18/cib/libs/stdx/cx_map.hpp create mode 100644 Chapter18/cib/libs/stdx/cx_multimap.hpp create mode 100644 Chapter18/cib/libs/stdx/cx_queue.hpp create mode 100644 Chapter18/cib/libs/stdx/cx_set.hpp create mode 100644 Chapter18/cib/libs/stdx/cx_vector.hpp create mode 100644 Chapter18/cib/libs/stdx/detail/bitset_common.hpp create mode 100644 Chapter18/cib/libs/stdx/detail/list_common.hpp create mode 100644 Chapter18/cib/libs/stdx/for_each_n_args.hpp create mode 100644 Chapter18/cib/libs/stdx/function_traits.hpp create mode 100644 Chapter18/cib/libs/stdx/functional.hpp create mode 100644 Chapter18/cib/libs/stdx/intrusive_forward_list.hpp create mode 100644 Chapter18/cib/libs/stdx/intrusive_list.hpp create mode 100644 Chapter18/cib/libs/stdx/iterator.hpp create mode 100644 Chapter18/cib/libs/stdx/memory.hpp create mode 100644 Chapter18/cib/libs/stdx/numeric.hpp create mode 100644 Chapter18/cib/libs/stdx/optional.hpp create mode 100644 Chapter18/cib/libs/stdx/panic.hpp create mode 100644 Chapter18/cib/libs/stdx/priority.hpp create mode 100644 Chapter18/cib/libs/stdx/ranges.hpp create mode 100644 Chapter18/cib/libs/stdx/rollover.hpp create mode 100644 Chapter18/cib/libs/stdx/span.hpp create mode 100644 Chapter18/cib/libs/stdx/static_assert.hpp create mode 100644 Chapter18/cib/libs/stdx/tuple.hpp create mode 100644 Chapter18/cib/libs/stdx/tuple_algorithms.hpp create mode 100644 Chapter18/cib/libs/stdx/tuple_destructure.hpp create mode 100644 Chapter18/cib/libs/stdx/type_traits.hpp create mode 100644 Chapter18/cib/libs/stdx/udls.hpp create mode 100644 Chapter18/cib/libs/stdx/utility.hpp create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f030x6.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f030x8.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f030xc.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f031x6.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f038xx.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f042x6.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f048xx.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f051x8.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f058xx.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f070x6.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f070xb.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f071xb.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f072xb.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f078xx.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f091xc.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f098xx.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h create mode 100644 Chapter18/cib/platform/CMSIS/Device/ST/STM32F0xx/License.md create mode 100644 Chapter18/cib/platform/CMSIS/Include/cmsis_armcc.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/cmsis_armclang.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/cmsis_compiler.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/cmsis_gcc.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/cmsis_iccarm.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/cmsis_version.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_armv8mbl.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_armv8mml.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_cm0.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_cm0plus.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_cm1.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_cm23.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_cm3.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_cm33.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_cm4.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_cm7.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_sc000.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/core_sc300.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/mpu_armv7.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/mpu_armv8.h create mode 100644 Chapter18/cib/platform/CMSIS/Include/tz_context.h create mode 100644 Chapter18/cib/platform/CMSIS/LICENSE.txt create mode 100644 Chapter18/cib/platform/STM32F072C8Tx_FLASH.ld create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/Legacy/stm32f0xx_hal_can_legacy.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32_assert_template.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_adc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_adc_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_can.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_cec.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_comp.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_conf_template.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_cortex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_crc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_crc_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dac.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dac_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_def.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_exti.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2s.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_irda.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_irda_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_iwdg.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pcd.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pcd_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rtc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rtc_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_smartcard.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_smartcard_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_smbus.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_spi_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tsc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_usart.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_usart_ex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_wwdg.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_adc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_bus.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_comp.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_cortex.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_crc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_crs.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_dac.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_dma.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_exti.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_gpio.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_i2c.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_iwdg.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_pwr.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_rcc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_rtc.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_spi.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_system.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_tim.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_usart.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_utils.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Inc/stm32f0xx_ll_wwdg.h create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/License.md create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_can.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_cec.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_comp.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_cortex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_crc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_crc_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_dac.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_dac_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_dma.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_exti.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_gpio.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2s.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_irda.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_iwdg.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_msp_template.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pcd.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pcd_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rtc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rtc_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_smartcard.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_smartcard_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_smbus.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_spi.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_spi_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_timebase_rtc_alarm_template.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_timebase_rtc_wakeup_template.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_timebase_tim_template.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tsc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_usart.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_usart_ex.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_wwdg.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_adc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_comp.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_crc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_crs.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_dac.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_dma.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_exti.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_gpio.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_i2c.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_pwr.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_rcc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_rtc.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_spi.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_tim.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_usart.c create mode 100644 Chapter18/cib/platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_ll_utils.c create mode 100644 Chapter18/cib/platform/inc/stm32f0xx_hal_conf.h create mode 100644 Chapter18/cib/platform/inc/stm32f0xx_it.h create mode 100644 Chapter18/cib/platform/src/stm32f0xx_hal_msp.c create mode 100644 Chapter18/cib/platform/src/stm32f0xx_it.c create mode 100644 Chapter18/cib/platform/src/system_stm32f0xx.c create mode 100644 Chapter18/cib/platform/startup_stm32f072xb.s create mode 100644 Chapter18/cib/renode_scripts/stm32f0.repl create mode 100644 Chapter18/cib/renode_scripts/stm32f072.repl create mode 100644 Chapter18/cib/renode_scripts/stm32f072.resc create mode 100644 Chapter18/cib/renode_scripts/stm32f072_debug.resc create mode 100644 Chapter18/cib/util/inc/signal.hpp create mode 100644 Chapter18/cib/util/inc/units.hpp create mode 100644 Chapter18/cib/util/src/units.cpp diff --git a/Chapter18/cib/.clang-format b/Chapter18/cib/.clang-format new file mode 100644 index 0000000..3e8d8da --- /dev/null +++ b/Chapter18/cib/.clang-format @@ -0,0 +1,9 @@ +IndentWidth: 4 +KeepEmptyLinesAtTheStartOfBlocks: false +BreakBeforeBraces: Allman +ColumnLimit: 80 +SpaceBeforeParens: Never +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortFunctionsOnASingleLine: false +AllowShortIfStatementsOnASingleLine: false diff --git a/Chapter18/cib/.clang-tidy b/Chapter18/cib/.clang-tidy new file mode 100644 index 0000000..9ab07d4 --- /dev/null +++ b/Chapter18/cib/.clang-tidy @@ -0,0 +1,27 @@ +Checks: > + -*, + bugprone-*, + misc-*, + clang-analyzer-*, + modernize-*, + -modernize-use-trailing-return-type, + performance-*, + -performance-no-int-to-ptr, + portability-*, + readability-*, + -readability-identifier-length + readability-identifier-naming + +CheckOptions: + - { key: readability-identifier-naming.NamespaceCase, value: lower_case } + - { key: readability-identifier-naming.ClassCase, value: lower_case } + - { key: readability-identifier-naming.StructCase, value: lower_case } + - { key: readability-identifier-naming.MethodCase, value: lower_case } + - { key: readability-identifier-naming.TemplateParameterCase, value: CamelCase } + - { key: readability-identifier-naming.FunctionCase, value: lower_case } + - { key: readability-identifier-naming.VariableCase, value: lower_case } + - { key: readability-identifier-naming.PrivateMemberSuffix, value: _ } + - { key: readability-identifier-naming.ConstexprVariablePrefix, value: c_ } + +ExtraArgs: + - -std=c++20 \ No newline at end of file diff --git a/Chapter18/cib/CMakeLists.txt b/Chapter18/cib/CMakeLists.txt new file mode 100644 index 0000000..5650d87 --- /dev/null +++ b/Chapter18/cib/CMakeLists.txt @@ -0,0 +1,162 @@ +cmake_minimum_required(VERSION 3.13) + +set(CMAKE_EXPORT_COMPILE_COMMANDS 1) + +set(CMAKE_C_COMPILER "arm-none-eabi-gcc") +set(CMAKE_CXX_COMPILER "arm-none-eabi-g++") +set(CMAKE_ASM_COMPILER "arm-none-eabi-gcc") +set(CMAKE_OBJCOPY "arm-none-eabi-objcopy") +set(CMAKE_SIZE "arm-none-eabi-size") + +set(RENODE "renode" CACHE STRING "Path to Renode executable") + +set(MAIN_CPP_PATH "${CMAKE_SOURCE_DIR}/app/src/") +set(MAIN_CPP_FILE_NAME "main.cpp" CACHE STRING "main file") +list(APPEND LIB_SPECS "-specs=nosys.specs") +list(APPEND LIB_SPECS "-specs=nano.specs") + +set(EXCEPTIONS_FLAGS "-fno-exceptions -fno-rtti") + +find_program(CCACHE_FOUND ccache) +if(CCACHE_FOUND) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) +endif(CCACHE_FOUND) + +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +set(CDEFS "-DUSE_HAL_DRIVER -DSTM32F072xB") +set(MCU "-mcpu=cortex-m0 -mthumb") +set(COMMON_FLAGS "${MCU} ${CDEFS} -fdata-sections -ffunction-sections -Wno-address-of-packed-member -Wall -Wextra -Wno-unused-parameter") +set(CMAKE_C_FLAGS "${COMMON_FLAGS}") +set(CMAKE_CXX_FLAGS "${COMMON_FLAGS} -Wno-register ${EXCEPTIONS_FLAGS} -fno-threadsafe-statics") +set(CMAKE_ASM_FLAGS "${COMMON_FLAGS} -x assembler-with-cpp") + +set(CMAKE_C_FLAGS_DEBUG "-g -gdwarf-2 -Og") +set(CMAKE_CXX_FLAGS_DEBUG "-g -gdwarf-2 -Og") +set(CMAKE_C_FLAGS_RELEASE "-O2 -flto") +set(CMAKE_CXX_FLAGS_RELEASE "-O2 -flto") +set(CMAKE_C_FLAGS_MINSIZEREL "-Os -flto") +set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -flto") + +if(CMAKE_EXPORT_COMPILE_COMMANDS) + # This dreadful mess is to communicate to clang-tidy the C++ system includes. + # It seems that CMake doesn't support using its own compile_commands.json + # database, and that clang-tidy doesn't pick up non-default system headers. + execute_process( + COMMAND + bash -c + "${CMAKE_CXX_COMPILER} -x c++ -Wp,-v /dev/null 2>&1 > /dev/null | grep '^ /' | grep -w 'c++'" + OUTPUT_VARIABLE COMPILER_HEADERS + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REGEX REPLACE "[ \n\t]+" ";" INCLUDE_COMPILER_HEADERS + ${COMPILER_HEADERS}) + set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES ${INCLUDE_COMPILER_HEADERS}) + message(STATUS "${CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES}") + + execute_process( + COMMAND + bash -c + "${CMAKE_C_COMPILER} -x c -Wp,-v /dev/null 2>&1 > /dev/null | grep '^ /' " + OUTPUT_VARIABLE COMPILER_HEADERS + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REGEX REPLACE "[ \n\t]+" ";" INCLUDE_COMPILER_HEADERS + ${COMPILER_HEADERS}) + set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES ${INCLUDE_COMPILER_HEADERS}) + message(STATUS "${CMAKE_C_STANDARD_INCLUDE_DIRECTORIES}") + + set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES + "${CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES} ${CMAKE_C_STANDARD_INCLUDE_DIRECTORIES}" + ) +endif() + +project(bare VERSION 1.0.6) + +enable_language(C CXX ASM) + +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +# global include directories +include_directories( + ${CMAKE_SOURCE_DIR}/platform/inc + ${CMAKE_SOURCE_DIR}/platform/CMSIS/Device/ST/STM32F0xx/Include + ${CMAKE_SOURCE_DIR}/platform/CMSIS/Include + ${CMAKE_SOURCE_DIR}/platform/STM32F0xx_HAL_Driver/Inc + ${CMAKE_SOURCE_DIR}/app/inc + ${CMAKE_SOURCE_DIR}/hal/uart/inc + ${CMAKE_SOURCE_DIR}/hal/inc + ${CMAKE_SOURCE_DIR}/hal/adc/inc + ${CMAKE_SOURCE_DIR}/cstdlib_support + ${CMAKE_SOURCE_DIR}/util/inc + ${CMAKE_SOURCE_DIR}/libs + ) + +set(EXECUTABLE ${PROJECT_NAME}.elf) + +add_executable( + ${EXECUTABLE} + platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c + platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_cortex.c + platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_gpio.c + platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc.c + platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart.c + platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart_ex.c + platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc.c + platform/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc_ex.c + platform/startup_stm32f072xb.s + platform/src/stm32f0xx_hal_msp.c + platform/src/stm32f0xx_it.c + platform/src/system_stm32f0xx.c + hal/adc/src/adc_stm32.cpp + cstdlib_support/retarget.cpp + util/src/units.cpp + ${MAIN_CPP_PATH}/${MAIN_CPP_FILE_NAME} + ) + +target_link_libraries(${EXECUTABLE} PUBLIC) + +target_compile_definitions(${EXECUTABLE} PUBLIC "-DSIMULATE_FREESTANDING") + +target_include_directories(${EXECUTABLE} PUBLIC ${PROJECT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}) + +set_target_properties(${EXECUTABLE} PROPERTIES LINKER_LANGUAGE CXX) + +target_link_options( + ${EXECUTABLE} + PUBLIC + -T${CMAKE_SOURCE_DIR}/platform/STM32F072C8Tx_FLASH.ld + -mcpu=cortex-m0 + -mthumb + ${LIB_SPECS} + -lnosys + -u + _printf_float + -lc + -lm + -Wl,--no-warn-rwx-segments + -Wl,-Map=${PROJECT_NAME}.map,--cref + -Wl,--gc-sections) + +add_subdirectory(libs/etl) +target_link_libraries(${EXECUTABLE} PRIVATE etl::etl) + +# Print executable size +add_custom_command( + TARGET ${EXECUTABLE} + POST_BUILD + COMMAND arm-none-eabi-size ${EXECUTABLE}) + +# Create hex file +add_custom_command( + TARGET ${EXECUTABLE} + POST_BUILD + COMMAND arm-none-eabi-objcopy -O ihex ${EXECUTABLE} ${PROJECT_NAME}.hex + COMMAND arm-none-eabi-objcopy -O binary ${EXECUTABLE} ${PROJECT_NAME}.bin) + +# Run elf in Renode +add_custom_target( + run_in_renode + COMMAND ${RENODE} --console --disable-xwt ${CMAKE_SOURCE_DIR}/renode_scripts/stm32f072.resc -e start + DEPENDS ${PROJECT_NAME}.elf) + diff --git a/Chapter18/cib/app/src/main.cpp b/Chapter18/cib/app/src/main.cpp new file mode 100644 index 0000000..82d572d --- /dev/null +++ b/Chapter18/cib/app/src/main.cpp @@ -0,0 +1,119 @@ +#include +#include +#include + +#include + +#include + +#include +#include +#include + +#include + +#include + +#include + +struct runtime_init : public flow::service<> {}; + +struct main_loop : public callback::service<> {}; + +struct send_temperature : public callback::service {}; + +struct i2c { + + constexpr static auto init = flow::action<"i2c_init">( + [](){ + printf("I2C init ...\r\n"); + }); + + constexpr static auto config = cib::config( + cib::extend(*init) + ); + +}; + +struct temperature_sensor_component { + + constexpr static auto init = flow::action<"temp_sensor_init">( + []() { + printf("Initializing temperature sensor ... \r\n"); + }); + + constexpr static auto read_temperature = []() { + float temperature = 23.4f; + + cib::service(temperature); + }; + + constexpr static auto config = cib::config( + cib::extend(read_temperature), + + cib::extend(i2c::init >> *init) + ); + +}; + +struct display_temperature_component { + + constexpr static auto display_temperature = [](float temperature) { + printf("Temperature is %.2f C\r\n", temperature); + }; + + constexpr static auto config = cib::config( + cib::extend(display_temperature) + ); + +}; + +struct data_sender_component { + + constexpr static auto send_temp = [](float temp) { + printf("Sending temperature %.2f C\r\n", temp); + }; + + constexpr static auto config = cib::config( + cib::extend(send_temp) + ); + +}; + +struct my_project { + + constexpr static auto config = cib::config( + cib::exports, + + cib::components + ); +}; + +int main() +{ + hal::init(); + + hal::uart_stm32 uart(USART2); + uart.init(); + + retarget::set_stdio_uart(&uart); + + cib::nexus nexus{}; + nexus.init(); + + nexus.service(); + + for(int i = 0; i < 3; i++) + { + nexus.service(); + } + + while(true) + { + } +} diff --git a/Chapter18/cib/cstdlib_support/retarget.cpp b/Chapter18/cib/cstdlib_support/retarget.cpp new file mode 100644 index 0000000..f2dd14c --- /dev/null +++ b/Chapter18/cib/cstdlib_support/retarget.cpp @@ -0,0 +1,81 @@ +#include + +#include +#include +#include + +#include + +namespace +{ +hal::uart *uart_stdio; +}; + +void retarget::set_stdio_uart(hal::uart *uart) +{ + uart_stdio = uart; + + /* Disable I/O buffering for STDOUT stream, so that + * chars are sent out as soon as they are printed. */ + setvbuf(stdout, NULL, _IONBF, 0); +} + +#define STDIN_FILENO 0 +#define STDOUT_FILENO 1 +#define STDERR_FILENO 2 + +extern "C" int _write(int fd, char * ptr, int len) +{ + if(fd == STDOUT_FILENO || fd == STDERR_FILENO) + { + uart_stdio->write(std::span(ptr, len)); + } + + return len; +} + +extern "C" int _isatty(int fd) +{ + if(fd >= STDIN_FILENO && fd <= STDERR_FILENO) + { + return 1; + } + errno = EBADF; + return 0; +} + +extern "C" int _close(int fd) +{ + if(fd >= STDIN_FILENO && fd <= STDERR_FILENO) + return 0; + + errno = EBADF; + return -1; +} + +extern "C" int _lseek(int fd, int ptr, int dir) +{ + (void)fd; + (void)ptr; + (void)dir; + + errno = EBADF; + return -1; +} + +extern "C" int _read(int fd, char *ptr, int len) +{ + return -1; +} + +int _fstat(int fd, struct stat *st) +{ + if(fd >= STDIN_FILENO && fd <= STDERR_FILENO) + { + st->st_mode = S_IFCHR; + return 0; + } + + errno = EBADF; + return 0; +} diff --git a/Chapter18/cib/cstdlib_support/retarget.hpp b/Chapter18/cib/cstdlib_support/retarget.hpp new file mode 100644 index 0000000..3a74dc6 --- /dev/null +++ b/Chapter18/cib/cstdlib_support/retarget.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include + +namespace retarget +{ + +void set_stdio_uart(hal::uart *uart); + +}; \ No newline at end of file diff --git a/Chapter18/cib/hal/adc/inc/adc.hpp b/Chapter18/cib/hal/adc/inc/adc.hpp new file mode 100644 index 0000000..cea69ec --- /dev/null +++ b/Chapter18/cib/hal/adc/inc/adc.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +#include + +namespace hal +{ + class adc { + public: + enum class error { + timeout + }; + + virtual void init() = 0; + virtual std::expected get_reading() = 0; + }; +}; \ No newline at end of file diff --git a/Chapter18/cib/hal/adc/inc/adc_stm32.hpp b/Chapter18/cib/hal/adc/inc/adc_stm32.hpp new file mode 100644 index 0000000..050ca43 --- /dev/null +++ b/Chapter18/cib/hal/adc/inc/adc_stm32.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +#include +#include + +namespace hal +{ + + class adc_stm32 : public adc{ + public: + adc_stm32(units::voltage ref_voltage) : ref_voltage_(ref_voltage) {} + + void init() override; + std::expected get_reading() override; + private: + ADC_HandleTypeDef adc_handle_; + units::voltage ref_voltage_; + }; +}; \ No newline at end of file diff --git a/Chapter18/cib/hal/adc/src/adc_stm32.cpp b/Chapter18/cib/hal/adc/src/adc_stm32.cpp new file mode 100644 index 0000000..ba15253 --- /dev/null +++ b/Chapter18/cib/hal/adc/src/adc_stm32.cpp @@ -0,0 +1,47 @@ +#include + +void hal::adc_stm32::init() { + ADC_ChannelConfTypeDef sConfig = {0}; + + /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) + */ + adc_handle_.Instance = ADC1; + adc_handle_.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; + adc_handle_.Init.Resolution = ADC_RESOLUTION_12B; + adc_handle_.Init.DataAlign = ADC_DATAALIGN_RIGHT; + adc_handle_.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; + adc_handle_.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + adc_handle_.Init.LowPowerAutoWait = DISABLE; + adc_handle_.Init.LowPowerAutoPowerOff = DISABLE; + adc_handle_.Init.ContinuousConvMode = DISABLE; + adc_handle_.Init.DiscontinuousConvMode = DISABLE; + adc_handle_.Init.ExternalTrigConv = ADC_SOFTWARE_START; + adc_handle_.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + adc_handle_.Init.DMAContinuousRequests = DISABLE; + adc_handle_.Init.Overrun = ADC_OVR_DATA_PRESERVED; + if (HAL_ADC_Init(&adc_handle_) != HAL_OK) + { + //Error_Handler(); + } + + /** Configure for the selected ADC regular channel to be converted. + */ + sConfig.Channel = ADC_CHANNEL_0; + sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; + sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; + if (HAL_ADC_ConfigChannel(&adc_handle_, &sConfig) != HAL_OK) + { + //Error_Handler(); + } +} + +std::expected hal::adc_stm32::get_reading() { + HAL_ADC_Start(&adc_handle_); + if(HAL_ADC_PollForConversion(&adc_handle_, 1000) != HAL_OK) { + return std::unexpected(hal::adc::error::timeout); + } + + auto adc_val = HAL_ADC_GetValue(&adc_handle_); + + return ref_voltage_ * adc_val / 4096.f; +} \ No newline at end of file diff --git a/Chapter18/cib/hal/gpio/inc/gpio.hpp b/Chapter18/cib/hal/gpio/inc/gpio.hpp new file mode 100644 index 0000000..9141590 --- /dev/null +++ b/Chapter18/cib/hal/gpio/inc/gpio.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +namespace hal +{ +class gpio +{ +public: + gpio(const std::function & on_press = nullptr); + void execute_interrupt_handler() const; + + [[nodiscard]] virtual bool is_interrupt_generated() const = 0; + virtual void clear_interrupt_flag() const = 0; +private: + std::function on_press_; +}; +}; // namespace hal diff --git a/Chapter18/cib/hal/gpio/inc/gpio_interrupt_manager.hpp b/Chapter18/cib/hal/gpio/inc/gpio_interrupt_manager.hpp new file mode 100644 index 0000000..0363d0e --- /dev/null +++ b/Chapter18/cib/hal/gpio/inc/gpio_interrupt_manager.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +#include + +namespace hal { + + struct gpio_interrupt_manager { + static void register_interrupt_handler(gpio * pin); + + static void execute_interrupt_handlers(); + + static constexpr std::size_t c_gpio_handlers_num = 16; + static inline std::array gpio_handlers{}; + static inline std::size_t w_idx = 0; + }; +}; \ No newline at end of file diff --git a/Chapter18/cib/hal/gpio/inc/gpio_stm32.hpp b/Chapter18/cib/hal/gpio/inc/gpio_stm32.hpp new file mode 100644 index 0000000..0bd7d56 --- /dev/null +++ b/Chapter18/cib/hal/gpio/inc/gpio_stm32.hpp @@ -0,0 +1,70 @@ +#include + +#include + +namespace hal { + +enum class pin : uint16_t { + p_invalid = 0, + p0 = 0x0001U, + p1 = 0x0002U, + p2 = 0x0004U, + p3 = 0x0008U, + p4 = 0x0010U, + p5 = 0x0020U, + p6 = 0x0040U, + p7 = 0x0080U, + p8 = 0x0100U, + p9 = 0x0200U, + p10 = 0x0400U, + p11 = 0x0800U, + p12 = 0x1000U, + p13 = 0x2000U, + p14 = 0x4000U, + p15 = 0x8000U, + all = 0xFFFFU +}; + +struct port_a { + static constexpr uint8_t c_pin_num = 16; + static inline GPIO_TypeDef * port = reinterpret_cast(GPIOA); + static void init_clock () { + __HAL_RCC_GPIOA_CLK_ENABLE(); + } +}; + +template +class gpio_stm32 : public gpio { +public: + gpio_stm32(pin the_pin, const std::function & on_press = nullptr) + : gpio(on_press), the_pin_(the_pin) { + Port::init_clock(); + + GPIO_InitTypeDef GPIO_InitStruct { static_cast(the_pin), + GPIO_MODE_IT_RISING, + GPIO_NOPULL, + GPIO_SPEED_FREQ_LOW, + 0 }; + HAL_GPIO_Init(Port::port, &GPIO_InitStruct); + + if(on_press) { + enable_interrupt(); + } + } + + [[nodiscard]] bool is_interrupt_generated() const override { + return __HAL_GPIO_EXTI_GET_IT(static_cast(the_pin_)); + } + void clear_interrupt_flag() const override { + __HAL_GPIO_EXTI_CLEAR_IT(static_cast(the_pin_)); + } +private: + pin the_pin_ = pin::p_invalid; + + void enable_interrupt() { + // TODO: check EXTI line macro according to pin used + HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI4_15_IRQn); + } +}; +}; \ No newline at end of file diff --git a/Chapter18/cib/hal/gpio/src/gpio.cpp b/Chapter18/cib/hal/gpio/src/gpio.cpp new file mode 100644 index 0000000..55043f4 --- /dev/null +++ b/Chapter18/cib/hal/gpio/src/gpio.cpp @@ -0,0 +1,21 @@ +#include +#include + +namespace hal { + +gpio::gpio(const std::function & on_press) { + on_press_ = on_press; + gpio_interrupt_manager::register_interrupt_handler(this); +} + +void gpio::execute_interrupt_handler () const { + if(is_interrupt_generated()) + { + clear_interrupt_flag(); + if(on_press_) { + on_press_(); + } + } +} + +}; \ No newline at end of file diff --git a/Chapter18/cib/hal/gpio/src/gpio_interrupt_manager.cpp b/Chapter18/cib/hal/gpio/src/gpio_interrupt_manager.cpp new file mode 100644 index 0000000..b1e5cb2 --- /dev/null +++ b/Chapter18/cib/hal/gpio/src/gpio_interrupt_manager.cpp @@ -0,0 +1,17 @@ +#include + +namespace hal { + +void gpio_interrupt_manager::register_interrupt_handler(gpio * pin) { + gpio_handlers.at(w_idx++) = pin; +} + +void gpio_interrupt_manager::execute_interrupt_handlers() { + for(std::size_t i = 0; i < w_idx; i++) { + gpio_handlers[i]->execute_interrupt_handler(); + } +} +extern "C" void EXTI4_15_IRQHandler(void) { + gpio_interrupt_manager::execute_interrupt_handlers(); +} +}; \ No newline at end of file diff --git a/Chapter18/cib/hal/inc/hal.hpp b/Chapter18/cib/hal/inc/hal.hpp new file mode 100644 index 0000000..c57083b --- /dev/null +++ b/Chapter18/cib/hal/inc/hal.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include + +#include + +namespace hal +{ +inline void init() +{ + HAL_Init(); +} + +inline std::uint32_t get_pc() +{ + std::uint32_t pc; + __asm volatile ("mov %0, pc" : "=r" (pc) ); + return pc; +} + +struct time +{ + static std::uint32_t get_ms() + { + return HAL_GetTick(); + } + + static void delay_ms(uint32_t delay) + { + HAL_Delay(delay); + } +}; +}; // namespace hal \ No newline at end of file diff --git a/Chapter18/cib/hal/uart/inc/stm32f0xx_hal_uart.hpp b/Chapter18/cib/hal/uart/inc/stm32f0xx_hal_uart.hpp new file mode 100644 index 0000000..309e1ce --- /dev/null +++ b/Chapter18/cib/hal/uart/inc/stm32f0xx_hal_uart.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +namespace hal::stm32{ + struct uart { + uart() = delete; + + static inline HAL_StatusTypeDef init(UART_HandleTypeDef *huart) { + return HAL_UART_Init(huart); + } + + static inline HAL_StatusTypeDef transmit(UART_HandleTypeDef *huart, + uint8_t *pData, + uint16_t Size, + uint32_t Timeout) { + return HAL_UART_Transmit(huart, pData, Size, Timeout); + } + }; +}; \ No newline at end of file diff --git a/Chapter18/cib/hal/uart/inc/uart.hpp b/Chapter18/cib/hal/uart/inc/uart.hpp new file mode 100644 index 0000000..b9756ad --- /dev/null +++ b/Chapter18/cib/hal/uart/inc/uart.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +namespace hal +{ +class uart +{ + public: + virtual void init(std::uint32_t baudrate) = 0; + virtual void write(std::span data) = 0; +}; +}; // namespace hal diff --git a/Chapter18/cib/hal/uart/inc/uart_stm32.hpp b/Chapter18/cib/hal/uart/inc/uart_stm32.hpp new file mode 100644 index 0000000..29fe979 --- /dev/null +++ b/Chapter18/cib/hal/uart/inc/uart_stm32.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include +#include + +#include + +#include + +namespace hal +{ +template +class uart_stm32 : public uart +{ + public: + uart_stm32(USART_TypeDef *inst) : instance_(inst) {} + + void init(std::uint32_t baudrate = c_baudrate_default) override { + huart_.Instance = instance_; + huart_.Init.BaudRate = baudrate; + huart_.Init.WordLength = UART_WORDLENGTH_8B; + huart_.Init.StopBits = UART_STOPBITS_1; + huart_.Init.Parity = UART_PARITY_NONE; + huart_.Init.Mode = UART_MODE_TX_RX; + huart_.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart_.Init.OverSampling = UART_OVERSAMPLING_16; + huart_.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart_.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + // TODO: add GPIO initialization for real hardware + huart_.MspInitCallback = nullptr; + HalUart::init(&huart_); + } + void write(std::span data) override { + // we must cast away costness due to ST HAL's API + char * data_ptr = const_cast(data.data()); + HalUart::transmit(&huart_, reinterpret_cast(data_ptr), data.size(), + HAL_MAX_DELAY); + } + + private: + UART_HandleTypeDef huart_; + USART_TypeDef *instance_; + std::uint32_t baudrate_; + static constexpr std::uint32_t c_baudrate_default = 115200; +}; +}; // namespace hal diff --git a/Chapter18/cib/hal/uart/src/uart_stm32.cpp b/Chapter18/cib/hal/uart/src/uart_stm32.cpp new file mode 100644 index 0000000..3cc165b --- /dev/null +++ b/Chapter18/cib/hal/uart/src/uart_stm32.cpp @@ -0,0 +1,34 @@ +#include + +template +hal::uart_stm32::uart_stm32(USART_TypeDef *inst) + : instance_(inst) +{ +} + +template +void hal::uart_stm32::init(std::uint32_t baudrate) +{ + huart_.Instance = instance_; + huart_.Init.BaudRate = baudrate; + huart_.Init.WordLength = UART_WORDLENGTH_8B; + huart_.Init.StopBits = UART_STOPBITS_1; + huart_.Init.Parity = UART_PARITY_NONE; + huart_.Init.Mode = UART_MODE_TX_RX; + huart_.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart_.Init.OverSampling = UART_OVERSAMPLING_16; + huart_.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart_.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + // TODO: add GPIO initialization for real hardware + huart_.MspInitCallback = nullptr; + HalUart::init(&huart_); +} + +template +void hal::uart_stm32::write(std::span data) +{ + // we must cast away costness due to ST HAL's API + char * data_ptr = const_cast(data.data()); + HalUart::transmit(&huart_, reinterpret_cast(data_ptr), data.size(), + HAL_MAX_DELAY); +} \ No newline at end of file diff --git a/Chapter18/cib/libs/boost/mp11.hpp b/Chapter18/cib/libs/boost/mp11.hpp new file mode 100644 index 0000000..5e45939 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11.hpp @@ -0,0 +1,22 @@ +#ifndef BOOST_MP11_HPP_INCLUDED +#define BOOST_MP11_HPP_INCLUDED + +// Copyright 2015 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif // #ifndef BOOST_MP11_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/algorithm.hpp b/Chapter18/cib/libs/boost/mp11/algorithm.hpp new file mode 100644 index 0000000..be377f5 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/algorithm.hpp @@ -0,0 +1,1327 @@ +#ifndef BOOST_MP11_ALGORITHM_HPP_INCLUDED +#define BOOST_MP11_ALGORITHM_HPP_INCLUDED + +// Copyright 2015-2019 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_transform +namespace detail +{ + +template class F, class... L> struct mp_transform_impl +{ +}; + +template class F, template class L, class... T> struct mp_transform_impl> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + + template struct f { using type = F; }; + + using type = L::type...>; + +#else + + using type = L...>; + +#endif +}; + +template class F, template class L1, class... T1, template class L2, class... T2> struct mp_transform_impl, L2> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + + template struct f { using type = F; }; + + using type = L1::type...>; + +#else + + using type = L1...>; + +#endif +}; + +template class F, template class L1, class... T1, template class L2, class... T2, template class L3, class... T3> struct mp_transform_impl, L2, L3> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + + template struct f { using type = F; }; + + using type = L1::type...>; + +#else + + using type = L1...>; + +#endif +}; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, == 1900 ) || BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 40800 ) + +template using mp_same_size_1 = mp_same...>; +template struct mp_same_size_2: mp_defer {}; + +#endif + +struct list_size_mismatch +{ +}; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +template class F, class... L> struct mp_transform_cuda_workaround +{ + using type = mp_if...>, detail::mp_transform_impl, detail::list_size_mismatch>; +}; + +#endif + +} // namespace detail + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, == 1900 ) || BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 40800 ) + +template class F, class... L> using mp_transform = typename mp_if::type, detail::mp_transform_impl, detail::list_size_mismatch>::type; + +#else + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +template class F, class... L> using mp_transform = typename detail::mp_transform_cuda_workaround< F, L...>::type::type; + +#else + +template class F, class... L> using mp_transform = typename mp_if...>, detail::mp_transform_impl, detail::list_size_mismatch>::type; + +#endif + +#endif + +template using mp_transform_q = mp_transform; + +namespace detail +{ + +template class F, template class L1, class... T1, template class L2, class... T2, template class L3, class... T3, template class L4, class... T4, class... L> struct mp_transform_impl, L2, L3, L4, L...> +{ + using A1 = L1...>; + + template using _f = mp_transform; + + using A2 = mp_fold, A1, _f>; + + template using _g = mp_apply; + + using type = mp_transform<_g, A2>; +}; + +} // namespace detail + +// mp_transform_if +namespace detail +{ + +template class P, template class F, class... L> struct mp_transform_if_impl +{ + // the stupid quote-unquote dance avoids "pack expansion used as argument for non-pack parameter of alias template" + + using Qp = mp_quote

; + using Qf = mp_quote; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + + template struct _f_ { using type = mp_eval_if_q>, mp_first>, Qf, U...>; }; + template using _f = typename _f_::type; + +#else + + template using _f = mp_eval_if_q>, mp_first>, Qf, U...>; + +#endif + + using type = mp_transform<_f, L...>; +}; + +} // namespace detail + +template class P, template class F, class... L> using mp_transform_if = typename detail::mp_transform_if_impl::type; +template using mp_transform_if_q = typename detail::mp_transform_if_impl::type; + +// mp_filter +namespace detail +{ + +template class P, class L1, class... L> struct mp_filter_impl +{ + using Qp = mp_quote

; + + template using _f = mp_if< mp_invoke_q, mp_list, mp_list<> >; + + using _t1 = mp_transform<_f, L1, L...>; + using _t2 = mp_apply; + + using type = mp_assign; +}; + +} // namespace detail + +template class P, class... L> using mp_filter = typename detail::mp_filter_impl::type; +template using mp_filter_q = typename detail::mp_filter_impl::type; + +// mp_fill +namespace detail +{ + +template struct mp_fill_impl +{ +// An error "no type named 'type'" here means that the L argument of mp_fill is not a list +}; + +template class L, class... T, class V> struct mp_fill_impl, V> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1900 ) + + template struct _f { using type = V; }; + using type = L::type...>; + +#else + + template using _f = V; + using type = L<_f...>; + +#endif +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto... A, class V> struct mp_fill_impl, V> +{ + using type = L<((void)A, V::value)...>; +}; + +#endif + +} // namespace detail + +template using mp_fill = typename detail::mp_fill_impl::type; + +// mp_contains +template using mp_contains = mp_to_bool>; + +// mp_repeat(_c) +namespace detail +{ + +template struct mp_repeat_c_impl +{ + using _l1 = typename mp_repeat_c_impl::type; + using _l2 = typename mp_repeat_c_impl::type; + + using type = mp_append<_l1, _l1, _l2>; +}; + +template struct mp_repeat_c_impl +{ + using type = mp_clear; +}; + +template struct mp_repeat_c_impl +{ + using type = L; +}; + +} // namespace detail + +template using mp_repeat_c = typename detail::mp_repeat_c_impl::type; +template using mp_repeat = typename detail::mp_repeat_c_impl::type; + +// mp_product +namespace detail +{ + +template class F, class P, class... L> struct mp_product_impl_2 +{ +}; + +template class F, class P> struct mp_product_impl_2 +{ + using type = mp_list>; +}; + +template class F, class P, template class L1, class... T1, class... L> struct mp_product_impl_2, L...> +{ + using type = mp_append, L...>::type...>; +}; + +template class F, class... L> struct mp_product_impl +{ +}; + +template class F> struct mp_product_impl +{ + using type = mp_list< F<> >; +}; + +template class F, class L1, class... L> struct mp_product_impl +{ + using type = mp_assign, L1, L...>::type>; +}; + +} // namespace detail + +template class F, class... L> using mp_product = typename detail::mp_product_impl::type; +template using mp_product_q = typename detail::mp_product_impl::type; + +// mp_drop(_c) +namespace detail +{ + +template struct mp_drop_impl; + +template class L, class... T, template class L2, class... U> struct mp_drop_impl, L2, mp_true> +{ + template static mp_identity> f( U*..., mp_identity*... ); + + using R = decltype( f( static_cast*>(0) ... ) ); + + using type = typename R::type; +}; + +} // namespace detail + +template using mp_drop_c = mp_assign, mp_repeat_c, N>, mp_bool::value>>::type>; + +template using mp_drop = mp_drop_c; + +// mp_from_sequence +namespace detail +{ + +template struct mp_from_sequence_impl; + +template class S, class U, U... J, class F> struct mp_from_sequence_impl, F> +{ + using type = mp_list_c; +}; + +} // namespace detail + +template> using mp_from_sequence = typename detail::mp_from_sequence_impl::type; + +// mp_iota(_c) +template using mp_iota_c = mp_from_sequence, mp_size_t>; +template> using mp_iota = mp_from_sequence::type, N::value>, F>; + +// mp_at(_c) +namespace detail +{ + +template struct mp_at_c_impl; + +#if defined(BOOST_MP11_HAS_TYPE_PACK_ELEMENT) + +template class L, class... T, std::size_t I> struct mp_at_c_impl, I> +{ + using type = __type_pack_element; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto... A, std::size_t I> struct mp_at_c_impl, I> +{ + using type = __type_pack_element...>; +}; + +#endif + +#else + +template struct mp_at_c_impl +{ + using _map = mp_transform >, mp_rename>; + using type = mp_second > >; +}; + +#endif + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +template struct mp_at_c_cuda_workaround +{ + using type = mp_if_c<(I < mp_size::value), detail::mp_at_c_impl, void>; +}; + +#endif + +} // namespace detail + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +template using mp_at_c = typename detail::mp_at_c_cuda_workaround< L, I >::type::type; + +#else + +template using mp_at_c = typename mp_if_c<(I < mp_size::value), detail::mp_at_c_impl, void>::type; + +#endif + +template using mp_at = mp_at_c; + +// mp_take(_c) +namespace detail +{ + +template struct mp_take_c_impl +{ +}; + +template class L, class... T> +struct mp_take_c_impl<0, L> +{ + using type = L<>; +}; + +template class L, class T1, class... T> +struct mp_take_c_impl<1, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class... T> +struct mp_take_c_impl<2, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class... T> +struct mp_take_c_impl<3, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class... T> +struct mp_take_c_impl<4, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class... T> +struct mp_take_c_impl<5, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class... T> +struct mp_take_c_impl<6, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class... T> +struct mp_take_c_impl<7, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class... T> +struct mp_take_c_impl<8, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class... T> +struct mp_take_c_impl<9, L> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, std::size_t N> +struct mp_take_c_impl, typename std::enable_if= 10>::type> +{ + using type = mp_append, typename mp_take_c_impl>::type>; +}; + +} // namespace detail + +template using mp_take_c = mp_assign>::type>; +template using mp_take = mp_take_c; + +// mp_back +template using mp_back = mp_at_c::value - 1>; + +// mp_pop_back +template using mp_pop_back = mp_take_c::value - 1>; + +// mp_replace +namespace detail +{ + +template struct mp_replace_impl; + +template class L, class... T, class V, class W> struct mp_replace_impl, V, W> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + template struct _f { using type = mp_if, W, A>; }; + using type = L::type...>; +#else + template using _f = mp_if, W, A>; + using type = L<_f...>; +#endif +}; + +} // namespace detail + +template using mp_replace = typename detail::mp_replace_impl::type; + +// mp_replace_if +namespace detail +{ + +template class P, class W> struct mp_replace_if_impl; + +template class L, class... T, template class P, class W> struct mp_replace_if_impl, P, W> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + template struct _f { using type = mp_if, W, U>; }; + using type = L::type...>; +#else + template using _f = mp_if, W, U>; + using type = L<_f...>; +#endif +}; + +} // namespace detail + +template class P, class W> using mp_replace_if = typename detail::mp_replace_if_impl::type; +template using mp_replace_if_q = mp_replace_if; + +// mp_copy_if +// in detail/mp_copy_if.hpp + +// mp_remove +namespace detail +{ + +template struct mp_remove_impl; + +template class L, class... T, class V> struct mp_remove_impl, V> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + template struct _f { using type = mp_if, mp_list<>, mp_list>; }; + using type = mp_append, typename _f::type...>; +#else + template using _f = mp_if, mp_list<>, mp_list>; + using type = mp_append, _f...>; +#endif +}; + +} // namespace detail + +template using mp_remove = typename detail::mp_remove_impl::type; + +// mp_remove_if +// in detail/mp_remove_if.hpp + +// mp_flatten> +namespace detail +{ + +template struct mp_flatten_impl +{ + template using fn = mp_if, T, mp_list>; +}; + +} // namespace detail + +template> using mp_flatten = mp_apply, L>, mp_clear>>; + +// mp_partition +namespace detail +{ + +template class P> struct mp_partition_impl; + +template class L, class... T, template class P> struct mp_partition_impl, P> +{ + using type = L, P>, mp_remove_if, P>>; +}; + +} // namespace detail + +template class P> using mp_partition = typename detail::mp_partition_impl::type; +template using mp_partition_q = mp_partition; + +// mp_sort +namespace detail +{ + +template class P> struct mp_sort_impl; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template class L, class... T, template class P> struct mp_sort_impl, P> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = L<>; +}; + +#else + +template class L, template class P> struct mp_sort_impl, P> +{ + using type = L<>; +}; + +#endif + +template class L, class T1, template class P> struct mp_sort_impl, P> +{ + using type = L; +}; + +template class L, class T1, class... T, template class P> struct mp_sort_impl, P> +{ + template using F = P; + + using part = mp_partition, F>; + + using S1 = typename mp_sort_impl, P>::type; + using S2 = typename mp_sort_impl, P>::type; + + using type = mp_append, S2>; +}; + +} // namespace detail + +template class P> using mp_sort = typename detail::mp_sort_impl::type; +template using mp_sort_q = mp_sort; + +// mp_nth_element(_c) +namespace detail +{ + +template class P> struct mp_nth_element_impl; + +template class L, class T1, std::size_t I, template class P> struct mp_nth_element_impl, I, P> +{ + static_assert( I == 0, "mp_nth_element index out of range" ); + using type = T1; +}; + +template class L, class T1, class... T, std::size_t I, template class P> struct mp_nth_element_impl, I, P> +{ + static_assert( I < 1 + sizeof...(T), "mp_nth_element index out of range" ); + + template using F = P; + + using part = mp_partition, F>; + + using L1 = mp_first; + static std::size_t const N1 = mp_size::value; + + using L2 = mp_second; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + + struct detail + { + struct mp_nth_element_impl_cuda_workaround + { + using type = mp_cond< + + mp_bool<(I < N1)>, mp_nth_element_impl, + mp_bool<(I == N1)>, mp_identity, + mp_true, mp_nth_element_impl + + >; + }; + }; + + using type = typename detail::mp_nth_element_impl_cuda_workaround::type::type; + +#else + + using type = typename mp_cond< + + mp_bool<(I < N1)>, mp_nth_element_impl, + mp_bool<(I == N1)>, mp_identity, + mp_true, mp_nth_element_impl + + >::type; + +#endif +}; + +} // namespace detail + +template class P> using mp_nth_element_c = typename detail::mp_nth_element_impl::type; +template class P> using mp_nth_element = typename detail::mp_nth_element_impl::type; +template using mp_nth_element_q = mp_nth_element; + +// mp_find +namespace detail +{ + +template struct mp_find_impl; + +#if BOOST_MP11_CLANG && defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) + +struct mp_index_holder +{ + std::size_t i_; + bool f_; +}; + +constexpr inline mp_index_holder operator+( mp_index_holder const & v, bool f ) +{ + if( v.f_ ) + { + return v; + } + else if( f ) + { + return { v.i_, true }; + } + else + { + return { v.i_ + 1, false }; + } +} + +template class L, class... T, class V> struct mp_find_impl, V> +{ + static constexpr mp_index_holder _v{ 0, false }; + using type = mp_size_t< (_v + ... + std::is_same::value).i_ >; +}; + +#elif !defined( BOOST_MP11_NO_CONSTEXPR ) + +template class L, class V> struct mp_find_impl, V> +{ + using type = mp_size_t<0>; +}; + +#if defined( BOOST_MP11_HAS_CXX14_CONSTEXPR ) + +constexpr std::size_t cx_find_index( bool const * first, bool const * last ) +{ + std::size_t m = 0; + + while( first != last && !*first ) + { + ++m; + ++first; + } + + return m; +} + +#else + +constexpr std::size_t cx_find_index( bool const * first, bool const * last ) +{ + return first == last || *first? 0: 1 + cx_find_index( first + 1, last ); +} + +#endif + +template class L, class... T, class V> struct mp_find_impl, V> +{ + static constexpr bool _v[] = { std::is_same::value... }; + using type = mp_size_t< cx_find_index( _v, _v + sizeof...(T) ) >; +}; + +#else + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template class L, class... T, class V> struct mp_find_impl, V> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = mp_size_t<0>; +}; + +#else + +template class L, class V> struct mp_find_impl, V> +{ + using type = mp_size_t<0>; +}; + +#endif + +template class L, class... T, class V> struct mp_find_impl, V> +{ + using type = mp_size_t<0>; +}; + +template class L, class T1, class... T, class V> struct mp_find_impl, V> +{ + using _r = typename mp_find_impl, V>::type; + using type = mp_size_t<1 + _r::value>; +}; + +#endif + +} // namespace detail + +template using mp_find = typename detail::mp_find_impl::type; + +// mp_find_if +namespace detail +{ + +template class P> struct mp_find_if_impl; + +#if BOOST_MP11_CLANG && defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) + +template class L, class... T, template class P> struct mp_find_if_impl, P> +{ + static constexpr mp_index_holder _v{ 0, false }; + using type = mp_size_t< (_v + ... + P::value).i_ >; +}; + +#elif !defined( BOOST_MP11_NO_CONSTEXPR ) + +template class L, template class P> struct mp_find_if_impl, P> +{ + using type = mp_size_t<0>; +}; + +template class L, class... T, template class P> struct mp_find_if_impl, P> +{ + static constexpr bool _v[] = { P::value... }; + using type = mp_size_t< cx_find_index( _v, _v + sizeof...(T) ) >; +}; + +#else + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template class L, class... T, template class P> struct mp_find_if_impl, P> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = mp_size_t<0>; +}; + +#else + +template class L, template class P> struct mp_find_if_impl, P> +{ + using type = mp_size_t<0>; +}; + +#endif + +template class P> struct mp_find_if_impl_2 +{ + using _r = typename mp_find_if_impl::type; + using type = mp_size_t<1 + _r::value>; +}; + +template class L, class T1, class... T, template class P> struct mp_find_if_impl, P> +{ + using type = typename mp_if, mp_identity>, mp_find_if_impl_2, P>>::type; +}; + +#endif + +} // namespace detail + +template class P> using mp_find_if = typename detail::mp_find_if_impl::type; +template using mp_find_if_q = mp_find_if; + +// mp_reverse +namespace detail +{ + +template struct mp_reverse_impl; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template class L, class... T> struct mp_reverse_impl> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = L<>; +}; + +#else + +template class L> struct mp_reverse_impl> +{ + using type = L<>; +}; + +#endif + +template class L, class T1> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T> struct mp_reverse_impl> +{ + using type = mp_push_back>::type, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1>; +}; + +} // namespace detail + +template using mp_reverse = typename detail::mp_reverse_impl::type; + +// mp_fold +// in detail/mp_fold.hpp + +// mp_reverse_fold +namespace detail +{ + +template class F> struct mp_reverse_fold_impl; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template class L, class... T, class V, template class F> struct mp_reverse_fold_impl, V, F> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = V; +}; + +#else + +template class L, class V, template class F> struct mp_reverse_fold_impl, V, F> +{ + using type = V; +}; + +#endif + +template class L, class T1, class... T, class V, template class F> struct mp_reverse_fold_impl, V, F> +{ + using rest = typename mp_reverse_fold_impl, V, F>::type; + using type = F; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, class V, template class F> struct mp_reverse_fold_impl, V, F> +{ + using rest = typename mp_reverse_fold_impl, V, F>::type; + using type = F > > > > > > > > >; +}; + +} // namespace detail + +template class F> using mp_reverse_fold = typename detail::mp_reverse_fold_impl::type; +template using mp_reverse_fold_q = mp_reverse_fold; + +// mp_unique +namespace detail +{ + +template struct mp_unique_impl; + +template class L, class... T> struct mp_unique_impl> +{ + using type = mp_set_push_back, T...>; +}; + +} // namespace detail + +template using mp_unique = typename detail::mp_unique_impl::type; + +// mp_unique_if +namespace detail +{ + +template class P> struct mp_unique_if_push_back +{ + template struct impl + { + }; + + template class L, class... Ts, class T> + struct impl, T> + { + using type = mp_if...>, L, L>; + }; + + template using fn = typename impl::type; +}; + +} // namespace detail + +template class P> +using mp_unique_if = mp_fold_q, detail::mp_unique_if_push_back

>; + +template using mp_unique_if_q = mp_unique_if; + +// mp_all_of +template class P> using mp_all_of = mp_bool< mp_count_if::value == mp_size::value >; +template using mp_all_of_q = mp_all_of; + +// mp_none_of +template class P> using mp_none_of = mp_bool< mp_count_if::value == 0 >; +template using mp_none_of_q = mp_none_of; + +// mp_any_of +template class P> using mp_any_of = mp_bool< mp_count_if::value != 0 >; +template using mp_any_of_q = mp_any_of; + +// mp_replace_at_c +namespace detail +{ + +template struct mp_replace_at_impl +{ + static_assert( I::value >= 0, "mp_replace_at: I must not be negative" ); + + template using _p = std::is_same>; + template using _f = W; + + using type = mp_transform_if<_p, _f, L, mp_iota > >; +}; + +} // namespace detail + +template using mp_replace_at = typename detail::mp_replace_at_impl::type; +template using mp_replace_at_c = typename detail::mp_replace_at_impl, W>::type; + +//mp_for_each(f) +namespace detail +{ + +template BOOST_MP11_CONSTEXPR F mp_for_each_impl( mp_list, F && f ) +{ + using A = int[sizeof...(T)]; + return (void)A{ ((void)f(T()), 0)... }, std::forward(f); +} + +template BOOST_MP11_CONSTEXPR F mp_for_each_impl( mp_list<>, F && f ) +{ + return std::forward(f); +} + +} // namespace detail + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, >= 1900 ) + +// msvc has a limit of 1024 + +template BOOST_MP11_CONSTEXPR mp_if_c::value <= 1024, F> mp_for_each( F && f ) +{ + return detail::mp_for_each_impl( mp_rename(), std::forward(f) ); +} + +template BOOST_MP11_CONSTEXPR mp_if_c::value >= 1025, F> mp_for_each( F && f ) +{ + using L2 = mp_rename; + + using L3 = mp_take_c; + using L4 = mp_drop_c; + + return mp_for_each( mp_for_each( std::forward(f) ) ); +} + +#else + +template BOOST_MP11_CONSTEXPR F mp_for_each( F && f ) +{ + return detail::mp_for_each_impl( mp_rename(), std::forward(f) ); +} + +#endif + +// mp_insert +template using mp_insert = mp_append, mp_push_front, T...>>; + +// mp_insert_c +template using mp_insert_c = mp_append, mp_push_front, T...>>; + +// mp_erase +template using mp_erase = mp_append, mp_drop>; + +// mp_erase_c +template using mp_erase_c = mp_append, mp_drop_c>; + +// mp_starts_with +// contributed by Glen Joseph Fernandes (glenjofe@gmail.com) +namespace detail { + +template +struct mp_starts_with_impl { }; + +template class L1, class... T1, template class L2, + class... T2> +struct mp_starts_with_impl, L2 > { + template + static mp_false check(L); + + template + static mp_true check(mp_list); + + using type = decltype(check(mp_list())); +}; + +} // namespace detail + +template +using mp_starts_with = typename detail::mp_starts_with_impl::type; + +// mp_rotate_left(_c) +namespace detail +{ + +// limit divisor to 1 to avoid division by 0 and give a rotation of 0 for lists containing 0 or 1 elements +template using canonical_left_rotation = mp_size_t; + +// perform right rotation as a left rotation by inverting the number of elements to rotate +template using canonical_right_rotation = mp_size_t; + +// avoid errors when rotating fixed-sized lists by using mp_list for the transformation +template> using mp_rotate_impl = mp_assign, mp_take >>; + +} // namespace detail + +template using mp_rotate_left_c = detail::mp_rotate_impl::value, N>>; +template using mp_rotate_left = mp_rotate_left_c; + +// mp_rotate_right(_c) +template using mp_rotate_right_c = mp_rotate_left::value, N>>; +template using mp_rotate_right = mp_rotate_right_c; + +// mp_min_element +// mp_max_element +// in detail/mp_min_element.hpp + +// mp_power_set +namespace detail +{ + +template struct mp_power_set_impl; + +} // namespace detail + +template using mp_power_set = typename detail::mp_power_set_impl::type; + +namespace detail +{ + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template class L, class... T> struct mp_power_set_impl< L > +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = L< L<> >; +}; + +#else + +template class L> struct mp_power_set_impl< L<> > +{ + using type = L< L<> >; +}; + +#endif + +template class L, class T1, class... T> struct mp_power_set_impl< L > +{ + using S1 = mp_power_set< L >; + + template using _f = mp_push_front; + + using S2 = mp_transform<_f, S1>; + + using type = mp_append< S1, S2 >; +}; + +} // namespace detail + +// mp_partial_sum +namespace detail +{ + +template class F> struct mp_partial_sum_impl_f +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1900 ) + + template using fn = mp_list, T>, mp_push_back, F, T>> >; + +#else + + template, T>> using fn = mp_list, N>>; + +#endif +}; + +} // namespace detail + +template class F> using mp_partial_sum = mp_second>, detail::mp_partial_sum_impl_f> >; +template using mp_partial_sum_q = mp_partial_sum; + +// mp_iterate +namespace detail +{ + +template class F, template class R, class N> struct mp_iterate_impl; + +} // namespace detail + +template class F, template class R> using mp_iterate = typename detail::mp_iterate_impl>::type; + +namespace detail +{ + +template class F, template class R> struct mp_iterate_impl +{ + template using _f = mp_list>; + using type = mp_eval_or, _f, V>; +}; + +template class F, template class R> struct mp_iterate_impl +{ + using type = mp_push_front, F, R>, F>; +}; + +} // namespace detail + +template using mp_iterate_q = mp_iterate; + +// mp_pairwise_fold +namespace detail +{ + +template using mp_pairwise_fold_impl = mp_transform_q, mp_pop_front>; + +} // namespace detail + +template using mp_pairwise_fold_q = mp_eval_if, mp_clear, detail::mp_pairwise_fold_impl, L, Q>; +template class F> using mp_pairwise_fold = mp_pairwise_fold_q>; + +// mp_intersperse +namespace detail +{ + +template struct mp_intersperse_impl +{ +}; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template class L, class... T, class S> struct mp_intersperse_impl, S> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = L<>; +}; + +#else + +template class L, class S> struct mp_intersperse_impl, S> +{ + using type = L<>; +}; + +#endif + +template class L, class T1, class... T, class S> struct mp_intersperse_impl, S> +{ + using type = mp_append, L...>; +}; + +} // namespace detail + +template using mp_intersperse = typename detail::mp_intersperse_impl::type; + +// mp_split +namespace detail +{ + +template struct mp_split_impl; + +} // namespace detail + +template using mp_split = typename detail::mp_split_impl>::type; + +namespace detail +{ + +template using mp_split_impl_ = mp_push_front, S>, mp_take>; + +template struct mp_split_impl +{ + using type = mp_eval_if_c::value == J::value, mp_push_back, L>, mp_split_impl_, L, S, J>; +}; + +} // namespace detail + +// mp_join + +template using mp_join = mp_apply>>; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_ALGORITHM_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/bind.hpp b/Chapter18/cib/libs/boost/mp11/bind.hpp new file mode 100644 index 0000000..bbdecd2 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/bind.hpp @@ -0,0 +1,111 @@ +#ifndef BOOST_MP11_BIND_HPP_INCLUDED +#define BOOST_MP11_BIND_HPP_INCLUDED + +// Copyright 2017, 2018 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_bind_front +template class F, class... T> struct mp_bind_front +{ + // the indirection through mp_defer works around the language inability + // to expand U... into a fixed parameter list of an alias template + + template using fn = typename mp_defer::type; +}; + +template using mp_bind_front_q = mp_bind_front; + +// mp_bind_back +template class F, class... T> struct mp_bind_back +{ + template using fn = typename mp_defer::type; +}; + +template using mp_bind_back_q = mp_bind_back; + +// mp_arg +template struct mp_arg +{ + template using fn = mp_at_c, I>; +}; + +using _1 = mp_arg<0>; +using _2 = mp_arg<1>; +using _3 = mp_arg<2>; +using _4 = mp_arg<3>; +using _5 = mp_arg<4>; +using _6 = mp_arg<5>; +using _7 = mp_arg<6>; +using _8 = mp_arg<7>; +using _9 = mp_arg<8>; + +// mp_bind +template class F, class... T> struct mp_bind; + +namespace detail +{ + +template struct eval_bound_arg +{ + using type = V; +}; + +template struct eval_bound_arg, T...> +{ + using type = typename mp_arg::template fn; +}; + +template class F, class... U, class... T> struct eval_bound_arg, T...> +{ + using type = typename mp_bind::template fn; +}; + +template class F, class... U, class... T> struct eval_bound_arg, T...> +{ + using type = typename mp_bind_front::template fn; +}; + +template class F, class... U, class... T> struct eval_bound_arg, T...> +{ + using type = typename mp_bind_back::template fn; +}; + +} // namespace detail + +template class F, class... T> struct mp_bind +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, == 1915 ) +private: + + template struct _f { using type = F::type...>; }; + +public: + + template using fn = typename _f::type; + +#else + + template using fn = F::type...>; + +#endif +}; + +template using mp_bind_q = mp_bind; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_BIND_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/config.hpp b/Chapter18/cib/libs/boost/mp11/detail/config.hpp new file mode 100644 index 0000000..44686c7 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/config.hpp @@ -0,0 +1,149 @@ +#ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED +#define BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED + +// Copyright 2016, 2018, 2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +// BOOST_MP11_WORKAROUND + +#if defined( BOOST_STRICT_CONFIG ) || defined( BOOST_MP11_NO_WORKAROUNDS ) + +# define BOOST_MP11_WORKAROUND( symbol, test ) 0 + +#else + +# define BOOST_MP11_WORKAROUND( symbol, test ) ((symbol) != 0 && ((symbol) test)) + +#endif + +// + +#define BOOST_MP11_CUDA 0 +#define BOOST_MP11_CLANG 0 +#define BOOST_MP11_INTEL 0 +#define BOOST_MP11_GCC 0 +#define BOOST_MP11_MSVC 0 + +#define BOOST_MP11_CONSTEXPR constexpr + +#if defined( __CUDACC__ ) + +// nvcc + +# undef BOOST_MP11_CUDA +# define BOOST_MP11_CUDA (__CUDACC_VER_MAJOR__ * 1000000 + __CUDACC_VER_MINOR__ * 10000 + __CUDACC_VER_BUILD__) + +// CUDA (8.0) has no constexpr support in msvc mode: +# if defined(_MSC_VER) && (BOOST_MP11_CUDA < 9000000) + +# define BOOST_MP11_NO_CONSTEXPR + +# undef BOOST_MP11_CONSTEXPR +# define BOOST_MP11_CONSTEXPR + +# endif + +#endif + +#if defined(__clang__) + +// Clang + +# undef BOOST_MP11_CLANG +# define BOOST_MP11_CLANG (__clang_major__ * 100 + __clang_minor__) + +# if defined(__has_cpp_attribute) +# if __has_cpp_attribute(fallthrough) && __cplusplus >= 201406L // Clang 3.9+ in c++1z mode +# define BOOST_MP11_HAS_FOLD_EXPRESSIONS +# endif +# endif + +#if BOOST_MP11_CLANG < 400 && __cplusplus >= 201402L \ + && defined( __GLIBCXX__ ) && !__has_include() + +// Clang pre-4 in C++14 mode, libstdc++ pre-4.9, ::gets is not defined, +// but Clang tries to import it into std + + extern "C" char *gets (char *__s); +#endif + +#elif defined(__INTEL_COMPILER) + +// Intel C++ + +# undef BOOST_MP11_INTEL +# define BOOST_MP11_INTEL __INTEL_COMPILER + +#elif defined(__GNUC__) + +// g++ + +# undef BOOST_MP11_GCC +# define BOOST_MP11_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) + +#elif defined(_MSC_VER) + +// MS Visual C++ + +# undef BOOST_MP11_MSVC +# define BOOST_MP11_MSVC _MSC_VER + +# if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) +# define BOOST_MP11_NO_CONSTEXPR +# endif + +#if _MSC_FULL_VER < 190024210 // 2015u3 +# undef BOOST_MP11_CONSTEXPR +# define BOOST_MP11_CONSTEXPR +#endif + +#endif + +// BOOST_MP11_HAS_CXX14_CONSTEXPR + +#if !defined(BOOST_MP11_NO_CONSTEXPR) && defined(__cpp_constexpr) && __cpp_constexpr >= 201304 +# define BOOST_MP11_HAS_CXX14_CONSTEXPR +#endif + +// BOOST_MP11_HAS_FOLD_EXPRESSIONS + +#if !defined(BOOST_MP11_HAS_FOLD_EXPRESSIONS) && defined(__cpp_fold_expressions) && __cpp_fold_expressions >= 201603 +# define BOOST_MP11_HAS_FOLD_EXPRESSIONS +#endif + +// BOOST_MP11_HAS_TYPE_PACK_ELEMENT + +#if defined(__has_builtin) +# if __has_builtin(__type_pack_element) +# define BOOST_MP11_HAS_TYPE_PACK_ELEMENT +# endif +#endif + +// BOOST_MP11_HAS_TEMPLATE_AUTO + +#if defined(__cpp_nontype_template_parameter_auto) && __cpp_nontype_template_parameter_auto >= 201606L +# define BOOST_MP11_HAS_TEMPLATE_AUTO +#endif + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) +// mp_value<0> is bool, mp_value<-1L> is int, etc +# undef BOOST_MP11_HAS_TEMPLATE_AUTO +#endif + +// BOOST_MP11_DEPRECATED(msg) + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CLANG, < 304 ) +# define BOOST_MP11_DEPRECATED(msg) +#elif defined(__GNUC__) || defined(__clang__) +# define BOOST_MP11_DEPRECATED(msg) __attribute__((deprecated(msg))) +#elif defined(_MSC_VER) && _MSC_VER >= 1900 +# define BOOST_MP11_DEPRECATED(msg) [[deprecated(msg)]] +#else +# define BOOST_MP11_DEPRECATED(msg) +#endif + +#endif // #ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_append.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_append.hpp new file mode 100644 index 0000000..858ee24 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_append.hpp @@ -0,0 +1,321 @@ +#ifndef BOOST_MP11_DETAIL_MP_APPEND_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_APPEND_HPP_INCLUDED + +// Copyright 2015-2017 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_append + +namespace detail +{ + +// append_type_lists + +template struct mp_append_impl; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template struct mp_append_impl +{ +}; + +template<> struct mp_append_impl<> +{ + using type = mp_list<>; +}; + +template class L, class... T> struct mp_append_impl> +{ + using type = L; +}; + +template class L1, class... T1, template class L2, class... T2> struct mp_append_impl, L2> +{ + using type = L1; +}; + +template class L1, class... T1, template class L2, class... T2, template class L3, class... T3> struct mp_append_impl, L2, L3> +{ + using type = L1; +}; + +template class L1, class... T1, template class L2, class... T2, template class L3, class... T3, template class L4, class... T4> struct mp_append_impl, L2, L3, L4> +{ + using type = L1; +}; + +template class L1, class... T1, template class L2, class... T2, template class L3, class... T3, template class L4, class... T4, template class L5, class... T5, class... Lr> struct mp_append_impl, L2, L3, L4, L5, Lr...> +{ + using type = typename mp_append_impl, Lr...>::type; +}; + +#else + +template, class L2 = mp_list<>, class L3 = mp_list<>, class L4 = mp_list<>, class L5 = mp_list<>, class L6 = mp_list<>, class L7 = mp_list<>, class L8 = mp_list<>, class L9 = mp_list<>, class L10 = mp_list<>, class L11 = mp_list<>> struct append_11_impl +{ +}; + +template< + template class L1, class... T1, + template class L2, class... T2, + template class L3, class... T3, + template class L4, class... T4, + template class L5, class... T5, + template class L6, class... T6, + template class L7, class... T7, + template class L8, class... T8, + template class L9, class... T9, + template class L10, class... T10, + template class L11, class... T11> + +struct append_11_impl, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11> +{ + using type = L1; +}; + +template< + + class L00 = mp_list<>, class L01 = mp_list<>, class L02 = mp_list<>, class L03 = mp_list<>, class L04 = mp_list<>, class L05 = mp_list<>, class L06 = mp_list<>, class L07 = mp_list<>, class L08 = mp_list<>, class L09 = mp_list<>, class L0A = mp_list<>, + class L10 = mp_list<>, class L11 = mp_list<>, class L12 = mp_list<>, class L13 = mp_list<>, class L14 = mp_list<>, class L15 = mp_list<>, class L16 = mp_list<>, class L17 = mp_list<>, class L18 = mp_list<>, class L19 = mp_list<>, + class L20 = mp_list<>, class L21 = mp_list<>, class L22 = mp_list<>, class L23 = mp_list<>, class L24 = mp_list<>, class L25 = mp_list<>, class L26 = mp_list<>, class L27 = mp_list<>, class L28 = mp_list<>, class L29 = mp_list<>, + class L30 = mp_list<>, class L31 = mp_list<>, class L32 = mp_list<>, class L33 = mp_list<>, class L34 = mp_list<>, class L35 = mp_list<>, class L36 = mp_list<>, class L37 = mp_list<>, class L38 = mp_list<>, class L39 = mp_list<>, + class L40 = mp_list<>, class L41 = mp_list<>, class L42 = mp_list<>, class L43 = mp_list<>, class L44 = mp_list<>, class L45 = mp_list<>, class L46 = mp_list<>, class L47 = mp_list<>, class L48 = mp_list<>, class L49 = mp_list<>, + class L50 = mp_list<>, class L51 = mp_list<>, class L52 = mp_list<>, class L53 = mp_list<>, class L54 = mp_list<>, class L55 = mp_list<>, class L56 = mp_list<>, class L57 = mp_list<>, class L58 = mp_list<>, class L59 = mp_list<>, + class L60 = mp_list<>, class L61 = mp_list<>, class L62 = mp_list<>, class L63 = mp_list<>, class L64 = mp_list<>, class L65 = mp_list<>, class L66 = mp_list<>, class L67 = mp_list<>, class L68 = mp_list<>, class L69 = mp_list<>, + class L70 = mp_list<>, class L71 = mp_list<>, class L72 = mp_list<>, class L73 = mp_list<>, class L74 = mp_list<>, class L75 = mp_list<>, class L76 = mp_list<>, class L77 = mp_list<>, class L78 = mp_list<>, class L79 = mp_list<>, + class L80 = mp_list<>, class L81 = mp_list<>, class L82 = mp_list<>, class L83 = mp_list<>, class L84 = mp_list<>, class L85 = mp_list<>, class L86 = mp_list<>, class L87 = mp_list<>, class L88 = mp_list<>, class L89 = mp_list<>, + class L90 = mp_list<>, class L91 = mp_list<>, class L92 = mp_list<>, class L93 = mp_list<>, class L94 = mp_list<>, class L95 = mp_list<>, class L96 = mp_list<>, class L97 = mp_list<>, class L98 = mp_list<>, class L99 = mp_list<>, + class LA0 = mp_list<>, class LA1 = mp_list<>, class LA2 = mp_list<>, class LA3 = mp_list<>, class LA4 = mp_list<>, class LA5 = mp_list<>, class LA6 = mp_list<>, class LA7 = mp_list<>, class LA8 = mp_list<>, class LA9 = mp_list<> + +> struct append_111_impl +{ + using type = typename append_11_impl< + + typename append_11_impl::type, + typename append_11_impl, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19>::type, + typename append_11_impl, L20, L21, L22, L23, L24, L25, L26, L27, L28, L29>::type, + typename append_11_impl, L30, L31, L32, L33, L34, L35, L36, L37, L38, L39>::type, + typename append_11_impl, L40, L41, L42, L43, L44, L45, L46, L47, L48, L49>::type, + typename append_11_impl, L50, L51, L52, L53, L54, L55, L56, L57, L58, L59>::type, + typename append_11_impl, L60, L61, L62, L63, L64, L65, L66, L67, L68, L69>::type, + typename append_11_impl, L70, L71, L72, L73, L74, L75, L76, L77, L78, L79>::type, + typename append_11_impl, L80, L81, L82, L83, L84, L85, L86, L87, L88, L89>::type, + typename append_11_impl, L90, L91, L92, L93, L94, L95, L96, L97, L98, L99>::type, + typename append_11_impl, LA0, LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9>::type + + >::type; +}; + +template< + + class L00, class L01, class L02, class L03, class L04, class L05, class L06, class L07, class L08, class L09, class L0A, + class L10, class L11, class L12, class L13, class L14, class L15, class L16, class L17, class L18, class L19, + class L20, class L21, class L22, class L23, class L24, class L25, class L26, class L27, class L28, class L29, + class L30, class L31, class L32, class L33, class L34, class L35, class L36, class L37, class L38, class L39, + class L40, class L41, class L42, class L43, class L44, class L45, class L46, class L47, class L48, class L49, + class L50, class L51, class L52, class L53, class L54, class L55, class L56, class L57, class L58, class L59, + class L60, class L61, class L62, class L63, class L64, class L65, class L66, class L67, class L68, class L69, + class L70, class L71, class L72, class L73, class L74, class L75, class L76, class L77, class L78, class L79, + class L80, class L81, class L82, class L83, class L84, class L85, class L86, class L87, class L88, class L89, + class L90, class L91, class L92, class L93, class L94, class L95, class L96, class L97, class L98, class L99, + class LA0, class LA1, class LA2, class LA3, class LA4, class LA5, class LA6, class LA7, class LA8, class LA9, + class... Lr + +> struct append_inf_impl +{ + using prefix = typename append_111_impl< + + L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, + L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, + L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, + L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, + L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, + L50, L51, L52, L53, L54, L55, L56, L57, L58, L59, + L60, L61, L62, L63, L64, L65, L66, L67, L68, L69, + L70, L71, L72, L73, L74, L75, L76, L77, L78, L79, + L80, L81, L82, L83, L84, L85, L86, L87, L88, L89, + L90, L91, L92, L93, L94, L95, L96, L97, L98, L99, + LA0, LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9 + + >::type; + + using type = typename mp_append_impl::type; +}; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +template +struct mp_append_impl_cuda_workaround +{ + using type = mp_if_c<(sizeof...(L) > 111), mp_quote, mp_if_c<(sizeof...(L) > 11), mp_quote, mp_quote > >; +}; + +template struct mp_append_impl: mp_append_impl_cuda_workaround::type::template fn +{ +}; + +#else + +template struct mp_append_impl: + mp_cond< + mp_bool<(sizeof...(L) > 111)>, mp_quote, + mp_bool<(sizeof...(L) > 11)>, mp_quote, + mp_true, mp_quote + >::template fn +{ +}; + +#endif // #if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +#endif // #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +struct append_type_lists +{ + template using fn = typename mp_append_impl::type; +}; + +// append_value_lists + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template struct append_value_impl; + +template, class L2 = mp_list_v<>, class L3 = mp_list_v<>, class L4 = mp_list_v<>, class L5 = mp_list_v<>, class L6 = mp_list_v<>, class L7 = mp_list_v<>, class L8 = mp_list_v<>, class L9 = mp_list_v<>, class L10 = mp_list_v<>, class L11 = mp_list_v<>> struct append_value_11_impl +{ +}; + +template< + template class L1, auto... T1, + template class L2, auto... T2, + template class L3, auto... T3, + template class L4, auto... T4, + template class L5, auto... T5, + template class L6, auto... T6, + template class L7, auto... T7, + template class L8, auto... T8, + template class L9, auto... T9, + template class L10, auto... T10, + template class L11, auto... T11> + +struct append_value_11_impl, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11> +{ + using type = L1; +}; + +template< + + class L00 = mp_list_v<>, class L01 = mp_list_v<>, class L02 = mp_list_v<>, class L03 = mp_list_v<>, class L04 = mp_list_v<>, class L05 = mp_list_v<>, class L06 = mp_list_v<>, class L07 = mp_list_v<>, class L08 = mp_list_v<>, class L09 = mp_list_v<>, class L0A = mp_list_v<>, + class L10 = mp_list_v<>, class L11 = mp_list_v<>, class L12 = mp_list_v<>, class L13 = mp_list_v<>, class L14 = mp_list_v<>, class L15 = mp_list_v<>, class L16 = mp_list_v<>, class L17 = mp_list_v<>, class L18 = mp_list_v<>, class L19 = mp_list_v<>, + class L20 = mp_list_v<>, class L21 = mp_list_v<>, class L22 = mp_list_v<>, class L23 = mp_list_v<>, class L24 = mp_list_v<>, class L25 = mp_list_v<>, class L26 = mp_list_v<>, class L27 = mp_list_v<>, class L28 = mp_list_v<>, class L29 = mp_list_v<>, + class L30 = mp_list_v<>, class L31 = mp_list_v<>, class L32 = mp_list_v<>, class L33 = mp_list_v<>, class L34 = mp_list_v<>, class L35 = mp_list_v<>, class L36 = mp_list_v<>, class L37 = mp_list_v<>, class L38 = mp_list_v<>, class L39 = mp_list_v<>, + class L40 = mp_list_v<>, class L41 = mp_list_v<>, class L42 = mp_list_v<>, class L43 = mp_list_v<>, class L44 = mp_list_v<>, class L45 = mp_list_v<>, class L46 = mp_list_v<>, class L47 = mp_list_v<>, class L48 = mp_list_v<>, class L49 = mp_list_v<>, + class L50 = mp_list_v<>, class L51 = mp_list_v<>, class L52 = mp_list_v<>, class L53 = mp_list_v<>, class L54 = mp_list_v<>, class L55 = mp_list_v<>, class L56 = mp_list_v<>, class L57 = mp_list_v<>, class L58 = mp_list_v<>, class L59 = mp_list_v<>, + class L60 = mp_list_v<>, class L61 = mp_list_v<>, class L62 = mp_list_v<>, class L63 = mp_list_v<>, class L64 = mp_list_v<>, class L65 = mp_list_v<>, class L66 = mp_list_v<>, class L67 = mp_list_v<>, class L68 = mp_list_v<>, class L69 = mp_list_v<>, + class L70 = mp_list_v<>, class L71 = mp_list_v<>, class L72 = mp_list_v<>, class L73 = mp_list_v<>, class L74 = mp_list_v<>, class L75 = mp_list_v<>, class L76 = mp_list_v<>, class L77 = mp_list_v<>, class L78 = mp_list_v<>, class L79 = mp_list_v<>, + class L80 = mp_list_v<>, class L81 = mp_list_v<>, class L82 = mp_list_v<>, class L83 = mp_list_v<>, class L84 = mp_list_v<>, class L85 = mp_list_v<>, class L86 = mp_list_v<>, class L87 = mp_list_v<>, class L88 = mp_list_v<>, class L89 = mp_list_v<>, + class L90 = mp_list_v<>, class L91 = mp_list_v<>, class L92 = mp_list_v<>, class L93 = mp_list_v<>, class L94 = mp_list_v<>, class L95 = mp_list_v<>, class L96 = mp_list_v<>, class L97 = mp_list_v<>, class L98 = mp_list_v<>, class L99 = mp_list_v<>, + class LA0 = mp_list_v<>, class LA1 = mp_list_v<>, class LA2 = mp_list_v<>, class LA3 = mp_list_v<>, class LA4 = mp_list_v<>, class LA5 = mp_list_v<>, class LA6 = mp_list_v<>, class LA7 = mp_list_v<>, class LA8 = mp_list_v<>, class LA9 = mp_list_v<> + +> struct append_value_111_impl +{ + using type = typename append_value_11_impl< + + typename append_value_11_impl::type, + typename append_value_11_impl, L10, L11, L12, L13, L14, L15, L16, L17, L18, L19>::type, + typename append_value_11_impl, L20, L21, L22, L23, L24, L25, L26, L27, L28, L29>::type, + typename append_value_11_impl, L30, L31, L32, L33, L34, L35, L36, L37, L38, L39>::type, + typename append_value_11_impl, L40, L41, L42, L43, L44, L45, L46, L47, L48, L49>::type, + typename append_value_11_impl, L50, L51, L52, L53, L54, L55, L56, L57, L58, L59>::type, + typename append_value_11_impl, L60, L61, L62, L63, L64, L65, L66, L67, L68, L69>::type, + typename append_value_11_impl, L70, L71, L72, L73, L74, L75, L76, L77, L78, L79>::type, + typename append_value_11_impl, L80, L81, L82, L83, L84, L85, L86, L87, L88, L89>::type, + typename append_value_11_impl, L90, L91, L92, L93, L94, L95, L96, L97, L98, L99>::type, + typename append_value_11_impl, LA0, LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9>::type + + >::type; +}; + +template< + + class L00, class L01, class L02, class L03, class L04, class L05, class L06, class L07, class L08, class L09, class L0A, + class L10, class L11, class L12, class L13, class L14, class L15, class L16, class L17, class L18, class L19, + class L20, class L21, class L22, class L23, class L24, class L25, class L26, class L27, class L28, class L29, + class L30, class L31, class L32, class L33, class L34, class L35, class L36, class L37, class L38, class L39, + class L40, class L41, class L42, class L43, class L44, class L45, class L46, class L47, class L48, class L49, + class L50, class L51, class L52, class L53, class L54, class L55, class L56, class L57, class L58, class L59, + class L60, class L61, class L62, class L63, class L64, class L65, class L66, class L67, class L68, class L69, + class L70, class L71, class L72, class L73, class L74, class L75, class L76, class L77, class L78, class L79, + class L80, class L81, class L82, class L83, class L84, class L85, class L86, class L87, class L88, class L89, + class L90, class L91, class L92, class L93, class L94, class L95, class L96, class L97, class L98, class L99, + class LA0, class LA1, class LA2, class LA3, class LA4, class LA5, class LA6, class LA7, class LA8, class LA9, + class... Lr + +> struct append_value_inf_impl +{ + using prefix = typename append_value_111_impl< + + L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L0A, + L10, L11, L12, L13, L14, L15, L16, L17, L18, L19, + L20, L21, L22, L23, L24, L25, L26, L27, L28, L29, + L30, L31, L32, L33, L34, L35, L36, L37, L38, L39, + L40, L41, L42, L43, L44, L45, L46, L47, L48, L49, + L50, L51, L52, L53, L54, L55, L56, L57, L58, L59, + L60, L61, L62, L63, L64, L65, L66, L67, L68, L69, + L70, L71, L72, L73, L74, L75, L76, L77, L78, L79, + L80, L81, L82, L83, L84, L85, L86, L87, L88, L89, + L90, L91, L92, L93, L94, L95, L96, L97, L98, L99, + LA0, LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9 + + >::type; + + using type = typename append_value_impl::type; +}; + +template struct append_value_impl: + mp_cond< + mp_bool<(sizeof...(L) > 111)>, mp_quote, + mp_bool<(sizeof...(L) > 11)>, mp_quote, + mp_true, mp_quote + >::template fn +{ +}; + +struct append_value_lists +{ + template using fn = typename append_value_impl::type; +}; + +#endif // #if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +} // namespace detail + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template using mp_append = typename mp_if_c<(sizeof...(L) > 0 && sizeof...(L) == mp_count_if, mp_is_value_list>::value), detail::append_value_lists, detail::append_type_lists>::template fn; + +#else + +template using mp_append = detail::append_type_lists::fn; + +#endif + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_APPEND_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_copy_if.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_copy_if.hpp new file mode 100644 index 0000000..4edcde0 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_copy_if.hpp @@ -0,0 +1,48 @@ +#ifndef BOOST_MP11_DETAIL_MP_COPY_IF_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_COPY_IF_HPP_INCLUDED + +// Copyright 2015-2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_copy_if +namespace detail +{ + +template class P> struct mp_copy_if_impl +{ +}; + +template class L, class... T, template class P> struct mp_copy_if_impl, P> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + template struct _f { using type = mp_if, mp_list, mp_list<>>; }; + using type = mp_append, typename _f::type...>; +#else + template using _f = mp_if, mp_list, mp_list<>>; + using type = mp_append, _f...>; +#endif +}; + +} // namespace detail + +template class P> using mp_copy_if = typename detail::mp_copy_if_impl::type; +template using mp_copy_if_q = mp_copy_if; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_COPY_IF_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_count.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_count.hpp new file mode 100644 index 0000000..37b39ed --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_count.hpp @@ -0,0 +1,147 @@ +#ifndef BOOST_MP11_DETAIL_MP_COUNT_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_COUNT_HPP_INCLUDED + +// Copyright 2015, 2016 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_count +namespace detail +{ + +#if !defined( BOOST_MP11_NO_CONSTEXPR ) + +constexpr std::size_t cx_plus() +{ + return 0; +} + +template constexpr std::size_t cx_plus(T1 t1, T... t) +{ + return static_cast(t1) + cx_plus(t...); +} + +template +constexpr std::size_t cx_plus(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, T10 t10, T... t) +{ + return static_cast(t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8 + t9 + t10) + cx_plus(t...); +} + +#endif + +template struct mp_count_impl; + +#if defined( BOOST_MP11_HAS_CXX14_CONSTEXPR ) + +template constexpr std::size_t cx_count() +{ + constexpr bool a[] = { false, std::is_same::value... }; + + std::size_t r = 0; + + for( std::size_t i = 1; i < sizeof...(T) + 1; ++i ) + { + r += a[ i ]; + } + + return r; +} + +template class L, class... T, class V> struct mp_count_impl, V> +{ + using type = mp_size_t()>; +}; + +#elif !defined( BOOST_MP11_NO_CONSTEXPR ) + +template class L, class... T, class V> struct mp_count_impl, V> +{ + using type = mp_size_t::value...)>; +}; + +#else + +template class L, class... T, class V> struct mp_count_impl, V> +{ + using type = mp_size_t...>::value>; +}; + +#endif + +} // namespace detail + +template using mp_count = typename detail::mp_count_impl::type; + +// mp_count_if +namespace detail +{ + +template class P> struct mp_count_if_impl; + +#if defined( BOOST_MP11_HAS_CXX14_CONSTEXPR ) && !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1930 ) + +template class P, class... T> constexpr std::size_t cx_count_if() +{ + constexpr bool a[] = { false, static_cast( P::value )... }; + + std::size_t r = 0; + + for( std::size_t i = 1; i < sizeof...(T) + 1; ++i ) + { + r += a[ i ]; + } + + return r; +} + +template class L, class... T, template class P> struct mp_count_if_impl, P> +{ + using type = mp_size_t()>; +}; + +#elif !defined( BOOST_MP11_NO_CONSTEXPR ) + +template class L, class... T, template class P> struct mp_count_if_impl, P> +{ + using type = mp_size_t>::value...)>; +}; + +#else + +template class L, class... T, template class P> struct mp_count_if_impl, P> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + + template struct _f { using type = mp_to_bool>; }; + using type = mp_size_t::type...>::value>; + +#else + + using type = mp_size_t>...>::value>; + +#endif +}; + +#endif + +} // namespace detail + +template class P> using mp_count_if = typename detail::mp_count_if_impl::type; +template using mp_count_if_q = mp_count_if; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_COUNT_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_defer.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_defer.hpp new file mode 100644 index 0000000..9aaca99 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_defer.hpp @@ -0,0 +1,119 @@ +#ifndef BOOST_MP11_DETAIL_MP_DEFER_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_DEFER_HPP_INCLUDED + +// Copyright 2015-2020, 2023 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_if, mp_if_c +namespace detail +{ + +template struct mp_if_c_impl +{ +}; + +template struct mp_if_c_impl +{ + using type = T; +}; + +template struct mp_if_c_impl +{ + using type = E; +}; + +} // namespace detail + +template using mp_if_c = typename detail::mp_if_c_impl::type; +template using mp_if = typename detail::mp_if_c_impl(C::value), T, E...>::type; + +// mp_valid + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_INTEL, != 0 ) // tested at 1800 + +// contributed by Roland Schulz in https://github.com/boostorg/mp11/issues/17 + +namespace detail +{ + +template using void_t = void; + +template class F, class... T> +struct mp_valid_impl: mp_false {}; + +template class F, class... T> +struct mp_valid_impl>, F, T...>: mp_true {}; + +} // namespace detail + +template class F, class... T> using mp_valid = typename detail::mp_valid_impl; + +#else + +// implementation by Bruno Dutra (by the name is_evaluable) +namespace detail +{ + +template class F, class... T> struct mp_valid_impl +{ + template class G, class = G> static mp_true check(int); + template class> static mp_false check(...); + + using type = decltype(check(0)); +}; + +} // namespace detail + +template class F, class... T> using mp_valid = typename detail::mp_valid_impl::type; + +#endif + +template using mp_valid_q = mp_valid; + +// mp_defer +namespace detail +{ + +template class F, class... T> struct mp_defer_impl +{ + using type = F; +}; + +struct mp_no_type +{ +}; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +template class F, class... T> struct mp_defer_cuda_workaround +{ + using type = mp_if, detail::mp_defer_impl, detail::mp_no_type>; +}; + +#endif + +} // namespace detail + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_CUDA, >= 9000000 && BOOST_MP11_CUDA < 10000000 ) + +template class F, class... T> using mp_defer = typename detail::mp_defer_cuda_workaround< F, T...>::type; + +#else + +template class F, class... T> using mp_defer = mp_if, detail::mp_defer_impl, detail::mp_no_type>; + +#endif + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_DEFER_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_fold.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_fold.hpp new file mode 100644 index 0000000..266d9c1 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_fold.hpp @@ -0,0 +1,164 @@ +#ifndef BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED + +// Copyright 2015-2017 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_fold +namespace detail +{ + +template class F> struct mp_fold_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_fold is not a list +}; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template class L, class... T, class V, template class F> struct mp_fold_impl, V, F> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = V; +}; + +#else + +template class L, class V, template class F> struct mp_fold_impl, V, F> +{ + using type = V; +}; + +#endif + +// + +template class F> struct mp_fold_Q1 +{ + template + using fn = F; +}; + +template class F> struct mp_fold_Q2 +{ + template + using fn = F, T2>; +}; + +template class F> struct mp_fold_Q3 +{ + template + using fn = F, T2>, T3>; +}; + +template class F> struct mp_fold_Q4 +{ + template + using fn = F, T2>, T3>, T4>; +}; + +template class F> struct mp_fold_Q5 +{ + template + using fn = F, T2>, T3>, T4>, T5>; +}; + +template class F> struct mp_fold_Q6 +{ + template + using fn = F, T2>, T3>, T4>, T5>, T6>; +}; + +template class F> struct mp_fold_Q7 +{ + template + using fn = F, T2>, T3>, T4>, T5>, T6>, T7>; +}; + +template class F> struct mp_fold_Q8 +{ + template + using fn = F, T2>, T3>, T4>, T5>, T6>, T7>, T8>; +}; + +template class F> struct mp_fold_Q9 +{ + template + using fn = F, T2>, T3>, T4>, T5>, T6>, T7>, T8>, T9>; +}; + +// + +template class L, class T1, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1> +{ +}; + +template class L, class T1, class T2, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1, T2> +{ +}; + +template class L, class T1, class T2, class T3, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1, T2, T3> +{ +}; + +template class L, class T1, class T2, class T3, class T4, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1, T2, T3, T4> +{ +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1, T2, T3, T4, T5> +{ +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1, T2, T3, T4, T5, T6> +{ +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1, T2, T3, T4, T5, T6, T7> +{ +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1, T2, T3, T4, T5, T6, T7, T8> +{ +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class V, template class F> +struct mp_fold_impl, V, F>: mp_defer::template fn, T1, T2, T3, T4, T5, T6, T7, T8, T9> +{ +}; + +// + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, class V, template class F> +struct mp_fold_impl, V, F> +{ + using type = typename mp_fold_impl, F, T2>, T3>, T4>, T5>, T6>, T7>, T8>, T9>, T10>, F>::type; +}; + +} // namespace detail + +template class F> using mp_fold = typename detail::mp_fold_impl::type; +template using mp_fold_q = mp_fold; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_FOLD_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_front.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_front.hpp new file mode 100644 index 0000000..53a73ac --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_front.hpp @@ -0,0 +1,50 @@ +#ifndef BOOST_MP11_DETAIL_MP_FRONT_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_FRONT_HPP_INCLUDED + +// Copyright 2015-2023 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_front +namespace detail +{ + +template struct mp_front_impl +{ +// An error "no type named 'type'" here means that the argument to mp_front +// is either not a list, or is an empty list +}; + +template class L, class T1, class... T> struct mp_front_impl> +{ + using type = T1; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto... A> struct mp_front_impl> +{ + using type = mp_value; +}; + +#endif + +} // namespace detail + +template using mp_front = typename detail::mp_front_impl::type; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_FRONT_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_is_list.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_is_list.hpp new file mode 100644 index 0000000..25b378b --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_is_list.hpp @@ -0,0 +1,39 @@ +#ifndef BOOST_MP11_DETAIL_MP_IS_LIST_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_IS_LIST_HPP_INCLUDED + +// Copyright 2015-2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_is_list +namespace detail +{ + +template struct mp_is_list_impl +{ + using type = mp_false; +}; + +template class L, class... T> struct mp_is_list_impl> +{ + using type = mp_true; +}; + +} // namespace detail + +template using mp_is_list = typename detail::mp_is_list_impl::type; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_IS_LIST_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_is_value_list.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_is_value_list.hpp new file mode 100644 index 0000000..8f94f03 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_is_value_list.hpp @@ -0,0 +1,41 @@ +#ifndef BOOST_MP11_DETAIL_MP_IS_VALUE_LIST_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_IS_VALUE_LIST_HPP_INCLUDED + +// Copyright 2023 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_is_value_list +namespace detail +{ + +template struct mp_is_value_list_impl +{ + using type = mp_false; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto... A> struct mp_is_value_list_impl> +{ + using type = mp_true; +}; + +#endif + +} // namespace detail + +template using mp_is_value_list = typename detail::mp_is_value_list_impl::type; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_IS_VALUE_LIST_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_list.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_list.hpp new file mode 100644 index 0000000..8e8d3e5 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_list.hpp @@ -0,0 +1,24 @@ +#ifndef BOOST_MP11_DETAIL_MP_LIST_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_LIST_HPP_INCLUDED + +// Copyright 2015, 2016 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +namespace boost +{ +namespace mp11 +{ + +// mp_list +template struct mp_list +{ +}; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_LIST_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_list_v.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_list_v.hpp new file mode 100644 index 0000000..bc05238 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_list_v.hpp @@ -0,0 +1,27 @@ +#ifndef BOOST_MP11_DETAIL_MP_LIST_V_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_LIST_V_HPP_INCLUDED + +// Copyright 2023 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// http://www.boost.org/LICENSE_1_0.txt + +#include + +namespace boost +{ +namespace mp11 +{ + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +// mp_list_v +template struct mp_list_v +{ +}; + +#endif + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_LIST_V_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_map_find.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_map_find.hpp new file mode 100644 index 0000000..2fb70d8 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_map_find.hpp @@ -0,0 +1,87 @@ +#ifndef BOOST_MP11_DETAIL_MP_MAP_FIND_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_MAP_FIND_HPP_INCLUDED + +// Copyright 2015 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1930 ) + +// not exactly good practice, but... +namespace std +{ + template class tuple; +} + +#endif + +namespace boost +{ +namespace mp11 +{ + +// mp_map_find +namespace detail +{ + +#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1930 ) + +template using mpmf_wrap = mp_identity; +template using mpmf_unwrap = typename T::type; + +#else + +template struct mpmf_tuple {}; + +template struct mpmf_wrap_impl +{ + using type = mp_identity; +}; + +template struct mpmf_wrap_impl< std::tuple > +{ + using type = mp_identity< mpmf_tuple >; +}; + +template using mpmf_wrap = typename mpmf_wrap_impl::type; + +template struct mpmf_unwrap_impl +{ + using type = typename T::type; +}; + +template struct mpmf_unwrap_impl< mp_identity< mpmf_tuple > > +{ + using type = std::tuple; +}; + +template using mpmf_unwrap = typename mpmf_unwrap_impl::type; + +#endif // #if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1930 ) + +template struct mp_map_find_impl; + +template class M, class... T, class K> struct mp_map_find_impl, K> +{ + using U = mp_inherit...>; + + template class L, class... U> static mp_identity> f( mp_identity>* ); + static mp_identity f( ... ); + + using type = mpmf_unwrap< decltype( f( static_cast(0) ) ) >; +}; + +} // namespace detail + +template using mp_map_find = typename detail::mp_map_find_impl::type; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_MAP_FIND_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_min_element.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_min_element.hpp new file mode 100644 index 0000000..55c21ac --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_min_element.hpp @@ -0,0 +1,51 @@ +#ifndef BOOST_MP11_DETAIL_MP_MIN_ELEMENT_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_MIN_ELEMENT_HPP_INCLUDED + +// Copyright 2015-2017 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_min_element +namespace detail +{ + +template class P> struct select_min +{ + template using fn = mp_if, T1, T2>; +}; + +} // namespace detail + +template class P> using mp_min_element = mp_fold_q, mp_first, detail::select_min

>; +template using mp_min_element_q = mp_min_element; + +// mp_max_element +namespace detail +{ + +template class P> struct select_max +{ + template using fn = mp_if, T1, T2>; +}; + +} // namespace detail + +template class P> using mp_max_element = mp_fold_q, mp_first, detail::select_max

>; +template using mp_max_element_q = mp_max_element; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_MIN_ELEMENT_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_plus.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_plus.hpp new file mode 100644 index 0000000..5c9417c --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_plus.hpp @@ -0,0 +1,84 @@ +#ifndef BOOST_MP11_DETAIL_MP_PLUS_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_PLUS_HPP_INCLUDED + +// Copyright 2015 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_plus +namespace detail +{ + +#if defined( BOOST_MP11_HAS_FOLD_EXPRESSIONS ) && !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, != 0 ) && !BOOST_MP11_WORKAROUND( BOOST_MP11_CLANG, != 0 ) + +// msvc fails with parser stack overflow for large sizeof...(T) +// clang exceeds -fbracket-depth, which defaults to 256 + +template struct mp_plus_impl +{ + static const auto _v = (T::value + ... + 0); + using type = std::integral_constant::type, _v>; +}; + +#else + +template struct mp_plus_impl; + +template<> struct mp_plus_impl<> +{ + using type = std::integral_constant; +}; + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 40800 ) + +template struct mp_plus_impl +{ + static const decltype(T1::value + mp_plus_impl::type::value) _v = T1::value + mp_plus_impl::type::value; + using type = std::integral_constant::type, _v>; +}; + +template struct mp_plus_impl +{ + static const + decltype(T1::value + T2::value + T3::value + T4::value + T5::value + T6::value + T7::value + T8::value + T9::value + T10::value + mp_plus_impl::type::value) + _v = T1::value + T2::value + T3::value + T4::value + T5::value + T6::value + T7::value + T8::value + T9::value + T10::value + mp_plus_impl::type::value; + using type = std::integral_constant::type, _v>; +}; + +#else + +template struct mp_plus_impl +{ + static const auto _v = T1::value + mp_plus_impl::type::value; + using type = std::integral_constant::type, _v>; +}; + +template struct mp_plus_impl +{ + static const auto _v = T1::value + T2::value + T3::value + T4::value + T5::value + T6::value + T7::value + T8::value + T9::value + T10::value + mp_plus_impl::type::value; + using type = std::integral_constant::type, _v>; +}; + +#endif + +#endif + +} // namespace detail + +template using mp_plus = typename detail::mp_plus_impl::type; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_PLUS_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_remove_if.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_remove_if.hpp new file mode 100644 index 0000000..9687b4a --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_remove_if.hpp @@ -0,0 +1,48 @@ +#ifndef BOOST_MP11_DETAIL_MP_REMOVE_IF_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_REMOVE_IF_HPP_INCLUDED + +// Copyright 2015-2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_remove_if +namespace detail +{ + +template class P> struct mp_remove_if_impl +{ +}; + +template class L, class... T, template class P> struct mp_remove_if_impl, P> +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + template struct _f { using type = mp_if, mp_list<>, mp_list>; }; + using type = mp_append, typename _f::type...>; +#else + template using _f = mp_if, mp_list<>, mp_list>; + using type = mp_append, _f...>; +#endif +}; + +} // namespace detail + +template class P> using mp_remove_if = typename detail::mp_remove_if_impl::type; +template using mp_remove_if_q = mp_remove_if; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_REMOVE_IF_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_rename.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_rename.hpp new file mode 100644 index 0000000..dde8f6f --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_rename.hpp @@ -0,0 +1,54 @@ +#ifndef BOOST_MP11_DETAIL_MP_RENAME_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_RENAME_HPP_INCLUDED + +// Copyright 2015-2023 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_rename +namespace detail +{ + +template class B> struct mp_rename_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_rename is not a list +}; + +template class L, class... T, template class B> struct mp_rename_impl, B>: mp_defer +{ +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto... A, template class B> struct mp_rename_impl, B>: mp_defer...> +{ +}; + +#endif + +} // namespace detail + +template class B> using mp_rename = typename detail::mp_rename_impl::type; + +// mp_apply +template class F, class L> using mp_apply = typename detail::mp_rename_impl::type; + +// mp_apply_q +template using mp_apply_q = typename detail::mp_rename_impl::type; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_RENAME_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_value.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_value.hpp new file mode 100644 index 0000000..d0e5982 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_value.hpp @@ -0,0 +1,25 @@ +#ifndef BOOST_MP11_DETAIL_MP_VALUE_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_VALUE_HPP_INCLUDED + +// Copyright 2023 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +namespace boost +{ +namespace mp11 +{ + +template using mp_value = std::integral_constant; + +} // namespace mp11 +} // namespace boost + +#endif // #if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +#endif // #ifndef BOOST_MP11_DETAIL_MP_VALUE_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_void.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_void.hpp new file mode 100644 index 0000000..a7ac7b7 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_void.hpp @@ -0,0 +1,32 @@ +#ifndef BOOST_MP11_DETAIL_MP_VOID_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_VOID_HPP_INCLUDED + +// Copyright 2015-2017 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +namespace boost +{ +namespace mp11 +{ + +// mp_void +namespace detail +{ + +template struct mp_void_impl +{ + using type = void; +}; + +} // namespace detail + +template using mp_void = typename detail::mp_void_impl::type; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_VOID_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mp_with_index.hpp b/Chapter18/cib/libs/boost/mp11/detail/mp_with_index.hpp new file mode 100644 index 0000000..b6932f2 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mp_with_index.hpp @@ -0,0 +1,385 @@ +#ifndef BOOST_MP11_DETAIL_MP_WITH_INDEX_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MP_WITH_INDEX_HPP_INCLUDED + +// Copyright 2017 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include + +#if defined( BOOST_MP11_HAS_CXX14_CONSTEXPR ) +# define BOOST_MP11_CONSTEXPR14 constexpr +#else +# define BOOST_MP11_CONSTEXPR14 +#endif + +#if defined( __GNUC__ ) || defined( __clang__ ) +# define BOOST_MP11_UNREACHABLE_DEFAULT default: __builtin_unreachable(); +#elif defined( _MSC_VER ) +# define BOOST_MP11_UNREACHABLE_DEFAULT default: __assume(false); +#else +# define BOOST_MP11_UNREACHABLE_DEFAULT +#endif + +namespace boost +{ +namespace mp11 +{ + +namespace detail +{ + +template struct mp_with_index_impl_ +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + if( i < N / 2 ) + { + return mp_with_index_impl_::template call( i, std::forward(f) ); + } + else + { + return mp_with_index_impl_::template call( i - N/2, std::forward(f) ); + } + } +}; + +template<> struct mp_with_index_impl_<0> +{ +}; + +template<> struct mp_with_index_impl_<1> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t /*i*/, F && f ) + { + return std::forward(f)( mp_size_t() ); + } +}; + +template<> struct mp_with_index_impl_<2> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<3> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<4> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<5> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<6> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<7> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<8> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<9> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<10> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + case 9: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<11> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + case 9: return std::forward(f)( mp_size_t() ); + case 10: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<12> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + case 9: return std::forward(f)( mp_size_t() ); + case 10: return std::forward(f)( mp_size_t() ); + case 11: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<13> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + case 9: return std::forward(f)( mp_size_t() ); + case 10: return std::forward(f)( mp_size_t() ); + case 11: return std::forward(f)( mp_size_t() ); + case 12: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<14> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + case 9: return std::forward(f)( mp_size_t() ); + case 10: return std::forward(f)( mp_size_t() ); + case 11: return std::forward(f)( mp_size_t() ); + case 12: return std::forward(f)( mp_size_t() ); + case 13: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<15> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + case 9: return std::forward(f)( mp_size_t() ); + case 10: return std::forward(f)( mp_size_t() ); + case 11: return std::forward(f)( mp_size_t() ); + case 12: return std::forward(f)( mp_size_t() ); + case 13: return std::forward(f)( mp_size_t() ); + case 14: return std::forward(f)( mp_size_t() ); + } + } +}; + +template<> struct mp_with_index_impl_<16> +{ + template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) + { + switch( i ) + { + BOOST_MP11_UNREACHABLE_DEFAULT + case 0: return std::forward(f)( mp_size_t() ); + case 1: return std::forward(f)( mp_size_t() ); + case 2: return std::forward(f)( mp_size_t() ); + case 3: return std::forward(f)( mp_size_t() ); + case 4: return std::forward(f)( mp_size_t() ); + case 5: return std::forward(f)( mp_size_t() ); + case 6: return std::forward(f)( mp_size_t() ); + case 7: return std::forward(f)( mp_size_t() ); + case 8: return std::forward(f)( mp_size_t() ); + case 9: return std::forward(f)( mp_size_t() ); + case 10: return std::forward(f)( mp_size_t() ); + case 11: return std::forward(f)( mp_size_t() ); + case 12: return std::forward(f)( mp_size_t() ); + case 13: return std::forward(f)( mp_size_t() ); + case 14: return std::forward(f)( mp_size_t() ); + case 15: return std::forward(f)( mp_size_t() ); + } + } +}; + +} // namespace detail + +template inline BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) mp_with_index( std::size_t i, F && f ) +{ + assert( i < N ); + return detail::mp_with_index_impl_::template call<0>( i, std::forward(f) ); +} + +template inline BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) mp_with_index( std::size_t i, F && f ) +{ + return mp_with_index( i, std::forward(f) ); +} + +#undef BOOST_MP11_CONSTEXPR14 +#undef BOOST_MP11_UNREACHABLE_DEFAULT + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MP_WITH_INDEX_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/detail/mpl_common.hpp b/Chapter18/cib/libs/boost/mp11/detail/mpl_common.hpp new file mode 100644 index 0000000..208885c --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/detail/mpl_common.hpp @@ -0,0 +1,160 @@ +#ifndef BOOST_MP11_DETAIL_MPL_COMMON_HPP_INCLUDED +#define BOOST_MP11_DETAIL_MPL_COMMON_HPP_INCLUDED + +// Copyright 2017, 2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +namespace boost +{ +namespace mpl +{ + +struct forward_iterator_tag; + +namespace aux +{ + +struct mp11_tag {}; + +template struct mp11_iterator +{ + using category = forward_iterator_tag; + + using type = mp11::mp_first; + using next = mp11_iterator>; +}; + +} // namespace aux + +// at + +template< typename Tag > struct at_impl; + +template<> struct at_impl +{ + template struct apply + { + using type = mp11::mp_at; + }; +}; + +// back + +template< typename Tag > struct back_impl; + +template<> struct back_impl +{ + template struct apply + { + using N = mp11::mp_size; + using type = mp11::mp_at_c; + }; +}; + +// begin + +template< typename Tag > struct begin_impl; + +template<> struct begin_impl +{ + template struct apply + { + using type = aux::mp11_iterator; + }; +}; + +// clear + +template< typename Tag > struct clear_impl; + +template<> struct clear_impl +{ + template struct apply + { + using type = mp11::mp_clear; + }; +}; + +// end + +template< typename Tag > struct end_impl; + +template<> struct end_impl +{ + template struct apply + { + using type = aux::mp11_iterator>; + }; +}; + +// front + +template< typename Tag > struct front_impl; + +template<> struct front_impl +{ + template struct apply + { + using type = mp11::mp_front; + }; +}; + +// pop_front + +template< typename Tag > struct pop_front_impl; + +template<> struct pop_front_impl +{ + template struct apply + { + using type = mp11::mp_pop_front; + }; +}; + +// push_back + +template< typename Tag > struct push_back_impl; + +template<> struct push_back_impl +{ + template struct apply + { + using type = mp11::mp_push_back; + }; +}; + +// push_front + +template< typename Tag > struct push_front_impl; + +template<> struct push_front_impl +{ + template struct apply + { + using type = mp11::mp_push_front; + }; +}; + +// size + +template< typename Tag > struct size_impl; + +template<> struct size_impl +{ + template struct apply + { + using type = mp11::mp_size; + }; +}; + +} // namespace mpl +} // namespace boost + +#endif // #ifndef BOOST_MP11_DETAIL_MPL_COMMON_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/function.hpp b/Chapter18/cib/libs/boost/mp11/function.hpp new file mode 100644 index 0000000..e20b452 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/function.hpp @@ -0,0 +1,222 @@ +#ifndef BOOST_MP11_FUNCTION_HPP_INCLUDED +#define BOOST_MP11_FUNCTION_HPP_INCLUDED + +// Copyright 2015-2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_void +// in detail/mp_void.hpp + +// mp_and +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1910 ) + +namespace detail +{ + +template struct mp_and_impl; + +} // namespace detail + +template using mp_and = mp_to_bool< typename detail::mp_and_impl::type >; + +namespace detail +{ + +template<> struct mp_and_impl<> +{ + using type = mp_true; +}; + +template struct mp_and_impl +{ + using type = T; +}; + +template struct mp_and_impl +{ + using type = mp_eval_if< mp_not, T1, mp_and, T... >; +}; + +} // namespace detail + +#else + +namespace detail +{ + +template struct mp_and_impl +{ + using type = mp_false; +}; + +template struct mp_and_impl< mp_list, mp_void...> > +{ + using type = mp_true; +}; + +} // namespace detail + +template using mp_and = typename detail::mp_and_impl>::type; + +#endif + +// mp_all +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86355 +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) || BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, != 0 ) + +template using mp_all = mp_bool< mp_count_if< mp_list, mp_not >::value == 0 >; + +#else + +template using mp_all = mp_bool< mp_count< mp_list...>, mp_false >::value == 0 >; + +#endif + +// mp_or +namespace detail +{ + +template struct mp_or_impl; + +} // namespace detail + +template using mp_or = mp_to_bool< typename detail::mp_or_impl::type >; + +namespace detail +{ + +template<> struct mp_or_impl<> +{ + using type = mp_false; +}; + +template struct mp_or_impl +{ + using type = T; +}; + +template struct mp_or_impl +{ + using type = mp_eval_if< T1, T1, mp_or, T... >; +}; + +} // namespace detail + +// mp_any +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86356 +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) || BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, != 0 ) + +template using mp_any = mp_bool< mp_count_if< mp_list, mp_to_bool >::value != 0 >; + +#else + +template using mp_any = mp_bool< mp_count< mp_list...>, mp_true >::value != 0 >; + +#endif + +// mp_same +namespace detail +{ + +template struct mp_same_impl; + +template<> struct mp_same_impl<> +{ + using type = mp_true; +}; + +template struct mp_same_impl +{ + using type = mp_bool< mp_count, T1>::value == sizeof...(T) >; +}; + +} // namespace detail + +template using mp_same = typename detail::mp_same_impl::type; + +// mp_similar +namespace detail +{ + +template struct mp_similar_impl; + +template<> struct mp_similar_impl<> +{ + using type = mp_true; +}; + +template struct mp_similar_impl +{ + using type = mp_true; +}; + +template struct mp_similar_impl +{ + using type = mp_true; +}; + +template struct mp_similar_impl +{ + using type = mp_false; +}; + +template class L, class... T1, class... T2> struct mp_similar_impl, L> +{ + using type = mp_true; +}; + +template class L, class... T> struct mp_similar_impl, L> +{ + using type = mp_true; +}; + +template struct mp_similar_impl +{ + using type = mp_all< typename mp_similar_impl::type, typename mp_similar_impl::type, typename mp_similar_impl::type... >; +}; + +} // namespace detail + +template using mp_similar = typename detail::mp_similar_impl::type; + +#if BOOST_MP11_GCC +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wsign-compare" +#endif + +// mp_less +template using mp_less = mp_bool<(T1::value < 0 && T2::value >= 0) || ((T1::value < T2::value) && !(T1::value >= 0 && T2::value < 0))>; + +#if BOOST_MP11_GCC +# pragma GCC diagnostic pop +#endif + +// mp_min +template using mp_min = mp_min_element, mp_less>; + +// mp_max +template using mp_max = mp_max_element, mp_less>; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_FUNCTION_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/integer_sequence.hpp b/Chapter18/cib/libs/boost/mp11/integer_sequence.hpp new file mode 100644 index 0000000..83e2450 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/integer_sequence.hpp @@ -0,0 +1,112 @@ +#ifndef BOOST_MP11_INTEGER_SEQUENCE_HPP_INCLUDED +#define BOOST_MP11_INTEGER_SEQUENCE_HPP_INCLUDED + +// Copyright 2015, 2017, 2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#if defined(__has_builtin) +# if __has_builtin(__make_integer_seq) +# define BOOST_MP11_HAS_MAKE_INTEGER_SEQ +# endif +#endif + +namespace boost +{ +namespace mp11 +{ + +// integer_sequence +template struct integer_sequence +{ +}; + +#if defined(BOOST_MP11_HAS_MAKE_INTEGER_SEQ) + +template using make_integer_sequence = __make_integer_seq; + +#else + +// detail::make_integer_sequence_impl +namespace detail +{ + +// iseq_if_c +template struct iseq_if_c_impl; + +template struct iseq_if_c_impl +{ + using type = T; +}; + +template struct iseq_if_c_impl +{ + using type = E; +}; + +template using iseq_if_c = typename iseq_if_c_impl::type; + +// iseq_identity +template struct iseq_identity +{ + using type = T; +}; + +template struct append_integer_sequence; + +template struct append_integer_sequence, integer_sequence> +{ + using type = integer_sequence< T, I..., ( J + sizeof...(I) )... >; +}; + +template struct make_integer_sequence_impl; + +template struct make_integer_sequence_impl_ +{ +private: + + static_assert( N >= 0, "make_integer_sequence: N must not be negative" ); + + static T const M = N / 2; + static T const R = N % 2; + + using S1 = typename make_integer_sequence_impl::type; + using S2 = typename append_integer_sequence::type; + using S3 = typename make_integer_sequence_impl::type; + using S4 = typename append_integer_sequence::type; + +public: + + using type = S4; +}; + +template struct make_integer_sequence_impl: iseq_if_c>, iseq_if_c>, make_integer_sequence_impl_ > > +{ +}; + +} // namespace detail + +// make_integer_sequence +template using make_integer_sequence = typename detail::make_integer_sequence_impl::type; + +#endif // defined(BOOST_MP11_HAS_MAKE_INTEGER_SEQ) + +// index_sequence +template using index_sequence = integer_sequence; + +// make_index_sequence +template using make_index_sequence = make_integer_sequence; + +// index_sequence_for +template using index_sequence_for = make_integer_sequence; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_INTEGER_SEQUENCE_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/integral.hpp b/Chapter18/cib/libs/boost/mp11/integral.hpp new file mode 100644 index 0000000..1b4fea3 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/integral.hpp @@ -0,0 +1,42 @@ +#ifndef BOOST_MP11_INTEGRAL_HPP_INCLUDED +#define BOOST_MP11_INTEGRAL_HPP_INCLUDED + +// Copyright 2015 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_bool +template using mp_bool = std::integral_constant; + +using mp_true = mp_bool; +using mp_false = mp_bool; + +// mp_to_bool +template using mp_to_bool = mp_bool( T::value )>; + +// mp_not +template using mp_not = mp_bool< !T::value >; + +// mp_int +template using mp_int = std::integral_constant; + +// mp_size_t +template using mp_size_t = std::integral_constant; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_INTEGRAL_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/list.hpp b/Chapter18/cib/libs/boost/mp11/list.hpp new file mode 100644 index 0000000..3646764 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/list.hpp @@ -0,0 +1,472 @@ +#ifndef BOOST_MP11_LIST_HPP_INCLUDED +#define BOOST_MP11_LIST_HPP_INCLUDED + +// Copyright 2015-2023 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_list +// in detail/mp_list.hpp + +// mp_list_c +template using mp_list_c = mp_list...>; + +// mp_list_v +// in detail/mp_list_v.hpp + +// mp_is_list +// in detail/mp_is_list.hpp + +// mp_is_value_list +// in detail/mp_is_value_list.hpp + +// mp_size +namespace detail +{ + +template struct mp_size_impl +{ +// An error "no type named 'type'" here means that the argument to mp_size is not a list +}; + +template class L, class... T> struct mp_size_impl> +{ + using type = mp_size_t; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto... A> struct mp_size_impl> +{ + using type = mp_size_t; +}; + +#endif + +} // namespace detail + +template using mp_size = typename detail::mp_size_impl::type; + +// mp_empty +template using mp_empty = mp_bool< mp_size::value == 0 >; + +// mp_assign +namespace detail +{ + +template struct mp_assign_impl +{ +// An error "no type named 'type'" here means that the arguments to mp_assign aren't lists +}; + +template class L1, class... T, template class L2, class... U> struct mp_assign_impl, L2> +{ + using type = L1; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L1, auto... A, template class L2, class... U> struct mp_assign_impl, L2> +{ + using type = L1; +}; + +template class L1, class... T, template class L2, auto... B> struct mp_assign_impl, L2> +{ + using type = L1...>; +}; + +template class L1, auto... A, template class L2, auto... B> struct mp_assign_impl, L2> +{ + using type = L1; +}; + +#endif + +} // namespace detail + +template using mp_assign = typename detail::mp_assign_impl::type; + +// mp_clear +template using mp_clear = mp_assign>; + +// mp_front +// in detail/mp_front.hpp + +// mp_pop_front +namespace detail +{ + +template struct mp_pop_front_impl +{ +// An error "no type named 'type'" here means that the argument to mp_pop_front +// is either not a list, or is an empty list +}; + +template class L, class T1, class... T> struct mp_pop_front_impl> +{ + using type = L; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto... A> struct mp_pop_front_impl> +{ + using type = L; +}; + +#endif + +} // namespace detail + +template using mp_pop_front = typename detail::mp_pop_front_impl::type; + +// mp_first +template using mp_first = mp_front; + +// mp_rest +template using mp_rest = mp_pop_front; + +// mp_second +namespace detail +{ + +template struct mp_second_impl +{ +// An error "no type named 'type'" here means that the argument to mp_second +// is either not a list, or has fewer than two elements +}; + +template class L, class T1, class T2, class... T> struct mp_second_impl> +{ + using type = T2; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto A2, auto... A> struct mp_second_impl> +{ + using type = mp_value; +}; + +#endif + +} // namespace detail + +template using mp_second = typename detail::mp_second_impl::type; + +// mp_third +namespace detail +{ + +template struct mp_third_impl +{ +// An error "no type named 'type'" here means that the argument to mp_third +// is either not a list, or has fewer than three elements +}; + +template class L, class T1, class T2, class T3, class... T> struct mp_third_impl> +{ + using type = T3; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto A2, auto A3, auto... A> struct mp_third_impl> +{ + using type = mp_value; +}; + +#endif + +} // namespace detail + +template using mp_third = typename detail::mp_third_impl::type; + +// mp_push_front +namespace detail +{ + +template struct mp_push_front_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_push_front is not a list +}; + +template class L, class... U, class... T> struct mp_push_front_impl, T...> +{ + using type = L; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto... A, class... T> struct mp_push_front_impl, T...> +{ + using type = L; +}; + +#endif + +} // namespace detail + +template using mp_push_front = typename detail::mp_push_front_impl::type; + +// mp_push_back +namespace detail +{ + +template struct mp_push_back_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_push_back is not a list +}; + +template class L, class... U, class... T> struct mp_push_back_impl, T...> +{ + using type = L; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto... A, class... T> struct mp_push_back_impl, T...> +{ + using type = L; +}; + +#endif + +} // namespace detail + +template using mp_push_back = typename detail::mp_push_back_impl::type; + +// mp_rename +// mp_apply +// mp_apply_q +// in detail/mp_rename.hpp + +// mp_rename_v +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +namespace detail +{ + +template class B> struct mp_rename_v_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_rename_v is not a list +}; + +template class L, class... T, template class B> struct mp_rename_v_impl, B> +{ + using type = B; +}; + +template class L, auto... A, template class B> struct mp_rename_v_impl, B> +{ + using type = B; +}; + +} // namespace detail + +template class B> using mp_rename_v = typename detail::mp_rename_v_impl::type; + +#endif + +// mp_replace_front +namespace detail +{ + +template struct mp_replace_front_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_replace_front +// is either not a list, or is an empty list +}; + +template class L, class U1, class... U, class T> struct mp_replace_front_impl, T> +{ + using type = L; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto... A, class T> struct mp_replace_front_impl, T> +{ + using type = L; +}; + +#endif + +} // namespace detail + +template using mp_replace_front = typename detail::mp_replace_front_impl::type; + +// mp_replace_first +template using mp_replace_first = typename detail::mp_replace_front_impl::type; + +// mp_replace_second +namespace detail +{ + +template struct mp_replace_second_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_replace_second +// is either not a list, or has fewer than two elements +}; + +template class L, class U1, class U2, class... U, class T> struct mp_replace_second_impl, T> +{ + using type = L; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto A2, auto... A, class T> struct mp_replace_second_impl, T> +{ + using type = L; +}; + +#endif + +} // namespace detail + +template using mp_replace_second = typename detail::mp_replace_second_impl::type; + +// mp_replace_third +namespace detail +{ + +template struct mp_replace_third_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_replace_third +// is either not a list, or has fewer than three elements +}; + +template class L, class U1, class U2, class U3, class... U, class T> struct mp_replace_third_impl, T> +{ + using type = L; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto A2, auto A3, auto... A, class T> struct mp_replace_third_impl, T> +{ + using type = L; +}; + +#endif + +} // namespace detail + +template using mp_replace_third = typename detail::mp_replace_third_impl::type; + +// mp_transform_front +namespace detail +{ + +template class F> struct mp_transform_front_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_transform_front +// is either not a list, or is an empty list +}; + +template class L, class U1, class... U, template class F> struct mp_transform_front_impl, F> +{ + using type = L, U...>; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto... A, template class F> struct mp_transform_front_impl, F> +{ + using type = L>::value, A...>; +}; + +#endif + +} // namespace detail + +template class F> using mp_transform_front = typename detail::mp_transform_front_impl::type; +template using mp_transform_front_q = mp_transform_front; + +// mp_transform_first +template class F> using mp_transform_first = typename detail::mp_transform_front_impl::type; +template using mp_transform_first_q = mp_transform_first; + +// mp_transform_second +namespace detail +{ + +template class F> struct mp_transform_second_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_transform_second +// is either not a list, or has fewer than two elements +}; + +template class L, class U1, class U2, class... U, template class F> struct mp_transform_second_impl, F> +{ + using type = L, U...>; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto A2, auto... A, template class F> struct mp_transform_second_impl, F> +{ + using type = L>::value, A...>; +}; + +#endif + +} // namespace detail + +template class F> using mp_transform_second = typename detail::mp_transform_second_impl::type; +template using mp_transform_second_q = mp_transform_second; + +// mp_transform_third +namespace detail +{ + +template class F> struct mp_transform_third_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_transform_third +// is either not a list, or has fewer than three elements +}; + +template class L, class U1, class U2, class U3, class... U, template class F> struct mp_transform_third_impl, F> +{ + using type = L, U...>; +}; + +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L, auto A1, auto A2, auto A3, auto... A, template class F> struct mp_transform_third_impl, F> +{ + using type = L>::value, A...>; +}; + +#endif + +} // namespace detail + +template class F> using mp_transform_third = typename detail::mp_transform_third_impl::type; +template using mp_transform_third_q = mp_transform_third; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_LIST_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/map.hpp b/Chapter18/cib/libs/boost/mp11/map.hpp new file mode 100644 index 0000000..b9581ac --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/map.hpp @@ -0,0 +1,119 @@ +#ifndef BOOST_MP11_MAP_HPP_INCLUDED +#define BOOST_MP11_MAP_HPP_INCLUDED + +// Copyright 2015-2017 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_map_contains +template using mp_map_contains = mp_not, void>>; + +// mp_map_insert +template using mp_map_insert = mp_if< mp_map_contains>, M, mp_push_back >; + +// mp_map_replace +namespace detail +{ + +template struct mp_map_replace_impl; + +template class M, class... U, class T> struct mp_map_replace_impl, T> +{ + using K = mp_first; + + // mp_replace_if is inlined here using a struct _f because of msvc-14.0 + + template struct _f { using type = mp_if< std::is_same, K>, T, V >; }; + + using type = mp_if< mp_map_contains, K>, M::type...>, M >; +}; + +} // namespace detail + +template using mp_map_replace = typename detail::mp_map_replace_impl::type; + +// mp_map_update +namespace detail +{ + +template class F> struct mp_map_update_impl +{ + template using _f = std::is_same, mp_first>; + + // _f3> -> L> + template using _f3 = mp_assign, mp_rename > >; + + using type = mp_if< mp_map_contains>, mp_transform_if<_f, _f3, M>, mp_push_back >; +}; + +} // namespace detail + +template class F> using mp_map_update = typename detail::mp_map_update_impl::type; +template using mp_map_update_q = mp_map_update; + +// mp_map_erase +namespace detail +{ + +template struct mp_map_erase_impl +{ + template using _f = std::is_same, K>; + using type = mp_remove_if; +}; + +} // namespace detail + +template using mp_map_erase = typename detail::mp_map_erase_impl::type; + +// mp_map_keys +template using mp_map_keys = mp_transform; + +// mp_is_map +namespace detail +{ + +template struct mp_is_map_element: mp_false +{ +}; + +template class L, class T1, class... T> struct mp_is_map_element>: mp_true +{ +}; + +template using mp_keys_are_set = mp_is_set>; + +template struct mp_is_map_impl +{ + using type = mp_false; +}; + +template class M, class... T> struct mp_is_map_impl> +{ + using type = mp_eval_if...>>, mp_false, mp_keys_are_set, M>; +}; + +} // namespace detail + +template using mp_is_map = typename detail::mp_is_map_impl::type; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_MAP_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/mpl.hpp b/Chapter18/cib/libs/boost/mp11/mpl.hpp new file mode 100644 index 0000000..994705f --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/mpl.hpp @@ -0,0 +1,14 @@ +#ifndef BOOST_MP11_MPL_HPP_INCLUDED +#define BOOST_MP11_MPL_HPP_INCLUDED + +// Copyright 2017, 2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#endif // #ifndef BOOST_MP11_MPL_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/mpl_list.hpp b/Chapter18/cib/libs/boost/mp11/mpl_list.hpp new file mode 100644 index 0000000..643da43 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/mpl_list.hpp @@ -0,0 +1,28 @@ +#ifndef BOOST_MP11_MPL_LIST_HPP_INCLUDED +#define BOOST_MP11_MPL_LIST_HPP_INCLUDED + +// Copyright 2017, 2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include + +namespace boost +{ +namespace mpl +{ + +template< typename Sequence > struct sequence_tag; + +template struct sequence_tag> +{ + using type = aux::mp11_tag; +}; + +} // namespace mpl +} // namespace boost + +#endif // #ifndef BOOST_MP11_MPL_LIST_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/mpl_tuple.hpp b/Chapter18/cib/libs/boost/mp11/mpl_tuple.hpp new file mode 100644 index 0000000..b6900b1 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/mpl_tuple.hpp @@ -0,0 +1,29 @@ +#ifndef BOOST_MP11_MPL_TUPLE_HPP_INCLUDED +#define BOOST_MP11_MPL_TUPLE_HPP_INCLUDED + +// Copyright 2017, 2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +namespace boost +{ +namespace mpl +{ + +template< typename Sequence > struct sequence_tag; + +template struct sequence_tag> +{ + using type = aux::mp11_tag; +}; + +} // namespace mpl +} // namespace boost + +#endif // #ifndef BOOST_MP11_MPL_TUPLE_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/set.hpp b/Chapter18/cib/libs/boost/mp11/set.hpp new file mode 100644 index 0000000..808636b --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/set.hpp @@ -0,0 +1,188 @@ +#ifndef BOOST_MP11_SET_HPP_INCLUDED +#define BOOST_MP11_SET_HPP_INCLUDED + +// Copyright 2015, 2019 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_set_contains +namespace detail +{ + +template struct mp_set_contains_impl +{ +}; + +template class L, class... T, class V> struct mp_set_contains_impl, V> +{ + using type = mp_to_bool, mp_inherit...> > >; +}; + +} // namespace detail + +template using mp_set_contains = typename detail::mp_set_contains_impl::type; + +// mp_set_push_back +namespace detail +{ + +template struct mp_set_push_back_impl +{ +}; + +template class L, class... U> struct mp_set_push_back_impl> +{ + using type = L; +}; + +template class L, class... U, class T1, class... T> struct mp_set_push_back_impl, T1, T...> +{ + using S = mp_if, T1>, L, L>; + using type = typename mp_set_push_back_impl::type; +}; + +} // namespace detail + +template using mp_set_push_back = typename detail::mp_set_push_back_impl::type; + +// mp_set_push_front +namespace detail +{ + +template struct mp_set_push_front_impl +{ +}; + +template class L, class... U> struct mp_set_push_front_impl> +{ + using type = L; +}; + +template class L, class... U, class T1> struct mp_set_push_front_impl, T1> +{ + using type = mp_if, T1>, L, L>; +}; + +template class L, class... U, class T1, class... T> struct mp_set_push_front_impl, T1, T...> +{ + using S = typename mp_set_push_front_impl, T...>::type; + using type = typename mp_set_push_front_impl::type; +}; + +} // namespace detail + +template using mp_set_push_front = typename detail::mp_set_push_front_impl::type; + +// mp_is_set +namespace detail +{ + +template struct mp_is_set_impl +{ + using type = mp_false; +}; + +template class L, class... T> struct mp_is_set_impl> +{ + using type = mp_to_bool, mp_set_push_back, T...> > >; +}; + +} // namespace detail + +template using mp_is_set = typename detail::mp_is_set_impl::type; + +// mp_set_union +namespace detail +{ + +template struct mp_set_union_impl +{ +}; + +template<> struct mp_set_union_impl<> +{ + using type = mp_list<>; +}; + +template class L, class... T> struct mp_set_union_impl> +{ + using type = L; +}; + +template class L1, class... T1, template class L2, class... T2> struct mp_set_union_impl, L2> +{ + using type = mp_set_push_back, T2...>; +}; + +template using mp_set_union_ = typename mp_set_union_impl, L...>>::type; + +template struct mp_set_union_impl: mp_defer +{ +}; + +} // namespace detail + +template using mp_set_union = typename detail::mp_set_union_impl::type; + +// mp_set_intersection +namespace detail +{ + +template struct in_all_sets +{ + template using fn = mp_all< mp_set_contains... >; +}; + +template using mp_set_intersection_ = mp_if< mp_all...>, mp_copy_if_q> >; + +template struct mp_set_intersection_impl +{ +}; + +template<> struct mp_set_intersection_impl<> +{ + using type = mp_list<>; +}; + +template struct mp_set_intersection_impl: mp_defer +{ +}; + +} // namespace detail + +template using mp_set_intersection = typename detail::mp_set_intersection_impl::type; + +// mp_set_difference +namespace detail +{ + +template struct in_any_set +{ + template using fn = mp_any< mp_set_contains... >; +}; + +} // namespace detail + +template using mp_set_difference = mp_if< mp_all...>, mp_remove_if_q> >; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_SET_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/tuple.hpp b/Chapter18/cib/libs/boost/mp11/tuple.hpp new file mode 100644 index 0000000..044801d --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/tuple.hpp @@ -0,0 +1,183 @@ +#ifndef BOOST_MP11_TUPLE_HPP_INCLUDED +#define BOOST_MP11_TUPLE_HPP_INCLUDED + +// Copyright 2015-2020 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include +#include + +#if BOOST_MP11_MSVC +# pragma warning( push ) +# pragma warning( disable: 4100 ) // unreferenced formal parameter 'tp' +#endif + +namespace boost +{ +namespace mp11 +{ + +// tuple_apply +namespace detail +{ + +using std::get; + +template BOOST_MP11_CONSTEXPR auto tuple_apply_impl( F && f, Tp && tp, integer_sequence ) + -> decltype( std::forward(f)( get(std::forward(tp))... ) ) +{ + return std::forward(f)( get(std::forward(tp))... ); +} + +} // namespace detail + +template::type>::value>> +BOOST_MP11_CONSTEXPR auto tuple_apply( F && f, Tp && tp ) + -> decltype( detail::tuple_apply_impl( std::forward(f), std::forward(tp), Seq() ) ) +{ + return detail::tuple_apply_impl( std::forward(f), std::forward(tp), Seq() ); +} + +// construct_from_tuple +namespace detail +{ + +template BOOST_MP11_CONSTEXPR T construct_from_tuple_impl( Tp && tp, integer_sequence ) +{ + return T( get(std::forward(tp))... ); +} + +} // namespace detail + +template::type>::value>> +BOOST_MP11_CONSTEXPR T construct_from_tuple( Tp && tp ) +{ + return detail::construct_from_tuple_impl( std::forward(tp), Seq() ); +} + +// tuple_for_each +namespace detail +{ + +template BOOST_MP11_CONSTEXPR F tuple_for_each_impl( Tp && tp, integer_sequence, F && f ) +{ + using A = int[sizeof...(J)]; + return (void)A{ ((void)f(get(std::forward(tp))), 0)... }, std::forward(f); +} + +template BOOST_MP11_CONSTEXPR F tuple_for_each_impl( Tp && /*tp*/, integer_sequence, F && f ) +{ + return std::forward(f); +} + +} // namespace detail + +template BOOST_MP11_CONSTEXPR F tuple_for_each( Tp && tp, F && f ) +{ + using seq = make_index_sequence::type>::value>; + return detail::tuple_for_each_impl( std::forward(tp), seq(), std::forward(f) ); +} + +// tuple_transform + +namespace detail +{ + +// std::forward_as_tuple is not constexpr in C++11 or libstdc++ 5.x +template BOOST_MP11_CONSTEXPR auto tp_forward_r( T&&... t ) -> std::tuple +{ + return std::tuple( std::forward( t )... ); +} + +template BOOST_MP11_CONSTEXPR auto tp_forward_v( T&&... t ) -> std::tuple +{ + return std::tuple( std::forward( t )... ); +} + +template +BOOST_MP11_CONSTEXPR auto tp_extract( Tp&&... tp ) + -> decltype( tp_forward_r( get( std::forward( tp ) )... ) ) +{ + return tp_forward_r( get( std::forward( tp ) )... ); +} + +#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) + +template +BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp&&... tp ) + -> decltype( tp_forward_v( tuple_apply( f, tp_extract( std::forward(tp)... ) )... ) ) +{ + return tp_forward_v( tuple_apply( f, tp_extract( std::forward(tp)... ) )... ); +} + +#else + +template +BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1 ) + -> decltype( tp_forward_v( f( get( std::forward(tp1) ) )... ) ) +{ + return tp_forward_v( f( get( std::forward(tp1) ) )... ); +} + +template +BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1, Tp2&& tp2 ) + -> decltype( tp_forward_v( f( get( std::forward(tp1) ), get( std::forward(tp2) ) )... ) ) +{ + return tp_forward_v( f( get( std::forward(tp1) ), get( std::forward(tp2) ) )... ); +} + +template +BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1, Tp2&& tp2, Tp3&& tp3 ) + -> decltype( tp_forward_v( f( get( std::forward(tp1) ), get( std::forward(tp2) ), get( std::forward(tp3) ) )... ) ) +{ + return tp_forward_v( f( get( std::forward(tp1) ), get( std::forward(tp2) ), get( std::forward(tp3) ) )... ); +} + +#endif // !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) + +} // namespace detail + +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1910 ) + +template::type>::value>> +BOOST_MP11_CONSTEXPR auto tuple_transform( F const& f, Tp1&& tp1, Tp&&... tp ) + -> decltype( detail::tuple_transform_impl( Seq(), f, std::forward(tp1), std::forward(tp)... ) ) +{ + return detail::tuple_transform_impl( Seq(), f, std::forward(tp1), std::forward(tp)... ); +} + +#else + +template::type>::value>...>, + class E = mp_if, mp_front>, + class Seq = make_index_sequence> +BOOST_MP11_CONSTEXPR auto tuple_transform( F const& f, Tp&&... tp ) + -> decltype( detail::tuple_transform_impl( Seq(), f, std::forward(tp)... ) ) +{ + return detail::tuple_transform_impl( Seq(), f, std::forward(tp)... ); +} + +#endif // BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1910 ) + +} // namespace mp11 +} // namespace boost + +#if BOOST_MP11_MSVC +# pragma warning( pop ) +#endif + +#endif // #ifndef BOOST_TUPLE_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/utility.hpp b/Chapter18/cib/libs/boost/mp11/utility.hpp new file mode 100644 index 0000000..4010aee --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/utility.hpp @@ -0,0 +1,169 @@ +#ifndef BOOST_MP11_UTILITY_HPP_INCLUDED +#define BOOST_MP11_UTILITY_HPP_INCLUDED + +// Copyright 2015-2020 Peter Dimov. +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include + +namespace boost +{ +namespace mp11 +{ + +// mp_identity +template struct mp_identity +{ + using type = T; +}; + +// mp_identity_t +template using mp_identity_t = typename mp_identity::type; + +// mp_inherit +template struct mp_inherit: T... {}; + +// mp_if, mp_if_c +// mp_valid +// mp_defer +// moved to detail/mp_defer.hpp + +// mp_eval_if, mp_eval_if_c +namespace detail +{ + +template class F, class... U> struct mp_eval_if_c_impl; + +template class F, class... U> struct mp_eval_if_c_impl +{ + using type = T; +}; + +template class F, class... U> struct mp_eval_if_c_impl: mp_defer +{ +}; + +} // namespace detail + +template class F, class... U> using mp_eval_if_c = typename detail::mp_eval_if_c_impl::type; +template class F, class... U> using mp_eval_if = typename detail::mp_eval_if_c_impl(C::value), T, F, U...>::type; +template using mp_eval_if_q = typename detail::mp_eval_if_c_impl(C::value), T, Q::template fn, U...>::type; + +// mp_eval_if_not +template class F, class... U> using mp_eval_if_not = mp_eval_if, T, F, U...>; +template using mp_eval_if_not_q = mp_eval_if, T, Q::template fn, U...>; + +// mp_eval_or +template class F, class... U> using mp_eval_or = mp_eval_if_not, T, F, U...>; +template using mp_eval_or_q = mp_eval_or; + +// mp_valid_and_true +template class F, class... T> using mp_valid_and_true = mp_eval_or; +template using mp_valid_and_true_q = mp_valid_and_true; + +// mp_cond + +// so elegant; so doesn't work +// template using mp_cond = mp_eval_if; + +namespace detail +{ + +template struct mp_cond_impl; + +} // namespace detail + +template using mp_cond = typename detail::mp_cond_impl::type; + +namespace detail +{ + +template using mp_cond_ = mp_eval_if; + +template struct mp_cond_impl: mp_defer +{ +}; + +} // namespace detail + +// mp_quote +template class F> struct mp_quote +{ + // the indirection through mp_defer works around the language inability + // to expand T... into a fixed parameter list of an alias template + + template using fn = typename mp_defer::type; +}; + +// mp_quote_trait +template class F> struct mp_quote_trait +{ + template using fn = typename F::type; +}; + +// mp_invoke_q +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) + +namespace detail +{ + +template struct mp_invoke_q_impl: mp_defer {}; + +} // namespace detail + +template using mp_invoke_q = typename detail::mp_invoke_q_impl::type; + +#elif BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 50000 ) + +template using mp_invoke_q = typename mp_defer::type; + +#else + +template using mp_invoke_q = typename Q::template fn; + +#endif + +// mp_not_fn

+template class P> struct mp_not_fn +{ + template using fn = mp_not< mp_invoke_q, T...> >; +}; + +template using mp_not_fn_q = mp_not_fn; + +// mp_compose +namespace detail +{ + +template using mp_compose_helper = mp_list< mp_apply_q >; + +} // namespace detail + +#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) + +template class... F> struct mp_compose +{ + template using fn = mp_front< mp_fold...>, mp_list, detail::mp_compose_helper> >; +}; + +#endif + +template struct mp_compose_q +{ + template using fn = mp_front< mp_fold, mp_list, detail::mp_compose_helper> >; +}; + +} // namespace mp11 +} // namespace boost + +#endif // #ifndef BOOST_MP11_UTILITY_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/mp11/version.hpp b/Chapter18/cib/libs/boost/mp11/version.hpp new file mode 100644 index 0000000..0912665 --- /dev/null +++ b/Chapter18/cib/libs/boost/mp11/version.hpp @@ -0,0 +1,16 @@ +#ifndef BOOST_MP11_VERSION_HPP_INCLUDED +#define BOOST_MP11_VERSION_HPP_INCLUDED + +// Copyright 2019 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +// Same format as BOOST_VERSION: +// major * 100000 + minor * 100 + patch + +#define BOOST_MP11_VERSION 108300 + +#endif // #ifndef BOOST_MP11_VERSION_HPP_INCLUDED diff --git a/Chapter18/cib/libs/boost/sml.hpp b/Chapter18/cib/libs/boost/sml.hpp new file mode 100644 index 0000000..ca66764 --- /dev/null +++ b/Chapter18/cib/libs/boost/sml.hpp @@ -0,0 +1,2900 @@ +// +// Copyright (c) 2016-2024 Kris Jusiak (kris at jusiak dot net) +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#ifndef BOOST_SML_HPP +#define BOOST_SML_HPP +#if (__cplusplus < 201305L && _MSC_VER < 1900) +#error "[Boost::ext].SML requires C++14 support (Clang-3.4+, GCC-5.1+, MSVC-2015+)" +#else +#if defined(__ICCARM__) && __IAR_SYSTEMS_ICC__ < 8 +#error "[Boost::ext].SML requires C++14 support (IAR C/C++ ARM 8.1+)" +#endif +#define BOOST_SML_VERSION 1'1'11 +#define BOOST_SML_NAMESPACE_BEGIN \ + namespace boost { \ + inline namespace ext { \ + namespace sml { \ + inline namespace v1_1_11 { +#define BOOST_SML_NAMESPACE_END \ + } \ + } \ + } \ + } +#if defined(__clang__) +#define __BOOST_SML_UNUSED __attribute__((unused)) +#define __BOOST_SML_VT_INIT \ + {} +#if !defined(BOOST_SML_CFG_DISABLE_MIN_SIZE) +#define __BOOST_SML_ZERO_SIZE_ARRAY(...) __VA_ARGS__ _[0] +#else +#define __BOOST_SML_ZERO_SIZE_ARRAY(...) +#endif +#define __BOOST_SML_ZERO_SIZE_ARRAY_CREATE(...) +#define __BOOST_SML_TEMPLATE_KEYWORD template +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu-string-literal-operator-template" +#pragma clang diagnostic ignored "-Wzero-length-array" +#elif defined(__GNUC__) +#if !defined(__has_builtin) +#define __BOOST_SML_DEFINED_HAS_BUILTIN +#define __has_builtin(...) 0 +#endif +#define __BOOST_SML_UNUSED __attribute__((unused)) +#define __BOOST_SML_VT_INIT \ + {} +#if !defined(BOOST_SML_CFG_DISABLE_MIN_SIZE) +#define __BOOST_SML_ZERO_SIZE_ARRAY(...) __VA_ARGS__ _[0]{} +#else +#define __BOOST_SML_ZERO_SIZE_ARRAY(...) +#endif +#define __BOOST_SML_ZERO_SIZE_ARRAY_CREATE(...) __VA_ARGS__ ? __VA_ARGS__ : 1 +#define __BOOST_SML_TEMPLATE_KEYWORD template +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#if defined(__GNUC__) && (__GNUC__ >= 10) +#pragma GCC diagnostic ignored "-Wsubobject-linkage" +#endif +#elif defined(_MSC_VER) && !defined(__clang__) +#define __BOOST_SML_DEFINED_HAS_BUILTIN +#define __has_builtin(...) __has_builtin##__VA_ARGS__ +#define __has_builtin__make_integer_seq(...) 1 +#define __BOOST_SML_UNUSED +#define __BOOST_SML_VT_INIT +#define __BOOST_SML_ZERO_SIZE_ARRAY(...) +#define __BOOST_SML_ZERO_SIZE_ARRAY_CREATE(...) __VA_ARGS__ ? __VA_ARGS__ : 1 +#if defined(_MSC_VER) && !defined(__clang__) && _MSC_VER >= 1910 // MSVC 2017 +#define __BOOST_SML_TEMPLATE_KEYWORD template +#else +#define __BOOST_SML_TEMPLATE_KEYWORD +#endif +#pragma warning(disable : 4503) +#pragma warning(disable : 4200) +#elif defined(__ICCARM__) +#if !defined(__has_builtin) +#define __BOOST_SML_DEFINED_HAS_BUILTIN +#define __has_builtin(...) 0 +#endif +/* Needs IAR language extensions */ +#define __BOOST_SML_UNUSED __attribute__((unused)) +#define __BOOST_SML_VT_INIT \ + {} +#define __BOOST_SML_ZERO_SIZE_ARRAY(...) +#define __BOOST_SML_ZERO_SIZE_ARRAY_CREATE(...) __VA_ARGS__ ? __VA_ARGS__ : 1 +#define __BOOST_SML_TEMPLATE_KEYWORD template +#endif +BOOST_SML_NAMESPACE_BEGIN +#define __BOOST_SML_REQUIRES(...) typename aux::enable_if<__VA_ARGS__, int>::type = 0 +namespace aux { +using byte = unsigned char; +struct none_type {}; +template +struct type {}; +template +struct non_type {}; +template +struct pair {}; +template +struct type_list { + using type = type_list; +}; +template +struct bool_list { + using type = bool_list; +}; +template +struct inherit : Ts... { + using type = inherit; +}; +template +struct identity { + using type = T; +}; +template +T &&declval(); +template +struct integral_constant { + using type = integral_constant; + static constexpr T value = V; +}; +using true_type = integral_constant; +using false_type = integral_constant; +template +using void_t = void; +template +struct always : true_type {}; +template +struct never : false_type {}; +namespace detail { +template +struct conditional; +template <> +struct conditional { + template + using fn = T; +}; +template <> +struct conditional { + template + using fn = T; +}; +} // namespace detail +template +struct conditional { + using type = typename detail::conditional::template fn; +}; +template +using conditional_t = typename detail::conditional::template fn; +template +struct enable_if {}; +template +struct enable_if { + using type = T; +}; +template +using enable_if_t = typename enable_if::type; +template +struct is_same : false_type {}; +template +struct is_same : true_type {}; +template +#if defined(_MSC_VER) && !defined(__clang__) +struct is_base_of : integral_constant { +}; +#else +using is_base_of = integral_constant; +#endif +template +decltype(T(declval()...), true_type{}) test_is_constructible(int); +template +false_type test_is_constructible(...); +template +#if defined(_MSC_VER) && !defined(__clang__) +struct is_constructible : decltype(test_is_constructible(0)) { +}; +#else +using is_constructible = decltype(test_is_constructible(0)); +#endif +template +struct is_empty_base : T { + U _; +}; +template +struct is_empty : aux::integral_constant) == sizeof(none_type)> {}; +template +struct function_traits; +template +struct function_traits { + using args = type_list; +}; +template +struct function_traits { + using args = type_list; +}; +template +struct function_traits { + using args = type_list; +}; +template +struct function_traits { + using args = type_list; +}; +#if defined(__cpp_noexcept_function_type) +template +struct function_traits { + using args = type_list; +}; +template +struct function_traits { + using args = type_list; +}; +template +struct function_traits { + using args = type_list; +}; +template +struct function_traits { + using args = type_list; +}; +#endif +template +using function_traits_t = typename function_traits::args; +template +struct remove_const { + using type = T; +}; +template +struct remove_const { + using type = T; +}; +template +using remove_const_t = typename remove_const::type; +template +struct remove_reference { + using type = T; +}; +template +struct remove_reference { + using type = T; +}; +template +struct remove_reference { + using type = T; +}; +template +using remove_reference_t = typename remove_reference::type; +template +struct remove_pointer { + using type = T; +}; +template +struct remove_pointer { + using type = T; +}; +template +using remove_pointer_t = typename remove_pointer::type; +} // namespace aux +namespace aux { +using swallow = int[]; +template +struct index_sequence { + using type = index_sequence; +}; +#if __has_builtin(__make_integer_seq) +template +struct integer_sequence; +template +struct integer_sequence { + using type = index_sequence; +}; +template +struct make_index_sequence_impl { + using type = typename __make_integer_seq::type; +}; +#else +template +struct concat; +template +struct concat, index_sequence> : index_sequence {}; +template +struct make_index_sequence_impl + : concat::type, typename make_index_sequence_impl::type>::type {}; +template <> +struct make_index_sequence_impl<0> : index_sequence<> {}; +template <> +struct make_index_sequence_impl<1> : index_sequence<0> {}; +#endif +template +using make_index_sequence = typename make_index_sequence_impl::type; +template +struct join { + using type = type_list<>; +}; +template +struct join { + using type = T; +}; +template +struct join> : type_list {}; +template +struct join, type_list> : type_list {}; +template +struct join, type_list, type_list> : type_list {}; +template +struct join, type_list, Ts...> : join, Ts...> {}; +template +struct join, type_list, type_list, type_list, type_list, type_list, + type_list, type_list, type_list, type_list, type_list, type_list, + type_list, type_list, type_list, type_list, type_list, Us...> + : join, + Us...> {}; +template +using join_t = typename join::type; +template +struct unique_impl; +template +struct unique_impl, T, Ts...> : conditional_t, inherit...>>::value, + unique_impl, Ts...>, unique_impl, Ts...>> { +}; +template +struct unique_impl> : type_list {}; +template +struct unique : unique_impl, Ts...> {}; +template +struct unique : type_list {}; +template +using unique_t = typename unique::type; +template +struct is_unique; +template +struct is_unique : true_type {}; +template +struct is_unique, T, Ts...> + : conditional_t, inherit...>>::value, false_type, is_unique, Ts...>> {}; +template +using is_unique_t = is_unique, Ts...>; +template