From 9df4f2c4fc1cee766ec272e9993da2b01f934fbb Mon Sep 17 00:00:00 2001 From: dP Date: Sun, 15 Aug 2021 14:57:29 +0300 Subject: [PATCH] Update to 12.0-beta1 --- .changelog | 23 - .dorpsgek.yml | 1 + .github/ISSUE_TEMPLATE/bug.yaml | 41 + .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/crash.yaml | 37 + .github/workflows/ci-build.yml | 91 +- .github/workflows/commit-checker.yml | 34 +- .github/workflows/release.yml | 43 +- .ottdrev | 2 +- .release_date | 2 +- .version | 2 +- CMakeLists.txt | 15 +- CREDITS.md | 2 +- README.md | 5 +- bin/ai/CMakeLists.txt | 1 + bin/ai/compat_1.11.nut | 2 + bin/ai/compat_12.nut | 6 + bin/game/CMakeLists.txt | 1 + bin/game/compat_1.11.nut | 2 + bin/game/compat_12.nut | 6 + changelog.txt | 110 +- cmake/CompileFlags.cmake | 8 +- cmake/InstallAndPackage.cmake | 7 + cmake/MSVCFilters.cmake | 3 +- cmake/Options.cmake | 2 +- cmake/scripts/FindVersion.cmake | 5 +- cmake/scripts/SquirrelExport.cmake | 8 +- docs/company_colour_indexes.html | 557 +++ docs/game_coordinator.md | 83 + docs/multiplayer.md | 11 +- docs/savegame_format.md | 214 + known-bugs.txt | 2 - media/baseset/openttd.grf | Bin 510358 -> 510635 bytes media/baseset/openttd/openttdgui.nfo | 7 +- media/baseset/openttd/openttdgui.png | Bin 43899 -> 44530 bytes media/baseset/opntitle.dat | Bin 98096 -> 138710 bytes os/emscripten/cmake/FindLibLZMA.cmake | 2 +- os/emscripten/pre.js | 20 +- os/emscripten/shell.html | 2 + os/windows/sign.bat | 18 + regression/regression/info.nut | 2 +- regression/stationlist/info.nut | 2 +- src/3rdparty/CMakeLists.txt | 1 + src/3rdparty/fmt/CMakeLists.txt | 5 + src/3rdparty/fmt/LICENSE.rst | 27 + src/3rdparty/fmt/core.h | 2122 ++++++++ src/3rdparty/fmt/format-inl.h | 2801 +++++++++++ src/3rdparty/fmt/format.h | 3960 +++++++++++++++ src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp | 4 +- src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp | 4 +- src/3rdparty/squirrel/squirrel/sqapi.cpp | 58 +- src/3rdparty/squirrel/squirrel/sqbaselib.cpp | 50 +- src/3rdparty/squirrel/squirrel/sqclass.cpp | 18 +- src/3rdparty/squirrel/squirrel/sqclosure.h | 2 +- src/3rdparty/squirrel/squirrel/sqcompiler.cpp | 7 +- .../squirrel/squirrel/sqfuncstate.cpp | 3 +- src/3rdparty/squirrel/squirrel/sqlexer.cpp | 4 +- src/3rdparty/squirrel/squirrel/sqobject.cpp | 10 +- src/3rdparty/squirrel/squirrel/sqobject.h | 6 +- src/3rdparty/squirrel/squirrel/sqstate.cpp | 44 +- src/3rdparty/squirrel/squirrel/sqtable.cpp | 12 +- src/3rdparty/squirrel/squirrel/sqtable.h | 8 +- src/3rdparty/squirrel/squirrel/squserdata.h | 6 +- src/3rdparty/squirrel/squirrel/squtils.h | 2 +- src/3rdparty/squirrel/squirrel/sqvm.cpp | 30 +- src/CMakeLists.txt | 5 + src/ai/ai_core.cpp | 6 +- src/ai/ai_gui.cpp | 44 +- src/ai/ai_info.cpp | 8 +- src/ai/ai_scanner.cpp | 2 +- src/aircraft_cmd.cpp | 6 +- src/airport_gui.cpp | 20 +- src/autoreplace.cpp | 3 +- src/autoreplace_cmd.cpp | 20 +- src/autoreplace_gui.cpp | 41 +- src/base_media_func.h | 24 +- src/blitter/32bpp_anim.cpp | 2 +- src/blitter/32bpp_anim_sse4.cpp | 5 +- src/blitter/32bpp_simple.cpp | 2 +- src/blitter/32bpp_sse_func.hpp | 4 +- src/blitter/common.hpp | 56 +- src/blitter/factory.hpp | 6 +- src/bootstrap_gui.cpp | 13 +- src/bridge_gui.cpp | 6 +- src/build_vehicle_gui.cpp | 15 +- src/cargo_type.h | 1 + src/cargopacket.h | 13 +- src/cargotype.cpp | 47 +- src/cargotype.h | 70 +- src/cheat_gui.cpp | 2 +- src/cheat_type.h | 3 - src/command.cpp | 14 +- src/command_func.h | 8 +- src/command_type.h | 6 +- src/company_base.h | 12 +- src/company_cmd.cpp | 66 +- src/company_gui.cpp | 205 +- src/company_gui.h | 2 +- src/console.cpp | 207 +- src/console_cmds.cpp | 927 ++-- src/console_func.h | 29 +- src/console_gui.cpp | 15 +- src/console_internal.h | 38 +- src/console_type.h | 1 + src/core/backup_type.hpp | 2 +- src/core/bitmath_func.hpp | 86 +- src/core/geometry_type.hpp | 6 - src/core/kdtree.hpp | 4 +- src/core/overflowsafe_type.hpp | 233 +- src/core/pool_func.hpp | 8 +- src/core/pool_type.hpp | 24 +- src/core/random_func.cpp | 2 +- src/core/span_type.hpp | 100 + src/crashlog.cpp | 8 +- src/currency.h | 16 +- src/date_gui.cpp | 4 +- src/date_type.h | 1 + src/debug.cpp | 59 +- src/debug.h | 19 +- src/depot.cpp | 4 +- src/depot_cmd.cpp | 6 +- src/depot_gui.cpp | 13 +- src/dock_gui.cpp | 28 +- src/driver.cpp | 6 +- src/economy.cpp | 40 +- src/economy_type.h | 2 +- src/elrail.cpp | 8 +- src/elrail_func.h | 2 +- src/engine.cpp | 32 +- src/engine_base.h | 12 +- src/engine_gui.cpp | 4 +- src/engine_type.h | 1 + src/error.h | 4 + src/error_gui.cpp | 50 +- src/fileio.cpp | 322 +- src/fileio_func.h | 30 +- src/fios.cpp | 107 +- src/fios.h | 114 +- src/fios_gui.cpp | 39 +- src/fontcache.cpp | 44 +- src/fontcache.h | 8 +- src/framerate_gui.cpp | 10 +- src/game/game_core.cpp | 4 +- src/game/game_info.cpp | 6 +- src/game/game_text.cpp | 19 +- src/gamelog.cpp | 6 +- src/gamelog.h | 4 +- src/gamelog_internal.h | 2 +- src/genworld.cpp | 12 +- src/genworld_gui.cpp | 8 +- src/gfx.cpp | 106 +- src/gfx_func.h | 26 +- src/gfx_layout.cpp | 2 +- src/gfx_type.h | 18 + src/gfxinit.cpp | 70 +- src/goal.cpp | 34 +- src/goal_gui.cpp | 9 +- src/graph_gui.cpp | 56 +- src/group.h | 8 +- src/group_cmd.cpp | 59 +- src/group_gui.cpp | 16 +- src/heightmap.cpp | 44 +- src/highscore.cpp | 6 +- src/highscore_gui.cpp | 17 +- src/industry_cmd.cpp | 33 +- src/industry_gui.cpp | 306 +- src/ini.cpp | 8 +- src/ini_load.cpp | 38 +- src/ini_type.h | 3 +- src/landscape.cpp | 4 +- src/lang/CMakeLists.txt | 9 + src/lang/afrikaans.txt | 99 +- src/lang/arabic_egypt.txt | 94 +- src/lang/basque.txt | 96 +- src/lang/belarusian.txt | 99 +- src/lang/brazilian_portuguese.txt | 192 +- src/lang/bulgarian.txt | 98 +- src/lang/catalan.txt | 198 +- src/lang/chuvash.txt | 1538 ++++++ src/lang/croatian.txt | 99 +- src/lang/czech.txt | 110 +- src/lang/danish.txt | 99 +- src/lang/dutch.txt | 196 +- src/lang/english.txt | 197 +- src/lang/english_AU.txt | 98 +- src/lang/english_US.txt | 196 +- src/lang/esperanto.txt | 94 +- src/lang/estonian.txt | 153 +- src/lang/faroese.txt | 96 +- src/lang/finnish.txt | 232 +- src/lang/french.txt | 196 +- src/lang/frisian.txt | 4409 +++++++++++++++++ src/lang/gaelic.txt | 98 +- src/lang/galician.txt | 99 +- src/lang/german.txt | 196 +- src/lang/greek.txt | 99 +- src/lang/hebrew.txt | 98 +- src/lang/hindi.txt | 1213 +++++ src/lang/hungarian.txt | 148 +- src/lang/icelandic.txt | 94 +- src/lang/ido.txt | 1412 ++++++ src/lang/indonesian.txt | 232 +- src/lang/irish.txt | 98 +- src/lang/italian.txt | 101 +- src/lang/japanese.txt | 696 +-- src/lang/korean.txt | 214 +- src/lang/latin.txt | 99 +- src/lang/latvian.txt | 128 +- src/lang/lithuanian.txt | 99 +- src/lang/luxembourgish.txt | 99 +- src/lang/macedonian.txt | 1963 ++++++++ src/lang/malay.txt | 95 +- src/lang/maltese.txt | 1456 ++++++ src/lang/marathi.txt | 1836 +++++++ src/lang/norwegian_bokmal.txt | 196 +- src/lang/norwegian_nynorsk.txt | 98 +- src/lang/persian.txt | 4026 +++++++++++++++ src/lang/polish.txt | 220 +- src/lang/portuguese.txt | 197 +- src/lang/romanian.txt | 222 +- src/lang/russian.txt | 202 +- src/lang/serbian.txt | 99 +- src/lang/simplified_chinese.txt | 104 +- src/lang/slovak.txt | 420 +- src/lang/slovenian.txt | 98 +- src/lang/spanish.txt | 164 +- src/lang/spanish_MX.txt | 586 +-- src/lang/swedish.txt | 326 +- src/lang/tamil.txt | 92 +- src/lang/thai.txt | 98 +- src/lang/traditional_chinese.txt | 110 +- src/lang/turkish.txt | 310 +- src/lang/ukrainian.txt | 99 +- src/lang/urdu.txt | 2920 +++++++++++ src/lang/vietnamese.txt | 204 +- src/lang/welsh.txt | 98 +- src/language.h | 1 + src/linkgraph/linkgraph.h | 11 +- src/linkgraph/linkgraph_gui.cpp | 15 +- src/linkgraph/linkgraphjob.cpp | 4 +- src/linkgraph/linkgraphjob.h | 4 +- src/linkgraph/linkgraphschedule.h | 2 +- src/linkgraph/mcf.cpp | 8 +- src/main_gui.cpp | 6 +- src/map.cpp | 2 +- src/misc/CMakeLists.txt | 2 - src/misc/array.hpp | 12 +- src/misc/dbg_helpers.cpp | 75 +- src/misc/dbg_helpers.h | 56 +- src/misc/hashtable.hpp | 3 +- src/misc_cmd.cpp | 12 +- src/misc_gui.cpp | 187 +- src/mixer.cpp | 35 +- src/music.cpp | 34 +- src/music/CMakeLists.txt | 2 +- src/music/allegro_m.cpp | 6 +- src/music/bemidi.cpp | 37 +- src/music/bemidi.h | 8 + src/music/cocoa_m.cpp | 16 +- src/music/dmusic.cpp | 56 +- src/music/extmidi.cpp | 6 +- src/music/fluidsynth.cpp | 49 +- src/music/midifile.cpp | 6 +- src/music/win32_m.cpp | 32 +- src/music_gui.cpp | 4 +- src/network/CMakeLists.txt | 6 + src/network/core/CMakeLists.txt | 7 + src/network/core/address.cpp | 222 +- src/network/core/address.h | 67 +- src/network/core/config.cpp | 69 + src/network/core/config.h | 115 +- src/network/core/core.cpp | 4 +- src/network/core/core.h | 41 +- src/network/core/game_info.cpp | 241 +- src/network/core/game_info.h | 118 +- src/network/core/host.cpp | 71 +- src/network/core/os_abstraction.cpp | 21 +- src/network/core/os_abstraction.h | 12 +- src/network/core/packet.cpp | 261 +- src/network/core/packet.h | 155 +- src/network/core/tcp.cpp | 99 +- src/network/core/tcp.h | 80 +- src/network/core/tcp_admin.cpp | 14 +- src/network/core/tcp_admin.h | 9 +- src/network/core/tcp_connect.cpp | 475 +- src/network/core/tcp_content.cpp | 65 +- src/network/core/tcp_content.h | 16 +- src/network/core/tcp_content_type.h | 39 +- src/network/core/tcp_coordinator.cpp | 106 + src/network/core/tcp_coordinator.h | 318 ++ src/network/core/tcp_game.cpp | 14 +- src/network/core/tcp_game.h | 42 +- src/network/core/tcp_http.cpp | 70 +- src/network/core/tcp_http.h | 24 +- src/network/core/tcp_listen.h | 78 +- src/network/core/tcp_stun.cpp | 29 + src/network/core/tcp_stun.h | 53 + src/network/core/tcp_turn.cpp | 71 + src/network/core/tcp_turn.h | 79 + src/network/core/udp.cpp | 63 +- src/network/core/udp.h | 142 +- src/network/network.cpp | 471 +- src/network/network_admin.cpp | 116 +- src/network/network_admin.h | 18 +- src/network/network_base.h | 9 +- src/network/network_chat_gui.cpp | 137 +- src/network/network_client.cpp | 413 +- src/network/network_client.h | 37 +- src/network/network_command.cpp | 19 +- src/network/network_content.cpp | 122 +- src/network/network_content.h | 2 +- src/network/network_content_gui.cpp | 129 +- src/network/network_content_gui.h | 10 +- src/network/network_coordinator.cpp | 781 +++ src/network/network_coordinator.h | 110 + src/network/network_func.h | 38 +- src/network/network_gamelist.cpp | 116 +- src/network/network_gamelist.h | 22 +- src/network/network_gui.cpp | 1725 ++++--- src/network/network_gui.h | 19 +- src/network/network_internal.h | 61 +- src/network/network_server.cpp | 570 +-- src/network/network_server.h | 18 +- src/network/network_stun.cpp | 140 + src/network/network_stun.h | 34 + src/network/network_turn.cpp | 135 + src/network/network_turn.h | 41 + src/network/network_type.h | 17 +- src/network/network_udp.cpp | 518 +- src/network/network_udp.h | 4 - src/newgrf.cpp | 751 +-- src/newgrf.h | 6 +- src/newgrf_airport.cpp | 12 - src/newgrf_airporttiles.cpp | 6 +- src/newgrf_canal.cpp | 12 +- src/newgrf_cargo.cpp | 12 - src/newgrf_commons.cpp | 8 +- src/newgrf_commons.h | 2 +- src/newgrf_config.cpp | 74 +- src/newgrf_config.h | 12 +- src/newgrf_debug_gui.cpp | 9 +- src/newgrf_engine.cpp | 66 +- src/newgrf_engine.h | 6 +- src/newgrf_generic.cpp | 12 +- src/newgrf_gui.cpp | 189 +- src/newgrf_house.cpp | 2 +- src/newgrf_industries.cpp | 10 +- src/newgrf_industrytiles.cpp | 6 +- src/newgrf_object.cpp | 4 +- src/newgrf_profiling.cpp | 12 +- src/newgrf_properties.h | 1 + src/newgrf_railtype.cpp | 9 +- src/newgrf_railtype.h | 2 - src/newgrf_roadtype.cpp | 9 +- src/newgrf_roadtype.h | 2 - src/newgrf_sound.cpp | 63 +- src/newgrf_spritegroup.cpp | 67 +- src/newgrf_spritegroup.h | 18 +- src/newgrf_station.cpp | 48 +- src/newgrf_station.h | 25 +- src/newgrf_storage.cpp | 2 +- src/newgrf_storage.h | 2 +- src/newgrf_text.cpp | 11 +- src/newgrf_text.h | 2 +- src/newgrf_town.cpp | 2 +- src/news_func.h | 6 +- src/news_gui.cpp | 85 +- src/news_type.h | 31 +- src/object_cmd.cpp | 18 +- src/object_gui.cpp | 2 +- src/openttd.cpp | 202 +- src/openttd.h | 3 +- src/order_backup.cpp | 4 +- src/order_backup.h | 5 +- src/order_base.h | 11 +- src/order_cmd.cpp | 22 +- src/order_gui.cpp | 22 +- src/os/macosx/font_osx.cpp | 18 +- src/os/macosx/macos.mm | 4 +- src/os/macosx/osx_stdafx.h | 8 +- src/os/os2/os2.cpp | 7 +- src/os/unix/font_unix.cpp | 6 +- src/os/unix/unix.cpp | 33 +- src/os/windows/crashlog_win.cpp | 100 +- src/os/windows/font_win32.cpp | 45 +- src/os/windows/font_win32.h | 3 +- src/os/windows/ottdres.rc.in | 4 +- src/os/windows/string_uniscribe.cpp | 2 +- src/os/windows/win32.cpp | 132 +- src/os/windows/win32.h | 50 +- src/osk_gui.cpp | 79 +- src/pathfinder/follow_track.hpp | 3 +- src/pathfinder/npf/aystar.cpp | 4 +- src/pathfinder/npf/npf.cpp | 30 +- src/pathfinder/yapf/yapf.hpp | 2 - src/pathfinder/yapf/yapf_base.hpp | 21 +- src/pathfinder/yapf/yapf_costrail.hpp | 23 +- src/pathfinder/yapf/yapf_node.hpp | 4 +- src/pathfinder/yapf/yapf_node_rail.hpp | 12 +- src/pathfinder/yapf/yapf_rail.cpp | 12 +- src/pathfinder/yapf/yapf_type.hpp | 12 +- src/rail.h | 6 - src/rail_cmd.cpp | 44 +- src/rail_gui.cpp | 59 +- src/rail_gui.h | 2 +- src/random_access_file.cpp | 156 + src/random_access_file_type.h | 58 + src/rev.cpp.in | 15 +- src/road.h | 8 +- src/road_cmd.cpp | 16 +- src/road_gui.cpp | 46 +- src/roadveh_cmd.cpp | 4 +- src/saveload/CMakeLists.txt | 3 + src/saveload/afterload.cpp | 41 +- src/saveload/ai_sl.cpp | 154 +- src/saveload/airport_sl.cpp | 38 +- src/saveload/animated_tile_sl.cpp | 87 +- src/saveload/autoreplace_sl.cpp | 70 +- src/saveload/cargomonitor_sl.cpp | 136 +- src/saveload/cargopacket_sl.cpp | 63 +- src/saveload/cheat_sl.cpp | 103 +- src/saveload/company_sl.cpp | 503 +- src/saveload/compat/CMakeLists.txt | 29 + src/saveload/compat/ai_sl_compat.h | 23 + src/saveload/compat/animated_tile_sl_compat.h | 20 + src/saveload/compat/autoreplace_sl_compat.h | 24 + src/saveload/compat/cargomonitor_sl_compat.h | 21 + src/saveload/compat/cargopacket_sl_compat.h | 28 + src/saveload/compat/cheat_sl_compat.h | 41 + src/saveload/compat/company_sl_compat.h | 129 + src/saveload/compat/depot_sl_compat.h | 25 + src/saveload/compat/economy_sl_compat.h | 38 + src/saveload/compat/engine_sl_compat.h | 48 + src/saveload/compat/game_sl_compat.h | 35 + src/saveload/compat/gamelog_sl_compat.h | 105 + src/saveload/compat/goal_sl_compat.h | 25 + src/saveload/compat/group_sl_compat.h | 28 + src/saveload/compat/industry_sl_compat.h | 72 + src/saveload/compat/labelmaps_sl_compat.h | 20 + src/saveload/compat/linkgraph_sl_compat.h | 66 + src/saveload/compat/map_sl_compat.h | 21 + src/saveload/compat/misc_sl_compat.h | 68 + src/saveload/compat/newgrf_sl_compat.h | 33 + src/saveload/compat/object_sl_compat.h | 27 + src/saveload/compat/order_sl_compat.h | 52 + src/saveload/compat/settings_sl_compat.h | 266 + src/saveload/compat/signs_sl_compat.h | 24 + src/saveload/compat/station_sl_compat.h | 181 + src/saveload/compat/storage_sl_compat.h | 21 + src/saveload/compat/story_sl_compat.h | 32 + src/saveload/compat/subsidy_sl_compat.h | 26 + src/saveload/compat/town_sl_compat.h | 87 + src/saveload/compat/vehicle_sl_compat.h | 207 + src/saveload/depot_sl.cpp | 68 +- src/saveload/economy_sl.cpp | 141 +- src/saveload/engine_sl.cpp | 146 +- src/saveload/game_sl.cpp | 264 +- src/saveload/gamelog_sl.cpp | 533 +- src/saveload/goal_sl.cpp | 50 +- src/saveload/group_sl.cpp | 64 +- src/saveload/industry_sl.cpp | 201 +- src/saveload/labelmaps_sl.cpp | 56 +- src/saveload/linkgraph_sl.cpp | 408 +- src/saveload/map_sl.cpp | 619 ++- src/saveload/misc_sl.cpp | 162 +- src/saveload/newgrf_sl.cpp | 111 +- src/saveload/newgrf_sl.h | 9 +- src/saveload/object_sl.cpp | 84 +- src/saveload/oldloader.cpp | 10 +- src/saveload/oldloader_sl.cpp | 40 +- src/saveload/order_sl.cpp | 284 +- src/saveload/saveload.cpp | 1441 ++++-- src/saveload/saveload.h | 453 +- src/saveload/saveload_internal.h | 1 - src/saveload/settings_sl.cpp | 214 + src/saveload/signs_sl.cpp | 77 +- src/saveload/station_sl.cpp | 929 ++-- src/saveload/storage_sl.cpp | 59 +- src/saveload/story_sl.cpp | 116 +- src/saveload/strings_sl.cpp | 37 +- src/saveload/subsidy_sl.cpp | 67 +- src/saveload/town_sl.cpp | 268 +- src/saveload/vehicle_sl.cpp | 681 +-- src/saveload/waypoint_sl.cpp | 83 +- src/screenshot.cpp | 10 +- src/screenshot.h | 2 +- src/screenshot_gui.cpp | 2 +- src/script/api/CMakeLists.txt | 2 + src/script/api/ai_changelog.hpp | 9 + src/script/api/game_changelog.hpp | 8 + src/script/api/script_admin.cpp | 2 +- src/script/api/script_cargolist.cpp | 3 +- src/script/api/script_client.cpp | 2 +- src/script/api/script_company.cpp | 10 +- src/script/api/script_companymode.hpp | 2 +- src/script/api/script_controller.cpp | 2 +- src/script/api/script_controller.hpp | 19 +- src/script/api/script_date.cpp | 3 +- src/script/api/script_event_types.cpp | 27 +- src/script/api/script_event_types.hpp | 13 +- src/script/api/script_execmode.hpp | 2 +- src/script/api/script_gamesettings.cpp | 22 +- src/script/api/script_group.cpp | 15 +- src/script/api/script_group.hpp | 14 + src/script/api/script_industry.cpp | 4 +- src/script/api/script_list.cpp | 10 +- src/script/api/script_log.cpp | 2 +- src/script/api/script_log.hpp | 2 +- src/script/api/script_newgrf.cpp | 64 + src/script/api/script_newgrf.hpp | 56 + src/script/api/script_object.cpp | 15 +- src/script/api/script_order.cpp | 10 +- src/script/api/script_priorityqueue.hpp | 2 +- src/script/api/script_rail.cpp | 2 +- src/script/api/script_stationlist.hpp | 2 +- src/script/api/script_testmode.hpp | 2 +- src/script/api/script_text.cpp | 6 +- src/script/api/script_text.hpp | 2 +- src/script/api/script_tilelist.cpp | 8 +- src/script/api/script_waypointlist.hpp | 4 +- src/script/api/script_window.cpp | 4 +- src/script/script_config.cpp | 17 +- src/script/script_config.hpp | 6 +- src/script/script_info.cpp | 10 +- src/script/script_info_dummy.cpp | 2 +- src/script/script_instance.cpp | 34 +- src/script/script_instance.hpp | 4 +- src/script/script_scanner.cpp | 23 +- src/script/squirrel.cpp | 26 +- src/script/squirrel.hpp | 2 +- src/script/squirrel_class.hpp | 4 +- src/script/squirrel_helper.hpp | 14 +- src/script/squirrel_std.cpp | 2 +- src/settings.cpp | 2222 +++------ src/settings_func.h | 5 +- src/settings_gui.cpp | 343 +- src/settings_internal.h | 338 +- src/settings_table.cpp | 483 ++ src/settings_table.h | 45 + src/settings_type.h | 114 +- src/ship_cmd.cpp | 2 +- src/signal.cpp | 6 +- src/signs_cmd.cpp | 12 +- src/signs_gui.cpp | 24 +- src/smallmap_gui.cpp | 32 +- src/smallmap_gui.h | 3 +- src/sound.cpp | 73 +- src/sound/allegro_s.cpp | 6 +- src/sound/cocoa_s.cpp | 6 +- src/sound/win32_s.cpp | 3 +- src/sound/xaudio2_s.cpp | 16 +- src/sound_type.h | 2 +- src/spritecache.cpp | 164 +- src/spritecache.h | 12 +- src/spriteloader/CMakeLists.txt | 2 + src/spriteloader/grf.cpp | 103 +- src/spriteloader/grf.hpp | 2 +- src/spriteloader/sprite_file.cpp | 50 + src/spriteloader/sprite_file_type.hpp | 46 + src/spriteloader/spriteloader.hpp | 3 +- src/station.cpp | 18 +- src/station_base.h | 7 +- src/station_cmd.cpp | 100 +- src/station_gui.cpp | 76 +- src/statusbar_gui.cpp | 14 +- src/stdafx.h | 58 +- src/story.cpp | 34 +- src/story_gui.cpp | 4 +- src/strgen/strgen.cpp | 16 +- src/strgen/strgen_base.cpp | 8 +- src/string.cpp | 133 +- src/string_func.h | 11 +- src/strings.cpp | 128 +- src/strings_func.h | 6 +- src/subsidy.cpp | 72 +- src/subsidy_base.h | 11 +- src/subsidy_func.h | 5 +- src/subsidy_gui.cpp | 4 +- src/table/CMakeLists.txt | 48 +- src/table/cargo_const.h | 2 +- src/table/engines.h | 2 +- src/table/settings.h.preamble | 102 +- src/table/settings/CMakeLists.txt | 60 + src/table/settings/company_settings.ini | 132 + src/table/settings/currency_settings.ini | 64 + src/table/settings/difficulty_settings.ini | 286 ++ src/table/settings/economy_settings.ini | 294 ++ src/table/settings/game_settings.ini | 421 ++ src/table/settings/gui_settings.ini | 858 ++++ src/table/settings/linkgraph_settings.ini | 168 + src/table/settings/locale_settings.ini | 177 + src/table/settings/misc_settings.ini | 358 ++ src/table/settings/multimedia_settings.ini | 148 + .../settings/network_private_settings.ini | 68 + .../settings/network_secrets_settings.ini | 90 + src/table/settings/network_settings.ini | 267 + src/table/settings/news_display_settings.ini | 201 + src/table/settings/old_gameopt_settings.ini | 160 + src/table/settings/pathfinding_settings.ini | 617 +++ src/table/settings/script_settings.ini | 112 + src/table/settings/win32_settings.ini | 46 + src/table/settings/window_settings.ini | 55 + src/table/settings/world_settings.ini | 545 ++ src/table/sprites.h | 8 +- src/table/station_land.h | 4 +- src/table/townname.h | 4 +- src/tar_type.h | 2 - src/terraform_cmd.cpp | 53 +- src/terraform_gui.cpp | 21 +- src/textbuf_gui.h | 3 +- src/texteff.hpp | 2 +- src/textfile_gui.cpp | 87 +- src/textfile_gui.h | 16 +- src/tgp.cpp | 69 +- src/thread.h | 13 +- src/tilearea.cpp | 18 + src/tilearea_type.h | 23 +- src/timetable_cmd.cpp | 8 +- src/timetable_gui.cpp | 16 +- src/toolbar_gui.cpp | 31 +- src/town_cmd.cpp | 96 +- src/town_gui.cpp | 32 +- src/townname.cpp | 4 +- src/track_func.h | 11 +- src/train.h | 10 + src/train_cmd.cpp | 33 +- src/tree_cmd.cpp | 78 +- src/tunnelbridge_cmd.cpp | 9 +- src/vehicle.cpp | 34 +- src/vehicle_base.h | 8 +- src/vehicle_cmd.cpp | 34 +- src/vehicle_gui.cpp | 30 +- src/vehiclelist.cpp | 3 +- src/video/allegro_v.cpp | 44 +- src/video/cocoa/cocoa_ogl.mm | 13 +- src/video/cocoa/cocoa_v.mm | 70 +- src/video/cocoa/cocoa_wnd.h | 1 - src/video/cocoa/cocoa_wnd.mm | 70 +- src/video/dedicated_v.cpp | 11 +- src/video/null_v.cpp | 9 +- src/video/opengl.cpp | 23 +- src/video/sdl2_default_v.cpp | 10 +- src/video/sdl2_opengl_v.cpp | 8 +- src/video/sdl2_v.cpp | 60 +- src/video/sdl2_v.h | 2 +- src/video/sdl_v.cpp | 47 +- src/video/video_driver.cpp | 32 +- src/video/video_driver.hpp | 34 +- src/video/win32_v.cpp | 88 +- src/viewport.cpp | 46 +- src/viewport_sprite_sorter_sse4.cpp | 2 +- src/walltime_func.h | 80 + src/water_cmd.cpp | 62 +- src/waypoint.cpp | 2 +- src/waypoint_cmd.cpp | 12 +- src/waypoint_gui.cpp | 7 +- src/widget.cpp | 432 +- src/widget_type.h | 120 +- src/widgets/dropdown.cpp | 45 +- src/widgets/network_widget.h | 50 +- src/widgets/settings_widget.h | 1 + src/widgets/slider.cpp | 11 +- src/window.cpp | 462 +- src/window_func.h | 16 +- src/window_gui.h | 113 +- src/window_type.h | 22 +- 666 files changed, 61302 insertions(+), 20466 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug.yaml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/crash.yaml create mode 100644 bin/ai/compat_12.nut create mode 100644 bin/game/compat_12.nut create mode 100644 docs/company_colour_indexes.html create mode 100644 docs/game_coordinator.md create mode 100644 docs/savegame_format.md create mode 100644 os/windows/sign.bat create mode 100644 src/3rdparty/fmt/CMakeLists.txt create mode 100644 src/3rdparty/fmt/LICENSE.rst create mode 100644 src/3rdparty/fmt/core.h create mode 100644 src/3rdparty/fmt/format-inl.h create mode 100644 src/3rdparty/fmt/format.h create mode 100644 src/core/span_type.hpp create mode 100644 src/lang/chuvash.txt create mode 100644 src/lang/frisian.txt create mode 100644 src/lang/hindi.txt create mode 100644 src/lang/ido.txt create mode 100644 src/lang/macedonian.txt create mode 100644 src/lang/maltese.txt create mode 100644 src/lang/marathi.txt create mode 100644 src/lang/persian.txt create mode 100644 src/lang/urdu.txt create mode 100644 src/network/core/config.cpp create mode 100644 src/network/core/tcp_coordinator.cpp create mode 100644 src/network/core/tcp_coordinator.h create mode 100644 src/network/core/tcp_stun.cpp create mode 100644 src/network/core/tcp_stun.h create mode 100644 src/network/core/tcp_turn.cpp create mode 100644 src/network/core/tcp_turn.h create mode 100644 src/network/network_coordinator.cpp create mode 100644 src/network/network_coordinator.h create mode 100644 src/network/network_stun.cpp create mode 100644 src/network/network_stun.h create mode 100644 src/network/network_turn.cpp create mode 100644 src/network/network_turn.h create mode 100644 src/random_access_file.cpp create mode 100644 src/random_access_file_type.h create mode 100644 src/saveload/compat/CMakeLists.txt create mode 100644 src/saveload/compat/ai_sl_compat.h create mode 100644 src/saveload/compat/animated_tile_sl_compat.h create mode 100644 src/saveload/compat/autoreplace_sl_compat.h create mode 100644 src/saveload/compat/cargomonitor_sl_compat.h create mode 100644 src/saveload/compat/cargopacket_sl_compat.h create mode 100644 src/saveload/compat/cheat_sl_compat.h create mode 100644 src/saveload/compat/company_sl_compat.h create mode 100644 src/saveload/compat/depot_sl_compat.h create mode 100644 src/saveload/compat/economy_sl_compat.h create mode 100644 src/saveload/compat/engine_sl_compat.h create mode 100644 src/saveload/compat/game_sl_compat.h create mode 100644 src/saveload/compat/gamelog_sl_compat.h create mode 100644 src/saveload/compat/goal_sl_compat.h create mode 100644 src/saveload/compat/group_sl_compat.h create mode 100644 src/saveload/compat/industry_sl_compat.h create mode 100644 src/saveload/compat/labelmaps_sl_compat.h create mode 100644 src/saveload/compat/linkgraph_sl_compat.h create mode 100644 src/saveload/compat/map_sl_compat.h create mode 100644 src/saveload/compat/misc_sl_compat.h create mode 100644 src/saveload/compat/newgrf_sl_compat.h create mode 100644 src/saveload/compat/object_sl_compat.h create mode 100644 src/saveload/compat/order_sl_compat.h create mode 100644 src/saveload/compat/settings_sl_compat.h create mode 100644 src/saveload/compat/signs_sl_compat.h create mode 100644 src/saveload/compat/station_sl_compat.h create mode 100644 src/saveload/compat/storage_sl_compat.h create mode 100644 src/saveload/compat/story_sl_compat.h create mode 100644 src/saveload/compat/subsidy_sl_compat.h create mode 100644 src/saveload/compat/town_sl_compat.h create mode 100644 src/saveload/compat/vehicle_sl_compat.h create mode 100644 src/saveload/settings_sl.cpp create mode 100644 src/script/api/script_newgrf.cpp create mode 100644 src/script/api/script_newgrf.hpp create mode 100644 src/settings_table.cpp create mode 100644 src/settings_table.h create mode 100644 src/spriteloader/sprite_file.cpp create mode 100644 src/spriteloader/sprite_file_type.hpp create mode 100644 src/table/settings/CMakeLists.txt create mode 100644 src/table/settings/company_settings.ini create mode 100644 src/table/settings/currency_settings.ini create mode 100644 src/table/settings/difficulty_settings.ini create mode 100644 src/table/settings/economy_settings.ini create mode 100644 src/table/settings/game_settings.ini create mode 100644 src/table/settings/gui_settings.ini create mode 100644 src/table/settings/linkgraph_settings.ini create mode 100644 src/table/settings/locale_settings.ini create mode 100644 src/table/settings/misc_settings.ini create mode 100644 src/table/settings/multimedia_settings.ini create mode 100644 src/table/settings/network_private_settings.ini create mode 100644 src/table/settings/network_secrets_settings.ini create mode 100644 src/table/settings/network_settings.ini create mode 100644 src/table/settings/news_display_settings.ini create mode 100644 src/table/settings/old_gameopt_settings.ini create mode 100644 src/table/settings/pathfinding_settings.ini create mode 100644 src/table/settings/script_settings.ini create mode 100644 src/table/settings/win32_settings.ini create mode 100644 src/table/settings/window_settings.ini create mode 100644 src/table/settings/world_settings.ini create mode 100644 src/walltime_func.h diff --git a/.changelog b/.changelog index b3022e3852..e69de29bb2 100644 --- a/.changelog +++ b/.changelog @@ -1,23 +0,0 @@ -1.11.2 (2021-05-03) ------------------------------------------------------------------------- -Change: [Win32] Limit hardware accelerated video driver to OpenGL 3.2 or higher (#9077) -Change: More improvements to the GUI at different scales (#9075, #9102, #9107, #9133, #9174, #9183) -Fix: Query windows could be partially drawn (#9184) -Fix #9113: Crash when removing an airport that exists in an aircraft's orders (#9182) -Fix #9117: [Fluidsynth] Hang when changing song (#9181) -Fix: String validation could leave invalid UTF-8 encoded strings (#9096) -Fix: [Network] Out-of-bounds memory access with modified servers sending too short password salts (#9176) -Fix: Crash when extra viewport with zero height has sign in view (#9175) -Fix #9147: Crash when taking screenshots (#9169) -Fix #6598: [Network] Prevent crashes when (re)joining network game by falling back to main menu first (#9163) -Fix #9152: Screenshot success popup window was treated as an error (#9159) -Fix: Fast-forward stuttering when vsync is enabled (#9140) -Fix: [Network, Win32] Network errors were handled badly (#9116) -Fix: [Network] Savegame transfer could stall in rare cases (#9106) -Fix #9097: [NewGRF] Cargo initial payment variable was being truncated (#9098) -Fix: [NewGRF] Industry variable 66 and object variable 46 erroneously truncated the distance (#9088) -Fix: [NewGRF] Industry variables 65 and 66 ignored the parameter, and always used the north tile (#9088) -Fix: Do not include regression test AI in bundle (#9068, #9164) -Fix #9062: [Win32] Version in executable was not set to current release version (#9066, #9154) - - diff --git a/.dorpsgek.yml b/.dorpsgek.yml index 363d8b0b42..7ce84af72f 100644 --- a/.dorpsgek.yml +++ b/.dorpsgek.yml @@ -10,6 +10,7 @@ notifications: only-by: - DorpsGek commit-comment: + discussion: pull-request: issue: tag-created: diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml new file mode 100644 index 0000000000..39168fe5f4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -0,0 +1,41 @@ +name: Bug Report +description: Found a bug in OpenTTD? +title: "[Bug]: " +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + - type: input + id: version + attributes: + label: Version of OpenTTD + description: Fill in below what version of OpenTTD you are using, including your OS. + placeholder: ex. 1.11.2, Windows 10 + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected result + description: Describe in a few words what you expected to happen. + validations: + required: true + - type: textarea + id: actual + attributes: + label: Actual result + description: Describe in a few words what actually happens. + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + description: As detailed as possible, please tell us how we can reproduce this. Feel free to attach a savegame (zip it first) to make it more clear. + placeholder: | + 1. Loaded the attached savegame. + 2. Click on the button left of that other icon. + 3. The window doesn't open. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..2fd749087a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: +- name: Suggestions and ideas? + url: https://www.tt-forums.net/viewforum.php?f=32 + about: Have a suggestion or an idea for a cool new feature? Post them on our forum! diff --git a/.github/ISSUE_TEMPLATE/crash.yaml b/.github/ISSUE_TEMPLATE/crash.yaml new file mode 100644 index 0000000000..b5b6531105 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/crash.yaml @@ -0,0 +1,37 @@ +name: Crash +description: Did OpenTTD crash? +title: "[Crash]: " +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this crash report! + - type: input + id: version + attributes: + label: Version of OpenTTD + description: Fill in below what version of OpenTTD you are using, including your OS. + placeholder: ex. 1.11.2, Windows 10 + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + description: Please spend a few words if you can reproduce this problem. + placeholder: | + 1. Bought a new train. + 2. The game crashed. + validations: + required: true + - type: textarea + id: crashlogs + attributes: + label: Upload crash files + description: With the `crash.log`, `crash.dmp`, and `crash.sav` we can analyze the crash in detail; this way you allow us to easier triage and fix the problem. + placeholder: | + 1. Zip the `crash.log`, `crash.dmp` and `crash.sav`. + 2. Click on this field. + 3. Drag and drop the zip file in here. + validations: + required: true diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 74677ee6d5..3f05869e05 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -157,7 +157,7 @@ jobs: runs-on: macos-latest env: - MACOSX_DEPLOYMENT_TARGET: 10.9 + MACOSX_DEPLOYMENT_TARGET: 10.14 steps: - name: Checkout @@ -315,3 +315,92 @@ jobs: run: | cd ${GITHUB_WORKSPACE}/build ctest --timeout 120 + + + msys2: + name: msys2 + + strategy: + fail-fast: false + matrix: + include: + - msystem: MINGW64 + arch: x86_64 + - msystem: MINGW32 + arch: i686 + + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup MSYS2 + uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.msystem }} + release: false + install: >- + git + make + mingw-w64-${{ matrix.arch }}-cmake + mingw-w64-${{ matrix.arch }}-gcc + mingw-w64-${{ matrix.arch }}-lzo2 + mingw-w64-${{ matrix.arch }}-libpng + + - name: Install OpenGFX + shell: bash + run: | + mkdir -p "C:/Users/Public/Documents/OpenTTD/baseset" + cd "C:/Users/Public/Documents/OpenTTD/baseset" + + echo "::group::Download OpenGFX" + curl -L https://cdn.openttd.org/opengfx-releases/0.6.0/opengfx-0.6.0-all.zip -o opengfx-all.zip + echo "::endgroup::" + + echo "::group::Unpack OpenGFX" + unzip opengfx-all.zip + echo "::endgroup::" + + rm -f opengfx-all.zip + + - name: Install GCC problem matcher + uses: ammaraskar/gcc-problem-matcher@master + + - name: Build + shell: msys2 {0} + run: | + mkdir build + cd build + + echo "::group::CMake" + cmake .. -G"MSYS Makefiles" + echo "::endgroup::" + + echo "::group::Build" + echo "Running on $(nproc) cores" + cmake --build . -j $(nproc) + echo "::endgroup::" + + - name: Test + shell: msys2 {0} + run: | + cd build + ctest -j $(nproc) --timeout 120 + + check_annotations: + name: Check Annotations + needs: + - emscripten + - linux + - macos + - windows + - msys2 + + if: always() && github.event_name == 'pull_request' + + runs-on: ubuntu-latest + + steps: + - name: Check annotations + uses: OpenTTD/actions/annotation-check@v2 diff --git a/.github/workflows/commit-checker.yml b/.github/workflows/commit-checker.yml index d83183a467..acf622a87e 100644 --- a/.github/workflows/commit-checker.yml +++ b/.github/workflows/commit-checker.yml @@ -15,37 +15,7 @@ jobs: fetch-depth: 4 - name: Get pull-request commits - run: | - set -x - # actions/checkout did a merge checkout of the pull-request. As such, the first - # commit is the merge commit. This means that on HEAD^ is the base branch, and - # on HEAD^2 are the commits from the pull-request. We now check if those trees - # have a common parent. If not, we fetch a few more commits till we do. In result, - # the log between HEAD^ and HEAD^2 will be the commits in the pull-request. - DEPTH=4 - while [ -z "$(git merge-base HEAD^ HEAD^2)" ]; do - # Prevent infinite recursion - if [ ${DEPTH} -gt 256 ]; then - echo "No common parent between '${GITHUB_HEAD_REF}' and '${GITHUB_BASE_REF}'." >&2 - exit 1 - fi - - git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --deepen=${DEPTH} origin HEAD - DEPTH=$(( ${DEPTH} * 4 )) - done - - # Just to show which commits we are going to evaluate. - git log --oneline HEAD^..HEAD^2 - - - name: Checkout commit-checker - uses: actions/checkout@v2 - with: - repository: OpenTTD/OpenTTD-git-hooks - path: git-hooks - ref: master + uses: OpenTTD/actions/checkout-pull-request@v2 - name: Check commits - run: | - set -x - HOOKS_DIR=./git-hooks/hooks GIT_DIR=.git ./git-hooks/hooks/check-commits.sh HEAD^..HEAD^2 - echo "Commit checks passed" + uses: OpenTTD/OpenTTD-git-hooks@main diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 894e9b9eb7..fd6a8d8fa1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -373,14 +373,19 @@ jobs: include: - container_image: "ubuntu:18.04" bundle_name: "bionic" + compiler: "g++-8" - container_image: "ubuntu:20.04" bundle_name: "focal" + compiler: "g++" - container_image: "ubuntu:20.10" bundle_name: "groovy" + compiler: "g++" - container_image: "debian:buster" bundle_name: "buster" + compiler: "g++" - container_image: "debian:bullseye" bundle_name: "bullseye" + compiler: "g++" runs-on: ubuntu-20.04 container: @@ -406,7 +411,7 @@ jobs: apt-get install -y --no-install-recommends \ cmake \ debhelper \ - g++ \ + ${{ matrix.compiler }} \ git \ make \ openssl \ @@ -432,7 +437,7 @@ jobs: cd build echo "::group::CMake" - cmake ${GITHUB_WORKSPACE} \ + CXX=${{ matrix.compiler }} cmake ${GITHUB_WORKSPACE} \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_INSTALL_PREFIX=/usr \ # EOF @@ -470,7 +475,7 @@ jobs: runs-on: macos-10.15 env: - MACOSX_DEPLOYMENT_TARGET: 10.9 + MACOSX_DEPLOYMENT_TARGET: 10.14 steps: - name: Download source @@ -746,6 +751,21 @@ jobs: with: arch: ${{ matrix.host }} + - name: Import code signing certificate + shell: powershell + # If this is run on a fork, there may not be a certificate set up - continue in this case + continue-on-error: true + run: | + $tempFile = [System.IO.Path]::GetTempFileName() + $bytes = [System.Convert]::FromBase64String($env:WINDOWS_CERTIFICATE_P12) + [IO.File]::WriteAllBytes($tempFile, $bytes) + $pwd = ConvertTo-SecureString $env:WINDOWS_CERTIFICATE_PASSWORD -AsPlainText -Force + Import-PfxCertificate -FilePath $tempFile -CertStoreLocation Cert:\CurrentUser\My -Password $pwd + Remove-Item $tempFile + env: + WINDOWS_CERTIFICATE_P12: ${{ secrets.WINDOWS_CERTIFICATE_P12 }} + WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }} + - name: Build (with installer) if: needs.source.outputs.is_tag == 'true' shell: bash @@ -761,12 +781,15 @@ jobs: -DOPTION_USE_NSIS=ON \ -DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DWINDOWS_CERTIFICATE_COMMON_NAME="${WINDOWS_CERTIFICATE_COMMON_NAME}" \ # EOF echo "::endgroup::" echo "::group::Build" cmake --build . echo "::endgroup::" + env: + WINDOWS_CERTIFICATE_COMMON_NAME: ${{ secrets.WINDOWS_CERTIFICATE_COMMON_NAME }} - name: Build (without installer) if: needs.source.outputs.is_tag != 'true' @@ -782,12 +805,15 @@ jobs: -DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" \ -DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DWINDOWS_CERTIFICATE_COMMON_NAME="${WINDOWS_CERTIFICATE_COMMON_NAME}" \ # EOF echo "::endgroup::" echo "::group::Build" cmake --build . echo "::endgroup::" + env: + WINDOWS_CERTIFICATE_COMMON_NAME: ${{ secrets.WINDOWS_CERTIFICATE_COMMON_NAME }} - name: Create bundles shell: bash @@ -809,6 +835,17 @@ jobs: rm -f bundles/*.sha256 echo "::endgroup::" + - name: Sign installer + if: needs.source.outputs.is_tag == 'true' + shell: bash + # If this is run on a fork, there may not be a certificate set up - continue in this case + continue-on-error: true + run: | + cd ${GITHUB_WORKSPACE}/build/bundles + ../../os/windows/sign.bat *.exe "${WINDOWS_CERTIFICATE_COMMON_NAME}" + env: + WINDOWS_CERTIFICATE_COMMON_NAME: ${{ secrets.WINDOWS_CERTIFICATE_COMMON_NAME }} + - name: Store bundles uses: actions/upload-artifact@v2 with: diff --git a/.ottdrev b/.ottdrev index 5ca22e1b18..a8b23e570e 100644 --- a/.ottdrev +++ b/.ottdrev @@ -1 +1 @@ -1.11.2 20210503 0 672f285218c6817784d86f737987b75db4bc78fc 1 1 2021 +12.0-beta1 20210815 0 b67ef1e5b85cda0af8be0c7d99b8b00b5ec05ebb 1 0 2021 diff --git a/.release_date b/.release_date index 1ee8361b96..ac19647937 100644 --- a/.release_date +++ b/.release_date @@ -1 +1 @@ -2021-05-03 18:41 UTC +2021-08-15 11:15 UTC diff --git a/.version b/.version index ca7176690d..e6dc9a70ae 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -1.11.2 +12.0-beta1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 1aaef5106f..37e8697e40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ if(NOT BINARY_NAME) endif() project(${BINARY_NAME} - VERSION 1.11.2 + VERSION 12.0 ) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) @@ -22,7 +22,7 @@ if (EMSCRIPTEN) endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") -set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) +set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14) # Use GNUInstallDirs to allow customisation # but set our own default data and bin dir @@ -76,7 +76,7 @@ add_custom_target(find_version -DCPACK_BINARY_DIR=${CMAKE_BINARY_DIR} -DREV_MAJOR=${PROJECT_VERSION_MAJOR} -DREV_MINOR=${PROJECT_VERSION_MINOR} - -DREV_BUILD=${PROJECT_VERSION_PATCH} + -DWINDOWS=${WIN32} -P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} BYPRODUCTS ${GENERATED_SOURCE_FILES} @@ -241,6 +241,10 @@ target_link_libraries(openttd Threads::Threads ) +if(HAIKU) + target_link_libraries(openttd "be" "network" "midi") +endif() + if(IPO_FOUND) set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_RELEASE True) set_target_properties(openttd PROPERTIES INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL True) @@ -355,17 +359,20 @@ if(WIN32) -DUNICODE -D_UNICODE -DWITH_UNISCRIBE + -DPSAPI_VERSION=1 ) target_link_libraries(openttd ws2_32 winmm imm32 + usp10 + psapi ) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - add_definitions(-D_SQ64) + add_definitions(-DPOINTER_IS_64BIT) endif() include(CreateRegression) diff --git a/CREDITS.md b/CREDITS.md index 8c20a4ac18..33f8836265 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -14,7 +14,6 @@ - Ingo von Borstel (planetmaker) - General coding, Support (since 1.1) - Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5) - José Soler (Terkhen) - General coding (since 1.0) -- Leif Linse (Zuu) - AI/Game Script (since 1.2) ### Inactive Developers: @@ -28,6 +27,7 @@ - Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5) - Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active) - Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3) +- Leif Linse (Zuu) - AI/Game Script (1.2 - 1.6) ### Retired Developers: diff --git a/README.md b/README.md index a5142ffecb..75ef46faa9 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Both 'stable' and 'nightly' versions are available for download: - most people should choose the 'stable' version, as this has been more extensively tested - the 'nightly' version includes the latest changes and features, but may sometimes be less reliable -On some platforms OpenTTD will also be available via your OS package manager or a similar service. +OpenTTD is also available for free on [Steam](https://store.steampowered.com/app/1536610/OpenTTD/), [GOG.com](https://www.gog.com/game/openttd), and the [Microsoft Store](https://www.microsoft.com/p/openttd-official/9ncjg5rvrr1c). On some platforms OpenTTD will be available via your OS package manager or a similar service. ## 1.2) OpenTTD gameplay manual @@ -205,6 +205,9 @@ See the comments in the source files in `src/3rdparty/md5` for the complete lice The implementations of Posix `getaddrinfo` and `getnameinfo` for OS/2 in `src/3rdparty/os2` are distributed partly under the GNU Lesser General Public License 2.1, and partly under the (3-clause) BSD license. The exact licensing terms can be found in `src/3rdparty/os2/getaddrinfo.c` resp. `src/3rdparty/os2/getnameinfo.c`. +The fmt implementation in `src/3rdparty/fmt` is licensed under the MIT license. +See `src/3rdparty/fmt/LICENSE.rst` for the complete license text. + ## 4.0 Credits diff --git a/bin/ai/CMakeLists.txt b/bin/ai/CMakeLists.txt index 60398f081d..9417004fce 100644 --- a/bin/ai/CMakeLists.txt +++ b/bin/ai/CMakeLists.txt @@ -12,6 +12,7 @@ set(AI_COMPAT_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.9.nut ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.10.nut ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.11.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_12.nut ) foreach(AI_COMPAT_SOURCE_FILE IN LISTS AI_COMPAT_SOURCE_FILES) diff --git a/bin/ai/compat_1.11.nut b/bin/ai/compat_1.11.nut index 3081fb58e8..887f3f7fd9 100644 --- a/bin/ai/compat_1.11.nut +++ b/bin/ai/compat_1.11.nut @@ -4,3 +4,5 @@ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ + +AILog.Info("1.11 API compatibility in effect."); diff --git a/bin/ai/compat_12.nut b/bin/ai/compat_12.nut new file mode 100644 index 0000000000..3081fb58e8 --- /dev/null +++ b/bin/ai/compat_12.nut @@ -0,0 +1,6 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ diff --git a/bin/game/CMakeLists.txt b/bin/game/CMakeLists.txt index db1acf317e..55a992be32 100644 --- a/bin/game/CMakeLists.txt +++ b/bin/game/CMakeLists.txt @@ -9,6 +9,7 @@ set(GS_COMPAT_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.9.nut ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.10.nut ${CMAKE_CURRENT_SOURCE_DIR}/compat_1.11.nut + ${CMAKE_CURRENT_SOURCE_DIR}/compat_12.nut ) foreach(GS_COMPAT_SOURCE_FILE IN LISTS GS_COMPAT_SOURCE_FILES) diff --git a/bin/game/compat_1.11.nut b/bin/game/compat_1.11.nut index 3081fb58e8..fa240b5d2d 100644 --- a/bin/game/compat_1.11.nut +++ b/bin/game/compat_1.11.nut @@ -4,3 +4,5 @@ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ + +GSLog.Info("1.11 API compatibility in effect."); diff --git a/bin/game/compat_12.nut b/bin/game/compat_12.nut new file mode 100644 index 0000000000..3081fb58e8 --- /dev/null +++ b/bin/game/compat_12.nut @@ -0,0 +1,6 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ diff --git a/changelog.txt b/changelog.txt index c037e3e724..a661cab6ec 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,99 @@ +12.0-beta1 (2021-08-15) +------------------------------------------------------------------------ +Feature: [Network] Remove lobby window; pressing "Join Game" now immediately joins a server (#9467) +Feature: [Network] Synchronize server name to clients and display in Online Players window (#9472) +Feature: [Network] Mention you are a spectator in the status bar (#9471) +Feature: [Network] No longer require port-forwarding to host a server (#9443, #9447) +Feature: [Network] Allow setting your server visibility to "invite-only" (#9434) +Feature: [Network] Join servers based on their invite code (#9432) +Feature: Raise the maximum NewGRF limit to 255 (#9428) +Feature: Persistent rotation of numbered auto/netsave after restart (#9395, #9397) +Feature: [NewGRF] Maximum curve speed modifier for rail vehicles (#9346) +Feature: Move sensitive information to secrets.cfg and private information to private.cfg (#9298) +Feature: Signed Windows builds (#9294) +Feature: [NewGRF] Define refittability of default vehicles using cargo classes (#9148) +Feature: Configurable subsidy duration, up to 5000 years (#9081) +Feature: [Network] Rework in-game Online Players window (#9067) +Feature: [Network] Show previous chat history when the chat message box is open (#9025) +Feature: Button to reset game settings to their default values (#8958) +Feature: Press Ctrl to build diagonal rivers in Scenario Editor (#8880) +Feature: Set wagon replacement per group when using autoreplace (#7441) +Add: [Network] Open Online Players window on starting/joining a server (#9479) +Add: [Script] Basic information about loaded NewGRFs for scripts (#9464) +Add: [AI] Get the number of vehicles in a given group (#9462) +Add: [Network] Inform network clients what game-script a server is running (#9441) +Add: Hindi translation (#9086) +Add: [Network] Ensure players fill in a name instead of defaulting to "Player" (#9080) +Change: Allow pause/unpause console command in single player (#9342) +Change: Make savegame format self-descriptive and consistent across all objects (#9322, #9335, #9338, #9339) +Change: By default, make "unload all" leave stations empty (#9301) +Change: Reworked the debug levels and messages for network logs (#9230, #9251) +Change: [Emscripten] Set default scrolling mode to non-pointer-locking (#9191) +Change: Use neutral pronouns for various strings (#9189, #9203, #9228) +Change: Make the town directory horizontally resizable (#9157) +Change: Allow non-ASCII currency separators (#9121) +Change: [NewGRF] Display a pop-up window for Errors with severity ERROR (#9119) +Change: Treat languages as finished, if translations are 75% completed (#9019, #9086) +Change: Disable NewGRF window apply button if no change was made (#8934) +Fix: [Script] Crash when iterating lists of which the key is larger than 32bit (#9465) +Fix: [Network] Desync due to use of unstable sort when distributing cargo production (#9460) +Fix #9440: Negative cargo payments not being handled correctly (#9455) +Fix: [Network] Crash when joining a server again after a TCP disconnect (#9453) +Fix: Don't enable rename button for network clients in build vehicle window (#9452) +Fix: Money could underflow and wrap around (#9451) +Fix: Parse the console settings the same way as config settings (#9438) +Fix: Ensure no more than the allowed number of NewGRFs are loaded from the configuration (#9430) +Fix: [NewGRF] Overflow when determining cargo mask for string code 9A 1E (#9423) +Fix: Integers for scripts are 64bit, but saved as 32bit (#9415) +Fix #9392: [Script] Return a valid value with GetBuildWithRefitCapacity even when AIs are maxed out in vehicles (#9393) +Fix #8169: Crash when autoreplacing vehicle with no orders (#9387) +Fix: Wrong cargo line position in IndustryCargo window (#9383) +Fix: Race-condition during startup of NewGRF scan (#9382) +Fix: Don't propagate Shift/Ctrl state till next game-tick (#9381) +Fix: Prevent palette updates during copying to the video driver (#9379) +Fix: [Network] Determining GetNetworkRevisionString could overflow and underflow its buffer (#9372) +Fix #9358: Don't skip empty files in tar archives (#9367) +Fix: For old savegames, station bus/truck station cache was not updated (#9366) +Fix #9353: [Script] Garbage collecting on priority queues could crash the game (#9356) +Fix: Respect the autosave_on_exit setting for Null video driver (#9343) +Fix: Compatible NewGRFs in crash-log reported wrong MD5 hash (#9340) +Fix: [Script] Ensure the saved script strings are properly validated and terminated (#9336) +Fix #9316: Town bridge length limit check incorrect above 250k inhabitants (#9318) +Fix: Limit heightmap sizes to 8192x8192 (#9307) +Fix #9281: Money generating exploit when buying out a company (#9300) +Fix: Part of a tile might not be redrawn when terraforming (#9296) +Fix: [OpenGL] Increase timeout when waiting for the GPU to be done with the drawing buffer (#9282) +Fix: Vehicles sent in the wrong direction if there is no path to the destination (#9280) +Fix #9264: Do not attach temporary wagons to free wagon chains when autoreplacing (#9278) +Fix #9267: [Script] Crash during garbage collection (#9275) +Fix: Encountering two-way red signals could prune unrelated Pathfinder branches (#9271) +Fix #9255: [Network] Crash when hostname is not found (#9259) +Fix #9256: Invalid read after free when replacing train chains (#9258) +Fix: [Emscripten] Force secure WebSockets over HTTPS (#9248) +Fix #9242: Tree tick handler did not scale by map size (#9246) +Fix: [Network] Mark server as offline when no longer reachable (#9244) +Fix: [Network] Don't rebuild the host-list during iterating the list (#9240) +Fix: [Network] Don't mark the last-joined server as a manually added server (#9239) +Fix: [Network] Clients leaving because of broken connections was not broadcasted (#9238) +Fix: [Network] Check on CIDR for netmask check considered everything valid (#9235) +Fix: Creating screenshots on dedicated servers failed (#9232) +Fix: Leaking file descriptors for downloaded content (#9229) +Fix: Spelling of several town names (#9222) +Fix #9209: Game hangs when resizing highscore/news window if the screen is too small (#9210) +Fix: [Network] Optimize creating network connections for clients using IPv4 and IPv6 (#9199) +Fix #9186: Fix incorrect bounding box height causing station sprite glitch (#9187) +Fix: Truncating strings in settings could leave invalid UTF-8 characters (#9121) +Fix: Many issues related to window scaling (#9087, #9219) +Fix: Invalidate cached vehicle colourmaps when changing liveries setting (#9006) +Fix #8981: Don't attempt to re-reserve path if already entering/entered depot (#9000) +Fix: Missing 'Town names:' colon in map gen GUI (#8986) +Fix: Sorting and filtering industries that produce/accept many cargoes (#8468) +Remove: [Network] COMPANY_INFO packets (#9475) +Remove: [Network] A server can no longer set a limit to the amount of spectators allowed (#9466) +Remove: Arbitrary limit on number of statically loaded NewGRFs (#9431) +Remove: [Network] Language and map-name from server information (#9070) + + 1.11.2 (2021-05-03) ------------------------------------------------------------------------ Change: [Win32] Limit hardware accelerated video driver to OpenGL 3.2 or higher (#9077) @@ -2294,7 +2390,7 @@ Note: OpenTTD was migrated to GitHub for 1.9, so SVN revision and FlySpray numbe - Fix: [NewGRF] Additional text in fund industry window is NewGRF supplied and thus should have a default colour (r22631) - Fix: Also initialise _old_vds with newgame settings; TTD savegames do not contain these settings [FS#4622] (r22626) - Fix: Do not zero the orders of disaster vehicles when converting savegames [FS#4642] (r22625) -- Fix: When closing an AI company the local player cheated to, we need to cheat him to another company [FS#4654] (r22624, r22623) +- Fix: When closing an AI company the local player cheated to, we need to cheat them to another company [FS#4654] (r22624, r22623) - Fix: When closing down companies their shares in other companies must be sold even if share trading is disabled at that point of time (r22622) - Fix: When asking the user to confirm an unsafe unpausing, there is no need to execute a command if 'no' is chosen. This also prevents crashing when clicking unpause while the confirm window is shown (r22621) - Fix: Enforce refit orders to be 'always go to depot' orders; service-only and stop-in-depot orders make no sense with refitting [FS#4651] (r22620) @@ -3016,7 +3112,7 @@ Note: OpenTTD was migrated to GitHub for 1.9, so SVN revision and FlySpray numbe - Fix: Chat message caused glitch when rejoining a network game [FS#3757] (r19629) - Fix: Desync when a command is received and in the queue while a client starts joining, i.e. save the game state. This can happen in two ways: with frame_freq > 1 a command received in a previous frame might not be executed yet or when a command is received in the same frame as the join but before the savegame is made. In both cases the joining client would not get all commands to get in-sync with the server (and the other clients) (r19620) - Fix: Company related graphs were not updated correctly after changing the company colour [FS#3763] (r19615) -- Fix: Possible invalid read when server moves client to spectators before he finishes joining [FS#3755] (r19613) +- Fix: Possible invalid read when server moves client to spectators before they finish joining [FS#3755] (r19613) - Fix: Crash when opening a savegame with a waypoint from around 0.4.0 [FS#3756] (r19612) - Fix: Improve joining behaviour; kicking clients when entering passwords that was just cleared, 'connection lost' for people failing the password, access restriction circumvention [CVE-2010-0401] [FS#3754] (r19610, r19609, r19608, r19607, r19606) - Fix: Desync debugging; false positives in the cache validity checks and saving/loading the command stream (r19619, r19617, r19602, r19601, r19600, r19596, r19593, r19592, r19589, r19587, r19586) @@ -3371,7 +3467,7 @@ Note: OpenTTD was migrated to GitHub for 1.9, so SVN revision and FlySpray numbe - Fix: Do not account for path reservation costs when entering a signal block via a 'block' signal. This way you will not get double penalties, both red signals and reservation costs, for the block signalled tracks [FS#2722] (r18535) - Fix: [NewGRF] An industry NewGRF that defined a too small size for action0 prop 0A could cause a crash (r18527) - Fix: Allegro does not like to work with extmidi, so warn the user about that [FS#3272] (r18520) -- Fix: When you pass a signal at danger, in a PBS controlled area, do not try to do the 'safe' thing and stop, but continue going; the user wanted the train to pass the signal at danger so (s)he has to suffer the consequences. Of course one can always stop the train manually [FS#2891] (r18515) +- Fix: When you pass a signal at danger, in a PBS controlled area, do not try to do the 'safe' thing and stop, but continue going; the user wanted the train to pass the signal at danger so they have to suffer the consequences. Of course one can always stop the train manually [FS#2891] (r18515) - Fix: No error message was created for the first fatal NewGRF error [FS#3368] (r18506) - Fix: Improve airport movement on several airports [FS#3169] (r18505) - Fix: Autoreplace and autorenew always reset their cargo sub type to 0. Now find a sub cargo type with the exact same name and use that, otherwise fallback to 0. So cargo sub types can be maintained via autoreplace *if* the new vehicle supports the same cargo sub type [FS#3159] (r18499) @@ -3854,7 +3950,7 @@ Note: OpenTTD was migrated to GitHub for 1.9, so SVN revision and FlySpray numbe - Fix: Make the join/spectate command require to be connected to a network game; in SP it could lead to crashes (r15514) - Fix: Generating a map with the original map generator with freeform edges on resulted in a crash [FS#2641] (r15511) - Fix: Pre-0.5 OpenTTD stored new_nonstop and full_load_any in a different way, savegame conversion was not working for them (r15500) -- Fix: Crash when opening the game options when the currently loaded base graphics pack has less than 2 valid graphics files. For example when someone replaces all his/her original base graphics with custom work (but keeps the name) or renames the dos ones to windows or vice versa [FS#2630] (r15476) +- Fix: Crash when opening the game options when the currently loaded base graphics pack has less than 2 valid graphics files. For example when someone replaces all their original base graphics with custom work (but keeps the name) or renames the dos ones to windows or vice versa [FS#2630] (r15476) 0.7.0-beta1 (2009-02-16) @@ -4616,7 +4712,7 @@ Note: OpenTTD was migrated to GitHub for 1.9, so SVN revision and FlySpray numbe - Fix: Switching players (using the cheat) crashed on Big Endian machines [FS#1150] (r11023) - Fix: The canal border determination did not take oil rigs into consideration (r11022) - Fix: Do not display income/expenses when they do not belong to a 'valid' tile, like the money cheat/giving money [FS#1175] (r11021) -- Fix: One could not give money when (s)he had too much money or rather: when casting the amount of money to an int32 becomes negative [FS#1174] (r11020) +- Fix: One could not give money when they had too much money or rather: when casting the amount of money to an int32 becomes negative [FS#1174] (r11020) - Fix: When determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location [FS#1104] (r10792) - Fix: Determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis) [FS#1058] (r10686) - Fix: Graphical glitches when the 'link landscape toolbar' patch is turned on when opening one of the construction toolbars [FS#1076] (r10685) @@ -4677,7 +4773,7 @@ Note: OpenTTD was migrated to GitHub for 1.9, so SVN revision and FlySpray numbe - Fix: Do not unconditionally assume that a tile has a depot (r11027) - Fix: Give a more correct error when building some things on tile 0 [FS#1173] (r11024) - Fix: Do not display income/expenses when they do not belong to a 'valid' tile, like the money cheat and giving money [FS#1175] (r11021) -- Fix: One could not give money when (s)he had too much money [FS#1174] (r11020) +- Fix: One could not give money when they had too much money [FS#1174] (r11020) - Fix: Disallow buying/selling shares in your own company or a bankrupt company [FS#1169] (r11018) - Fix: Crash when quitting the game in one of the end score windows [FS#1218] (r11071) @@ -5637,7 +5733,7 @@ Note: OpenTTD was migrated to GitHub for 1.9, so SVN revision and FlySpray numbe - Fix: Vehicles slow down under bridge if the track is on a foundation - Fix: You can no longer change name of waypoints whom are owned by somebody else - Fix: Shares are now also sold when a company goes bankrupt [SF#1090313] -- Fix: It is no longer possible to crash trains of other companies by building a depot close to a station; trains do no longer enter tiles that do not belong to his owner [SF#1087701] +- Fix: It is no longer possible to crash trains of other companies by building a depot close to a station; trains do no longer enter tiles that do not belong to their owner [SF#1087701] - Fix: Crashed trains are not reported to have too few orders any more [SF#1087403] - Fix: Backup-order-list was not closed with an OT_NOTHING, [SF#1086375] - Fix: Docks now have a button to display the catchment area [SF#1085255] diff --git a/cmake/CompileFlags.cmake b/cmake/CompileFlags.cmake index 86d336b595..659a9ca724 100644 --- a/cmake/CompileFlags.cmake +++ b/cmake/CompileFlags.cmake @@ -26,8 +26,10 @@ macro(compile_flags) add_compile_options(/Zc:rvalueCast) if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - # Enable multi-threaded compilation. - add_compile_options(/MP) + add_compile_options( + /MP # Enable multi-threaded compilation. + /FC # Display the full path of source code files passed to the compiler in diagnostics. + ) endif() endif() @@ -156,7 +158,7 @@ macro(compile_flags) message(FATAL_ERROR "No warning flags are set for this compiler yet; please consider creating a Pull Request to add support for this compiler.") endif() - if(NOT WIN32) + if(NOT WIN32 AND NOT HAIKU) # rdynamic is used to get useful stack traces from crash reports. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic") endif() diff --git a/cmake/InstallAndPackage.cmake b/cmake/InstallAndPackage.cmake index 9b7d657887..057f0934f8 100644 --- a/cmake/InstallAndPackage.cmake +++ b/cmake/InstallAndPackage.cmake @@ -138,6 +138,13 @@ elseif(WIN32) endif() set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-windows-${CPACK_SYSTEM_NAME}") + + if(WINDOWS_CERTIFICATE_COMMON_NAME) + add_custom_command(TARGET openttd + POST_BUILD + COMMAND "${CMAKE_SOURCE_DIR}/os/windows/sign.bat" "$" "${WINDOWS_CERTIFICATE_COMMON_NAME}" + ) + endif() elseif(UNIX) # With FHS, we can create deb/rpm/... Without it, they would be horribly broken # and not work. The other way around is also true; with FHS they are not diff --git a/cmake/MSVCFilters.cmake b/cmake/MSVCFilters.cmake index e8026eee3c..db53fc2258 100644 --- a/cmake/MSVCFilters.cmake +++ b/cmake/MSVCFilters.cmake @@ -11,12 +11,13 @@ source_group("Network Core" REGULAR_EXPRESSION "src/network/core/") source_group("OSX" REGULAR_EXPRESSION "src/os/macosx/") source_group("Pathfinder" REGULAR_EXPRESSION "src/pathfinder/") source_group("Save/Load handlers" REGULAR_EXPRESSION "src/saveload/") +source_group("Save/Load handlers\\Compat" REGULAR_EXPRESSION "src/saveload/compat/") source_group("Sound" REGULAR_EXPRESSION "src/sound/") source_group("Sprite loaders" REGULAR_EXPRESSION "src/spriteloader/") source_group("Squirrel" REGULAR_EXPRESSION "src/3rdparty/squirrel/squirrel/") source_group("Tables" REGULAR_EXPRESSION "src/table/") source_group("Video" REGULAR_EXPRESSION "src/video/") -source_group("Video/GL" REGULAR_EXPRESSION "src/3rdparty/opengl/") +source_group("Video\\GL" REGULAR_EXPRESSION "src/3rdparty/opengl/") source_group("Widgets" REGULAR_EXPRESSION "src/widgets/") source_group("Windows files" REGULAR_EXPRESSION "src/os/windows/|\.rc$") diff --git a/cmake/Options.cmake b/cmake/Options.cmake index bfa14b6c3c..42d1127906 100644 --- a/cmake/Options.cmake +++ b/cmake/Options.cmake @@ -56,7 +56,7 @@ function(set_options) option(OPTION_DEDICATED "Build dedicated server only (no GUI)" OFF) option(OPTION_INSTALL_FHS "Install with Filesystem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS}) - option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" OFF) + option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" ON) if(EMSCRIPTEN) # Although pthreads is supported, it is not in a way yet that is # useful for us. diff --git a/cmake/scripts/FindVersion.cmake b/cmake/scripts/FindVersion.cmake index 6e4a2b3909..c4ff99a7fd 100644 --- a/cmake/scripts/FindVersion.cmake +++ b/cmake/scripts/FindVersion.cmake @@ -6,9 +6,6 @@ endif() if(NOT REV_MINOR) set(REV_MINOR 0) endif() -if(NOT REV_BUILD) - set(REV_BUILD 0) -endif() # # Finds the current version of the current folder. @@ -138,7 +135,7 @@ else() configure_file("${CMAKE_SOURCE_DIR}/src/rev.cpp.in" "${FIND_VERSION_BINARY_DIR}/rev.cpp") - if(WIN32) + if(WINDOWS) message(STATUS "Generating ottdres.rc") configure_file("${CMAKE_SOURCE_DIR}/src/os/windows/ottdres.rc.in" "${FIND_VERSION_BINARY_DIR}/ottdres.rc") diff --git a/cmake/scripts/SquirrelExport.cmake b/cmake/scripts/SquirrelExport.cmake index 3b230de00f..d0c2283550 100644 --- a/cmake/scripts/SquirrelExport.cmake +++ b/cmake/scripts/SquirrelExport.cmake @@ -28,10 +28,10 @@ endmacro() macro(dump_class_templates NAME) string(REGEX REPLACE "^Script" "" REALNAME ${NAME}) - string(APPEND SQUIRREL_EXPORT "\n template <> inline ${NAME} *GetParam(ForceType<${NAME} *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (${NAME} *)instance; }") - string(APPEND SQUIRREL_EXPORT "\n template <> inline ${NAME} &GetParam(ForceType<${NAME} &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(${NAME} *)instance; }") - string(APPEND SQUIRREL_EXPORT "\n template <> inline const ${NAME} *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (${NAME} *)instance; }") - string(APPEND SQUIRREL_EXPORT "\n template <> inline const ${NAME} &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(${NAME} *)instance; }") + string(APPEND SQUIRREL_EXPORT "\n template <> inline ${NAME} *GetParam(ForceType<${NAME} *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, nullptr); return (${NAME} *)instance; }") + string(APPEND SQUIRREL_EXPORT "\n template <> inline ${NAME} &GetParam(ForceType<${NAME} &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, nullptr); return *(${NAME} *)instance; }") + string(APPEND SQUIRREL_EXPORT "\n template <> inline const ${NAME} *GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, nullptr); return (${NAME} *)instance; }") + string(APPEND SQUIRREL_EXPORT "\n template <> inline const ${NAME} &GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, nullptr); return *(${NAME} *)instance; }") if("${NAME}" STREQUAL "ScriptEvent") string(APPEND SQUIRREL_EXPORT "\n template <> inline int Return<${NAME} *>(HSQUIRRELVM vm, ${NAME} *res) { if (res == nullptr) { sq_pushnull(vm); return 1; } Squirrel::CreateClassInstanceVM(vm, \"${REALNAME}\", res, nullptr, DefSQDestructorCallback<${NAME}>, true); return 1; }") elseif("${NAME}" STREQUAL "ScriptText") diff --git a/docs/company_colour_indexes.html b/docs/company_colour_indexes.html new file mode 100644 index 0000000000..fb9dea7add --- /dev/null +++ b/docs/company_colour_indexes.html @@ -0,0 +1,557 @@ + + + + + OpenTTD Company Colour Indexes + + + + +

Company Colour Indexes

+

Hex / dec indexes into the DOS palette

+

+ Visual representation of values derived from https://github.com/frosch123/TTDViewer/blob/master/src/recolor.xml#L186 +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
COLOUR_DARK_BLUE
0xc60xc70xc80xc90xca0xcb0xcc0xcd
198199200201202203204205
COLOUR_PALE_GREEN
0x600x610x620x630x640x650x660x67
96979899100101102103
COLOUR_PINK
0x2a0x2b0x2c0x2d0x2e0x2f0x300x31
4243444546474849
COLOUR_YELLOW
0x3e0x3f0x400x410x420x430x440x45
6263646566676869
COLOUR_RED
0xb30xb40xb50xb60xb70xa40xa50xa6
179180181182183164165166
COLOUR_LIGHT_BLUE
0x9a0x9b0x9c0x9d0x9e0x9f0xa00xa1
154155156157158159160161
COLOUR_GREEN
0x520x530x540x550xce0xcf0xd00xd1
82838485206207208209
COLOUR_DARK_GREEN
0x580x590x5a0x5b0x5c0x5d0x5e0x5f
8889909192939495
COLOUR_BLUE
0x920x930x940x950x960x970x980x99
146147148149150151152153
COLOUR_CREAM
0x720x730x740x750x760x770x780x79
114115116117118119120121
COLOUR_MAUVE
0x800x810x820x830x840x850x860x87
128129130131132133134135
COLOUR_PURPLE
0x880x890x8a0x8b0x8c0x8d0x8e0x8f
136137138139140141142143
COLOUR_ORANGE
0x400xc00xc10xc20xc30xc40xc50x27
6419219319419519619739
COLOUR_BROWN
0x200x210x220x230x240x250x260x27
3233343536373839
COLOUR_GREY
0x40x50x60x70x80x90xa0xb
4567891011
COLOUR_WHITE
0x80x90xa0xb0xc0xd0xe0xf
89101112131415
+ + diff --git a/docs/game_coordinator.md b/docs/game_coordinator.md new file mode 100644 index 0000000000..8bf07d8027 --- /dev/null +++ b/docs/game_coordinator.md @@ -0,0 +1,83 @@ +# Game Coordinator + +To allow two players to play together, OpenTTD uses a Game Coordinator to +facilitate this. + +When a server starts, it can register itself to the Game Coordinator. This +happens when `server_game_type` is set to either `invite-only` or `public`. +Upon registration, the Game Coordinator probes the network of the server, and +assigns the server an unique code, called an `invite code`. + +When a client wants to join a server, it asks the Game Coordinator to help +with this by giving it the `invite code` of the server. The Game Coordinator +will, in this order, attempt several ways to connect the client and server +together: + +## 1) Via direct IPv4 / IPv6 + +Upon registration, the Game Coordinator probes the server to see if a +direction connection to the server is possible based on the game port. It +tries this over the public IPv4 and IPv6, as announced by the server. +If either (or both) are successful, a client will always be asked to try +these direct IPs first when it wants to connect to this server. + +- If the server is IPv4 only, the client is only asked to connect via IPv4. +- If the server is IPv6 only, the client is only asked to connect via IPv6. +- If the server is both IPv4 and IPv6, the client is asked to connect to to + one of those first. If that fails, it is asked to connect to the other. + Whether it tries IPv4 or IPv6 first, strongly depends on several network + infrastructure related events. The biggest influence is the network + latency over both protocols to the OpenTTD infrastructure. + +In the end, if either the server is not reachable directly from the Internet +or the client fails to connect to either one of them, the connection attempt +continues with the next available method. + +## 2) Via STUN + +When a client wants to join a server via STUN, both the client and server +are asked to create a connection to the STUN server (normally +`stun.openttd.org`) via both IPv4 and IPv6. If the client or server has no +IPv4 or IPv6, it will not make a connection attempt via that protocol. + +The STUN server collects the public IPv4 and/or IPv6 of the client and server, +together with the port the connection came in from. For most NAT gateways it +holds true that as long as you use the same local IP + port, your public +IP + port will remain the same, and allow for bi-directional communication. +And this fact is used to later on pair the client and server. + +The STUN server reports this information directly to the Game Coordinator +(this in contrast to most STUN implementation, where this information is +first reported back to the peer itself, which has to relay it back to the +coordinator. OpenTTD skips this step, as the STUN server can directly talk to +the Game Coordinator). When the Game Coordinator sees a matching pair (in +terms of IPv4 / IPv6), it will ask both the client and server to connect to +their peer based on this public IP + port. + +As the NAT gateway forwards the traffic on the public IP + port to the local +port, this creates a bi-directional socket between client and server. The +connection to the STUN server can now safely be closed, and the client and +server can continue to talk to each other. + +Some NAT gateways do not allow this method; for those this attempt will fail, +and this also means that it is not possible to create a connection between +the client and server. + +## 3) Via TURN + +As a last resort, the Game Coordinator can decide to connect the client and +server together via TURN. TURN is a relay service, relaying the messages +between client and server. + +As the client and server can already connect to the Game Coordinator, it is +very likely this is successful. + +It is important to note that a relay service has full view of the traffic +send between client and server, and as such it is important that you trust +the relay service used. +For official binaries, this relay service is hosted by openttd.org. The relay +service as hosted by openttd.org only validates it is relaying valid OpenTTD +packets and does no further inspection of the payload itself. +Although in our experience most patch-packs also use the services as offered +by openttd.org, it is possible they use different services. Please be mindful +about this. diff --git a/docs/multiplayer.md b/docs/multiplayer.md index daccbf06d6..c7e1839cf3 100644 --- a/docs/multiplayer.md +++ b/docs/multiplayer.md @@ -48,6 +48,10 @@ Last updated: 2011-02-16 - click add server - type in the ip address or hostname - if you want to add a port use : + - If you want to play and you have the invite code of the game server you + want connect to. + - click add server + - type in the invite code - Now you can select a company and press: "Join company", to help that company - Or you can press "Spectate game", to spectate the game - Or you can press "New company", and start your own company (if there are @@ -110,9 +114,10 @@ Last updated: 2011-02-16 - You can let your server automatically restart a map when, let's say, year 2030 is reached. See 'set restart_game_date' for detail. - - If you want to be on the server-list, enable Advertising. To do this, select - 'Internet (advertise)' in the Start Server menu, or type in console: - 'set server_advertise 1'. + - If you want to be on the server-list, make your server public. You can do + this either from the Start Server GUI, via the in-game Online Players GUI, + or by typing in the console: + 'set server_game_type public'. - You can protect your server with a password via the console: 'set server_pw', or via the Start Server menu. diff --git a/docs/savegame_format.md b/docs/savegame_format.md new file mode 100644 index 0000000000..fafbc64471 --- /dev/null +++ b/docs/savegame_format.md @@ -0,0 +1,214 @@ +# OpenTTD's Savegame Format + +Last updated: 2021-06-15 + +## Outer container + +Savegames for OpenTTD start with an outer container, to contain the compressed data for the rest of the savegame. + +`[0..3]` - The first four bytes indicate what compression is used. +In ASCII, these values are possible: + +- `OTTD` - Compressed with LZO (deprecated, only really old savegames would use this). +- `OTTN` - No compression. +- `OTTZ` - Compressed with zlib. +- `OTTX` - Compressed with LZMA. + +`[4..5]` - The next two bytes indicate which savegame version used. + +`[6..7]` - The next two bytes can be ignored, and were only used in really old savegames. + +`[8..N]` - Next follows a binary blob which is compressed with the indicated compression algorithm. + +The rest of this document talks about this decompressed blob of data. + +## Data types + +The savegame is written in Big Endian, so when we talk about a 16-bit unsigned integer (`uint16`), we mean it is stored in Big Endian. + +The following types are valid: + +- `1` - `int8` / `SLE_FILE_I8` -8-bit signed integer +- `2` - `uint8` / `SLE_FILE_U8` - 8-bit unsigned integer +- `3` - `int16` / `SLE_FILE_I16` - 16-bit signed integer +- `4` - `uint16` / `SLE_FILE_U16` - 16-bit unsigned integer +- `5` - `int32` / `SLE_FILE_I32` - 32-bit signed integer +- `6` - `uint32` / `SLE_FILE_U32` - 32-bit unsigned integer +- `7` - `int64` / `SLE_FILE_I64` - 64-bit signed integer +- `8` - `uint64` / `SLE_FILE_U64` - 64-bit unsigned integer +- `9` - `StringID` / `SLE_FILE_STRINGID` - a StringID inside the OpenTTD's string table +- `10` - `str` / `SLE_FILE_STRING` - a string (prefixed with a length-field) +- `11` - `struct` / `SLE_FILE_STRUCT` - a struct + +### Gamma value + +There is also a field-type called `gamma`. +This is most often used for length-fields, and uses as few bytes as possible to store an integer. +For values <= 127, it uses a single byte. +For values > 127, it uses two bytes and sets the highest bit to high. +For values > 32767, it uses three bytes and sets the two highest bits to high. +And this continues till the value fits. +In a more visual approach: +``` + 0xxxxxxx + 10xxxxxx xxxxxxxx + 110xxxxx xxxxxxxx xxxxxxxx + 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx + 11110--- xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx +``` + +## Chunks + +Savegames for OpenTTD store their data in chunks. +Each chunk contains data for a certain part of the game, for example "Companies", "Vehicles", etc. + +`[0..3]` - Each chunk starts with four bytes to indicate the tag. +If the tag is `\x00\x00\x00\x00` it means the end of the savegame is reached. +An example of a valid tag is `PLYR` when looking at it via ASCII, which contains the information of all the companies. + +`[4..4]` - Next follows a byte where the lower 4 bits contain the type. +The possible valid types are: + +- `0` - `CH_RIFF` - This chunk is a binary blob. +- `1` - `CH_ARRAY` - This chunk is a list of items. +- `2` - `CH_SPARSE_ARRAY` - This chunk is a list of items. +- `3` - `CH_TABLE` - This chunk is self-describing list of items. +- `4` - `CH_SPARSE_TABLE` - This chunk is self-describing list of items. + +Now per type the format is (slightly) different. + +### CH_RIFF + +(since savegame version 295, this chunk type is only used for MAP-chunks, containing bit-information about each tile on the map) + +A `CH_RIFF` starts with an `uint24` which together with the upper-bits of the type defines the length of the chunk. +In pseudo-code: + +``` +type = read uint8 +if type == 0 + length = read uint24 + length |= ((type >> 4) << 24) +``` + +The next `length` bytes are part of the chunk. +What those bytes mean depends on the tag of the chunk; further details per chunk can be found in the source-code. + +### CH_ARRAY / CH_SPARSE_ARRAY + +(this chunk type is deprecated since savegame version 295 and is no longer in use) + +`[0..G1]` - A `CH_ARRAY` / `CH_SPARSE_ARRAY` starts with a `gamma`, indicating the size of the next item plus one. +If this size value is zero, it indicates the end of the list. +This indicates the full length of the next item minus one. +In psuedo-code: + +``` +loop + size = read gamma - 1 + if size == -1 + break loop + read bytes +``` + +`[]` - For `CH_ARRAY` there is an implicit index. +The loop starts at zero, and every iteration adds one to the index. +For entries in the game that were not allocated, the `size` will be zero. + +`[G1+1..G2]` - For `CH_SPARSE_ARRAY` there is an explicit index. +The `gamma` following the size indicates the index. + +The content of the item is a binary blob, and similar to `CH_RIFF`, it depends on the tag of the chunk what it means. +Please check the source-code for further details. + +### CH_TABLE / CH_SPARSE_TABLE + +(this chunk type only exists since savegame version 295) + +Both `CH_TABLE` and `CH_SPARSE_TABLE` are very similar to `CH_ARRAY` / `CH_SPARSE_ARRAY` respectively. +The only change is that the chunk starts with a header. +This header describes the chunk in details; with the header you know the meaning of each byte in the binary blob that follows. + +`[0..G]` - The header starts with a `gamma` to indicate the size of all the headers in this chunk plus one. +If this size value is zero, it means there is no header, which should never be the case. + +Next follows a list of `(type, key)` pairs: + +- `[0..0]` - Type of the field. +- `[1..G]` - `gamma` to indicate length of key. +- `[G+1..N]` - Key (in UTF-8) of the field. + +If at any point `type` is zero, the list stops (and no `key` follows). + +The `type`'s lower 4 bits indicate the data-type (see chapter above). +The `type`'s 5th bit (so `0x10`) indicates if the field is a list, and if this field in every record starts with a `gamma` to indicate how many times the `type` is repeated. + +If the `type` indicates either a `struct` or `str`, the `0x10` flag is also always set. + +As the savegame format allows (list of) structs in structs, if any `struct` type is found, this header will be followed by a header of that struct. +This nesting of structs is stored depth-first, so given this table: + +``` +type | key +----------------- +uint8 | counter +struct | substruct1 +struct | substruct2 +``` + +With `substruct1` being like: + +``` +type | key +----------------- +uint8 | counter +struct | substruct3 +``` + +The headers will be, in order: `table`, `substruct1`, `substruct3`, `substruct2`, each ending with a `type` is zero field. + +After reading all the fields of all the headers, there is a list of records. +To read this, see `CH_ARRAY` / `CH_SPARSE_ARRAY` for details. + +As each `type` has a well defined length, you can read the records even without knowing anything about the chunk-tag yourself. + +Do remember, that if the `type` had the `0x10` flag active, the field in the record first has a `gamma` to indicate how many times that `type` is repeated. + +#### Guidelines for network-compatible patch-packs + +For network-compatible patch-packs (client-side patches that can play together with unpatched clients) we advise to prefix the field-name with `__` when introducing new fields to an existing chunk. + +Example: you have an extra setting called `auto_destroy_rivers` you want to store in the savegame for your patched client called `mypp`. +We advise you to call this setting `__mypp_auto_destroy_rivers` in the settings chunk. + +Doing it this way ensures that a savegame created by these patch-packs can still safely be loaded by unpatched clients. +They will simply ignore the field and continue loading the savegame as usual. +The prefix is strongly advised to avoid conflicts with future-settings in an unpatched client or conflicts with other patch-packs. + +## Scripts custom data format + +Script chunks (`AIPL` and `GSDT`) use `CH_TABLE` chunk type. + +At the end of each record there's an `uint8` to indicate if there's custom data (1) or not (0). + +There are 6 data types for scripts, called `script-data-type`. +When saving, each `script-data-type` starts with the type marker saved as `uint8` followed by the actual data. +- `0` - `SQSL_INT`: + - an `int64` with the actual value (`int32` before savegame version 296). +- `1` - `SQSL_STRING`: + - an `uint8` with the string length. + - a list of `int8` for the string itself. +- `2` - `SQSL_ARRAY`: + - each element saved as `script-data-type`. + - an `SQSL_ARRAY_TABLE_END` (0xFF) marker (`uint8`). +- `3` - `SQSL_TABLE`: + - for each element: + - key saved as `script-data-type`. + - value saved as `script-data-type`. + - an `SQSL_ARRAY_TABLE_END` (0xFF) marker (`uint8`). +- `4` - `SQSL_BOOL`: + - an `uint8` with 0 (false) or 1 (true). +- `5` - `SQSL_NULL`: + - (no data follows) + +The first data type is always a `SQSL_TABLE`. diff --git a/known-bugs.txt b/known-bugs.txt index 4e9e3e9b5e..1b9a465af7 100644 --- a/known-bugs.txt +++ b/known-bugs.txt @@ -1,6 +1,4 @@ OpenTTD's known bugs -Last updated: 2021-04-01 -Release version: 1.11.0 ------------------------------------------------------------------------ diff --git a/media/baseset/openttd.grf b/media/baseset/openttd.grf index a63bfc4e295e77a34ac22387778c534dcc1f2c3d..837e4b12d2553699331ad6ba878d38afda6aa109 100644 GIT binary patch delta 328 zcmbO>S$_3Yc@`Fi|MweNT3HxdS(sW`m|Iy`wz9Aqlriq#Zd%6LIH$gWfsu=c0R)&C z7#LnKUtoK|!_3IY_=1^{@dh_DKR^EqW=8%Oya%`+@Gjtaq0G$4&-j96f$9m{9Ud=2 zRwNuKz%=0j4--HC4Bi7`52Q9IZBPXnvcPBtZ->+jbw&nM<@F#NSs54@85wtgZF|7` zKyU%i1&J4$542Ahbf`SAzF@n6XM#iy10xp~$e9c. // -1 * 0 0C "OpenTTD GUI graphics" - -1 * 3 05 15 \b 186 // OPENTTD_SPRITE_COUNT + -1 * 3 05 15 \b 191 // OPENTTD_SPRITE_COUNT -1 sprites/openttdgui.png 8bpp 66 8 64 31 -31 7 normal -1 sprites/openttdgui.png 8bpp 146 8 64 31 -31 7 normal -1 sprites/openttdgui.png 8bpp 226 8 64 31 -31 7 normal @@ -191,3 +191,8 @@ -1 sprites/openttdgui_convert_tram.png 8bpp 24 0 32 32 0 0 normal -1 sprites/openttdgui.png 8bpp 513 440 10 10 0 0 normal -1 sprites/openttdgui.png 8bpp 526 440 10 10 0 0 normal + -1 sprites/openttdgui.png 8bpp 539 440 12 10 0 0 normal + -1 sprites/openttdgui.png 8bpp 553 440 12 10 0 0 normal + -1 sprites/openttdgui.png 8bpp 567 440 12 10 0 0 normal + -1 sprites/openttdgui.png 8bpp 581 440 10 10 0 0 normal + -1 sprites/openttdgui.png 8bpp 593 440 10 10 0 0 normal diff --git a/media/baseset/openttd/openttdgui.png b/media/baseset/openttd/openttdgui.png index 1fc02aa61e30774b4e69fd08b21f51ef69a74a00..5b80c3326047f00565f11a27cc8cad879228a9f1 100644 GIT binary patch delta 42208 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

dywXxmuT`BPPtK=ikGpzu#!m+U5nKH~#kD^|cec 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 W+82l{QLL#xKcA+>vHA^Ht&5 znklus4KK4bd1=-bTO{Wb~=Zl9(y7V$mFVdMDJ*uoRa{Y3eyT0Nh~swjsJ8G$2A z_hls6KFl>%3X1!++4}SQdzuDxT zx$=SQmnsrZ#Bcg#-#w-JbNSooYn89rx8G}@zx_@0XG;gMi2?@7f6_SxHb^smmi$xj z#zujMvytVWF+azZXYL2w>n8aBR1oD3VoO<<PCx!{-l-s4vqrNb;-|!u7(2F? z(cO9tErS2WtM-Y1x^8~7;m%Im`iJb>-*A8ad~R>__Wbw_d6uf&Obr~~N$CwYIM`-z z*faPXND$FE@tJ?3OrGbAzx@2d;o>r@W#sA&g-;%K(>CPLuzmWUMWJPLP?uwdD%-(3 z&z`LMl(HkDslTf!n_=S4lq_zi72M2mc7Ogp5zI(?_j%^!1v7V^UmweMRz-{3>4h85 z2{*9$mp%Vk$U*Gg-QstR(WSrNmB<-cqfFL6?g}ZG%--IUzGYM7nw^Jq!kjov%-NQA2%WV~^A}J!ni(g_ zVCC>Fnni*2YOG)o%ab>Y_$J(wy`C^@d&#lg7bTAN#oXtWF;L@F*#7+ex%+<)mhbz# z|JHW>JG)Br|J{3AUH@5?dy>GW8J0mAj!x~nBWw6pCpaFOBJkkwxu%kW4F=P+n4CI= z1fnAEJ2=g=a@g{@sC0A0Z(Y8y#Rr_sV(0%?KBDl{eu5+8%2q(3)4m0>_ z46M@~H%v})IhEZ!sntm92r$5eIv)Pin>7FRFlfV=%1)YQp=Z1a*4~B(b+U@ro z75u5E_tL>3Y2B%Yh81C#dQDhW>bEHb-fX(FtKjs%cnRsVm+d7Czsdgod;9bEqEqLt zpWK|eW)JJbgY6M+`b>xZ|M*aO&OOIbWAE2{Yj3~b`+eSr**pq|nVmWqmxwFauyxvq zH@#5cKXLc_`DpPQ)7_T4)gRT1`N0@5;mlE{Tybl+Ba^E1E;YQ6nKJ*q=EIr^r!4so z*6-&!VwqrjZ+CCaoqb>L^|vgZ8o$QqlB|Go^UjFmhex8{c%{&H0 zLxt^iKkoGl^ha;6|FYQHWZp@m@S_YxI~X47iEUTto6J=7@ldS8BRv;64S|LC=kA|< zc!5g?i@-s4&3Vl=6J`j=HQw3v^tLxyDmPVh2OE`hqY4C>}TI+&sd$rU|FLlmX)UH@&BQ>{hspo=l|X2fB*O9 zUi;n5_a{uUVRLm_)o`TdNwATfh2qKkKb;ca*`9y4O2UE9KU|opVTs=^&IT1Ou7(GH zTOKWQnqobDUp&K+tIUtW7%P9&yqh!MKA!hAuL7F@WbhYsHVkOLThWgv|JjS=lqzq! T9d~A6U|{fc^>bP0l+XkKq?bit delta 41562 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 diff --git a/media/baseset/opntitle.dat b/media/baseset/opntitle.dat index 9bfac1dec9d70f6d1e5b321273c118cf61b2bfbe..264aaff60b5e58cad978bd390ad459da6cc06808 100644 GIT binary patch literal 138710 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%0AW(A5mRI`K#>0oLR6rC#<<~7E8cCF)i~K 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 RwY!6F{P^^ragp^+Jpc%4;iCWm literal 98096 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 T<)+&i@OCpXFfcGMMn(YutPz)( diff --git a/os/emscripten/cmake/FindLibLZMA.cmake b/os/emscripten/cmake/FindLibLZMA.cmake index 99d1ca640a..e8a024c4ee 100644 --- a/os/emscripten/cmake/FindLibLZMA.cmake +++ b/os/emscripten/cmake/FindLibLZMA.cmake @@ -1,5 +1,5 @@ # LibLZMA is a recent addition to the emscripten SDK, so it is possible -# someone hasn't updated his SDK yet. Test out if the SDK supports LibLZMA. +# someone hasn't updated their SDK yet. Test out if the SDK supports LibLZMA. include(CheckCXXSourceCompiles) set(CMAKE_REQUIRED_FLAGS "-sUSE_LIBLZMA=1") diff --git a/os/emscripten/pre.js b/os/emscripten/pre.js index 1563e4f95b..2fb641017c 100644 --- a/os/emscripten/pre.js +++ b/os/emscripten/pre.js @@ -9,7 +9,15 @@ Module['websocket'] = { url: function(host, port, proto) { * If you run your own server you can setup your own WebSocket proxy in * front of it and let people connect to your server via the proxy. You * are best to add another "if" statement as above for this. */ - return null; + + if (location.protocol === 'https:') { + /* Insecure WebSockets do not work over HTTPS, so we force + * secure ones. */ + return 'wss://'; + } else { + /* Use the default provided by Emscripten. */ + return null; + } } }; Module.preRun.push(function() { @@ -65,10 +73,14 @@ Module.preRun.push(function() { } window.openttd_server_list = function() { - add_server = Module.cwrap("em_openttd_add_server", null, ["string", "number"]); + add_server = Module.cwrap("em_openttd_add_server", null, ["string"]); - /* Add servers that support WebSocket here. Example: - * add_server("localhost", 3979); */ + /* Add servers that support WebSocket here. Examples: + * add_server("localhost"); + * add_server("localhost:3979"); + * add_server("127.0.0.1:3979"); + * add_server("[::1]:3979"); + */ } var leftButtonDown = false; diff --git a/os/emscripten/shell.html b/os/emscripten/shell.html index 17ea5b414f..af031c6df8 100644 --- a/os/emscripten/shell.html +++ b/os/emscripten/shell.html @@ -85,6 +85,8 @@ position: absolute; width: 100%; z-index: 2; + /* OpenTTD draws the cursor itself */ + cursor: none !important; } diff --git a/os/windows/sign.bat b/os/windows/sign.bat new file mode 100644 index 0000000000..0e4291f9b8 --- /dev/null +++ b/os/windows/sign.bat @@ -0,0 +1,18 @@ +@echo off +REM Signing script +REM Arguments: sign.bat exe_to_sign certificate_subject_name + +REM This is a loose wrapper around the Microsoft signtool application (included in the Windows SDK). +REM See https://docs.microsoft.com/en-us/dotnet/framework/tools/signtool-exe for more details. + +REM Path to signtool.exe +IF NOT DEFINED SIGNTOOL_PATH (SET SIGNTOOL_PATH=signtool) + +REM URL of the timestamp server +IF NOT DEFINED SIGNTOOL_TIMESTAMP_URL (SET SIGNTOOL_TIMESTAMP_URL=http://timestamp.digicert.com) + +REM Sign with SHA-1 for Windows 7 and below +"%SIGNTOOL_PATH%" sign -v -n %2 -t %SIGNTOOL_TIMESTAMP_URL% %1 + +REM Sign with SHA-256 for Windows 8 and above +"%SIGNTOOL_PATH%" sign -v -n %2 -tr %SIGNTOOL_TIMESTAMP_URL% -fd sha256 -td sha256 -as %1 diff --git a/regression/regression/info.nut b/regression/regression/info.nut index a3126121ee..1a52cfebbb 100644 --- a/regression/regression/info.nut +++ b/regression/regression/info.nut @@ -4,7 +4,7 @@ class Regression extends AIInfo { function GetShortName() { return "REGR"; } function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; } function GetVersion() { return 1; } - function GetAPIVersion() { return "1.11"; } + function GetAPIVersion() { return "12"; } function GetDate() { return "2007-03-18"; } function CreateInstance() { return "Regression"; } function UseAsRandomAI() { return false; } diff --git a/regression/stationlist/info.nut b/regression/stationlist/info.nut index 9b7c8febc7..ad91c7645c 100644 --- a/regression/stationlist/info.nut +++ b/regression/stationlist/info.nut @@ -4,7 +4,7 @@ class StationList extends AIInfo { function GetShortName() { return "REGS"; } function GetDescription() { return "This runs stationlist-tests on some commands. On the same map the result should always be the same."; } function GetVersion() { return 1; } - function GetAPIVersion() { return "1.11"; } + function GetAPIVersion() { return "12"; } function GetDate() { return "2007-03-18"; } function CreateInstance() { return "StationList"; } function UseAsRandomAI() { return false; } diff --git a/src/3rdparty/CMakeLists.txt b/src/3rdparty/CMakeLists.txt index ca082cf785..50fa6922f4 100644 --- a/src/3rdparty/CMakeLists.txt +++ b/src/3rdparty/CMakeLists.txt @@ -1,3 +1,4 @@ +add_subdirectory(fmt) add_subdirectory(md5) add_subdirectory(squirrel) add_subdirectory(opengl) diff --git a/src/3rdparty/fmt/CMakeLists.txt b/src/3rdparty/fmt/CMakeLists.txt new file mode 100644 index 0000000000..22a02416c3 --- /dev/null +++ b/src/3rdparty/fmt/CMakeLists.txt @@ -0,0 +1,5 @@ +add_files( + core.h + format.h + format-inl.h +) diff --git a/src/3rdparty/fmt/LICENSE.rst b/src/3rdparty/fmt/LICENSE.rst new file mode 100644 index 0000000000..f0ec3db4d2 --- /dev/null +++ b/src/3rdparty/fmt/LICENSE.rst @@ -0,0 +1,27 @@ +Copyright (c) 2012 - present, Victor Zverovich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. diff --git a/src/3rdparty/fmt/core.h b/src/3rdparty/fmt/core.h new file mode 100644 index 0000000000..0a81e0ccd9 --- /dev/null +++ b/src/3rdparty/fmt/core.h @@ -0,0 +1,2122 @@ +// Formatting library for C++ - the core API +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_CORE_H_ +#define FMT_CORE_H_ + +#include // std::FILE +#include +#include +#include +#include +#include +#include +#include + +// The fmt library version in the form major * 10000 + minor * 100 + patch. +#define FMT_VERSION 70103 + +#ifdef __clang__ +# define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__) +#else +# define FMT_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +#else +# define FMT_GCC_VERSION 0 +#endif + +#if defined(__INTEL_COMPILER) +# define FMT_ICC_VERSION __INTEL_COMPILER +#else +# define FMT_ICC_VERSION 0 +#endif + +#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) +# define FMT_HAS_GXX_CXX11 FMT_GCC_VERSION +#else +# define FMT_HAS_GXX_CXX11 0 +#endif + +#ifdef __NVCC__ +# define FMT_NVCC __NVCC__ +#else +# define FMT_NVCC 0 +#endif + +#ifdef _MSC_VER +# define FMT_MSC_VER _MSC_VER +# define FMT_SUPPRESS_MSC_WARNING(n) __pragma(warning(suppress : n)) +#else +# define FMT_MSC_VER 0 +# define FMT_SUPPRESS_MSC_WARNING(n) +#endif + +#ifdef __has_feature +# define FMT_HAS_FEATURE(x) __has_feature(x) +#else +# define FMT_HAS_FEATURE(x) 0 +#endif + +#if defined(__has_include) && !defined(__INTELLISENSE__) && \ + (!FMT_ICC_VERSION || FMT_ICC_VERSION >= 1600) +# define FMT_HAS_INCLUDE(x) __has_include(x) +#else +# define FMT_HAS_INCLUDE(x) 0 +#endif + +#ifdef __has_cpp_attribute +# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define FMT_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +#define FMT_HAS_CPP14_ATTRIBUTE(attribute) \ + (__cplusplus >= 201402L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + +#define FMT_HAS_CPP17_ATTRIBUTE(attribute) \ + (__cplusplus >= 201703L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + +// Check if relaxed C++14 constexpr is supported. +// GCC doesn't allow throw in constexpr until version 6 (bug 67371). +#ifndef FMT_USE_CONSTEXPR +# define FMT_USE_CONSTEXPR \ + (FMT_HAS_FEATURE(cxx_relaxed_constexpr) || FMT_MSC_VER >= 1910 || \ + (FMT_GCC_VERSION >= 600 && __cplusplus >= 201402L)) && \ + !FMT_NVCC && !FMT_ICC_VERSION +#endif +#if FMT_USE_CONSTEXPR +# define FMT_CONSTEXPR constexpr +# define FMT_CONSTEXPR_DECL constexpr +#else +# define FMT_CONSTEXPR inline +# define FMT_CONSTEXPR_DECL +#endif + +#ifndef FMT_OVERRIDE +# if FMT_HAS_FEATURE(cxx_override_control) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900 +# define FMT_OVERRIDE override +# else +# define FMT_OVERRIDE +# endif +#endif + +// Check if exceptions are disabled. +#ifndef FMT_EXCEPTIONS +# if (defined(__GNUC__) && !defined(__EXCEPTIONS)) || \ + FMT_MSC_VER && !_HAS_EXCEPTIONS +# define FMT_EXCEPTIONS 0 +# else +# define FMT_EXCEPTIONS 1 +# endif +#endif + +// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature). +#ifndef FMT_USE_NOEXCEPT +# define FMT_USE_NOEXCEPT 0 +#endif + +#if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900 +# define FMT_DETECTED_NOEXCEPT noexcept +# define FMT_HAS_CXX11_NOEXCEPT 1 +#else +# define FMT_DETECTED_NOEXCEPT throw() +# define FMT_HAS_CXX11_NOEXCEPT 0 +#endif + +#ifndef FMT_NOEXCEPT +# if FMT_EXCEPTIONS || FMT_HAS_CXX11_NOEXCEPT +# define FMT_NOEXCEPT FMT_DETECTED_NOEXCEPT +# else +# define FMT_NOEXCEPT +# endif +#endif + +// [[noreturn]] is disabled on MSVC and NVCC because of bogus unreachable code +// warnings. +#if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VER && \ + !FMT_NVCC +# define FMT_NORETURN [[noreturn]] +#else +# define FMT_NORETURN +#endif + +#ifndef FMT_DEPRECATED +# if FMT_HAS_CPP14_ATTRIBUTE(deprecated) || FMT_MSC_VER >= 1900 +# define FMT_DEPRECATED [[deprecated]] +# else +# if (defined(__GNUC__) && !defined(__LCC__)) || defined(__clang__) +# define FMT_DEPRECATED __attribute__((deprecated)) +# elif FMT_MSC_VER +# define FMT_DEPRECATED __declspec(deprecated) +# else +# define FMT_DEPRECATED /* deprecated */ +# endif +# endif +#endif + +// Workaround broken [[deprecated]] in the Intel, PGI and NVCC compilers. +#if FMT_ICC_VERSION || defined(__PGI) || FMT_NVCC +# define FMT_DEPRECATED_ALIAS +#else +# define FMT_DEPRECATED_ALIAS FMT_DEPRECATED +#endif + +#ifndef FMT_INLINE +# if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_INLINE inline __attribute__((always_inline)) +# else +# define FMT_INLINE inline +# endif +#endif + +#ifndef FMT_USE_INLINE_NAMESPACES +# if FMT_HAS_FEATURE(cxx_inline_namespaces) || FMT_GCC_VERSION >= 404 || \ + (FMT_MSC_VER >= 1900 && !_MANAGED) +# define FMT_USE_INLINE_NAMESPACES 1 +# else +# define FMT_USE_INLINE_NAMESPACES 0 +# endif +#endif + +#ifndef FMT_BEGIN_NAMESPACE +# if FMT_USE_INLINE_NAMESPACES +# define FMT_INLINE_NAMESPACE inline namespace +# define FMT_END_NAMESPACE \ + } \ + } +# else +# define FMT_INLINE_NAMESPACE namespace +# define FMT_END_NAMESPACE \ + } \ + using namespace v7; \ + } +# endif +# define FMT_BEGIN_NAMESPACE \ + namespace fmt { \ + FMT_INLINE_NAMESPACE v7 { +#endif + +#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) +# define FMT_CLASS_API FMT_SUPPRESS_MSC_WARNING(4275) +# ifdef FMT_EXPORT +# define FMT_API __declspec(dllexport) +# define FMT_EXTERN_TEMPLATE_API FMT_API +# define FMT_EXPORTED +# elif defined(FMT_SHARED) +# define FMT_API __declspec(dllimport) +# define FMT_EXTERN_TEMPLATE_API FMT_API +# endif +#else +# define FMT_CLASS_API +#endif +#ifndef FMT_API +# define FMT_API +#endif +#ifndef FMT_EXTERN_TEMPLATE_API +# define FMT_EXTERN_TEMPLATE_API +#endif +#ifndef FMT_INSTANTIATION_DEF_API +# define FMT_INSTANTIATION_DEF_API FMT_API +#endif + +#ifndef FMT_HEADER_ONLY +# define FMT_EXTERN extern +#else +# define FMT_EXTERN +#endif + +// libc++ supports string_view in pre-c++17. +#if (FMT_HAS_INCLUDE() && \ + (__cplusplus > 201402L || defined(_LIBCPP_VERSION))) || \ + (defined(_MSVC_LANG) && _MSVC_LANG > 201402L && _MSC_VER >= 1910) +# include +# define FMT_USE_STRING_VIEW +#elif FMT_HAS_INCLUDE("experimental/string_view") && __cplusplus >= 201402L +# include +# define FMT_USE_EXPERIMENTAL_STRING_VIEW +#endif + +#ifndef FMT_UNICODE +# define FMT_UNICODE !FMT_MSC_VER +#endif +#if FMT_UNICODE && FMT_MSC_VER +# pragma execution_character_set("utf-8") +#endif + +FMT_BEGIN_NAMESPACE + +// Implementations of enable_if_t and other metafunctions for older systems. +template +using enable_if_t = typename std::enable_if::type; +template +using conditional_t = typename std::conditional::type; +template using bool_constant = std::integral_constant; +template +using remove_reference_t = typename std::remove_reference::type; +template +using remove_const_t = typename std::remove_const::type; +template +using remove_cvref_t = typename std::remove_cv>::type; +template struct type_identity { using type = T; }; +template using type_identity_t = typename type_identity::type; + +struct monostate {}; + +// An enable_if helper to be used in template parameters which results in much +// shorter symbols: https://godbolt.org/z/sWw4vP. Extra parentheses are needed +// to workaround a bug in MSVC 2019 (see #1140 and #1186). +#define FMT_ENABLE_IF(...) enable_if_t<(__VA_ARGS__), int> = 0 + +namespace detail { + +// A helper function to suppress "conditional expression is constant" warnings. +template constexpr T const_check(T value) { return value; } + +FMT_NORETURN FMT_API void assert_fail(const char* file, int line, + const char* message); + +#ifndef FMT_ASSERT +# ifdef NDEBUG +// FMT_ASSERT is not empty to avoid -Werror=empty-body. +# define FMT_ASSERT(condition, message) ((void)0) +# else +# define FMT_ASSERT(condition, message) \ + ((condition) /* void() fails with -Winvalid-constexpr on clang 4.0.1 */ \ + ? (void)0 \ + : ::fmt::detail::assert_fail(__FILE__, __LINE__, (message))) +# endif +#endif + +#if defined(FMT_USE_STRING_VIEW) +template using std_string_view = std::basic_string_view; +#elif defined(FMT_USE_EXPERIMENTAL_STRING_VIEW) +template +using std_string_view = std::experimental::basic_string_view; +#else +template struct std_string_view {}; +#endif + +#ifdef FMT_USE_INT128 +// Do nothing. +#elif defined(__SIZEOF_INT128__) && !FMT_NVCC && \ + !(FMT_CLANG_VERSION && FMT_MSC_VER) +# define FMT_USE_INT128 1 +using int128_t = __int128_t; +using uint128_t = __uint128_t; +#else +# define FMT_USE_INT128 0 +#endif +#if !FMT_USE_INT128 +struct int128_t {}; +struct uint128_t {}; +#endif + +// Casts a nonnegative integer to unsigned. +template +FMT_CONSTEXPR typename std::make_unsigned::type to_unsigned(Int value) { + FMT_ASSERT(value >= 0, "negative value"); + return static_cast::type>(value); +} + +FMT_SUPPRESS_MSC_WARNING(4566) constexpr unsigned char micro[] = "\u00B5"; + +template constexpr bool is_unicode() { + return FMT_UNICODE || sizeof(Char) != 1 || + (sizeof(micro) == 3 && micro[0] == 0xC2 && micro[1] == 0xB5); +} + +#ifdef __cpp_char8_t +using char8_type = char8_t; +#else +enum char8_type : unsigned char {}; +#endif +} // namespace detail + +#ifdef FMT_USE_INTERNAL +namespace internal = detail; // DEPRECATED +#endif + +/** + An implementation of ``std::basic_string_view`` for pre-C++17. It provides a + subset of the API. ``fmt::basic_string_view`` is used for format strings even + if ``std::string_view`` is available to prevent issues when a library is + compiled with a different ``-std`` option than the client code (which is not + recommended). + */ +template class basic_string_view { + private: + const Char* data_; + size_t size_; + + public: + using value_type = Char; + using iterator = const Char*; + + constexpr basic_string_view() FMT_NOEXCEPT : data_(nullptr), size_(0) {} + + /** Constructs a string reference object from a C string and a size. */ + constexpr basic_string_view(const Char* s, size_t count) FMT_NOEXCEPT + : data_(s), + size_(count) {} + + /** + \rst + Constructs a string reference object from a C string computing + the size with ``std::char_traits::length``. + \endrst + */ +#if __cplusplus >= 201703L // C++17's char_traits::length() is constexpr. + FMT_CONSTEXPR +#endif + basic_string_view(const Char* s) + : data_(s), size_(std::char_traits::length(s)) {} + + /** Constructs a string reference from a ``std::basic_string`` object. */ + template + FMT_CONSTEXPR basic_string_view( + const std::basic_string& s) FMT_NOEXCEPT + : data_(s.data()), + size_(s.size()) {} + + template >::value)> + FMT_CONSTEXPR basic_string_view(S s) FMT_NOEXCEPT : data_(s.data()), + size_(s.size()) {} + + /** Returns a pointer to the string data. */ + constexpr const Char* data() const { return data_; } + + /** Returns the string size. */ + constexpr size_t size() const { return size_; } + + constexpr iterator begin() const { return data_; } + constexpr iterator end() const { return data_ + size_; } + + constexpr const Char& operator[](size_t pos) const { return data_[pos]; } + + FMT_CONSTEXPR void remove_prefix(size_t n) { + data_ += n; + size_ -= n; + } + + // Lexicographically compare this string reference to other. + int compare(basic_string_view other) const { + size_t str_size = size_ < other.size_ ? size_ : other.size_; + int result = std::char_traits::compare(data_, other.data_, str_size); + if (result == 0) + result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); + return result; + } + + friend bool operator==(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) == 0; + } + friend bool operator!=(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) != 0; + } + friend bool operator<(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) < 0; + } + friend bool operator<=(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) <= 0; + } + friend bool operator>(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) > 0; + } + friend bool operator>=(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) >= 0; + } +}; + +using string_view = basic_string_view; +using wstring_view = basic_string_view; + +/** Specifies if ``T`` is a character type. Can be specialized by users. */ +template struct is_char : std::false_type {}; +template <> struct is_char : std::true_type {}; +template <> struct is_char : std::true_type {}; +template <> struct is_char : std::true_type {}; +template <> struct is_char : std::true_type {}; +template <> struct is_char : std::true_type {}; + +/** + \rst + Returns a string view of `s`. In order to add custom string type support to + {fmt} provide an overload of `to_string_view` for it in the same namespace as + the type for the argument-dependent lookup to work. + + **Example**:: + + namespace my_ns { + inline string_view to_string_view(const my_string& s) { + return {s.data(), s.length()}; + } + } + std::string message = fmt::format(my_string("The answer is {}"), 42); + \endrst + */ +template ::value)> +inline basic_string_view to_string_view(const Char* s) { + return s; +} + +template +inline basic_string_view to_string_view( + const std::basic_string& s) { + return s; +} + +template +inline basic_string_view to_string_view(basic_string_view s) { + return s; +} + +template >::value)> +inline basic_string_view to_string_view(detail::std_string_view s) { + return s; +} + +// A base class for compile-time strings. It is defined in the fmt namespace to +// make formatting functions visible via ADL, e.g. format(FMT_STRING("{}"), 42). +struct compile_string {}; + +template +struct is_compile_string : std::is_base_of {}; + +template ::value)> +constexpr basic_string_view to_string_view(const S& s) { + return s; +} + +namespace detail { +void to_string_view(...); +using fmt::v7::to_string_view; + +// Specifies whether S is a string type convertible to fmt::basic_string_view. +// It should be a constexpr function but MSVC 2017 fails to compile it in +// enable_if and MSVC 2015 fails to compile it as an alias template. +template +struct is_string : std::is_class()))> { +}; + +template struct char_t_impl {}; +template struct char_t_impl::value>> { + using result = decltype(to_string_view(std::declval())); + using type = typename result::value_type; +}; + +// Reports a compile-time error if S is not a valid format string. +template ::value)> +FMT_INLINE void check_format_string(const S&) { +#ifdef FMT_ENFORCE_COMPILE_STRING + static_assert(is_compile_string::value, + "FMT_ENFORCE_COMPILE_STRING requires all format strings to use " + "FMT_STRING."); +#endif +} +template ::value)> +void check_format_string(S); + +struct error_handler { + constexpr error_handler() = default; + constexpr error_handler(const error_handler&) = default; + + // This function is intentionally not constexpr to give a compile-time error. + FMT_NORETURN FMT_API void on_error(const char* message); +}; +} // namespace detail + +/** String's character type. */ +template using char_t = typename detail::char_t_impl::type; + +/** + \rst + Parsing context consisting of a format string range being parsed and an + argument counter for automatic indexing. + + You can use one of the following type aliases for common character types: + + +-----------------------+-------------------------------------+ + | Type | Definition | + +=======================+=====================================+ + | format_parse_context | basic_format_parse_context | + +-----------------------+-------------------------------------+ + | wformat_parse_context | basic_format_parse_context | + +-----------------------+-------------------------------------+ + \endrst + */ +template +class basic_format_parse_context : private ErrorHandler { + private: + basic_string_view format_str_; + int next_arg_id_; + + public: + using char_type = Char; + using iterator = typename basic_string_view::iterator; + + explicit constexpr basic_format_parse_context( + basic_string_view format_str, ErrorHandler eh = {}, + int next_arg_id = 0) + : ErrorHandler(eh), format_str_(format_str), next_arg_id_(next_arg_id) {} + + /** + Returns an iterator to the beginning of the format string range being + parsed. + */ + constexpr iterator begin() const FMT_NOEXCEPT { return format_str_.begin(); } + + /** + Returns an iterator past the end of the format string range being parsed. + */ + constexpr iterator end() const FMT_NOEXCEPT { return format_str_.end(); } + + /** Advances the begin iterator to ``it``. */ + FMT_CONSTEXPR void advance_to(iterator it) { + format_str_.remove_prefix(detail::to_unsigned(it - begin())); + } + + /** + Reports an error if using the manual argument indexing; otherwise returns + the next argument index and switches to the automatic indexing. + */ + FMT_CONSTEXPR int next_arg_id() { + // Don't check if the argument id is valid to avoid overhead and because it + // will be checked during formatting anyway. + if (next_arg_id_ >= 0) return next_arg_id_++; + on_error("cannot switch from manual to automatic argument indexing"); + return 0; + } + + /** + Reports an error if using the automatic argument indexing; otherwise + switches to the manual indexing. + */ + FMT_CONSTEXPR void check_arg_id(int) { + if (next_arg_id_ > 0) + on_error("cannot switch from automatic to manual argument indexing"); + else + next_arg_id_ = -1; + } + + FMT_CONSTEXPR void check_arg_id(basic_string_view) {} + + FMT_CONSTEXPR void on_error(const char* message) { + ErrorHandler::on_error(message); + } + + constexpr ErrorHandler error_handler() const { return *this; } +}; + +using format_parse_context = basic_format_parse_context; +using wformat_parse_context = basic_format_parse_context; + +template class basic_format_arg; +template class basic_format_args; +template class dynamic_format_arg_store; + +// A formatter for objects of type T. +template +struct formatter { + // A deleted default constructor indicates a disabled formatter. + formatter() = delete; +}; + +// Specifies if T has an enabled formatter specialization. A type can be +// formattable even if it doesn't have a formatter e.g. via a conversion. +template +using has_formatter = + std::is_constructible>; + +// Checks whether T is a container with contiguous storage. +template struct is_contiguous : std::false_type {}; +template +struct is_contiguous> : std::true_type {}; + +namespace detail { + +// Extracts a reference to the container from back_insert_iterator. +template +inline Container& get_container(std::back_insert_iterator it) { + using bi_iterator = std::back_insert_iterator; + struct accessor : bi_iterator { + accessor(bi_iterator iter) : bi_iterator(iter) {} + using bi_iterator::container; + }; + return *accessor(it).container; +} + +/** + \rst + A contiguous memory buffer with an optional growing ability. It is an internal + class and shouldn't be used directly, only via `~fmt::basic_memory_buffer`. + \endrst + */ +template class buffer { + private: + T* ptr_; + size_t size_; + size_t capacity_; + + protected: + // Don't initialize ptr_ since it is not accessed to save a few cycles. + FMT_SUPPRESS_MSC_WARNING(26495) + buffer(size_t sz) FMT_NOEXCEPT : size_(sz), capacity_(sz) {} + + buffer(T* p = nullptr, size_t sz = 0, size_t cap = 0) FMT_NOEXCEPT + : ptr_(p), + size_(sz), + capacity_(cap) {} + + ~buffer() = default; + + /** Sets the buffer data and capacity. */ + void set(T* buf_data, size_t buf_capacity) FMT_NOEXCEPT { + ptr_ = buf_data; + capacity_ = buf_capacity; + } + + /** Increases the buffer capacity to hold at least *capacity* elements. */ + virtual void grow(size_t capacity) = 0; + + public: + using value_type = T; + using const_reference = const T&; + + buffer(const buffer&) = delete; + void operator=(const buffer&) = delete; + + T* begin() FMT_NOEXCEPT { return ptr_; } + T* end() FMT_NOEXCEPT { return ptr_ + size_; } + + const T* begin() const FMT_NOEXCEPT { return ptr_; } + const T* end() const FMT_NOEXCEPT { return ptr_ + size_; } + + /** Returns the size of this buffer. */ + size_t size() const FMT_NOEXCEPT { return size_; } + + /** Returns the capacity of this buffer. */ + size_t capacity() const FMT_NOEXCEPT { return capacity_; } + + /** Returns a pointer to the buffer data. */ + T* data() FMT_NOEXCEPT { return ptr_; } + + /** Returns a pointer to the buffer data. */ + const T* data() const FMT_NOEXCEPT { return ptr_; } + + /** Clears this buffer. */ + void clear() { size_ = 0; } + + // Tries resizing the buffer to contain *count* elements. If T is a POD type + // the new elements may not be initialized. + void try_resize(size_t count) { + try_reserve(count); + size_ = count <= capacity_ ? count : capacity_; + } + + // Tries increasing the buffer capacity to *new_capacity*. It can increase the + // capacity by a smaller amount than requested but guarantees there is space + // for at least one additional element either by increasing the capacity or by + // flushing the buffer if it is full. + void try_reserve(size_t new_capacity) { + if (new_capacity > capacity_) grow(new_capacity); + } + + void push_back(const T& value) { + try_reserve(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template void append(const U* begin, const U* end); + + template T& operator[](I index) { return ptr_[index]; } + template const T& operator[](I index) const { + return ptr_[index]; + } +}; + +struct buffer_traits { + explicit buffer_traits(size_t) {} + size_t count() const { return 0; } + size_t limit(size_t size) { return size; } +}; + +class fixed_buffer_traits { + private: + size_t count_ = 0; + size_t limit_; + + public: + explicit fixed_buffer_traits(size_t limit) : limit_(limit) {} + size_t count() const { return count_; } + size_t limit(size_t size) { + size_t n = limit_ > count_ ? limit_ - count_ : 0; + count_ += size; + return size < n ? size : n; + } +}; + +// A buffer that writes to an output iterator when flushed. +template +class iterator_buffer final : public Traits, public buffer { + private: + OutputIt out_; + enum { buffer_size = 256 }; + T data_[buffer_size]; + + protected: + void grow(size_t) final FMT_OVERRIDE { + if (this->size() == buffer_size) flush(); + } + void flush(); + + public: + explicit iterator_buffer(OutputIt out, size_t n = buffer_size) + : Traits(n), + buffer(data_, 0, buffer_size), + out_(out) {} + ~iterator_buffer() { flush(); } + + OutputIt out() { + flush(); + return out_; + } + size_t count() const { return Traits::count() + this->size(); } +}; + +template class iterator_buffer final : public buffer { + protected: + void grow(size_t) final FMT_OVERRIDE {} + + public: + explicit iterator_buffer(T* out, size_t = 0) : buffer(out, 0, ~size_t()) {} + + T* out() { return &*this->end(); } +}; + +// A buffer that writes to a container with the contiguous storage. +template +class iterator_buffer, + enable_if_t::value, + typename Container::value_type>> + final : public buffer { + private: + Container& container_; + + protected: + void grow(size_t capacity) final FMT_OVERRIDE { + container_.resize(capacity); + this->set(&container_[0], capacity); + } + + public: + explicit iterator_buffer(Container& c) + : buffer(c.size()), container_(c) {} + explicit iterator_buffer(std::back_insert_iterator out, size_t = 0) + : iterator_buffer(get_container(out)) {} + std::back_insert_iterator out() { + return std::back_inserter(container_); + } +}; + +// A buffer that counts the number of code units written discarding the output. +template class counting_buffer final : public buffer { + private: + enum { buffer_size = 256 }; + T data_[buffer_size]; + size_t count_ = 0; + + protected: + void grow(size_t) final FMT_OVERRIDE { + if (this->size() != buffer_size) return; + count_ += this->size(); + this->clear(); + } + + public: + counting_buffer() : buffer(data_, 0, buffer_size) {} + + size_t count() { return count_ + this->size(); } +}; + +// An output iterator that appends to the buffer. +// It is used to reduce symbol sizes for the common case. +template +class buffer_appender : public std::back_insert_iterator> { + using base = std::back_insert_iterator>; + + public: + explicit buffer_appender(buffer& buf) : base(buf) {} + buffer_appender(base it) : base(it) {} + + buffer_appender& operator++() { + base::operator++(); + return *this; + } + + buffer_appender operator++(int) { + buffer_appender tmp = *this; + ++*this; + return tmp; + } +}; + +// Maps an output iterator into a buffer. +template +iterator_buffer get_buffer(OutputIt); +template buffer& get_buffer(buffer_appender); + +template OutputIt get_buffer_init(OutputIt out) { + return out; +} +template buffer& get_buffer_init(buffer_appender out) { + return get_container(out); +} + +template +auto get_iterator(Buffer& buf) -> decltype(buf.out()) { + return buf.out(); +} +template buffer_appender get_iterator(buffer& buf) { + return buffer_appender(buf); +} + +template +struct fallback_formatter { + fallback_formatter() = delete; +}; + +// Specifies if T has an enabled fallback_formatter specialization. +template +using has_fallback_formatter = + std::is_constructible>; + +struct view {}; + +template struct named_arg : view { + const Char* name; + const T& value; + named_arg(const Char* n, const T& v) : name(n), value(v) {} +}; + +template struct named_arg_info { + const Char* name; + int id; +}; + +template +struct arg_data { + // args_[0].named_args points to named_args_ to avoid bloating format_args. + // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning. + T args_[1 + (NUM_ARGS != 0 ? NUM_ARGS : +1)]; + named_arg_info named_args_[NUM_NAMED_ARGS]; + + template + arg_data(const U&... init) : args_{T(named_args_, NUM_NAMED_ARGS), init...} {} + arg_data(const arg_data& other) = delete; + const T* args() const { return args_ + 1; } + named_arg_info* named_args() { return named_args_; } +}; + +template +struct arg_data { + // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning. + T args_[NUM_ARGS != 0 ? NUM_ARGS : +1]; + + template + FMT_INLINE arg_data(const U&... init) : args_{init...} {} + FMT_INLINE const T* args() const { return args_; } + FMT_INLINE std::nullptr_t named_args() { return nullptr; } +}; + +template +inline void init_named_args(named_arg_info*, int, int) {} + +template +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const T&, const Tail&... args) { + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const named_arg& arg, + const Tail&... args) { + named_args[named_arg_count++] = {arg.name, arg_count}; + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template +FMT_INLINE void init_named_args(std::nullptr_t, int, int, const Args&...) {} + +template struct is_named_arg : std::false_type {}; + +template +struct is_named_arg> : std::true_type {}; + +template constexpr size_t count() { return B ? 1 : 0; } +template constexpr size_t count() { + return (B1 ? 1 : 0) + count(); +} + +template constexpr size_t count_named_args() { + return count::value...>(); +} + +enum class type { + none_type, + // Integer types should go first, + int_type, + uint_type, + long_long_type, + ulong_long_type, + int128_type, + uint128_type, + bool_type, + char_type, + last_integer_type = char_type, + // followed by floating-point types. + float_type, + double_type, + long_double_type, + last_numeric_type = long_double_type, + cstring_type, + string_type, + pointer_type, + custom_type +}; + +// Maps core type T to the corresponding type enum constant. +template +struct type_constant : std::integral_constant {}; + +#define FMT_TYPE_CONSTANT(Type, constant) \ + template \ + struct type_constant \ + : std::integral_constant {} + +FMT_TYPE_CONSTANT(int, int_type); +FMT_TYPE_CONSTANT(unsigned, uint_type); +FMT_TYPE_CONSTANT(long long, long_long_type); +FMT_TYPE_CONSTANT(unsigned long long, ulong_long_type); +FMT_TYPE_CONSTANT(int128_t, int128_type); +FMT_TYPE_CONSTANT(uint128_t, uint128_type); +FMT_TYPE_CONSTANT(bool, bool_type); +FMT_TYPE_CONSTANT(Char, char_type); +FMT_TYPE_CONSTANT(float, float_type); +FMT_TYPE_CONSTANT(double, double_type); +FMT_TYPE_CONSTANT(long double, long_double_type); +FMT_TYPE_CONSTANT(const Char*, cstring_type); +FMT_TYPE_CONSTANT(basic_string_view, string_type); +FMT_TYPE_CONSTANT(const void*, pointer_type); + +constexpr bool is_integral_type(type t) { + return t > type::none_type && t <= type::last_integer_type; +} + +constexpr bool is_arithmetic_type(type t) { + return t > type::none_type && t <= type::last_numeric_type; +} + +template struct string_value { + const Char* data; + size_t size; +}; + +template struct named_arg_value { + const named_arg_info* data; + size_t size; +}; + +template struct custom_value { + using parse_context = typename Context::parse_context_type; + const void* value; + void (*format)(const void* arg, parse_context& parse_ctx, Context& ctx); +}; + +// A formatting argument value. +template class value { + public: + using char_type = typename Context::char_type; + + union { + int int_value; + unsigned uint_value; + long long long_long_value; + unsigned long long ulong_long_value; + int128_t int128_value; + uint128_t uint128_value; + bool bool_value; + char_type char_value; + float float_value; + double double_value; + long double long_double_value; + const void* pointer; + string_value string; + custom_value custom; + named_arg_value named_args; + }; + + constexpr FMT_INLINE value(int val = 0) : int_value(val) {} + constexpr FMT_INLINE value(unsigned val) : uint_value(val) {} + FMT_INLINE value(long long val) : long_long_value(val) {} + FMT_INLINE value(unsigned long long val) : ulong_long_value(val) {} + FMT_INLINE value(int128_t val) : int128_value(val) {} + FMT_INLINE value(uint128_t val) : uint128_value(val) {} + FMT_INLINE value(float val) : float_value(val) {} + FMT_INLINE value(double val) : double_value(val) {} + FMT_INLINE value(long double val) : long_double_value(val) {} + FMT_INLINE value(bool val) : bool_value(val) {} + FMT_INLINE value(char_type val) : char_value(val) {} + FMT_INLINE value(const char_type* val) { string.data = val; } + FMT_INLINE value(basic_string_view val) { + string.data = val.data(); + string.size = val.size(); + } + FMT_INLINE value(const void* val) : pointer(val) {} + FMT_INLINE value(const named_arg_info* args, size_t size) + : named_args{args, size} {} + + template FMT_INLINE value(const T& val) { + custom.value = &val; + // Get the formatter type through the context to allow different contexts + // have different extension points, e.g. `formatter` for `format` and + // `printf_formatter` for `printf`. + custom.format = format_custom_arg< + T, conditional_t::value, + typename Context::template formatter_type, + fallback_formatter>>; + } + + private: + // Formats an argument of a custom type, such as a user-defined class. + template + static void format_custom_arg(const void* arg, + typename Context::parse_context_type& parse_ctx, + Context& ctx) { + Formatter f; + parse_ctx.advance_to(f.parse(parse_ctx)); + ctx.advance_to(f.format(*static_cast(arg), ctx)); + } +}; + +template +FMT_CONSTEXPR basic_format_arg make_arg(const T& value); + +// To minimize the number of types we need to deal with, long is translated +// either to int or to long long depending on its size. +enum { long_short = sizeof(long) == sizeof(int) }; +using long_type = conditional_t; +using ulong_type = conditional_t; + +struct unformattable {}; + +// Maps formatting arguments to core types. +template struct arg_mapper { + using char_type = typename Context::char_type; + + FMT_CONSTEXPR int map(signed char val) { return val; } + FMT_CONSTEXPR unsigned map(unsigned char val) { return val; } + FMT_CONSTEXPR int map(short val) { return val; } + FMT_CONSTEXPR unsigned map(unsigned short val) { return val; } + FMT_CONSTEXPR int map(int val) { return val; } + FMT_CONSTEXPR unsigned map(unsigned val) { return val; } + FMT_CONSTEXPR long_type map(long val) { return val; } + FMT_CONSTEXPR ulong_type map(unsigned long val) { return val; } + FMT_CONSTEXPR long long map(long long val) { return val; } + FMT_CONSTEXPR unsigned long long map(unsigned long long val) { return val; } + FMT_CONSTEXPR int128_t map(int128_t val) { return val; } + FMT_CONSTEXPR uint128_t map(uint128_t val) { return val; } + FMT_CONSTEXPR bool map(bool val) { return val; } + + template ::value)> + FMT_CONSTEXPR char_type map(T val) { + static_assert( + std::is_same::value || std::is_same::value, + "mixing character types is disallowed"); + return val; + } + + FMT_CONSTEXPR float map(float val) { return val; } + FMT_CONSTEXPR double map(double val) { return val; } + FMT_CONSTEXPR long double map(long double val) { return val; } + + FMT_CONSTEXPR const char_type* map(char_type* val) { return val; } + FMT_CONSTEXPR const char_type* map(const char_type* val) { return val; } + template ::value)> + FMT_CONSTEXPR basic_string_view map(const T& val) { + static_assert(std::is_same>::value, + "mixing character types is disallowed"); + return to_string_view(val); + } + template , T>::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR basic_string_view map(const T& val) { + return basic_string_view(val); + } + template < + typename T, + FMT_ENABLE_IF( + std::is_constructible, T>::value && + !std::is_constructible, T>::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR basic_string_view map(const T& val) { + return std_string_view(val); + } + FMT_CONSTEXPR const char* map(const signed char* val) { + static_assert(std::is_same::value, "invalid string type"); + return reinterpret_cast(val); + } + FMT_CONSTEXPR const char* map(const unsigned char* val) { + static_assert(std::is_same::value, "invalid string type"); + return reinterpret_cast(val); + } + FMT_CONSTEXPR const char* map(signed char* val) { + const auto* const_val = val; + return map(const_val); + } + FMT_CONSTEXPR const char* map(unsigned char* val) { + const auto* const_val = val; + return map(const_val); + } + + FMT_CONSTEXPR const void* map(void* val) { return val; } + FMT_CONSTEXPR const void* map(const void* val) { return val; } + FMT_CONSTEXPR const void* map(std::nullptr_t val) { return val; } + template FMT_CONSTEXPR int map(const T*) { + // Formatting of arbitrary pointers is disallowed. If you want to output + // a pointer cast it to "void *" or "const void *". In particular, this + // forbids formatting of "[const] volatile char *" which is printed as bool + // by iostreams. + static_assert(!sizeof(T), "formatting of non-void pointers is disallowed"); + return 0; + } + + template ::value && + !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR auto map(const T& val) + -> decltype(std::declval().map( + static_cast::type>(val))) { + return map(static_cast::type>(val)); + } + template ::value && !is_char::value && + (has_formatter::value || + has_fallback_formatter::value))> + FMT_CONSTEXPR const T& map(const T& val) { + return val; + } + + template + FMT_CONSTEXPR auto map(const named_arg& val) + -> decltype(std::declval().map(val.value)) { + return map(val.value); + } + + unformattable map(...) { return {}; } +}; + +// A type constant after applying arg_mapper. +template +using mapped_type_constant = + type_constant().map(std::declval())), + typename Context::char_type>; + +enum { packed_arg_bits = 4 }; +// Maximum number of arguments with packed types. +enum { max_packed_args = 62 / packed_arg_bits }; +enum : unsigned long long { is_unpacked_bit = 1ULL << 63 }; +enum : unsigned long long { has_named_args_bit = 1ULL << 62 }; +} // namespace detail + +// A formatting argument. It is a trivially copyable/constructible type to +// allow storage in basic_memory_buffer. +template class basic_format_arg { + private: + detail::value value_; + detail::type type_; + + template + friend FMT_CONSTEXPR basic_format_arg detail::make_arg( + const T& value); + + template + friend FMT_CONSTEXPR auto visit_format_arg(Visitor&& vis, + const basic_format_arg& arg) + -> decltype(vis(0)); + + friend class basic_format_args; + friend class dynamic_format_arg_store; + + using char_type = typename Context::char_type; + + template + friend struct detail::arg_data; + + basic_format_arg(const detail::named_arg_info* args, size_t size) + : value_(args, size) {} + + public: + class handle { + public: + explicit handle(detail::custom_value custom) : custom_(custom) {} + + void format(typename Context::parse_context_type& parse_ctx, + Context& ctx) const { + custom_.format(custom_.value, parse_ctx, ctx); + } + + private: + detail::custom_value custom_; + }; + + constexpr basic_format_arg() : type_(detail::type::none_type) {} + + constexpr explicit operator bool() const FMT_NOEXCEPT { + return type_ != detail::type::none_type; + } + + detail::type type() const { return type_; } + + bool is_integral() const { return detail::is_integral_type(type_); } + bool is_arithmetic() const { return detail::is_arithmetic_type(type_); } +}; + +/** + \rst + Visits an argument dispatching to the appropriate visit method based on + the argument type. For example, if the argument type is ``double`` then + ``vis(value)`` will be called with the value of type ``double``. + \endrst + */ +template +FMT_CONSTEXPR_DECL FMT_INLINE auto visit_format_arg( + Visitor&& vis, const basic_format_arg& arg) -> decltype(vis(0)) { + using char_type = typename Context::char_type; + switch (arg.type_) { + case detail::type::none_type: + break; + case detail::type::int_type: + return vis(arg.value_.int_value); + case detail::type::uint_type: + return vis(arg.value_.uint_value); + case detail::type::long_long_type: + return vis(arg.value_.long_long_value); + case detail::type::ulong_long_type: + return vis(arg.value_.ulong_long_value); +#if FMT_USE_INT128 + case detail::type::int128_type: + return vis(arg.value_.int128_value); + case detail::type::uint128_type: + return vis(arg.value_.uint128_value); +#else + case detail::type::int128_type: + case detail::type::uint128_type: + break; +#endif + case detail::type::bool_type: + return vis(arg.value_.bool_value); + case detail::type::char_type: + return vis(arg.value_.char_value); + case detail::type::float_type: + return vis(arg.value_.float_value); + case detail::type::double_type: + return vis(arg.value_.double_value); + case detail::type::long_double_type: + return vis(arg.value_.long_double_value); + case detail::type::cstring_type: + return vis(arg.value_.string.data); + case detail::type::string_type: + return vis(basic_string_view(arg.value_.string.data, + arg.value_.string.size)); + case detail::type::pointer_type: + return vis(arg.value_.pointer); + case detail::type::custom_type: + return vis(typename basic_format_arg::handle(arg.value_.custom)); + } + return vis(monostate()); +} + +template struct formattable : std::false_type {}; + +namespace detail { + +// A workaround for gcc 4.8 to make void_t work in a SFINAE context. +template struct void_t_impl { using type = void; }; +template +using void_t = typename detail::void_t_impl::type; + +template +struct is_output_iterator : std::false_type {}; + +template +struct is_output_iterator< + It, T, + void_t::iterator_category, + decltype(*std::declval() = std::declval())>> + : std::true_type {}; + +template +struct is_back_insert_iterator : std::false_type {}; +template +struct is_back_insert_iterator> + : std::true_type {}; + +template +struct is_contiguous_back_insert_iterator : std::false_type {}; +template +struct is_contiguous_back_insert_iterator> + : is_contiguous {}; +template +struct is_contiguous_back_insert_iterator> + : std::true_type {}; + +// A type-erased reference to an std::locale to avoid heavy include. +class locale_ref { + private: + const void* locale_; // A type-erased pointer to std::locale. + + public: + locale_ref() : locale_(nullptr) {} + template explicit locale_ref(const Locale& loc); + + explicit operator bool() const FMT_NOEXCEPT { return locale_ != nullptr; } + + template Locale get() const; +}; + +template constexpr unsigned long long encode_types() { return 0; } + +template +constexpr unsigned long long encode_types() { + return static_cast(mapped_type_constant::value) | + (encode_types() << packed_arg_bits); +} + +template +FMT_CONSTEXPR basic_format_arg make_arg(const T& value) { + basic_format_arg arg; + arg.type_ = mapped_type_constant::value; + arg.value_ = arg_mapper().map(value); + return arg; +} + +template int check(unformattable) { + static_assert( + formattable(), + "Cannot format an argument. To make type T formattable provide a " + "formatter specialization: https://fmt.dev/latest/api.html#udt"); + return 0; +} +template inline const U& check(const U& val) { + return val; +} + +// The type template parameter is there to avoid an ODR violation when using +// a fallback formatter in one translation unit and an implicit conversion in +// another (not recommended). +template +inline value make_arg(const T& val) { + return check(arg_mapper().map(val)); +} + +template +inline basic_format_arg make_arg(const T& value) { + return make_arg(value); +} + +template struct is_reference_wrapper : std::false_type {}; +template +struct is_reference_wrapper> : std::true_type {}; + +template const T& unwrap(const T& v) { return v; } +template const T& unwrap(const std::reference_wrapper& v) { + return static_cast(v); +} + +class dynamic_arg_list { + // Workaround for clang's -Wweak-vtables. Unlike for regular classes, for + // templates it doesn't complain about inability to deduce single translation + // unit for placing vtable. So storage_node_base is made a fake template. + template struct node { + virtual ~node() = default; + std::unique_ptr> next; + }; + + template struct typed_node : node<> { + T value; + + template + FMT_CONSTEXPR typed_node(const Arg& arg) : value(arg) {} + + template + FMT_CONSTEXPR typed_node(const basic_string_view& arg) + : value(arg.data(), arg.size()) {} + }; + + std::unique_ptr> head_; + + public: + template const T& push(const Arg& arg) { + auto new_node = std::unique_ptr>(new typed_node(arg)); + auto& value = new_node->value; + new_node->next = std::move(head_); + head_ = std::move(new_node); + return value; + } +}; +} // namespace detail + +// Formatting context. +template class basic_format_context { + public: + /** The character type for the output. */ + using char_type = Char; + + private: + OutputIt out_; + basic_format_args args_; + detail::locale_ref loc_; + + public: + using iterator = OutputIt; + using format_arg = basic_format_arg; + using parse_context_type = basic_format_parse_context; + template using formatter_type = formatter; + + basic_format_context(const basic_format_context&) = delete; + void operator=(const basic_format_context&) = delete; + /** + Constructs a ``basic_format_context`` object. References to the arguments are + stored in the object so make sure they have appropriate lifetimes. + */ + basic_format_context(OutputIt out, + basic_format_args ctx_args, + detail::locale_ref loc = detail::locale_ref()) + : out_(out), args_(ctx_args), loc_(loc) {} + + format_arg arg(int id) const { return args_.get(id); } + format_arg arg(basic_string_view name) { return args_.get(name); } + int arg_id(basic_string_view name) { return args_.get_id(name); } + const basic_format_args& args() const { return args_; } + + detail::error_handler error_handler() { return {}; } + void on_error(const char* message) { error_handler().on_error(message); } + + // Returns an iterator to the beginning of the output range. + iterator out() { return out_; } + + // Advances the begin iterator to ``it``. + void advance_to(iterator it) { + if (!detail::is_back_insert_iterator()) out_ = it; + } + + detail::locale_ref locale() { return loc_; } +}; + +template +using buffer_context = + basic_format_context, Char>; +using format_context = buffer_context; +using wformat_context = buffer_context; + +// Workaround an alias issue: https://stackoverflow.com/q/62767544/471164. +#define FMT_BUFFER_CONTEXT(Char) \ + basic_format_context, Char> + +/** + \rst + An array of references to arguments. It can be implicitly converted into + `~fmt::basic_format_args` for passing into type-erased formatting functions + such as `~fmt::vformat`. + \endrst + */ +template +class format_arg_store +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + // Workaround a GCC template argument substitution bug. + : public basic_format_args +#endif +{ + private: + static const size_t num_args = sizeof...(Args); + static const size_t num_named_args = detail::count_named_args(); + static const bool is_packed = num_args <= detail::max_packed_args; + + using value_type = conditional_t, + basic_format_arg>; + + detail::arg_data + data_; + + friend class basic_format_args; + + static constexpr unsigned long long desc = + (is_packed ? detail::encode_types() + : detail::is_unpacked_bit | num_args) | + (num_named_args != 0 + ? static_cast(detail::has_named_args_bit) + : 0); + + public: + format_arg_store(const Args&... args) + : +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + basic_format_args(*this), +#endif + data_{detail::make_arg< + is_packed, Context, + detail::mapped_type_constant::value>(args)...} { + detail::init_named_args(data_.named_args(), 0, 0, args...); + } +}; + +/** + \rst + Constructs a `~fmt::format_arg_store` object that contains references to + arguments and can be implicitly converted to `~fmt::format_args`. `Context` + can be omitted in which case it defaults to `~fmt::context`. + See `~fmt::arg` for lifetime considerations. + \endrst + */ +template +inline format_arg_store make_format_args( + const Args&... args) { + return {args...}; +} + +/** + \rst + Constructs a `~fmt::format_arg_store` object that contains references + to arguments and can be implicitly converted to `~fmt::format_args`. + If ``format_str`` is a compile-time string then `make_args_checked` checks + its validity at compile time. + \endrst + */ +template > +inline auto make_args_checked(const S& format_str, + const remove_reference_t&... args) + -> format_arg_store, remove_reference_t...> { + static_assert( + detail::count<( + std::is_base_of>::value && + std::is_reference::value)...>() == 0, + "passing views as lvalues is disallowed"); + detail::check_format_string(format_str); + return {args...}; +} + +/** + \rst + Returns a named argument to be used in a formatting function. It should only + be used in a call to a formatting function. + + **Example**:: + + fmt::print("Elapsed time: {s:.2f} seconds", fmt::arg("s", 1.23)); + \endrst + */ +template +inline detail::named_arg arg(const Char* name, const T& arg) { + static_assert(!detail::is_named_arg(), "nested named arguments"); + return {name, arg}; +} + +/** + \rst + A dynamic version of `fmt::format_arg_store`. + It's equipped with a storage to potentially temporary objects which lifetimes + could be shorter than the format arguments object. + + It can be implicitly converted into `~fmt::basic_format_args` for passing + into type-erased formatting functions such as `~fmt::vformat`. + \endrst + */ +template +class dynamic_format_arg_store +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + // Workaround a GCC template argument substitution bug. + : public basic_format_args +#endif +{ + private: + using char_type = typename Context::char_type; + + template struct need_copy { + static constexpr detail::type mapped_type = + detail::mapped_type_constant::value; + + enum { + value = !(detail::is_reference_wrapper::value || + std::is_same>::value || + std::is_same>::value || + (mapped_type != detail::type::cstring_type && + mapped_type != detail::type::string_type && + mapped_type != detail::type::custom_type)) + }; + }; + + template + using stored_type = conditional_t::value, + std::basic_string, T>; + + // Storage of basic_format_arg must be contiguous. + std::vector> data_; + std::vector> named_info_; + + // Storage of arguments not fitting into basic_format_arg must grow + // without relocation because items in data_ refer to it. + detail::dynamic_arg_list dynamic_args_; + + friend class basic_format_args; + + unsigned long long get_types() const { + return detail::is_unpacked_bit | data_.size() | + (named_info_.empty() + ? 0ULL + : static_cast(detail::has_named_args_bit)); + } + + const basic_format_arg* data() const { + return named_info_.empty() ? data_.data() : data_.data() + 1; + } + + template void emplace_arg(const T& arg) { + data_.emplace_back(detail::make_arg(arg)); + } + + template + void emplace_arg(const detail::named_arg& arg) { + if (named_info_.empty()) { + constexpr const detail::named_arg_info* zero_ptr{nullptr}; + data_.insert(data_.begin(), {zero_ptr, 0}); + } + data_.emplace_back(detail::make_arg(detail::unwrap(arg.value))); + auto pop_one = [](std::vector>* data) { + data->pop_back(); + }; + std::unique_ptr>, decltype(pop_one)> + guard{&data_, pop_one}; + named_info_.push_back({arg.name, static_cast(data_.size() - 2u)}); + data_[0].value_.named_args = {named_info_.data(), named_info_.size()}; + guard.release(); + } + + public: + /** + \rst + Adds an argument into the dynamic store for later passing to a formatting + function. + + Note that custom types and string types (but not string views) are copied + into the store dynamically allocating memory if necessary. + + **Example**:: + + fmt::dynamic_format_arg_store store; + store.push_back(42); + store.push_back("abc"); + store.push_back(1.5f); + std::string result = fmt::vformat("{} and {} and {}", store); + \endrst + */ + template void push_back(const T& arg) { + if (detail::const_check(need_copy::value)) + emplace_arg(dynamic_args_.push>(arg)); + else + emplace_arg(detail::unwrap(arg)); + } + + /** + \rst + Adds a reference to the argument into the dynamic store for later passing to + a formatting function. Supports named arguments wrapped in + ``std::reference_wrapper`` via ``std::ref()``/``std::cref()``. + + **Example**:: + + fmt::dynamic_format_arg_store store; + char str[] = "1234567890"; + store.push_back(std::cref(str)); + int a1_val{42}; + auto a1 = fmt::arg("a1_", a1_val); + store.push_back(std::cref(a1)); + + // Changing str affects the output but only for string and custom types. + str[0] = 'X'; + + std::string result = fmt::vformat("{} and {a1_}"); + assert(result == "X234567890 and 42"); + \endrst + */ + template void push_back(std::reference_wrapper arg) { + static_assert( + detail::is_named_arg::type>::value || + need_copy::value, + "objects of built-in types and string views are always copied"); + emplace_arg(arg.get()); + } + + /** + Adds named argument into the dynamic store for later passing to a formatting + function. ``std::reference_wrapper`` is supported to avoid copying of the + argument. + */ + template + void push_back(const detail::named_arg& arg) { + const char_type* arg_name = + dynamic_args_.push>(arg.name).c_str(); + if (detail::const_check(need_copy::value)) { + emplace_arg( + fmt::arg(arg_name, dynamic_args_.push>(arg.value))); + } else { + emplace_arg(fmt::arg(arg_name, arg.value)); + } + } + + /** Erase all elements from the store */ + void clear() { + data_.clear(); + named_info_.clear(); + dynamic_args_ = detail::dynamic_arg_list(); + } + + /** + \rst + Reserves space to store at least *new_cap* arguments including + *new_cap_named* named arguments. + \endrst + */ + void reserve(size_t new_cap, size_t new_cap_named) { + FMT_ASSERT(new_cap >= new_cap_named, + "Set of arguments includes set of named arguments"); + data_.reserve(new_cap); + named_info_.reserve(new_cap_named); + } +}; + +/** + \rst + A view of a collection of formatting arguments. To avoid lifetime issues it + should only be used as a parameter type in type-erased functions such as + ``vformat``:: + + void vlog(string_view format_str, format_args args); // OK + format_args args = make_format_args(42); // Error: dangling reference + \endrst + */ +template class basic_format_args { + public: + using size_type = int; + using format_arg = basic_format_arg; + + private: + // A descriptor that contains information about formatting arguments. + // If the number of arguments is less or equal to max_packed_args then + // argument types are passed in the descriptor. This reduces binary code size + // per formatting function call. + unsigned long long desc_; + union { + // If is_packed() returns true then argument values are stored in values_; + // otherwise they are stored in args_. This is done to improve cache + // locality and reduce compiled code size since storing larger objects + // may require more code (at least on x86-64) even if the same amount of + // data is actually copied to stack. It saves ~10% on the bloat test. + const detail::value* values_; + const format_arg* args_; + }; + + bool is_packed() const { return (desc_ & detail::is_unpacked_bit) == 0; } + bool has_named_args() const { + return (desc_ & detail::has_named_args_bit) != 0; + } + + detail::type type(int index) const { + int shift = index * detail::packed_arg_bits; + unsigned int mask = (1 << detail::packed_arg_bits) - 1; + return static_cast((desc_ >> shift) & mask); + } + + basic_format_args(unsigned long long desc, + const detail::value* values) + : desc_(desc), values_(values) {} + basic_format_args(unsigned long long desc, const format_arg* args) + : desc_(desc), args_(args) {} + + public: + basic_format_args() : desc_(0) {} + + /** + \rst + Constructs a `basic_format_args` object from `~fmt::format_arg_store`. + \endrst + */ + template + FMT_INLINE basic_format_args(const format_arg_store& store) + : basic_format_args(store.desc, store.data_.args()) {} + + /** + \rst + Constructs a `basic_format_args` object from + `~fmt::dynamic_format_arg_store`. + \endrst + */ + FMT_INLINE basic_format_args(const dynamic_format_arg_store& store) + : basic_format_args(store.get_types(), store.data()) {} + + /** + \rst + Constructs a `basic_format_args` object from a dynamic set of arguments. + \endrst + */ + basic_format_args(const format_arg* args, int count) + : basic_format_args(detail::is_unpacked_bit | detail::to_unsigned(count), + args) {} + + /** Returns the argument with the specified id. */ + format_arg get(int id) const { + format_arg arg; + if (!is_packed()) { + if (id < max_size()) arg = args_[id]; + return arg; + } + if (id >= detail::max_packed_args) return arg; + arg.type_ = type(id); + if (arg.type_ == detail::type::none_type) return arg; + arg.value_ = values_[id]; + return arg; + } + + template format_arg get(basic_string_view name) const { + int id = get_id(name); + return id >= 0 ? get(id) : format_arg(); + } + + template int get_id(basic_string_view name) const { + if (!has_named_args()) return -1; + const auto& named_args = + (is_packed() ? values_[-1] : args_[-1].value_).named_args; + for (size_t i = 0; i < named_args.size; ++i) { + if (named_args.data[i].name == name) return named_args.data[i].id; + } + return -1; + } + + int max_size() const { + unsigned long long max_packed = detail::max_packed_args; + return static_cast(is_packed() ? max_packed + : desc_ & ~detail::is_unpacked_bit); + } +}; + +#ifdef FMT_ARM_ABI_COMPATIBILITY +/** An alias to ``basic_format_args``. */ +// Separate types would result in shorter symbols but break ABI compatibility +// between clang and gcc on ARM (#1919). +using format_args = basic_format_args; +using wformat_args = basic_format_args; +#else +// DEPRECATED! These are kept for ABI compatibility. +// It is a separate type rather than an alias to make symbols readable. +struct format_args : basic_format_args { + template + FMT_INLINE format_args(const Args&... args) : basic_format_args(args...) {} +}; +struct wformat_args : basic_format_args { + using basic_format_args::basic_format_args; +}; +#endif + +namespace detail { + +template ::value)> +std::basic_string vformat( + basic_string_view format_str, + basic_format_args>> args); + +FMT_API std::string vformat(string_view format_str, format_args args); + +template +void vformat_to( + buffer& buf, basic_string_view format_str, + basic_format_args)> args, + detail::locale_ref loc = {}); + +template ::value)> +inline void vprint_mojibake(std::FILE*, basic_string_view, const Args&) {} + +FMT_API void vprint_mojibake(std::FILE*, string_view, format_args); +#ifndef _WIN32 +inline void vprint_mojibake(std::FILE*, string_view, format_args) {} +#endif +} // namespace detail + +/** Formats a string and writes the output to ``out``. */ +// GCC 8 and earlier cannot handle std::back_insert_iterator with +// vformat_to(...) overload, so SFINAE on iterator type instead. +template , + bool enable = detail::is_output_iterator::value> +auto vformat_to(OutputIt out, const S& format_str, + basic_format_args>> args) + -> typename std::enable_if::type { + decltype(detail::get_buffer(out)) buf(detail::get_buffer_init(out)); + detail::vformat_to(buf, to_string_view(format_str), args); + return detail::get_iterator(buf); +} + +/** + \rst + Formats arguments, writes the result to the output iterator ``out`` and returns + the iterator past the end of the output range. + + **Example**:: + + std::vector out; + fmt::format_to(std::back_inserter(out), "{}", 42); + \endrst + */ +// We cannot use FMT_ENABLE_IF because of a bug in gcc 8.3. +template >::value> +inline auto format_to(OutputIt out, const S& format_str, Args&&... args) -> + typename std::enable_if::type { + const auto& vargs = fmt::make_args_checked(format_str, args...); + return vformat_to(out, to_string_view(format_str), vargs); +} + +template struct format_to_n_result { + /** Iterator past the end of the output range. */ + OutputIt out; + /** Total (not truncated) output size. */ + size_t size; +}; + +template ::value)> +inline format_to_n_result vformat_to_n( + OutputIt out, size_t n, basic_string_view format_str, + basic_format_args>> args) { + detail::iterator_buffer buf(out, + n); + detail::vformat_to(buf, format_str, args); + return {buf.out(), buf.count()}; +} + +/** + \rst + Formats arguments, writes up to ``n`` characters of the result to the output + iterator ``out`` and returns the total output size and the iterator past the + end of the output range. + \endrst + */ +template >::value> +inline auto format_to_n(OutputIt out, size_t n, const S& format_str, + const Args&... args) -> + typename std::enable_if>::type { + const auto& vargs = fmt::make_args_checked(format_str, args...); + return vformat_to_n(out, n, to_string_view(format_str), vargs); +} + +/** + Returns the number of characters in the output of + ``format(format_str, args...)``. + */ +template +inline size_t formatted_size(string_view format_str, Args&&... args) { + const auto& vargs = fmt::make_args_checked(format_str, args...); + detail::counting_buffer<> buf; + detail::vformat_to(buf, format_str, vargs); + return buf.count(); +} + +template > +FMT_INLINE std::basic_string vformat( + const S& format_str, + basic_format_args>> args) { + return detail::vformat(to_string_view(format_str), args); +} + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + #include + std::string message = fmt::format("The answer is {}", 42); + \endrst +*/ +// Pass char_t as a default template parameter instead of using +// std::basic_string> to reduce the symbol size. +template > +FMT_INLINE std::basic_string format(const S& format_str, Args&&... args) { + const auto& vargs = fmt::make_args_checked(format_str, args...); + return detail::vformat(to_string_view(format_str), vargs); +} + +FMT_API void vprint(string_view, format_args); +FMT_API void vprint(std::FILE*, string_view, format_args); + +/** + \rst + Formats ``args`` according to specifications in ``format_str`` and writes the + output to the file ``f``. Strings are assumed to be Unicode-encoded unless the + ``FMT_UNICODE`` macro is set to 0. + + **Example**:: + + fmt::print(stderr, "Don't {}!", "panic"); + \endrst + */ +template > +inline void print(std::FILE* f, const S& format_str, Args&&... args) { + const auto& vargs = fmt::make_args_checked(format_str, args...); + return detail::is_unicode() + ? vprint(f, to_string_view(format_str), vargs) + : detail::vprint_mojibake(f, to_string_view(format_str), vargs); +} + +/** + \rst + Formats ``args`` according to specifications in ``format_str`` and writes + the output to ``stdout``. Strings are assumed to be Unicode-encoded unless + the ``FMT_UNICODE`` macro is set to 0. + + **Example**:: + + fmt::print("Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +template > +inline void print(const S& format_str, Args&&... args) { + const auto& vargs = fmt::make_args_checked(format_str, args...); + return detail::is_unicode() + ? vprint(to_string_view(format_str), vargs) + : detail::vprint_mojibake(stdout, to_string_view(format_str), + vargs); +} +FMT_END_NAMESPACE + +#endif // FMT_CORE_H_ diff --git a/src/3rdparty/fmt/format-inl.h b/src/3rdparty/fmt/format-inl.h new file mode 100644 index 0000000000..6cd9db93c4 --- /dev/null +++ b/src/3rdparty/fmt/format-inl.h @@ -0,0 +1,2801 @@ +// Formatting library for C++ - implementation +// +// Copyright (c) 2012 - 2016, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_FORMAT_INL_H_ +#define FMT_FORMAT_INL_H_ + +/* Do not include cassert as that breaks our own asserts. */ +#include +#include +#include +#include +#include // std::memmove +#include +#include + +#ifndef FMT_STATIC_THOUSANDS_SEPARATOR +# include +#endif + +#ifdef _WIN32 +# include // _isatty +#endif + +#include "format.h" + +// Dummy implementations of strerror_r and strerror_s called if corresponding +// system functions are not available. +inline fmt::detail::null<> strerror_r(int, char*, ...) { return {}; } +inline fmt::detail::null<> strerror_s(char*, size_t, ...) { return {}; } + +FMT_BEGIN_NAMESPACE +namespace detail { + +FMT_FUNC void assert_fail(const char* file, int line, const char* message) { + // Use unchecked std::fprintf to avoid triggering another assertion when + // writing to stderr fails + std::fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message); + // Chosen instead of std::abort to satisfy Clang in CUDA mode during device + // code pass. + std::terminate(); +} + +#ifndef _MSC_VER +# define FMT_SNPRINTF snprintf +#else // _MSC_VER +inline int fmt_snprintf(char* buffer, size_t size, const char* format, ...) { + va_list args; + va_start(args, format); + int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); + va_end(args); + return result; +} +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +// A portable thread-safe version of strerror. +// Sets buffer to point to a string describing the error code. +// This can be either a pointer to a string stored in buffer, +// or a pointer to some static immutable string. +// Returns one of the following values: +// 0 - success +// ERANGE - buffer is not large enough to store the error message +// other - failure +// Buffer should be at least of size 1. +inline int safe_strerror(int error_code, char*& buffer, + size_t buffer_size) FMT_NOEXCEPT { + FMT_ASSERT(buffer != nullptr && buffer_size != 0, "invalid buffer"); + + class dispatcher { + private: + int error_code_; + char*& buffer_; + size_t buffer_size_; + + // A noop assignment operator to avoid bogus warnings. + void operator=(const dispatcher&) {} + + // Handle the result of XSI-compliant version of strerror_r. + int handle(int result) { + // glibc versions before 2.13 return result in errno. + return result == -1 ? errno : result; + } + + // Handle the result of GNU-specific version of strerror_r. + FMT_MAYBE_UNUSED + int handle(char* message) { + // If the buffer is full then the message is probably truncated. + if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) + return ERANGE; + buffer_ = message; + return 0; + } + + // Handle the case when strerror_r is not available. + FMT_MAYBE_UNUSED + int handle(detail::null<>) { + return fallback(strerror_s(buffer_, buffer_size_, error_code_)); + } + + // Fallback to strerror_s when strerror_r is not available. + FMT_MAYBE_UNUSED + int fallback(int result) { + // If the buffer is full then the message is probably truncated. + return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? ERANGE + : result; + } + +#if !FMT_MSC_VER + // Fallback to strerror if strerror_r and strerror_s are not available. + int fallback(detail::null<>) { + errno = 0; + buffer_ = strerror(error_code_); + return errno; + } +#endif + + public: + dispatcher(int err_code, char*& buf, size_t buf_size) + : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} + + int run() { return handle(strerror_r(error_code_, buffer_, buffer_size_)); } + }; + return dispatcher(error_code, buffer, buffer_size).run(); +} + +FMT_FUNC void format_error_code(detail::buffer& out, int error_code, + string_view message) FMT_NOEXCEPT { + // Report error code making sure that the output fits into + // inline_buffer_size to avoid dynamic memory allocation and potential + // bad_alloc. + out.try_resize(0); + static const char SEP[] = ": "; + static const char ERROR_STR[] = "error "; + // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. + size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; + auto abs_value = static_cast>(error_code); + if (detail::is_negative(error_code)) { + abs_value = 0 - abs_value; + ++error_code_size; + } + error_code_size += detail::to_unsigned(detail::count_digits(abs_value)); + auto it = buffer_appender(out); + if (message.size() <= inline_buffer_size - error_code_size) + format_to(it, "{}{}", message, SEP); + format_to(it, "{}{}", ERROR_STR, error_code); + assert(out.size() <= inline_buffer_size); +} + +FMT_FUNC void report_error(format_func func, int error_code, + string_view message) FMT_NOEXCEPT { + memory_buffer full_message; + func(full_message, error_code, message); + // Don't use fwrite_fully because the latter may throw. + (void)std::fwrite(full_message.data(), full_message.size(), 1, stderr); + std::fputc('\n', stderr); +} + +// A wrapper around fwrite that throws on error. +inline void fwrite_fully(const void* ptr, size_t size, size_t count, + FILE* stream) { + size_t written = std::fwrite(ptr, size, count, stream); + if (written < count) FMT_THROW(system_error(errno, "cannot write to file")); +} +} // namespace detail + +#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR) +namespace detail { + +template +locale_ref::locale_ref(const Locale& loc) : locale_(&loc) { + static_assert(std::is_same::value, ""); +} + +template Locale locale_ref::get() const { + static_assert(std::is_same::value, ""); + return locale_ ? *static_cast(locale_) : std::locale(); +} + +template FMT_FUNC std::string grouping_impl(locale_ref loc) { + return std::use_facet>(loc.get()).grouping(); +} +template FMT_FUNC Char thousands_sep_impl(locale_ref loc) { + return std::use_facet>(loc.get()) + .thousands_sep(); +} +template FMT_FUNC Char decimal_point_impl(locale_ref loc) { + return std::use_facet>(loc.get()) + .decimal_point(); +} +} // namespace detail +#else +template +FMT_FUNC std::string detail::grouping_impl(locale_ref) { + return "\03"; +} +template FMT_FUNC Char detail::thousands_sep_impl(locale_ref) { + return FMT_STATIC_THOUSANDS_SEPARATOR; +} +template FMT_FUNC Char detail::decimal_point_impl(locale_ref) { + return '.'; +} +#endif + +FMT_API FMT_FUNC format_error::~format_error() FMT_NOEXCEPT = default; +FMT_API FMT_FUNC system_error::~system_error() FMT_NOEXCEPT = default; + +FMT_FUNC void system_error::init(int err_code, string_view format_str, + format_args args) { + error_code_ = err_code; + memory_buffer buffer; + format_system_error(buffer, err_code, vformat(format_str, args)); + std::runtime_error& base = *this; + base = std::runtime_error(to_string(buffer)); +} + +namespace detail { + +template <> FMT_FUNC int count_digits<4>(detail::fallback_uintptr n) { + // fallback_uintptr is always stored in little endian. + int i = static_cast(sizeof(void*)) - 1; + while (i > 0 && n.value[i] == 0) --i; + auto char_digits = std::numeric_limits::digits / 4; + return i >= 0 ? i * char_digits + count_digits<4, unsigned>(n.value[i]) : 1; +} + +template +const typename basic_data::digit_pair basic_data::digits[] = { + {'0', '0'}, {'0', '1'}, {'0', '2'}, {'0', '3'}, {'0', '4'}, {'0', '5'}, + {'0', '6'}, {'0', '7'}, {'0', '8'}, {'0', '9'}, {'1', '0'}, {'1', '1'}, + {'1', '2'}, {'1', '3'}, {'1', '4'}, {'1', '5'}, {'1', '6'}, {'1', '7'}, + {'1', '8'}, {'1', '9'}, {'2', '0'}, {'2', '1'}, {'2', '2'}, {'2', '3'}, + {'2', '4'}, {'2', '5'}, {'2', '6'}, {'2', '7'}, {'2', '8'}, {'2', '9'}, + {'3', '0'}, {'3', '1'}, {'3', '2'}, {'3', '3'}, {'3', '4'}, {'3', '5'}, + {'3', '6'}, {'3', '7'}, {'3', '8'}, {'3', '9'}, {'4', '0'}, {'4', '1'}, + {'4', '2'}, {'4', '3'}, {'4', '4'}, {'4', '5'}, {'4', '6'}, {'4', '7'}, + {'4', '8'}, {'4', '9'}, {'5', '0'}, {'5', '1'}, {'5', '2'}, {'5', '3'}, + {'5', '4'}, {'5', '5'}, {'5', '6'}, {'5', '7'}, {'5', '8'}, {'5', '9'}, + {'6', '0'}, {'6', '1'}, {'6', '2'}, {'6', '3'}, {'6', '4'}, {'6', '5'}, + {'6', '6'}, {'6', '7'}, {'6', '8'}, {'6', '9'}, {'7', '0'}, {'7', '1'}, + {'7', '2'}, {'7', '3'}, {'7', '4'}, {'7', '5'}, {'7', '6'}, {'7', '7'}, + {'7', '8'}, {'7', '9'}, {'8', '0'}, {'8', '1'}, {'8', '2'}, {'8', '3'}, + {'8', '4'}, {'8', '5'}, {'8', '6'}, {'8', '7'}, {'8', '8'}, {'8', '9'}, + {'9', '0'}, {'9', '1'}, {'9', '2'}, {'9', '3'}, {'9', '4'}, {'9', '5'}, + {'9', '6'}, {'9', '7'}, {'9', '8'}, {'9', '9'}}; + +template +const char basic_data::hex_digits[] = "0123456789abcdef"; + +#define FMT_POWERS_OF_10(factor) \ + factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \ + (factor)*1000000, (factor)*10000000, (factor)*100000000, \ + (factor)*1000000000 + +template +const uint64_t basic_data::powers_of_10_64[] = { + 1, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + +template +const uint32_t basic_data::zero_or_powers_of_10_32[] = {0, + FMT_POWERS_OF_10(1)}; +template +const uint64_t basic_data::zero_or_powers_of_10_64[] = { + 0, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + +template +const uint32_t basic_data::zero_or_powers_of_10_32_new[] = { + 0, 0, FMT_POWERS_OF_10(1)}; + +template +const uint64_t basic_data::zero_or_powers_of_10_64_new[] = { + 0, 0, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + +// Normalized 64-bit significands of pow(10, k), for k = -348, -340, ..., 340. +// These are generated by support/compute-powers.py. +template +const uint64_t basic_data::grisu_pow10_significands[] = { + 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76, + 0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df, + 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c, + 0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, + 0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57, + 0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7, + 0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e, + 0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, + 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126, + 0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053, + 0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f, + 0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b, + 0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06, + 0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb, + 0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000, + 0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984, + 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068, + 0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, + 0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758, + 0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85, + 0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d, + 0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25, + 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2, + 0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a, + 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410, + 0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129, + 0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85, + 0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, + 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b, +}; + +// Binary exponents of pow(10, k), for k = -348, -340, ..., 340, corresponding +// to significands above. +template +const int16_t basic_data::grisu_pow10_exponents[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, + -927, -901, -874, -847, -821, -794, -768, -741, -715, -688, -661, + -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369, + -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77, + -50, -24, 3, 30, 56, 83, 109, 136, 162, 189, 216, + 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, + 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800, + 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066}; + +template +const divtest_table_entry basic_data::divtest_table_for_pow5_32[] = + {{0x00000001, 0xffffffff}, {0xcccccccd, 0x33333333}, + {0xc28f5c29, 0x0a3d70a3}, {0x26e978d5, 0x020c49ba}, + {0x3afb7e91, 0x0068db8b}, {0x0bcbe61d, 0x0014f8b5}, + {0x68c26139, 0x000431bd}, {0xae8d46a5, 0x0000d6bf}, + {0x22e90e21, 0x00002af3}, {0x3a2e9c6d, 0x00000897}, + {0x3ed61f49, 0x000001b7}}; + +template +const divtest_table_entry basic_data::divtest_table_for_pow5_64[] = + {{0x0000000000000001, 0xffffffffffffffff}, + {0xcccccccccccccccd, 0x3333333333333333}, + {0x8f5c28f5c28f5c29, 0x0a3d70a3d70a3d70}, + {0x1cac083126e978d5, 0x020c49ba5e353f7c}, + {0xd288ce703afb7e91, 0x0068db8bac710cb2}, + {0x5d4e8fb00bcbe61d, 0x0014f8b588e368f0}, + {0x790fb65668c26139, 0x000431bde82d7b63}, + {0xe5032477ae8d46a5, 0x0000d6bf94d5e57a}, + {0xc767074b22e90e21, 0x00002af31dc46118}, + {0x8e47ce423a2e9c6d, 0x0000089705f4136b}, + {0x4fa7f60d3ed61f49, 0x000001b7cdfd9d7b}, + {0x0fee64690c913975, 0x00000057f5ff85e5}, + {0x3662e0e1cf503eb1, 0x000000119799812d}, + {0xa47a2cf9f6433fbd, 0x0000000384b84d09}, + {0x54186f653140a659, 0x00000000b424dc35}, + {0x7738164770402145, 0x0000000024075f3d}, + {0xe4a4d1417cd9a041, 0x000000000734aca5}, + {0xc75429d9e5c5200d, 0x000000000170ef54}, + {0xc1773b91fac10669, 0x000000000049c977}, + {0x26b172506559ce15, 0x00000000000ec1e4}, + {0xd489e3a9addec2d1, 0x000000000002f394}, + {0x90e860bb892c8d5d, 0x000000000000971d}, + {0x502e79bf1b6f4f79, 0x0000000000001e39}, + {0xdcd618596be30fe5, 0x000000000000060b}}; + +template +const uint64_t basic_data::dragonbox_pow10_significands_64[] = { + 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f, + 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb, + 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28, + 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb, + 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a, + 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810, + 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff, + 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd, + 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424, + 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b, + 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000, + 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000, + 0xc350000000000000, 0xf424000000000000, 0x9896800000000000, + 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000, + 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000, + 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000, + 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000, + 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000, + 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0, + 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940984, + 0xa18f07d736b90be5, 0xc9f2c9cd04674ede, 0xfc6f7c4045812296, + 0x9dc5ada82b70b59d, 0xc5371912364ce305, 0xf684df56c3e01bc6, + 0x9a130b963a6c115c, 0xc097ce7bc90715b3, 0xf0bdc21abb48db20, + 0x96769950b50d88f4, 0xbc143fa4e250eb31, 0xeb194f8e1ae525fd, + 0x92efd1b8d0cf37be, 0xb7abc627050305ad, 0xe596b7b0c643c719, + 0x8f7e32ce7bea5c6f, 0xb35dbf821ae4f38b, 0xe0352f62a19e306e}; + +template +const uint128_wrapper basic_data::dragonbox_pow10_significands_128[] = { +#if FMT_USE_FULL_CACHE_DRAGONBOX + {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, + {0x9faacf3df73609b1, 0x77b191618c54e9ad}, + {0xc795830d75038c1d, 0xd59df5b9ef6a2418}, + {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e}, + {0x9becce62836ac577, 0x4ee367f9430aec33}, + {0xc2e801fb244576d5, 0x229c41f793cda740}, + {0xf3a20279ed56d48a, 0x6b43527578c11110}, + {0x9845418c345644d6, 0x830a13896b78aaaa}, + {0xbe5691ef416bd60c, 0x23cc986bc656d554}, + {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9}, + {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa}, + {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54}, + {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69}, + {0x91376c36d99995be, 0x23100809b9c21fa2}, + {0xb58547448ffffb2d, 0xabd40a0c2832a78b}, + {0xe2e69915b3fff9f9, 0x16c90c8f323f516d}, + {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4}, + {0xb1442798f49ffb4a, 0x99cd11cfdf41779d}, + {0xdd95317f31c7fa1d, 0x40405643d711d584}, + {0x8a7d3eef7f1cfc52, 0x482835ea666b2573}, + {0xad1c8eab5ee43b66, 0xda3243650005eed0}, + {0xd863b256369d4a40, 0x90bed43e40076a83}, + {0x873e4f75e2224e68, 0x5a7744a6e804a292}, + {0xa90de3535aaae202, 0x711515d0a205cb37}, + {0xd3515c2831559a83, 0x0d5a5b44ca873e04}, + {0x8412d9991ed58091, 0xe858790afe9486c3}, + {0xa5178fff668ae0b6, 0x626e974dbe39a873}, + {0xce5d73ff402d98e3, 0xfb0a3d212dc81290}, + {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a}, + {0xa139029f6a239f72, 0x1c1fffc1ebc44e81}, + {0xc987434744ac874e, 0xa327ffb266b56221}, + {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9}, + {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa}, + {0xc4ce17b399107c22, 0xcb550fb4384d21d4}, + {0xf6019da07f549b2b, 0x7e2a53a146606a49}, + {0x99c102844f94e0fb, 0x2eda7444cbfc426e}, + {0xc0314325637a1939, 0xfa911155fefb5309}, + {0xf03d93eebc589f88, 0x793555ab7eba27cb}, + {0x96267c7535b763b5, 0x4bc1558b2f3458df}, + {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17}, + {0xea9c227723ee8bcb, 0x465e15a979c1cadd}, + {0x92a1958a7675175f, 0x0bfacd89ec191eca}, + {0xb749faed14125d36, 0xcef980ec671f667c}, + {0xe51c79a85916f484, 0x82b7e12780e7401b}, + {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811}, + {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16}, + {0xdfbdcece67006ac9, 0x67a791e093e1d49b}, + {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1}, + {0xaecc49914078536d, 0x58fae9f773886e19}, + {0xda7f5bf590966848, 0xaf39a475506a899f}, + {0x888f99797a5e012d, 0x6d8406c952429604}, + {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84}, + {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65}, + {0x855c3be0a17fcd26, 0x5cf2eea09a550680}, + {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, + {0xd0601d8efc57b08b, 0xf13b94daf124da27}, + {0x823c12795db6ce57, 0x76c53d08d6b70859}, + {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f}, + {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a}, + {0xfe5d54150b090b02, 0xd3f93b35435d7c4d}, + {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0}, + {0xc6b8e9b0709f109a, 0x359ab6419ca1091c}, + {0xf867241c8cc6d4c0, 0xc30163d203c94b63}, + {0x9b407691d7fc44f8, 0x79e0de63425dcf1e}, + {0xc21094364dfb5636, 0x985915fc12f542e5}, + {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e}, + {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43}, + {0xbd8430bd08277231, 0x50c6ff782a838354}, + {0xece53cec4a314ebd, 0xa4f8bf5635246429}, + {0x940f4613ae5ed136, 0x871b7795e136be9a}, + {0xb913179899f68584, 0x28e2557b59846e40}, + {0xe757dd7ec07426e5, 0x331aeada2fe589d0}, + {0x9096ea6f3848984f, 0x3ff0d2c85def7622}, + {0xb4bca50b065abe63, 0x0fed077a756b53aa}, + {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895}, + {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d}, + {0xb080392cc4349dec, 0xbd8d794d96aacfb4}, + {0xdca04777f541c567, 0xecf0d7a0fc5583a1}, + {0x89e42caaf9491b60, 0xf41686c49db57245}, + {0xac5d37d5b79b6239, 0x311c2875c522ced6}, + {0xd77485cb25823ac7, 0x7d633293366b828c}, + {0x86a8d39ef77164bc, 0xae5dff9c02033198}, + {0xa8530886b54dbdeb, 0xd9f57f830283fdfd}, + {0xd267caa862a12d66, 0xd072df63c324fd7c}, + {0x8380dea93da4bc60, 0x4247cb9e59f71e6e}, + {0xa46116538d0deb78, 0x52d9be85f074e609}, + {0xcd795be870516656, 0x67902e276c921f8c}, + {0x806bd9714632dff6, 0x00ba1cd8a3db53b7}, + {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5}, + {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce}, + {0xfad2a4b13d1b5d6c, 0x796b805720085f82}, + {0x9cc3a6eec6311a63, 0xcbe3303674053bb1}, + {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d}, + {0xf4f1b4d515acb93b, 0xee92fb5515482d45}, + {0x991711052d8bf3c5, 0x751bdd152d4d1c4b}, + {0xbf5cd54678eef0b6, 0xd262d45a78a0635e}, + {0xef340a98172aace4, 0x86fb897116c87c35}, + {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1}, + {0xbae0a846d2195712, 0x8974836059cca10a}, + {0xe998d258869facd7, 0x2bd1a438703fc94c}, + {0x91ff83775423cc06, 0x7b6306a34627ddd0}, + {0xb67f6455292cbf08, 0x1a3bc84c17b1d543}, + {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94}, + {0x8e938662882af53e, 0x547eb47b7282ee9d}, + {0xb23867fb2a35b28d, 0xe99e619a4f23aa44}, + {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5}, + {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05}, + {0xae0b158b4738705e, 0x9624ab50b148d446}, + {0xd98ddaee19068c76, 0x3badd624dd9b0958}, + {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7}, + {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d}, + {0xd47487cc8470652b, 0x7647c32000696720}, + {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074}, + {0xa5fb0a17c777cf09, 0xf468107100525891}, + {0xcf79cc9db955c2cc, 0x7182148d4066eeb5}, + {0x81ac1fe293d599bf, 0xc6f14cd848405531}, + {0xa21727db38cb002f, 0xb8ada00e5a506a7d}, + {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d}, + {0xfd442e4688bd304a, 0x908f4a166d1da664}, + {0x9e4a9cec15763e2e, 0x9a598e4e043287ff}, + {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe}, + {0xf7549530e188c128, 0xd12bee59e68ef47d}, + {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf}, + {0xc13a148e3032d6e7, 0xe36a52363c1faf02}, + {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2}, + {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba}, + {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8}, + {0xebdf661791d60f56, 0x111b495b3464ad22}, + {0x936b9fcebb25c995, 0xcab10dd900beec35}, + {0xb84687c269ef3bfb, 0x3d5d514f40eea743}, + {0xe65829b3046b0afa, 0x0cb4a5a3112a5113}, + {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac}, + {0xb3f4e093db73a093, 0x59ed216765690f57}, + {0xe0f218b8d25088b8, 0x306869c13ec3532d}, + {0x8c974f7383725573, 0x1e414218c73a13fc}, + {0xafbd2350644eeacf, 0xe5d1929ef90898fb}, + {0xdbac6c247d62a583, 0xdf45f746b74abf3a}, + {0x894bc396ce5da772, 0x6b8bba8c328eb784}, + {0xab9eb47c81f5114f, 0x066ea92f3f326565}, + {0xd686619ba27255a2, 0xc80a537b0efefebe}, + {0x8613fd0145877585, 0xbd06742ce95f5f37}, + {0xa798fc4196e952e7, 0x2c48113823b73705}, + {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6}, + {0x82ef85133de648c4, 0x9a984d73dbe722fc}, + {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb}, + {0xcc963fee10b7d1b3, 0x318df905079926a9}, + {0xffbbcfe994e5c61f, 0xfdf17746497f7053}, + {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634}, + {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1}, + {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1}, + {0x9c1661a651213e2d, 0x06bea10ca65c084f}, + {0xc31bfa0fe5698db8, 0x486e494fcff30a63}, + {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb}, + {0x986ddb5c6b3a76b7, 0xf89629465a75e01d}, + {0xbe89523386091465, 0xf6bbb397f1135824}, + {0xee2ba6c0678b597f, 0x746aa07ded582e2d}, + {0x94db483840b717ef, 0xa8c2a44eb4571cdd}, + {0xba121a4650e4ddeb, 0x92f34d62616ce414}, + {0xe896a0d7e51e1566, 0x77b020baf9c81d18}, + {0x915e2486ef32cd60, 0x0ace1474dc1d122f}, + {0xb5b5ada8aaff80b8, 0x0d819992132456bb}, + {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a}, + {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, + {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3}, + {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf}, + {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c}, + {0xad4ab7112eb3929d, 0x86c16c98d2c953c7}, + {0xd89d64d57a607744, 0xe871c7bf077ba8b8}, + {0x87625f056c7c4a8b, 0x11471cd764ad4973}, + {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0}, + {0xd389b47879823479, 0x4aff1d108d4ec2c4}, + {0x843610cb4bf160cb, 0xcedf722a585139bb}, + {0xa54394fe1eedb8fe, 0xc2974eb4ee658829}, + {0xce947a3da6a9273e, 0x733d226229feea33}, + {0x811ccc668829b887, 0x0806357d5a3f5260}, + {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8}, + {0xc9bcff6034c13052, 0xfc89b393dd02f0b6}, + {0xfc2c3f3841f17c67, 0xbbac2078d443ace3}, + {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e}, + {0xc5029163f384a931, 0x0a9e795e65d4df12}, + {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6}, + {0x99ea0196163fa42e, 0x504bced1bf8e4e46}, + {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7}, + {0xf07da27a82c37088, 0x5d767327bb4e5a4d}, + {0x964e858c91ba2655, 0x3a6a07f8d510f870}, + {0xbbe226efb628afea, 0x890489f70a55368c}, + {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f}, + {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e}, + {0xb77ada0617e3bbcb, 0x09ce6ebb40173745}, + {0xe55990879ddcaabd, 0xcc420a6a101d0516}, + {0x8f57fa54c2a9eab6, 0x9fa946824a12232e}, + {0xb32df8e9f3546564, 0x47939822dc96abfa}, + {0xdff9772470297ebd, 0x59787e2b93bc56f8}, + {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b}, + {0xaefae51477a06b03, 0xede622920b6b23f2}, + {0xdab99e59958885c4, 0xe95fab368e45ecee}, + {0x88b402f7fd75539b, 0x11dbcb0218ebb415}, + {0xaae103b5fcd2a881, 0xd652bdc29f26a11a}, + {0xd59944a37c0752a2, 0x4be76d3346f04960}, + {0x857fcae62d8493a5, 0x6f70a4400c562ddc}, + {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953}, + {0xd097ad07a71f26b2, 0x7e2000a41346a7a8}, + {0x825ecc24c873782f, 0x8ed400668c0c28c9}, + {0xa2f67f2dfa90563b, 0x728900802f0f32fb}, + {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba}, + {0xfea126b7d78186bc, 0xe2f610c84987bfa9}, + {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca}, + {0xc6ede63fa05d3143, 0x91503d1c79720dbc}, + {0xf8a95fcf88747d94, 0x75a44c6397ce912b}, + {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb}, + {0xc24452da229b021b, 0xfbe85badce996169}, + {0xf2d56790ab41c2a2, 0xfae27299423fb9c4}, + {0x97c560ba6b0919a5, 0xdccd879fc967d41b}, + {0xbdb6b8e905cb600f, 0x5400e987bbc1c921}, + {0xed246723473e3813, 0x290123e9aab23b69}, + {0x9436c0760c86e30b, 0xf9a0b6720aaf6522}, + {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, + {0xe7958cb87392c2c2, 0xb60b1d1230b20e05}, + {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3}, + {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4}, + {0xe2280b6c20dd5232, 0x25c6da63c38de1b1}, + {0x8d590723948a535f, 0x579c487e5a38ad0f}, + {0xb0af48ec79ace837, 0x2d835a9df0c6d852}, + {0xdcdb1b2798182244, 0xf8e431456cf88e66}, + {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900}, + {0xac8b2d36eed2dac5, 0xe272467e3d222f40}, + {0xd7adf884aa879177, 0x5b0ed81dcc6abb10}, + {0x86ccbb52ea94baea, 0x98e947129fc2b4ea}, + {0xa87fea27a539e9a5, 0x3f2398d747b36225}, + {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae}, + {0x83a3eeeef9153e89, 0x1953cf68300424ad}, + {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8}, + {0xcdb02555653131b6, 0x3792f412cb06794e}, + {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1}, + {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5}, + {0xc8de047564d20a8b, 0xf245825a5a445276}, + {0xfb158592be068d2e, 0xeed6e2f0f0d56713}, + {0x9ced737bb6c4183d, 0x55464dd69685606c}, + {0xc428d05aa4751e4c, 0xaa97e14c3c26b887}, + {0xf53304714d9265df, 0xd53dd99f4b3066a9}, + {0x993fe2c6d07b7fab, 0xe546a8038efe402a}, + {0xbf8fdb78849a5f96, 0xde98520472bdd034}, + {0xef73d256a5c0f77c, 0x963e66858f6d4441}, + {0x95a8637627989aad, 0xdde7001379a44aa9}, + {0xbb127c53b17ec159, 0x5560c018580d5d53}, + {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7}, + {0x9226712162ab070d, 0xcab3961304ca70e9}, + {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23}, + {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b}, + {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243}, + {0xb267ed1940f1c61c, 0x55f038b237591ed4}, + {0xdf01e85f912e37a3, 0x6b6c46dec52f6689}, + {0x8b61313bbabce2c6, 0x2323ac4b3b3da016}, + {0xae397d8aa96c1b77, 0xabec975e0a0d081b}, + {0xd9c7dced53c72255, 0x96e7bd358c904a22}, + {0x881cea14545c7575, 0x7e50d64177da2e55}, + {0xaa242499697392d2, 0xdde50bd1d5d0b9ea}, + {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865}, + {0x84ec3c97da624ab4, 0xbd5af13bef0b113f}, + {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f}, + {0xcfb11ead453994ba, 0x67de18eda5814af3}, + {0x81ceb32c4b43fcf4, 0x80eacf948770ced8}, + {0xa2425ff75e14fc31, 0xa1258379a94d028e}, + {0xcad2f7f5359a3b3e, 0x096ee45813a04331}, + {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd}, + {0x9e74d1b791e07e48, 0x775ea264cf55347e}, + {0xc612062576589dda, 0x95364afe032a819e}, + {0xf79687aed3eec551, 0x3a83ddbd83f52205}, + {0x9abe14cd44753b52, 0xc4926a9672793543}, + {0xc16d9a0095928a27, 0x75b7053c0f178294}, + {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, + {0x971da05074da7bee, 0xd3f6fc16ebca5e04}, + {0xbce5086492111aea, 0x88f4bb1ca6bcf585}, + {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6}, + {0x9392ee8e921d5d07, 0x3aff322e62439fd0}, + {0xb877aa3236a4b449, 0x09befeb9fad487c3}, + {0xe69594bec44de15b, 0x4c2ebe687989a9b4}, + {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11}, + {0xb424dc35095cd80f, 0x538484c19ef38c95}, + {0xe12e13424bb40e13, 0x2865a5f206b06fba}, + {0x8cbccc096f5088cb, 0xf93f87b7442e45d4}, + {0xafebff0bcb24aafe, 0xf78f69a51539d749}, + {0xdbe6fecebdedd5be, 0xb573440e5a884d1c}, + {0x89705f4136b4a597, 0x31680a88f8953031}, + {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e}, + {0xd6bf94d5e57a42bc, 0x3d32907604691b4d}, + {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110}, + {0xa7c5ac471b478423, 0x0fcf80dc33721d54}, + {0xd1b71758e219652b, 0xd3c36113404ea4a9}, + {0x83126e978d4fdf3b, 0x645a1cac083126ea}, + {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4}, + {0xcccccccccccccccc, 0xcccccccccccccccd}, + {0x8000000000000000, 0x0000000000000000}, + {0xa000000000000000, 0x0000000000000000}, + {0xc800000000000000, 0x0000000000000000}, + {0xfa00000000000000, 0x0000000000000000}, + {0x9c40000000000000, 0x0000000000000000}, + {0xc350000000000000, 0x0000000000000000}, + {0xf424000000000000, 0x0000000000000000}, + {0x9896800000000000, 0x0000000000000000}, + {0xbebc200000000000, 0x0000000000000000}, + {0xee6b280000000000, 0x0000000000000000}, + {0x9502f90000000000, 0x0000000000000000}, + {0xba43b74000000000, 0x0000000000000000}, + {0xe8d4a51000000000, 0x0000000000000000}, + {0x9184e72a00000000, 0x0000000000000000}, + {0xb5e620f480000000, 0x0000000000000000}, + {0xe35fa931a0000000, 0x0000000000000000}, + {0x8e1bc9bf04000000, 0x0000000000000000}, + {0xb1a2bc2ec5000000, 0x0000000000000000}, + {0xde0b6b3a76400000, 0x0000000000000000}, + {0x8ac7230489e80000, 0x0000000000000000}, + {0xad78ebc5ac620000, 0x0000000000000000}, + {0xd8d726b7177a8000, 0x0000000000000000}, + {0x878678326eac9000, 0x0000000000000000}, + {0xa968163f0a57b400, 0x0000000000000000}, + {0xd3c21bcecceda100, 0x0000000000000000}, + {0x84595161401484a0, 0x0000000000000000}, + {0xa56fa5b99019a5c8, 0x0000000000000000}, + {0xcecb8f27f4200f3a, 0x0000000000000000}, + {0x813f3978f8940984, 0x4000000000000000}, + {0xa18f07d736b90be5, 0x5000000000000000}, + {0xc9f2c9cd04674ede, 0xa400000000000000}, + {0xfc6f7c4045812296, 0x4d00000000000000}, + {0x9dc5ada82b70b59d, 0xf020000000000000}, + {0xc5371912364ce305, 0x6c28000000000000}, + {0xf684df56c3e01bc6, 0xc732000000000000}, + {0x9a130b963a6c115c, 0x3c7f400000000000}, + {0xc097ce7bc90715b3, 0x4b9f100000000000}, + {0xf0bdc21abb48db20, 0x1e86d40000000000}, + {0x96769950b50d88f4, 0x1314448000000000}, + {0xbc143fa4e250eb31, 0x17d955a000000000}, + {0xeb194f8e1ae525fd, 0x5dcfab0800000000}, + {0x92efd1b8d0cf37be, 0x5aa1cae500000000}, + {0xb7abc627050305ad, 0xf14a3d9e40000000}, + {0xe596b7b0c643c719, 0x6d9ccd05d0000000}, + {0x8f7e32ce7bea5c6f, 0xe4820023a2000000}, + {0xb35dbf821ae4f38b, 0xdda2802c8a800000}, + {0xe0352f62a19e306e, 0xd50b2037ad200000}, + {0x8c213d9da502de45, 0x4526f422cc340000}, + {0xaf298d050e4395d6, 0x9670b12b7f410000}, + {0xdaf3f04651d47b4c, 0x3c0cdd765f114000}, + {0x88d8762bf324cd0f, 0xa5880a69fb6ac800}, + {0xab0e93b6efee0053, 0x8eea0d047a457a00}, + {0xd5d238a4abe98068, 0x72a4904598d6d880}, + {0x85a36366eb71f041, 0x47a6da2b7f864750}, + {0xa70c3c40a64e6c51, 0x999090b65f67d924}, + {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d}, + {0x82818f1281ed449f, 0xbff8f10e7a8921a4}, + {0xa321f2d7226895c7, 0xaff72d52192b6a0d}, + {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764490}, + {0xfee50b7025c36a08, 0x02f236d04753d5b4}, + {0x9f4f2726179a2245, 0x01d762422c946590}, + {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef5}, + {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb2}, + {0x9b934c3b330c8577, 0x63cc55f49f88eb2f}, + {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fb}, + {0xf316271c7fc3908a, 0x8bef464e3945ef7a}, + {0x97edd871cfda3a56, 0x97758bf0e3cbb5ac}, + {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea317}, + {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bdd}, + {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6a}, + {0xb975d6b6ee39e436, 0xb3e2fd538e122b44}, + {0xe7d34c64a9c85d44, 0x60dbbca87196b616}, + {0x90e40fbeea1d3a4a, 0xbc8955e946fe31cd}, + {0xb51d13aea4a488dd, 0x6babab6398bdbe41}, + {0xe264589a4dcdab14, 0xc696963c7eed2dd1}, + {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca2}, + {0xb0de65388cc8ada8, 0x3b25a55f43294bcb}, + {0xdd15fe86affad912, 0x49ef0eb713f39ebe}, + {0x8a2dbf142dfcc7ab, 0x6e3569326c784337}, + {0xacb92ed9397bf996, 0x49c2c37f07965404}, + {0xd7e77a8f87daf7fb, 0xdc33745ec97be906}, + {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a3}, + {0xa8acd7c0222311bc, 0xc40832ea0d68ce0c}, + {0xd2d80db02aabd62b, 0xf50a3fa490c30190}, + {0x83c7088e1aab65db, 0x792667c6da79e0fa}, + {0xa4b8cab1a1563f52, 0x577001b891185938}, + {0xcde6fd5e09abcf26, 0xed4c0226b55e6f86}, + {0x80b05e5ac60b6178, 0x544f8158315b05b4}, + {0xa0dc75f1778e39d6, 0x696361ae3db1c721}, + {0xc913936dd571c84c, 0x03bc3a19cd1e38e9}, + {0xfb5878494ace3a5f, 0x04ab48a04065c723}, + {0x9d174b2dcec0e47b, 0x62eb0d64283f9c76}, + {0xc45d1df942711d9a, 0x3ba5d0bd324f8394}, + {0xf5746577930d6500, 0xca8f44ec7ee36479}, + {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecb}, + {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67e}, + {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101e}, + {0x95d04aee3b80ece5, 0xbba1f1d158724a12}, + {0xbb445da9ca61281f, 0x2a8a6e45ae8edc97}, + {0xea1575143cf97226, 0xf52d09d71a3293bd}, + {0x924d692ca61be758, 0x593c2626705f9c56}, + {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836c}, + {0xe498f455c38b997a, 0x0b6dfb9c0f956447}, + {0x8edf98b59a373fec, 0x4724bd4189bd5eac}, + {0xb2977ee300c50fe7, 0x58edec91ec2cb657}, + {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ed}, + {0x8b865b215899f46c, 0xbd79e0d20082ee74}, + {0xae67f1e9aec07187, 0xecd8590680a3aa11}, + {0xda01ee641a708de9, 0xe80e6f4820cc9495}, + {0x884134fe908658b2, 0x3109058d147fdcdd}, + {0xaa51823e34a7eede, 0xbd4b46f0599fd415}, + {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91a}, + {0x850fadc09923329e, 0x03e2cf6bc604ddb0}, + {0xa6539930bf6bff45, 0x84db8346b786151c}, + {0xcfe87f7cef46ff16, 0xe612641865679a63}, + {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07e}, + {0xa26da3999aef7749, 0xe3be5e330f38f09d}, + {0xcb090c8001ab551c, 0x5cadf5bfd3072cc5}, + {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f6}, + {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afa}, + {0xc646d63501a1511d, 0xb281e1fd541501b8}, + {0xf7d88bc24209a565, 0x1f225a7ca91a4226}, + {0x9ae757596946075f, 0x3375788de9b06958}, + {0xc1a12d2fc3978937, 0x0052d6b1641c83ae}, + {0xf209787bb47d6b84, 0xc0678c5dbd23a49a}, + {0x9745eb4d50ce6332, 0xf840b7ba963646e0}, + {0xbd176620a501fbff, 0xb650e5a93bc3d898}, + {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebe}, + {0x93ba47c980e98cdf, 0xc66f336c36b10137}, + {0xb8a8d9bbe123f017, 0xb80b0047445d4184}, + {0xe6d3102ad96cec1d, 0xa60dc059157491e5}, + {0x9043ea1ac7e41392, 0x87c89837ad68db2f}, + {0xb454e4a179dd1877, 0x29babe4598c311fb}, + {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67a}, + {0x8ce2529e2734bb1d, 0x1899e4a65f58660c}, + {0xb01ae745b101e9e4, 0x5ec05dcff72e7f8f}, + {0xdc21a1171d42645d, 0x76707543f4fa1f73}, + {0x899504ae72497eba, 0x6a06494a791c53a8}, + {0xabfa45da0edbde69, 0x0487db9d17636892}, + {0xd6f8d7509292d603, 0x45a9d2845d3c42b6}, + {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b2}, + {0xa7f26836f282b732, 0x8e6cac7768d7141e}, + {0xd1ef0244af2364ff, 0x3207d795430cd926}, + {0x8335616aed761f1f, 0x7f44e6bd49e807b8}, + {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a6}, + {0xcd036837130890a1, 0x36dba887c37a8c0f}, + {0x802221226be55a64, 0xc2494954da2c9789}, + {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6c}, + {0xc83553c5c8965d3d, 0x6f92829494e5acc7}, + {0xfa42a8b73abbf48c, 0xcb772339ba1f17f9}, + {0x9c69a97284b578d7, 0xff2a760414536efb}, + {0xc38413cf25e2d70d, 0xfef5138519684aba}, + {0xf46518c2ef5b8cd1, 0x7eb258665fc25d69}, + {0x98bf2f79d5993802, 0xef2f773ffbd97a61}, + {0xbeeefb584aff8603, 0xaafb550ffacfd8fa}, + {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf38}, + {0x952ab45cfa97a0b2, 0xdd945a747bf26183}, + {0xba756174393d88df, 0x94f971119aeef9e4}, + {0xe912b9d1478ceb17, 0x7a37cd5601aab85d}, + {0x91abb422ccb812ee, 0xac62e055c10ab33a}, + {0xb616a12b7fe617aa, 0x577b986b314d6009}, + {0xe39c49765fdf9d94, 0xed5a7e85fda0b80b}, + {0x8e41ade9fbebc27d, 0x14588f13be847307}, + {0xb1d219647ae6b31c, 0x596eb2d8ae258fc8}, + {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bb}, + {0x8aec23d680043bee, 0x25de7bb9480d5854}, + {0xada72ccc20054ae9, 0xaf561aa79a10ae6a}, + {0xd910f7ff28069da4, 0x1b2ba1518094da04}, + {0x87aa9aff79042286, 0x90fb44d2f05d0842}, + {0xa99541bf57452b28, 0x353a1607ac744a53}, + {0xd3fa922f2d1675f2, 0x42889b8997915ce8}, + {0x847c9b5d7c2e09b7, 0x69956135febada11}, + {0xa59bc234db398c25, 0x43fab9837e699095}, + {0xcf02b2c21207ef2e, 0x94f967e45e03f4bb}, + {0x8161afb94b44f57d, 0x1d1be0eebac278f5}, + {0xa1ba1ba79e1632dc, 0x6462d92a69731732}, + {0xca28a291859bbf93, 0x7d7b8f7503cfdcfe}, + {0xfcb2cb35e702af78, 0x5cda735244c3d43e}, + {0x9defbf01b061adab, 0x3a0888136afa64a7}, + {0xc56baec21c7a1916, 0x088aaa1845b8fdd0}, + {0xf6c69a72a3989f5b, 0x8aad549e57273d45}, + {0x9a3c2087a63f6399, 0x36ac54e2f678864b}, + {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7dd}, + {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d5}, + {0x969eb7c47859e743, 0x9f644ae5a4b1b325}, + {0xbc4665b596706114, 0x873d5d9f0dde1fee}, + {0xeb57ff22fc0c7959, 0xa90cb506d155a7ea}, + {0x9316ff75dd87cbd8, 0x09a7f12442d588f2}, + {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb2f}, + {0xe5d3ef282a242e81, 0x8f1668c8a86da5fa}, + {0x8fa475791a569d10, 0xf96e017d694487bc}, + {0xb38d92d760ec4455, 0x37c981dcc395a9ac}, + {0xe070f78d3927556a, 0x85bbe253f47b1417}, + {0x8c469ab843b89562, 0x93956d7478ccec8e}, + {0xaf58416654a6babb, 0x387ac8d1970027b2}, + {0xdb2e51bfe9d0696a, 0x06997b05fcc0319e}, + {0x88fcf317f22241e2, 0x441fece3bdf81f03}, + {0xab3c2fddeeaad25a, 0xd527e81cad7626c3}, + {0xd60b3bd56a5586f1, 0x8a71e223d8d3b074}, + {0x85c7056562757456, 0xf6872d5667844e49}, + {0xa738c6bebb12d16c, 0xb428f8ac016561db}, + {0xd106f86e69d785c7, 0xe13336d701beba52}, + {0x82a45b450226b39c, 0xecc0024661173473}, + {0xa34d721642b06084, 0x27f002d7f95d0190}, + {0xcc20ce9bd35c78a5, 0x31ec038df7b441f4}, + {0xff290242c83396ce, 0x7e67047175a15271}, + {0x9f79a169bd203e41, 0x0f0062c6e984d386}, + {0xc75809c42c684dd1, 0x52c07b78a3e60868}, + {0xf92e0c3537826145, 0xa7709a56ccdf8a82}, + {0x9bbcc7a142b17ccb, 0x88a66076400bb691}, + {0xc2abf989935ddbfe, 0x6acff893d00ea435}, + {0xf356f7ebf83552fe, 0x0583f6b8c4124d43}, + {0x98165af37b2153de, 0xc3727a337a8b704a}, + {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5c}, + {0xeda2ee1c7064130c, 0x1162def06f79df73}, + {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba8}, + {0xb9a74a0637ce2ee1, 0x6d953e2bd7173692}, + {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0437}, + {0x910ab1d4db9914a0, 0x1d9c9892400a22a2}, + {0xb54d5e4a127f59c8, 0x2503beb6d00cab4b}, + {0xe2a0b5dc971f303a, 0x2e44ae64840fd61d}, + {0x8da471a9de737e24, 0x5ceaecfed289e5d2}, + {0xb10d8e1456105dad, 0x7425a83e872c5f47}, + {0xdd50f1996b947518, 0xd12f124e28f77719}, + {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa6f}, + {0xace73cbfdc0bfb7b, 0x636cc64d1001550b}, + {0xd8210befd30efa5a, 0x3c47f7e05401aa4e}, + {0x8714a775e3e95c78, 0x65acfaec34810a71}, + {0xa8d9d1535ce3b396, 0x7f1839a741a14d0d}, + {0xd31045a8341ca07c, 0x1ede48111209a050}, + {0x83ea2b892091e44d, 0x934aed0aab460432}, + {0xa4e4b66b68b65d60, 0xf81da84d5617853f}, + {0xce1de40642e3f4b9, 0x36251260ab9d668e}, + {0x80d2ae83e9ce78f3, 0xc1d72b7c6b426019}, + {0xa1075a24e4421730, 0xb24cf65b8612f81f}, + {0xc94930ae1d529cfc, 0xdee033f26797b627}, + {0xfb9b7cd9a4a7443c, 0x169840ef017da3b1}, + {0x9d412e0806e88aa5, 0x8e1f289560ee864e}, + {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e2}, + {0xf5b5d7ec8acb58a2, 0xae10af696774b1db}, + {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef29}, + {0xbff610b0cc6edd3f, 0x17fd090a58d32af3}, + {0xeff394dcff8a948e, 0xddfc4b4cef07f5b0}, + {0x95f83d0a1fb69cd9, 0x4abdaf101564f98e}, + {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f1}, + {0xea53df5fd18d5513, 0x84c86189216dc5ed}, + {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb4}, + {0xb7118682dbb66a77, 0x3fbc8c33221dc2a1}, + {0xe4d5e82392a40515, 0x0fabaf3feaa5334a}, + {0x8f05b1163ba6832d, 0x29cb4d87f2a7400e}, + {0xb2c71d5bca9023f8, 0x743e20e9ef511012}, + {0xdf78e4b2bd342cf6, 0x914da9246b255416}, + {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548e}, + {0xae9672aba3d0c320, 0xa184ac2473b529b1}, + {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741e}, + {0x8865899617fb1871, 0x7e2fa67c7a658892}, + {0xaa7eebfb9df9de8d, 0xddbb901b98feeab7}, + {0xd51ea6fa85785631, 0x552a74227f3ea565}, + {0x8533285c936b35de, 0xd53a88958f87275f}, + {0xa67ff273b8460356, 0x8a892abaf368f137}, + {0xd01fef10a657842c, 0x2d2b7569b0432d85}, + {0x8213f56a67f6b29b, 0x9c3b29620e29fc73}, + {0xa298f2c501f45f42, 0x8349f3ba91b47b8f}, + {0xcb3f2f7642717713, 0x241c70a936219a73}, + {0xfe0efb53d30dd4d7, 0xed238cd383aa0110}, + {0x9ec95d1463e8a506, 0xf4363804324a40aa}, + {0xc67bb4597ce2ce48, 0xb143c6053edcd0d5}, + {0xf81aa16fdc1b81da, 0xdd94b7868e94050a}, + {0x9b10a4e5e9913128, 0xca7cf2b4191c8326}, + {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f0}, + {0xf24a01a73cf2dccf, 0xbc633b39673c8cec}, + {0x976e41088617ca01, 0xd5be0503e085d813}, + {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e18}, + {0xec9c459d51852ba2, 0xddf8e7d60ed1219e}, + {0x93e1ab8252f33b45, 0xcabb90e5c942b503}, + {0xb8da1662e7b00a17, 0x3d6a751f3b936243}, + {0xe7109bfba19c0c9d, 0x0cc512670a783ad4}, + {0x906a617d450187e2, 0x27fb2b80668b24c5}, + {0xb484f9dc9641e9da, 0xb1f9f660802dedf6}, + {0xe1a63853bbd26451, 0x5e7873f8a0396973}, + {0x8d07e33455637eb2, 0xdb0b487b6423e1e8}, + {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda62}, + {0xdc5c5301c56b75f7, 0x7641a140cc7810fb}, + {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9d}, + {0xac2820d9623bf429, 0x546345fa9fbdcd44}, + {0xd732290fbacaf133, 0xa97c177947ad4095}, + {0x867f59a9d4bed6c0, 0x49ed8eabcccc485d}, + {0xa81f301449ee8c70, 0x5c68f256bfff5a74}, + {0xd226fc195c6a2f8c, 0x73832eec6fff3111}, + {0x83585d8fd9c25db7, 0xc831fd53c5ff7eab}, + {0xa42e74f3d032f525, 0xba3e7ca8b77f5e55}, + {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35eb}, + {0x80444b5e7aa7cf85, 0x7980d163cf5b81b3}, + {0xa0555e361951c366, 0xd7e105bcc332621f}, + {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa7}, + {0xfa856334878fc150, 0xb14f98f6f0feb951}, + {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d3}, + {0xc3b8358109e84f07, 0x0a862f80ec4700c8}, + {0xf4a642e14c6262c8, 0xcd27bb612758c0fa}, + {0x98e7e9cccfbd7dbd, 0x8038d51cb897789c}, + {0xbf21e44003acdd2c, 0xe0470a63e6bd56c3}, + {0xeeea5d5004981478, 0x1858ccfce06cac74}, + {0x95527a5202df0ccb, 0x0f37801e0c43ebc8}, + {0xbaa718e68396cffd, 0xd30560258f54e6ba}, + {0xe950df20247c83fd, 0x47c6b82ef32a2069}, + {0x91d28b7416cdd27e, 0x4cdc331d57fa5441}, + {0xb6472e511c81471d, 0xe0133fe4adf8e952}, + {0xe3d8f9e563a198e5, 0x58180fddd97723a6}, + {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7648}, + {0xb201833b35d63f73, 0x2cd2cc6551e513da}, + {0xde81e40a034bcf4f, 0xf8077f7ea65e58d1}, + {0x8b112e86420f6191, 0xfb04afaf27faf782}, + {0xadd57a27d29339f6, 0x79c5db9af1f9b563}, + {0xd94ad8b1c7380874, 0x18375281ae7822bc}, + {0x87cec76f1c830548, 0x8f2293910d0b15b5}, + {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb22}, + {0xd433179d9c8cb841, 0x5fa60692a46151eb}, + {0x849feec281d7f328, 0xdbc7c41ba6bcd333}, + {0xa5c7ea73224deff3, 0x12b9b522906c0800}, + {0xcf39e50feae16bef, 0xd768226b34870a00}, + {0x81842f29f2cce375, 0xe6a1158300d46640}, + {0xa1e53af46f801c53, 0x60495ae3c1097fd0}, + {0xca5e89b18b602368, 0x385bb19cb14bdfc4}, + {0xfcf62c1dee382c42, 0x46729e03dd9ed7b5}, + {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d1}, + {0xc5a05277621be293, 0xc7098b7305241885}, + {0xf70867153aa2db38, 0xb8cbee4fc66d1ea7} +#else + {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, + {0xce5d73ff402d98e3, 0xfb0a3d212dc81290}, + {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, + {0x86a8d39ef77164bc, 0xae5dff9c02033198}, + {0xd98ddaee19068c76, 0x3badd624dd9b0958}, + {0xafbd2350644eeacf, 0xe5d1929ef90898fb}, + {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, + {0xe55990879ddcaabd, 0xcc420a6a101d0516}, + {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, + {0x95a8637627989aad, 0xdde7001379a44aa9}, + {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, + {0xc350000000000000, 0x0000000000000000}, + {0x9dc5ada82b70b59d, 0xf020000000000000}, + {0xfee50b7025c36a08, 0x02f236d04753d5b4}, + {0xcde6fd5e09abcf26, 0xed4c0226b55e6f86}, + {0xa6539930bf6bff45, 0x84db8346b786151c}, + {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b2}, + {0xd910f7ff28069da4, 0x1b2ba1518094da04}, + {0xaf58416654a6babb, 0x387ac8d1970027b2}, + {0x8da471a9de737e24, 0x5ceaecfed289e5d2}, + {0xe4d5e82392a40515, 0x0fabaf3feaa5334a}, + {0xb8da1662e7b00a17, 0x3d6a751f3b936243}, + {0x95527a5202df0ccb, 0x0f37801e0c43ebc8} +#endif +}; + +#if !FMT_USE_FULL_CACHE_DRAGONBOX +template +const uint64_t basic_data::powers_of_5_64[] = { + 0x0000000000000001, 0x0000000000000005, 0x0000000000000019, + 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35, + 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1, + 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd, + 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9, + 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5, + 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631, + 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed, + 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9}; + +template +const uint32_t basic_data::dragonbox_pow10_recovery_errors[] = { + 0x50001400, 0x54044100, 0x54014555, 0x55954415, 0x54115555, 0x00000001, + 0x50000000, 0x00104000, 0x54010004, 0x05004001, 0x55555544, 0x41545555, + 0x54040551, 0x15445545, 0x51555514, 0x10000015, 0x00101100, 0x01100015, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04450514, 0x45414110, + 0x55555145, 0x50544050, 0x15040155, 0x11054140, 0x50111514, 0x11451454, + 0x00400541, 0x00000000, 0x55555450, 0x10056551, 0x10054011, 0x55551014, + 0x69514555, 0x05151109, 0x00155555}; +#endif + +template +const char basic_data::foreground_color[] = "\x1b[38;2;"; +template +const char basic_data::background_color[] = "\x1b[48;2;"; +template const char basic_data::reset_color[] = "\x1b[0m"; +template const wchar_t basic_data::wreset_color[] = L"\x1b[0m"; +template const char basic_data::signs[] = {0, '-', '+', ' '}; +template +const char basic_data::left_padding_shifts[] = {31, 31, 0, 1, 0}; +template +const char basic_data::right_padding_shifts[] = {0, 31, 0, 1, 0}; + +template struct bits { + static FMT_CONSTEXPR_DECL const int value = + static_cast(sizeof(T) * std::numeric_limits::digits); +}; + +class fp; +template fp normalize(fp value); + +// Lower (upper) boundary is a value half way between a floating-point value +// and its predecessor (successor). Boundaries have the same exponent as the +// value so only significands are stored. +struct boundaries { + uint64_t lower; + uint64_t upper; +}; + +// A handmade floating-point number f * pow(2, e). +class fp { + private: + using significand_type = uint64_t; + + template + using is_supported_float = bool_constant; + + public: + significand_type f; + int e; + + // All sizes are in bits. + // Subtract 1 to account for an implicit most significant bit in the + // normalized form. + static FMT_CONSTEXPR_DECL const int double_significand_size = + std::numeric_limits::digits - 1; + static FMT_CONSTEXPR_DECL const uint64_t implicit_bit = + 1ULL << double_significand_size; + static FMT_CONSTEXPR_DECL const int significand_size = + bits::value; + + fp() : f(0), e(0) {} + fp(uint64_t f_val, int e_val) : f(f_val), e(e_val) {} + + // Constructs fp from an IEEE754 double. It is a template to prevent compile + // errors on platforms where double is not IEEE754. + template explicit fp(Double d) { assign(d); } + + // Assigns d to this and return true iff predecessor is closer than successor. + template ::value)> + bool assign(Float d) { + // Assume float is in the format [sign][exponent][significand]. + using limits = std::numeric_limits; + const int float_significand_size = limits::digits - 1; + const int exponent_size = + bits::value - float_significand_size - 1; // -1 for sign + const uint64_t float_implicit_bit = 1ULL << float_significand_size; + const uint64_t significand_mask = float_implicit_bit - 1; + const uint64_t exponent_mask = (~0ULL >> 1) & ~significand_mask; + const int exponent_bias = (1 << exponent_size) - limits::max_exponent - 1; + constexpr bool is_double = sizeof(Float) == sizeof(uint64_t); + auto u = bit_cast>(d); + f = u & significand_mask; + int biased_e = + static_cast((u & exponent_mask) >> float_significand_size); + // Predecessor is closer if d is a normalized power of 2 (f == 0) other than + // the smallest normalized number (biased_e > 1). + bool is_predecessor_closer = f == 0 && biased_e > 1; + if (biased_e != 0) + f += float_implicit_bit; + else + biased_e = 1; // Subnormals use biased exponent 1 (min exponent). + e = biased_e - exponent_bias - float_significand_size; + return is_predecessor_closer; + } + + template ::value)> + bool assign(Float) { + *this = fp(); + return false; + } +}; + +// Normalizes the value converted from double and multiplied by (1 << SHIFT). +template fp normalize(fp value) { + // Handle subnormals. + const auto shifted_implicit_bit = fp::implicit_bit << SHIFT; + while ((value.f & shifted_implicit_bit) == 0) { + value.f <<= 1; + --value.e; + } + // Subtract 1 to account for hidden bit. + const auto offset = + fp::significand_size - fp::double_significand_size - SHIFT - 1; + value.f <<= offset; + value.e -= offset; + return value; +} + +inline bool operator==(fp x, fp y) { return x.f == y.f && x.e == y.e; } + +// Computes lhs * rhs / pow(2, 64) rounded to nearest with half-up tie breaking. +inline uint64_t multiply(uint64_t lhs, uint64_t rhs) { +#if FMT_USE_INT128 + auto product = static_cast<__uint128_t>(lhs) * rhs; + auto f = static_cast(product >> 64); + return (static_cast(product) & (1ULL << 63)) != 0 ? f + 1 : f; +#else + // Multiply 32-bit parts of significands. + uint64_t mask = (1ULL << 32) - 1; + uint64_t a = lhs >> 32, b = lhs & mask; + uint64_t c = rhs >> 32, d = rhs & mask; + uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d; + // Compute mid 64-bit of result and round. + uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31); + return ac + (ad >> 32) + (bc >> 32) + (mid >> 32); +#endif +} + +inline fp operator*(fp x, fp y) { return {multiply(x.f, y.f), x.e + y.e + 64}; } + +// Returns a cached power of 10 `c_k = c_k.f * pow(2, c_k.e)` such that its +// (binary) exponent satisfies `min_exponent <= c_k.e <= min_exponent + 28`. +inline fp get_cached_power(int min_exponent, int& pow10_exponent) { + const int shift = 32; + const auto significand = static_cast(data::log10_2_significand); + int index = static_cast( + ((min_exponent + fp::significand_size - 1) * (significand >> shift) + + ((int64_t(1) << shift) - 1)) // ceil + >> 32 // arithmetic shift + ); + // Decimal exponent of the first (smallest) cached power of 10. + const int first_dec_exp = -348; + // Difference between 2 consecutive decimal exponents in cached powers of 10. + const int dec_exp_step = 8; + index = (index - first_dec_exp - 1) / dec_exp_step + 1; + pow10_exponent = first_dec_exp + index * dec_exp_step; + return {data::grisu_pow10_significands[index], + data::grisu_pow10_exponents[index]}; +} + +// A simple accumulator to hold the sums of terms in bigint::square if uint128_t +// is not available. +struct accumulator { + uint64_t lower; + uint64_t upper; + + accumulator() : lower(0), upper(0) {} + explicit operator uint32_t() const { return static_cast(lower); } + + void operator+=(uint64_t n) { + lower += n; + if (lower < n) ++upper; + } + void operator>>=(int shift) { + assert(shift == 32); + (void)shift; + lower = (upper << 32) | (lower >> 32); + upper >>= 32; + } +}; + +class bigint { + private: + // A bigint is stored as an array of bigits (big digits), with bigit at index + // 0 being the least significant one. + using bigit = uint32_t; + using double_bigit = uint64_t; + enum { bigits_capacity = 32 }; + basic_memory_buffer bigits_; + int exp_; + + bigit operator[](int index) const { return bigits_[to_unsigned(index)]; } + bigit& operator[](int index) { return bigits_[to_unsigned(index)]; } + + static FMT_CONSTEXPR_DECL const int bigit_bits = bits::value; + + friend struct formatter; + + void subtract_bigits(int index, bigit other, bigit& borrow) { + auto result = static_cast((*this)[index]) - other - borrow; + (*this)[index] = static_cast(result); + borrow = static_cast(result >> (bigit_bits * 2 - 1)); + } + + void remove_leading_zeros() { + int num_bigits = static_cast(bigits_.size()) - 1; + while (num_bigits > 0 && (*this)[num_bigits] == 0) --num_bigits; + bigits_.resize(to_unsigned(num_bigits + 1)); + } + + // Computes *this -= other assuming aligned bigints and *this >= other. + void subtract_aligned(const bigint& other) { + FMT_ASSERT(other.exp_ >= exp_, "unaligned bigints"); + FMT_ASSERT(compare(*this, other) >= 0, ""); + bigit borrow = 0; + int i = other.exp_ - exp_; + for (size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j) + subtract_bigits(i, other.bigits_[j], borrow); + while (borrow > 0) subtract_bigits(i, 0, borrow); + remove_leading_zeros(); + } + + void multiply(uint32_t value) { + const double_bigit wide_value = value; + bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + double_bigit result = bigits_[i] * wide_value + carry; + bigits_[i] = static_cast(result); + carry = static_cast(result >> bigit_bits); + } + if (carry != 0) bigits_.push_back(carry); + } + + void multiply(uint64_t value) { + const bigit mask = ~bigit(0); + const double_bigit lower = value & mask; + const double_bigit upper = value >> bigit_bits; + double_bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + double_bigit result = bigits_[i] * lower + (carry & mask); + carry = + bigits_[i] * upper + (result >> bigit_bits) + (carry >> bigit_bits); + bigits_[i] = static_cast(result); + } + while (carry != 0) { + bigits_.push_back(carry & mask); + carry >>= bigit_bits; + } + } + + public: + bigint() : exp_(0) {} + explicit bigint(uint64_t n) { assign(n); } + ~bigint() { assert(bigits_.capacity() <= bigits_capacity); } + + bigint(const bigint&) = delete; + void operator=(const bigint&) = delete; + + void assign(const bigint& other) { + auto size = other.bigits_.size(); + bigits_.resize(size); + auto data = other.bigits_.data(); + std::copy(data, data + size, make_checked(bigits_.data(), size)); + exp_ = other.exp_; + } + + void assign(uint64_t n) { + size_t num_bigits = 0; + do { + bigits_[num_bigits++] = n & ~bigit(0); + n >>= bigit_bits; + } while (n != 0); + bigits_.resize(num_bigits); + exp_ = 0; + } + + int num_bigits() const { return static_cast(bigits_.size()) + exp_; } + + FMT_NOINLINE bigint& operator<<=(int shift) { + assert(shift >= 0); + exp_ += shift / bigit_bits; + shift %= bigit_bits; + if (shift == 0) return *this; + bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + bigit c = bigits_[i] >> (bigit_bits - shift); + bigits_[i] = (bigits_[i] << shift) + carry; + carry = c; + } + if (carry != 0) bigits_.push_back(carry); + return *this; + } + + template bigint& operator*=(Int value) { + FMT_ASSERT(value > 0, ""); + multiply(uint32_or_64_or_128_t(value)); + return *this; + } + + friend int compare(const bigint& lhs, const bigint& rhs) { + int num_lhs_bigits = lhs.num_bigits(), num_rhs_bigits = rhs.num_bigits(); + if (num_lhs_bigits != num_rhs_bigits) + return num_lhs_bigits > num_rhs_bigits ? 1 : -1; + int i = static_cast(lhs.bigits_.size()) - 1; + int j = static_cast(rhs.bigits_.size()) - 1; + int end = i - j; + if (end < 0) end = 0; + for (; i >= end; --i, --j) { + bigit lhs_bigit = lhs[i], rhs_bigit = rhs[j]; + if (lhs_bigit != rhs_bigit) return lhs_bigit > rhs_bigit ? 1 : -1; + } + if (i != j) return i > j ? 1 : -1; + return 0; + } + + // Returns compare(lhs1 + lhs2, rhs). + friend int add_compare(const bigint& lhs1, const bigint& lhs2, + const bigint& rhs) { + int max_lhs_bigits = (std::max)(lhs1.num_bigits(), lhs2.num_bigits()); + int num_rhs_bigits = rhs.num_bigits(); + if (max_lhs_bigits + 1 < num_rhs_bigits) return -1; + if (max_lhs_bigits > num_rhs_bigits) return 1; + auto get_bigit = [](const bigint& n, int i) -> bigit { + return i >= n.exp_ && i < n.num_bigits() ? n[i - n.exp_] : 0; + }; + double_bigit borrow = 0; + int min_exp = (std::min)((std::min)(lhs1.exp_, lhs2.exp_), rhs.exp_); + for (int i = num_rhs_bigits - 1; i >= min_exp; --i) { + double_bigit sum = + static_cast(get_bigit(lhs1, i)) + get_bigit(lhs2, i); + bigit rhs_bigit = get_bigit(rhs, i); + if (sum > rhs_bigit + borrow) return 1; + borrow = rhs_bigit + borrow - sum; + if (borrow > 1) return -1; + borrow <<= bigit_bits; + } + return borrow != 0 ? -1 : 0; + } + + // Assigns pow(10, exp) to this bigint. + void assign_pow10(int exp) { + assert(exp >= 0); + if (exp == 0) return assign(1); + // Find the top bit. + int bitmask = 1; + while (exp >= bitmask) bitmask <<= 1; + bitmask >>= 1; + // pow(10, exp) = pow(5, exp) * pow(2, exp). First compute pow(5, exp) by + // repeated squaring and multiplication. + assign(5); + bitmask >>= 1; + while (bitmask != 0) { + square(); + if ((exp & bitmask) != 0) *this *= 5; + bitmask >>= 1; + } + *this <<= exp; // Multiply by pow(2, exp) by shifting. + } + + void square() { + basic_memory_buffer n(std::move(bigits_)); + int num_bigits = static_cast(bigits_.size()); + int num_result_bigits = 2 * num_bigits; + bigits_.resize(to_unsigned(num_result_bigits)); + using accumulator_t = conditional_t; + auto sum = accumulator_t(); + for (int bigit_index = 0; bigit_index < num_bigits; ++bigit_index) { + // Compute bigit at position bigit_index of the result by adding + // cross-product terms n[i] * n[j] such that i + j == bigit_index. + for (int i = 0, j = bigit_index; j >= 0; ++i, --j) { + // Most terms are multiplied twice which can be optimized in the future. + sum += static_cast(n[i]) * n[j]; + } + (*this)[bigit_index] = static_cast(sum); + sum >>= bits::value; // Compute the carry. + } + // Do the same for the top half. + for (int bigit_index = num_bigits; bigit_index < num_result_bigits; + ++bigit_index) { + for (int j = num_bigits - 1, i = bigit_index - j; i < num_bigits;) + sum += static_cast(n[i++]) * n[j--]; + (*this)[bigit_index] = static_cast(sum); + sum >>= bits::value; + } + --num_result_bigits; + remove_leading_zeros(); + exp_ *= 2; + } + + // If this bigint has a bigger exponent than other, adds trailing zero to make + // exponents equal. This simplifies some operations such as subtraction. + void align(const bigint& other) { + int exp_difference = exp_ - other.exp_; + if (exp_difference <= 0) return; + int num_bigits = static_cast(bigits_.size()); + bigits_.resize(to_unsigned(num_bigits + exp_difference)); + for (int i = num_bigits - 1, j = i + exp_difference; i >= 0; --i, --j) + bigits_[j] = bigits_[i]; + std::uninitialized_fill_n(bigits_.data(), exp_difference, 0); + exp_ -= exp_difference; + } + + // Divides this bignum by divisor, assigning the remainder to this and + // returning the quotient. + int divmod_assign(const bigint& divisor) { + FMT_ASSERT(this != &divisor, ""); + if (compare(*this, divisor) < 0) return 0; + FMT_ASSERT(divisor.bigits_[divisor.bigits_.size() - 1u] != 0, ""); + align(divisor); + int quotient = 0; + do { + subtract_aligned(divisor); + ++quotient; + } while (compare(*this, divisor) >= 0); + return quotient; + } +}; + +enum class round_direction { unknown, up, down }; + +// Given the divisor (normally a power of 10), the remainder = v % divisor for +// some number v and the error, returns whether v should be rounded up, down, or +// whether the rounding direction can't be determined due to error. +// error should be less than divisor / 2. +inline round_direction get_round_direction(uint64_t divisor, uint64_t remainder, + uint64_t error) { + FMT_ASSERT(remainder < divisor, ""); // divisor - remainder won't overflow. + FMT_ASSERT(error < divisor, ""); // divisor - error won't overflow. + FMT_ASSERT(error < divisor - error, ""); // error * 2 won't overflow. + // Round down if (remainder + error) * 2 <= divisor. + if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2) + return round_direction::down; + // Round up if (remainder - error) * 2 >= divisor. + if (remainder >= error && + remainder - error >= divisor - (remainder - error)) { + return round_direction::up; + } + return round_direction::unknown; +} + +namespace digits { +enum result { + more, // Generate more digits. + done, // Done generating digits. + error // Digit generation cancelled due to an error. +}; +} + +// Generates output using the Grisu digit-gen algorithm. +// error: the size of the region (lower, upper) outside of which numbers +// definitely do not round to value (Delta in Grisu3). +template +FMT_ALWAYS_INLINE digits::result grisu_gen_digits(fp value, uint64_t error, + int& exp, Handler& handler) { + const fp one(1ULL << -value.e, value.e); + // The integral part of scaled value (p1 in Grisu) = value / one. It cannot be + // zero because it contains a product of two 64-bit numbers with MSB set (due + // to normalization) - 1, shifted right by at most 60 bits. + auto integral = static_cast(value.f >> -one.e); + FMT_ASSERT(integral != 0, ""); + FMT_ASSERT(integral == value.f >> -one.e, ""); + // The fractional part of scaled value (p2 in Grisu) c = value % one. + uint64_t fractional = value.f & (one.f - 1); + exp = count_digits(integral); // kappa in Grisu. + // Divide by 10 to prevent overflow. + auto result = handler.on_start(data::powers_of_10_64[exp - 1] << -one.e, + value.f / 10, error * 10, exp); + if (result != digits::more) return result; + // Generate digits for the integral part. This can produce up to 10 digits. + do { + uint32_t digit = 0; + auto divmod_integral = [&](uint32_t divisor) { + digit = integral / divisor; + integral %= divisor; + }; + // This optimization by Milo Yip reduces the number of integer divisions by + // one per iteration. + switch (exp) { + case 10: + divmod_integral(1000000000); + break; + case 9: + divmod_integral(100000000); + break; + case 8: + divmod_integral(10000000); + break; + case 7: + divmod_integral(1000000); + break; + case 6: + divmod_integral(100000); + break; + case 5: + divmod_integral(10000); + break; + case 4: + divmod_integral(1000); + break; + case 3: + divmod_integral(100); + break; + case 2: + divmod_integral(10); + break; + case 1: + digit = integral; + integral = 0; + break; + default: + FMT_ASSERT(false, "invalid number of digits"); + } + --exp; + auto remainder = (static_cast(integral) << -one.e) + fractional; + result = handler.on_digit(static_cast('0' + digit), + data::powers_of_10_64[exp] << -one.e, remainder, + error, exp, true); + if (result != digits::more) return result; + } while (exp > 0); + // Generate digits for the fractional part. + for (;;) { + fractional *= 10; + error *= 10; + char digit = static_cast('0' + (fractional >> -one.e)); + fractional &= one.f - 1; + --exp; + result = handler.on_digit(digit, one.f, fractional, error, exp, false); + if (result != digits::more) return result; + } +} + +// The fixed precision digit handler. +struct fixed_handler { + char* buf; + int size; + int precision; + int exp10; + bool fixed; + + digits::result on_start(uint64_t divisor, uint64_t remainder, uint64_t error, + int& exp) { + // Non-fixed formats require at least one digit and no precision adjustment. + if (!fixed) return digits::more; + // Adjust fixed precision by exponent because it is relative to decimal + // point. + precision += exp + exp10; + // Check if precision is satisfied just by leading zeros, e.g. + // format("{:.2f}", 0.001) gives "0.00" without generating any digits. + if (precision > 0) return digits::more; + if (precision < 0) return digits::done; + auto dir = get_round_direction(divisor, remainder, error); + if (dir == round_direction::unknown) return digits::error; + buf[size++] = dir == round_direction::up ? '1' : '0'; + return digits::done; + } + + digits::result on_digit(char digit, uint64_t divisor, uint64_t remainder, + uint64_t error, int, bool integral) { + FMT_ASSERT(remainder < divisor, ""); + buf[size++] = digit; + if (!integral && error >= remainder) return digits::error; + if (size < precision) return digits::more; + if (!integral) { + // Check if error * 2 < divisor with overflow prevention. + // The check is not needed for the integral part because error = 1 + // and divisor > (1 << 32) there. + if (error >= divisor || error >= divisor - error) return digits::error; + } else { + FMT_ASSERT(error == 1 && divisor > 2, ""); + } + auto dir = get_round_direction(divisor, remainder, error); + if (dir != round_direction::up) + return dir == round_direction::down ? digits::done : digits::error; + ++buf[size - 1]; + for (int i = size - 1; i > 0 && buf[i] > '9'; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] > '9') { + buf[0] = '1'; + if (fixed) + buf[size++] = '0'; + else + ++exp10; + } + return digits::done; + } +}; + +// Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox. +namespace dragonbox { +// Computes 128-bit result of multiplication of two 64-bit unsigned integers. +FMT_SAFEBUFFERS inline uint128_wrapper umul128(uint64_t x, + uint64_t y) FMT_NOEXCEPT { +#if FMT_USE_INT128 + return static_cast(x) * static_cast(y); +#elif defined(_MSC_VER) && defined(_M_X64) + uint128_wrapper result; + result.low_ = _umul128(x, y, &result.high_); + return result; +#else + const uint64_t mask = (uint64_t(1) << 32) - uint64_t(1); + + uint64_t a = x >> 32; + uint64_t b = x & mask; + uint64_t c = y >> 32; + uint64_t d = y & mask; + + uint64_t ac = a * c; + uint64_t bc = b * c; + uint64_t ad = a * d; + uint64_t bd = b * d; + + uint64_t intermediate = (bd >> 32) + (ad & mask) + (bc & mask); + + return {ac + (intermediate >> 32) + (ad >> 32) + (bc >> 32), + (intermediate << 32) + (bd & mask)}; +#endif +} + +// Computes upper 64 bits of multiplication of two 64-bit unsigned integers. +FMT_SAFEBUFFERS inline uint64_t umul128_upper64(uint64_t x, + uint64_t y) FMT_NOEXCEPT { +#if FMT_USE_INT128 + auto p = static_cast(x) * static_cast(y); + return static_cast(p >> 64); +#elif defined(_MSC_VER) && defined(_M_X64) + return __umulh(x, y); +#else + return umul128(x, y).high(); +#endif +} + +// Computes upper 64 bits of multiplication of a 64-bit unsigned integer and a +// 128-bit unsigned integer. +FMT_SAFEBUFFERS inline uint64_t umul192_upper64(uint64_t x, uint128_wrapper y) + FMT_NOEXCEPT { + uint128_wrapper g0 = umul128(x, y.high()); + g0 += umul128_upper64(x, y.low()); + return g0.high(); +} + +// Computes upper 32 bits of multiplication of a 32-bit unsigned integer and a +// 64-bit unsigned integer. +inline uint32_t umul96_upper32(uint32_t x, uint64_t y) FMT_NOEXCEPT { + return static_cast(umul128_upper64(x, y)); +} + +// Computes middle 64 bits of multiplication of a 64-bit unsigned integer and a +// 128-bit unsigned integer. +FMT_SAFEBUFFERS inline uint64_t umul192_middle64(uint64_t x, uint128_wrapper y) + FMT_NOEXCEPT { + uint64_t g01 = x * y.high(); + uint64_t g10 = umul128_upper64(x, y.low()); + return g01 + g10; +} + +// Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a +// 64-bit unsigned integer. +inline uint64_t umul96_lower64(uint32_t x, uint64_t y) FMT_NOEXCEPT { + return x * y; +} + +// Computes floor(log10(pow(2, e))) for e in [-1700, 1700] using the method from +// https://fmt.dev/papers/Grisu-Exact.pdf#page=5, section 3.4. +inline int floor_log10_pow2(int e) FMT_NOEXCEPT { + FMT_ASSERT(e <= 1700 && e >= -1700, "too large exponent"); + const int shift = 22; + return (e * static_cast(data::log10_2_significand >> (64 - shift))) >> + shift; +} + +// Various fast log computations. +inline int floor_log2_pow10(int e) FMT_NOEXCEPT { + FMT_ASSERT(e <= 1233 && e >= -1233, "too large exponent"); + const uint64_t log2_10_integer_part = 3; + const uint64_t log2_10_fractional_digits = 0x5269e12f346e2bf9; + const int shift_amount = 19; + return (e * static_cast( + (log2_10_integer_part << shift_amount) | + (log2_10_fractional_digits >> (64 - shift_amount)))) >> + shift_amount; +} +inline int floor_log10_pow2_minus_log10_4_over_3(int e) FMT_NOEXCEPT { + FMT_ASSERT(e <= 1700 && e >= -1700, "too large exponent"); + const uint64_t log10_4_over_3_fractional_digits = 0x1ffbfc2bbc780375; + const int shift_amount = 22; + return (e * static_cast(data::log10_2_significand >> + (64 - shift_amount)) - + static_cast(log10_4_over_3_fractional_digits >> + (64 - shift_amount))) >> + shift_amount; +} + +// Returns true iff x is divisible by pow(2, exp). +inline bool divisible_by_power_of_2(uint32_t x, int exp) FMT_NOEXCEPT { + FMT_ASSERT(exp >= 1, ""); + FMT_ASSERT(x != 0, ""); +#ifdef FMT_BUILTIN_CTZ + return FMT_BUILTIN_CTZ(x) >= exp; +#else + return exp < num_bits() && x == ((x >> exp) << exp); +#endif +} +inline bool divisible_by_power_of_2(uint64_t x, int exp) FMT_NOEXCEPT { + FMT_ASSERT(exp >= 1, ""); + FMT_ASSERT(x != 0, ""); +#ifdef FMT_BUILTIN_CTZLL + return FMT_BUILTIN_CTZLL(x) >= exp; +#else + return exp < num_bits() && x == ((x >> exp) << exp); +#endif +} + +// Returns true iff x is divisible by pow(5, exp). +inline bool divisible_by_power_of_5(uint32_t x, int exp) FMT_NOEXCEPT { + FMT_ASSERT(exp <= 10, "too large exponent"); + return x * data::divtest_table_for_pow5_32[exp].mod_inv <= + data::divtest_table_for_pow5_32[exp].max_quotient; +} +inline bool divisible_by_power_of_5(uint64_t x, int exp) FMT_NOEXCEPT { + FMT_ASSERT(exp <= 23, "too large exponent"); + return x * data::divtest_table_for_pow5_64[exp].mod_inv <= + data::divtest_table_for_pow5_64[exp].max_quotient; +} + +// Replaces n by floor(n / pow(5, N)) returning true if and only if n is +// divisible by pow(5, N). +// Precondition: n <= 2 * pow(5, N + 1). +template +bool check_divisibility_and_divide_by_pow5(uint32_t& n) FMT_NOEXCEPT { + static constexpr struct { + uint32_t magic_number; + int bits_for_comparison; + uint32_t threshold; + int shift_amount; + } infos[] = {{0xcccd, 16, 0x3333, 18}, {0xa429, 8, 0x0a, 20}}; + constexpr auto info = infos[N - 1]; + n *= info.magic_number; + const uint32_t comparison_mask = (1u << info.bits_for_comparison) - 1; + bool result = (n & comparison_mask) <= info.threshold; + n >>= info.shift_amount; + return result; +} + +// Computes floor(n / pow(10, N)) for small n and N. +// Precondition: n <= pow(10, N + 1). +template uint32_t small_division_by_pow10(uint32_t n) FMT_NOEXCEPT { + static constexpr struct { + uint32_t magic_number; + int shift_amount; + uint32_t divisor_times_10; + } infos[] = {{0xcccd, 19, 100}, {0xa3d8, 22, 1000}}; + constexpr auto info = infos[N - 1]; + FMT_ASSERT(n <= info.divisor_times_10, "n is too large"); + return n * info.magic_number >> info.shift_amount; +} + +// Computes floor(n / 10^(kappa + 1)) (float) +inline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) FMT_NOEXCEPT { + return n / float_info::big_divisor; +} +// Computes floor(n / 10^(kappa + 1)) (double) +inline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n) FMT_NOEXCEPT { + return umul128_upper64(n, 0x83126e978d4fdf3c) >> 9; +} + +// Various subroutines using pow10 cache +template struct cache_accessor; + +template <> struct cache_accessor { + using carrier_uint = float_info::carrier_uint; + using cache_entry_type = uint64_t; + + static uint64_t get_cached_power(int k) FMT_NOEXCEPT { + FMT_ASSERT(k >= float_info::min_k && k <= float_info::max_k, + "k is out of range"); + return data::dragonbox_pow10_significands_64[k - float_info::min_k]; + } + + static carrier_uint compute_mul(carrier_uint u, + const cache_entry_type& cache) FMT_NOEXCEPT { + return umul96_upper32(u, cache); + } + + static uint32_t compute_delta(const cache_entry_type& cache, + int beta_minus_1) FMT_NOEXCEPT { + return static_cast(cache >> (64 - 1 - beta_minus_1)); + } + + static bool compute_mul_parity(carrier_uint two_f, + const cache_entry_type& cache, + int beta_minus_1) FMT_NOEXCEPT { + FMT_ASSERT(beta_minus_1 >= 1, ""); + FMT_ASSERT(beta_minus_1 < 64, ""); + + return ((umul96_lower64(two_f, cache) >> (64 - beta_minus_1)) & 1) != 0; + } + + static carrier_uint compute_left_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT { + return static_cast( + (cache - (cache >> (float_info::significand_bits + 2))) >> + (64 - float_info::significand_bits - 1 - beta_minus_1)); + } + + static carrier_uint compute_right_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT { + return static_cast( + (cache + (cache >> (float_info::significand_bits + 1))) >> + (64 - float_info::significand_bits - 1 - beta_minus_1)); + } + + static carrier_uint compute_round_up_for_shorter_interval_case( + const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT { + return (static_cast( + cache >> + (64 - float_info::significand_bits - 2 - beta_minus_1)) + + 1) / + 2; + } +}; + +template <> struct cache_accessor { + using carrier_uint = float_info::carrier_uint; + using cache_entry_type = uint128_wrapper; + + static uint128_wrapper get_cached_power(int k) FMT_NOEXCEPT { + FMT_ASSERT(k >= float_info::min_k && k <= float_info::max_k, + "k is out of range"); + +#if FMT_USE_FULL_CACHE_DRAGONBOX + return data::dragonbox_pow10_significands_128[k - + float_info::min_k]; +#else + static const int compression_ratio = 27; + + // Compute base index. + int cache_index = (k - float_info::min_k) / compression_ratio; + int kb = cache_index * compression_ratio + float_info::min_k; + int offset = k - kb; + + // Get base cache. + uint128_wrapper base_cache = + data::dragonbox_pow10_significands_128[cache_index]; + if (offset == 0) return base_cache; + + // Compute the required amount of bit-shift. + int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset; + FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected"); + + // Try to recover the real cache. + uint64_t pow5 = data::powers_of_5_64[offset]; + uint128_wrapper recovered_cache = umul128(base_cache.high(), pow5); + uint128_wrapper middle_low = + umul128(base_cache.low() - (kb < 0 ? 1u : 0u), pow5); + + recovered_cache += middle_low.high(); + + uint64_t high_to_middle = recovered_cache.high() << (64 - alpha); + uint64_t middle_to_low = recovered_cache.low() << (64 - alpha); + + recovered_cache = + uint128_wrapper{(recovered_cache.low() >> alpha) | high_to_middle, + ((middle_low.low() >> alpha) | middle_to_low)}; + + if (kb < 0) recovered_cache += 1; + + // Get error. + int error_idx = (k - float_info::min_k) / 16; + uint32_t error = (data::dragonbox_pow10_recovery_errors[error_idx] >> + ((k - float_info::min_k) % 16) * 2) & + 0x3; + + // Add the error back. + FMT_ASSERT(recovered_cache.low() + error >= recovered_cache.low(), ""); + return {recovered_cache.high(), recovered_cache.low() + error}; +#endif + } + + static carrier_uint compute_mul(carrier_uint u, + const cache_entry_type& cache) FMT_NOEXCEPT { + return umul192_upper64(u, cache); + } + + static uint32_t compute_delta(cache_entry_type const& cache, + int beta_minus_1) FMT_NOEXCEPT { + return static_cast(cache.high() >> (64 - 1 - beta_minus_1)); + } + + static bool compute_mul_parity(carrier_uint two_f, + const cache_entry_type& cache, + int beta_minus_1) FMT_NOEXCEPT { + FMT_ASSERT(beta_minus_1 >= 1, ""); + FMT_ASSERT(beta_minus_1 < 64, ""); + + return ((umul192_middle64(two_f, cache) >> (64 - beta_minus_1)) & 1) != 0; + } + + static carrier_uint compute_left_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT { + return (cache.high() - + (cache.high() >> (float_info::significand_bits + 2))) >> + (64 - float_info::significand_bits - 1 - beta_minus_1); + } + + static carrier_uint compute_right_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT { + return (cache.high() + + (cache.high() >> (float_info::significand_bits + 1))) >> + (64 - float_info::significand_bits - 1 - beta_minus_1); + } + + static carrier_uint compute_round_up_for_shorter_interval_case( + const cache_entry_type& cache, int beta_minus_1) FMT_NOEXCEPT { + return ((cache.high() >> + (64 - float_info::significand_bits - 2 - beta_minus_1)) + + 1) / + 2; + } +}; + +// Various integer checks +template +bool is_left_endpoint_integer_shorter_interval(int exponent) FMT_NOEXCEPT { + return exponent >= + float_info< + T>::case_shorter_interval_left_endpoint_lower_threshold && + exponent <= + float_info::case_shorter_interval_left_endpoint_upper_threshold; +} +template +bool is_endpoint_integer(typename float_info::carrier_uint two_f, + int exponent, int minus_k) FMT_NOEXCEPT { + if (exponent < float_info::case_fc_pm_half_lower_threshold) return false; + // For k >= 0. + if (exponent <= float_info::case_fc_pm_half_upper_threshold) return true; + // For k < 0. + if (exponent > float_info::divisibility_check_by_5_threshold) return false; + return divisible_by_power_of_5(two_f, minus_k); +} + +template +bool is_center_integer(typename float_info::carrier_uint two_f, int exponent, + int minus_k) FMT_NOEXCEPT { + // Exponent for 5 is negative. + if (exponent > float_info::divisibility_check_by_5_threshold) return false; + if (exponent > float_info::case_fc_upper_threshold) + return divisible_by_power_of_5(two_f, minus_k); + // Both exponents are nonnegative. + if (exponent >= float_info::case_fc_lower_threshold) return true; + // Exponent for 2 is negative. + return divisible_by_power_of_2(two_f, minus_k - exponent + 1); +} + +// Remove trailing zeros from n and return the number of zeros removed (float) +FMT_ALWAYS_INLINE int remove_trailing_zeros(uint32_t& n) FMT_NOEXCEPT { +#ifdef FMT_BUILTIN_CTZ + int t = FMT_BUILTIN_CTZ(n); +#else + int t = ctz(n); +#endif + if (t > float_info::max_trailing_zeros) + t = float_info::max_trailing_zeros; + + const uint32_t mod_inv1 = 0xcccccccd; + const uint32_t max_quotient1 = 0x33333333; + const uint32_t mod_inv2 = 0xc28f5c29; + const uint32_t max_quotient2 = 0x0a3d70a3; + + int s = 0; + for (; s < t - 1; s += 2) { + if (n * mod_inv2 > max_quotient2) break; + n *= mod_inv2; + } + if (s < t && n * mod_inv1 <= max_quotient1) { + n *= mod_inv1; + ++s; + } + n >>= s; + return s; +} + +// Removes trailing zeros and returns the number of zeros removed (double) +FMT_ALWAYS_INLINE int remove_trailing_zeros(uint64_t& n) FMT_NOEXCEPT { +#ifdef FMT_BUILTIN_CTZLL + int t = FMT_BUILTIN_CTZLL(n); +#else + int t = ctzll(n); +#endif + if (t > float_info::max_trailing_zeros) + t = float_info::max_trailing_zeros; + // Divide by 10^8 and reduce to 32-bits + // Since ret_value.significand <= (2^64 - 1) / 1000 < 10^17, + // both of the quotient and the r should fit in 32-bits + + const uint32_t mod_inv1 = 0xcccccccd; + const uint32_t max_quotient1 = 0x33333333; + const uint64_t mod_inv8 = 0xc767074b22e90e21; + const uint64_t max_quotient8 = 0x00002af31dc46118; + + // If the number is divisible by 1'0000'0000, work with the quotient + if (t >= 8) { + auto quotient_candidate = n * mod_inv8; + + if (quotient_candidate <= max_quotient8) { + auto quotient = static_cast(quotient_candidate >> 8); + + int s = 8; + for (; s < t; ++s) { + if (quotient * mod_inv1 > max_quotient1) break; + quotient *= mod_inv1; + } + quotient >>= (s - 8); + n = quotient; + return s; + } + } + + // Otherwise, work with the remainder + auto quotient = static_cast(n / 100000000); + auto remainder = static_cast(n - 100000000 * quotient); + + if (t == 0 || remainder * mod_inv1 > max_quotient1) { + return 0; + } + remainder *= mod_inv1; + + if (t == 1 || remainder * mod_inv1 > max_quotient1) { + n = (remainder >> 1) + quotient * 10000000ull; + return 1; + } + remainder *= mod_inv1; + + if (t == 2 || remainder * mod_inv1 > max_quotient1) { + n = (remainder >> 2) + quotient * 1000000ull; + return 2; + } + remainder *= mod_inv1; + + if (t == 3 || remainder * mod_inv1 > max_quotient1) { + n = (remainder >> 3) + quotient * 100000ull; + return 3; + } + remainder *= mod_inv1; + + if (t == 4 || remainder * mod_inv1 > max_quotient1) { + n = (remainder >> 4) + quotient * 10000ull; + return 4; + } + remainder *= mod_inv1; + + if (t == 5 || remainder * mod_inv1 > max_quotient1) { + n = (remainder >> 5) + quotient * 1000ull; + return 5; + } + remainder *= mod_inv1; + + if (t == 6 || remainder * mod_inv1 > max_quotient1) { + n = (remainder >> 6) + quotient * 100ull; + return 6; + } + remainder *= mod_inv1; + + n = (remainder >> 7) + quotient * 10ull; + return 7; +} + +// The main algorithm for shorter interval case +template +FMT_ALWAYS_INLINE FMT_SAFEBUFFERS decimal_fp shorter_interval_case( + int exponent) FMT_NOEXCEPT { + decimal_fp ret_value; + // Compute k and beta + const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent); + const int beta_minus_1 = exponent + floor_log2_pow10(-minus_k); + + // Compute xi and zi + using cache_entry_type = typename cache_accessor::cache_entry_type; + const cache_entry_type cache = cache_accessor::get_cached_power(-minus_k); + + auto xi = cache_accessor::compute_left_endpoint_for_shorter_interval_case( + cache, beta_minus_1); + auto zi = cache_accessor::compute_right_endpoint_for_shorter_interval_case( + cache, beta_minus_1); + + // If the left endpoint is not an integer, increase it + if (!is_left_endpoint_integer_shorter_interval(exponent)) ++xi; + + // Try bigger divisor + ret_value.significand = zi / 10; + + // If succeed, remove trailing zeros if necessary and return + if (ret_value.significand * 10 >= xi) { + ret_value.exponent = minus_k + 1; + ret_value.exponent += remove_trailing_zeros(ret_value.significand); + return ret_value; + } + + // Otherwise, compute the round-up of y + ret_value.significand = + cache_accessor::compute_round_up_for_shorter_interval_case( + cache, beta_minus_1); + ret_value.exponent = minus_k; + + // When tie occurs, choose one of them according to the rule + if (exponent >= float_info::shorter_interval_tie_lower_threshold && + exponent <= float_info::shorter_interval_tie_upper_threshold) { + ret_value.significand = ret_value.significand % 2 == 0 + ? ret_value.significand + : ret_value.significand - 1; + } else if (ret_value.significand < xi) { + ++ret_value.significand; + } + return ret_value; +} + +template +FMT_SAFEBUFFERS decimal_fp to_decimal(T x) FMT_NOEXCEPT { + // Step 1: integer promotion & Schubfach multiplier calculation. + + using carrier_uint = typename float_info::carrier_uint; + using cache_entry_type = typename cache_accessor::cache_entry_type; + auto br = bit_cast(x); + + // Extract significand bits and exponent bits. + const carrier_uint significand_mask = + (static_cast(1) << float_info::significand_bits) - 1; + carrier_uint significand = (br & significand_mask); + int exponent = static_cast((br & exponent_mask()) >> + float_info::significand_bits); + + if (exponent != 0) { // Check if normal. + exponent += float_info::exponent_bias - float_info::significand_bits; + + // Shorter interval case; proceed like Schubfach. + if (significand == 0) return shorter_interval_case(exponent); + + significand |= + (static_cast(1) << float_info::significand_bits); + } else { + // Subnormal case; the interval is always regular. + if (significand == 0) return {0, 0}; + exponent = float_info::min_exponent - float_info::significand_bits; + } + + const bool include_left_endpoint = (significand % 2 == 0); + const bool include_right_endpoint = include_left_endpoint; + + // Compute k and beta. + const int minus_k = floor_log10_pow2(exponent) - float_info::kappa; + const cache_entry_type cache = cache_accessor::get_cached_power(-minus_k); + const int beta_minus_1 = exponent + floor_log2_pow10(-minus_k); + + // Compute zi and deltai + // 10^kappa <= deltai < 10^(kappa + 1) + const uint32_t deltai = cache_accessor::compute_delta(cache, beta_minus_1); + const carrier_uint two_fc = significand << 1; + const carrier_uint two_fr = two_fc | 1; + const carrier_uint zi = + cache_accessor::compute_mul(two_fr << beta_minus_1, cache); + + // Step 2: Try larger divisor; remove trailing zeros if necessary + + // Using an upper bound on zi, we might be able to optimize the division + // better than the compiler; we are computing zi / big_divisor here + decimal_fp ret_value; + ret_value.significand = divide_by_10_to_kappa_plus_1(zi); + uint32_t r = static_cast(zi - float_info::big_divisor * + ret_value.significand); + + if (r > deltai) { + goto small_divisor_case_label; + } else if (r < deltai) { + // Exclude the right endpoint if necessary + if (r == 0 && !include_right_endpoint && + is_endpoint_integer(two_fr, exponent, minus_k)) { + --ret_value.significand; + r = float_info::big_divisor; + goto small_divisor_case_label; + } + } else { + // r == deltai; compare fractional parts + // Check conditions in the order different from the paper + // to take advantage of short-circuiting + const carrier_uint two_fl = two_fc - 1; + if ((!include_left_endpoint || + !is_endpoint_integer(two_fl, exponent, minus_k)) && + !cache_accessor::compute_mul_parity(two_fl, cache, beta_minus_1)) { + goto small_divisor_case_label; + } + } + ret_value.exponent = minus_k + float_info::kappa + 1; + + // We may need to remove trailing zeros + ret_value.exponent += remove_trailing_zeros(ret_value.significand); + return ret_value; + + // Step 3: Find the significand with the smaller divisor + +small_divisor_case_label: + ret_value.significand *= 10; + ret_value.exponent = minus_k + float_info::kappa; + + const uint32_t mask = (1u << float_info::kappa) - 1; + auto dist = r - (deltai / 2) + (float_info::small_divisor / 2); + + // Is dist divisible by 2^kappa? + if ((dist & mask) == 0) { + const bool approx_y_parity = + ((dist ^ (float_info::small_divisor / 2)) & 1) != 0; + dist >>= float_info::kappa; + + // Is dist divisible by 5^kappa? + if (check_divisibility_and_divide_by_pow5::kappa>(dist)) { + ret_value.significand += dist; + + // Check z^(f) >= epsilon^(f) + // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1, + // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f) + // Since there are only 2 possibilities, we only need to care about the + // parity. Also, zi and r should have the same parity since the divisor + // is an even number + if (cache_accessor::compute_mul_parity(two_fc, cache, beta_minus_1) != + approx_y_parity) { + --ret_value.significand; + } else { + // If z^(f) >= epsilon^(f), we might have a tie + // when z^(f) == epsilon^(f), or equivalently, when y is an integer + if (is_center_integer(two_fc, exponent, minus_k)) { + ret_value.significand = ret_value.significand % 2 == 0 + ? ret_value.significand + : ret_value.significand - 1; + } + } + } + // Is dist not divisible by 5^kappa? + else { + ret_value.significand += dist; + } + } + // Is dist not divisible by 2^kappa? + else { + // Since we know dist is small, we might be able to optimize the division + // better than the compiler; we are computing dist / small_divisor here + ret_value.significand += + small_division_by_pow10::kappa>(dist); + } + return ret_value; +} +} // namespace dragonbox + +// Formats value using a variation of the Fixed-Precision Positive +// Floating-Point Printout ((FPP)^2) algorithm by Steele & White: +// https://fmt.dev/p372-steele.pdf. +template +void fallback_format(Double d, int num_digits, bool binary32, buffer& buf, + int& exp10) { + bigint numerator; // 2 * R in (FPP)^2. + bigint denominator; // 2 * S in (FPP)^2. + // lower and upper are differences between value and corresponding boundaries. + bigint lower; // (M^- in (FPP)^2). + bigint upper_store; // upper's value if different from lower. + bigint* upper = nullptr; // (M^+ in (FPP)^2). + fp value; + // Shift numerator and denominator by an extra bit or two (if lower boundary + // is closer) to make lower and upper integers. This eliminates multiplication + // by 2 during later computations. + const bool is_predecessor_closer = + binary32 ? value.assign(static_cast(d)) : value.assign(d); + int shift = is_predecessor_closer ? 2 : 1; + uint64_t significand = value.f << shift; + if (value.e >= 0) { + numerator.assign(significand); + numerator <<= value.e; + lower.assign(1); + lower <<= value.e; + if (shift != 1) { + upper_store.assign(1); + upper_store <<= value.e + 1; + upper = &upper_store; + } + denominator.assign_pow10(exp10); + denominator <<= shift; + } else if (exp10 < 0) { + numerator.assign_pow10(-exp10); + lower.assign(numerator); + if (shift != 1) { + upper_store.assign(numerator); + upper_store <<= 1; + upper = &upper_store; + } + numerator *= significand; + denominator.assign(1); + denominator <<= shift - value.e; + } else { + numerator.assign(significand); + denominator.assign_pow10(exp10); + denominator <<= shift - value.e; + lower.assign(1); + if (shift != 1) { + upper_store.assign(1ULL << 1); + upper = &upper_store; + } + } + // Invariant: value == (numerator / denominator) * pow(10, exp10). + if (num_digits < 0) { + // Generate the shortest representation. + if (!upper) upper = &lower; + bool even = (value.f & 1) == 0; + num_digits = 0; + char* data = buf.data(); + for (;;) { + int digit = numerator.divmod_assign(denominator); + bool low = compare(numerator, lower) - even < 0; // numerator <[=] lower. + // numerator + upper >[=] pow10: + bool high = add_compare(numerator, *upper, denominator) + even > 0; + data[num_digits++] = static_cast('0' + digit); + if (low || high) { + if (!low) { + ++data[num_digits - 1]; + } else if (high) { + int result = add_compare(numerator, numerator, denominator); + // Round half to even. + if (result > 0 || (result == 0 && (digit % 2) != 0)) + ++data[num_digits - 1]; + } + buf.try_resize(to_unsigned(num_digits)); + exp10 -= num_digits - 1; + return; + } + numerator *= 10; + lower *= 10; + if (upper != &lower) *upper *= 10; + } + } + // Generate the given number of digits. + exp10 -= num_digits - 1; + if (num_digits == 0) { + buf.try_resize(1); + denominator *= 10; + buf[0] = add_compare(numerator, numerator, denominator) > 0 ? '1' : '0'; + return; + } + buf.try_resize(to_unsigned(num_digits)); + for (int i = 0; i < num_digits - 1; ++i) { + int digit = numerator.divmod_assign(denominator); + buf[i] = static_cast('0' + digit); + numerator *= 10; + } + int digit = numerator.divmod_assign(denominator); + auto result = add_compare(numerator, numerator, denominator); + if (result > 0 || (result == 0 && (digit % 2) != 0)) { + if (digit == 9) { + const auto overflow = '0' + 10; + buf[num_digits - 1] = overflow; + // Propagate the carry. + for (int i = num_digits - 1; i > 0 && buf[i] == overflow; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] == overflow) { + buf[0] = '1'; + ++exp10; + } + return; + } + ++digit; + } + buf[num_digits - 1] = static_cast('0' + digit); +} + +template +int format_float(T value, int precision, float_specs specs, buffer& buf) { + static_assert(!std::is_same::value, ""); + FMT_ASSERT(value >= 0, "value is negative"); + + const bool fixed = specs.format == float_format::fixed; + if (value <= 0) { // <= instead of == to silence a warning. + if (precision <= 0 || !fixed) { + buf.push_back('0'); + return 0; + } + buf.try_resize(to_unsigned(precision)); + std::uninitialized_fill_n(buf.data(), precision, '0'); + return -precision; + } + + if (!specs.use_grisu) return snprintf_float(value, precision, specs, buf); + + if (precision < 0) { + // Use Dragonbox for the shortest format. + if (specs.binary32) { + auto dec = dragonbox::to_decimal(static_cast(value)); + write(buffer_appender(buf), dec.significand); + return dec.exponent; + } + auto dec = dragonbox::to_decimal(static_cast(value)); + write(buffer_appender(buf), dec.significand); + return dec.exponent; + } + + // Use Grisu + Dragon4 for the given precision: + // https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf. + int exp = 0; + const int min_exp = -60; // alpha in Grisu. + int cached_exp10 = 0; // K in Grisu. + fp normalized = normalize(fp(value)); + const auto cached_pow = get_cached_power( + min_exp - (normalized.e + fp::significand_size), cached_exp10); + normalized = normalized * cached_pow; + // Limit precision to the maximum possible number of significant digits in an + // IEEE754 double because we don't need to generate zeros. + const int max_double_digits = 767; + if (precision > max_double_digits) precision = max_double_digits; + fixed_handler handler{buf.data(), 0, precision, -cached_exp10, fixed}; + if (grisu_gen_digits(normalized, 1, exp, handler) == digits::error) { + exp += handler.size - cached_exp10 - 1; + fallback_format(value, handler.precision, specs.binary32, buf, exp); + } else { + exp += handler.exp10; + buf.try_resize(to_unsigned(handler.size)); + } + if (!fixed && !specs.showpoint) { + // Remove trailing zeros. + auto num_digits = buf.size(); + while (num_digits > 0 && buf[num_digits - 1] == '0') { + --num_digits; + ++exp; + } + buf.try_resize(num_digits); + } + return exp; +} // namespace detail + +template +int snprintf_float(T value, int precision, float_specs specs, + buffer& buf) { + // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail. + FMT_ASSERT(buf.capacity() > buf.size(), "empty buffer"); + static_assert(!std::is_same::value, ""); + + // Subtract 1 to account for the difference in precision since we use %e for + // both general and exponent format. + if (specs.format == float_format::general || + specs.format == float_format::exp) + precision = (precision >= 0 ? precision : 6) - 1; + + // Build the format string. + enum { max_format_size = 7 }; // The longest format is "%#.*Le". + char format[max_format_size]; + char* format_ptr = format; + *format_ptr++ = '%'; + if (specs.showpoint && specs.format == float_format::hex) *format_ptr++ = '#'; + if (precision >= 0) { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + if (std::is_same()) *format_ptr++ = 'L'; + *format_ptr++ = specs.format != float_format::hex + ? (specs.format == float_format::fixed ? 'f' : 'e') + : (specs.upper ? 'A' : 'a'); + *format_ptr = '\0'; + + // Format using snprintf. + auto offset = buf.size(); + for (;;) { + auto begin = buf.data() + offset; + auto capacity = buf.capacity() - offset; +#ifdef FMT_FUZZ + if (precision > 100000) + throw std::runtime_error( + "fuzz mode - avoid large allocation inside snprintf"); +#endif + // Suppress the warning about a nonliteral format string. + // Cannot use auto because of a bug in MinGW (#1532). + int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF; + int result = precision >= 0 + ? snprintf_ptr(begin, capacity, format, precision, value) + : snprintf_ptr(begin, capacity, format, value); + if (result < 0) { + // The buffer will grow exponentially. + buf.try_reserve(buf.capacity() + 1); + continue; + } + auto size = to_unsigned(result); + // Size equal to capacity means that the last character was truncated. + if (size >= capacity) { + buf.try_reserve(size + offset + 1); // Add 1 for the terminating '\0'. + continue; + } + auto is_digit = [](char c) { return c >= '0' && c <= '9'; }; + if (specs.format == float_format::fixed) { + if (precision == 0) { + buf.try_resize(size); + return 0; + } + // Find and remove the decimal point. + auto end = begin + size, p = end; + do { + --p; + } while (is_digit(*p)); + int fraction_size = static_cast(end - p - 1); + std::memmove(p, p + 1, to_unsigned(fraction_size)); + buf.try_resize(size - 1); + return -fraction_size; + } + if (specs.format == float_format::hex) { + buf.try_resize(size + offset); + return 0; + } + // Find and parse the exponent. + auto end = begin + size, exp_pos = end; + do { + --exp_pos; + } while (*exp_pos != 'e'); + char sign = exp_pos[1]; + assert(sign == '+' || sign == '-'); + int exp = 0; + auto p = exp_pos + 2; // Skip 'e' and sign. + do { + assert(is_digit(*p)); + exp = exp * 10 + (*p++ - '0'); + } while (p != end); + if (sign == '-') exp = -exp; + int fraction_size = 0; + if (exp_pos != begin + 1) { + // Remove trailing zeros. + auto fraction_end = exp_pos - 1; + while (*fraction_end == '0') --fraction_end; + // Move the fractional part left to get rid of the decimal point. + fraction_size = static_cast(fraction_end - begin - 1); + std::memmove(begin + 1, begin + 2, to_unsigned(fraction_size)); + } + buf.try_resize(to_unsigned(fraction_size) + offset + 1); + return exp - fraction_size; + } +} + +// A public domain branchless UTF-8 decoder by Christopher Wellons: +// https://github.com/skeeto/branchless-utf8 +/* Decode the next character, c, from buf, reporting errors in e. + * + * Since this is a branchless decoder, four bytes will be read from the + * buffer regardless of the actual length of the next character. This + * means the buffer _must_ have at least three bytes of zero padding + * following the end of the data stream. + * + * Errors are reported in e, which will be non-zero if the parsed + * character was somehow invalid: invalid byte sequence, non-canonical + * encoding, or a surrogate half. + * + * The function returns a pointer to the next character. When an error + * occurs, this pointer will be a guess that depends on the particular + * error, but it will always advance at least one byte. + */ +inline const char* utf8_decode(const char* buf, uint32_t* c, int* e) { + static const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07}; + static const uint32_t mins[] = {4194304, 0, 128, 2048, 65536}; + static const int shiftc[] = {0, 18, 12, 6, 0}; + static const int shifte[] = {0, 6, 4, 2, 0}; + + int len = code_point_length(buf); + const char* next = buf + len; + + // Assume a four-byte character and load four bytes. Unused bits are + // shifted out. + auto s = reinterpret_cast(buf); + *c = uint32_t(s[0] & masks[len]) << 18; + *c |= uint32_t(s[1] & 0x3f) << 12; + *c |= uint32_t(s[2] & 0x3f) << 6; + *c |= uint32_t(s[3] & 0x3f) << 0; + *c >>= shiftc[len]; + + // Accumulate the various error conditions. + *e = (*c < mins[len]) << 6; // non-canonical encoding + *e |= ((*c >> 11) == 0x1b) << 7; // surrogate half? + *e |= (*c > 0x10FFFF) << 8; // out of range? + *e |= (s[1] & 0xc0) >> 2; + *e |= (s[2] & 0xc0) >> 4; + *e |= (s[3]) >> 6; + *e ^= 0x2a; // top two bits of each tail byte correct? + *e >>= shifte[len]; + + return next; +} + +struct stringifier { + template FMT_INLINE std::string operator()(T value) const { + return to_string(value); + } + std::string operator()(basic_format_arg::handle h) const { + memory_buffer buf; + format_parse_context parse_ctx({}); + format_context format_ctx(buffer_appender(buf), {}, {}); + h.format(parse_ctx, format_ctx); + return to_string(buf); + } +}; +} // namespace detail + +template <> struct formatter { + format_parse_context::iterator parse(format_parse_context& ctx) { + return ctx.begin(); + } + + format_context::iterator format(const detail::bigint& n, + format_context& ctx) { + auto out = ctx.out(); + bool first = true; + for (auto i = n.bigits_.size(); i > 0; --i) { + auto value = n.bigits_[i - 1u]; + if (first) { + out = format_to(out, "{:x}", value); + first = false; + continue; + } + out = format_to(out, "{:08x}", value); + } + if (n.exp_ > 0) + out = format_to(out, "p{}", n.exp_ * detail::bigint::bigit_bits); + return out; + } +}; + +FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) { + auto transcode = [this](const char* p) { + auto cp = uint32_t(); + auto error = 0; + p = utf8_decode(p, &cp, &error); + if (error != 0) FMT_THROW(std::runtime_error("invalid utf8")); + if (cp <= 0xFFFF) { + buffer_.push_back(static_cast(cp)); + } else { + cp -= 0x10000; + buffer_.push_back(static_cast(0xD800 + (cp >> 10))); + buffer_.push_back(static_cast(0xDC00 + (cp & 0x3FF))); + } + return p; + }; + auto p = s.data(); + const size_t block_size = 4; // utf8_decode always reads blocks of 4 chars. + if (s.size() >= block_size) { + for (auto end = p + s.size() - block_size + 1; p < end;) p = transcode(p); + } + if (auto num_chars_left = s.data() + s.size() - p) { + char buf[2 * block_size - 1] = {}; + memcpy(buf, p, to_unsigned(num_chars_left)); + p = buf; + do { + p = transcode(p); + } while (p - buf < num_chars_left); + } + buffer_.push_back(0); +} + +FMT_FUNC void format_system_error(detail::buffer& out, int error_code, + string_view message) FMT_NOEXCEPT { + FMT_TRY { + memory_buffer buf; + buf.resize(inline_buffer_size); + for (;;) { + char* system_message = &buf[0]; + int result = + detail::safe_strerror(error_code, system_message, buf.size()); + if (result == 0) { + format_to(detail::buffer_appender(out), "{}: {}", message, + system_message); + return; + } + if (result != ERANGE) + break; // Can't get error message, report error code instead. + buf.resize(buf.size() * 2); + } + } + FMT_CATCH(...) {} + format_error_code(out, error_code, message); +} + +FMT_FUNC void detail::error_handler::on_error(const char* message) { + FMT_THROW(format_error(message)); +} + +FMT_FUNC void report_system_error(int error_code, + fmt::string_view message) FMT_NOEXCEPT { + report_error(format_system_error, error_code, message); +} + +FMT_FUNC std::string detail::vformat(string_view format_str, format_args args) { + if (format_str.size() == 2 && equal2(format_str.data(), "{}")) { + auto arg = args.get(0); + if (!arg) error_handler().on_error("argument not found"); + return visit_format_arg(stringifier(), arg); + } + memory_buffer buffer; + detail::vformat_to(buffer, format_str, args); + return to_string(buffer); +} + +#ifdef _WIN32 +namespace detail { +using dword = conditional_t; +extern "C" __declspec(dllimport) int __stdcall WriteConsoleW( // + void*, const void*, dword, dword*, void*); +} // namespace detail +#endif + +FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) { + memory_buffer buffer; + detail::vformat_to(buffer, format_str, + basic_format_args>(args)); +#ifdef _WIN32 + auto fd = _fileno(f); + if (_isatty(fd)) { + detail::utf8_to_utf16 u16(string_view(buffer.data(), buffer.size())); + auto written = detail::dword(); + if (!detail::WriteConsoleW(reinterpret_cast(_get_osfhandle(fd)), + u16.c_str(), static_cast(u16.size()), + &written, nullptr)) { + FMT_THROW(format_error("failed to write to console")); + } + return; + } +#endif + detail::fwrite_fully(buffer.data(), 1, buffer.size(), f); +} + +#ifdef _WIN32 +// Print assuming legacy (non-Unicode) encoding. +FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str, + format_args args) { + memory_buffer buffer; + detail::vformat_to(buffer, format_str, + basic_format_args>(args)); + fwrite_fully(buffer.data(), 1, buffer.size(), f); +} +#endif + +FMT_FUNC void vprint(string_view format_str, format_args args) { + vprint(stdout, format_str, args); +} + +FMT_END_NAMESPACE + +#endif // FMT_FORMAT_INL_H_ diff --git a/src/3rdparty/fmt/format.h b/src/3rdparty/fmt/format.h new file mode 100644 index 0000000000..1a037b02b7 --- /dev/null +++ b/src/3rdparty/fmt/format.h @@ -0,0 +1,3960 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - present, Victor Zverovich + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + --- Optional exception to the license --- + + As an exception, if, as a result of your compiling your source code, portions + of this Software are embedded into a machine-executable object form of such + source code, you may redistribute such embedded portions in such object form + without including the above copyright and permission notices. + */ + +#ifndef FMT_FORMAT_H_ +#define FMT_FORMAT_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "core.h" + +#ifdef __INTEL_COMPILER +# define FMT_ICC_VERSION __INTEL_COMPILER +#elif defined(__ICL) +# define FMT_ICC_VERSION __ICL +#else +# define FMT_ICC_VERSION 0 +#endif + +#ifdef __NVCC__ +# define FMT_CUDA_VERSION (__CUDACC_VER_MAJOR__ * 100 + __CUDACC_VER_MINOR__) +#else +# define FMT_CUDA_VERSION 0 +#endif + +#ifdef __has_builtin +# define FMT_HAS_BUILTIN(x) __has_builtin(x) +#else +# define FMT_HAS_BUILTIN(x) 0 +#endif + +#if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_NOINLINE __attribute__((noinline)) +#else +# define FMT_NOINLINE +#endif + +#if __cplusplus == 201103L || __cplusplus == 201402L +# if defined(__INTEL_COMPILER) || defined(__PGI) +# define FMT_FALLTHROUGH +# elif defined(__clang__) +# define FMT_FALLTHROUGH [[clang::fallthrough]] +# elif FMT_GCC_VERSION >= 700 && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 520) +# define FMT_FALLTHROUGH [[gnu::fallthrough]] +# else +# define FMT_FALLTHROUGH +# endif +#elif FMT_HAS_CPP17_ATTRIBUTE(fallthrough) || \ + (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define FMT_FALLTHROUGH [[fallthrough]] +#else +# define FMT_FALLTHROUGH +#endif + +#ifndef FMT_MAYBE_UNUSED +# if FMT_HAS_CPP17_ATTRIBUTE(maybe_unused) +# define FMT_MAYBE_UNUSED [[maybe_unused]] +# else +# define FMT_MAYBE_UNUSED +# endif +#endif + +#ifndef FMT_THROW +# if FMT_EXCEPTIONS +# if FMT_MSC_VER || FMT_NVCC +FMT_BEGIN_NAMESPACE +namespace detail { +template inline void do_throw(const Exception& x) { + // Silence unreachable code warnings in MSVC and NVCC because these + // are nearly impossible to fix in a generic code. + volatile bool b = true; + if (b) throw x; +} +} // namespace detail +FMT_END_NAMESPACE +# define FMT_THROW(x) detail::do_throw(x) +# else +# define FMT_THROW(x) throw x +# endif +# else +# define FMT_THROW(x) \ + do { \ + static_cast(sizeof(x)); \ + FMT_ASSERT(false, ""); \ + } while (false) +# endif +#endif + +#if FMT_EXCEPTIONS +# define FMT_TRY try +# define FMT_CATCH(x) catch (x) +#else +# define FMT_TRY if (true) +# define FMT_CATCH(x) if (false) +#endif + +#ifndef FMT_USE_USER_DEFINED_LITERALS +// EDG based compilers (Intel, NVIDIA, Elbrus, etc), GCC and MSVC support UDLs. +# if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \ + FMT_MSC_VER >= 1900) && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= /* UDL feature */ 480) +# define FMT_USE_USER_DEFINED_LITERALS 1 +# else +# define FMT_USE_USER_DEFINED_LITERALS 0 +# endif +#endif + +#ifndef FMT_USE_UDL_TEMPLATE +// EDG frontend based compilers (icc, nvcc, PGI, etc) and GCC < 6.4 do not +// properly support UDL templates and GCC >= 9 warns about them. +# if FMT_USE_USER_DEFINED_LITERALS && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 501) && \ + ((FMT_GCC_VERSION >= 604 && __cplusplus >= 201402L) || \ + FMT_CLANG_VERSION >= 304) && \ + !defined(__PGI) && !defined(__NVCC__) +# define FMT_USE_UDL_TEMPLATE 1 +# else +# define FMT_USE_UDL_TEMPLATE 0 +# endif +#endif + +#ifndef FMT_USE_FLOAT +# define FMT_USE_FLOAT 1 +#endif + +#ifndef FMT_USE_DOUBLE +# define FMT_USE_DOUBLE 1 +#endif + +#ifndef FMT_USE_LONG_DOUBLE +# define FMT_USE_LONG_DOUBLE 1 +#endif + +// Defining FMT_REDUCE_INT_INSTANTIATIONS to 1, will reduce the number of +// int_writer template instances to just one by only using the largest integer +// type. This results in a reduction in binary size but will cause a decrease in +// integer formatting performance. +#if !defined(FMT_REDUCE_INT_INSTANTIATIONS) +# define FMT_REDUCE_INT_INSTANTIATIONS 0 +#endif + +// __builtin_clz is broken in clang with Microsoft CodeGen: +// https://github.com/fmtlib/fmt/issues/519 +#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clz)) && !FMT_MSC_VER +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +#endif +#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clzll)) && !FMT_MSC_VER +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +#endif +#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_ctz)) +# define FMT_BUILTIN_CTZ(n) __builtin_ctz(n) +#endif +#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_ctzll)) +# define FMT_BUILTIN_CTZLL(n) __builtin_ctzll(n) +#endif + +#if FMT_MSC_VER +# include // _BitScanReverse[64], _BitScanForward[64], _umul128 +#endif + +// Some compilers masquerade as both MSVC and GCC-likes or otherwise support +// __builtin_clz and __builtin_clzll, so only define FMT_BUILTIN_CLZ using the +// MSVC intrinsics if the clz and clzll builtins are not available. +#if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL) && \ + !defined(FMT_BUILTIN_CTZLL) && !defined(_MANAGED) +FMT_BEGIN_NAMESPACE +namespace detail { +// Avoid Clang with Microsoft CodeGen's -Wunknown-pragmas warning. +# ifndef __clang__ +# pragma intrinsic(_BitScanForward) +# pragma intrinsic(_BitScanReverse) +# endif +# if defined(_WIN64) && !defined(__clang__) +# pragma intrinsic(_BitScanForward64) +# pragma intrinsic(_BitScanReverse64) +# endif + +inline int clz(uint32_t x) { + unsigned long r = 0; + _BitScanReverse(&r, x); + FMT_ASSERT(x != 0, ""); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. + FMT_SUPPRESS_MSC_WARNING(6102) + return 31 ^ static_cast(r); +} +# define FMT_BUILTIN_CLZ(n) detail::clz(n) + +inline int clzll(uint64_t x) { + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) return 63 ^ (r + 32); + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x)); +# endif + FMT_ASSERT(x != 0, ""); + FMT_SUPPRESS_MSC_WARNING(6102) // Suppress a bogus static analysis warning. + return 63 ^ static_cast(r); +} +# define FMT_BUILTIN_CLZLL(n) detail::clzll(n) + +inline int ctz(uint32_t x) { + unsigned long r = 0; + _BitScanForward(&r, x); + FMT_ASSERT(x != 0, ""); + FMT_SUPPRESS_MSC_WARNING(6102) // Suppress a bogus static analysis warning. + return static_cast(r); +} +# define FMT_BUILTIN_CTZ(n) detail::ctz(n) + +inline int ctzll(uint64_t x) { + unsigned long r = 0; + FMT_ASSERT(x != 0, ""); + FMT_SUPPRESS_MSC_WARNING(6102) // Suppress a bogus static analysis warning. +# ifdef _WIN64 + _BitScanForward64(&r, x); +# else + // Scan the low 32 bits. + if (_BitScanForward(&r, static_cast(x))) return static_cast(r); + // Scan the high 32 bits. + _BitScanForward(&r, static_cast(x >> 32)); + r += 32; +# endif + return static_cast(r); +} +# define FMT_BUILTIN_CTZLL(n) detail::ctzll(n) +} // namespace detail +FMT_END_NAMESPACE +#endif + +// Enable the deprecated numeric alignment. +#ifndef FMT_DEPRECATED_NUMERIC_ALIGN +# define FMT_DEPRECATED_NUMERIC_ALIGN 0 +#endif + +FMT_BEGIN_NAMESPACE +namespace detail { + +// An equivalent of `*reinterpret_cast(&source)` that doesn't have +// undefined behavior (e.g. due to type aliasing). +// Example: uint64_t d = bit_cast(2.718); +template +inline Dest bit_cast(const Source& source) { + static_assert(sizeof(Dest) == sizeof(Source), "size mismatch"); + Dest dest; + std::memcpy(&dest, &source, sizeof(dest)); + return dest; +} + +inline bool is_big_endian() { + const auto u = 1u; + struct bytes { + char data[sizeof(u)]; + }; + return bit_cast(u).data[0] == 0; +} + +// A fallback implementation of uintptr_t for systems that lack it. +struct fallback_uintptr { + unsigned char value[sizeof(void*)]; + + fallback_uintptr() = default; + explicit fallback_uintptr(const void* p) { + *this = bit_cast(p); + if (is_big_endian()) { + for (size_t i = 0, j = sizeof(void*) - 1; i < j; ++i, --j) + std::swap(value[i], value[j]); + } + } +}; +#ifdef UINTPTR_MAX +using uintptr_t = ::uintptr_t; +inline uintptr_t to_uintptr(const void* p) { return bit_cast(p); } +#else +using uintptr_t = fallback_uintptr; +inline fallback_uintptr to_uintptr(const void* p) { + return fallback_uintptr(p); +} +#endif + +// Returns the largest possible value for type T. Same as +// std::numeric_limits::max() but shorter and not affected by the max macro. +template constexpr T max_value() { + return (std::numeric_limits::max)(); +} +template constexpr int num_bits() { + return std::numeric_limits::digits; +} +// std::numeric_limits::digits may return 0 for 128-bit ints. +template <> constexpr int num_bits() { return 128; } +template <> constexpr int num_bits() { return 128; } +template <> constexpr int num_bits() { + return static_cast(sizeof(void*) * + std::numeric_limits::digits); +} + +FMT_INLINE void assume(bool condition) { + (void)condition; +#if FMT_HAS_BUILTIN(__builtin_assume) + __builtin_assume(condition); +#endif +} + +// An approximation of iterator_t for pre-C++20 systems. +template +using iterator_t = decltype(std::begin(std::declval())); +template using sentinel_t = decltype(std::end(std::declval())); + +// A workaround for std::string not having mutable data() until C++17. +template inline Char* get_data(std::basic_string& s) { + return &s[0]; +} +template +inline typename Container::value_type* get_data(Container& c) { + return c.data(); +} + +#if defined(_SECURE_SCL) && _SECURE_SCL +// Make a checked iterator to avoid MSVC warnings. +template using checked_ptr = stdext::checked_array_iterator; +template checked_ptr make_checked(T* p, size_t size) { + return {p, size}; +} +#else +template using checked_ptr = T*; +template inline T* make_checked(T* p, size_t) { return p; } +#endif + +template ::value)> +#if FMT_CLANG_VERSION +__attribute__((no_sanitize("undefined"))) +#endif +inline checked_ptr +reserve(std::back_insert_iterator it, size_t n) { + Container& c = get_container(it); + size_t size = c.size(); + c.resize(size + n); + return make_checked(get_data(c) + size, n); +} + +template +inline buffer_appender reserve(buffer_appender it, size_t n) { + buffer& buf = get_container(it); + buf.try_reserve(buf.size() + n); + return it; +} + +template inline Iterator& reserve(Iterator& it, size_t) { + return it; +} + +template +constexpr T* to_pointer(OutputIt, size_t) { + return nullptr; +} +template T* to_pointer(buffer_appender it, size_t n) { + buffer& buf = get_container(it); + auto size = buf.size(); + if (buf.capacity() < size + n) return nullptr; + buf.try_resize(size + n); + return buf.data() + size; +} + +template ::value)> +inline std::back_insert_iterator base_iterator( + std::back_insert_iterator& it, + checked_ptr) { + return it; +} + +template +inline Iterator base_iterator(Iterator, Iterator it) { + return it; +} + +// An output iterator that counts the number of objects written to it and +// discards them. +class counting_iterator { + private: + size_t count_; + + public: + using iterator_category = std::output_iterator_tag; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = void; + using _Unchecked_type = counting_iterator; // Mark iterator as checked. + + struct value_type { + template void operator=(const T&) {} + }; + + counting_iterator() : count_(0) {} + + size_t count() const { return count_; } + + counting_iterator& operator++() { + ++count_; + return *this; + } + counting_iterator operator++(int) { + auto it = *this; + ++*this; + return it; + } + + friend counting_iterator operator+(counting_iterator it, difference_type n) { + it.count_ += static_cast(n); + return it; + } + + value_type operator*() const { return {}; } +}; + +template class truncating_iterator_base { + protected: + OutputIt out_; + size_t limit_; + size_t count_; + + truncating_iterator_base(OutputIt out, size_t limit) + : out_(out), limit_(limit), count_(0) {} + + public: + using iterator_category = std::output_iterator_tag; + using value_type = typename std::iterator_traits::value_type; + using difference_type = void; + using pointer = void; + using reference = void; + using _Unchecked_type = + truncating_iterator_base; // Mark iterator as checked. + + OutputIt base() const { return out_; } + size_t count() const { return count_; } +}; + +// An output iterator that truncates the output and counts the number of objects +// written to it. +template ::value_type>::type> +class truncating_iterator; + +template +class truncating_iterator + : public truncating_iterator_base { + mutable typename truncating_iterator_base::value_type blackhole_; + + public: + using value_type = typename truncating_iterator_base::value_type; + + truncating_iterator(OutputIt out, size_t limit) + : truncating_iterator_base(out, limit) {} + + truncating_iterator& operator++() { + if (this->count_++ < this->limit_) ++this->out_; + return *this; + } + + truncating_iterator operator++(int) { + auto it = *this; + ++*this; + return it; + } + + value_type& operator*() const { + return this->count_ < this->limit_ ? *this->out_ : blackhole_; + } +}; + +template +class truncating_iterator + : public truncating_iterator_base { + public: + truncating_iterator(OutputIt out, size_t limit) + : truncating_iterator_base(out, limit) {} + + template truncating_iterator& operator=(T val) { + if (this->count_++ < this->limit_) *this->out_++ = val; + return *this; + } + + truncating_iterator& operator++() { return *this; } + truncating_iterator& operator++(int) { return *this; } + truncating_iterator& operator*() { return *this; } +}; + +template +inline size_t count_code_points(basic_string_view s) { + return s.size(); +} + +// Counts the number of code points in a UTF-8 string. +inline size_t count_code_points(basic_string_view s) { + const char* data = s.data(); + size_t num_code_points = 0; + for (size_t i = 0, size = s.size(); i != size; ++i) { + if ((data[i] & 0xc0) != 0x80) ++num_code_points; + } + return num_code_points; +} + +inline size_t count_code_points(basic_string_view s) { + return count_code_points(basic_string_view( + reinterpret_cast(s.data()), s.size())); +} + +template +inline size_t code_point_index(basic_string_view s, size_t n) { + size_t size = s.size(); + return n < size ? n : size; +} + +// Calculates the index of the nth code point in a UTF-8 string. +inline size_t code_point_index(basic_string_view s, size_t n) { + const char8_type* data = s.data(); + size_t num_code_points = 0; + for (size_t i = 0, size = s.size(); i != size; ++i) { + if ((data[i] & 0xc0) != 0x80 && ++num_code_points > n) { + return i; + } + } + return s.size(); +} + +template +using needs_conversion = bool_constant< + std::is_same::value_type, + char>::value && + std::is_same::value>; + +template ::value)> +OutputIt copy_str(InputIt begin, InputIt end, OutputIt it) { + return std::copy(begin, end, it); +} + +template ::value)> +OutputIt copy_str(InputIt begin, InputIt end, OutputIt it) { + return std::transform(begin, end, it, + [](char c) { return static_cast(c); }); +} + +template +inline counting_iterator copy_str(InputIt begin, InputIt end, + counting_iterator it) { + return it + (end - begin); +} + +template +using is_fast_float = bool_constant::is_iec559 && + sizeof(T) <= sizeof(double)>; + +#ifndef FMT_USE_FULL_CACHE_DRAGONBOX +# define FMT_USE_FULL_CACHE_DRAGONBOX 0 +#endif + +template +template +void buffer::append(const U* begin, const U* end) { + do { + auto count = to_unsigned(end - begin); + try_reserve(size_ + count); + auto free_cap = capacity_ - size_; + if (free_cap < count) count = free_cap; + std::uninitialized_copy_n(begin, count, make_checked(ptr_ + size_, count)); + size_ += count; + begin += count; + } while (begin != end); +} + +template +void iterator_buffer::flush() { + out_ = std::copy_n(data_, this->limit(this->size()), out_); + this->clear(); +} +} // namespace detail + +// The number of characters to store in the basic_memory_buffer object itself +// to avoid dynamic memory allocation. +enum { inline_buffer_size = 500 }; + +/** + \rst + A dynamically growing memory buffer for trivially copyable/constructible types + with the first ``SIZE`` elements stored in the object itself. + + You can use one of the following type aliases for common character types: + + +----------------+------------------------------+ + | Type | Definition | + +================+==============================+ + | memory_buffer | basic_memory_buffer | + +----------------+------------------------------+ + | wmemory_buffer | basic_memory_buffer | + +----------------+------------------------------+ + + **Example**:: + + fmt::memory_buffer out; + format_to(out, "The answer is {}.", 42); + + This will append the following output to the ``out`` object: + + .. code-block:: none + + The answer is 42. + + The output can be converted to an ``std::string`` with ``to_string(out)``. + \endrst + */ +template > +class basic_memory_buffer final : public detail::buffer { + private: + T store_[SIZE]; + + // Don't inherit from Allocator avoid generating type_info for it. + Allocator alloc_; + + // Deallocate memory allocated by the buffer. + void deallocate() { + T* data = this->data(); + if (data != store_) alloc_.deallocate(data, this->capacity()); + } + + protected: + void grow(size_t size) final FMT_OVERRIDE; + + public: + using value_type = T; + using const_reference = const T&; + + explicit basic_memory_buffer(const Allocator& alloc = Allocator()) + : alloc_(alloc) { + this->set(store_, SIZE); + } + ~basic_memory_buffer() { deallocate(); } + + private: + // Move data from other to this buffer. + void move(basic_memory_buffer& other) { + alloc_ = std::move(other.alloc_); + T* data = other.data(); + size_t size = other.size(), capacity = other.capacity(); + if (data == other.store_) { + this->set(store_, capacity); + std::uninitialized_copy(other.store_, other.store_ + size, + detail::make_checked(store_, capacity)); + } else { + this->set(data, capacity); + // Set pointer to the inline array so that delete is not called + // when deallocating. + other.set(other.store_, 0); + } + this->resize(size); + } + + public: + /** + \rst + Constructs a :class:`fmt::basic_memory_buffer` object moving the content + of the other object to it. + \endrst + */ + basic_memory_buffer(basic_memory_buffer&& other) FMT_NOEXCEPT { move(other); } + + /** + \rst + Moves the content of the other ``basic_memory_buffer`` object to this one. + \endrst + */ + basic_memory_buffer& operator=(basic_memory_buffer&& other) FMT_NOEXCEPT { + FMT_ASSERT(this != &other, ""); + deallocate(); + move(other); + return *this; + } + + // Returns a copy of the allocator associated with this buffer. + Allocator get_allocator() const { return alloc_; } + + /** + Resizes the buffer to contain *count* elements. If T is a POD type new + elements may not be initialized. + */ + void resize(size_t count) { this->try_resize(count); } + + /** Increases the buffer capacity to *new_capacity*. */ + void reserve(size_t new_capacity) { this->try_reserve(new_capacity); } + + // Directly append data into the buffer + using detail::buffer::append; + template + void append(const ContiguousRange& range) { + append(range.data(), range.data() + range.size()); + } +}; + +template +void basic_memory_buffer::grow(size_t size) { +#ifdef FMT_FUZZ + if (size > 5000) throw std::runtime_error("fuzz mode - won't grow that much"); +#endif + size_t old_capacity = this->capacity(); + size_t new_capacity = old_capacity + old_capacity / 2; + if (size > new_capacity) new_capacity = size; + T* old_data = this->data(); + T* new_data = + std::allocator_traits::allocate(alloc_, new_capacity); + // The following code doesn't throw, so the raw pointer above doesn't leak. + std::uninitialized_copy(old_data, old_data + this->size(), + detail::make_checked(new_data, new_capacity)); + this->set(new_data, new_capacity); + // deallocate must not throw according to the standard, but even if it does, + // the buffer already uses the new storage and will deallocate it in + // destructor. + if (old_data != store_) alloc_.deallocate(old_data, old_capacity); +} + +using memory_buffer = basic_memory_buffer; +using wmemory_buffer = basic_memory_buffer; + +template +struct is_contiguous> : std::true_type { +}; + +/** A formatting error such as invalid format string. */ +FMT_CLASS_API +class FMT_API format_error : public std::runtime_error { + public: + explicit format_error(const char* message) : std::runtime_error(message) {} + explicit format_error(const std::string& message) + : std::runtime_error(message) {} + format_error(const format_error&) = default; + format_error& operator=(const format_error&) = default; + format_error(format_error&&) = default; + format_error& operator=(format_error&&) = default; + ~format_error() FMT_NOEXCEPT FMT_OVERRIDE; +}; + +namespace detail { + +template +using is_signed = + std::integral_constant::is_signed || + std::is_same::value>; + +// Returns true if value is negative, false otherwise. +// Same as `value < 0` but doesn't produce warnings if T is an unsigned type. +template ::value)> +FMT_CONSTEXPR bool is_negative(T value) { + return value < 0; +} +template ::value)> +FMT_CONSTEXPR bool is_negative(T) { + return false; +} + +template ::value)> +FMT_CONSTEXPR bool is_supported_floating_point(T) { + return (std::is_same::value && FMT_USE_FLOAT) || + (std::is_same::value && FMT_USE_DOUBLE) || + (std::is_same::value && FMT_USE_LONG_DOUBLE); +} + +// Smallest of uint32_t, uint64_t, uint128_t that is large enough to +// represent all values of an integral type T. +template +using uint32_or_64_or_128_t = + conditional_t() <= 32 && !FMT_REDUCE_INT_INSTANTIATIONS, + uint32_t, + conditional_t() <= 64, uint64_t, uint128_t>>; + +// 128-bit integer type used internally +struct FMT_EXTERN_TEMPLATE_API uint128_wrapper { + uint128_wrapper() = default; + +#if FMT_USE_INT128 + uint128_t internal_; + + uint128_wrapper(uint64_t high, uint64_t low) FMT_NOEXCEPT + : internal_{static_cast(low) | + (static_cast(high) << 64)} {} + + uint128_wrapper(uint128_t u) : internal_{u} {} + + uint64_t high() const FMT_NOEXCEPT { return uint64_t(internal_ >> 64); } + uint64_t low() const FMT_NOEXCEPT { return uint64_t(internal_); } + + uint128_wrapper& operator+=(uint64_t n) FMT_NOEXCEPT { + internal_ += n; + return *this; + } +#else + uint64_t high_; + uint64_t low_; + + uint128_wrapper(uint64_t high, uint64_t low) FMT_NOEXCEPT : high_{high}, + low_{low} {} + + uint64_t high() const FMT_NOEXCEPT { return high_; } + uint64_t low() const FMT_NOEXCEPT { return low_; } + + uint128_wrapper& operator+=(uint64_t n) FMT_NOEXCEPT { +# if defined(_MSC_VER) && defined(_M_X64) + unsigned char carry = _addcarry_u64(0, low_, n, &low_); + _addcarry_u64(carry, high_, 0, &high_); + return *this; +# else + uint64_t sum = low_ + n; + high_ += (sum < low_ ? 1 : 0); + low_ = sum; + return *this; +# endif + } +#endif +}; + +// Table entry type for divisibility test used internally +template struct FMT_EXTERN_TEMPLATE_API divtest_table_entry { + T mod_inv; + T max_quotient; +}; + +// Static data is placed in this class template for the header-only config. +template struct FMT_EXTERN_TEMPLATE_API basic_data { + static const uint64_t powers_of_10_64[]; + static const uint32_t zero_or_powers_of_10_32_new[]; + static const uint64_t zero_or_powers_of_10_64_new[]; + static const uint64_t grisu_pow10_significands[]; + static const int16_t grisu_pow10_exponents[]; + static const divtest_table_entry divtest_table_for_pow5_32[]; + static const divtest_table_entry divtest_table_for_pow5_64[]; + static const uint64_t dragonbox_pow10_significands_64[]; + static const uint128_wrapper dragonbox_pow10_significands_128[]; + // log10(2) = 0x0.4d104d427de7fbcc... + static const uint64_t log10_2_significand = 0x4d104d427de7fbcc; +#if !FMT_USE_FULL_CACHE_DRAGONBOX + static const uint64_t powers_of_5_64[]; + static const uint32_t dragonbox_pow10_recovery_errors[]; +#endif + // GCC generates slightly better code for pairs than chars. + using digit_pair = char[2]; + static const digit_pair digits[]; + static const char hex_digits[]; + static const char foreground_color[]; + static const char background_color[]; + static const char reset_color[5]; + static const wchar_t wreset_color[5]; + static const char signs[]; + static const char left_padding_shifts[5]; + static const char right_padding_shifts[5]; + + // DEPRECATED! These are for ABI compatibility. + static const uint32_t zero_or_powers_of_10_32[]; + static const uint64_t zero_or_powers_of_10_64[]; +}; + +// Maps bsr(n) to ceil(log10(pow(2, bsr(n) + 1) - 1)). +// This is a function instead of an array to workaround a bug in GCC10 (#1810). +FMT_INLINE uint16_t bsr2log10(int bsr) { + static constexpr uint16_t data[] = { + 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, + 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, + 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20}; + return data[bsr]; +} + +#ifndef FMT_EXPORTED +FMT_EXTERN template struct basic_data; +#endif + +// This is a struct rather than an alias to avoid shadowing warnings in gcc. +struct data : basic_data<> {}; + +#ifdef FMT_BUILTIN_CLZLL +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +inline int count_digits(uint64_t n) { + // https://github.com/fmtlib/format-benchmark/blob/master/digits10 + auto t = bsr2log10(FMT_BUILTIN_CLZLL(n | 1) ^ 63); + return t - (n < data::zero_or_powers_of_10_64_new[t]); +} +#else +// Fallback version of count_digits used when __builtin_clz is not available. +inline int count_digits(uint64_t n) { + int count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000u; + count += 4; + } +} +#endif + +#if FMT_USE_INT128 +inline int count_digits(uint128_t n) { + int count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000U; + count += 4; + } +} +#endif + +// Counts the number of digits in n. BITS = log2(radix). +template inline int count_digits(UInt n) { + int num_digits = 0; + do { + ++num_digits; + } while ((n >>= BITS) != 0); + return num_digits; +} + +template <> int count_digits<4>(detail::fallback_uintptr n); + +#if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_ALWAYS_INLINE inline __attribute__((always_inline)) +#elif FMT_MSC_VER +# define FMT_ALWAYS_INLINE __forceinline +#else +# define FMT_ALWAYS_INLINE inline +#endif + +// To suppress unnecessary security cookie checks +#if FMT_MSC_VER && !FMT_CLANG_VERSION +# define FMT_SAFEBUFFERS __declspec(safebuffers) +#else +# define FMT_SAFEBUFFERS +#endif + +#ifdef FMT_BUILTIN_CLZ +// Optional version of count_digits for better performance on 32-bit platforms. +inline int count_digits(uint32_t n) { + auto t = bsr2log10(FMT_BUILTIN_CLZ(n | 1) ^ 31); + return t - (n < data::zero_or_powers_of_10_32_new[t]); +} +#endif + +template constexpr int digits10() FMT_NOEXCEPT { + return std::numeric_limits::digits10; +} +template <> constexpr int digits10() FMT_NOEXCEPT { return 38; } +template <> constexpr int digits10() FMT_NOEXCEPT { return 38; } + +template FMT_API std::string grouping_impl(locale_ref loc); +template inline std::string grouping(locale_ref loc) { + return grouping_impl(loc); +} +template <> inline std::string grouping(locale_ref loc) { + return grouping_impl(loc); +} + +template FMT_API Char thousands_sep_impl(locale_ref loc); +template inline Char thousands_sep(locale_ref loc) { + return Char(thousands_sep_impl(loc)); +} +template <> inline wchar_t thousands_sep(locale_ref loc) { + return thousands_sep_impl(loc); +} + +template FMT_API Char decimal_point_impl(locale_ref loc); +template inline Char decimal_point(locale_ref loc) { + return Char(decimal_point_impl(loc)); +} +template <> inline wchar_t decimal_point(locale_ref loc) { + return decimal_point_impl(loc); +} + +// Compares two characters for equality. +template bool equal2(const Char* lhs, const char* rhs) { + return lhs[0] == rhs[0] && lhs[1] == rhs[1]; +} +inline bool equal2(const char* lhs, const char* rhs) { + return memcmp(lhs, rhs, 2) == 0; +} + +// Copies two characters from src to dst. +template void copy2(Char* dst, const char* src) { + *dst++ = static_cast(*src++); + *dst = static_cast(*src); +} +FMT_INLINE void copy2(char* dst, const char* src) { memcpy(dst, src, 2); } + +template struct format_decimal_result { + Iterator begin; + Iterator end; +}; + +// Formats a decimal unsigned integer value writing into out pointing to a +// buffer of specified size. The caller must ensure that the buffer is large +// enough. +template +inline format_decimal_result format_decimal(Char* out, UInt value, + int size) { + FMT_ASSERT(size >= count_digits(value), "invalid digit count"); + out += size; + Char* end = out; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + out -= 2; + copy2(out, data::digits[value % 100]); + value /= 100; + } + if (value < 10) { + *--out = static_cast('0' + value); + return {out, end}; + } + out -= 2; + copy2(out, data::digits[value]); + return {out, end}; +} + +template >::value)> +inline format_decimal_result format_decimal(Iterator out, UInt value, + int size) { + // Buffer is large enough to hold all digits (digits10 + 1). + Char buffer[digits10() + 1]; + auto end = format_decimal(buffer, value, size).end; + return {out, detail::copy_str(buffer, end, out)}; +} + +template +inline Char* format_uint(Char* buffer, UInt value, int num_digits, + bool upper = false) { + buffer += num_digits; + Char* end = buffer; + do { + const char* digits = upper ? "0123456789ABCDEF" : data::hex_digits; + unsigned digit = (value & ((1 << BASE_BITS) - 1)); + *--buffer = static_cast(BASE_BITS < 4 ? static_cast('0' + digit) + : digits[digit]); + } while ((value >>= BASE_BITS) != 0); + return end; +} + +template +Char* format_uint(Char* buffer, detail::fallback_uintptr n, int num_digits, + bool = false) { + auto char_digits = std::numeric_limits::digits / 4; + int start = (num_digits + char_digits - 1) / char_digits - 1; + if (int start_digits = num_digits % char_digits) { + unsigned value = n.value[start--]; + buffer = format_uint(buffer, value, start_digits); + } + for (; start >= 0; --start) { + unsigned value = n.value[start]; + buffer += char_digits; + auto p = buffer; + for (int i = 0; i < char_digits; ++i) { + unsigned digit = (value & ((1 << BASE_BITS) - 1)); + *--p = static_cast(data::hex_digits[digit]); + value >>= BASE_BITS; + } + } + return buffer; +} + +template +inline It format_uint(It out, UInt value, int num_digits, bool upper = false) { + if (auto ptr = to_pointer(out, to_unsigned(num_digits))) { + format_uint(ptr, value, num_digits, upper); + return out; + } + // Buffer should be large enough to hold all digits (digits / BASE_BITS + 1). + char buffer[num_bits() / BASE_BITS + 1]; + format_uint(buffer, value, num_digits, upper); + return detail::copy_str(buffer, buffer + num_digits, out); +} + +// A converter from UTF-8 to UTF-16. +class utf8_to_utf16 { + private: + wmemory_buffer buffer_; + + public: + FMT_API explicit utf8_to_utf16(string_view s); + operator wstring_view() const { return {&buffer_[0], size()}; } + size_t size() const { return buffer_.size() - 1; } + const wchar_t* c_str() const { return &buffer_[0]; } + std::wstring str() const { return {&buffer_[0], size()}; } +}; + +template struct null {}; + +// Workaround an array initialization issue in gcc 4.8. +template struct fill_t { + private: + enum { max_size = 4 }; + Char data_[max_size] = {Char(' '), Char(0), Char(0), Char(0)}; + unsigned char size_ = 1; + + public: + FMT_CONSTEXPR void operator=(basic_string_view s) { + auto size = s.size(); + if (size > max_size) { + FMT_THROW(format_error("invalid fill")); + return; + } + for (size_t i = 0; i < size; ++i) data_[i] = s[i]; + size_ = static_cast(size); + } + + size_t size() const { return size_; } + const Char* data() const { return data_; } + + FMT_CONSTEXPR Char& operator[](size_t index) { return data_[index]; } + FMT_CONSTEXPR const Char& operator[](size_t index) const { + return data_[index]; + } +}; +} // namespace detail + +// We cannot use enum classes as bit fields because of a gcc bug +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414. +namespace align { +enum type { none, left, right, center, numeric }; +} +using align_t = align::type; + +namespace sign { +enum type { none, minus, plus, space }; +} +using sign_t = sign::type; + +// Format specifiers for built-in and string types. +template struct basic_format_specs { + int width; + int precision; + char type; + align_t align : 4; + sign_t sign : 3; + bool alt : 1; // Alternate form ('#'). + detail::fill_t fill; + + constexpr basic_format_specs() + : width(0), + precision(-1), + type(0), + align(align::none), + sign(sign::none), + alt(false) {} +}; + +using format_specs = basic_format_specs; + +namespace detail { +namespace dragonbox { + +// Type-specific information that Dragonbox uses. +template struct float_info; + +template <> struct float_info { + using carrier_uint = uint32_t; + static const int significand_bits = 23; + static const int exponent_bits = 8; + static const int min_exponent = -126; + static const int max_exponent = 127; + static const int exponent_bias = -127; + static const int decimal_digits = 9; + static const int kappa = 1; + static const int big_divisor = 100; + static const int small_divisor = 10; + static const int min_k = -31; + static const int max_k = 46; + static const int cache_bits = 64; + static const int divisibility_check_by_5_threshold = 39; + static const int case_fc_pm_half_lower_threshold = -1; + static const int case_fc_pm_half_upper_threshold = 6; + static const int case_fc_lower_threshold = -2; + static const int case_fc_upper_threshold = 6; + static const int case_shorter_interval_left_endpoint_lower_threshold = 2; + static const int case_shorter_interval_left_endpoint_upper_threshold = 3; + static const int shorter_interval_tie_lower_threshold = -35; + static const int shorter_interval_tie_upper_threshold = -35; + static const int max_trailing_zeros = 7; +}; + +template <> struct float_info { + using carrier_uint = uint64_t; + static const int significand_bits = 52; + static const int exponent_bits = 11; + static const int min_exponent = -1022; + static const int max_exponent = 1023; + static const int exponent_bias = -1023; + static const int decimal_digits = 17; + static const int kappa = 2; + static const int big_divisor = 1000; + static const int small_divisor = 100; + static const int min_k = -292; + static const int max_k = 326; + static const int cache_bits = 128; + static const int divisibility_check_by_5_threshold = 86; + static const int case_fc_pm_half_lower_threshold = -2; + static const int case_fc_pm_half_upper_threshold = 9; + static const int case_fc_lower_threshold = -4; + static const int case_fc_upper_threshold = 9; + static const int case_shorter_interval_left_endpoint_lower_threshold = 2; + static const int case_shorter_interval_left_endpoint_upper_threshold = 3; + static const int shorter_interval_tie_lower_threshold = -77; + static const int shorter_interval_tie_upper_threshold = -77; + static const int max_trailing_zeros = 16; +}; + +template struct decimal_fp { + using significand_type = typename float_info::carrier_uint; + significand_type significand; + int exponent; +}; + +template FMT_API decimal_fp to_decimal(T x) FMT_NOEXCEPT; +} // namespace dragonbox + +template +constexpr typename dragonbox::float_info::carrier_uint exponent_mask() { + using uint = typename dragonbox::float_info::carrier_uint; + return ((uint(1) << dragonbox::float_info::exponent_bits) - 1) + << dragonbox::float_info::significand_bits; +} + +// A floating-point presentation format. +enum class float_format : unsigned char { + general, // General: exponent notation or fixed point based on magnitude. + exp, // Exponent notation with the default precision of 6, e.g. 1.2e-3. + fixed, // Fixed point with the default precision of 6, e.g. 0.0012. + hex +}; + +struct float_specs { + int precision; + float_format format : 8; + sign_t sign : 8; + bool upper : 1; + bool locale : 1; + bool binary32 : 1; + bool use_grisu : 1; + bool showpoint : 1; +}; + +// Writes the exponent exp in the form "[+-]d{2,3}" to buffer. +template It write_exponent(int exp, It it) { + FMT_ASSERT(-10000 < exp && exp < 10000, "exponent out of range"); + if (exp < 0) { + *it++ = static_cast('-'); + exp = -exp; + } else { + *it++ = static_cast('+'); + } + if (exp >= 100) { + const char* top = data::digits[exp / 100]; + if (exp >= 1000) *it++ = static_cast(top[0]); + *it++ = static_cast(top[1]); + exp %= 100; + } + const char* d = data::digits[exp]; + *it++ = static_cast(d[0]); + *it++ = static_cast(d[1]); + return it; +} + +template +int format_float(T value, int precision, float_specs specs, buffer& buf); + +// Formats a floating-point number with snprintf. +template +int snprintf_float(T value, int precision, float_specs specs, + buffer& buf); + +template T promote_float(T value) { return value; } +inline double promote_float(float value) { return static_cast(value); } + +template +FMT_CONSTEXPR void handle_int_type_spec(char spec, Handler&& handler) { + switch (spec) { + case 0: + case 'd': + handler.on_dec(); + break; + case 'x': + case 'X': + handler.on_hex(); + break; + case 'b': + case 'B': + handler.on_bin(); + break; + case 'o': + handler.on_oct(); + break; +#ifdef FMT_DEPRECATED_N_SPECIFIER + case 'n': +#endif + case 'L': + handler.on_num(); + break; + case 'c': + handler.on_chr(); + break; + default: + handler.on_error(); + } +} + +template +FMT_CONSTEXPR float_specs parse_float_type_spec( + const basic_format_specs& specs, ErrorHandler&& eh = {}) { + auto result = float_specs(); + result.showpoint = specs.alt; + switch (specs.type) { + case 0: + result.format = float_format::general; + result.showpoint |= specs.precision > 0; + break; + case 'G': + result.upper = true; + FMT_FALLTHROUGH; + case 'g': + result.format = float_format::general; + break; + case 'E': + result.upper = true; + FMT_FALLTHROUGH; + case 'e': + result.format = float_format::exp; + result.showpoint |= specs.precision != 0; + break; + case 'F': + result.upper = true; + FMT_FALLTHROUGH; + case 'f': + result.format = float_format::fixed; + result.showpoint |= specs.precision != 0; + break; + case 'A': + result.upper = true; + FMT_FALLTHROUGH; + case 'a': + result.format = float_format::hex; + break; +#ifdef FMT_DEPRECATED_N_SPECIFIER + case 'n': +#endif + case 'L': + result.locale = true; + break; + default: + eh.on_error("invalid type specifier"); + break; + } + return result; +} + +template +FMT_CONSTEXPR void handle_char_specs(const basic_format_specs* specs, + Handler&& handler) { + if (!specs) return handler.on_char(); + if (specs->type && specs->type != 'c') return handler.on_int(); + if (specs->align == align::numeric || specs->sign != sign::none || specs->alt) + handler.on_error("invalid format specifier for char"); + handler.on_char(); +} + +template +FMT_CONSTEXPR void handle_cstring_type_spec(Char spec, Handler&& handler) { + if (spec == 0 || spec == 's') + handler.on_string(); + else if (spec == 'p') + handler.on_pointer(); + else + handler.on_error("invalid type specifier"); +} + +template +FMT_CONSTEXPR void check_string_type_spec(Char spec, ErrorHandler&& eh) { + if (spec != 0 && spec != 's') eh.on_error("invalid type specifier"); +} + +template +FMT_CONSTEXPR void check_pointer_type_spec(Char spec, ErrorHandler&& eh) { + if (spec != 0 && spec != 'p') eh.on_error("invalid type specifier"); +} + +template class int_type_checker : private ErrorHandler { + public: + FMT_CONSTEXPR explicit int_type_checker(ErrorHandler eh) : ErrorHandler(eh) {} + + FMT_CONSTEXPR void on_dec() {} + FMT_CONSTEXPR void on_hex() {} + FMT_CONSTEXPR void on_bin() {} + FMT_CONSTEXPR void on_oct() {} + FMT_CONSTEXPR void on_num() {} + FMT_CONSTEXPR void on_chr() {} + + FMT_CONSTEXPR void on_error() { + ErrorHandler::on_error("invalid type specifier"); + } +}; + +template +class char_specs_checker : public ErrorHandler { + private: + char type_; + + public: + FMT_CONSTEXPR char_specs_checker(char type, ErrorHandler eh) + : ErrorHandler(eh), type_(type) {} + + FMT_CONSTEXPR void on_int() { + handle_int_type_spec(type_, int_type_checker(*this)); + } + FMT_CONSTEXPR void on_char() {} +}; + +template +class cstring_type_checker : public ErrorHandler { + public: + FMT_CONSTEXPR explicit cstring_type_checker(ErrorHandler eh) + : ErrorHandler(eh) {} + + FMT_CONSTEXPR void on_string() {} + FMT_CONSTEXPR void on_pointer() {} +}; + +template +FMT_NOINLINE OutputIt fill(OutputIt it, size_t n, const fill_t& fill) { + auto fill_size = fill.size(); + if (fill_size == 1) return std::fill_n(it, n, fill[0]); + for (size_t i = 0; i < n; ++i) it = std::copy_n(fill.data(), fill_size, it); + return it; +} + +// Writes the output of f, padded according to format specifications in specs. +// size: output size in code units. +// width: output display width in (terminal) column positions. +template +inline OutputIt write_padded(OutputIt out, + const basic_format_specs& specs, size_t size, + size_t width, F&& f) { + static_assert(align == align::left || align == align::right, ""); + unsigned spec_width = to_unsigned(specs.width); + size_t padding = spec_width > width ? spec_width - width : 0; + auto* shifts = align == align::left ? data::left_padding_shifts + : data::right_padding_shifts; + size_t left_padding = padding >> shifts[specs.align]; + auto it = reserve(out, size + padding * specs.fill.size()); + it = fill(it, left_padding, specs.fill); + it = f(it); + it = fill(it, padding - left_padding, specs.fill); + return base_iterator(out, it); +} + +template +inline OutputIt write_padded(OutputIt out, + const basic_format_specs& specs, size_t size, + F&& f) { + return write_padded(out, specs, size, size, f); +} + +template +OutputIt write_bytes(OutputIt out, string_view bytes, + const basic_format_specs& specs) { + using iterator = remove_reference_t; + return write_padded(out, specs, bytes.size(), [bytes](iterator it) { + const char* data = bytes.data(); + return copy_str(data, data + bytes.size(), it); + }); +} + +// Data for write_int that doesn't depend on output iterator type. It is used to +// avoid template code bloat. +template struct write_int_data { + size_t size; + size_t padding; + + write_int_data(int num_digits, string_view prefix, + const basic_format_specs& specs) + : size(prefix.size() + to_unsigned(num_digits)), padding(0) { + if (specs.align == align::numeric) { + auto width = to_unsigned(specs.width); + if (width > size) { + padding = width - size; + size = width; + } + } else if (specs.precision > num_digits) { + size = prefix.size() + to_unsigned(specs.precision); + padding = to_unsigned(specs.precision - num_digits); + } + } +}; + +// Writes an integer in the format +// +// where are written by f(it). +template +OutputIt write_int(OutputIt out, int num_digits, string_view prefix, + const basic_format_specs& specs, F f) { + auto data = write_int_data(num_digits, prefix, specs); + using iterator = remove_reference_t; + return write_padded(out, specs, data.size, [=](iterator it) { + if (prefix.size() != 0) + it = copy_str(prefix.begin(), prefix.end(), it); + it = std::fill_n(it, data.padding, static_cast('0')); + return f(it); + }); +} + +template +OutputIt write(OutputIt out, basic_string_view s, + const basic_format_specs& specs) { + auto data = s.data(); + auto size = s.size(); + if (specs.precision >= 0 && to_unsigned(specs.precision) < size) + size = code_point_index(s, to_unsigned(specs.precision)); + auto width = specs.width != 0 + ? count_code_points(basic_string_view(data, size)) + : 0; + using iterator = remove_reference_t; + return write_padded(out, specs, size, width, [=](iterator it) { + return copy_str(data, data + size, it); + }); +} + +// The handle_int_type_spec handler that writes an integer. +template struct int_writer { + OutputIt out; + locale_ref locale; + const basic_format_specs& specs; + UInt abs_value; + char prefix[4]; + unsigned prefix_size; + + using iterator = + remove_reference_t(), 0))>; + + string_view get_prefix() const { return string_view(prefix, prefix_size); } + + template + int_writer(OutputIt output, locale_ref loc, Int value, + const basic_format_specs& s) + : out(output), + locale(loc), + specs(s), + abs_value(static_cast(value)), + prefix_size(0) { + static_assert(std::is_same, UInt>::value, ""); + if (is_negative(value)) { + prefix[0] = '-'; + ++prefix_size; + abs_value = 0 - abs_value; + } else if (specs.sign != sign::none && specs.sign != sign::minus) { + prefix[0] = specs.sign == sign::plus ? '+' : ' '; + ++prefix_size; + } + } + + void on_dec() { + auto num_digits = count_digits(abs_value); + out = write_int( + out, num_digits, get_prefix(), specs, [this, num_digits](iterator it) { + return format_decimal(it, abs_value, num_digits).end; + }); + } + + void on_hex() { + if (specs.alt) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = specs.type; + } + int num_digits = count_digits<4>(abs_value); + out = write_int(out, num_digits, get_prefix(), specs, + [this, num_digits](iterator it) { + return format_uint<4, Char>(it, abs_value, num_digits, + specs.type != 'x'); + }); + } + + void on_bin() { + if (specs.alt) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = static_cast(specs.type); + } + int num_digits = count_digits<1>(abs_value); + out = write_int(out, num_digits, get_prefix(), specs, + [this, num_digits](iterator it) { + return format_uint<1, Char>(it, abs_value, num_digits); + }); + } + + void on_oct() { + int num_digits = count_digits<3>(abs_value); + if (specs.alt && specs.precision <= num_digits && abs_value != 0) { + // Octal prefix '0' is counted as a digit, so only add it if precision + // is not greater than the number of digits. + prefix[prefix_size++] = '0'; + } + out = write_int(out, num_digits, get_prefix(), specs, + [this, num_digits](iterator it) { + return format_uint<3, Char>(it, abs_value, num_digits); + }); + } + + enum { sep_size = 1 }; + + void on_num() { + std::string groups = grouping(locale); + if (groups.empty()) return on_dec(); + auto sep = thousands_sep(locale); + if (!sep) return on_dec(); + int num_digits = count_digits(abs_value); + int size = num_digits, n = num_digits; + std::string::const_iterator group = groups.cbegin(); + while (group != groups.cend() && n > *group && *group > 0 && + *group != max_value()) { + size += sep_size; + n -= *group; + ++group; + } + if (group == groups.cend()) size += sep_size * ((n - 1) / groups.back()); + char digits[40]; + format_decimal(digits, abs_value, num_digits); + basic_memory_buffer buffer; + size += static_cast(prefix_size); + const auto usize = to_unsigned(size); + buffer.resize(usize); + basic_string_view s(&sep, sep_size); + // Index of a decimal digit with the least significant digit having index 0. + int digit_index = 0; + group = groups.cbegin(); + auto p = buffer.data() + size - 1; + for (int i = num_digits - 1; i > 0; --i) { + *p-- = static_cast(digits[i]); + if (*group <= 0 || ++digit_index % *group != 0 || + *group == max_value()) + continue; + if (group + 1 != groups.cend()) { + digit_index = 0; + ++group; + } + std::uninitialized_copy(s.data(), s.data() + s.size(), + make_checked(p, s.size())); + p -= s.size(); + } + *p-- = static_cast(*digits); + if (prefix_size != 0) *p = static_cast('-'); + auto data = buffer.data(); + out = write_padded( + out, specs, usize, usize, + [=](iterator it) { return copy_str(data, data + size, it); }); + } + + void on_chr() { *out++ = static_cast(abs_value); } + + FMT_NORETURN void on_error() { + FMT_THROW(format_error("invalid type specifier")); + } +}; + +template +OutputIt write_nonfinite(OutputIt out, bool isinf, + const basic_format_specs& specs, + const float_specs& fspecs) { + auto str = + isinf ? (fspecs.upper ? "INF" : "inf") : (fspecs.upper ? "NAN" : "nan"); + constexpr size_t str_size = 3; + auto sign = fspecs.sign; + auto size = str_size + (sign ? 1 : 0); + using iterator = remove_reference_t; + return write_padded(out, specs, size, [=](iterator it) { + if (sign) *it++ = static_cast(data::signs[sign]); + return copy_str(str, str + str_size, it); + }); +} + +// A decimal floating-point number significand * pow(10, exp). +struct big_decimal_fp { + const char* significand; + int significand_size; + int exponent; +}; + +inline int get_significand_size(const big_decimal_fp& fp) { + return fp.significand_size; +} +template +inline int get_significand_size(const dragonbox::decimal_fp& fp) { + return count_digits(fp.significand); +} + +template +inline OutputIt write_significand(OutputIt out, const char* significand, + int& significand_size) { + return copy_str(significand, significand + significand_size, out); +} +template +inline OutputIt write_significand(OutputIt out, UInt significand, + int significand_size) { + return format_decimal(out, significand, significand_size).end; +} + +template ::value)> +inline Char* write_significand(Char* out, UInt significand, + int significand_size, int integral_size, + Char decimal_point) { + if (!decimal_point) + return format_decimal(out, significand, significand_size).end; + auto end = format_decimal(out + 1, significand, significand_size).end; + if (integral_size == 1) + out[0] = out[1]; + else + std::copy_n(out + 1, integral_size, out); + out[integral_size] = decimal_point; + return end; +} + +template >::value)> +inline OutputIt write_significand(OutputIt out, UInt significand, + int significand_size, int integral_size, + Char decimal_point) { + // Buffer is large enough to hold digits (digits10 + 1) and a decimal point. + Char buffer[digits10() + 2]; + auto end = write_significand(buffer, significand, significand_size, + integral_size, decimal_point); + return detail::copy_str(buffer, end, out); +} + +template +inline OutputIt write_significand(OutputIt out, const char* significand, + int significand_size, int integral_size, + Char decimal_point) { + out = detail::copy_str(significand, significand + integral_size, out); + if (!decimal_point) return out; + *out++ = decimal_point; + return detail::copy_str(significand + integral_size, + significand + significand_size, out); +} + +template +OutputIt write_float(OutputIt out, const DecimalFP& fp, + const basic_format_specs& specs, float_specs fspecs, + Char decimal_point) { + auto significand = fp.significand; + int significand_size = get_significand_size(fp); + static const Char zero = static_cast('0'); + auto sign = fspecs.sign; + size_t size = to_unsigned(significand_size) + (sign ? 1 : 0); + using iterator = remove_reference_t; + + int output_exp = fp.exponent + significand_size - 1; + auto use_exp_format = [=]() { + if (fspecs.format == float_format::exp) return true; + if (fspecs.format != float_format::general) return false; + // Use the fixed notation if the exponent is in [exp_lower, exp_upper), + // e.g. 0.0001 instead of 1e-04. Otherwise use the exponent notation. + const int exp_lower = -4, exp_upper = 16; + return output_exp < exp_lower || + output_exp >= (fspecs.precision > 0 ? fspecs.precision : exp_upper); + }; + if (use_exp_format()) { + int num_zeros = 0; + if (fspecs.showpoint) { + num_zeros = (std::max)(fspecs.precision - significand_size, 0); + size += to_unsigned(num_zeros); + } else if (significand_size == 1) { + decimal_point = Char(); + } + auto abs_output_exp = output_exp >= 0 ? output_exp : -output_exp; + int exp_digits = 2; + if (abs_output_exp >= 100) exp_digits = abs_output_exp >= 1000 ? 4 : 3; + + size += to_unsigned((decimal_point ? 1 : 0) + 2 + exp_digits); + char exp_char = fspecs.upper ? 'E' : 'e'; + auto write = [=](iterator it) { + if (sign) *it++ = static_cast(data::signs[sign]); + // Insert a decimal point after the first digit and add an exponent. + it = write_significand(it, significand, significand_size, 1, + decimal_point); + if (num_zeros > 0) it = std::fill_n(it, num_zeros, zero); + *it++ = static_cast(exp_char); + return write_exponent(output_exp, it); + }; + return specs.width > 0 ? write_padded(out, specs, size, write) + : base_iterator(out, write(reserve(out, size))); + } + + int exp = fp.exponent + significand_size; + if (fp.exponent >= 0) { + // 1234e5 -> 123400000[.0+] + size += to_unsigned(fp.exponent); + int num_zeros = fspecs.precision - exp; +#ifdef FMT_FUZZ + if (num_zeros > 5000) + throw std::runtime_error("fuzz mode - avoiding excessive cpu use"); +#endif + if (fspecs.showpoint) { + if (num_zeros <= 0 && fspecs.format != float_format::fixed) num_zeros = 1; + if (num_zeros > 0) size += to_unsigned(num_zeros); + } + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = static_cast(data::signs[sign]); + it = write_significand(it, significand, significand_size); + it = std::fill_n(it, fp.exponent, zero); + if (!fspecs.showpoint) return it; + *it++ = decimal_point; + return num_zeros > 0 ? std::fill_n(it, num_zeros, zero) : it; + }); + } else if (exp > 0) { + // 1234e-2 -> 12.34[0+] + int num_zeros = fspecs.showpoint ? fspecs.precision - significand_size : 0; + size += 1 + to_unsigned(num_zeros > 0 ? num_zeros : 0); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = static_cast(data::signs[sign]); + it = write_significand(it, significand, significand_size, exp, + decimal_point); + return num_zeros > 0 ? std::fill_n(it, num_zeros, zero) : it; + }); + } + // 1234e-6 -> 0.001234 + int num_zeros = -exp; + if (significand_size == 0 && fspecs.precision >= 0 && + fspecs.precision < num_zeros) { + num_zeros = fspecs.precision; + } + size += 2 + to_unsigned(num_zeros); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = static_cast(data::signs[sign]); + *it++ = zero; + if (num_zeros == 0 && significand_size == 0 && !fspecs.showpoint) return it; + *it++ = decimal_point; + it = std::fill_n(it, num_zeros, zero); + return write_significand(it, significand, significand_size); + }); +} + +template ::value)> +OutputIt write(OutputIt out, T value, basic_format_specs specs, + locale_ref loc = {}) { + if (const_check(!is_supported_floating_point(value))) return out; + float_specs fspecs = parse_float_type_spec(specs); + fspecs.sign = specs.sign; + if (std::signbit(value)) { // value < 0 is false for NaN so use signbit. + fspecs.sign = sign::minus; + value = -value; + } else if (fspecs.sign == sign::minus) { + fspecs.sign = sign::none; + } + + if (!std::isfinite(value)) + return write_nonfinite(out, std::isinf(value), specs, fspecs); + + if (specs.align == align::numeric && fspecs.sign) { + auto it = reserve(out, 1); + *it++ = static_cast(data::signs[fspecs.sign]); + out = base_iterator(out, it); + fspecs.sign = sign::none; + if (specs.width != 0) --specs.width; + } + + memory_buffer buffer; + if (fspecs.format == float_format::hex) { + if (fspecs.sign) buffer.push_back(data::signs[fspecs.sign]); + snprintf_float(promote_float(value), specs.precision, fspecs, buffer); + return write_bytes(out, {buffer.data(), buffer.size()}, specs); + } + int precision = specs.precision >= 0 || !specs.type ? specs.precision : 6; + if (fspecs.format == float_format::exp) { + if (precision == max_value()) + FMT_THROW(format_error("number is too big")); + else + ++precision; + } + if (const_check(std::is_same())) fspecs.binary32 = true; + fspecs.use_grisu = is_fast_float(); + int exp = format_float(promote_float(value), precision, fspecs, buffer); + fspecs.precision = precision; + Char point = + fspecs.locale ? decimal_point(loc) : static_cast('.'); + auto fp = big_decimal_fp{buffer.data(), static_cast(buffer.size()), exp}; + return write_float(out, fp, specs, fspecs, point); +} + +template ::value)> +OutputIt write(OutputIt out, T value) { + if (const_check(!is_supported_floating_point(value))) return out; + + using floaty = conditional_t::value, double, T>; + using uint = typename dragonbox::float_info::carrier_uint; + auto bits = bit_cast(value); + + auto fspecs = float_specs(); + auto sign_bit = bits & (uint(1) << (num_bits() - 1)); + if (sign_bit != 0) { + fspecs.sign = sign::minus; + value = -value; + } + + static const auto specs = basic_format_specs(); + uint mask = exponent_mask(); + if ((bits & mask) == mask) + return write_nonfinite(out, std::isinf(value), specs, fspecs); + + auto dec = dragonbox::to_decimal(static_cast(value)); + return write_float(out, dec, specs, fspecs, static_cast('.')); +} + +template ::value && + !is_fast_float::value)> +inline OutputIt write(OutputIt out, T value) { + return write(out, value, basic_format_specs()); +} + +template +OutputIt write_char(OutputIt out, Char value, + const basic_format_specs& specs) { + using iterator = remove_reference_t; + return write_padded(out, specs, 1, [=](iterator it) { + *it++ = value; + return it; + }); +} + +template +OutputIt write_ptr(OutputIt out, UIntPtr value, + const basic_format_specs* specs) { + int num_digits = count_digits<4>(value); + auto size = to_unsigned(num_digits) + size_t(2); + using iterator = remove_reference_t; + auto write = [=](iterator it) { + *it++ = static_cast('0'); + *it++ = static_cast('x'); + return format_uint<4, Char>(it, value, num_digits); + }; + return specs ? write_padded(out, *specs, size, write) + : base_iterator(out, write(reserve(out, size))); +} + +template struct is_integral : std::is_integral {}; +template <> struct is_integral : std::true_type {}; +template <> struct is_integral : std::true_type {}; + +template +OutputIt write(OutputIt out, monostate) { + FMT_ASSERT(false, ""); + return out; +} + +template ::value)> +OutputIt write(OutputIt out, string_view value) { + auto it = reserve(out, value.size()); + it = copy_str(value.begin(), value.end(), it); + return base_iterator(out, it); +} + +template +OutputIt write(OutputIt out, basic_string_view value) { + auto it = reserve(out, value.size()); + it = std::copy(value.begin(), value.end(), it); + return base_iterator(out, it); +} + +template +buffer_appender write(buffer_appender out, + basic_string_view value) { + get_container(out).append(value.begin(), value.end()); + return out; +} + +template ::value && + !std::is_same::value && + !std::is_same::value)> +OutputIt write(OutputIt out, T value) { + auto abs_value = static_cast>(value); + bool negative = is_negative(value); + // Don't do -abs_value since it trips unsigned-integer-overflow sanitizer. + if (negative) abs_value = ~abs_value + 1; + int num_digits = count_digits(abs_value); + auto size = (negative ? 1 : 0) + static_cast(num_digits); + auto it = reserve(out, size); + if (auto ptr = to_pointer(it, size)) { + if (negative) *ptr++ = static_cast('-'); + format_decimal(ptr, abs_value, num_digits); + return out; + } + if (negative) *it++ = static_cast('-'); + it = format_decimal(it, abs_value, num_digits).end; + return base_iterator(out, it); +} + +template +OutputIt write(OutputIt out, bool value) { + return write(out, string_view(value ? "true" : "false")); +} + +template +OutputIt write(OutputIt out, Char value) { + auto it = reserve(out, 1); + *it++ = value; + return base_iterator(out, it); +} + +template +OutputIt write(OutputIt out, const Char* value) { + if (!value) { + FMT_THROW(format_error("string pointer is null")); + } else { + auto length = std::char_traits::length(value); + out = write(out, basic_string_view(value, length)); + } + return out; +} + +template +OutputIt write(OutputIt out, const void* value) { + return write_ptr(out, to_uintptr(value), nullptr); +} + +template +auto write(OutputIt out, const T& value) -> typename std::enable_if< + mapped_type_constant>::value == + type::custom_type, + OutputIt>::type { + using context_type = basic_format_context; + using formatter_type = + conditional_t::value, + typename context_type::template formatter_type, + fallback_formatter>; + context_type ctx(out, {}, {}); + return formatter_type().format(value, ctx); +} + +// An argument visitor that formats the argument and writes it via the output +// iterator. It's a class and not a generic lambda for compatibility with C++11. +template struct default_arg_formatter { + using context = basic_format_context; + + OutputIt out; + basic_format_args args; + locale_ref loc; + + template OutputIt operator()(T value) { + return write(out, value); + } + + OutputIt operator()(typename basic_format_arg::handle handle) { + basic_format_parse_context parse_ctx({}); + basic_format_context format_ctx(out, args, loc); + handle.format(parse_ctx, format_ctx); + return format_ctx.out(); + } +}; + +template +class arg_formatter_base { + public: + using iterator = OutputIt; + using char_type = Char; + using format_specs = basic_format_specs; + + private: + iterator out_; + locale_ref locale_; + format_specs* specs_; + + // Attempts to reserve space for n extra characters in the output range. + // Returns a pointer to the reserved range or a reference to out_. + auto reserve(size_t n) -> decltype(detail::reserve(out_, n)) { + return detail::reserve(out_, n); + } + + using reserve_iterator = remove_reference_t(), 0))>; + + template void write_int(T value, const format_specs& spec) { + using uint_type = uint32_or_64_or_128_t; + int_writer w(out_, locale_, value, spec); + handle_int_type_spec(spec.type, w); + out_ = w.out; + } + + void write(char value) { + auto&& it = reserve(1); + *it++ = value; + } + + template ::value)> + void write(Ch value) { + out_ = detail::write(out_, value); + } + + void write(string_view value) { + auto&& it = reserve(value.size()); + it = copy_str(value.begin(), value.end(), it); + } + void write(wstring_view value) { + static_assert(std::is_same::value, ""); + auto&& it = reserve(value.size()); + it = std::copy(value.begin(), value.end(), it); + } + + template + void write(const Ch* s, size_t size, const format_specs& specs) { + auto width = specs.width != 0 + ? count_code_points(basic_string_view(s, size)) + : 0; + out_ = write_padded(out_, specs, size, width, [=](reserve_iterator it) { + return copy_str(s, s + size, it); + }); + } + + template + void write(basic_string_view s, const format_specs& specs = {}) { + out_ = detail::write(out_, s, specs); + } + + void write_pointer(const void* p) { + out_ = write_ptr(out_, to_uintptr(p), specs_); + } + + struct char_spec_handler : ErrorHandler { + arg_formatter_base& formatter; + Char value; + + char_spec_handler(arg_formatter_base& f, Char val) + : formatter(f), value(val) {} + + void on_int() { + // char is only formatted as int if there are specs. + formatter.write_int(static_cast(value), *formatter.specs_); + } + void on_char() { + if (formatter.specs_) + formatter.out_ = write_char(formatter.out_, value, *formatter.specs_); + else + formatter.write(value); + } + }; + + struct cstring_spec_handler : error_handler { + arg_formatter_base& formatter; + const Char* value; + + cstring_spec_handler(arg_formatter_base& f, const Char* val) + : formatter(f), value(val) {} + + void on_string() { formatter.write(value); } + void on_pointer() { formatter.write_pointer(value); } + }; + + protected: + iterator out() { return out_; } + format_specs* specs() { return specs_; } + + void write(bool value) { + if (specs_) + write(string_view(value ? "true" : "false"), *specs_); + else + out_ = detail::write(out_, value); + } + + void write(const Char* value) { + if (!value) { + FMT_THROW(format_error("string pointer is null")); + } else { + auto length = std::char_traits::length(value); + basic_string_view sv(value, length); + specs_ ? write(sv, *specs_) : write(sv); + } + } + + public: + arg_formatter_base(OutputIt out, format_specs* s, locale_ref loc) + : out_(out), locale_(loc), specs_(s) {} + + iterator operator()(monostate) { + FMT_ASSERT(false, "invalid argument type"); + return out_; + } + + template ::value)> + FMT_INLINE iterator operator()(T value) { + if (specs_) + write_int(value, *specs_); + else + out_ = detail::write(out_, value); + return out_; + } + + iterator operator()(Char value) { + handle_char_specs(specs_, + char_spec_handler(*this, static_cast(value))); + return out_; + } + + iterator operator()(bool value) { + if (specs_ && specs_->type) return (*this)(value ? 1 : 0); + write(value != 0); + return out_; + } + + template ::value)> + iterator operator()(T value) { + auto specs = specs_ ? *specs_ : format_specs(); + if (const_check(is_supported_floating_point(value))) + out_ = detail::write(out_, value, specs, locale_); + else + FMT_ASSERT(false, "unsupported float argument type"); + return out_; + } + + iterator operator()(const Char* value) { + if (!specs_) return write(value), out_; + handle_cstring_type_spec(specs_->type, cstring_spec_handler(*this, value)); + return out_; + } + + iterator operator()(basic_string_view value) { + if (specs_) { + check_string_type_spec(specs_->type, error_handler()); + write(value, *specs_); + } else { + write(value); + } + return out_; + } + + iterator operator()(const void* value) { + if (specs_) check_pointer_type_spec(specs_->type, error_handler()); + write_pointer(value); + return out_; + } +}; + +/** The default argument formatter. */ +template +class arg_formatter : public arg_formatter_base { + private: + using char_type = Char; + using base = arg_formatter_base; + using context_type = basic_format_context; + + context_type& ctx_; + basic_format_parse_context* parse_ctx_; + const Char* ptr_; + + public: + using iterator = typename base::iterator; + using format_specs = typename base::format_specs; + + /** + \rst + Constructs an argument formatter object. + *ctx* is a reference to the formatting context, + *specs* contains format specifier information for standard argument types. + \endrst + */ + explicit arg_formatter( + context_type& ctx, + basic_format_parse_context* parse_ctx = nullptr, + format_specs* specs = nullptr, const Char* ptr = nullptr) + : base(ctx.out(), specs, ctx.locale()), + ctx_(ctx), + parse_ctx_(parse_ctx), + ptr_(ptr) {} + + using base::operator(); + + /** Formats an argument of a user-defined type. */ + iterator operator()(typename basic_format_arg::handle handle) { + if (ptr_) advance_to(*parse_ctx_, ptr_); + handle.format(*parse_ctx_, ctx_); + return ctx_.out(); + } +}; + +template FMT_CONSTEXPR bool is_name_start(Char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +// Parses the range [begin, end) as an unsigned integer. This function assumes +// that the range is non-empty and the first character is a digit. +template +FMT_CONSTEXPR int parse_nonnegative_int(const Char*& begin, const Char* end, + ErrorHandler&& eh) { + FMT_ASSERT(begin != end && '0' <= *begin && *begin <= '9', ""); + unsigned value = 0; + // Convert to unsigned to prevent a warning. + constexpr unsigned max_int = max_value(); + unsigned big = max_int / 10; + do { + // Check for overflow. + if (value > big) { + value = max_int + 1; + break; + } + value = value * 10 + unsigned(*begin - '0'); + ++begin; + } while (begin != end && '0' <= *begin && *begin <= '9'); + if (value > max_int) eh.on_error("number is too big"); + return static_cast(value); +} + +template class custom_formatter { + private: + using char_type = typename Context::char_type; + + basic_format_parse_context& parse_ctx_; + Context& ctx_; + + public: + explicit custom_formatter(basic_format_parse_context& parse_ctx, + Context& ctx) + : parse_ctx_(parse_ctx), ctx_(ctx) {} + + void operator()(typename basic_format_arg::handle h) const { + h.format(parse_ctx_, ctx_); + } + + template void operator()(T) const {} +}; + +template +using is_integer = + bool_constant::value && !std::is_same::value && + !std::is_same::value && + !std::is_same::value>; + +template class width_checker { + public: + explicit FMT_CONSTEXPR width_checker(ErrorHandler& eh) : handler_(eh) {} + + template ::value)> + FMT_CONSTEXPR unsigned long long operator()(T value) { + if (is_negative(value)) handler_.on_error("negative width"); + return static_cast(value); + } + + template ::value)> + FMT_CONSTEXPR unsigned long long operator()(T) { + handler_.on_error("width is not integer"); + return 0; + } + + private: + ErrorHandler& handler_; +}; + +template class precision_checker { + public: + explicit FMT_CONSTEXPR precision_checker(ErrorHandler& eh) : handler_(eh) {} + + template ::value)> + FMT_CONSTEXPR unsigned long long operator()(T value) { + if (is_negative(value)) handler_.on_error("negative precision"); + return static_cast(value); + } + + template ::value)> + FMT_CONSTEXPR unsigned long long operator()(T) { + handler_.on_error("precision is not integer"); + return 0; + } + + private: + ErrorHandler& handler_; +}; + +// A format specifier handler that sets fields in basic_format_specs. +template class specs_setter { + public: + explicit FMT_CONSTEXPR specs_setter(basic_format_specs& specs) + : specs_(specs) {} + + FMT_CONSTEXPR specs_setter(const specs_setter& other) + : specs_(other.specs_) {} + + FMT_CONSTEXPR void on_align(align_t align) { specs_.align = align; } + FMT_CONSTEXPR void on_fill(basic_string_view fill) { + specs_.fill = fill; + } + FMT_CONSTEXPR void on_plus() { specs_.sign = sign::plus; } + FMT_CONSTEXPR void on_minus() { specs_.sign = sign::minus; } + FMT_CONSTEXPR void on_space() { specs_.sign = sign::space; } + FMT_CONSTEXPR void on_hash() { specs_.alt = true; } + + FMT_CONSTEXPR void on_zero() { + specs_.align = align::numeric; + specs_.fill[0] = Char('0'); + } + + FMT_CONSTEXPR void on_width(int width) { specs_.width = width; } + FMT_CONSTEXPR void on_precision(int precision) { + specs_.precision = precision; + } + FMT_CONSTEXPR void end_precision() {} + + FMT_CONSTEXPR void on_type(Char type) { + specs_.type = static_cast(type); + } + + protected: + basic_format_specs& specs_; +}; + +template class numeric_specs_checker { + public: + FMT_CONSTEXPR numeric_specs_checker(ErrorHandler& eh, detail::type arg_type) + : error_handler_(eh), arg_type_(arg_type) {} + + FMT_CONSTEXPR void require_numeric_argument() { + if (!is_arithmetic_type(arg_type_)) + error_handler_.on_error("format specifier requires numeric argument"); + } + + FMT_CONSTEXPR void check_sign() { + require_numeric_argument(); + if (is_integral_type(arg_type_) && arg_type_ != type::int_type && + arg_type_ != type::long_long_type && arg_type_ != type::char_type) { + error_handler_.on_error("format specifier requires signed argument"); + } + } + + FMT_CONSTEXPR void check_precision() { + if (is_integral_type(arg_type_) || arg_type_ == type::pointer_type) + error_handler_.on_error("precision not allowed for this argument type"); + } + + private: + ErrorHandler& error_handler_; + detail::type arg_type_; +}; + +// A format specifier handler that checks if specifiers are consistent with the +// argument type. +template class specs_checker : public Handler { + private: + numeric_specs_checker checker_; + + // Suppress an MSVC warning about using this in initializer list. + FMT_CONSTEXPR Handler& error_handler() { return *this; } + + public: + FMT_CONSTEXPR specs_checker(const Handler& handler, detail::type arg_type) + : Handler(handler), checker_(error_handler(), arg_type) {} + + FMT_CONSTEXPR specs_checker(const specs_checker& other) + : Handler(other), checker_(error_handler(), other.arg_type_) {} + + FMT_CONSTEXPR void on_align(align_t align) { + if (align == align::numeric) checker_.require_numeric_argument(); + Handler::on_align(align); + } + + FMT_CONSTEXPR void on_plus() { + checker_.check_sign(); + Handler::on_plus(); + } + + FMT_CONSTEXPR void on_minus() { + checker_.check_sign(); + Handler::on_minus(); + } + + FMT_CONSTEXPR void on_space() { + checker_.check_sign(); + Handler::on_space(); + } + + FMT_CONSTEXPR void on_hash() { + checker_.require_numeric_argument(); + Handler::on_hash(); + } + + FMT_CONSTEXPR void on_zero() { + checker_.require_numeric_argument(); + Handler::on_zero(); + } + + FMT_CONSTEXPR void end_precision() { checker_.check_precision(); } +}; + +template