Skip to content

Commit

Permalink
✨ replacement_of handler for just inserting exactly the desired chara…
Browse files Browse the repository at this point in the history
…cters

— ✨ New benchmarks for error handling (works in progress)
— ✨ Adjust documentation and show numbers for internal benchmarks (will need to be redone soon anyhow, but they're there)
  • Loading branch information
ThePhD committed Jan 8, 2024
1 parent b86fc8e commit d34d4d0
Show file tree
Hide file tree
Showing 98 changed files with 4,358 additions and 625 deletions.
14 changes: 2 additions & 12 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ set(CMAKE_PROJECT_INCLUDE ${ZTD_CMAKE_PROJECT_PRELUDE})
# informs about the project, gives a description, version and MOST IMPORTANTLY
# the languages the project is going to use. Required.
project(ztd.text
VERSION 0.0.0
VERSION 0.4.0
DESCRIPTION "A spicy text library."
HOMEPAGE_URL "https://ztdtext.readthedocs.io/en/latest/"
LANGUAGES C CXX)
Expand Down Expand Up @@ -75,15 +75,7 @@ endif()

# Modify bad flags / change defaults if we are the top level
if(ZTD_TEXT_IS_TOP_LEVEL_PROJECT)
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/x86/${CMAKE_BUILD_TYPE}/lib")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/x86/${CMAKE_BUILD_TYPE}/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/x86/${CMAKE_BUILD_TYPE}/bin")
else()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/x64/${CMAKE_BUILD_TYPE}/lib")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/x64/${CMAKE_BUILD_TYPE}/bin")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/x64/${CMAKE_BUILD_TYPE}/bin")
endif()
ztd_tools_top_level_project_config()

if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 17)
Expand All @@ -93,8 +85,6 @@ if(ZTD_TEXT_IS_TOP_LEVEL_PROJECT)
set(CMAKE_C_STANDARD 11)
endif()

set(CMAKE_OBJECT_PATH_MAX 1024)

if(ZTD_TEXT_BENCHMARKS OR ZTD_TEXT_EXAMPLES OR ZTD_TEXT_TESTS OR ZTD_TEXT_SCRATCH)
# normal flags
check_compiler_flag(disable-permissive MSVC /permissive- GCC -pedantic)
Expand Down
6 changes: 6 additions & 0 deletions benchmarks/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ ztd_platform_dependency_jail()
add_subdirectory(barrier)
add_subdirectory(function_form)
add_subdirectory(conversion_speed)
add_subdirectory(error_handling)

add_custom_target(ztd.text.benchmarks.graphs.all
COMMENT "[ztd.text] graphing all benchmarks...")
Expand All @@ -102,3 +103,8 @@ add_dependencies(ztd.text.benchmarks.graphs.all
ztd.tools.benchmark_grapher.function_form.small
ztd.tools.benchmark_grapher.conversion_speed.small
ztd.tools.benchmark_grapher.conversion_speed.large)
if (ZTD_TEXT_BENCHMARKS_INTERNALS)
add_dependencies(ztd.text.benchmarks.graphs.all
ztd.tools.benchmark_grapher.conversion_speed.internal.small
ztd.tools.benchmark_grapher.conversion_speed.internal.large)
endif()
56 changes: 56 additions & 0 deletions benchmarks/barrier/include/barrier/data.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,60 @@ ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_basic_source_data
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_basic_source_data;

ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char8_t u8_unicode_error_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_unicode_error_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_unicode_error_data;

ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char8_t u8_basic_source_error_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_basic_source_error_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_basic_source_error_data;

ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char8_t u8_unicode_error_replacement_u003a_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_unicode_error_replacement_u003a_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_unicode_error_replacement_u003a_expected_data;

ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char8_t u8_basic_source_error_replacement_u003a_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_basic_source_error_replacement_u003a_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_basic_source_error_replacement_u003a_expected_data;

ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char8_t u8_unicode_error_replacement_ufffd_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_unicode_error_replacement_ufffd_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_unicode_error_replacement_ufffd_expected_data;

ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char8_t u8_basic_source_error_replacement_ufffd_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_basic_source_error_replacement_ufffd_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_basic_source_error_replacement_ufffd_expected_data;

ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char8_t u8_unicode_error_skip_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_unicode_error_skip_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_unicode_error_skip_expected_data;

ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char8_t u8_basic_source_error_skip_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char16_t u16_basic_source_error_skip_expected_data;
ZTD_C_LANGUAGE_LINKAGE_I_
ZTD_TEXT_BENCHMARKS_BARRIER_API_LINKAGE_I_ c_span_char32_t u32_basic_source_error_skip_expected_data;

#endif
48 changes: 36 additions & 12 deletions benchmarks/conversion_speed/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ function (generate_converion_speed_benchmark_targets name data_name title)
target_include_directories(ztd.text.benchmarks.conversion_speed.${name}
PRIVATE
include
../include
)
target_link_libraries(ztd.text.benchmarks.conversion_speed.${name}
PRIVATE
Expand Down Expand Up @@ -90,7 +91,9 @@ function (generate_converion_speed_benchmark_targets name data_name title)
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_CUNEICODE_BENCHMARKS=1
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_CUNEICODE_UNCHECKED_BENCHMARKS=1
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_CUNEICODE_BASIC_BENCHMARKS=$<IF:$<BOOL:${ZTD_TEXT_BENCHMARKS_INTERNALS}>,1,0>
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_CUNEICODE_SINGLE_FROM_BULK_BENCHMARKS=$<IF:$<BOOL:${ZTD_TEXT_BENCHMARKS_INTERNALS}>,1,0>
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_CUNEICODE_BASIC_UNCHECKED_BENCHMARKS=$<IF:$<BOOL:${ZTD_TEXT_BENCHMARKS_INTERNALS}>,1,0>
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_CUNEICODE_SINGLE_FROM_BULK_UNCHECKED_BENCHMARKS=$<IF:$<BOOL:${ZTD_TEXT_BENCHMARKS_INTERNALS}>,1,0>
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_ICU_BENCHMARKS=1
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_ICONV_BENCHMARKS=1
ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_ENCODING_C_BENCHMARKS=1
Expand All @@ -106,22 +109,43 @@ function (generate_converion_speed_benchmark_targets name data_name title)
_SILENCE_CXX26_CODECVT_FACETS_DEPRECATION_WARNING=1
)
generate_target_manifest(ztd.text.benchmarks.conversion_speed.${name})
set(ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_TITLE ${title})
set(ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_TITLE "${title}")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/graph_config.in.json
${CMAKE_CURRENT_BINARY_DIR}/graph_config.${name}.json
@ONLY
)
ztd_tools_add_benchmark_grapher(
NAME
conversion_speed.${name}
CONFIG
"${CMAKE_CURRENT_BINARY_DIR}/graph_config.${name}.json"
TARGETS
ztd.text.benchmarks.conversion_speed.${name}
REPETITIONS
${ZTD_TEXT_BENCHMARKS_REPETITIONS}
set(ZTD_TEXT_BENCHMARKS_CONVERSION_SPEED_TITLE "${title} - Internals")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/graph_config.internal.in.json
${CMAKE_CURRENT_BINARY_DIR}/graph_config.internal.${name}.json
@ONLY
)

if (ZTD_TEXT_BENCHMARKS_INTERNALS)
ztd_tools_add_benchmark_grapher(
NAMES
conversion_speed.${name}
conversion_speed.internal.${name}
CONFIGS
"${CMAKE_CURRENT_BINARY_DIR}/graph_config.${name}.json"
"${CMAKE_CURRENT_BINARY_DIR}/graph_config.internal.${name}.json"
TARGETS
ztd.text.benchmarks.conversion_speed.${name}
REPETITIONS
${ZTD_TEXT_BENCHMARKS_REPETITIONS}
)
else()
ztd_tools_add_benchmark_grapher(
NAMES
conversion_speed.${name}
CONFIGS
"${CMAKE_CURRENT_BINARY_DIR}/graph_config.${name}.json"
TARGETS
ztd.text.benchmarks.conversion_speed.${name}
REPETITIONS
${ZTD_TEXT_BENCHMARKS_REPETITIONS}
)
endif()
endfunction()

generate_converion_speed_benchmark_targets(large unicode "All Unicode Scalar Values")
generate_converion_speed_benchmark_targets(small basic_source "C Character Set")
generate_converion_speed_benchmark_targets(large unicode "All Unicode Scalar Values Conversion")
generate_converion_speed_benchmark_targets(small basic_source "C Character Set Conversion")
130 changes: 56 additions & 74 deletions benchmarks/conversion_speed/graph_config.in.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,25 @@
},
"categories": [
{
"name": "UTF-16 to UTF-32 (Well-Formed)",
"pattern": "utf16_to_utf32_well_formed_",
"name": "UTF-8 to UTF-8 (Well-Formed)",
"pattern": "utf8_to_utf8_well_formed_",
"ascending": false,
"description": "A conversion from UTF-16 data to UTF-32 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf16_to_utf32_well_formed"
"description": "A conversion from UTF-8 data to UTF-8 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf8_to_utf8_well_formed"
},
{
"name": "UTF-16 to UTF-16 (Well-Formed)",
"pattern": "utf16_to_utf16_well_formed_",
"ascending": false,
"description": "A conversion from UTF-16 data to UTF-16 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf16_to_utf16_well_formed"
},
{
"name": "UTF-32 to UTF-32 (Well-Formed)",
"pattern": "utf32_to_utf32_well_formed_",
"ascending": false,
"description": "A conversion from UTF-32 data to UTF-32 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf32_to_utf32_well_formed"
},
{
"name": "UTF-16 to UTF-8 (Well-Formed)",
Expand All @@ -19,6 +33,13 @@
"description": "A conversion from UTF-16 data to UTF-8 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf16_to_utf8_well_formed"
},
{
"name": "UTF-16 to UTF-32 (Well-Formed)",
"pattern": "utf16_to_utf32_well_formed_",
"ascending": false,
"description": "A conversion from UTF-16 data to UTF-32 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf16_to_utf32_well_formed"
},
{
"name": "UTF-8 to UTF-16 (Well-Formed)",
"pattern": "utf8_to_utf16_well_formed_",
Expand Down Expand Up @@ -48,11 +69,25 @@
"file_name": "utf32_to_utf16_well_formed"
},
{
"name": "UTF-16 to UTF-32 (Well-Formed, with Init)",
"pattern": "utf16_to_utf32_init_well_formed_",
"name": "UTF-8 to UTF-8 (Well-Formed, with Init)",
"pattern": "utf8_to_utf8_init_well_formed_",
"ascending": false,
"description": "A conversion from UTF-16 data to UTF-32 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf16_to_utf32_well_formed_init"
"description": "A conversion from UTF-8 data to UTF-8 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf8_to_utf8_well_formed_init"
},
{
"name": "UTF-16 to UTF-16 (Well-Formed, with Init)",
"pattern": "utf16_to_utf16_init_well_formed_",
"ascending": false,
"description": "A conversion from UTF-16 data to UTF-16 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf16_to_utf16_well_formed_init"
},
{
"name": "UTF-32 to UTF-32 (Well-Formed, with Init)",
"pattern": "utf32_to_utf32_init_well_formed_",
"ascending": false,
"description": "A conversion from UTF-32 data to UTF-32 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf32_to_utf32_well_formed_init"
},
{
"name": "UTF-16 to UTF-8 (Well-Formed, with Init)",
Expand All @@ -61,6 +96,13 @@
"description": "A conversion from UTF-16 data to UTF-8 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf16_to_utf8_well_formed_init"
},
{
"name": "UTF-16 to UTF-32 (Well-Formed, with Init)",
"pattern": "utf16_to_utf32_init_well_formed_",
"ascending": false,
"description": "A conversion from UTF-16 data to UTF-32 data that contains no ill-formed or incomplete sequences.",
"file_name": "utf16_to_utf32_well_formed_init"
},
{
"name": "UTF-8 to UTF-16 (Well-Formed, with Init)",
"pattern": "utf8_to_utf16_init_well_formed_",
Expand Down Expand Up @@ -111,16 +153,6 @@
"pattern": "cuneicode_registry_unbounded$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the non-typed conversion routines from its Conversion Registry abstraction with specific conversion pathways overridden (without providing an output size)."
},
{
"name": "cuneicode registry (single loop)",
"pattern": "cuneicode_registry_single$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the non-typed conversion routines from its Conversion Registry abstraction with all defaults left alone."
},
{
"name": "cuneicode registry (single loop, unbounded)",
"pattern": "cuneicode_registry_single_unbounded$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the non-typed conversion routines from its Conversion Registry abstraction with specific conversion pathways overridden (without providing an output size)."
},
{
"name": "cuneicode registry (assume valid)",
"pattern": "cuneicode_registry_unchecked$",
Expand All @@ -131,16 +163,6 @@
"pattern": "cuneicode_registry_unchecked_unbounded$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the non-typed conversion routines from its Conversion Registry abstraction with specific conversion pathways overridden (without providing an output size, and without checking input validity)."
},
{
"name": "cuneicode registry (single loop, assume valid)",
"pattern": "cuneicode_registry_single_unchecked$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the non-typed conversion routines from its Conversion Registry abstraction with all defaults left alone (without checking for the validity of the input)."
},
{
"name": "cuneicode registry (single loop, unbounded, assume valid)",
"pattern": "cuneicode_registry_single_unchecked_unbounded$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the non-typed conversion routines from its Conversion Registry abstraction with specific conversion pathways overridden (without providing an output size, and without checking input validity)."
},
{
"name": "cuneicode",
"pattern": "cuneicode$",
Expand All @@ -152,14 +174,14 @@
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the typed, non-generic C-style encoding routines (without providing an output size)."
},
{
"name": "cuneicode (single loop)",
"pattern": "cuneicode_single$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the typed, non-generic C-style encoding routines that use the \"indivisable unit fo conversion\" functions."
"name": "cuneicode (unchecked)",
"pattern": "cuneicode_unchecked$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the typed, non-generic C-style encoding routines."
},
{
"name": "cuneicode (single loop, unbounded)",
"pattern": "cuneicode_single_unbounded$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the typed, non-generic C-style encoding routines \"indivisable unit fo conversion\" functions (without providing an output size)."
"name": "cuneicode (unchecked, unbounded)",
"pattern": "cuneicode_unbounded_unchecked$",
"description": "Measures the ztd.cuneicode library from Shepherd's Oasis and its encoding routines, particularly the typed, non-generic C-style encoding routines (without providing an output size)."
},
{
"name": "libiconv",
Expand Down Expand Up @@ -246,26 +268,6 @@
"pattern": "ztd_text_unbounded$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::transcode function, with output bounds checking turned off."
},
{
"name": "ztd.text (basic)",
"pattern": "ztd_text_basic$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::basic_transcode_into_raw function."
},
{
"name": "ztd.text (basic, unbounded)",
"pattern": "ztd_text_basic_unbounded$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::basic_transcode_into_raw function, with output bounds checking turned off."
},
{
"name": "ztd.text (single loop)",
"pattern": "ztd_text_single$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::transcode_one function."
},
{
"name": "ztd.text (single loop, unbounded)",
"pattern": "ztd_text_single_unbounded$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::transcode_one function in a loop, with output bounds checking turned off."
},
{
"name": "ztd.text view",
"pattern": "ztd_text_view$",
Expand All @@ -281,26 +283,6 @@
"pattern": "ztd_text_unbounded_unchecked$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::transcode function, with output bounds checking turned off."
},
{
"name": "ztd.text (basic, assume valid)",
"pattern": "ztd_text_basic_unchecked$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::transcode function."
},
{
"name": "ztd.text (basic, unbounded, assume valid)",
"pattern": "ztd_text_basic_unbounded_unchecked$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::transcode function, with output bounds checking turned off."
},
{
"name": "ztd.text (single loop, assume valid)",
"pattern": "ztd_text_single_unchecked$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::transcode_one function."
},
{
"name": "ztd.text (single loop, unbounded, assume valid)",
"pattern": "ztd_text_single_unbounded_unchecked$",
"description": "Measures the ztd.text library conversion routine using the ztd::text::transcode_one function in a loop, with output bounds checking turned off."
},
{
"name": "ztd.text view (assume valid)",
"pattern": "ztd_text_view_unchecked$",
Expand Down
Loading

0 comments on commit d34d4d0

Please sign in to comment.