From 9e4fcf39cefa3be4cb446f2e3653183b8df312e1 Mon Sep 17 00:00:00 2001 From: chiteroman <98092901+chiteroman@users.noreply.github.com> Date: Mon, 13 Nov 2023 14:22:11 +0100 Subject: [PATCH] fix --- app/build.gradle.kts | 20 +- app/src/main/cpp/CMakeLists.txt | 12 +- app/src/main/cpp/libcxx/arm64-v8a.a | Bin 0 -> 2045696 bytes app/src/main/cpp/libcxx/armeabi-v7a.a | Bin 0 -> 2372904 bytes .../main/cpp/libcxx/include/CMakeLists.txt | 934 +++ .../include/__algorithm/adjacent_find.h | 53 + .../cpp/libcxx/include/__algorithm/all_of.h | 32 + .../cpp/libcxx/include/__algorithm/any_of.h | 32 + .../include/__algorithm/binary_search.h | 46 + .../cpp/libcxx/include/__algorithm/clamp.h | 46 + .../cpp/libcxx/include/__algorithm/comp.h | 66 + .../include/__algorithm/comp_ref_type.h | 79 + .../cpp/libcxx/include/__algorithm/copy.h | 126 + .../include/__algorithm/copy_backward.h | 143 + .../cpp/libcxx/include/__algorithm/copy_if.h | 39 + .../include/__algorithm/copy_move_common.h | 163 + .../cpp/libcxx/include/__algorithm/copy_n.h | 67 + .../cpp/libcxx/include/__algorithm/count.h | 35 + .../cpp/libcxx/include/__algorithm/count_if.h | 35 + .../cpp/libcxx/include/__algorithm/equal.h | 86 + .../libcxx/include/__algorithm/equal_range.h | 87 + .../cpp/libcxx/include/__algorithm/fill.h | 52 + .../cpp/libcxx/include/__algorithm/fill_n.h | 45 + .../cpp/libcxx/include/__algorithm/find.h | 32 + .../cpp/libcxx/include/__algorithm/find_end.h | 227 + .../include/__algorithm/find_first_of.h | 52 + .../cpp/libcxx/include/__algorithm/find_if.h | 32 + .../libcxx/include/__algorithm/find_if_not.h | 32 + .../cpp/libcxx/include/__algorithm/for_each.h | 32 + .../libcxx/include/__algorithm/for_each_n.h | 43 + .../cpp/libcxx/include/__algorithm/generate.h | 31 + .../libcxx/include/__algorithm/generate_n.h | 36 + .../include/__algorithm/half_positive.h | 49 + .../include/__algorithm/in_found_result.h | 49 + .../include/__algorithm/in_fun_result.h | 49 + .../include/__algorithm/in_in_out_result.h | 56 + .../libcxx/include/__algorithm/in_in_result.h | 53 + .../include/__algorithm/in_out_out_result.h | 54 + .../include/__algorithm/in_out_result.h | 53 + .../cpp/libcxx/include/__algorithm/includes.h | 75 + .../include/__algorithm/inplace_merge.h | 257 + .../cpp/libcxx/include/__algorithm/is_heap.h | 44 + .../include/__algorithm/is_heap_until.h | 66 + .../include/__algorithm/is_partitioned.h | 38 + .../include/__algorithm/is_permutation.h | 238 + .../libcxx/include/__algorithm/is_sorted.h | 44 + .../include/__algorithm/is_sorted_until.h | 56 + .../libcxx/include/__algorithm/iter_swap.h | 32 + .../include/__algorithm/iterator_operations.h | 175 + .../__algorithm/lexicographical_compare.h | 62 + .../libcxx/include/__algorithm/lower_bound.h | 68 + .../libcxx/include/__algorithm/make_heap.h | 56 + .../include/__algorithm/make_projected.h | 126 + .../main/cpp/libcxx/include/__algorithm/max.h | 71 + .../libcxx/include/__algorithm/max_element.h | 57 + .../cpp/libcxx/include/__algorithm/merge.h | 70 + .../main/cpp/libcxx/include/__algorithm/min.h | 71 + .../libcxx/include/__algorithm/min_element.h | 70 + .../include/__algorithm/min_max_result.h | 56 + .../cpp/libcxx/include/__algorithm/minmax.h | 69 + .../include/__algorithm/minmax_element.h | 101 + .../cpp/libcxx/include/__algorithm/mismatch.h | 63 + .../cpp/libcxx/include/__algorithm/move.h | 130 + .../include/__algorithm/move_backward.h | 139 + .../include/__algorithm/next_permutation.h | 78 + .../cpp/libcxx/include/__algorithm/none_of.h | 32 + .../libcxx/include/__algorithm/nth_element.h | 258 + .../libcxx/include/__algorithm/partial_sort.h | 96 + .../include/__algorithm/partial_sort_copy.h | 88 + .../libcxx/include/__algorithm/partition.h | 98 + .../include/__algorithm/partition_copy.h | 47 + .../include/__algorithm/partition_point.h | 48 + .../cpp/libcxx/include/__algorithm/pop_heap.h | 73 + .../include/__algorithm/prev_permutation.h | 79 + .../libcxx/include/__algorithm/push_heap.h | 77 + .../__algorithm/ranges_adjacent_find.h | 78 + .../include/__algorithm/ranges_all_of.h | 68 + .../include/__algorithm/ranges_any_of.h | 68 + .../__algorithm/ranges_binary_search.h | 63 + .../libcxx/include/__algorithm/ranges_clamp.h | 65 + .../libcxx/include/__algorithm/ranges_copy.h | 67 + .../__algorithm/ranges_copy_backward.h | 65 + .../include/__algorithm/ranges_copy_if.h | 81 + .../include/__algorithm/ranges_copy_n.h | 77 + .../libcxx/include/__algorithm/ranges_count.h | 62 + .../include/__algorithm/ranges_count_if.h | 72 + .../libcxx/include/__algorithm/ranges_equal.h | 115 + .../include/__algorithm/ranges_equal_range.h | 78 + .../libcxx/include/__algorithm/ranges_fill.h | 59 + .../include/__algorithm/ranges_fill_n.h | 48 + .../libcxx/include/__algorithm/ranges_find.h | 63 + .../include/__algorithm/ranges_find_end.h | 98 + .../__algorithm/ranges_find_first_of.h | 101 + .../include/__algorithm/ranges_find_if.h | 71 + .../include/__algorithm/ranges_find_if_not.h | 63 + .../include/__algorithm/ranges_for_each.h | 78 + .../include/__algorithm/ranges_for_each_n.h | 66 + .../include/__algorithm/ranges_generate.h | 73 + .../include/__algorithm/ranges_generate_n.h | 62 + .../include/__algorithm/ranges_includes.h | 95 + .../__algorithm/ranges_inplace_merge.h | 85 + .../include/__algorithm/ranges_is_heap.h | 74 + .../__algorithm/ranges_is_heap_until.h | 75 + .../__algorithm/ranges_is_partitioned.h | 81 + .../__algorithm/ranges_is_permutation.h | 89 + .../include/__algorithm/ranges_is_sorted.h | 61 + .../__algorithm/ranges_is_sorted_until.h | 76 + .../__algorithm/ranges_iterator_concept.h | 51 + .../ranges_lexicographical_compare.h | 98 + .../include/__algorithm/ranges_lower_bound.h | 66 + .../include/__algorithm/ranges_make_heap.h | 80 + .../libcxx/include/__algorithm/ranges_max.h | 93 + .../include/__algorithm/ranges_max_element.h | 61 + .../libcxx/include/__algorithm/ranges_merge.h | 142 + .../libcxx/include/__algorithm/ranges_min.h | 89 + .../include/__algorithm/ranges_min_element.h | 74 + .../include/__algorithm/ranges_minmax.h | 134 + .../__algorithm/ranges_minmax_element.h | 72 + .../include/__algorithm/ranges_mismatch.h | 85 + .../libcxx/include/__algorithm/ranges_move.h | 71 + .../__algorithm/ranges_move_backward.h | 73 + .../__algorithm/ranges_next_permutation.h | 73 + .../include/__algorithm/ranges_none_of.h | 68 + .../include/__algorithm/ranges_nth_element.h | 80 + .../include/__algorithm/ranges_partial_sort.h | 78 + .../__algorithm/ranges_partial_sort_copy.h | 92 + .../include/__algorithm/ranges_partition.h | 83 + .../__algorithm/ranges_partition_copy.h | 98 + .../__algorithm/ranges_partition_point.h | 88 + .../include/__algorithm/ranges_pop_heap.h | 81 + .../__algorithm/ranges_prev_permutation.h | 77 + .../include/__algorithm/ranges_push_heap.h | 80 + .../include/__algorithm/ranges_remove.h | 64 + .../include/__algorithm/ranges_remove_copy.h | 76 + .../__algorithm/ranges_remove_copy_if.h | 90 + .../include/__algorithm/ranges_remove_if.h | 85 + .../include/__algorithm/ranges_replace.h | 74 + .../include/__algorithm/ranges_replace_copy.h | 91 + .../__algorithm/ranges_replace_copy_if.h | 93 + .../include/__algorithm/ranges_replace_if.h | 77 + .../include/__algorithm/ranges_reverse.h | 83 + .../include/__algorithm/ranges_reverse_copy.h | 67 + .../include/__algorithm/ranges_rotate.h | 71 + .../include/__algorithm/ranges_rotate_copy.h | 68 + .../include/__algorithm/ranges_sample.h | 74 + .../include/__algorithm/ranges_search.h | 135 + .../include/__algorithm/ranges_search_n.h | 117 + .../__algorithm/ranges_set_difference.h | 106 + .../__algorithm/ranges_set_intersection.h | 117 + .../ranges_set_symmetric_difference.h | 117 + .../include/__algorithm/ranges_set_union.h | 121 + .../include/__algorithm/ranges_shuffle.h | 71 + .../libcxx/include/__algorithm/ranges_sort.h | 79 + .../include/__algorithm/ranges_sort_heap.h | 80 + .../__algorithm/ranges_stable_partition.h | 88 + .../include/__algorithm/ranges_stable_sort.h | 79 + .../include/__algorithm/ranges_swap_ranges.h | 68 + .../include/__algorithm/ranges_transform.h | 170 + .../include/__algorithm/ranges_unique.h | 79 + .../include/__algorithm/ranges_unique_copy.h | 116 + .../include/__algorithm/ranges_upper_bound.h | 75 + .../cpp/libcxx/include/__algorithm/remove.h | 45 + .../libcxx/include/__algorithm/remove_copy.h | 38 + .../include/__algorithm/remove_copy_if.h | 38 + .../libcxx/include/__algorithm/remove_if.h | 44 + .../cpp/libcxx/include/__algorithm/replace.h | 32 + .../libcxx/include/__algorithm/replace_copy.h | 36 + .../include/__algorithm/replace_copy_if.h | 36 + .../libcxx/include/__algorithm/replace_if.h | 32 + .../cpp/libcxx/include/__algorithm/reverse.h | 65 + .../libcxx/include/__algorithm/reverse_copy.h | 32 + .../cpp/libcxx/include/__algorithm/rotate.h | 221 + .../libcxx/include/__algorithm/rotate_copy.h | 31 + .../cpp/libcxx/include/__algorithm/sample.h | 112 + .../cpp/libcxx/include/__algorithm/search.h | 201 + .../cpp/libcxx/include/__algorithm/search_n.h | 181 + .../include/__algorithm/set_difference.h | 81 + .../include/__algorithm/set_intersection.h | 99 + .../__algorithm/set_symmetric_difference.h | 105 + .../libcxx/include/__algorithm/set_union.h | 101 + .../libcxx/include/__algorithm/shift_left.h | 56 + .../libcxx/include/__algorithm/shift_right.h | 102 + .../cpp/libcxx/include/__algorithm/shuffle.h | 175 + .../libcxx/include/__algorithm/sift_down.h | 114 + .../cpp/libcxx/include/__algorithm/sort.h | 1001 +++ .../libcxx/include/__algorithm/sort_heap.h | 55 + .../include/__algorithm/stable_partition.h | 329 + .../libcxx/include/__algorithm/stable_sort.h | 247 + .../libcxx/include/__algorithm/swap_ranges.h | 60 + .../libcxx/include/__algorithm/transform.h | 43 + .../uniform_random_bit_generator_adaptor.h | 62 + .../cpp/libcxx/include/__algorithm/unique.h | 59 + .../libcxx/include/__algorithm/unique_copy.h | 122 + .../libcxx/include/__algorithm/unwrap_iter.h | 74 + .../libcxx/include/__algorithm/unwrap_range.h | 97 + .../libcxx/include/__algorithm/upper_bound.h | 68 + app/src/main/cpp/libcxx/include/__assert | 55 + .../main/cpp/libcxx/include/__availability | 288 + .../main/cpp/libcxx/include/__bit/bit_cast.h | 36 + .../main/cpp/libcxx/include/__bit/bit_ceil.h | 46 + .../main/cpp/libcxx/include/__bit/bit_floor.h | 34 + .../main/cpp/libcxx/include/__bit/bit_log2.h | 34 + .../main/cpp/libcxx/include/__bit/bit_width.h | 33 + app/src/main/cpp/libcxx/include/__bit/blsr.h | 34 + .../main/cpp/libcxx/include/__bit/byteswap.h | 55 + .../main/cpp/libcxx/include/__bit/countl.h | 104 + .../main/cpp/libcxx/include/__bit/countr.h | 70 + .../main/cpp/libcxx/include/__bit/endian.h | 38 + .../cpp/libcxx/include/__bit/has_single_bit.h | 37 + .../main/cpp/libcxx/include/__bit/popcount.h | 61 + .../main/cpp/libcxx/include/__bit/rotate.h | 53 + .../main/cpp/libcxx/include/__bit_reference | 1360 ++++ .../libcxx/include/__bsd_locale_defaults.h | 36 + .../libcxx/include/__bsd_locale_fallbacks.h | 142 + .../libcxx/include/__charconv/chars_format.h | 77 + .../include/__charconv/from_chars_result.h | 37 + .../cpp/libcxx/include/__charconv/tables.h | 154 + .../include/__charconv/to_chars_base_10.h | 185 + .../include/__charconv/to_chars_result.h | 37 + .../cpp/libcxx/include/__chrono/calendar.h | 44 + .../include/__chrono/convert_to_timespec.h | 56 + .../libcxx/include/__chrono/convert_to_tm.h | 127 + .../main/cpp/libcxx/include/__chrono/day.h | 84 + .../cpp/libcxx/include/__chrono/duration.h | 622 ++ .../cpp/libcxx/include/__chrono/file_clock.h | 85 + .../cpp/libcxx/include/__chrono/formatter.h | 716 ++ .../cpp/libcxx/include/__chrono/hh_mm_ss.h | 112 + .../include/__chrono/high_resolution_clock.h | 36 + .../cpp/libcxx/include/__chrono/literals.h | 49 + .../main/cpp/libcxx/include/__chrono/month.h | 103 + .../libcxx/include/__chrono/month_weekday.h | 106 + .../cpp/libcxx/include/__chrono/monthday.h | 129 + .../cpp/libcxx/include/__chrono/ostream.h | 238 + .../include/__chrono/parser_std_format_spec.h | 410 + .../include/__chrono/statically_widen.h | 52 + .../libcxx/include/__chrono/steady_clock.h | 44 + .../libcxx/include/__chrono/system_clock.h | 54 + .../cpp/libcxx/include/__chrono/time_point.h | 251 + .../cpp/libcxx/include/__chrono/weekday.h | 185 + .../main/cpp/libcxx/include/__chrono/year.h | 102 + .../cpp/libcxx/include/__chrono/year_month.h | 101 + .../libcxx/include/__chrono/year_month_day.h | 307 + .../include/__chrono/year_month_weekday.h | 255 + .../__compare/common_comparison_category.h | 95 + .../compare_partial_order_fallback.h | 74 + .../__compare/compare_strong_order_fallback.h | 71 + .../include/__compare/compare_three_way.h | 41 + .../__compare/compare_three_way_result.h | 44 + .../__compare/compare_weak_order_fallback.h | 71 + .../main/cpp/libcxx/include/__compare/is_eq.h | 34 + .../cpp/libcxx/include/__compare/ordering.h | 326 + .../libcxx/include/__compare/partial_order.h | 74 + .../libcxx/include/__compare/strong_order.h | 139 + .../include/__compare/synth_three_way.h | 51 + .../include/__compare/three_way_comparable.h | 59 + .../cpp/libcxx/include/__compare/weak_order.h | 102 + .../libcxx/include/__concepts/arithmetic.h | 52 + .../libcxx/include/__concepts/assignable.h | 41 + .../include/__concepts/boolean_testable.h | 38 + .../libcxx/include/__concepts/class_or_enum.h | 40 + .../__concepts/common_reference_with.h | 37 + .../libcxx/include/__concepts/common_with.h | 50 + .../libcxx/include/__concepts/constructible.h | 56 + .../include/__concepts/convertible_to.h | 37 + .../cpp/libcxx/include/__concepts/copyable.h | 39 + .../libcxx/include/__concepts/derived_from.h | 35 + .../libcxx/include/__concepts/destructible.h | 32 + .../include/__concepts/different_from.h | 31 + .../include/__concepts/equality_comparable.h | 54 + .../cpp/libcxx/include/__concepts/invocable.h | 40 + .../cpp/libcxx/include/__concepts/movable.h | 39 + .../cpp/libcxx/include/__concepts/predicate.h | 35 + .../cpp/libcxx/include/__concepts/regular.h | 33 + .../cpp/libcxx/include/__concepts/relation.h | 44 + .../cpp/libcxx/include/__concepts/same_as.h | 35 + .../libcxx/include/__concepts/semiregular.h | 33 + .../cpp/libcxx/include/__concepts/swappable.h | 121 + .../include/__concepts/totally_ordered.h | 58 + app/src/main/cpp/libcxx/include/__config | 1255 +++ app/src/main/cpp/libcxx/include/__config_site | 39 + .../main/cpp/libcxx/include/__config_site.in | 49 + .../include/__coroutine/coroutine_handle.h | 203 + .../include/__coroutine/coroutine_traits.h | 53 + .../__coroutine/noop_coroutine_handle.h | 112 + .../include/__coroutine/trivial_awaitables.h | 46 + app/src/main/cpp/libcxx/include/__debug | 266 + .../include/__debug_utils/randomize_range.h | 43 + app/src/main/cpp/libcxx/include/__errc | 217 + .../include/__expected/bad_expected_access.h | 64 + .../cpp/libcxx/include/__expected/expected.h | 973 +++ .../cpp/libcxx/include/__expected/unexpect.h | 32 + .../libcxx/include/__expected/unexpected.h | 122 + .../include/__filesystem/copy_options.h | 84 + .../include/__filesystem/directory_entry.h | 527 ++ .../include/__filesystem/directory_iterator.h | 165 + .../include/__filesystem/directory_options.h | 82 + .../libcxx/include/__filesystem/file_status.h | 72 + .../include/__filesystem/file_time_type.h | 32 + .../libcxx/include/__filesystem/file_type.h | 43 + .../include/__filesystem/filesystem_error.h | 104 + .../libcxx/include/__filesystem/operations.h | 201 + .../cpp/libcxx/include/__filesystem/path.h | 1091 +++ .../include/__filesystem/path_iterator.h | 134 + .../include/__filesystem/perm_options.h | 77 + .../cpp/libcxx/include/__filesystem/perms.h | 95 + .../recursive_directory_iterator.h | 185 + .../libcxx/include/__filesystem/space_info.h | 43 + .../cpp/libcxx/include/__filesystem/u8path.h | 108 + .../main/cpp/libcxx/include/__format/buffer.h | 573 ++ .../cpp/libcxx/include/__format/concepts.h | 78 + .../include/__format/container_adaptor.h | 70 + .../include/__format/enable_insertable.h | 35 + .../include/__format/escaped_output_table.h | 1038 +++ .../extended_grapheme_cluster_table.h | 1661 ++++ .../cpp/libcxx/include/__format/format_arg.h | 302 + .../include/__format/format_arg_store.h | 254 + .../cpp/libcxx/include/__format/format_args.h | 80 + .../libcxx/include/__format/format_context.h | 223 + .../libcxx/include/__format/format_error.h | 55 + .../include/__format/format_functions.h | 661 ++ .../cpp/libcxx/include/__format/format_fwd.h | 39 + .../include/__format/format_parse_context.h | 100 + .../libcxx/include/__format/format_string.h | 163 + .../include/__format/format_to_n_result.h | 35 + .../cpp/libcxx/include/__format/formatter.h | 54 + .../libcxx/include/__format/formatter_bool.h | 78 + .../libcxx/include/__format/formatter_char.h | 93 + .../__format/formatter_floating_point.h | 757 ++ .../include/__format/formatter_integer.h | 107 + .../include/__format/formatter_integral.h | 363 + .../include/__format/formatter_output.h | 570 ++ .../include/__format/formatter_pointer.h | 73 + .../include/__format/formatter_string.h | 159 + .../libcxx/include/__format/formatter_tuple.h | 178 + .../include/__format/parser_std_format_spec.h | 954 +++ .../__format/range_default_formatter.h | 201 + .../libcxx/include/__format/range_formatter.h | 255 + .../cpp/libcxx/include/__format/unicode.h | 489 ++ .../include/__functional/binary_function.h | 54 + .../include/__functional/binary_negate.h | 50 + .../cpp/libcxx/include/__functional/bind.h | 389 + .../libcxx/include/__functional/bind_back.h | 64 + .../libcxx/include/__functional/bind_front.h | 58 + .../libcxx/include/__functional/binder1st.h | 53 + .../libcxx/include/__functional/binder2nd.h | 53 + .../__functional/boyer_moore_searcher.h | 315 + .../cpp/libcxx/include/__functional/compose.h | 52 + .../include/__functional/default_searcher.h | 57 + .../libcxx/include/__functional/function.h | 1216 +++ .../cpp/libcxx/include/__functional/hash.h | 693 ++ .../libcxx/include/__functional/identity.h | 46 + .../cpp/libcxx/include/__functional/invoke.h | 546 ++ .../include/__functional/is_transparent.h | 35 + .../cpp/libcxx/include/__functional/mem_fn.h | 59 + .../libcxx/include/__functional/mem_fun_ref.h | 173 + .../cpp/libcxx/include/__functional/not_fn.h | 54 + .../libcxx/include/__functional/operations.h | 580 ++ .../include/__functional/perfect_forward.h | 94 + .../__functional/pointer_to_binary_function.h | 46 + .../__functional/pointer_to_unary_function.h | 46 + .../include/__functional/ranges_operations.h | 100 + .../include/__functional/reference_wrapper.h | 105 + .../include/__functional/unary_function.h | 51 + .../include/__functional/unary_negate.h | 47 + .../libcxx/include/__functional/unwrap_ref.h | 58 + .../include/__functional/weak_result_type.h | 294 + app/src/main/cpp/libcxx/include/__fwd/array.h | 26 + app/src/main/cpp/libcxx/include/__fwd/get.h | 115 + app/src/main/cpp/libcxx/include/__fwd/hash.h | 25 + .../libcxx/include/__fwd/memory_resource.h | 27 + app/src/main/cpp/libcxx/include/__fwd/pair.h | 25 + app/src/main/cpp/libcxx/include/__fwd/span.h | 37 + .../main/cpp/libcxx/include/__fwd/string.h | 110 + .../cpp/libcxx/include/__fwd/string_view.h | 50 + .../main/cpp/libcxx/include/__fwd/subrange.h | 38 + app/src/main/cpp/libcxx/include/__fwd/tuple.h | 29 + app/src/main/cpp/libcxx/include/__hash_table | 2715 +++++++ app/src/main/cpp/libcxx/include/__ios/fpos.h | 79 + .../cpp/libcxx/include/__iterator/access.h | 129 + .../cpp/libcxx/include/__iterator/advance.h | 203 + .../include/__iterator/back_insert_iterator.h | 73 + .../libcxx/include/__iterator/bounded_iter.h | 231 + .../include/__iterator/common_iterator.h | 281 + .../cpp/libcxx/include/__iterator/concepts.h | 300 + .../include/__iterator/counted_iterator.h | 310 + .../main/cpp/libcxx/include/__iterator/data.h | 51 + .../include/__iterator/default_sentinel.h | 30 + .../cpp/libcxx/include/__iterator/distance.h | 108 + .../cpp/libcxx/include/__iterator/empty.h | 44 + .../include/__iterator/erase_if_container.h | 40 + .../__iterator/front_insert_iterator.h | 71 + .../include/__iterator/incrementable_traits.h | 78 + .../__iterator/indirectly_comparable.h | 34 + .../include/__iterator/insert_iterator.h | 81 + .../include/__iterator/istream_iterator.h | 105 + .../include/__iterator/istreambuf_iterator.h | 119 + .../cpp/libcxx/include/__iterator/iter_move.h | 104 + .../cpp/libcxx/include/__iterator/iter_swap.h | 113 + .../cpp/libcxx/include/__iterator/iterator.h | 35 + .../include/__iterator/iterator_traits.h | 539 ++ .../include/__iterator/iterator_with_data.h | 100 + .../cpp/libcxx/include/__iterator/mergeable.h | 41 + .../libcxx/include/__iterator/move_iterator.h | 335 + .../libcxx/include/__iterator/move_sentinel.h | 59 + .../main/cpp/libcxx/include/__iterator/next.h | 84 + .../include/__iterator/ostream_iterator.h | 71 + .../include/__iterator/ostreambuf_iterator.h | 77 + .../libcxx/include/__iterator/permutable.h | 35 + .../main/cpp/libcxx/include/__iterator/prev.h | 77 + .../cpp/libcxx/include/__iterator/projected.h | 41 + .../include/__iterator/readable_traits.h | 92 + .../include/__iterator/reverse_access.h | 100 + .../include/__iterator/reverse_iterator.h | 533 ++ .../include/__iterator/segmented_iterator.h | 79 + .../main/cpp/libcxx/include/__iterator/size.h | 59 + .../cpp/libcxx/include/__iterator/sortable.h | 37 + .../include/__iterator/unreachable_sentinel.h | 38 + .../cpp/libcxx/include/__iterator/wrap_iter.h | 286 + app/src/main/cpp/libcxx/include/__locale | 1816 +++++ app/src/main/cpp/libcxx/include/__mbstate_t.h | 44 + .../cpp/libcxx/include/__memory/addressof.h | 76 + .../main/cpp/libcxx/include/__memory/align.h | 25 + .../include/__memory/allocate_at_least.h | 62 + .../include/__memory/allocation_guard.h | 83 + .../cpp/libcxx/include/__memory/allocator.h | 273 + .../libcxx/include/__memory/allocator_arg_t.h | 80 + .../include/__memory/allocator_destructor.h | 42 + .../include/__memory/allocator_traits.h | 410 + .../libcxx/include/__memory/assume_aligned.h | 46 + .../cpp/libcxx/include/__memory/auto_ptr.h | 84 + .../include/__memory/builtin_new_allocator.h | 70 + .../libcxx/include/__memory/compressed_pair.h | 177 + .../cpp/libcxx/include/__memory/concepts.h | 69 + .../libcxx/include/__memory/construct_at.h | 120 + .../cpp/libcxx/include/__memory/destruct_n.h | 64 + .../libcxx/include/__memory/pointer_traits.h | 242 + .../include/__memory/ranges_construct_at.h | 125 + .../ranges_uninitialized_algorithms.h | 319 + .../include/__memory/raw_storage_iterator.h | 70 + .../cpp/libcxx/include/__memory/shared_ptr.h | 2008 +++++ .../libcxx/include/__memory/swap_allocator.h | 54 + .../cpp/libcxx/include/__memory/temp_value.h | 56 + .../include/__memory/temporary_buffer.h | 87 + .../__memory/uninitialized_algorithms.h | 646 ++ .../cpp/libcxx/include/__memory/unique_ptr.h | 746 ++ .../libcxx/include/__memory/uses_allocator.h | 59 + .../__memory/uses_allocator_construction.h | 221 + .../cpp/libcxx/include/__memory/voidify.h | 30 + .../__memory_resource/memory_resource.h | 75 + .../monotonic_buffer_resource.h | 120 + .../__memory_resource/polymorphic_allocator.h | 224 + .../include/__memory_resource/pool_options.h | 38 + .../synchronized_pool_resource.h | 94 + .../unsynchronized_pool_resource.h | 106 + app/src/main/cpp/libcxx/include/__mutex_base | 523 ++ app/src/main/cpp/libcxx/include/__node_handle | 254 + .../cpp/libcxx/include/__numeric/accumulate.h | 52 + .../include/__numeric/adjacent_difference.h | 72 + .../libcxx/include/__numeric/exclusive_scan.h | 53 + .../cpp/libcxx/include/__numeric/gcd_lcm.h | 100 + .../libcxx/include/__numeric/inclusive_scan.h | 60 + .../libcxx/include/__numeric/inner_product.h | 53 + .../main/cpp/libcxx/include/__numeric/iota.h | 32 + .../cpp/libcxx/include/__numeric/midpoint.h | 95 + .../libcxx/include/__numeric/partial_sum.h | 70 + .../cpp/libcxx/include/__numeric/reduce.h | 47 + .../__numeric/transform_exclusive_scan.h | 49 + .../__numeric/transform_inclusive_scan.h | 58 + .../include/__numeric/transform_reduce.h | 54 + .../include/__random/bernoulli_distribution.h | 145 + .../include/__random/binomial_distribution.h | 228 + .../include/__random/cauchy_distribution.h | 164 + .../__random/chi_squared_distribution.h | 144 + .../include/__random/clamp_to_integral.h | 60 + .../include/__random/default_random_engine.h | 25 + .../include/__random/discard_block_engine.h | 205 + .../include/__random/discrete_distribution.h | 263 + .../__random/exponential_distribution.h | 157 + .../__random/extreme_value_distribution.h | 163 + .../include/__random/fisher_f_distribution.h | 162 + .../include/__random/gamma_distribution.h | 215 + .../include/__random/generate_canonical.h | 53 + .../include/__random/geometric_distribution.h | 143 + .../__random/independent_bits_engine.h | 267 + .../include/__random/is_seed_sequence.h | 31 + .../cpp/libcxx/include/__random/is_valid.h | 61 + .../cpp/libcxx/include/__random/knuth_b.h | 26 + .../__random/linear_congruential_engine.h | 398 + .../main/cpp/libcxx/include/__random/log2.h | 71 + .../include/__random/lognormal_distribution.h | 299 + .../__random/mersenne_twister_engine.h | 534 ++ .../__random/negative_binomial_distribution.h | 183 + .../include/__random/normal_distribution.h | 210 + .../piecewise_constant_distribution.h | 358 + .../__random/piecewise_linear_distribution.h | 374 + .../include/__random/poisson_distribution.h | 280 + .../libcxx/include/__random/random_device.h | 84 + .../main/cpp/libcxx/include/__random/ranlux.h | 31 + .../cpp/libcxx/include/__random/seed_seq.h | 177 + .../include/__random/shuffle_order_engine.h | 283 + .../include/__random/student_t_distribution.h | 155 + .../__random/subtract_with_carry_engine.h | 352 + .../__random/uniform_int_distribution.h | 292 + .../__random/uniform_random_bit_generator.h | 45 + .../__random/uniform_real_distribution.h | 162 + .../include/__random/weibull_distribution.h | 155 + .../main/cpp/libcxx/include/__ranges/access.h | 230 + .../main/cpp/libcxx/include/__ranges/all.h | 84 + .../libcxx/include/__ranges/as_rvalue_view.h | 137 + .../cpp/libcxx/include/__ranges/common_view.h | 137 + .../cpp/libcxx/include/__ranges/concepts.h | 147 + .../libcxx/include/__ranges/copyable_box.h | 180 + .../cpp/libcxx/include/__ranges/counted.h | 82 + .../cpp/libcxx/include/__ranges/dangling.h | 42 + .../main/cpp/libcxx/include/__ranges/data.h | 112 + .../cpp/libcxx/include/__ranges/drop_view.h | 308 + .../libcxx/include/__ranges/drop_while_view.h | 129 + .../libcxx/include/__ranges/elements_view.h | 423 + .../main/cpp/libcxx/include/__ranges/empty.h | 82 + .../cpp/libcxx/include/__ranges/empty_view.h | 53 + .../include/__ranges/enable_borrowed_range.h | 40 + .../cpp/libcxx/include/__ranges/enable_view.h | 50 + .../cpp/libcxx/include/__ranges/filter_view.h | 280 + .../cpp/libcxx/include/__ranges/iota_view.h | 434 ++ .../libcxx/include/__ranges/istream_view.h | 149 + .../cpp/libcxx/include/__ranges/join_view.h | 452 ++ .../libcxx/include/__ranges/lazy_split_view.h | 465 ++ .../include/__ranges/non_propagating_cache.h | 114 + .../cpp/libcxx/include/__ranges/owning_view.h | 83 + .../libcxx/include/__ranges/range_adaptor.h | 77 + .../main/cpp/libcxx/include/__ranges/rbegin.h | 131 + .../cpp/libcxx/include/__ranges/ref_view.h | 88 + .../main/cpp/libcxx/include/__ranges/rend.h | 135 + .../libcxx/include/__ranges/reverse_view.h | 191 + .../cpp/libcxx/include/__ranges/single_view.h | 102 + .../main/cpp/libcxx/include/__ranges/size.h | 148 + .../cpp/libcxx/include/__ranges/split_view.h | 232 + .../cpp/libcxx/include/__ranges/subrange.h | 291 + .../cpp/libcxx/include/__ranges/take_view.h | 343 + .../libcxx/include/__ranges/take_while_view.h | 183 + .../libcxx/include/__ranges/transform_view.h | 467 ++ .../libcxx/include/__ranges/view_interface.h | 177 + .../main/cpp/libcxx/include/__ranges/views.h | 35 + .../cpp/libcxx/include/__ranges/zip_view.h | 512 ++ .../main/cpp/libcxx/include/__split_buffer | 656 ++ app/src/main/cpp/libcxx/include/__std_stream | 361 + .../cpp/libcxx/include/__string/char_traits.h | 836 ++ .../include/__string/extern_template_lists.h | 131 + .../include/__support/android/locale_bionic.h | 72 + .../include/__support/fuchsia/xlocale.h | 22 + .../libcxx/include/__support/ibm/gettod_zos.h | 54 + .../include/__support/ibm/locale_mgmt_zos.h | 53 + .../libcxx/include/__support/ibm/nanosleep.h | 55 + .../libcxx/include/__support/ibm/xlocale.h | 129 + .../libcxx/include/__support/musl/xlocale.h | 52 + .../libcxx/include/__support/newlib/xlocale.h | 23 + .../include/__support/openbsd/xlocale.h | 35 + .../include/__support/solaris/floatingpoint.h | 13 + .../libcxx/include/__support/solaris/wchar.h | 46 + .../include/__support/solaris/xlocale.h | 75 + .../include/__support/win32/locale_win32.h | 282 + .../__support/xlocale/__nop_locale_mgmt.h | 47 + .../__support/xlocale/__posix_l_fallback.h | 115 + .../__support/xlocale/__strtonum_fallback.h | 69 + .../include/__thread/poll_with_backoff.h | 71 + .../include/__thread/timed_backoff_policy.h | 46 + .../cpp/libcxx/include/__threading_support | 706 ++ app/src/main/cpp/libcxx/include/__tree | 2758 +++++++ .../cpp/libcxx/include/__tuple_dir/apply_cv.h | 70 + .../include/__tuple_dir/make_tuple_types.h | 84 + .../libcxx/include/__tuple_dir/pair_like.h | 32 + .../include/__tuple_dir/sfinae_helpers.h | 196 + .../include/__tuple_dir/tuple_element.h | 93 + .../include/__tuple_dir/tuple_indices.h | 37 + .../libcxx/include/__tuple_dir/tuple_like.h | 51 + .../include/__tuple_dir/tuple_like_ext.h | 44 + .../libcxx/include/__tuple_dir/tuple_size.h | 75 + .../libcxx/include/__tuple_dir/tuple_types.h | 24 + .../libcxx/include/__type_traits/add_const.h | 30 + .../cpp/libcxx/include/__type_traits/add_cv.h | 30 + .../__type_traits/add_lvalue_reference.h | 53 + .../include/__type_traits/add_pointer.h | 55 + .../__type_traits/add_rvalue_reference.h | 54 + .../include/__type_traits/add_volatile.h | 30 + .../include/__type_traits/aligned_storage.h | 138 + .../include/__type_traits/aligned_union.h | 56 + .../include/__type_traits/alignment_of.h | 32 + .../libcxx/include/__type_traits/apply_cv.h | 75 + .../include/__type_traits/can_extract_key.h | 56 + .../include/__type_traits/common_reference.h | 188 + .../include/__type_traits/common_type.h | 134 + .../include/__type_traits/conditional.h | 58 + .../include/__type_traits/conjunction.h | 58 + .../libcxx/include/__type_traits/copy_cv.h | 54 + .../libcxx/include/__type_traits/copy_cvref.h | 46 + .../cpp/libcxx/include/__type_traits/decay.h | 71 + .../include/__type_traits/dependent_type.h | 25 + .../include/__type_traits/disjunction.h | 58 + .../libcxx/include/__type_traits/enable_if.h | 31 + .../cpp/libcxx/include/__type_traits/extent.h | 55 + .../has_unique_object_representation.h | 36 + .../__type_traits/has_virtual_destructor.h | 31 + .../include/__type_traits/integral_constant.h | 50 + .../include/__type_traits/is_abstract.h | 31 + .../include/__type_traits/is_aggregate.h | 33 + .../include/__type_traits/is_allocator.h | 36 + .../__type_traits/is_always_bitcastable.h | 82 + .../include/__type_traits/is_arithmetic.h | 34 + .../libcxx/include/__type_traits/is_array.h | 52 + .../include/__type_traits/is_assignable.h | 31 + .../libcxx/include/__type_traits/is_base_of.h | 32 + .../include/__type_traits/is_bounded_array.h | 38 + .../include/__type_traits/is_callable.h | 32 + .../include/__type_traits/is_char_like_type.h | 28 + .../libcxx/include/__type_traits/is_class.h | 31 + .../include/__type_traits/is_compound.h | 46 + .../libcxx/include/__type_traits/is_const.h | 45 + .../__type_traits/is_constant_evaluated.h | 32 + .../include/__type_traits/is_constructible.h | 33 + .../include/__type_traits/is_convertible.h | 108 + .../__type_traits/is_copy_assignable.h | 37 + .../__type_traits/is_copy_constructible.h | 36 + .../__type_traits/is_core_convertible.h | 36 + .../__type_traits/is_default_constructible.h | 33 + .../include/__type_traits/is_destructible.h | 102 + .../libcxx/include/__type_traits/is_empty.h | 32 + .../libcxx/include/__type_traits/is_enum.h | 31 + .../libcxx/include/__type_traits/is_final.h | 36 + .../include/__type_traits/is_floating_point.h | 37 + .../include/__type_traits/is_function.h | 43 + .../include/__type_traits/is_fundamental.h | 49 + .../is_implicitly_default_constructible.h | 48 + .../include/__type_traits/is_integral.h | 72 + .../include/__type_traits/is_literal_type.h | 34 + .../is_member_function_pointer.h | 64 + .../__type_traits/is_member_object_pointer.h | 46 + .../include/__type_traits/is_member_pointer.h | 46 + .../__type_traits/is_move_assignable.h | 36 + .../__type_traits/is_move_constructible.h | 34 + .../__type_traits/is_nothrow_assignable.h | 32 + .../__type_traits/is_nothrow_constructible.h | 78 + .../__type_traits/is_nothrow_convertible.h | 53 + .../is_nothrow_copy_assignable.h | 38 + .../is_nothrow_copy_constructible.h | 48 + .../is_nothrow_default_constructible.h | 32 + .../__type_traits/is_nothrow_destructible.h | 89 + .../is_nothrow_move_assignable.h | 37 + .../is_nothrow_move_constructible.h | 45 + .../include/__type_traits/is_null_pointer.h | 41 + .../libcxx/include/__type_traits/is_object.h | 52 + .../cpp/libcxx/include/__type_traits/is_pod.h | 31 + .../libcxx/include/__type_traits/is_pointer.h | 57 + .../include/__type_traits/is_polymorphic.h | 32 + .../__type_traits/is_primary_template.h | 34 + .../include/__type_traits/is_reference.h | 70 + .../__type_traits/is_reference_wrapper.h | 31 + .../include/__type_traits/is_referenceable.h | 41 + .../libcxx/include/__type_traits/is_same.h | 44 + .../libcxx/include/__type_traits/is_scalar.h | 62 + .../include/__type_traits/is_scoped_enum.h | 42 + .../libcxx/include/__type_traits/is_signed.h | 57 + .../include/__type_traits/is_signed_integer.h | 33 + .../include/__type_traits/is_specialization.h | 45 + .../__type_traits/is_standard_layout.h | 32 + .../include/__type_traits/is_swappable.h | 165 + .../libcxx/include/__type_traits/is_trivial.h | 32 + .../__type_traits/is_trivially_assignable.h | 33 + .../is_trivially_constructible.h | 34 + .../is_trivially_copy_assignable.h | 38 + .../is_trivially_copy_constructible.h | 33 + .../__type_traits/is_trivially_copyable.h | 32 + .../is_trivially_default_constructible.h | 32 + .../__type_traits/is_trivially_destructible.h | 45 + .../is_trivially_move_assignable.h | 36 + .../is_trivially_move_constructible.h | 33 + .../__type_traits/is_unbounded_array.h | 37 + .../libcxx/include/__type_traits/is_union.h | 31 + .../include/__type_traits/is_unsigned.h | 57 + .../__type_traits/is_unsigned_integer.h | 33 + .../__type_traits/is_valid_expansion.h | 31 + .../libcxx/include/__type_traits/is_void.h | 47 + .../include/__type_traits/is_volatile.h | 45 + .../cpp/libcxx/include/__type_traits/lazy.h | 25 + .../__type_traits/make_32_64_or_128_bit.h | 48 + .../__type_traits/make_const_lvalue_ref.h | 26 + .../include/__type_traits/make_signed.h | 86 + .../include/__type_traits/make_unsigned.h | 99 + .../include/__type_traits/maybe_const.h | 26 + .../cpp/libcxx/include/__type_traits/nat.h | 32 + .../libcxx/include/__type_traits/negation.h | 33 + .../noexcept_move_assign_container.h | 35 + .../libcxx/include/__type_traits/promote.h | 99 + .../cpp/libcxx/include/__type_traits/rank.h | 46 + .../__type_traits/remove_all_extents.h | 47 + .../include/__type_traits/remove_const.h | 42 + .../include/__type_traits/remove_const_ref.h | 27 + .../libcxx/include/__type_traits/remove_cv.h | 44 + .../include/__type_traits/remove_cvref.h | 45 + .../include/__type_traits/remove_extent.h | 47 + .../include/__type_traits/remove_pointer.h | 45 + .../include/__type_traits/remove_reference.h | 44 + .../include/__type_traits/remove_volatile.h | 42 + .../libcxx/include/__type_traits/result_of.h | 39 + .../include/__type_traits/strip_signature.h | 79 + .../include/__type_traits/type_identity.h | 33 + .../libcxx/include/__type_traits/type_list.h | 44 + .../include/__type_traits/underlying_type.h | 41 + .../cpp/libcxx/include/__type_traits/void_t.h | 29 + .../main/cpp/libcxx/include/__undef_macros | 16 + .../cpp/libcxx/include/__utility/as_const.h | 33 + .../cpp/libcxx/include/__utility/auto_cast.h | 22 + .../main/cpp/libcxx/include/__utility/cmp.h | 111 + .../include/__utility/convert_to_integral.h | 72 + .../cpp/libcxx/include/__utility/declval.h | 34 + .../include/__utility/exception_guard.h | 128 + .../cpp/libcxx/include/__utility/exchange.h | 38 + .../cpp/libcxx/include/__utility/forward.h | 38 + .../libcxx/include/__utility/forward_like.h | 46 + .../cpp/libcxx/include/__utility/in_place.h | 59 + .../include/__utility/integer_sequence.h | 153 + .../main/cpp/libcxx/include/__utility/move.h | 44 + .../main/cpp/libcxx/include/__utility/pair.h | 721 ++ .../include/__utility/piecewise_construct.h | 29 + .../libcxx/include/__utility/priority_tag.h | 26 + .../cpp/libcxx/include/__utility/rel_ops.h | 59 + .../main/cpp/libcxx/include/__utility/swap.h | 54 + .../libcxx/include/__utility/to_underlying.h | 40 + .../libcxx/include/__utility/unreachable.h | 34 + .../cpp/libcxx/include/__variant/monostate.h | 64 + .../main/cpp/libcxx/include/__verbose_abort | 57 + .../cpp/libcxx/include/abi/CMakeLists.txt | 39 + .../cpp/libcxx/include/abi/__cxxabi_config.h | 106 + app/src/main/cpp/libcxx/include/abi/cxxabi.h | 177 + app/src/main/cpp/libcxx/include/algorithm | 1926 +++++ app/src/main/cpp/libcxx/include/any | 712 ++ app/src/main/cpp/libcxx/include/array | 542 ++ app/src/main/cpp/libcxx/include/atomic | 2673 +++++++ app/src/main/cpp/libcxx/include/barrier | 339 + app/src/main/cpp/libcxx/include/bit | 91 + app/src/main/cpp/libcxx/include/bitset | 1159 +++ app/src/main/cpp/libcxx/include/cassert | 32 + app/src/main/cpp/libcxx/include/ccomplex | 27 + app/src/main/cpp/libcxx/include/cctype | 129 + app/src/main/cpp/libcxx/include/cerrno | 42 + app/src/main/cpp/libcxx/include/cfenv | 91 + app/src/main/cpp/libcxx/include/cfloat | 89 + app/src/main/cpp/libcxx/include/charconv | 847 ++ app/src/main/cpp/libcxx/include/chrono | 788 ++ app/src/main/cpp/libcxx/include/cinttypes | 271 + app/src/main/cpp/libcxx/include/ciso646 | 25 + app/src/main/cpp/libcxx/include/climits | 57 + app/src/main/cpp/libcxx/include/clocale | 62 + app/src/main/cpp/libcxx/include/cmath | 836 ++ app/src/main/cpp/libcxx/include/codecvt | 571 ++ app/src/main/cpp/libcxx/include/compare | 167 + app/src/main/cpp/libcxx/include/complex | 1568 ++++ app/src/main/cpp/libcxx/include/complex.h | 32 + app/src/main/cpp/libcxx/include/concepts | 166 + .../cpp/libcxx/include/condition_variable | 276 + app/src/main/cpp/libcxx/include/coroutine | 63 + app/src/main/cpp/libcxx/include/csetjmp | 57 + app/src/main/cpp/libcxx/include/csignal | 65 + app/src/main/cpp/libcxx/include/cstdarg | 55 + app/src/main/cpp/libcxx/include/cstdbool | 32 + app/src/main/cpp/libcxx/include/cstddef | 146 + app/src/main/cpp/libcxx/include/cstdint | 200 + app/src/main/cpp/libcxx/include/cstdio | 179 + app/src/main/cpp/libcxx/include/cstdlib | 153 + app/src/main/cpp/libcxx/include/cstring | 152 + app/src/main/cpp/libcxx/include/ctgmath | 29 + app/src/main/cpp/libcxx/include/ctime | 87 + app/src/main/cpp/libcxx/include/ctype.h | 61 + app/src/main/cpp/libcxx/include/cuchar | 76 + app/src/main/cpp/libcxx/include/cwchar | 244 + app/src/main/cpp/libcxx/include/cwctype | 98 + app/src/main/cpp/libcxx/include/deque | 2443 ++++++ app/src/main/cpp/libcxx/include/errno.h | 399 + app/src/main/cpp/libcxx/include/exception | 384 + app/src/main/cpp/libcxx/include/execution | 25 + app/src/main/cpp/libcxx/include/expected | 54 + .../cpp/libcxx/include/experimental/__config | 66 + .../cpp/libcxx/include/experimental/__memory | 117 + .../cpp/libcxx/include/experimental/algorithm | 53 + .../cpp/libcxx/include/experimental/coroutine | 344 + .../cpp/libcxx/include/experimental/deque | 52 + .../libcxx/include/experimental/forward_list | 52 + .../libcxx/include/experimental/functional | 436 ++ .../cpp/libcxx/include/experimental/iterator | 126 + .../main/cpp/libcxx/include/experimental/list | 52 + .../main/cpp/libcxx/include/experimental/map | 62 + .../include/experimental/memory_resource | 443 ++ .../include/experimental/propagate_const | 581 ++ .../cpp/libcxx/include/experimental/regex | 69 + .../main/cpp/libcxx/include/experimental/set | 62 + .../main/cpp/libcxx/include/experimental/simd | 1585 ++++ .../cpp/libcxx/include/experimental/string | 73 + .../libcxx/include/experimental/type_traits | 155 + .../libcxx/include/experimental/unordered_map | 78 + .../libcxx/include/experimental/unordered_set | 64 + .../cpp/libcxx/include/experimental/utility | 47 + .../cpp/libcxx/include/experimental/vector | 52 + app/src/main/cpp/libcxx/include/ext/__hash | 135 + app/src/main/cpp/libcxx/include/ext/hash_map | 990 +++ app/src/main/cpp/libcxx/include/ext/hash_set | 670 ++ app/src/main/cpp/libcxx/include/fenv.h | 118 + app/src/main/cpp/libcxx/include/filesystem | 469 ++ app/src/main/cpp/libcxx/include/float.h | 95 + app/src/main/cpp/libcxx/include/format | 212 + app/src/main/cpp/libcxx/include/forward_list | 1803 +++++ app/src/main/cpp/libcxx/include/fstream | 1763 +++++ app/src/main/cpp/libcxx/include/functional | 550 ++ app/src/main/cpp/libcxx/include/future | 2457 ++++++ .../main/cpp/libcxx/include/initializer_list | 118 + app/src/main/cpp/libcxx/include/inttypes.h | 264 + app/src/main/cpp/libcxx/include/iomanip | 663 ++ app/src/main/cpp/libcxx/include/ios | 1054 +++ app/src/main/cpp/libcxx/include/iosfwd | 266 + app/src/main/cpp/libcxx/include/iostream | 68 + app/src/main/cpp/libcxx/include/istream | 1647 ++++ app/src/main/cpp/libcxx/include/iterator | 742 ++ app/src/main/cpp/libcxx/include/latch | 114 + app/src/main/cpp/libcxx/include/libcxx.imp | 45 + app/src/main/cpp/libcxx/include/limits | 830 ++ app/src/main/cpp/libcxx/include/limits.h | 71 + app/src/main/cpp/libcxx/include/list | 2386 ++++++ app/src/main/cpp/libcxx/include/locale | 4368 +++++++++++ app/src/main/cpp/libcxx/include/locale.h | 50 + app/src/main/cpp/libcxx/include/map | 2361 ++++++ app/src/main/cpp/libcxx/include/math.h | 1710 ++++ app/src/main/cpp/libcxx/include/memory | 934 +++ .../main/cpp/libcxx/include/memory_resource | 65 + .../cpp/libcxx/include/module.modulemap.in | 1724 +++++ app/src/main/cpp/libcxx/include/mutex | 712 ++ app/src/main/cpp/libcxx/include/new | 410 + app/src/main/cpp/libcxx/include/numbers | 138 + app/src/main/cpp/libcxx/include/numeric | 181 + app/src/main/cpp/libcxx/include/optional | 1591 ++++ app/src/main/cpp/libcxx/include/ostream | 1197 +++ app/src/main/cpp/libcxx/include/queue | 970 +++ app/src/main/cpp/libcxx/include/random | 1745 +++++ app/src/main/cpp/libcxx/include/ranges | 400 + app/src/main/cpp/libcxx/include/ratio | 532 ++ app/src/main/cpp/libcxx/include/regex | 6876 +++++++++++++++++ .../main/cpp/libcxx/include/scoped_allocator | 733 ++ app/src/main/cpp/libcxx/include/semaphore | 191 + app/src/main/cpp/libcxx/include/set | 1605 ++++ app/src/main/cpp/libcxx/include/setjmp.h | 46 + app/src/main/cpp/libcxx/include/shared_mutex | 509 ++ .../main/cpp/libcxx/include/source_location | 85 + app/src/main/cpp/libcxx/include/span | 598 ++ app/src/main/cpp/libcxx/include/sstream | 883 +++ app/src/main/cpp/libcxx/include/stack | 371 + app/src/main/cpp/libcxx/include/stdatomic.h | 235 + app/src/main/cpp/libcxx/include/stdbool.h | 40 + app/src/main/cpp/libcxx/include/stddef.h | 53 + app/src/main/cpp/libcxx/include/stdexcept | 310 + app/src/main/cpp/libcxx/include/stdint.h | 127 + app/src/main/cpp/libcxx/include/stdio.h | 121 + app/src/main/cpp/libcxx/include/stdlib.h | 163 + app/src/main/cpp/libcxx/include/streambuf | 503 ++ app/src/main/cpp/libcxx/include/string | 4633 +++++++++++ app/src/main/cpp/libcxx/include/string.h | 111 + app/src/main/cpp/libcxx/include/string_view | 1031 +++ app/src/main/cpp/libcxx/include/strstream | 409 + app/src/main/cpp/libcxx/include/system_error | 548 ++ app/src/main/cpp/libcxx/include/tgmath.h | 34 + app/src/main/cpp/libcxx/include/thread | 421 + app/src/main/cpp/libcxx/include/tuple | 1863 +++++ app/src/main/cpp/libcxx/include/type_traits | 545 ++ app/src/main/cpp/libcxx/include/typeindex | 126 + app/src/main/cpp/libcxx/include/typeinfo | 406 + app/src/main/cpp/libcxx/include/uchar.h | 54 + app/src/main/cpp/libcxx/include/unordered_map | 2653 +++++++ app/src/main/cpp/libcxx/include/unordered_set | 1824 +++++ app/src/main/cpp/libcxx/include/utility | 282 + app/src/main/cpp/libcxx/include/valarray | 4940 ++++++++++++ app/src/main/cpp/libcxx/include/variant | 1839 +++++ app/src/main/cpp/libcxx/include/vector | 3366 ++++++++ app/src/main/cpp/libcxx/include/version | 424 + app/src/main/cpp/libcxx/include/wchar.h | 188 + app/src/main/cpp/libcxx/include/wctype.h | 94 + app/src/main/cpp/libcxx/x86.a | Bin 0 -> 1524412 bytes app/src/main/cpp/libcxx/x86_64.a | Bin 0 -> 1911100 bytes app/src/main/cpp/main.cpp | 105 +- 884 files changed, 196655 insertions(+), 68 deletions(-) create mode 100644 app/src/main/cpp/libcxx/arm64-v8a.a create mode 100644 app/src/main/cpp/libcxx/armeabi-v7a.a create mode 100644 app/src/main/cpp/libcxx/include/CMakeLists.txt create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/adjacent_find.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/all_of.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/any_of.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/binary_search.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/clamp.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/comp.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/comp_ref_type.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/copy_backward.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/copy_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/copy_move_common.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/copy_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/count.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/count_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/equal.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/equal_range.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/fill.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/fill_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/find.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/find_end.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/find_first_of.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/find_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/find_if_not.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/for_each.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/for_each_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/generate.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/generate_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/half_positive.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/in_found_result.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/in_fun_result.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/in_in_out_result.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/in_in_result.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/in_out_out_result.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/in_out_result.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/includes.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/inplace_merge.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/is_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/is_heap_until.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/is_partitioned.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/is_permutation.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/is_sorted.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/is_sorted_until.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/iter_swap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/iterator_operations.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/lexicographical_compare.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/lower_bound.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/make_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/make_projected.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/max.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/max_element.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/merge.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/min.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/min_element.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/min_max_result.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/minmax.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/minmax_element.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/mismatch.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/move.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/move_backward.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/next_permutation.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/none_of.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/nth_element.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/partial_sort.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/partial_sort_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/partition.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/partition_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/partition_point.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/pop_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/prev_permutation.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/push_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_adjacent_find.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_all_of.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_any_of.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_binary_search.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_clamp.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_backward.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_count.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_count_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_equal.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_equal_range.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_fill.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_fill_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_find.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_find_end.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_find_first_of.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_find_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_find_if_not.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_for_each.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_for_each_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_generate.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_generate_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_includes.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_inplace_merge.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_is_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_is_heap_until.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_is_partitioned.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_is_permutation.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_is_sorted.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_is_sorted_until.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_iterator_concept.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_lexicographical_compare.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_lower_bound.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_make_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_max.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_max_element.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_merge.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_min.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_min_element.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_minmax.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_minmax_element.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_mismatch.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_move.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_move_backward.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_next_permutation.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_none_of.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_nth_element.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_partial_sort.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_partial_sort_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_partition.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_partition_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_partition_point.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_pop_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_prev_permutation.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_push_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_remove.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_copy_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_replace.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_copy_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_reverse.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_reverse_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_rotate.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_rotate_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_sample.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_search.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_search_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_set_difference.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_set_intersection.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_set_symmetric_difference.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_set_union.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_shuffle.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_sort.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_sort_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_stable_partition.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_stable_sort.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_swap_ranges.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_transform.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_unique.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_unique_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/ranges_upper_bound.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/remove.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/remove_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/remove_copy_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/remove_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/replace.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/replace_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/replace_copy_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/replace_if.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/reverse.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/reverse_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/rotate.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/rotate_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/sample.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/search.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/search_n.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/set_difference.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/set_intersection.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/set_symmetric_difference.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/set_union.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/shift_left.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/shift_right.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/shuffle.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/sift_down.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/sort.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/sort_heap.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/stable_partition.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/stable_sort.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/swap_ranges.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/transform.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/uniform_random_bit_generator_adaptor.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/unique.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/unique_copy.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/unwrap_iter.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/unwrap_range.h create mode 100644 app/src/main/cpp/libcxx/include/__algorithm/upper_bound.h create mode 100644 app/src/main/cpp/libcxx/include/__assert create mode 100644 app/src/main/cpp/libcxx/include/__availability create mode 100644 app/src/main/cpp/libcxx/include/__bit/bit_cast.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/bit_ceil.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/bit_floor.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/bit_log2.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/bit_width.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/blsr.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/byteswap.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/countl.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/countr.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/endian.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/has_single_bit.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/popcount.h create mode 100644 app/src/main/cpp/libcxx/include/__bit/rotate.h create mode 100644 app/src/main/cpp/libcxx/include/__bit_reference create mode 100644 app/src/main/cpp/libcxx/include/__bsd_locale_defaults.h create mode 100644 app/src/main/cpp/libcxx/include/__bsd_locale_fallbacks.h create mode 100644 app/src/main/cpp/libcxx/include/__charconv/chars_format.h create mode 100644 app/src/main/cpp/libcxx/include/__charconv/from_chars_result.h create mode 100644 app/src/main/cpp/libcxx/include/__charconv/tables.h create mode 100644 app/src/main/cpp/libcxx/include/__charconv/to_chars_base_10.h create mode 100644 app/src/main/cpp/libcxx/include/__charconv/to_chars_result.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/calendar.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/convert_to_timespec.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/convert_to_tm.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/day.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/duration.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/file_clock.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/formatter.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/hh_mm_ss.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/high_resolution_clock.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/literals.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/month.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/month_weekday.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/monthday.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/ostream.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/parser_std_format_spec.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/statically_widen.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/steady_clock.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/system_clock.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/time_point.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/weekday.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/year.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/year_month.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/year_month_day.h create mode 100644 app/src/main/cpp/libcxx/include/__chrono/year_month_weekday.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/common_comparison_category.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/compare_partial_order_fallback.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/compare_strong_order_fallback.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/compare_three_way.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/compare_three_way_result.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/compare_weak_order_fallback.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/is_eq.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/ordering.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/partial_order.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/strong_order.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/synth_three_way.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/three_way_comparable.h create mode 100644 app/src/main/cpp/libcxx/include/__compare/weak_order.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/arithmetic.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/boolean_testable.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/class_or_enum.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/common_reference_with.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/common_with.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/convertible_to.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/copyable.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/derived_from.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/destructible.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/different_from.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/equality_comparable.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/invocable.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/movable.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/predicate.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/regular.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/relation.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/same_as.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/semiregular.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/swappable.h create mode 100644 app/src/main/cpp/libcxx/include/__concepts/totally_ordered.h create mode 100644 app/src/main/cpp/libcxx/include/__config create mode 100644 app/src/main/cpp/libcxx/include/__config_site create mode 100644 app/src/main/cpp/libcxx/include/__config_site.in create mode 100644 app/src/main/cpp/libcxx/include/__coroutine/coroutine_handle.h create mode 100644 app/src/main/cpp/libcxx/include/__coroutine/coroutine_traits.h create mode 100644 app/src/main/cpp/libcxx/include/__coroutine/noop_coroutine_handle.h create mode 100644 app/src/main/cpp/libcxx/include/__coroutine/trivial_awaitables.h create mode 100644 app/src/main/cpp/libcxx/include/__debug create mode 100644 app/src/main/cpp/libcxx/include/__debug_utils/randomize_range.h create mode 100644 app/src/main/cpp/libcxx/include/__errc create mode 100644 app/src/main/cpp/libcxx/include/__expected/bad_expected_access.h create mode 100644 app/src/main/cpp/libcxx/include/__expected/expected.h create mode 100644 app/src/main/cpp/libcxx/include/__expected/unexpect.h create mode 100644 app/src/main/cpp/libcxx/include/__expected/unexpected.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/copy_options.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/directory_entry.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/directory_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/directory_options.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/file_status.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/file_time_type.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/file_type.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/filesystem_error.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/operations.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/path.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/path_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/perm_options.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/perms.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/recursive_directory_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/space_info.h create mode 100644 app/src/main/cpp/libcxx/include/__filesystem/u8path.h create mode 100644 app/src/main/cpp/libcxx/include/__format/buffer.h create mode 100644 app/src/main/cpp/libcxx/include/__format/concepts.h create mode 100644 app/src/main/cpp/libcxx/include/__format/container_adaptor.h create mode 100644 app/src/main/cpp/libcxx/include/__format/enable_insertable.h create mode 100644 app/src/main/cpp/libcxx/include/__format/escaped_output_table.h create mode 100644 app/src/main/cpp/libcxx/include/__format/extended_grapheme_cluster_table.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_arg.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_arg_store.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_args.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_context.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_error.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_functions.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_fwd.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_parse_context.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_string.h create mode 100644 app/src/main/cpp/libcxx/include/__format/format_to_n_result.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_bool.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_char.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_floating_point.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_integer.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_integral.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_output.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_pointer.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_string.h create mode 100644 app/src/main/cpp/libcxx/include/__format/formatter_tuple.h create mode 100644 app/src/main/cpp/libcxx/include/__format/parser_std_format_spec.h create mode 100644 app/src/main/cpp/libcxx/include/__format/range_default_formatter.h create mode 100644 app/src/main/cpp/libcxx/include/__format/range_formatter.h create mode 100644 app/src/main/cpp/libcxx/include/__format/unicode.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/binary_function.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/binary_negate.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/bind.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/bind_back.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/bind_front.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/binder1st.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/binder2nd.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/boyer_moore_searcher.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/compose.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/default_searcher.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/function.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/hash.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/identity.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/invoke.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/is_transparent.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/mem_fn.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/mem_fun_ref.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/not_fn.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/operations.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/perfect_forward.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/pointer_to_binary_function.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/pointer_to_unary_function.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/ranges_operations.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/reference_wrapper.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/unary_function.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/unary_negate.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/unwrap_ref.h create mode 100644 app/src/main/cpp/libcxx/include/__functional/weak_result_type.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/array.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/get.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/hash.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/memory_resource.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/pair.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/span.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/string.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/string_view.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/subrange.h create mode 100644 app/src/main/cpp/libcxx/include/__fwd/tuple.h create mode 100644 app/src/main/cpp/libcxx/include/__hash_table create mode 100644 app/src/main/cpp/libcxx/include/__ios/fpos.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/access.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/advance.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/back_insert_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/bounded_iter.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/common_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/concepts.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/counted_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/data.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/default_sentinel.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/distance.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/empty.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/erase_if_container.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/front_insert_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/incrementable_traits.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/indirectly_comparable.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/insert_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/istream_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/istreambuf_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/iter_move.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/iter_swap.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/iterator_traits.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/iterator_with_data.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/mergeable.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/move_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/move_sentinel.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/next.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/ostream_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/ostreambuf_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/permutable.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/prev.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/projected.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/readable_traits.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/reverse_access.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/reverse_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/segmented_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/size.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/sortable.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/unreachable_sentinel.h create mode 100644 app/src/main/cpp/libcxx/include/__iterator/wrap_iter.h create mode 100644 app/src/main/cpp/libcxx/include/__locale create mode 100644 app/src/main/cpp/libcxx/include/__mbstate_t.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/addressof.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/align.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/allocate_at_least.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/allocation_guard.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/allocator.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/allocator_arg_t.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/allocator_destructor.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/allocator_traits.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/assume_aligned.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/auto_ptr.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/builtin_new_allocator.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/compressed_pair.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/concepts.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/construct_at.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/destruct_n.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/pointer_traits.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/ranges_construct_at.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/ranges_uninitialized_algorithms.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/raw_storage_iterator.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/shared_ptr.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/swap_allocator.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/temp_value.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/temporary_buffer.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/uninitialized_algorithms.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/unique_ptr.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/uses_allocator.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/uses_allocator_construction.h create mode 100644 app/src/main/cpp/libcxx/include/__memory/voidify.h create mode 100644 app/src/main/cpp/libcxx/include/__memory_resource/memory_resource.h create mode 100644 app/src/main/cpp/libcxx/include/__memory_resource/monotonic_buffer_resource.h create mode 100644 app/src/main/cpp/libcxx/include/__memory_resource/polymorphic_allocator.h create mode 100644 app/src/main/cpp/libcxx/include/__memory_resource/pool_options.h create mode 100644 app/src/main/cpp/libcxx/include/__memory_resource/synchronized_pool_resource.h create mode 100644 app/src/main/cpp/libcxx/include/__memory_resource/unsynchronized_pool_resource.h create mode 100644 app/src/main/cpp/libcxx/include/__mutex_base create mode 100644 app/src/main/cpp/libcxx/include/__node_handle create mode 100644 app/src/main/cpp/libcxx/include/__numeric/accumulate.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/adjacent_difference.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/exclusive_scan.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/gcd_lcm.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/inclusive_scan.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/inner_product.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/iota.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/midpoint.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/partial_sum.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/reduce.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/transform_exclusive_scan.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/transform_inclusive_scan.h create mode 100644 app/src/main/cpp/libcxx/include/__numeric/transform_reduce.h create mode 100644 app/src/main/cpp/libcxx/include/__random/bernoulli_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/binomial_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/cauchy_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/chi_squared_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/clamp_to_integral.h create mode 100644 app/src/main/cpp/libcxx/include/__random/default_random_engine.h create mode 100644 app/src/main/cpp/libcxx/include/__random/discard_block_engine.h create mode 100644 app/src/main/cpp/libcxx/include/__random/discrete_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/exponential_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/extreme_value_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/fisher_f_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/gamma_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/generate_canonical.h create mode 100644 app/src/main/cpp/libcxx/include/__random/geometric_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/independent_bits_engine.h create mode 100644 app/src/main/cpp/libcxx/include/__random/is_seed_sequence.h create mode 100644 app/src/main/cpp/libcxx/include/__random/is_valid.h create mode 100644 app/src/main/cpp/libcxx/include/__random/knuth_b.h create mode 100644 app/src/main/cpp/libcxx/include/__random/linear_congruential_engine.h create mode 100644 app/src/main/cpp/libcxx/include/__random/log2.h create mode 100644 app/src/main/cpp/libcxx/include/__random/lognormal_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/mersenne_twister_engine.h create mode 100644 app/src/main/cpp/libcxx/include/__random/negative_binomial_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/normal_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/piecewise_constant_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/piecewise_linear_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/poisson_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/random_device.h create mode 100644 app/src/main/cpp/libcxx/include/__random/ranlux.h create mode 100644 app/src/main/cpp/libcxx/include/__random/seed_seq.h create mode 100644 app/src/main/cpp/libcxx/include/__random/shuffle_order_engine.h create mode 100644 app/src/main/cpp/libcxx/include/__random/student_t_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/subtract_with_carry_engine.h create mode 100644 app/src/main/cpp/libcxx/include/__random/uniform_int_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/uniform_random_bit_generator.h create mode 100644 app/src/main/cpp/libcxx/include/__random/uniform_real_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__random/weibull_distribution.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/access.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/all.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/as_rvalue_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/common_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/concepts.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/copyable_box.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/counted.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/dangling.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/data.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/drop_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/drop_while_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/elements_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/empty.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/empty_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/enable_borrowed_range.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/enable_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/filter_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/iota_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/istream_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/join_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/lazy_split_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/non_propagating_cache.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/owning_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/range_adaptor.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/rbegin.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/ref_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/rend.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/reverse_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/single_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/size.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/split_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/subrange.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/take_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/take_while_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/transform_view.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/view_interface.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/views.h create mode 100644 app/src/main/cpp/libcxx/include/__ranges/zip_view.h create mode 100644 app/src/main/cpp/libcxx/include/__split_buffer create mode 100644 app/src/main/cpp/libcxx/include/__std_stream create mode 100644 app/src/main/cpp/libcxx/include/__string/char_traits.h create mode 100644 app/src/main/cpp/libcxx/include/__string/extern_template_lists.h create mode 100644 app/src/main/cpp/libcxx/include/__support/android/locale_bionic.h create mode 100644 app/src/main/cpp/libcxx/include/__support/fuchsia/xlocale.h create mode 100644 app/src/main/cpp/libcxx/include/__support/ibm/gettod_zos.h create mode 100644 app/src/main/cpp/libcxx/include/__support/ibm/locale_mgmt_zos.h create mode 100644 app/src/main/cpp/libcxx/include/__support/ibm/nanosleep.h create mode 100644 app/src/main/cpp/libcxx/include/__support/ibm/xlocale.h create mode 100644 app/src/main/cpp/libcxx/include/__support/musl/xlocale.h create mode 100644 app/src/main/cpp/libcxx/include/__support/newlib/xlocale.h create mode 100644 app/src/main/cpp/libcxx/include/__support/openbsd/xlocale.h create mode 100644 app/src/main/cpp/libcxx/include/__support/solaris/floatingpoint.h create mode 100644 app/src/main/cpp/libcxx/include/__support/solaris/wchar.h create mode 100644 app/src/main/cpp/libcxx/include/__support/solaris/xlocale.h create mode 100644 app/src/main/cpp/libcxx/include/__support/win32/locale_win32.h create mode 100644 app/src/main/cpp/libcxx/include/__support/xlocale/__nop_locale_mgmt.h create mode 100644 app/src/main/cpp/libcxx/include/__support/xlocale/__posix_l_fallback.h create mode 100644 app/src/main/cpp/libcxx/include/__support/xlocale/__strtonum_fallback.h create mode 100644 app/src/main/cpp/libcxx/include/__thread/poll_with_backoff.h create mode 100644 app/src/main/cpp/libcxx/include/__thread/timed_backoff_policy.h create mode 100644 app/src/main/cpp/libcxx/include/__threading_support create mode 100644 app/src/main/cpp/libcxx/include/__tree create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/apply_cv.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/make_tuple_types.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/pair_like.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/sfinae_helpers.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/tuple_element.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/tuple_indices.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/tuple_like.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/tuple_like_ext.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/tuple_size.h create mode 100644 app/src/main/cpp/libcxx/include/__tuple_dir/tuple_types.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/add_const.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/add_cv.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/add_lvalue_reference.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/add_pointer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/add_rvalue_reference.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/add_volatile.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/aligned_storage.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/aligned_union.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/alignment_of.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/apply_cv.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/can_extract_key.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/common_reference.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/common_type.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/conditional.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/conjunction.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/copy_cv.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/copy_cvref.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/decay.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/dependent_type.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/disjunction.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/enable_if.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/extent.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/has_unique_object_representation.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/has_virtual_destructor.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/integral_constant.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_abstract.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_aggregate.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_allocator.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_always_bitcastable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_arithmetic.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_array.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_base_of.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_bounded_array.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_callable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_char_like_type.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_class.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_compound.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_const.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_constant_evaluated.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_convertible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_copy_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_copy_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_core_convertible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_default_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_destructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_empty.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_enum.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_final.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_floating_point.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_function.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_fundamental.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_implicitly_default_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_integral.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_literal_type.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_member_function_pointer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_member_object_pointer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_member_pointer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_move_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_move_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_convertible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_copy_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_copy_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_default_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_destructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_move_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_nothrow_move_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_null_pointer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_object.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_pod.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_pointer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_polymorphic.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_primary_template.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_reference.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_reference_wrapper.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_referenceable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_same.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_scalar.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_scoped_enum.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_signed.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_signed_integer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_specialization.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_standard_layout.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_swappable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivial.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_copy_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_copy_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_copyable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_default_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_destructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_move_assignable.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_trivially_move_constructible.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_unbounded_array.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_union.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_unsigned.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_unsigned_integer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_valid_expansion.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_void.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/is_volatile.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/lazy.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/make_32_64_or_128_bit.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/make_const_lvalue_ref.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/make_signed.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/make_unsigned.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/maybe_const.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/nat.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/negation.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/noexcept_move_assign_container.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/promote.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/rank.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_all_extents.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_const.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_const_ref.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_cv.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_cvref.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_extent.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_pointer.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_reference.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/remove_volatile.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/result_of.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/strip_signature.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/type_identity.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/type_list.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/underlying_type.h create mode 100644 app/src/main/cpp/libcxx/include/__type_traits/void_t.h create mode 100644 app/src/main/cpp/libcxx/include/__undef_macros create mode 100644 app/src/main/cpp/libcxx/include/__utility/as_const.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/auto_cast.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/cmp.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/convert_to_integral.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/declval.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/exception_guard.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/exchange.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/forward.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/forward_like.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/in_place.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/integer_sequence.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/move.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/pair.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/piecewise_construct.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/priority_tag.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/rel_ops.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/swap.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/to_underlying.h create mode 100644 app/src/main/cpp/libcxx/include/__utility/unreachable.h create mode 100644 app/src/main/cpp/libcxx/include/__variant/monostate.h create mode 100644 app/src/main/cpp/libcxx/include/__verbose_abort create mode 100644 app/src/main/cpp/libcxx/include/abi/CMakeLists.txt create mode 100644 app/src/main/cpp/libcxx/include/abi/__cxxabi_config.h create mode 100644 app/src/main/cpp/libcxx/include/abi/cxxabi.h create mode 100644 app/src/main/cpp/libcxx/include/algorithm create mode 100644 app/src/main/cpp/libcxx/include/any create mode 100644 app/src/main/cpp/libcxx/include/array create mode 100644 app/src/main/cpp/libcxx/include/atomic create mode 100644 app/src/main/cpp/libcxx/include/barrier create mode 100644 app/src/main/cpp/libcxx/include/bit create mode 100644 app/src/main/cpp/libcxx/include/bitset create mode 100644 app/src/main/cpp/libcxx/include/cassert create mode 100644 app/src/main/cpp/libcxx/include/ccomplex create mode 100644 app/src/main/cpp/libcxx/include/cctype create mode 100644 app/src/main/cpp/libcxx/include/cerrno create mode 100644 app/src/main/cpp/libcxx/include/cfenv create mode 100644 app/src/main/cpp/libcxx/include/cfloat create mode 100644 app/src/main/cpp/libcxx/include/charconv create mode 100644 app/src/main/cpp/libcxx/include/chrono create mode 100644 app/src/main/cpp/libcxx/include/cinttypes create mode 100644 app/src/main/cpp/libcxx/include/ciso646 create mode 100644 app/src/main/cpp/libcxx/include/climits create mode 100644 app/src/main/cpp/libcxx/include/clocale create mode 100644 app/src/main/cpp/libcxx/include/cmath create mode 100644 app/src/main/cpp/libcxx/include/codecvt create mode 100644 app/src/main/cpp/libcxx/include/compare create mode 100644 app/src/main/cpp/libcxx/include/complex create mode 100644 app/src/main/cpp/libcxx/include/complex.h create mode 100644 app/src/main/cpp/libcxx/include/concepts create mode 100644 app/src/main/cpp/libcxx/include/condition_variable create mode 100644 app/src/main/cpp/libcxx/include/coroutine create mode 100644 app/src/main/cpp/libcxx/include/csetjmp create mode 100644 app/src/main/cpp/libcxx/include/csignal create mode 100644 app/src/main/cpp/libcxx/include/cstdarg create mode 100644 app/src/main/cpp/libcxx/include/cstdbool create mode 100644 app/src/main/cpp/libcxx/include/cstddef create mode 100644 app/src/main/cpp/libcxx/include/cstdint create mode 100644 app/src/main/cpp/libcxx/include/cstdio create mode 100644 app/src/main/cpp/libcxx/include/cstdlib create mode 100644 app/src/main/cpp/libcxx/include/cstring create mode 100644 app/src/main/cpp/libcxx/include/ctgmath create mode 100644 app/src/main/cpp/libcxx/include/ctime create mode 100644 app/src/main/cpp/libcxx/include/ctype.h create mode 100644 app/src/main/cpp/libcxx/include/cuchar create mode 100644 app/src/main/cpp/libcxx/include/cwchar create mode 100644 app/src/main/cpp/libcxx/include/cwctype create mode 100644 app/src/main/cpp/libcxx/include/deque create mode 100644 app/src/main/cpp/libcxx/include/errno.h create mode 100644 app/src/main/cpp/libcxx/include/exception create mode 100644 app/src/main/cpp/libcxx/include/execution create mode 100644 app/src/main/cpp/libcxx/include/expected create mode 100644 app/src/main/cpp/libcxx/include/experimental/__config create mode 100644 app/src/main/cpp/libcxx/include/experimental/__memory create mode 100644 app/src/main/cpp/libcxx/include/experimental/algorithm create mode 100644 app/src/main/cpp/libcxx/include/experimental/coroutine create mode 100644 app/src/main/cpp/libcxx/include/experimental/deque create mode 100644 app/src/main/cpp/libcxx/include/experimental/forward_list create mode 100644 app/src/main/cpp/libcxx/include/experimental/functional create mode 100644 app/src/main/cpp/libcxx/include/experimental/iterator create mode 100644 app/src/main/cpp/libcxx/include/experimental/list create mode 100644 app/src/main/cpp/libcxx/include/experimental/map create mode 100644 app/src/main/cpp/libcxx/include/experimental/memory_resource create mode 100644 app/src/main/cpp/libcxx/include/experimental/propagate_const create mode 100644 app/src/main/cpp/libcxx/include/experimental/regex create mode 100644 app/src/main/cpp/libcxx/include/experimental/set create mode 100644 app/src/main/cpp/libcxx/include/experimental/simd create mode 100644 app/src/main/cpp/libcxx/include/experimental/string create mode 100644 app/src/main/cpp/libcxx/include/experimental/type_traits create mode 100644 app/src/main/cpp/libcxx/include/experimental/unordered_map create mode 100644 app/src/main/cpp/libcxx/include/experimental/unordered_set create mode 100644 app/src/main/cpp/libcxx/include/experimental/utility create mode 100644 app/src/main/cpp/libcxx/include/experimental/vector create mode 100644 app/src/main/cpp/libcxx/include/ext/__hash create mode 100644 app/src/main/cpp/libcxx/include/ext/hash_map create mode 100644 app/src/main/cpp/libcxx/include/ext/hash_set create mode 100644 app/src/main/cpp/libcxx/include/fenv.h create mode 100644 app/src/main/cpp/libcxx/include/filesystem create mode 100644 app/src/main/cpp/libcxx/include/float.h create mode 100644 app/src/main/cpp/libcxx/include/format create mode 100644 app/src/main/cpp/libcxx/include/forward_list create mode 100644 app/src/main/cpp/libcxx/include/fstream create mode 100644 app/src/main/cpp/libcxx/include/functional create mode 100644 app/src/main/cpp/libcxx/include/future create mode 100644 app/src/main/cpp/libcxx/include/initializer_list create mode 100644 app/src/main/cpp/libcxx/include/inttypes.h create mode 100644 app/src/main/cpp/libcxx/include/iomanip create mode 100644 app/src/main/cpp/libcxx/include/ios create mode 100644 app/src/main/cpp/libcxx/include/iosfwd create mode 100644 app/src/main/cpp/libcxx/include/iostream create mode 100644 app/src/main/cpp/libcxx/include/istream create mode 100644 app/src/main/cpp/libcxx/include/iterator create mode 100644 app/src/main/cpp/libcxx/include/latch create mode 100644 app/src/main/cpp/libcxx/include/libcxx.imp create mode 100644 app/src/main/cpp/libcxx/include/limits create mode 100644 app/src/main/cpp/libcxx/include/limits.h create mode 100644 app/src/main/cpp/libcxx/include/list create mode 100644 app/src/main/cpp/libcxx/include/locale create mode 100644 app/src/main/cpp/libcxx/include/locale.h create mode 100644 app/src/main/cpp/libcxx/include/map create mode 100644 app/src/main/cpp/libcxx/include/math.h create mode 100644 app/src/main/cpp/libcxx/include/memory create mode 100644 app/src/main/cpp/libcxx/include/memory_resource create mode 100644 app/src/main/cpp/libcxx/include/module.modulemap.in create mode 100644 app/src/main/cpp/libcxx/include/mutex create mode 100644 app/src/main/cpp/libcxx/include/new create mode 100644 app/src/main/cpp/libcxx/include/numbers create mode 100644 app/src/main/cpp/libcxx/include/numeric create mode 100644 app/src/main/cpp/libcxx/include/optional create mode 100644 app/src/main/cpp/libcxx/include/ostream create mode 100644 app/src/main/cpp/libcxx/include/queue create mode 100644 app/src/main/cpp/libcxx/include/random create mode 100644 app/src/main/cpp/libcxx/include/ranges create mode 100644 app/src/main/cpp/libcxx/include/ratio create mode 100644 app/src/main/cpp/libcxx/include/regex create mode 100644 app/src/main/cpp/libcxx/include/scoped_allocator create mode 100644 app/src/main/cpp/libcxx/include/semaphore create mode 100644 app/src/main/cpp/libcxx/include/set create mode 100644 app/src/main/cpp/libcxx/include/setjmp.h create mode 100644 app/src/main/cpp/libcxx/include/shared_mutex create mode 100644 app/src/main/cpp/libcxx/include/source_location create mode 100644 app/src/main/cpp/libcxx/include/span create mode 100644 app/src/main/cpp/libcxx/include/sstream create mode 100644 app/src/main/cpp/libcxx/include/stack create mode 100644 app/src/main/cpp/libcxx/include/stdatomic.h create mode 100644 app/src/main/cpp/libcxx/include/stdbool.h create mode 100644 app/src/main/cpp/libcxx/include/stddef.h create mode 100644 app/src/main/cpp/libcxx/include/stdexcept create mode 100644 app/src/main/cpp/libcxx/include/stdint.h create mode 100644 app/src/main/cpp/libcxx/include/stdio.h create mode 100644 app/src/main/cpp/libcxx/include/stdlib.h create mode 100644 app/src/main/cpp/libcxx/include/streambuf create mode 100644 app/src/main/cpp/libcxx/include/string create mode 100644 app/src/main/cpp/libcxx/include/string.h create mode 100644 app/src/main/cpp/libcxx/include/string_view create mode 100644 app/src/main/cpp/libcxx/include/strstream create mode 100644 app/src/main/cpp/libcxx/include/system_error create mode 100644 app/src/main/cpp/libcxx/include/tgmath.h create mode 100644 app/src/main/cpp/libcxx/include/thread create mode 100644 app/src/main/cpp/libcxx/include/tuple create mode 100644 app/src/main/cpp/libcxx/include/type_traits create mode 100644 app/src/main/cpp/libcxx/include/typeindex create mode 100644 app/src/main/cpp/libcxx/include/typeinfo create mode 100644 app/src/main/cpp/libcxx/include/uchar.h create mode 100644 app/src/main/cpp/libcxx/include/unordered_map create mode 100644 app/src/main/cpp/libcxx/include/unordered_set create mode 100644 app/src/main/cpp/libcxx/include/utility create mode 100644 app/src/main/cpp/libcxx/include/valarray create mode 100644 app/src/main/cpp/libcxx/include/variant create mode 100644 app/src/main/cpp/libcxx/include/vector create mode 100644 app/src/main/cpp/libcxx/include/version create mode 100644 app/src/main/cpp/libcxx/include/wchar.h create mode 100644 app/src/main/cpp/libcxx/include/wctype.h create mode 100644 app/src/main/cpp/libcxx/x86.a create mode 100644 app/src/main/cpp/libcxx/x86_64.a diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2fd14a8..d1e589c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,6 +5,8 @@ plugins { android { namespace = "es.chiteroman.playintegrityfix" compileSdk = 34 + ndkVersion = "26.1.10909125" + buildToolsVersion = "34.0.0" packaging { jniLibs { @@ -12,10 +14,6 @@ android { } } - buildFeatures { - prefab = true - } - defaultConfig { applicationId = "es.chiteroman.playintegrityfix" minSdk = 26 @@ -26,9 +24,11 @@ android { externalNativeBuild { cmake { arguments += "-DANDROID_STL=none" - arguments += "-DCMAKE_BUILD_TYPE=MinSizeRel" + arguments += "-DCMAKE_BUILD_TYPE=Release" + + cFlags += "-fvisibility=hidden" + cFlags += "-fvisibility-inlines-hidden" - cppFlags += "-std=c++20" cppFlags += "-fno-exceptions" cppFlags += "-fno-rtti" cppFlags += "-fvisibility=hidden" @@ -53,13 +53,7 @@ android { externalNativeBuild { cmake { path = file("src/main/cpp/CMakeLists.txt") + version = "3.22.1" } } - - ndkVersion = "26.1.10909125" - buildToolsVersion = "34.0.0" -} - -dependencies { - implementation("dev.rikka.ndk.thirdparty:cxx:1.2.0") } \ No newline at end of file diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 607d4d0..12e47ad 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -2,14 +2,16 @@ cmake_minimum_required(VERSION 3.22.1) project(zygisk) -find_package(cxx REQUIRED CONFIG) +include_directories(${CMAKE_SOURCE_DIR}/libcxx/include) -link_libraries(cxx::cxx) +link_libraries(${CMAKE_SOURCE_DIR}/libcxx/${CMAKE_ANDROID_ARCH_ABI}.a) -add_library(${CMAKE_PROJECT_NAME} SHARED main.cpp) +add_library(${CMAKE_PROJECT_NAME} SHARED ${CMAKE_SOURCE_DIR}/main.cpp) -add_subdirectory(Dobby) +add_subdirectory(${CMAKE_SOURCE_DIR}/Dobby) SET_OPTION(Plugin.Android.BionicLinkerUtil ON) -target_link_libraries(${CMAKE_PROJECT_NAME} log dobby_static) \ No newline at end of file +target_compile_features(${CMAKE_PROJECT_NAME} PRIVATE c_std_23 cxx_std_23) + +target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE log dobby_static) \ No newline at end of file diff --git a/app/src/main/cpp/libcxx/arm64-v8a.a b/app/src/main/cpp/libcxx/arm64-v8a.a new file mode 100644 index 0000000000000000000000000000000000000000..4cb0dd5b2da8119447fd8c96f82bb72860148020 GIT binary patch literal 2045696 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

wS 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�sH~rd@ufi;0K^@2X6;| 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

4e>6ZG_q?n>jl(Y(eUU*DmAJXYi}DF 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 P#$lWsqH#L?`|$q*dkP&> literal 0 HcmV?d00001 diff --git a/app/src/main/cpp/libcxx/armeabi-v7a.a b/app/src/main/cpp/libcxx/armeabi-v7a.a new file mode 100644 index 0000000000000000000000000000000000000000..9587228129b283613b85300c2f32de95e737c64d GIT binary patch literal 2372904 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�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

mj_jJ7&vLv&N@H7fCrROLZw*L5# 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�&A%?>{z<-nd*4t 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

e1v|6QdWa?F6#K_;a25L;vPe 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 +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter +__adjacent_find(_Iter __first, _Sent __last, _BinaryPredicate&& __pred) { + if (__first == __last) + return __first; + _Iter __i = __first; + while (++__i != __last) { + if (__pred(*__first, *__i)) + return __first; + __first = __i; + } + return __i; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) { + return std::__adjacent_find(std::move(__first), std::move(__last), __pred); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +adjacent_find(_ForwardIterator __first, _ForwardIterator __last) { + return std::adjacent_find(std::move(__first), std::move(__last), __equal_to()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_ADJACENT_FIND_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/all_of.h b/app/src/main/cpp/libcxx/include/__algorithm/all_of.h new file mode 100644 index 0000000..284c34f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/all_of.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_ALL_OF_H +#define _LIBCPP___ALGORITHM_ALL_OF_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +all_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) { + for (; __first != __last; ++__first) + if (!__pred(*__first)) + return false; + return true; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_ALL_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/any_of.h b/app/src/main/cpp/libcxx/include/__algorithm/any_of.h new file mode 100644 index 0000000..fe08828 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/any_of.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_ANY_OF_H +#define _LIBCPP___ALGORITHM_ANY_OF_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +any_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) { + for (; __first != __last; ++__first) + if (__pred(*__first)) + return true; + return false; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_ANY_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/binary_search.h b/app/src/main/cpp/libcxx/include/__algorithm/binary_search.h new file mode 100644 index 0000000..8f958c2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/binary_search.h @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_BINARY_SEARCH_H +#define _LIBCPP___ALGORITHM_BINARY_SEARCH_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/lower_bound.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) +{ + __first = std::lower_bound<_ForwardIterator, _Tp, __comp_ref_type<_Compare> >(__first, __last, __value, __comp); + return __first != __last && !__comp(__value, *__first); +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) +{ + return std::binary_search(__first, __last, __value, + __less::value_type, _Tp>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_BINARY_SEARCH_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/clamp.h b/app/src/main/cpp/libcxx/include/__algorithm/clamp.h new file mode 100644 index 0000000..30ddbdc --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/clamp.h @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_CLAMP_H +#define _LIBCPP___ALGORITHM_CLAMP_H + +#include <__algorithm/comp.h> +#include <__assert> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY constexpr +const _Tp& +clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi, _Compare __comp) +{ + _LIBCPP_ASSERT(!__comp(__hi, __lo), "Bad bounds passed to std::clamp"); + return __comp(__v, __lo) ? __lo : __comp(__hi, __v) ? __hi : __v; + +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY constexpr +const _Tp& +clamp(const _Tp& __v, const _Tp& __lo, const _Tp& __hi) +{ + return _VSTD::clamp(__v, __lo, __hi, __less<_Tp>()); +} +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_CLAMP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/comp.h b/app/src/main/cpp/libcxx/include/__algorithm/comp.h new file mode 100644 index 0000000..af8eb7b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/comp.h @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COMP_H +#define _LIBCPP___ALGORITHM_COMP_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +struct __equal_to { + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool operator()(const _T1& __x, const _T2& __y) const { + return __x == __y; + } +}; + +template +struct __less +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;} +}; + +template +struct __less<_T1, _T1> +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} +}; + +template +struct __less +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} +}; + +template +struct __less<_T1, const _T1> +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_COMP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/comp_ref_type.h b/app/src/main/cpp/libcxx/include/__algorithm/comp_ref_type.h new file mode 100644 index 0000000..f2338e1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/comp_ref_type.h @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COMP_REF_TYPE_H +#define _LIBCPP___ALGORITHM_COMP_REF_TYPE_H + +#include <__config> +#include <__debug> +#include <__utility/declval.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct __debug_less +{ + _Compare &__comp_; + _LIBCPP_CONSTEXPR_SINCE_CXX14 + __debug_less(_Compare& __c) : __comp_(__c) {} + + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(const _Tp& __x, const _Up& __y) + { + bool __r = __comp_(__x, __y); + if (__r) + __do_compare_assert(0, __y, __x); + return __r; + } + + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(_Tp& __x, _Up& __y) + { + bool __r = __comp_(__x, __y); + if (__r) + __do_compare_assert(0, __y, __x); + return __r; + } + + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 + inline _LIBCPP_INLINE_VISIBILITY + decltype((void)std::declval<_Compare&>()( + std::declval<_LHS &>(), std::declval<_RHS &>())) + __do_compare_assert(int, _LHS & __l, _RHS & __r) { + _LIBCPP_DEBUG_ASSERT(!__comp_(__l, __r), + "Comparator does not induce a strict weak ordering"); + (void)__l; + (void)__r; + } + + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 + inline _LIBCPP_INLINE_VISIBILITY + void __do_compare_assert(long, _LHS &, _RHS &) {} +}; + +// Pass the comparator by lvalue reference. Or in debug mode, using a +// debugging wrapper that stores a reference. +#ifdef _LIBCPP_ENABLE_DEBUG_MODE +template +using __comp_ref_type = __debug_less<_Comp>; +#else +template +using __comp_ref_type = _Comp&; +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_COMP_REF_TYPE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/copy.h b/app/src/main/cpp/libcxx/include/__algorithm/copy.h new file mode 100644 index 0000000..193a6df --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/copy.h @@ -0,0 +1,126 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COPY_H +#define _LIBCPP___ALGORITHM_COPY_H + +#include <__algorithm/copy_move_common.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/min.h> +#include <__config> +#include <__iterator/segmented_iterator.h> +#include <__type_traits/common_type.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> __copy(_InIter, _Sent, _OutIter); + +template +struct __copy_loop { + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _Sent __last, _OutIter __result) const { + while (__first != __last) { + *__result = *__first; + ++__first; + ++__result; + } + + return std::make_pair(std::move(__first), std::move(__result)); + } + + template ::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _InIter __last, _OutIter __result) const { + using _Traits = __segmented_iterator_traits<_InIter>; + auto __sfirst = _Traits::__segment(__first); + auto __slast = _Traits::__segment(__last); + if (__sfirst == __slast) { + auto __iters = std::__copy<_AlgPolicy>(_Traits::__local(__first), _Traits::__local(__last), std::move(__result)); + return std::make_pair(__last, std::move(__iters.second)); + } + + __result = std::__copy<_AlgPolicy>(_Traits::__local(__first), _Traits::__end(__sfirst), std::move(__result)).second; + ++__sfirst; + while (__sfirst != __slast) { + __result = + std::__copy<_AlgPolicy>(_Traits::__begin(__sfirst), _Traits::__end(__sfirst), std::move(__result)).second; + ++__sfirst; + } + __result = + std::__copy<_AlgPolicy>(_Traits::__begin(__sfirst), _Traits::__local(__last), std::move(__result)).second; + return std::make_pair(__last, std::move(__result)); + } + + template ::value && + !__is_segmented_iterator<_InIter>::value && __is_segmented_iterator<_OutIter>::value, + int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _InIter __last, _OutIter __result) { + using _Traits = __segmented_iterator_traits<_OutIter>; + using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type; + + if (__first == __last) + return std::make_pair(std::move(__first), std::move(__result)); + + auto __local_first = _Traits::__local(__result); + auto __segment_iterator = _Traits::__segment(__result); + while (true) { + auto __local_last = _Traits::__end(__segment_iterator); + auto __size = std::min<_DiffT>(__local_last - __local_first, __last - __first); + auto __iters = std::__copy<_AlgPolicy>(__first, __first + __size, __local_first); + __first = std::move(__iters.first); + + if (__first == __last) + return std::make_pair(std::move(__first), _Traits::__compose(__segment_iterator, std::move(__iters.second))); + + __local_first = _Traits::__begin(++__segment_iterator); + } + } +}; + +struct __copy_trivial { + // At this point, the iterators have been unwrapped so any `contiguous_iterator` has been unwrapped to a pointer. + template ::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*> + operator()(_In* __first, _In* __last, _Out* __result) const { + return std::__copy_trivial_impl(__first, __last, __result); + } +}; + +template +pair<_InIter, _OutIter> inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +__copy(_InIter __first, _Sent __last, _OutIter __result) { + return std::__dispatch_copy_or_move<_AlgPolicy, __copy_loop<_AlgPolicy>, __copy_trivial>( + std::move(__first), std::move(__last), std::move(__result)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator +copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { + return std::__copy<_ClassicAlgPolicy>(__first, __last, __result).second; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/copy_backward.h b/app/src/main/cpp/libcxx/include/__algorithm/copy_backward.h new file mode 100644 index 0000000..bb2a432 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/copy_backward.h @@ -0,0 +1,143 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COPY_BACKWARD_H +#define _LIBCPP___ALGORITHM_COPY_BACKWARD_H + +#include <__algorithm/copy_move_common.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/min.h> +#include <__config> +#include <__iterator/segmented_iterator.h> +#include <__type_traits/common_type.h> +#include <__type_traits/is_copy_constructible.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InIter, _OutIter> +__copy_backward(_InIter __first, _Sent __last, _OutIter __result); + +template +struct __copy_backward_loop { + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _Sent __last, _OutIter __result) const { + auto __last_iter = _IterOps<_AlgPolicy>::next(__first, __last); + auto __original_last_iter = __last_iter; + + while (__first != __last_iter) { + *--__result = *--__last_iter; + } + + return std::make_pair(std::move(__original_last_iter), std::move(__result)); + } + + template ::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _InIter __last, _OutIter __result) const { + using _Traits = __segmented_iterator_traits<_InIter>; + auto __sfirst = _Traits::__segment(__first); + auto __slast = _Traits::__segment(__last); + if (__sfirst == __slast) { + auto __iters = + std::__copy_backward<_AlgPolicy>(_Traits::__local(__first), _Traits::__local(__last), std::move(__result)); + return std::make_pair(__last, __iters.second); + } + + __result = + std::__copy_backward<_AlgPolicy>(_Traits::__begin(__slast), _Traits::__local(__last), std::move(__result)) + .second; + --__slast; + while (__sfirst != __slast) { + __result = + std::__copy_backward<_AlgPolicy>(_Traits::__begin(__slast), _Traits::__end(__slast), std::move(__result)) + .second; + --__slast; + } + __result = std::__copy_backward<_AlgPolicy>(_Traits::__local(__first), _Traits::__end(__slast), std::move(__result)) + .second; + return std::make_pair(__last, std::move(__result)); + } + + template ::value && + !__is_segmented_iterator<_InIter>::value && __is_segmented_iterator<_OutIter>::value, + int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _InIter __last, _OutIter __result) { + using _Traits = __segmented_iterator_traits<_OutIter>; + auto __orig_last = __last; + auto __segment_iterator = _Traits::__segment(__result); + + // When the range contains no elements, __result might not be a valid iterator + if (__first == __last) + return std::make_pair(__first, __result); + + auto __local_last = _Traits::__local(__result); + while (true) { + using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type; + + auto __local_first = _Traits::__begin(__segment_iterator); + auto __size = std::min<_DiffT>(__local_last - __local_first, __last - __first); + auto __iter = std::__copy_backward<_AlgPolicy>(__last - __size, __last, __local_last).second; + __last -= __size; + + if (__first == __last) + return std::make_pair(std::move(__orig_last), _Traits::__compose(__segment_iterator, std::move(__iter))); + --__segment_iterator; + __local_last = _Traits::__end(__segment_iterator); + } + } +}; + +struct __copy_backward_trivial { + // At this point, the iterators have been unwrapped so any `contiguous_iterator` has been unwrapped to a pointer. + template ::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*> + operator()(_In* __first, _In* __last, _Out* __result) const { + return std::__copy_backward_trivial_impl(__first, __last, __result); + } +}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_BidirectionalIterator1, _BidirectionalIterator2> +__copy_backward(_BidirectionalIterator1 __first, _Sentinel __last, _BidirectionalIterator2 __result) { + return std::__dispatch_copy_or_move<_AlgPolicy, __copy_backward_loop<_AlgPolicy>, __copy_backward_trivial>( + std::move(__first), std::move(__last), std::move(__result)); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_BidirectionalIterator2 +copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, + _BidirectionalIterator2 __result) +{ + static_assert(std::is_copy_constructible<_BidirectionalIterator1>::value && + std::is_copy_constructible<_BidirectionalIterator1>::value, "Iterators must be copy constructible."); + + return std::__copy_backward<_ClassicAlgPolicy>( + std::move(__first), std::move(__last), std::move(__result)).second; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_COPY_BACKWARD_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/copy_if.h b/app/src/main/cpp/libcxx/include/__algorithm/copy_if.h new file mode 100644 index 0000000..a5938b8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/copy_if.h @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COPY_IF_H +#define _LIBCPP___ALGORITHM_COPY_IF_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +copy_if(_InputIterator __first, _InputIterator __last, + _OutputIterator __result, _Predicate __pred) +{ + for (; __first != __last; ++__first) + { + if (__pred(*__first)) + { + *__result = *__first; + ++__result; + } + } + return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_COPY_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/copy_move_common.h b/app/src/main/cpp/libcxx/include/__algorithm/copy_move_common.h new file mode 100644 index 0000000..b88c149 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/copy_move_common.h @@ -0,0 +1,163 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COPY_MOVE_COMMON_H +#define _LIBCPP___ALGORITHM_COPY_MOVE_COMMON_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/unwrap_iter.h> +#include <__algorithm/unwrap_range.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__memory/pointer_traits.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_always_bitcastable.h> +#include <__type_traits/is_constant_evaluated.h> +#include <__type_traits/is_copy_constructible.h> +#include <__type_traits/is_trivially_assignable.h> +#include <__type_traits/is_trivially_copyable.h> +#include <__type_traits/is_volatile.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Type traits. + +template +struct __can_lower_copy_assignment_to_memmove { + static const bool value = + // If the types are always bitcastable, it's valid to do a bitwise copy between them. + __is_always_bitcastable<_From, _To>::value && + // Reject conversions that wouldn't be performed by the regular built-in assignment (e.g. between arrays). + is_trivially_assignable<_To&, const _From&>::value && + // `memmove` doesn't accept `volatile` pointers, make sure the optimization SFINAEs away in that case. + !is_volatile<_From>::value && + !is_volatile<_To>::value; +}; + +template +struct __can_lower_move_assignment_to_memmove { + static const bool value = + __is_always_bitcastable<_From, _To>::value && + is_trivially_assignable<_To&, _From&&>::value && + !is_volatile<_From>::value && + !is_volatile<_To>::value; +}; + +// `memmove` algorithms implementation. + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*> +__copy_trivial_impl(_In* __first, _In* __last, _Out* __result) { + const size_t __n = static_cast(__last - __first); + ::__builtin_memmove(__result, __first, __n * sizeof(_Out)); + + return std::make_pair(__last, __result + __n); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*> +__copy_backward_trivial_impl(_In* __first, _In* __last, _Out* __result) { + const size_t __n = static_cast(__last - __first); + __result -= __n; + + ::__builtin_memmove(__result, __first, __n * sizeof(_Out)); + + return std::make_pair(__last, __result); +} + +// Iterator unwrapping and dispatching to the correct overload. + +template +struct __overload : _F1, _F2 { + using _F1::operator(); + using _F2::operator(); +}; + +template +struct __can_rewrap : false_type {}; + +template +struct __can_rewrap<_InIter, + _Sent, + _OutIter, + // Note that sentinels are always copy-constructible. + __enable_if_t< is_copy_constructible<_InIter>::value && + is_copy_constructible<_OutIter>::value > > : true_type {}; + +template ::value, int> = 0> +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 pair<_InIter, _OutIter> +__unwrap_and_dispatch(_InIter __first, _Sent __last, _OutIter __out_first) { + auto __range = std::__unwrap_range(__first, std::move(__last)); + auto __result = _Algorithm()(std::move(__range.first), std::move(__range.second), std::__unwrap_iter(__out_first)); + return std::make_pair(std::__rewrap_range<_Sent>(std::move(__first), std::move(__result.first)), + std::__rewrap_iter(std::move(__out_first), std::move(__result.second))); +} + +template ::value, int> = 0> +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 pair<_InIter, _OutIter> +__unwrap_and_dispatch(_InIter __first, _Sent __last, _OutIter __out_first) { + return _Algorithm()(std::move(__first), std::move(__last), std::move(__out_first)); +} + +template +struct __can_copy_without_conversion : false_type {}; + +template +struct __can_copy_without_conversion< + _IterOps, + _InValue, + _OutIter, + __enable_if_t >::value> > : true_type {}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 pair<_InIter, _OutIter> +__dispatch_copy_or_move(_InIter __first, _Sent __last, _OutIter __out_first) { +#ifdef _LIBCPP_COMPILER_GCC + // GCC doesn't support `__builtin_memmove` during constant evaluation. + if (__libcpp_is_constant_evaluated()) { + return std::__unwrap_and_dispatch<_NaiveAlgorithm>(std::move(__first), std::move(__last), std::move(__out_first)); + } +#else + // In Clang, `__builtin_memmove` only supports fully trivially copyable types (just having trivial copy assignment is + // insufficient). Also, conversions are not supported. + if (__libcpp_is_constant_evaluated()) { + using _InValue = typename _IterOps<_AlgPolicy>::template __value_type<_InIter>; + if (!is_trivially_copyable<_InValue>::value || + !__can_copy_without_conversion<_IterOps<_AlgPolicy>, _InValue, _OutIter>::value) { + return std::__unwrap_and_dispatch<_NaiveAlgorithm>(std::move(__first), std::move(__last), std::move(__out_first)); + } + } +#endif // _LIBCPP_COMPILER_GCC + + using _Algorithm = __overload<_NaiveAlgorithm, _OptimizedAlgorithm>; + return std::__unwrap_and_dispatch<_Algorithm>(std::move(__first), std::move(__last), std::move(__out_first)); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_COPY_MOVE_COMMON_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/copy_n.h b/app/src/main/cpp/libcxx/include/__algorithm/copy_n.h new file mode 100644 index 0000000..b08bbdf --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/copy_n.h @@ -0,0 +1,67 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COPY_N_H +#define _LIBCPP___ALGORITHM_COPY_N_H + +#include <__algorithm/copy.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/convert_to_integral.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +typename enable_if +< + __is_cpp17_input_iterator<_InputIterator>::value && + !__is_cpp17_random_access_iterator<_InputIterator>::value, + _OutputIterator +>::type +copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result) +{ + typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize; + _IntegralSize __n = __orig_n; + if (__n > 0) + { + *__result = *__first; + ++__result; + for (--__n; __n > 0; --__n) + { + ++__first; + *__result = *__first; + ++__result; + } + } + return __result; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +typename enable_if +< + __is_cpp17_random_access_iterator<_InputIterator>::value, + _OutputIterator +>::type +copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result) +{ + typedef typename iterator_traits<_InputIterator>::difference_type difference_type; + typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize; + _IntegralSize __n = __orig_n; + return _VSTD::copy(__first, __first + difference_type(__n), __result); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_COPY_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/count.h b/app/src/main/cpp/libcxx/include/__algorithm/count.h new file mode 100644 index 0000000..6c8c7fd --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/count.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COUNT_H +#define _LIBCPP___ALGORITHM_COUNT_H + +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + typename iterator_traits<_InputIterator>::difference_type + count(_InputIterator __first, _InputIterator __last, const _Tp& __value) { + typename iterator_traits<_InputIterator>::difference_type __r(0); + for (; __first != __last; ++__first) + if (*__first == __value) + ++__r; + return __r; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_COUNT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/count_if.h b/app/src/main/cpp/libcxx/include/__algorithm/count_if.h new file mode 100644 index 0000000..b96521f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/count_if.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_COUNT_IF_H +#define _LIBCPP___ALGORITHM_COUNT_IF_H + +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + typename iterator_traits<_InputIterator>::difference_type + count_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) { + typename iterator_traits<_InputIterator>::difference_type __r(0); + for (; __first != __last; ++__first) + if (__pred(*__first)) + ++__r; + return __r; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_COUNT_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/equal.h b/app/src/main/cpp/libcxx/include/__algorithm/equal.h new file mode 100644 index 0000000..cf37f46 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/equal.h @@ -0,0 +1,86 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_EQUAL_H +#define _LIBCPP___ALGORITHM_EQUAL_H + +#include <__algorithm/comp.h> +#include <__config> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred) { + for (; __first1 != __last1; ++__first1, (void)++__first2) + if (!__pred(*__first1, *__first2)) + return false; + return true; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2) { + return std::equal(__first1, __last1, __first2, __equal_to()); +} + +#if _LIBCPP_STD_VER > 11 +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, + _BinaryPredicate __pred, input_iterator_tag, input_iterator_tag) { + for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void)++__first2) + if (!__pred(*__first1, *__first2)) + return false; + return __first1 == __last1 && __first2 == __last2; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__equal(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, _RandomAccessIterator2 __first2, + _RandomAccessIterator2 __last2, _BinaryPredicate __pred, random_access_iterator_tag, + random_access_iterator_tag) { + if (_VSTD::distance(__first1, __last1) != _VSTD::distance(__first2, __last2)) + return false; + return _VSTD::equal<_RandomAccessIterator1, _RandomAccessIterator2, + _BinaryPredicate&>(__first1, __last1, __first2, __pred); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, + _BinaryPredicate __pred) { + return _VSTD::__equal<_BinaryPredicate&>( + __first1, __last1, __first2, __last2, __pred, typename iterator_traits<_InputIterator1>::iterator_category(), + typename iterator_traits<_InputIterator2>::iterator_category()); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +equal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2) { + return std::__equal( + __first1, + __last1, + __first2, + __last2, + __equal_to(), + typename iterator_traits<_InputIterator1>::iterator_category(), + typename iterator_traits<_InputIterator2>::iterator_category()); +} +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_EQUAL_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/equal_range.h b/app/src/main/cpp/libcxx/include/__algorithm/equal_range.h new file mode 100644 index 0000000..2075b03 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/equal_range.h @@ -0,0 +1,87 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_EQUAL_RANGE_H +#define _LIBCPP___ALGORITHM_EQUAL_RANGE_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/half_positive.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/lower_bound.h> +#include <__algorithm/upper_bound.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/advance.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__type_traits/is_callable.h> +#include <__type_traits/is_copy_constructible.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_Iter, _Iter> +__equal_range(_Iter __first, _Sent __last, const _Tp& __value, _Compare&& __comp, _Proj&& __proj) { + auto __len = _IterOps<_AlgPolicy>::distance(__first, __last); + _Iter __end = _IterOps<_AlgPolicy>::next(__first, __last); + while (__len != 0) { + auto __half_len = std::__half_positive(__len); + _Iter __mid = _IterOps<_AlgPolicy>::next(__first, __half_len); + if (std::__invoke(__comp, std::__invoke(__proj, *__mid), __value)) { + __first = ++__mid; + __len -= __half_len + 1; + } else if (std::__invoke(__comp, __value, std::__invoke(__proj, *__mid))) { + __end = __mid; + __len = __half_len; + } else { + _Iter __mp1 = __mid; + return pair<_Iter, _Iter>( + std::__lower_bound_impl<_AlgPolicy>(__first, __mid, __value, __comp, __proj), + std::__upper_bound<_AlgPolicy>(++__mp1, __end, __value, __comp, __proj)); + } + } + return pair<_Iter, _Iter>(__first, __first); +} + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator> +equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) { + static_assert(__is_callable<_Compare, decltype(*__first), const _Tp&>::value, + "The comparator has to be callable"); + static_assert(is_copy_constructible<_ForwardIterator>::value, + "Iterator has to be copy constructible"); + return std::__equal_range<_ClassicAlgPolicy>( + std::move(__first), + std::move(__last), + __value, + static_cast<__comp_ref_type<_Compare> >(__comp), + std::__identity()); +} + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator> +equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) { + return std::equal_range( + std::move(__first), + std::move(__last), + __value, + __less::value_type, _Tp>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_EQUAL_RANGE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/fill.h b/app/src/main/cpp/libcxx/include/__algorithm/fill.h new file mode 100644 index 0000000..76cf4a1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/fill.h @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FILL_H +#define _LIBCPP___ALGORITHM_FILL_H + +#include <__algorithm/fill_n.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// fill isn't specialized for std::memset, because the compiler already optimizes the loop to a call to std::memset. + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, forward_iterator_tag) +{ + for (; __first != __last; ++__first) + *__first = __value; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value, random_access_iterator_tag) +{ + _VSTD::fill_n(__first, __last - __first, __value); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) +{ + _VSTD::__fill(__first, __last, __value, typename iterator_traits<_ForwardIterator>::iterator_category()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FILL_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/fill_n.h b/app/src/main/cpp/libcxx/include/__algorithm/fill_n.h new file mode 100644 index 0000000..fe58c8d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/fill_n.h @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FILL_N_H +#define _LIBCPP___ALGORITHM_FILL_N_H + +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/convert_to_integral.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// fill_n isn't specialized for std::memset, because the compiler already optimizes the loop to a call to std::memset. + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value) +{ + for (; __n > 0; ++__first, (void) --__n) + *__first = __value; + return __first; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +fill_n(_OutputIterator __first, _Size __n, const _Tp& __value) +{ + return _VSTD::__fill_n(__first, _VSTD::__convert_to_integral(__n), __value); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FILL_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/find.h b/app/src/main/cpp/libcxx/include/__algorithm/find.h new file mode 100644 index 0000000..e51dc9b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/find.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FIND_H +#define _LIBCPP___ALGORITHM_FIND_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator +find(_InputIterator __first, _InputIterator __last, const _Tp& __value) { + for (; __first != __last; ++__first) + if (*__first == __value) + break; + return __first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FIND_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/find_end.h b/app/src/main/cpp/libcxx/include/__algorithm/find_end.h new file mode 100644 index 0000000..e2fee6b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/find_end.h @@ -0,0 +1,227 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FIND_END_OF_H +#define _LIBCPP___ALGORITHM_FIND_END_OF_H + +#include <__algorithm/comp.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/search.h> +#include <__config> +#include <__functional/identity.h> +#include <__iterator/advance.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/reverse_iterator.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template < + class _AlgPolicy, + class _Iter1, + class _Sent1, + class _Iter2, + class _Sent2, + class _Pred, + class _Proj1, + class _Proj2> +_LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_Iter1, _Iter1> __find_end_impl( + _Iter1 __first1, + _Sent1 __last1, + _Iter2 __first2, + _Sent2 __last2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2, + forward_iterator_tag, + forward_iterator_tag) { + // modeled after search algorithm + _Iter1 __match_first = _IterOps<_AlgPolicy>::next(__first1, __last1); // __last1 is the "default" answer + _Iter1 __match_last = __match_first; + if (__first2 == __last2) + return pair<_Iter1, _Iter1>(__match_last, __match_last); + while (true) { + while (true) { + if (__first1 == __last1) // if source exhausted return last correct answer (or __last1 if never found) + return pair<_Iter1, _Iter1>(__match_first, __match_last); + if (std::__invoke(__pred, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2))) + break; + ++__first1; + } + // *__first1 matches *__first2, now match elements after here + _Iter1 __m1 = __first1; + _Iter2 __m2 = __first2; + while (true) { + if (++__m2 == __last2) { // Pattern exhaused, record answer and search for another one + __match_first = __first1; + __match_last = ++__m1; + ++__first1; + break; + } + if (++__m1 == __last1) // Source exhausted, return last answer + return pair<_Iter1, _Iter1>(__match_first, __match_last); + // mismatch, restart with a new __first + if (!std::__invoke(__pred, std::__invoke(__proj1, *__m1), std::__invoke(__proj2, *__m2))) + { + ++__first1; + break; + } // else there is a match, check next elements + } + } +} + +template < + class _IterOps, + class _Pred, + class _Iter1, + class _Sent1, + class _Iter2, + class _Sent2, + class _Proj1, + class _Proj2> +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter1 __find_end( + _Iter1 __first1, + _Sent1 __sent1, + _Iter2 __first2, + _Sent2 __sent2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2, + bidirectional_iterator_tag, + bidirectional_iterator_tag) { + auto __last1 = _IterOps::next(__first1, __sent1); + auto __last2 = _IterOps::next(__first2, __sent2); + // modeled after search algorithm (in reverse) + if (__first2 == __last2) + return __last1; // Everything matches an empty sequence + _Iter1 __l1 = __last1; + _Iter2 __l2 = __last2; + --__l2; + while (true) { + // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks + while (true) { + if (__first1 == __l1) // return __last1 if no element matches *__first2 + return __last1; + if (std::__invoke(__pred, std::__invoke(__proj1, *--__l1), std::__invoke(__proj2, *__l2))) + break; + } + // *__l1 matches *__l2, now match elements before here + _Iter1 __m1 = __l1; + _Iter2 __m2 = __l2; + while (true) { + if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern) + return __m1; + if (__m1 == __first1) // Otherwise if source exhaused, pattern not found + return __last1; + + // if there is a mismatch, restart with a new __l1 + if (!std::__invoke(__pred, std::__invoke(__proj1, *--__m1), std::__invoke(__proj2, *--__m2))) + { + break; + } // else there is a match, check next elements + } + } +} + +template < + class _AlgPolicy, + class _Pred, + class _Iter1, + class _Sent1, + class _Iter2, + class _Sent2, + class _Proj1, + class _Proj2> +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Iter1 __find_end( + _Iter1 __first1, + _Sent1 __sent1, + _Iter2 __first2, + _Sent2 __sent2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2, + random_access_iterator_tag, + random_access_iterator_tag) { + typedef typename iterator_traits<_Iter1>::difference_type _D1; + auto __last1 = _IterOps<_AlgPolicy>::next(__first1, __sent1); + auto __last2 = _IterOps<_AlgPolicy>::next(__first2, __sent2); + // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern + auto __len2 = __last2 - __first2; + if (__len2 == 0) + return __last1; + auto __len1 = __last1 - __first1; + if (__len1 < __len2) + return __last1; + const _Iter1 __s = __first1 + _D1(__len2 - 1); // End of pattern match can't go before here + _Iter1 __l1 = __last1; + _Iter2 __l2 = __last2; + --__l2; + while (true) { + while (true) { + if (__s == __l1) + return __last1; + if (std::__invoke(__pred, std::__invoke(__proj1, *--__l1), std::__invoke(__proj2, *__l2))) + break; + } + _Iter1 __m1 = __l1; + _Iter2 __m2 = __l2; + while (true) { + if (__m2 == __first2) + return __m1; + // no need to check range on __m1 because __s guarantees we have enough source + if (!std::__invoke(__pred, std::__invoke(__proj1, *--__m1), std::__invoke(*--__m2))) { + break; + } + } + } +} + +template +_LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +_ForwardIterator1 __find_end_classic(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate& __pred) { + auto __proj = __identity(); + return std::__find_end_impl<_ClassicAlgPolicy>( + __first1, + __last1, + __first2, + __last2, + __pred, + __proj, + __proj, + typename iterator_traits<_ForwardIterator1>::iterator_category(), + typename iterator_traits<_ForwardIterator2>::iterator_category()) + .first; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator1 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __pred) { + return std::__find_end_classic(__first1, __last1, __first2, __last2, __pred); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator1 find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) { + return std::find_end(__first1, __last1, __first2, __last2, __equal_to()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FIND_END_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/find_first_of.h b/app/src/main/cpp/libcxx/include/__algorithm/find_first_of.h new file mode 100644 index 0000000..12f0109 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/find_first_of.h @@ -0,0 +1,52 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FIND_FIRST_OF_H +#define _LIBCPP___ALGORITHM_FIND_FIRST_OF_H + +#include <__algorithm/comp.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator1 __find_first_of_ce(_ForwardIterator1 __first1, + _ForwardIterator1 __last1, + _ForwardIterator2 __first2, + _ForwardIterator2 __last2, + _BinaryPredicate&& __pred) { + for (; __first1 != __last1; ++__first1) + for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) + if (__pred(*__first1, *__j)) + return __first1; + return __last1; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 +find_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, + _ForwardIterator2 __last2, _BinaryPredicate __pred) { + return _VSTD::__find_first_of_ce(__first1, __last1, __first2, __last2, __pred); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 find_first_of( + _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator2 __last2) { + return std::__find_first_of_ce(__first1, __last1, __first2, __last2, __equal_to()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FIND_FIRST_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/find_if.h b/app/src/main/cpp/libcxx/include/__algorithm/find_if.h new file mode 100644 index 0000000..f4ef3ac --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/find_if.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FIND_IF_H +#define _LIBCPP___ALGORITHM_FIND_IF_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator +find_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) { + for (; __first != __last; ++__first) + if (__pred(*__first)) + break; + return __first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FIND_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/find_if_not.h b/app/src/main/cpp/libcxx/include/__algorithm/find_if_not.h new file mode 100644 index 0000000..96c159c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/find_if_not.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FIND_IF_NOT_H +#define _LIBCPP___ALGORITHM_FIND_IF_NOT_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator +find_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred) { + for (; __first != __last; ++__first) + if (!__pred(*__first)) + break; + return __first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FIND_IF_NOT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/for_each.h b/app/src/main/cpp/libcxx/include/__algorithm/for_each.h new file mode 100644 index 0000000..6564f31 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/for_each.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FOR_EACH_H +#define _LIBCPP___ALGORITHM_FOR_EACH_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _Function for_each(_InputIterator __first, + _InputIterator __last, + _Function __f) { + for (; __first != __last; ++__first) + __f(*__first); + return __f; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FOR_EACH_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/for_each_n.h b/app/src/main/cpp/libcxx/include/__algorithm/for_each_n.h new file mode 100644 index 0000000..38d204a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/for_each_n.h @@ -0,0 +1,43 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_FOR_EACH_N_H +#define _LIBCPP___ALGORITHM_FOR_EACH_N_H + +#include <__config> +#include <__utility/convert_to_integral.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _InputIterator for_each_n(_InputIterator __first, + _Size __orig_n, + _Function __f) { + typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize; + _IntegralSize __n = __orig_n; + while (__n > 0) { + __f(*__first); + ++__first; + --__n; + } + return __first; +} + +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_FOR_EACH_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/generate.h b/app/src/main/cpp/libcxx/include/__algorithm/generate.h new file mode 100644 index 0000000..48e21b5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/generate.h @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_GENERATE_H +#define _LIBCPP___ALGORITHM_GENERATE_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +generate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen) +{ + for (; __first != __last; ++__first) + *__first = __gen(); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_GENERATE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/generate_n.h b/app/src/main/cpp/libcxx/include/__algorithm/generate_n.h new file mode 100644 index 0000000..4525998 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/generate_n.h @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_GENERATE_N_H +#define _LIBCPP___ALGORITHM_GENERATE_N_H + +#include <__config> +#include <__utility/convert_to_integral.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +generate_n(_OutputIterator __first, _Size __orig_n, _Generator __gen) +{ + typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize; + _IntegralSize __n = __orig_n; + for (; __n > 0; ++__first, (void) --__n) + *__first = __gen(); + return __first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_GENERATE_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/half_positive.h b/app/src/main/cpp/libcxx/include/__algorithm/half_positive.h new file mode 100644 index 0000000..74aede2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/half_positive.h @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_HALF_POSITIVE_H +#define _LIBCPP___ALGORITHM_HALF_POSITIVE_H + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Perform division by two quickly for positive integers (llvm.org/PR39129) + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + is_integral<_Integral>::value, + _Integral +>::type +__half_positive(_Integral __value) +{ + return static_cast<_Integral>(static_cast<__make_unsigned_t<_Integral> >(__value) / 2); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + !is_integral<_Tp>::value, + _Tp +>::type +__half_positive(_Tp __value) +{ + return __value / 2; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_HALF_POSITIVE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/in_found_result.h b/app/src/main/cpp/libcxx/include/__algorithm/in_found_result.h new file mode 100644 index 0000000..3134d6e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/in_found_result.h @@ -0,0 +1,49 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IN_FOUND_RESULT_H +#define _LIBCPP___ALGORITHM_IN_FOUND_RESULT_H + +#include <__concepts/convertible_to.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +template +struct in_found_result { + _LIBCPP_NO_UNIQUE_ADDRESS _InIter1 in; + bool found; + + template + requires convertible_to + _LIBCPP_HIDE_FROM_ABI constexpr operator in_found_result<_InIter2>() const & { + return {in, found}; + } + + template + requires convertible_to<_InIter1, _InIter2> + _LIBCPP_HIDE_FROM_ABI constexpr operator in_found_result<_InIter2>() && { + return {std::move(in), found}; + } +}; +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_IN_FOUND_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/in_fun_result.h b/app/src/main/cpp/libcxx/include/__algorithm/in_fun_result.h new file mode 100644 index 0000000..3cbb9e1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/in_fun_result.h @@ -0,0 +1,49 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IN_FUN_RESULT_H +#define _LIBCPP___ALGORITHM_IN_FUN_RESULT_H + +#include <__concepts/convertible_to.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { +template +struct in_fun_result { + _LIBCPP_NO_UNIQUE_ADDRESS _InIter1 in; + _LIBCPP_NO_UNIQUE_ADDRESS _Func1 fun; + + template + requires convertible_to && convertible_to + _LIBCPP_HIDE_FROM_ABI constexpr operator in_fun_result<_InIter2, _Func2>() const & { + return {in, fun}; + } + + template + requires convertible_to<_InIter1, _InIter2> && convertible_to<_Func1, _Func2> + _LIBCPP_HIDE_FROM_ABI constexpr operator in_fun_result<_InIter2, _Func2>() && { + return {std::move(in), std::move(fun)}; + } +}; +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IN_FUN_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/in_in_out_result.h b/app/src/main/cpp/libcxx/include/__algorithm/in_in_out_result.h new file mode 100644 index 0000000..3e747be --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/in_in_out_result.h @@ -0,0 +1,56 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IN_IN_OUT_RESULT_H +#define _LIBCPP___ALGORITHM_IN_IN_OUT_RESULT_H + +#include <__concepts/convertible_to.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { + +template +struct in_in_out_result { + _LIBCPP_NO_UNIQUE_ADDRESS _InIter1 in1; + _LIBCPP_NO_UNIQUE_ADDRESS _InIter2 in2; + _LIBCPP_NO_UNIQUE_ADDRESS _OutIter1 out; + + template + requires convertible_to + && convertible_to && convertible_to + _LIBCPP_HIDE_FROM_ABI constexpr + operator in_in_out_result<_InIter3, _InIter4, _OutIter2>() const& { + return {in1, in2, out}; + } + + template + requires convertible_to<_InIter1, _InIter3> + && convertible_to<_InIter2, _InIter4> && convertible_to<_OutIter1, _OutIter2> + _LIBCPP_HIDE_FROM_ABI constexpr + operator in_in_out_result<_InIter3, _InIter4, _OutIter2>() && { + return {std::move(in1), std::move(in2), std::move(out)}; + } +}; + +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IN_IN_OUT_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/in_in_result.h b/app/src/main/cpp/libcxx/include/__algorithm/in_in_result.h new file mode 100644 index 0000000..2098c18 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/in_in_result.h @@ -0,0 +1,53 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IN_IN_RESULT_H +#define _LIBCPP___ALGORITHM_IN_IN_RESULT_H + +#include <__concepts/convertible_to.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { + +template +struct in_in_result { + _LIBCPP_NO_UNIQUE_ADDRESS _InIter1 in1; + _LIBCPP_NO_UNIQUE_ADDRESS _InIter2 in2; + + template + requires convertible_to && convertible_to + _LIBCPP_HIDE_FROM_ABI constexpr + operator in_in_result<_InIter3, _InIter4>() const & { + return {in1, in2}; + } + + template + requires convertible_to<_InIter1, _InIter3> && convertible_to<_InIter2, _InIter4> + _LIBCPP_HIDE_FROM_ABI constexpr + operator in_in_result<_InIter3, _InIter4>() && { + return {std::move(in1), std::move(in2)}; + } +}; + +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IN_IN_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/in_out_out_result.h b/app/src/main/cpp/libcxx/include/__algorithm/in_out_out_result.h new file mode 100644 index 0000000..4046eee --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/in_out_out_result.h @@ -0,0 +1,54 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IN_OUT_OUT_RESULT_H +#define _LIBCPP___ALGORITHM_IN_OUT_OUT_RESULT_H + +#include <__concepts/convertible_to.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { +template +struct in_out_out_result { + _LIBCPP_NO_UNIQUE_ADDRESS _InIter1 in; + _LIBCPP_NO_UNIQUE_ADDRESS _OutIter1 out1; + _LIBCPP_NO_UNIQUE_ADDRESS _OutIter2 out2; + + template + requires convertible_to + && convertible_to && convertible_to + _LIBCPP_HIDE_FROM_ABI constexpr + operator in_out_out_result<_InIter2, _OutIter3, _OutIter4>() const& { + return {in, out1, out2}; + } + + template + requires convertible_to<_InIter1, _InIter2> + && convertible_to<_OutIter1, _OutIter3> && convertible_to<_OutIter2, _OutIter4> + _LIBCPP_HIDE_FROM_ABI constexpr + operator in_out_out_result<_InIter2, _OutIter3, _OutIter4>() && { + return {std::move(in), std::move(out1), std::move(out2)}; + } +}; +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IN_OUT_OUT_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/in_out_result.h b/app/src/main/cpp/libcxx/include/__algorithm/in_out_result.h new file mode 100644 index 0000000..7f5a027 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/in_out_result.h @@ -0,0 +1,53 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IN_OUT_RESULT_H +#define _LIBCPP___ALGORITHM_IN_OUT_RESULT_H + +#include <__concepts/convertible_to.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { + +template +struct in_out_result { + _LIBCPP_NO_UNIQUE_ADDRESS _InIter1 in; + _LIBCPP_NO_UNIQUE_ADDRESS _OutIter1 out; + + template + requires convertible_to && convertible_to + _LIBCPP_HIDE_FROM_ABI + constexpr operator in_out_result<_InIter2, _OutIter2>() const & { + return {in, out}; + } + + template + requires convertible_to<_InIter1, _InIter2> && convertible_to<_OutIter1, _OutIter2> + _LIBCPP_HIDE_FROM_ABI + constexpr operator in_out_result<_InIter2, _OutIter2>() && { + return {std::move(in), std::move(out)}; + } +}; + +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IN_OUT_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/includes.h b/app/src/main/cpp/libcxx/include/__algorithm/includes.h new file mode 100644 index 0000000..cc39f27 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/includes.h @@ -0,0 +1,75 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_INCLUDES_H +#define _LIBCPP___ALGORITHM_INCLUDES_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/is_callable.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__includes(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, + _Comp&& __comp, _Proj1&& __proj1, _Proj2&& __proj2) { + for (; __first2 != __last2; ++__first1) { + if (__first1 == __last1 || std::__invoke( + __comp, std::__invoke(__proj2, *__first2), std::__invoke(__proj1, *__first1))) + return false; + if (!std::__invoke(__comp, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2))) + ++__first2; + } + return true; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool includes( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _Compare __comp) { + static_assert(__is_callable<_Compare, decltype(*__first1), decltype(*__first2)>::value, + "Comparator has to be callable"); + + return std::__includes( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + static_cast<__comp_ref_type<_Compare> >(__comp), + __identity(), + __identity()); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2) { + return std::includes( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + __less::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_INCLUDES_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/inplace_merge.h b/app/src/main/cpp/libcxx/include/__algorithm/inplace_merge.h new file mode 100644 index 0000000..5bbefc9 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/inplace_merge.h @@ -0,0 +1,257 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_INPLACE_MERGE_H +#define _LIBCPP___ALGORITHM_INPLACE_MERGE_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/lower_bound.h> +#include <__algorithm/min.h> +#include <__algorithm/move.h> +#include <__algorithm/rotate.h> +#include <__algorithm/upper_bound.h> +#include <__config> +#include <__functional/identity.h> +#include <__iterator/advance.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/reverse_iterator.h> +#include <__memory/destruct_n.h> +#include <__memory/temporary_buffer.h> +#include <__memory/unique_ptr.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class __invert // invert the sense of a comparison +{ +private: + _Predicate __p_; +public: + _LIBCPP_INLINE_VISIBILITY __invert() {} + + _LIBCPP_INLINE_VISIBILITY + explicit __invert(_Predicate __p) : __p_(__p) {} + + template + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _T1& __x) {return !__p_(__x);} + + template + _LIBCPP_INLINE_VISIBILITY + bool operator()(const _T1& __x, const _T2& __y) {return __p_(__y, __x);} +}; + +template +_LIBCPP_HIDE_FROM_ABI +void __half_inplace_merge(_InputIterator1 __first1, _Sent1 __last1, + _InputIterator2 __first2, _Sent2 __last2, + _OutputIterator __result, _Compare&& __comp) +{ + for (; __first1 != __last1; ++__result) + { + if (__first2 == __last2) + { + std::__move<_AlgPolicy>(__first1, __last1, __result); + return; + } + + if (__comp(*__first2, *__first1)) + { + *__result = _IterOps<_AlgPolicy>::__iter_move(__first2); + ++__first2; + } + else + { + *__result = _IterOps<_AlgPolicy>::__iter_move(__first1); + ++__first1; + } + } + // __first2 through __last2 are already in the right spot. +} + +template +_LIBCPP_HIDE_FROM_ABI +void __buffered_inplace_merge( + _BidirectionalIterator __first, + _BidirectionalIterator __middle, + _BidirectionalIterator __last, + _Compare&& __comp, + typename iterator_traits<_BidirectionalIterator>::difference_type __len1, + typename iterator_traits<_BidirectionalIterator>::difference_type __len2, + typename iterator_traits<_BidirectionalIterator>::value_type* __buff) { + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + __destruct_n __d(0); + unique_ptr __h2(__buff, __d); + if (__len1 <= __len2) + { + value_type* __p = __buff; + for (_BidirectionalIterator __i = __first; __i != __middle; __d.template __incr(), (void) ++__i, (void) ++__p) + ::new ((void*)__p) value_type(_IterOps<_AlgPolicy>::__iter_move(__i)); + std::__half_inplace_merge<_AlgPolicy>(__buff, __p, __middle, __last, __first, __comp); + } + else + { + value_type* __p = __buff; + for (_BidirectionalIterator __i = __middle; __i != __last; __d.template __incr(), (void) ++__i, (void) ++__p) + ::new ((void*)__p) value_type(_IterOps<_AlgPolicy>::__iter_move(__i)); + typedef __unconstrained_reverse_iterator<_BidirectionalIterator> _RBi; + typedef __unconstrained_reverse_iterator _Rv; + typedef __invert<_Compare> _Inverted; + std::__half_inplace_merge<_AlgPolicy>(_Rv(__p), _Rv(__buff), + _RBi(__middle), _RBi(__first), + _RBi(__last), _Inverted(__comp)); + } +} + +template +void __inplace_merge( + _BidirectionalIterator __first, + _BidirectionalIterator __middle, + _BidirectionalIterator __last, + _Compare&& __comp, + typename iterator_traits<_BidirectionalIterator>::difference_type __len1, + typename iterator_traits<_BidirectionalIterator>::difference_type __len2, + typename iterator_traits<_BidirectionalIterator>::value_type* __buff, + ptrdiff_t __buff_size) { + using _Ops = _IterOps<_AlgPolicy>; + + typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; + while (true) + { + // if __middle == __last, we're done + if (__len2 == 0) + return; + if (__len1 <= __buff_size || __len2 <= __buff_size) + return std::__buffered_inplace_merge<_AlgPolicy> + (__first, __middle, __last, __comp, __len1, __len2, __buff); + // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0 + for (; true; ++__first, (void) --__len1) + { + if (__len1 == 0) + return; + if (__comp(*__middle, *__first)) + break; + } + // __first < __middle < __last + // *__first > *__middle + // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that + // all elements in: + // [__first, __m1) <= [__middle, __m2) + // [__middle, __m2) < [__m1, __middle) + // [__m1, __middle) <= [__m2, __last) + // and __m1 or __m2 is in the middle of its range + _BidirectionalIterator __m1; // "median" of [__first, __middle) + _BidirectionalIterator __m2; // "median" of [__middle, __last) + difference_type __len11; // distance(__first, __m1) + difference_type __len21; // distance(__middle, __m2) + // binary search smaller range + if (__len1 < __len2) + { // __len >= 1, __len2 >= 2 + __len21 = __len2 / 2; + __m2 = __middle; + _Ops::advance(__m2, __len21); + __m1 = std::__upper_bound<_AlgPolicy>(__first, __middle, *__m2, __comp, std::__identity()); + __len11 = _Ops::distance(__first, __m1); + } + else + { + if (__len1 == 1) + { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1 + // It is known *__first > *__middle + _Ops::iter_swap(__first, __middle); + return; + } + // __len1 >= 2, __len2 >= 1 + __len11 = __len1 / 2; + __m1 = __first; + _Ops::advance(__m1, __len11); + __m2 = std::lower_bound(__middle, __last, *__m1, __comp); + __len21 = _Ops::distance(__middle, __m2); + } + difference_type __len12 = __len1 - __len11; // distance(__m1, __middle) + difference_type __len22 = __len2 - __len21; // distance(__m2, __last) + // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) + // swap middle two partitions + __middle = std::__rotate<_AlgPolicy>(__m1, __middle, __m2).first; + // __len12 and __len21 now have swapped meanings + // merge smaller range with recursive call and larger with tail recursion elimination + if (__len11 + __len21 < __len12 + __len22) + { + std::__inplace_merge<_AlgPolicy>( + __first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size); + __first = __middle; + __middle = __m2; + __len1 = __len12; + __len2 = __len22; + } + else + { + std::__inplace_merge<_AlgPolicy>( + __middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size); + __last = __middle; + __middle = __m1; + __len1 = __len11; + __len2 = __len21; + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI +void +__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, + _Compare&& __comp) +{ + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; + difference_type __len1 = _IterOps<_AlgPolicy>::distance(__first, __middle); + difference_type __len2 = _IterOps<_AlgPolicy>::distance(__middle, __last); + difference_type __buf_size = _VSTD::min(__len1, __len2); +// TODO: Remove the use of std::get_temporary_buffer +_LIBCPP_SUPPRESS_DEPRECATED_PUSH + pair __buf = _VSTD::get_temporary_buffer(__buf_size); +_LIBCPP_SUPPRESS_DEPRECATED_POP + unique_ptr __h(__buf.first); + return std::__inplace_merge<_AlgPolicy>( + std::move(__first), std::move(__middle), std::move(__last), __comp, __len1, __len2, __buf.first, __buf.second); +} + +template +inline _LIBCPP_HIDE_FROM_ABI void inplace_merge( + _BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, _Compare __comp) { + std::__inplace_merge<_ClassicAlgPolicy>( + std::move(__first), std::move(__middle), std::move(__last), static_cast<__comp_ref_type<_Compare> >(__comp)); +} + +template +inline _LIBCPP_HIDE_FROM_ABI +void +inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last) +{ + std::inplace_merge(std::move(__first), std::move(__middle), std::move(__last), + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_INPLACE_MERGE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/is_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/is_heap.h new file mode 100644 index 0000000..2dcb4a2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/is_heap.h @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IS_HEAP_H +#define _LIBCPP___ALGORITHM_IS_HEAP_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/is_heap_until.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + return std::__is_heap_until(__first, __last, static_cast<__comp_ref_type<_Compare> >(__comp)) == __last; +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + return _VSTD::is_heap(__first, __last, __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IS_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/is_heap_until.h b/app/src/main/cpp/libcxx/include/__algorithm/is_heap_until.h new file mode 100644 index 0000000..6ed4cb2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/is_heap_until.h @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IS_HEAP_UNTIL_H +#define _LIBCPP___ALGORITHM_IS_HEAP_UNTIL_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator +__is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + difference_type __len = __last - __first; + difference_type __p = 0; + difference_type __c = 1; + _RandomAccessIterator __pp = __first; + while (__c < __len) + { + _RandomAccessIterator __cp = __first + __c; + if (__comp(*__pp, *__cp)) + return __cp; + ++__c; + ++__cp; + if (__c == __len) + return __last; + if (__comp(*__pp, *__cp)) + return __cp; + ++__p; + ++__pp; + __c = 2 * __p + 1; + } + return __last; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator +is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +{ + return std::__is_heap_until(__first, __last, static_cast<__comp_ref_type<_Compare> >(__comp)); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _RandomAccessIterator +is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + return _VSTD::__is_heap_until(__first, __last, __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IS_HEAP_UNTIL_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/is_partitioned.h b/app/src/main/cpp/libcxx/include/__algorithm/is_partitioned.h new file mode 100644 index 0000000..ab59d3c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/is_partitioned.h @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IS_PARTITIONED_H +#define _LIBCPP___ALGORITHM_IS_PARTITIONED_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred) +{ + for (; __first != __last; ++__first) + if (!__pred(*__first)) + break; + if ( __first == __last ) + return true; + ++__first; + for (; __first != __last; ++__first) + if (__pred(*__first)) + return false; + return true; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IS_PARTITIONED_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/is_permutation.h b/app/src/main/cpp/libcxx/include/__algorithm/is_permutation.h new file mode 100644 index 0000000..0054456 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/is_permutation.h @@ -0,0 +1,238 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IS_PERMUTATION_H +#define _LIBCPP___ALGORITHM_IS_PERMUTATION_H + +#include <__algorithm/comp.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct _ConstTimeDistance : false_type {}; + +#if _LIBCPP_STD_VER > 17 + +template +struct _ConstTimeDistance<_Iter1, _Sent1, _Iter2, _Sent2, __enable_if_t< + sized_sentinel_for<_Sent1, _Iter1> && + sized_sentinel_for<_Sent2, _Iter2> +>> : true_type {}; + +#else + +template +struct _ConstTimeDistance<_Iter1, _Iter1, _Iter2, _Iter2, __enable_if_t< + is_same::iterator_category, random_access_iterator_tag>::value && + is_same::iterator_category, random_access_iterator_tag>::value +> > : true_type {}; + +#endif // _LIBCPP_STD_VER > 17 + +// Internal functions + +// For each element in [f1, l1) see if there are the same number of equal elements in [f2, l2) +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__is_permutation_impl(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, + _Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2) { + using _D1 = __iter_diff_t<_Iter1>; + + for (auto __i = __first1; __i != __last1; ++__i) { + // Have we already counted the number of *__i in [f1, l1)? + auto __match = __first1; + for (; __match != __i; ++__match) { + if (std::__invoke(__pred, std::__invoke(__proj1, *__match), std::__invoke(__proj1, *__i))) + break; + } + + if (__match == __i) { + // Count number of *__i in [f2, l2) + _D1 __c2 = 0; + for (auto __j = __first2; __j != __last2; ++__j) { + if (std::__invoke(__pred, std::__invoke(__proj1, *__i), std::__invoke(__proj2, *__j))) + ++__c2; + } + if (__c2 == 0) + return false; + + // Count number of *__i in [__i, l1) (we can start with 1) + _D1 __c1 = 1; + for (auto __j = _IterOps<_AlgPolicy>::next(__i); __j != __last1; ++__j) { + if (std::__invoke(__pred, std::__invoke(__proj1, *__i), std::__invoke(__proj1, *__j))) + ++__c1; + } + if (__c1 != __c2) + return false; + } + } + + return true; +} + +// 2+1 iterators, predicate. Not used by range algorithms. +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__is_permutation(_ForwardIterator1 __first1, _Sentinel1 __last1, _ForwardIterator2 __first2, + _BinaryPredicate&& __pred) { + // Shorten sequences as much as possible by lopping of any equal prefix. + for (; __first1 != __last1; ++__first1, (void)++__first2) { + if (!__pred(*__first1, *__first2)) + break; + } + + if (__first1 == __last1) + return true; + + // __first1 != __last1 && *__first1 != *__first2 + using _D1 = __iter_diff_t<_ForwardIterator1>; + _D1 __l1 = _IterOps<_AlgPolicy>::distance(__first1, __last1); + if (__l1 == _D1(1)) + return false; + auto __last2 = _IterOps<_AlgPolicy>::next(__first2, __l1); + + return std::__is_permutation_impl<_AlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), + __pred, __identity(), __identity()); +} + +// 2+2 iterators, predicate, non-constant time `distance`. +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, + _Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2, + /*_ConstTimeDistance=*/false_type) { + // Shorten sequences as much as possible by lopping of any equal prefix. + while (__first1 != __last1 && __first2 != __last2) { + if (!std::__invoke(__pred, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2))) + break; + ++__first1; + ++__first2; + } + + if (__first1 == __last1) + return __first2 == __last2; + if (__first2 == __last2) // Second range is shorter + return false; + + using _D1 = __iter_diff_t<_Iter1>; + _D1 __l1 = _IterOps<_AlgPolicy>::distance(__first1, __last1); + + using _D2 = __iter_diff_t<_Iter2>; + _D2 __l2 = _IterOps<_AlgPolicy>::distance(__first2, __last2); + if (__l1 != __l2) + return false; + + return std::__is_permutation_impl<_AlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), + __pred, __proj1, __proj2); +} + +// 2+2 iterators, predicate, specialization for constant-time `distance` call. +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, + _Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2, + /*_ConstTimeDistance=*/true_type) { + if (std::distance(__first1, __last1) != std::distance(__first2, __last2)) + return false; + return std::__is_permutation<_AlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), + __pred, __proj1, __proj2, + /*_ConstTimeDistance=*/false_type()); +} + +// 2+2 iterators, predicate +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__is_permutation(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, + _Pred&& __pred, _Proj1&& __proj1, _Proj2&& __proj2) { + return std::__is_permutation<_AlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), + __pred, __proj1, __proj2, + _ConstTimeDistance<_Iter1, _Sent1, _Iter2, _Sent2>()); +} + +// Public interface + +// 2+1 iterators, predicate +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, + _BinaryPredicate __pred) { + static_assert(__is_callable<_BinaryPredicate, decltype(*__first1), decltype(*__first2)>::value, + "The predicate has to be callable"); + + return std::__is_permutation<_ClassicAlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2), __pred); +} + +// 2+1 iterators +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) { + return std::is_permutation(__first1, __last1, __first2, __equal_to()); +} + +#if _LIBCPP_STD_VER > 11 + +// 2+2 iterators +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool is_permutation( + _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator2 __last2) { + return std::__is_permutation<_ClassicAlgPolicy>( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + __equal_to(), + __identity(), + __identity()); +} + +// 2+2 iterators, predicate +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +is_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, + _ForwardIterator2 __last2, _BinaryPredicate __pred) { + static_assert(__is_callable<_BinaryPredicate, decltype(*__first1), decltype(*__first2)>::value, + "The predicate has to be callable"); + + return std::__is_permutation<_ClassicAlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), + __pred, __identity(), __identity()); +} + +#endif // _LIBCPP_STD_VER > 11 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IS_PERMUTATION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/is_sorted.h b/app/src/main/cpp/libcxx/include/__algorithm/is_sorted.h new file mode 100644 index 0000000..bf44f45 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/is_sorted.h @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IS_SORTED_H +#define _LIBCPP___ALGORITHM_IS_SORTED_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/is_sorted_until.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +is_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + return _VSTD::__is_sorted_until<__comp_ref_type<_Compare> >(__first, __last, __comp) == __last; +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +is_sorted(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::is_sorted(__first, __last, __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IS_SORTED_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/is_sorted_until.h b/app/src/main/cpp/libcxx/include/__algorithm/is_sorted_until.h new file mode 100644 index 0000000..b668300 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/is_sorted_until.h @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_IS_SORTED_UNTIL_H +#define _LIBCPP___ALGORITHM_IS_SORTED_UNTIL_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +__is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (__comp(*__i, *__first)) + return __i; + __first = __i; + } + } + return __last; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +is_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + return _VSTD::__is_sorted_until<__comp_ref_type<_Compare> >(__first, __last, __comp); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +is_sorted_until(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::is_sorted_until(__first, __last, __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_IS_SORTED_UNTIL_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/iter_swap.h b/app/src/main/cpp/libcxx/include/__algorithm/iter_swap.h new file mode 100644 index 0000000..44422b5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/iter_swap.h @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_ITER_SWAP_H +#define _LIBCPP___ALGORITHM_ITER_SWAP_H + +#include <__config> +#include <__utility/declval.h> +#include <__utility/swap.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 void iter_swap(_ForwardIterator1 __a, + _ForwardIterator2 __b) + // _NOEXCEPT_(_NOEXCEPT_(swap(*__a, *__b))) + _NOEXCEPT_(_NOEXCEPT_(swap(*std::declval<_ForwardIterator1>(), *std::declval<_ForwardIterator2>()))) { + swap(*__a, *__b); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_ITER_SWAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/iterator_operations.h b/app/src/main/cpp/libcxx/include/__algorithm/iterator_operations.h new file mode 100644 index 0000000..bd3e6f1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/iterator_operations.h @@ -0,0 +1,175 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_ITERATOR_OPERATIONS_H +#define _LIBCPP___ALGORITHM_ITERATOR_OPERATIONS_H + +#include <__algorithm/iter_swap.h> +#include <__algorithm/ranges_iterator_concept.h> +#include <__config> +#include <__iterator/advance.h> +#include <__iterator/distance.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iter_move.h> +#include <__iterator/iter_swap.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/prev.h> +#include <__iterator/readable_traits.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_reference.h> +#include <__type_traits/is_same.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/declval.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template struct _IterOps; + +#if _LIBCPP_STD_VER > 17 +struct _RangeAlgPolicy {}; + +template <> +struct _IterOps<_RangeAlgPolicy> { + + template + using __value_type = iter_value_t<_Iter>; + + template + using __iterator_category = ranges::__iterator_concept<_Iter>; + + template + using __difference_type = iter_difference_t<_Iter>; + + static constexpr auto advance = ranges::advance; + static constexpr auto distance = ranges::distance; + static constexpr auto __iter_move = ranges::iter_move; + static constexpr auto iter_swap = ranges::iter_swap; + static constexpr auto next = ranges::next; + static constexpr auto prev = ranges::prev; + static constexpr auto __advance_to = ranges::advance; +}; + +#endif + +struct _ClassicAlgPolicy {}; + +template <> +struct _IterOps<_ClassicAlgPolicy> { + + template + using __value_type = typename iterator_traits<_Iter>::value_type; + + template + using __iterator_category = typename iterator_traits<_Iter>::iterator_category; + + template + using __difference_type = typename iterator_traits<_Iter>::difference_type; + + // advance + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 + static void advance(_Iter& __iter, _Distance __count) { + std::advance(__iter, __count); + } + + // distance + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 + static typename iterator_traits<_Iter>::difference_type distance(_Iter __first, _Iter __last) { + return std::distance(__first, __last); + } + + template + using __deref_t = decltype(*std::declval<_Iter&>()); + + template + using __move_t = decltype(std::move(*std::declval<_Iter&>())); + + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 + static void __validate_iter_reference() { + static_assert(is_same<__deref_t<_Iter>, typename iterator_traits<__remove_cvref_t<_Iter> >::reference>::value, + "It looks like your iterator's `iterator_traits::reference` does not match the return type of " + "dereferencing the iterator, i.e., calling `*it`. This is undefined behavior according to [input.iterators] " + "and can lead to dangling reference issues at runtime, so we are flagging this."); + } + + // iter_move + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 static + // If the result of dereferencing `_Iter` is a reference type, deduce the result of calling `std::move` on it. Note + // that the C++03 mode doesn't support `decltype(auto)` as the return type. + __enable_if_t< + is_reference<__deref_t<_Iter> >::value, + __move_t<_Iter> > + __iter_move(_Iter&& __i) { + __validate_iter_reference<_Iter>(); + + return std::move(*std::forward<_Iter>(__i)); + } + + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 static + // If the result of dereferencing `_Iter` is a value type, deduce the return value of this function to also be a + // value -- otherwise, after `operator*` returns a temporary, this function would return a dangling reference to that + // temporary. Note that the C++03 mode doesn't support `auto` as the return type. + __enable_if_t< + !is_reference<__deref_t<_Iter> >::value, + __deref_t<_Iter> > + __iter_move(_Iter&& __i) { + __validate_iter_reference<_Iter>(); + + return *std::forward<_Iter>(__i); + } + + // iter_swap + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 + static void iter_swap(_Iter1&& __a, _Iter2&& __b) { + std::iter_swap(std::forward<_Iter1>(__a), std::forward<_Iter2>(__b)); + } + + // next + template + _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14 + _Iterator next(_Iterator, _Iterator __last) { + return __last; + } + + template + _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14 + __remove_cvref_t<_Iter> next(_Iter&& __it, + typename iterator_traits<__remove_cvref_t<_Iter> >::difference_type __n = 1) { + return std::next(std::forward<_Iter>(__it), __n); + } + + // prev + template + _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14 + __remove_cvref_t<_Iter> prev(_Iter&& __iter, + typename iterator_traits<__remove_cvref_t<_Iter> >::difference_type __n = 1) { + return std::prev(std::forward<_Iter>(__iter), __n); + } + + template + _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR_SINCE_CXX14 + void __advance_to(_Iter& __first, _Iter __last) { + __first = __last; + } +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_ITERATOR_OPERATIONS_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/lexicographical_compare.h b/app/src/main/cpp/libcxx/include/__algorithm/lexicographical_compare.h new file mode 100644 index 0000000..0a13c5d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/lexicographical_compare.h @@ -0,0 +1,62 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_LEXICOGRAPHICAL_COMPARE_H +#define _LIBCPP___ALGORITHM_LEXICOGRAPHICAL_COMPARE_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp) +{ + for (; __first2 != __last2; ++__first1, (void) ++__first2) + { + if (__first1 == __last1 || __comp(*__first1, *__first2)) + return true; + if (__comp(*__first2, *__first1)) + return false; + } + return false; +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp) +{ + return _VSTD::__lexicographical_compare<__comp_ref_type<_Compare> >(__first1, __last1, __first2, __last2, __comp); +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2) +{ + return _VSTD::lexicographical_compare(__first1, __last1, __first2, __last2, + __less::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_LEXICOGRAPHICAL_COMPARE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/lower_bound.h b/app/src/main/cpp/libcxx/include/__algorithm/lower_bound.h new file mode 100644 index 0000000..2648982 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/lower_bound.h @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_LOWER_BOUND_H +#define _LIBCPP___ALGORITHM_LOWER_BOUND_H + +#include <__algorithm/comp.h> +#include <__algorithm/half_positive.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/advance.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/is_callable.h> +#include <__type_traits/remove_reference.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_Iter __lower_bound_impl(_Iter __first, _Sent __last, const _Type& __value, _Comp& __comp, _Proj& __proj) { + auto __len = _IterOps<_AlgPolicy>::distance(__first, __last); + + while (__len != 0) { + auto __l2 = std::__half_positive(__len); + _Iter __m = __first; + _IterOps<_AlgPolicy>::advance(__m, __l2); + if (std::__invoke(__comp, std::__invoke(__proj, *__m), __value)) { + __first = ++__m; + __len -= __l2 + 1; + } else { + __len = __l2; + } + } + return __first; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) { + static_assert(__is_callable<_Compare, decltype(*__first), const _Tp&>::value, + "The comparator has to be callable"); + auto __proj = std::__identity(); + return std::__lower_bound_impl<_ClassicAlgPolicy>(__first, __last, __value, __comp, __proj); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) { + return std::lower_bound(__first, __last, __value, + __less::value_type, _Tp>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_LOWER_BOUND_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/make_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/make_heap.h new file mode 100644 index 0000000..d66cfe2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/make_heap.h @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MAKE_HEAP_H +#define _LIBCPP___ALGORITHM_MAKE_HEAP_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/sift_down.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +void __make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp) { + __comp_ref_type<_Compare> __comp_ref = __comp; + + using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type; + difference_type __n = __last - __first; + if (__n > 1) { + // start from the first parent, there is no need to consider children + for (difference_type __start = (__n - 2) / 2; __start >= 0; --__start) { + std::__sift_down<_AlgPolicy>(__first, __comp_ref, __n, __first + __start); + } + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + std::__make_heap<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) { + std::make_heap(std::move(__first), std::move(__last), + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_MAKE_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/make_projected.h b/app/src/main/cpp/libcxx/include/__algorithm/make_projected.h new file mode 100644 index 0000000..87d4d59 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/make_projected.h @@ -0,0 +1,126 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MAKE_PROJECTED_H +#define _LIBCPP___ALGORITHM_MAKE_PROJECTED_H + +#include <__concepts/same_as.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__type_traits/decay.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/integral_constant.h> +#include <__type_traits/is_member_pointer.h> +#include <__type_traits/is_same.h> +#include <__utility/declval.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct _ProjectedPred { + _Pred& __pred; // Can be a unary or a binary predicate. + _Proj& __proj; + + _LIBCPP_CONSTEXPR _ProjectedPred(_Pred& __pred_arg, _Proj& __proj_arg) : __pred(__pred_arg), __proj(__proj_arg) {} + + template + typename __invoke_of<_Pred&, + decltype(std::__invoke(std::declval<_Proj&>(), std::declval<_Tp>())) + >::type + _LIBCPP_CONSTEXPR operator()(_Tp&& __v) const { + return std::__invoke(__pred, std::__invoke(__proj, std::forward<_Tp>(__v))); + } + + template + typename __invoke_of<_Pred&, + decltype(std::__invoke(std::declval<_Proj&>(), std::declval<_T1>())), + decltype(std::__invoke(std::declval<_Proj&>(), std::declval<_T2>())) + >::type + _LIBCPP_CONSTEXPR operator()(_T1&& __lhs, _T2&& __rhs) const { + return std::__invoke(__pred, + std::__invoke(__proj, std::forward<_T1>(__lhs)), + std::__invoke(__proj, std::forward<_T2>(__rhs))); + } + +}; + +template +struct __can_use_pristine_comp : false_type {}; + +template +struct __can_use_pristine_comp<_Pred, _Proj, __enable_if_t< + !is_member_pointer::type>::value && ( +#if _LIBCPP_STD_VER > 17 + is_same::type, identity>::value || +#endif + is_same::type, __identity>::value + ) +> > : true_type {}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static +__enable_if_t< + !__can_use_pristine_comp<_Pred, _Proj>::value, + _ProjectedPred<_Pred, _Proj> +> +__make_projected(_Pred& __pred, _Proj& __proj) { + return _ProjectedPred<_Pred, _Proj>(__pred, __proj); +} + +// Avoid creating the functor and just use the pristine comparator -- for certain algorithms, this would enable +// optimizations that rely on the type of the comparator. Additionally, this results in less layers of indirection in +// the call stack when the comparator is invoked, even in an unoptimized build. +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static +__enable_if_t< + __can_use_pristine_comp<_Pred, _Proj>::value, + _Pred& +> +__make_projected(_Pred& __pred, _Proj&) { + return __pred; +} + +_LIBCPP_END_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +_LIBCPP_HIDE_FROM_ABI constexpr static +decltype(auto) __make_projected_comp(_Comp& __comp, _Proj1& __proj1, _Proj2& __proj2) { + if constexpr (same_as, identity> && same_as, identity> && + !is_member_pointer_v>) { + // Avoid creating the lambda and just use the pristine comparator -- for certain algorithms, this would enable + // optimizations that rely on the type of the comparator. + return __comp; + + } else { + return [&](auto&& __lhs, auto&& __rhs) { + return std::invoke(__comp, + std::invoke(__proj1, std::forward(__lhs)), + std::invoke(__proj2, std::forward(__rhs))); + }; + } +} + +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_MAKE_PROJECTED_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/max.h b/app/src/main/cpp/libcxx/include/__algorithm/max.h new file mode 100644 index 0000000..a08a3fc --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/max.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MAX_H +#define _LIBCPP___ALGORITHM_MAX_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/max_element.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const _Tp& +max(const _Tp& __a, const _Tp& __b, _Compare __comp) +{ + return __comp(__a, __b) ? __b : __a; +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const _Tp& +max(const _Tp& __a, const _Tp& __b) +{ + return _VSTD::max(__a, __b, __less<_Tp>()); +} + +#ifndef _LIBCPP_CXX03_LANG + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp +max(initializer_list<_Tp> __t, _Compare __comp) +{ + return *_VSTD::__max_element<__comp_ref_type<_Compare> >(__t.begin(), __t.end(), __comp); +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp +max(initializer_list<_Tp> __t) +{ + return *_VSTD::max_element(__t.begin(), __t.end(), __less<_Tp>()); +} + +#endif // _LIBCPP_CXX03_LANG + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_MAX_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/max_element.h b/app/src/main/cpp/libcxx/include/__algorithm/max_element.h new file mode 100644 index 0000000..6ac3106 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/max_element.h @@ -0,0 +1,57 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MAX_ELEMENT_H +#define _LIBCPP___ALGORITHM_MAX_ELEMENT_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator +__max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + static_assert(__is_cpp17_forward_iterator<_ForwardIterator>::value, + "std::max_element requires a ForwardIterator"); + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + if (__comp(*__first, *__i)) + __first = __i; + } + return __first; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator +max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + return _VSTD::__max_element<__comp_ref_type<_Compare> >(__first, __last, __comp); +} + + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator +max_element(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::max_element(__first, __last, + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_MAX_ELEMENT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/merge.h b/app/src/main/cpp/libcxx/include/__algorithm/merge.h new file mode 100644 index 0000000..e54e430 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/merge.h @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MERGE_H +#define _LIBCPP___ALGORITHM_MERGE_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/copy.h> +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +__merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ + for (; __first1 != __last1; ++__result) + { + if (__first2 == __last2) + return _VSTD::copy(__first1, __last1, __result); + if (__comp(*__first2, *__first1)) + { + *__result = *__first2; + ++__first2; + } + else + { + *__result = *__first1; + ++__first1; + } + } + return _VSTD::copy(__first2, __last2, __result); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) +{ + return _VSTD::__merge<__comp_ref_type<_Compare> >(__first1, __last1, __first2, __last2, __result, __comp); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +merge(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) +{ + typedef typename iterator_traits<_InputIterator1>::value_type __v1; + typedef typename iterator_traits<_InputIterator2>::value_type __v2; + return _VSTD::merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_MERGE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/min.h b/app/src/main/cpp/libcxx/include/__algorithm/min.h new file mode 100644 index 0000000..2882485 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/min.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MIN_H +#define _LIBCPP___ALGORITHM_MIN_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/min_element.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const _Tp& +min(const _Tp& __a, const _Tp& __b, _Compare __comp) +{ + return __comp(__b, __a) ? __b : __a; +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const _Tp& +min(const _Tp& __a, const _Tp& __b) +{ + return _VSTD::min(__a, __b, __less<_Tp>()); +} + +#ifndef _LIBCPP_CXX03_LANG + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp +min(initializer_list<_Tp> __t, _Compare __comp) +{ + return *_VSTD::__min_element<__comp_ref_type<_Compare> >(__t.begin(), __t.end(), __comp); +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp +min(initializer_list<_Tp> __t) +{ + return *_VSTD::min_element(__t.begin(), __t.end(), __less<_Tp>()); +} + +#endif // _LIBCPP_CXX03_LANG + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_MIN_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/min_element.h b/app/src/main/cpp/libcxx/include/__algorithm/min_element.h new file mode 100644 index 0000000..c0706fe --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/min_element.h @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MIN_ELEMENT_H +#define _LIBCPP___ALGORITHM_MIN_ELEMENT_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/is_callable.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Iter __min_element(_Iter __first, _Sent __last, _Comp __comp, _Proj& __proj) { + if (__first == __last) + return __first; + + _Iter __i = __first; + while (++__i != __last) + if (std::__invoke(__comp, std::__invoke(__proj, *__i), std::__invoke(__proj, *__first))) + __first = __i; + + return __first; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Iter __min_element(_Iter __first, _Sent __last, _Comp __comp) { + auto __proj = __identity(); + return std::__min_element<_Comp>(std::move(__first), std::move(__last), __comp, __proj); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator +min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) +{ + static_assert(__is_cpp17_forward_iterator<_ForwardIterator>::value, + "std::min_element requires a ForwardIterator"); + static_assert(__is_callable<_Compare, decltype(*__first), decltype(*__first)>::value, + "The comparator has to be callable"); + + return std::__min_element<__comp_ref_type<_Compare> >(std::move(__first), std::move(__last), __comp); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator +min_element(_ForwardIterator __first, _ForwardIterator __last) +{ + return _VSTD::min_element(__first, __last, + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_MIN_ELEMENT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/min_max_result.h b/app/src/main/cpp/libcxx/include/__algorithm/min_max_result.h new file mode 100644 index 0000000..4be3999 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/min_max_result.h @@ -0,0 +1,56 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MIN_MAX_RESULT_H +#define _LIBCPP___ALGORITHM_MIN_MAX_RESULT_H + +#include <__concepts/convertible_to.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { + +template +struct min_max_result { + _LIBCPP_NO_UNIQUE_ADDRESS _T1 min; + _LIBCPP_NO_UNIQUE_ADDRESS _T1 max; + + template + requires convertible_to + _LIBCPP_HIDE_FROM_ABI constexpr operator min_max_result<_T2>() const & { + return {min, max}; + } + + template + requires convertible_to<_T1, _T2> + _LIBCPP_HIDE_FROM_ABI constexpr operator min_max_result<_T2>() && { + return {std::move(min), std::move(max)}; + } +}; + +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_MIN_MAX_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/minmax.h b/app/src/main/cpp/libcxx/include/__algorithm/minmax.h new file mode 100644 index 0000000..6ef0a77 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/minmax.h @@ -0,0 +1,69 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MINMAX_H +#define _LIBCPP___ALGORITHM_MINMAX_H + +#include <__algorithm/comp.h> +#include <__algorithm/minmax_element.h> +#include <__config> +#include <__functional/identity.h> +#include <__type_traits/is_callable.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair +minmax(const _Tp& __a, const _Tp& __b, _Compare __comp) +{ + return __comp(__b, __a) ? pair(__b, __a) : + pair(__a, __b); +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair +minmax(const _Tp& __a, const _Tp& __b) +{ + return std::minmax(__a, __b, __less<_Tp>()); +} + +#ifndef _LIBCPP_CXX03_LANG + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Tp, _Tp> minmax(initializer_list<_Tp> __t, _Compare __comp) { + static_assert(__is_callable<_Compare, _Tp, _Tp>::value, "The comparator has to be callable"); + __identity __proj; + auto __ret = std::__minmax_element_impl(__t.begin(), __t.end(), __comp, __proj); + return pair<_Tp, _Tp>(*__ret.first, *__ret.second); +} + +template +_LIBCPP_NODISCARD_EXT inline +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Tp, _Tp> +minmax(initializer_list<_Tp> __t) +{ + return std::minmax(__t, __less<_Tp>()); +} + +#endif // _LIBCPP_CXX03_LANG + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_MINMAX_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/minmax_element.h b/app/src/main/cpp/libcxx/include/__algorithm/minmax_element.h new file mode 100644 index 0000000..caa963e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/minmax_element.h @@ -0,0 +1,101 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MINMAX_ELEMENT_H +#define _LIBCPP___ALGORITHM_MINMAX_ELEMENT_H + +#include <__algorithm/comp.h> +#include <__config> +#include <__functional/identity.h> +#include <__iterator/iterator_traits.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class _MinmaxElementLessFunc { + _Comp& __comp_; + _Proj& __proj_; + +public: + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR + _MinmaxElementLessFunc(_Comp& __comp, _Proj& __proj) : __comp_(__comp), __proj_(__proj) {} + + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 + bool operator()(_Iter& __it1, _Iter& __it2) { + return std::__invoke(__comp_, std::__invoke(__proj_, *__it1), std::__invoke(__proj_, *__it2)); + } +}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iter, _Iter> __minmax_element_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __less = _MinmaxElementLessFunc<_Comp, _Proj>(__comp, __proj); + + pair<_Iter, _Iter> __result(__first, __first); + if (__first == __last || ++__first == __last) + return __result; + + if (__less(__first, __result.first)) + __result.first = __first; + else + __result.second = __first; + + while (++__first != __last) { + _Iter __i = __first; + if (++__first == __last) { + if (__less(__i, __result.first)) + __result.first = __i; + else if (!__less(__i, __result.second)) + __result.second = __i; + return __result; + } + + if (__less(__first, __i)) { + if (__less(__first, __result.first)) + __result.first = __first; + if (!__less(__i, __result.second)) + __result.second = __i; + } else { + if (__less(__i, __result.first)) + __result.first = __i; + if (!__less(__first, __result.second)) + __result.second = __first; + } + } + + return __result; +} + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_ForwardIterator, _ForwardIterator> +minmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) { + static_assert(__is_cpp17_forward_iterator<_ForwardIterator>::value, + "std::minmax_element requires a ForwardIterator"); + static_assert(__is_callable<_Compare, decltype(*__first), decltype(*__first)>::value, + "The comparator has to be callable"); + auto __proj = __identity(); + return std::__minmax_element_impl(__first, __last, __comp, __proj); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_ForwardIterator, _ForwardIterator> minmax_element(_ForwardIterator __first, _ForwardIterator __last) { + return std::minmax_element(__first, __last, __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_MINMAX_ELEMENT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/mismatch.h b/app/src/main/cpp/libcxx/include/__algorithm/mismatch.h new file mode 100644 index 0000000..600e2cd --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/mismatch.h @@ -0,0 +1,63 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MISMATCH_H +#define _LIBCPP___ALGORITHM_MISMATCH_H + +#include <__algorithm/comp.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY + _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InputIterator1, _InputIterator2> + mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred) { + for (; __first1 != __last1; ++__first1, (void)++__first2) + if (!__pred(*__first1, *__first2)) + break; + return pair<_InputIterator1, _InputIterator2>(__first1, __first2); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY + _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InputIterator1, _InputIterator2> + mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2) { + return std::mismatch(__first1, __last1, __first2, __equal_to()); +} + +#if _LIBCPP_STD_VER > 11 +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY + _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InputIterator1, _InputIterator2> + mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, + _BinaryPredicate __pred) { + for (; __first1 != __last1 && __first2 != __last2; ++__first1, (void)++__first2) + if (!__pred(*__first1, *__first2)) + break; + return pair<_InputIterator1, _InputIterator2>(__first1, __first2); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY + _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InputIterator1, _InputIterator2> + mismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2) { + return std::mismatch(__first1, __last1, __first2, __last2, __equal_to()); +} +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_MISMATCH_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/move.h b/app/src/main/cpp/libcxx/include/__algorithm/move.h new file mode 100644 index 0000000..ac95bda --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/move.h @@ -0,0 +1,130 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MOVE_H +#define _LIBCPP___ALGORITHM_MOVE_H + +#include <__algorithm/copy_move_common.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/min.h> +#include <__config> +#include <__iterator/segmented_iterator.h> +#include <__type_traits/common_type.h> +#include <__type_traits/is_copy_constructible.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> +__move(_InIter __first, _Sent __last, _OutIter __result); + +template +struct __move_loop { + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _Sent __last, _OutIter __result) const { + while (__first != __last) { + *__result = _IterOps<_AlgPolicy>::__iter_move(__first); + ++__first; + ++__result; + } + return std::make_pair(std::move(__first), std::move(__result)); + } + + template ::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _InIter __last, _OutIter __result) const { + using _Traits = __segmented_iterator_traits<_InIter>; + auto __sfirst = _Traits::__segment(__first); + auto __slast = _Traits::__segment(__last); + if (__sfirst == __slast) { + auto __iters = std::__move<_AlgPolicy>(_Traits::__local(__first), _Traits::__local(__last), std::move(__result)); + return std::make_pair(__last, std::move(__iters.second)); + } + + __result = std::__move<_AlgPolicy>(_Traits::__local(__first), _Traits::__end(__sfirst), std::move(__result)).second; + ++__sfirst; + while (__sfirst != __slast) { + __result = + std::__move<_AlgPolicy>(_Traits::__begin(__sfirst), _Traits::__end(__sfirst), std::move(__result)).second; + ++__sfirst; + } + __result = + std::__move<_AlgPolicy>(_Traits::__begin(__sfirst), _Traits::__local(__last), std::move(__result)).second; + return std::make_pair(__last, std::move(__result)); + } + + template ::value && + !__is_segmented_iterator<_InIter>::value && __is_segmented_iterator<_OutIter>::value, + int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _InIter __last, _OutIter __result) { + using _Traits = __segmented_iterator_traits<_OutIter>; + using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type; + + if (__first == __last) + return std::make_pair(std::move(__first), std::move(__result)); + + auto __local_first = _Traits::__local(__result); + auto __segment_iterator = _Traits::__segment(__result); + while (true) { + auto __local_last = _Traits::__end(__segment_iterator); + auto __size = std::min<_DiffT>(__local_last - __local_first, __last - __first); + auto __iters = std::__move<_AlgPolicy>(__first, __first + __size, __local_first); + __first = std::move(__iters.first); + + if (__first == __last) + return std::make_pair(std::move(__first), _Traits::__compose(__segment_iterator, std::move(__iters.second))); + + __local_first = _Traits::__begin(++__segment_iterator); + } + } +}; + +struct __move_trivial { + // At this point, the iterators have been unwrapped so any `contiguous_iterator` has been unwrapped to a pointer. + template ::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*> + operator()(_In* __first, _In* __last, _Out* __result) const { + return std::__copy_trivial_impl(__first, __last, __result); + } +}; + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> +__move(_InIter __first, _Sent __last, _OutIter __result) { + return std::__dispatch_copy_or_move<_AlgPolicy, __move_loop<_AlgPolicy>, __move_trivial>( + std::move(__first), std::move(__last), std::move(__result)); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator +move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { + static_assert(is_copy_constructible<_InputIterator>::value, "Iterators has to be copy constructible."); + static_assert(is_copy_constructible<_OutputIterator>::value, "The output iterator has to be copy constructible."); + + return std::__move<_ClassicAlgPolicy>(std::move(__first), std::move(__last), std::move(__result)).second; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_MOVE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/move_backward.h b/app/src/main/cpp/libcxx/include/__algorithm/move_backward.h new file mode 100644 index 0000000..d4f013b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/move_backward.h @@ -0,0 +1,139 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_MOVE_BACKWARD_H +#define _LIBCPP___ALGORITHM_MOVE_BACKWARD_H + +#include <__algorithm/copy_move_common.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/min.h> +#include <__config> +#include <__iterator/segmented_iterator.h> +#include <__type_traits/common_type.h> +#include <__type_traits/is_copy_constructible.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_BidirectionalIterator1, _BidirectionalIterator2> +__move_backward(_BidirectionalIterator1 __first, _Sentinel __last, _BidirectionalIterator2 __result); + +template +struct __move_backward_loop { + template + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _Sent __last, _OutIter __result) const { + auto __last_iter = _IterOps<_AlgPolicy>::next(__first, __last); + auto __original_last_iter = __last_iter; + + while (__first != __last_iter) { + *--__result = _IterOps<_AlgPolicy>::__iter_move(--__last_iter); + } + + return std::make_pair(std::move(__original_last_iter), std::move(__result)); + } + + template ::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _InIter __last, _OutIter __result) const { + using _Traits = __segmented_iterator_traits<_InIter>; + auto __sfirst = _Traits::__segment(__first); + auto __slast = _Traits::__segment(__last); + if (__sfirst == __slast) { + auto __iters = + std::__move_backward<_AlgPolicy>(_Traits::__local(__first), _Traits::__local(__last), std::move(__result)); + return std::make_pair(__last, __iters.second); + } + + __result = + std::__move_backward<_AlgPolicy>(_Traits::__begin(__slast), _Traits::__local(__last), std::move(__result)) + .second; + --__slast; + while (__sfirst != __slast) { + __result = + std::__move_backward<_AlgPolicy>(_Traits::__begin(__slast), _Traits::__end(__slast), std::move(__result)) + .second; + --__slast; + } + __result = std::__move_backward<_AlgPolicy>(_Traits::__local(__first), _Traits::__end(__slast), std::move(__result)) + .second; + return std::make_pair(__last, std::move(__result)); + } + + template ::value && + !__is_segmented_iterator<_InIter>::value && __is_segmented_iterator<_OutIter>::value, + int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> + operator()(_InIter __first, _InIter __last, _OutIter __result) { + using _Traits = __segmented_iterator_traits<_OutIter>; + using _DiffT = typename common_type<__iter_diff_t<_InIter>, __iter_diff_t<_OutIter> >::type; + + // When the range contains no elements, __result might not be a valid iterator + if (__first == __last) + return std::make_pair(__first, __result); + + auto __orig_last = __last; + + auto __local_last = _Traits::__local(__result); + auto __segment_iterator = _Traits::__segment(__result); + while (true) { + auto __local_first = _Traits::__begin(__segment_iterator); + auto __size = std::min<_DiffT>(__local_last - __local_first, __last - __first); + auto __iter = std::__move_backward<_AlgPolicy>(__last - __size, __last, __local_last).second; + __last -= __size; + + if (__first == __last) + return std::make_pair(std::move(__orig_last), _Traits::__compose(__segment_iterator, std::move(__iter))); + + __local_last = _Traits::__end(--__segment_iterator); + } + } +}; + +struct __move_backward_trivial { + // At this point, the iterators have been unwrapped so any `contiguous_iterator` has been unwrapped to a pointer. + template ::value, int> = 0> + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_In*, _Out*> + operator()(_In* __first, _In* __last, _Out* __result) const { + return std::__copy_backward_trivial_impl(__first, __last, __result); + } +}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_BidirectionalIterator1, _BidirectionalIterator2> +__move_backward(_BidirectionalIterator1 __first, _Sentinel __last, _BidirectionalIterator2 __result) { + static_assert(std::is_copy_constructible<_BidirectionalIterator1>::value && + std::is_copy_constructible<_BidirectionalIterator1>::value, "Iterators must be copy constructible."); + + return std::__dispatch_copy_or_move<_AlgPolicy, __move_backward_loop<_AlgPolicy>, __move_backward_trivial>( + std::move(__first), std::move(__last), std::move(__result)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _BidirectionalIterator2 +move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, _BidirectionalIterator2 __result) { + return std::__move_backward<_ClassicAlgPolicy>(std::move(__first), std::move(__last), std::move(__result)).second; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_MOVE_BACKWARD_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/next_permutation.h b/app/src/main/cpp/libcxx/include/__algorithm/next_permutation.h new file mode 100644 index 0000000..73e8b99 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/next_permutation.h @@ -0,0 +1,78 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_NEXT_PERMUTATION_H +#define _LIBCPP___ALGORITHM_NEXT_PERMUTATION_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/reverse.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_BidirectionalIterator, bool> +__next_permutation(_BidirectionalIterator __first, _Sentinel __last, _Compare&& __comp) +{ + using _Result = pair<_BidirectionalIterator, bool>; + + _BidirectionalIterator __last_iter = _IterOps<_AlgPolicy>::next(__first, __last); + _BidirectionalIterator __i = __last_iter; + if (__first == __last || __first == --__i) + return _Result(std::move(__last_iter), false); + + while (true) + { + _BidirectionalIterator __ip1 = __i; + if (__comp(*--__i, *__ip1)) + { + _BidirectionalIterator __j = __last_iter; + while (!__comp(*__i, *--__j)) + ; + _IterOps<_AlgPolicy>::iter_swap(__i, __j); + std::__reverse<_AlgPolicy>(__ip1, __last_iter); + return _Result(std::move(__last_iter), true); + } + if (__i == __first) + { + std::__reverse<_AlgPolicy>(__first, __last_iter); + return _Result(std::move(__last_iter), false); + } + } +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) +{ + return std::__next_permutation<_ClassicAlgPolicy>( + std::move(__first), std::move(__last), static_cast<__comp_ref_type<_Compare> >(__comp)).second; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) +{ + return _VSTD::next_permutation(__first, __last, + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_NEXT_PERMUTATION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/none_of.h b/app/src/main/cpp/libcxx/include/__algorithm/none_of.h new file mode 100644 index 0000000..19357eb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/none_of.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_NONE_OF_H +#define _LIBCPP___ALGORITHM_NONE_OF_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool +none_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) { + for (; __first != __last; ++__first) + if (__pred(*__first)) + return false; + return true; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_NONE_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/nth_element.h b/app/src/main/cpp/libcxx/include/__algorithm/nth_element.h new file mode 100644 index 0000000..9fdfb2c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/nth_element.h @@ -0,0 +1,258 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_NTH_ELEMENT_H +#define _LIBCPP___ALGORITHM_NTH_ELEMENT_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/sort.h> +#include <__config> +#include <__debug> +#include <__debug_utils/randomize_range.h> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool +__nth_element_find_guard(_RandomAccessIterator& __i, _RandomAccessIterator& __j, + _RandomAccessIterator __m, _Compare __comp) +{ + // manually guard downward moving __j against __i + while (true) { + if (__i == --__j) { + return false; + } + if (__comp(*__j, *__m)) { + return true; // found guard for downward moving __j, now use unguarded partition + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void +__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp) +{ + using _Ops = _IterOps<_AlgPolicy>; + + // _Compare is known to be a reference type + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + const difference_type __limit = 7; + while (true) + { + if (__nth == __last) + return; + difference_type __len = __last - __first; + switch (__len) + { + case 0: + case 1: + return; + case 2: + if (__comp(*--__last, *__first)) + _Ops::iter_swap(__first, __last); + return; + case 3: + { + _RandomAccessIterator __m = __first; + std::__sort3<_AlgPolicy, _Compare>(__first, ++__m, --__last, __comp); + return; + } + } + if (__len <= __limit) + { + std::__selection_sort<_AlgPolicy, _Compare>(__first, __last, __comp); + return; + } + // __len > __limit >= 3 + _RandomAccessIterator __m = __first + __len/2; + _RandomAccessIterator __lm1 = __last; + unsigned __n_swaps = std::__sort3<_AlgPolicy, _Compare>(__first, __m, --__lm1, __comp); + // *__m is median + // partition [__first, __m) < *__m and *__m <= [__m, __last) + // (this inhibits tossing elements equivalent to __m around unnecessarily) + _RandomAccessIterator __i = __first; + _RandomAccessIterator __j = __lm1; + // j points beyond range to be tested, *__lm1 is known to be <= *__m + // The search going up is known to be guarded but the search coming down isn't. + // Prime the downward search with a guard. + if (!__comp(*__i, *__m)) // if *__first == *__m + { + // *__first == *__m, *__first doesn't go in first part + if (_VSTD::__nth_element_find_guard<_Compare>(__i, __j, __m, __comp)) { + _Ops::iter_swap(__i, __j); + ++__n_swaps; + } else { + // *__first == *__m, *__m <= all other elements + // Partition instead into [__first, __i) == *__first and *__first < [__i, __last) + ++__i; // __first + 1 + __j = __last; + if (!__comp(*__first, *--__j)) { // we need a guard if *__first == *(__last-1) + while (true) { + if (__i == __j) { + return; // [__first, __last) all equivalent elements + } else if (__comp(*__first, *__i)) { + _Ops::iter_swap(__i, __j); + ++__n_swaps; + ++__i; + break; + } + ++__i; + } + } + // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1 + if (__i == __j) { + return; + } + while (true) { + while (!__comp(*__first, *__i)) + ++__i; + while (__comp(*__first, *--__j)) + ; + if (__i >= __j) + break; + _Ops::iter_swap(__i, __j); + ++__n_swaps; + ++__i; + } + // [__first, __i) == *__first and *__first < [__i, __last) + // The first part is sorted, + if (__nth < __i) { + return; + } + // __nth_element the second part + // _VSTD::__nth_element<_Compare>(__i, __nth, __last, __comp); + __first = __i; + continue; + } + } + ++__i; + // j points beyond range to be tested, *__lm1 is known to be <= *__m + // if not yet partitioned... + if (__i < __j) + { + // known that *(__i - 1) < *__m + while (true) + { + // __m still guards upward moving __i + while (__comp(*__i, *__m)) + ++__i; + // It is now known that a guard exists for downward moving __j + while (!__comp(*--__j, *__m)) + ; + if (__i >= __j) + break; + _Ops::iter_swap(__i, __j); + ++__n_swaps; + // It is known that __m != __j + // If __m just moved, follow it + if (__m == __i) + __m = __j; + ++__i; + } + } + // [__first, __i) < *__m and *__m <= [__i, __last) + if (__i != __m && __comp(*__m, *__i)) + { + _Ops::iter_swap(__i, __m); + ++__n_swaps; + } + // [__first, __i) < *__i and *__i <= [__i+1, __last) + if (__nth == __i) + return; + if (__n_swaps == 0) + { + // We were given a perfectly partitioned sequence. Coincidence? + if (__nth < __i) + { + // Check for [__first, __i) already sorted + __j = __m = __first; + while (true) { + if (++__j == __i) { + // [__first, __i) sorted + return; + } + if (__comp(*__j, *__m)) { + // not yet sorted, so sort + break; + } + __m = __j; + } + } + else + { + // Check for [__i, __last) already sorted + __j = __m = __i; + while (true) { + if (++__j == __last) { + // [__i, __last) sorted + return; + } + if (__comp(*__j, *__m)) { + // not yet sorted, so sort + break; + } + __m = __j; + } + } + } + // __nth_element on range containing __nth + if (__nth < __i) + { + // _VSTD::__nth_element<_Compare>(__first, __nth, __i, __comp); + __last = __i; + } + else + { + // _VSTD::__nth_element<_Compare>(__i+1, __nth, __last, __comp); + __first = ++__i; + } + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void __nth_element_impl(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, + _Compare& __comp) { + if (__nth == __last) + return; + + std::__debug_randomize_range<_AlgPolicy>(__first, __last); + + std::__nth_element<_AlgPolicy, __comp_ref_type<_Compare> >(__first, __nth, __last, __comp); + + std::__debug_randomize_range<_AlgPolicy>(__first, __nth); + if (__nth != __last) { + std::__debug_randomize_range<_AlgPolicy>(++__nth, __last); + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, + _Compare __comp) { + std::__nth_element_impl<_ClassicAlgPolicy>(std::move(__first), std::move(__nth), std::move(__last), __comp); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last) { + std::nth_element(std::move(__first), std::move(__nth), std::move(__last), __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_NTH_ELEMENT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/partial_sort.h b/app/src/main/cpp/libcxx/include/__algorithm/partial_sort.h new file mode 100644 index 0000000..e0812af --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/partial_sort.h @@ -0,0 +1,96 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_PARTIAL_SORT_H +#define _LIBCPP___ALGORITHM_PARTIAL_SORT_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_heap.h> +#include <__algorithm/sift_down.h> +#include <__algorithm/sort_heap.h> +#include <__config> +#include <__debug> +#include <__debug_utils/randomize_range.h> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_RandomAccessIterator __partial_sort_impl( + _RandomAccessIterator __first, _RandomAccessIterator __middle, _Sentinel __last, _Compare&& __comp) { + if (__first == __middle) { + return _IterOps<_AlgPolicy>::next(__middle, __last); + } + + std::__make_heap<_AlgPolicy>(__first, __middle, __comp); + + typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first; + _RandomAccessIterator __i = __middle; + for (; __i != __last; ++__i) + { + if (__comp(*__i, *__first)) + { + _IterOps<_AlgPolicy>::iter_swap(__i, __first); + std::__sift_down<_AlgPolicy>(__first, __comp, __len, __first); + } + } + std::__sort_heap<_AlgPolicy>(std::move(__first), std::move(__middle), __comp); + + return __i; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_RandomAccessIterator __partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _Sentinel __last, + _Compare& __comp) { + if (__first == __middle) + return _IterOps<_AlgPolicy>::next(__middle, __last); + + std::__debug_randomize_range<_AlgPolicy>(__first, __last); + + auto __last_iter = + std::__partial_sort_impl<_AlgPolicy>(__first, __middle, __last, static_cast<__comp_ref_type<_Compare> >(__comp)); + + std::__debug_randomize_range<_AlgPolicy>(__middle, __last); + + return __last_iter; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, + _Compare __comp) +{ + static_assert(std::is_copy_constructible<_RandomAccessIterator>::value, "Iterators must be copy constructible."); + static_assert(std::is_copy_assignable<_RandomAccessIterator>::value, "Iterators must be copy assignable."); + + (void)std::__partial_sort<_ClassicAlgPolicy>(std::move(__first), std::move(__middle), std::move(__last), __comp); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last) +{ + _VSTD::partial_sort(__first, __middle, __last, + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_PARTIAL_SORT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/partial_sort_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/partial_sort_copy.h new file mode 100644 index 0000000..1aba071 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/partial_sort_copy.h @@ -0,0 +1,88 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_PARTIAL_SORT_COPY_H +#define _LIBCPP___ALGORITHM_PARTIAL_SORT_COPY_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_heap.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/sift_down.h> +#include <__algorithm/sort_heap.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/is_callable.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_InputIterator, _RandomAccessIterator> +__partial_sort_copy(_InputIterator __first, _Sentinel1 __last, + _RandomAccessIterator __result_first, _Sentinel2 __result_last, + _Compare&& __comp, _Proj1&& __proj1, _Proj2&& __proj2) +{ + _RandomAccessIterator __r = __result_first; + auto&& __projected_comp = std::__make_projected(__comp, __proj2); + + if (__r != __result_last) + { + for (; __first != __last && __r != __result_last; ++__first, (void) ++__r) + *__r = *__first; + std::__make_heap<_AlgPolicy>(__result_first, __r, __projected_comp); + typename iterator_traits<_RandomAccessIterator>::difference_type __len = __r - __result_first; + for (; __first != __last; ++__first) + if (std::__invoke(__comp, std::__invoke(__proj1, *__first), std::__invoke(__proj2, *__result_first))) { + *__result_first = *__first; + std::__sift_down<_AlgPolicy>(__result_first, __projected_comp, __len, __result_first); + } + std::__sort_heap<_AlgPolicy>(__result_first, __r, __projected_comp); + } + + return pair<_InputIterator, _RandomAccessIterator>( + _IterOps<_AlgPolicy>::next(std::move(__first), std::move(__last)), std::move(__r)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_RandomAccessIterator +partial_sort_copy(_InputIterator __first, _InputIterator __last, + _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp) +{ + static_assert(__is_callable<_Compare, decltype(*__first), decltype(*__result_first)>::value, + "Comparator has to be callable"); + + auto __result = std::__partial_sort_copy<_ClassicAlgPolicy>(__first, __last, __result_first, __result_last, + static_cast<__comp_ref_type<_Compare> >(__comp), __identity(), __identity()); + return __result.second; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_RandomAccessIterator +partial_sort_copy(_InputIterator __first, _InputIterator __last, + _RandomAccessIterator __result_first, _RandomAccessIterator __result_last) +{ + return _VSTD::partial_sort_copy(__first, __last, __result_first, __result_last, + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_PARTIAL_SORT_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/partition.h b/app/src/main/cpp/libcxx/include/__algorithm/partition.h new file mode 100644 index 0000000..0e094bf --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/partition.h @@ -0,0 +1,98 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_PARTITION_H +#define _LIBCPP___ALGORITHM_PARTITION_H + +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_ForwardIterator, _ForwardIterator> +__partition_impl(_ForwardIterator __first, _Sentinel __last, _Predicate __pred, forward_iterator_tag) +{ + while (true) + { + if (__first == __last) + return std::make_pair(std::move(__first), std::move(__first)); + if (!__pred(*__first)) + break; + ++__first; + } + + _ForwardIterator __p = __first; + while (++__p != __last) + { + if (__pred(*__p)) + { + _IterOps<_AlgPolicy>::iter_swap(__first, __p); + ++__first; + } + } + return std::make_pair(std::move(__first), std::move(__p)); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_BidirectionalIterator, _BidirectionalIterator> +__partition_impl(_BidirectionalIterator __first, _Sentinel __sentinel, _Predicate __pred, + bidirectional_iterator_tag) +{ + _BidirectionalIterator __original_last = _IterOps<_AlgPolicy>::next(__first, __sentinel); + _BidirectionalIterator __last = __original_last; + + while (true) + { + while (true) + { + if (__first == __last) + return std::make_pair(std::move(__first), std::move(__original_last)); + if (!__pred(*__first)) + break; + ++__first; + } + do + { + if (__first == --__last) + return std::make_pair(std::move(__first), std::move(__original_last)); + } while (!__pred(*__last)); + _IterOps<_AlgPolicy>::iter_swap(__first, __last); + ++__first; + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +pair<_ForwardIterator, _ForwardIterator> __partition( + _ForwardIterator __first, _Sentinel __last, _Predicate&& __pred, _IterCategory __iter_category) { + return std::__partition_impl<__remove_cvref_t<_Predicate>&, _AlgPolicy>( + std::move(__first), std::move(__last), __pred, __iter_category); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator +partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) +{ + using _IterCategory = typename iterator_traits<_ForwardIterator>::iterator_category; + auto __result = std::__partition<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __pred, _IterCategory()); + return __result.first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_PARTITION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/partition_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/partition_copy.h new file mode 100644 index 0000000..ff8826a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/partition_copy.h @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_PARTITION_COPY_H +#define _LIBCPP___ALGORITHM_PARTITION_COPY_H + +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_OutputIterator1, _OutputIterator2> +partition_copy(_InputIterator __first, _InputIterator __last, + _OutputIterator1 __out_true, _OutputIterator2 __out_false, + _Predicate __pred) +{ + for (; __first != __last; ++__first) + { + if (__pred(*__first)) + { + *__out_true = *__first; + ++__out_true; + } + else + { + *__out_false = *__first; + ++__out_false; + } + } + return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_PARTITION_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/partition_point.h b/app/src/main/cpp/libcxx/include/__algorithm/partition_point.h new file mode 100644 index 0000000..6ede71a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/partition_point.h @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_PARTITION_POINT_H +#define _LIBCPP___ALGORITHM_PARTITION_POINT_H + +#include <__algorithm/half_positive.h> +#include <__config> +#include <__iterator/advance.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +partition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) +{ + typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; + difference_type __len = _VSTD::distance(__first, __last); + while (__len != 0) + { + difference_type __l2 = _VSTD::__half_positive(__len); + _ForwardIterator __m = __first; + _VSTD::advance(__m, __l2); + if (__pred(*__m)) + { + __first = ++__m; + __len -= __l2 + 1; + } + else + __len = __l2; + } + return __first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_PARTITION_POINT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/pop_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/pop_heap.h new file mode 100644 index 0000000..94d32a4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/pop_heap.h @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_POP_HEAP_H +#define _LIBCPP___ALGORITHM_POP_HEAP_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/push_heap.h> +#include <__algorithm/sift_down.h> +#include <__assert> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +void __pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len) { + _LIBCPP_ASSERT(__len > 0, "The heap given to pop_heap must be non-empty"); + + __comp_ref_type<_Compare> __comp_ref = __comp; + + using value_type = typename iterator_traits<_RandomAccessIterator>::value_type; + if (__len > 1) { + value_type __top = _IterOps<_AlgPolicy>::__iter_move(__first); // create a hole at __first + _RandomAccessIterator __hole = std::__floyd_sift_down<_AlgPolicy>(__first, __comp_ref, __len); + --__last; + + if (__hole == __last) { + *__hole = std::move(__top); + } else { + *__hole = _IterOps<_AlgPolicy>::__iter_move(__last); + ++__hole; + *__last = std::move(__top); + std::__sift_up<_AlgPolicy>(__first, __hole, __comp_ref, __hole - __first); + } + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + static_assert(std::is_copy_constructible<_RandomAccessIterator>::value, "Iterators must be copy constructible."); + static_assert(std::is_copy_assignable<_RandomAccessIterator>::value, "Iterators must be copy assignable."); + + typename iterator_traits<_RandomAccessIterator>::difference_type __len = __last - __first; + std::__pop_heap<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp, __len); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) { + std::pop_heap(std::move(__first), std::move(__last), + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_POP_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/prev_permutation.h b/app/src/main/cpp/libcxx/include/__algorithm/prev_permutation.h new file mode 100644 index 0000000..0b86ab7 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/prev_permutation.h @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_PREV_PERMUTATION_H +#define _LIBCPP___ALGORITHM_PREV_PERMUTATION_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/reverse.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +pair<_BidirectionalIterator, bool> +__prev_permutation(_BidirectionalIterator __first, _Sentinel __last, _Compare&& __comp) +{ + using _Result = pair<_BidirectionalIterator, bool>; + + _BidirectionalIterator __last_iter = _IterOps<_AlgPolicy>::next(__first, __last); + _BidirectionalIterator __i = __last_iter; + if (__first == __last || __first == --__i) + return _Result(std::move(__last_iter), false); + + while (true) + { + _BidirectionalIterator __ip1 = __i; + if (__comp(*__ip1, *--__i)) + { + _BidirectionalIterator __j = __last_iter; + while (!__comp(*--__j, *__i)) + ; + _IterOps<_AlgPolicy>::iter_swap(__i, __j); + std::__reverse<_AlgPolicy>(__ip1, __last_iter); + return _Result(std::move(__last_iter), true); + } + if (__i == __first) + { + std::__reverse<_AlgPolicy>(__first, __last_iter); + return _Result(std::move(__last_iter), false); + } + } +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) +{ + return std::__prev_permutation<_ClassicAlgPolicy>( + std::move(__first), std::move(__last), static_cast<__comp_ref_type<_Compare> >(__comp)).second; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) +{ + return _VSTD::prev_permutation(__first, __last, + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_PREV_PERMUTATION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/push_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/push_heap.h new file mode 100644 index 0000000..9068495 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/push_heap.h @@ -0,0 +1,77 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_PUSH_HEAP_H +#define _LIBCPP___ALGORITHM_PUSH_HEAP_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +void __sift_up(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len) { + using value_type = typename iterator_traits<_RandomAccessIterator>::value_type; + + if (__len > 1) { + __len = (__len - 2) / 2; + _RandomAccessIterator __ptr = __first + __len; + + if (__comp(*__ptr, *--__last)) { + value_type __t(_IterOps<_AlgPolicy>::__iter_move(__last)); + do { + *__last = _IterOps<_AlgPolicy>::__iter_move(__ptr); + __last = __ptr; + if (__len == 0) + break; + __len = (__len - 1) / 2; + __ptr = __first + __len; + } while (__comp(*__ptr, __t)); + + *__last = std::move(__t); + } + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +void __push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp) { + typename iterator_traits<_RandomAccessIterator>::difference_type __len = __last - __first; + std::__sift_up<_AlgPolicy, __comp_ref_type<_Compare> >(std::move(__first), std::move(__last), __comp, __len); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + static_assert(std::is_copy_constructible<_RandomAccessIterator>::value, "Iterators must be copy constructible."); + static_assert(std::is_copy_assignable<_RandomAccessIterator>::value, "Iterators must be copy assignable."); + + std::__push_heap<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) { + std::push_heap(std::move(__first), std::move(__last), + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_PUSH_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_adjacent_find.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_adjacent_find.h new file mode 100644 index 0000000..d338d13 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_adjacent_find.h @@ -0,0 +1,78 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_ADJACENT_FIND_H +#define _LIBCPP___ALGORITHM_RANGES_ADJACENT_FIND_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __adjacent_find { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter __adjacent_find_impl(_Iter __first, _Sent __last, _Pred& __pred, _Proj& __proj) { + if (__first == __last) + return __first; + + auto __i = __first; + while (++__i != __last) { + if (std::invoke(__pred, std::invoke(__proj, *__first), std::invoke(__proj, *__i))) + return __first; + __first = __i; + } + return __i; + } + + template _Sent, + class _Proj = identity, + indirect_binary_predicate, projected<_Iter, _Proj>> _Pred = ranges::equal_to> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Pred __pred = {}, _Proj __proj = {}) const { + return __adjacent_find_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>, + projected, _Proj>> _Pred = ranges::equal_to> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __range, _Pred __pred = {}, _Proj __proj = {}) const { + return __adjacent_find_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } +}; +} // namespace __adjacent_find + +inline namespace __cpo { + inline constexpr auto adjacent_find = __adjacent_find::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_ADJACENT_FIND_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_all_of.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_all_of.h new file mode 100644 index 0000000..e45c4e5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_all_of.h @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_ALL_OF_H +#define _LIBCPP___ALGORITHM_RANGES_ALL_OF_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __all_of { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + bool __all_of_impl(_Iter __first, _Sent __last, _Pred& __pred, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (!std::invoke(__pred, std::invoke(__proj, *__first))) + return false; + } + return true; + } + + template _Sent, class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {}) const { + return __all_of_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { + return __all_of_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } +}; +} // namespace __all_of + +inline namespace __cpo { + inline constexpr auto all_of = __all_of::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_ALL_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_any_of.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_any_of.h new file mode 100644 index 0000000..e7d1e72 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_any_of.h @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_ANY_OF_H +#define _LIBCPP___ALGORITHM_RANGES_ANY_OF_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __any_of { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + bool __any_of_impl(_Iter __first, _Sent __last, _Pred& __pred, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) + return true; + } + return false; + } + + template _Sent, class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter __first, _Sent __last, _Pred __pred = {}, _Proj __proj = {}) const { + return __any_of_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { + return __any_of_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } +}; +} // namespace __any_of + +inline namespace __cpo { + inline constexpr auto any_of = __any_of::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_ANY_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_binary_search.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_binary_search.h new file mode 100644 index 0000000..b2a8977 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_binary_search.h @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_BINARY_SEARCH_H +#define _LIBCPP___ALGORITHM_RANGES_BINARY_SEARCH_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/lower_bound.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __binary_search { +struct __fn { + template _Sent, class _Type, class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter __first, _Sent __last, const _Type& __value, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__lower_bound_impl<_RangeAlgPolicy>(__first, __last, __value, __comp, __proj); + return __ret != __last && !std::invoke(__comp, __value, std::invoke(__proj, *__first)); + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range&& __r, const _Type& __value, _Comp __comp = {}, _Proj __proj = {}) const { + auto __first = ranges::begin(__r); + auto __last = ranges::end(__r); + auto __ret = std::__lower_bound_impl<_RangeAlgPolicy>(__first, __last, __value, __comp, __proj); + return __ret != __last && !std::invoke(__comp, __value, std::invoke(__proj, *__first)); + } +}; +} // namespace __binary_search + +inline namespace __cpo { + inline constexpr auto binary_search = __binary_search::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_BINARY_SEARCH_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_clamp.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_clamp.h new file mode 100644 index 0000000..09a97fc --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_clamp.h @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_CLAMP_H +#define _LIBCPP___ALGORITHM_RANGES_CLAMP_H + +#include <__assert> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __clamp { +struct __fn { + + template > _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + const _Type& operator()(const _Type& __value, + const _Type& __low, + const _Type& __high, + _Comp __comp = {}, + _Proj __proj = {}) const { + _LIBCPP_ASSERT(!bool(std::invoke(__comp, std::invoke(__proj, __high), std::invoke(__proj, __low))), + "Bad bounds passed to std::ranges::clamp"); + + if (std::invoke(__comp, std::invoke(__proj, __value), std::invoke(__proj, __low))) + return __low; + else if (std::invoke(__comp, std::invoke(__proj, __high), std::invoke(__proj, __value))) + return __high; + else + return __value; + } + +}; +} // namespace __clamp + +inline namespace __cpo { + inline constexpr auto clamp = __clamp::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_CLAMP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy.h new file mode 100644 index 0000000..bb02c84 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy.h @@ -0,0 +1,67 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_COPY_H +#define _LIBCPP___ALGORITHM_RANGES_COPY_H + +#include <__algorithm/copy.h> +#include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__iterator/concepts.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using copy_result = in_out_result<_InIter, _OutIter>; + +namespace __copy { +struct __fn { + + template _Sent, weakly_incrementable _OutIter> + requires indirectly_copyable<_InIter, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + copy_result<_InIter, _OutIter> operator()(_InIter __first, _Sent __last, _OutIter __result) const { + auto __ret = std::__copy<_RangeAlgPolicy>(std::move(__first), std::move(__last), std::move(__result)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template + requires indirectly_copyable, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + copy_result, _OutIter> operator()(_Range&& __r, _OutIter __result) const { + auto __ret = std::__copy<_RangeAlgPolicy>(ranges::begin(__r), ranges::end(__r), std::move(__result)); + return {std::move(__ret.first), std::move(__ret.second)}; + } +}; +} // namespace __copy + +inline namespace __cpo { + inline constexpr auto copy = __copy::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_backward.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_backward.h new file mode 100644 index 0000000..f41af66 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_backward.h @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_COPY_BACKWARD_H +#define _LIBCPP___ALGORITHM_RANGES_COPY_BACKWARD_H + +#include <__algorithm/copy_backward.h> +#include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using copy_backward_result = in_out_result<_Ip, _Op>; + +namespace __copy_backward { +struct __fn { + + template _Sent1, bidirectional_iterator _InIter2> + requires indirectly_copyable<_InIter1, _InIter2> + _LIBCPP_HIDE_FROM_ABI constexpr + copy_backward_result<_InIter1, _InIter2> operator()(_InIter1 __first, _Sent1 __last, _InIter2 __result) const { + auto __ret = std::__copy_backward<_RangeAlgPolicy>(std::move(__first), std::move(__last), std::move(__result)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template + requires indirectly_copyable, _Iter> + _LIBCPP_HIDE_FROM_ABI constexpr + copy_backward_result, _Iter> operator()(_Range&& __r, _Iter __result) const { + auto __ret = std::__copy_backward<_RangeAlgPolicy>(ranges::begin(__r), ranges::end(__r), std::move(__result)); + return {std::move(__ret.first), std::move(__ret.second)}; + } +}; +} // namespace __copy_backward + +inline namespace __cpo { + inline constexpr auto copy_backward = __copy_backward::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_COPY_BACKWARD_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_if.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_if.h new file mode 100644 index 0000000..dba41c3 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_if.h @@ -0,0 +1,81 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_COPY_IF_H +#define _LIBCPP___ALGORITHM_RANGES_COPY_IF_H + +#include <__algorithm/in_out_result.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using copy_if_result = in_out_result<_Ip, _Op>; + +namespace __copy_if { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI static constexpr + copy_if_result <_InIter, _OutIter> + __copy_if_impl(_InIter __first, _Sent __last, _OutIter __result, _Pred& __pred, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) { + *__result = *__first; + ++__result; + } + } + return {std::move(__first), std::move(__result)}; + } + + template _Sent, weakly_incrementable _OutIter, class _Proj = identity, + indirect_unary_predicate> _Pred> + requires indirectly_copyable<_Iter, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + copy_if_result<_Iter, _OutIter> + operator()(_Iter __first, _Sent __last, _OutIter __result, _Pred __pred, _Proj __proj = {}) const { + return __copy_if_impl(std::move(__first), std::move(__last), std::move(__result), __pred, __proj); + } + + template , _Proj>> _Pred> + requires indirectly_copyable, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + copy_if_result, _OutIter> + operator()(_Range&& __r, _OutIter __result, _Pred __pred, _Proj __proj = {}) const { + return __copy_if_impl(ranges::begin(__r), ranges::end(__r), std::move(__result), __pred, __proj); + } +}; +} // namespace __copy_if + +inline namespace __cpo { + inline constexpr auto copy_if = __copy_if::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_COPY_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_n.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_n.h new file mode 100644 index 0000000..04bb80b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_copy_n.h @@ -0,0 +1,77 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_COPY_N_H +#define _LIBCPP___ALGORITHM_RANGES_COPY_N_H + +#include <__algorithm/copy.h> +#include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/ranges_copy.h> +#include <__config> +#include <__functional/identity.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/unreachable_sentinel.h> +#include <__iterator/wrap_iter.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { + +template +using copy_n_result = in_out_result<_Ip, _Op>; + +namespace __copy_n { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + copy_n_result<_InIter, _OutIter> __go(_InIter __first, _DiffType __n, _OutIter __result) { + while (__n != 0) { + *__result = *__first; + ++__first; + ++__result; + --__n; + } + return {std::move(__first), std::move(__result)}; + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + copy_n_result<_InIter, _OutIter> __go(_InIter __first, _DiffType __n, _OutIter __result) { + auto __ret = std::__copy<_RangeAlgPolicy>(__first, __first + __n, __result); + return {__ret.first, __ret.second}; + } + + template + requires indirectly_copyable<_Ip, _Op> + _LIBCPP_HIDE_FROM_ABI constexpr + copy_n_result<_Ip, _Op> operator()(_Ip __first, iter_difference_t<_Ip> __n, _Op __result) const { + return __go(std::move(__first), __n, std::move(__result)); + } +}; +} // namespace __copy_n + +inline namespace __cpo { + inline constexpr auto copy_n = __copy_n::__fn{}; +} // namespace __cpo +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_RANGES_COPY_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_count.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_count.h new file mode 100644 index 0000000..527dd06 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_count.h @@ -0,0 +1,62 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_COUNT_H +#define _LIBCPP___ALGORITHM_RANGES_COUNT_H + +#include <__algorithm/ranges_count_if.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __count { +struct __fn { + template _Sent, class _Type, class _Proj = identity> + requires indirect_binary_predicate, const _Type*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + iter_difference_t<_Iter> operator()(_Iter __first, _Sent __last, const _Type& __value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __e) { return __e == __value; }; + return ranges::__count_if_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template + requires indirect_binary_predicate, _Proj>, const _Type*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + range_difference_t<_Range> operator()(_Range&& __r, const _Type& __value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __e) { return __e == __value; }; + return ranges::__count_if_impl(ranges::begin(__r), ranges::end(__r), __pred, __proj); + } +}; +} // namespace __count + +inline namespace __cpo { + inline constexpr auto count = __count::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_COUNT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_count_if.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_count_if.h new file mode 100644 index 0000000..931618b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_count_if.h @@ -0,0 +1,72 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_COUNT_IF_H +#define _LIBCPP___ALGORITHM_RANGES_COUNT_IF_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +template +_LIBCPP_HIDE_FROM_ABI constexpr +iter_difference_t<_Iter> __count_if_impl(_Iter __first, _Sent __last, + _Pred& __pred, _Proj& __proj) { + iter_difference_t<_Iter> __counter(0); + for (; __first != __last; ++__first) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) + ++__counter; + } + return __counter; +} + +namespace __count_if { +struct __fn { + template _Sent, class _Proj = identity, + indirect_unary_predicate> _Predicate> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + iter_difference_t<_Iter> operator()(_Iter __first, _Sent __last, _Predicate __pred, _Proj __proj = {}) const { + return ranges::__count_if_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>> _Predicate> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + range_difference_t<_Range> operator()(_Range&& __r, _Predicate __pred, _Proj __proj = {}) const { + return ranges::__count_if_impl(ranges::begin(__r), ranges::end(__r), __pred, __proj); + } +}; +} // namespace __count_if + +inline namespace __cpo { + inline constexpr auto count_if = __count_if::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_COUNT_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_equal.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_equal.h new file mode 100644 index 0000000..3c417f0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_equal.h @@ -0,0 +1,115 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_EQUAL_H +#define _LIBCPP___ALGORITHM_RANGES_EQUAL_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/distance.h> +#include <__iterator/indirectly_comparable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __equal { +struct __fn { +private: + template + _LIBCPP_HIDE_FROM_ABI constexpr static + bool __equal_impl(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2) { + while (__first1 != __last1 && __first2 != __last2) { + if (!std::invoke(__pred, std::invoke(__proj1, *__first1), std::invoke(__proj2, *__first2))) + return false; + ++__first1; + ++__first2; + } + return __first1 == __last1 && __first2 == __last2; + } + +public: + + template _Sent1, + input_iterator _Iter2, sentinel_for<_Iter2> _Sent2, + class _Pred = ranges::equal_to, + class _Proj1 = identity, + class _Proj2 = identity> + requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred __pred = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + if constexpr (sized_sentinel_for<_Sent1, _Iter1> && sized_sentinel_for<_Sent2, _Iter2>) { + if (__last1 - __first1 != __last2 - __first2) + return false; + } + return __equal_impl(std::move(__first1), std::move(__last1), + std::move(__first2), std::move(__last2), + __pred, + __proj1, + __proj2); + } + + template + requires indirectly_comparable, iterator_t<_Range2>, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range1&& __range1, + _Range2&& __range2, + _Pred __pred = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + if constexpr (sized_range<_Range1> && sized_range<_Range2>) { + if (ranges::distance(__range1) != ranges::distance(__range2)) + return false; + } + return __equal_impl(ranges::begin(__range1), ranges::end(__range1), + ranges::begin(__range2), ranges::end(__range2), + __pred, + __proj1, + __proj2); + return false; + } +}; +} // namespace __equal + +inline namespace __cpo { + inline constexpr auto equal = __equal::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_EQUAL_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_equal_range.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_equal_range.h new file mode 100644 index 0000000..94dc058 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_equal_range.h @@ -0,0 +1,78 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM __project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_EQUAL_RANGE_H +#define _LIBCPP___ALGORITHM_RANGES_EQUAL_RANGE_H + +#include <__algorithm/equal_range.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__ranges/subrange.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __equal_range { + +struct __fn { + template < + forward_iterator _Iter, + sentinel_for<_Iter> _Sent, + class _Tp, + class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr subrange<_Iter> + operator()(_Iter __first, _Sent __last, const _Tp& __value, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__equal_range<_RangeAlgPolicy>( + std::move(__first), std::move(__last), __value, __comp, __proj); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template < + forward_range _Range, + class _Tp, + class _Proj = identity, + indirect_strict_weak_order, _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr borrowed_subrange_t<_Range> + operator()(_Range&& __range, const _Tp& __value, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__equal_range<_RangeAlgPolicy>( + ranges::begin(__range), ranges::end(__range), __value, __comp, __proj); + return {std::move(__ret.first), std::move(__ret.second)}; + } +}; + +} // namespace __equal_range + +inline namespace __cpo { + inline constexpr auto equal_range = __equal_range::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_EQUAL_RANGE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_fill.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_fill.h new file mode 100644 index 0000000..6ebc2bd --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_fill.h @@ -0,0 +1,59 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FILL_H +#define _LIBCPP___ALGORITHM_RANGES_FILL_H + +#include <__algorithm/ranges_fill_n.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __fill { +struct __fn { + template _Iter, sentinel_for<_Iter> _Sent> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, const _Type& __value) const { + if constexpr(random_access_iterator<_Iter> && sized_sentinel_for<_Sent, _Iter>) { + return ranges::fill_n(__first, __last - __first, __value); + } else { + for (; __first != __last; ++__first) + *__first = __value; + return __first; + } + } + + template _Range> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __range, const _Type& __value) const { + return (*this)(ranges::begin(__range), ranges::end(__range), __value); + } +}; +} // namespace __fill + +inline namespace __cpo { + inline constexpr auto fill = __fill::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FILL_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_fill_n.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_fill_n.h new file mode 100644 index 0000000..a2660e8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_fill_n.h @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FILL_N_H +#define _LIBCPP___ALGORITHM_RANGES_FILL_N_H + +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __fill_n { +struct __fn { + template _Iter> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, iter_difference_t<_Iter> __n, const _Type& __value) const { + for (; __n != 0; --__n) { + *__first = __value; + ++__first; + } + return __first; + } +}; +} // namespace __fill_n + +inline namespace __cpo { + inline constexpr auto fill_n = __fill_n::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FILL_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_find.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find.h new file mode 100644 index 0000000..580c2a1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find.h @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FIND_H +#define _LIBCPP___ALGORITHM_RANGES_FIND_H + +#include <__algorithm/ranges_find_if.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __find { +struct __fn { + template _Sp, class _Tp, class _Proj = identity> + requires indirect_binary_predicate, const _Tp*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Ip operator()(_Ip __first, _Sp __last, const _Tp& __value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __e) { return std::forward(__e) == __value; }; + return ranges::__find_if_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template + requires indirect_binary_predicate, _Proj>, const _Tp*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Rp> operator()(_Rp&& __r, const _Tp& __value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __e) { return std::forward(__e) == __value; }; + return ranges::__find_if_impl(ranges::begin(__r), ranges::end(__r), __pred, __proj); + } +}; +} // namespace __find + +inline namespace __cpo { + inline constexpr auto find = __find::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FIND_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_end.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_end.h new file mode 100644 index 0000000..ea36f4d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_end.h @@ -0,0 +1,98 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FIND_END_H +#define _LIBCPP___ALGORITHM_RANGES_FIND_END_H + +#include <__algorithm/find_end.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/ranges_iterator_concept.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/indirectly_comparable.h> +#include <__iterator/iterator_traits.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/subrange.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __find_end { +struct __fn { + template _Sent1, + forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2, + class _Pred = ranges::equal_to, + class _Proj1 = identity, + class _Proj2 = identity> + requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + subrange<_Iter1> operator()(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred __pred = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__find_end_impl<_RangeAlgPolicy>( + __first1, + __last1, + __first2, + __last2, + __pred, + __proj1, + __proj2, + __iterator_concept<_Iter1>(), + __iterator_concept<_Iter2>()); + return {__ret.first, __ret.second}; + } + + template + requires indirectly_comparable, iterator_t<_Range2>, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_subrange_t<_Range1> operator()(_Range1&& __range1, + _Range2&& __range2, + _Pred __pred = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__find_end_impl<_RangeAlgPolicy>( + ranges::begin(__range1), + ranges::end(__range1), + ranges::begin(__range2), + ranges::end(__range2), + __pred, + __proj1, + __proj2, + __iterator_concept>(), + __iterator_concept>()); + return {__ret.first, __ret.second}; + } +}; +} // namespace __find_end + +inline namespace __cpo { + inline constexpr auto find_end = __find_end::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FIND_END_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_first_of.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_first_of.h new file mode 100644 index 0000000..9d66e75 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_first_of.h @@ -0,0 +1,101 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FIND_FIRST_OF_H +#define _LIBCPP___ALGORITHM_RANGES_FIND_FIRST_OF_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/indirectly_comparable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __find_first_of { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter1 __find_first_of_impl(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2) { + for (; __first1 != __last1; ++__first1) { + for (auto __j = __first2; __j != __last2; ++__j) { + if (std::invoke(__pred, std::invoke(__proj1, *__first1), std::invoke(__proj2, *__j))) + return __first1; + } + } + return __first1; + } + + template _Sent1, + forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2, + class _Pred = ranges::equal_to, + class _Proj1 = identity, + class _Proj2 = identity> + requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Iter1 operator()(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred __pred = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + return __find_first_of_impl(std::move(__first1), std::move(__last1), + std::move(__first2), std::move(__last2), + __pred, + __proj1, + __proj2); + } + + template + requires indirectly_comparable, iterator_t<_Range2>, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range1> operator()(_Range1&& __range1, + _Range2&& __range2, + _Pred __pred = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + return __find_first_of_impl(ranges::begin(__range1), ranges::end(__range1), + ranges::begin(__range2), ranges::end(__range2), + __pred, + __proj1, + __proj2); + } + +}; +} // namespace __find_first_of + +inline namespace __cpo { + inline constexpr auto find_first_of = __find_first_of::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FIND_FIRST_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_if.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_if.h new file mode 100644 index 0000000..45ce6e4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_if.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FIND_IF_H +#define _LIBCPP___ALGORITHM_RANGES_FIND_IF_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +_LIBCPP_HIDE_FROM_ABI static constexpr +_Ip __find_if_impl(_Ip __first, _Sp __last, _Pred& __pred, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) + break; + } + return __first; +} + +namespace __find_if { +struct __fn { + + template _Sp, class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Ip operator()(_Ip __first, _Sp __last, _Pred __pred, _Proj __proj = {}) const { + return ranges::__find_if_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Rp> operator()(_Rp&& __r, _Pred __pred, _Proj __proj = {}) const { + return ranges::__find_if_impl(ranges::begin(__r), ranges::end(__r), __pred, __proj); + } +}; +} // namespace __find_if + +inline namespace __cpo { + inline constexpr auto find_if = __find_if::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FIND_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_if_not.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_if_not.h new file mode 100644 index 0000000..3dd1213 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_find_if_not.h @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FIND_IF_NOT_H +#define _LIBCPP___ALGORITHM_RANGES_FIND_IF_NOT_H + +#include <__algorithm/ranges_find_if.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __find_if_not { +struct __fn { + template _Sp, class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Ip operator()(_Ip __first, _Sp __last, _Pred __pred, _Proj __proj = {}) const { + auto __pred2 = [&](auto&& __e) { return !std::invoke(__pred, std::forward(__e)); }; + return ranges::__find_if_impl(std::move(__first), std::move(__last), __pred2, __proj); + } + + template , _Proj>> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Rp> operator()(_Rp&& __r, _Pred __pred, _Proj __proj = {}) const { + auto __pred2 = [&](auto&& __e) { return !std::invoke(__pred, std::forward(__e)); }; + return ranges::__find_if_impl(ranges::begin(__r), ranges::end(__r), __pred2, __proj); + } +}; +} // namespace __find_if_not + +inline namespace __cpo { + inline constexpr auto find_if_not = __find_if_not::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FIND_IF_NOT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_for_each.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_for_each.h new file mode 100644 index 0000000..0c70c05 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_for_each.h @@ -0,0 +1,78 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FOR_EACH_H +#define _LIBCPP___ALGORITHM_RANGES_FOR_EACH_H + +#include <__algorithm/in_fun_result.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using for_each_result = in_fun_result<_Iter, _Func>; + +namespace __for_each { +struct __fn { +private: + template + _LIBCPP_HIDE_FROM_ABI constexpr static + for_each_result<_Iter, _Func> __for_each_impl(_Iter __first, _Sent __last, _Func& __func, _Proj& __proj) { + for (; __first != __last; ++__first) + std::invoke(__func, std::invoke(__proj, *__first)); + return {std::move(__first), std::move(__func)}; + } + +public: + template _Sent, + class _Proj = identity, + indirectly_unary_invocable> _Func> + _LIBCPP_HIDE_FROM_ABI constexpr + for_each_result<_Iter, _Func> operator()(_Iter __first, _Sent __last, _Func __func, _Proj __proj = {}) const { + return __for_each_impl(std::move(__first), std::move(__last), __func, __proj); + } + + template , _Proj>> _Func> + _LIBCPP_HIDE_FROM_ABI constexpr + for_each_result, _Func> operator()(_Range&& __range, + _Func __func, + _Proj __proj = {}) const { + return __for_each_impl(ranges::begin(__range), ranges::end(__range), __func, __proj); + } + +}; +} // namespace __for_each + +inline namespace __cpo { + inline constexpr auto for_each = __for_each::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FOR_EACH_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_for_each_n.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_for_each_n.h new file mode 100644 index 0000000..261816a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_for_each_n.h @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_FOR_EACH_N_H +#define _LIBCPP___ALGORITHM_RANGES_FOR_EACH_N_H + +#include <__algorithm/in_fun_result.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using for_each_n_result = in_fun_result<_Iter, _Func>; + +namespace __for_each_n { +struct __fn { + + template > _Func> + _LIBCPP_HIDE_FROM_ABI constexpr + for_each_n_result<_Iter, _Func> operator()(_Iter __first, + iter_difference_t<_Iter> __count, + _Func __func, + _Proj __proj = {}) const { + while (__count-- > 0) { + std::invoke(__func, std::invoke(__proj, *__first)); + ++__first; + } + return {std::move(__first), std::move(__func)}; + } + +}; +} // namespace __for_each_n + +inline namespace __cpo { + inline constexpr auto for_each_n = __for_each_n::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_FOR_EACH_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_generate.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_generate.h new file mode 100644 index 0000000..ae486ae --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_generate.h @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_GENERATE_H +#define _LIBCPP___ALGORITHM_RANGES_GENERATE_H + +#include <__concepts/constructible.h> +#include <__concepts/invocable.h> +#include <__config> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __generate { + +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr + static _OutIter __generate_fn_impl(_OutIter __first, _Sent __last, _Func& __gen) { + for (; __first != __last; ++__first) { + *__first = __gen(); + } + + return __first; + } + + template _Sent, copy_constructible _Func> + requires invocable<_Func&> && indirectly_writable<_OutIter, invoke_result_t<_Func&>> + _LIBCPP_HIDE_FROM_ABI constexpr + _OutIter operator()(_OutIter __first, _Sent __last, _Func __gen) const { + return __generate_fn_impl(std::move(__first), std::move(__last), __gen); + } + + template + requires invocable<_Func&> && output_range<_Range, invoke_result_t<_Func&>> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __range, _Func __gen) const { + return __generate_fn_impl(ranges::begin(__range), ranges::end(__range), __gen); + } + +}; + +} // namespace __generate + +inline namespace __cpo { + inline constexpr auto generate = __generate::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_GENERATE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_generate_n.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_generate_n.h new file mode 100644 index 0000000..e625e3a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_generate_n.h @@ -0,0 +1,62 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_GENERATE_N_H +#define _LIBCPP___ALGORITHM_RANGES_GENERATE_N_H + +#include <__concepts/constructible.h> +#include <__concepts/invocable.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __generate_n { + +struct __fn { + + template + requires invocable<_Func&> && indirectly_writable<_OutIter, invoke_result_t<_Func&>> + _LIBCPP_HIDE_FROM_ABI constexpr + _OutIter operator()(_OutIter __first, iter_difference_t<_OutIter> __n, _Func __gen) const { + for (; __n > 0; --__n) { + *__first = __gen(); + ++__first; + } + + return __first; + } + +}; + +} // namespace __generate_n + +inline namespace __cpo { + inline constexpr auto generate_n = __generate_n::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_GENERATE_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_includes.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_includes.h new file mode 100644 index 0000000..8438117 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_includes.h @@ -0,0 +1,95 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_INCLUDES_H +#define _LIBCPP___ALGORITHM_RANGES_INCLUDES_H + +#include <__algorithm/includes.h> +#include <__algorithm/make_projected.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __includes { + +struct __fn { + template < + input_iterator _Iter1, + sentinel_for<_Iter1> _Sent1, + input_iterator _Iter2, + sentinel_for<_Iter2> _Sent2, + class _Proj1 = identity, + class _Proj2 = identity, + indirect_strict_weak_order, projected<_Iter2, _Proj2>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr bool operator()( + _Iter1 __first1, + _Sent1 __last1, + _Iter2 __first2, + _Sent2 __last2, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + return std::__includes( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__comp), + std::move(__proj1), + std::move(__proj2)); + } + + template < + input_range _Range1, + input_range _Range2, + class _Proj1 = identity, + class _Proj2 = identity, + indirect_strict_weak_order, _Proj1>, projected, _Proj2>> + _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr bool operator()( + _Range1&& __range1, _Range2&& __range2, _Comp __comp = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { + return std::__includes( + ranges::begin(__range1), + ranges::end(__range1), + ranges::begin(__range2), + ranges::end(__range2), + std::move(__comp), + std::move(__proj1), + std::move(__proj2)); + } +}; + +} // namespace __includes + +inline namespace __cpo { + inline constexpr auto includes = __includes::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_INCLUDES_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_inplace_merge.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_inplace_merge.h new file mode 100644 index 0000000..88171a6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_inplace_merge.h @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_INPLACE_MERGE_H +#define _LIBCPP___ALGORITHM_RANGES_INPLACE_MERGE_H + +#include <__algorithm/inplace_merge.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __inplace_merge { + + struct __fn { + template + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __inplace_merge_impl(_Iter __first, _Iter __middle, _Sent __last, _Comp&& __comp, _Proj&& __proj) { + auto __last_iter = ranges::next(__middle, __last); + std::__inplace_merge<_RangeAlgPolicy>( + std::move(__first), std::move(__middle), __last_iter, std::__make_projected(__comp, __proj)); + return __last_iter; + } + + template < + bidirectional_iterator _Iter, + sentinel_for<_Iter> _Sent, + class _Comp = ranges::less, + class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI _Iter + operator()(_Iter __first, _Iter __middle, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __inplace_merge_impl( + std::move(__first), std::move(__middle), std::move(__last), std::move(__comp), std::move(__proj)); + } + + template + requires sortable< + iterator_t<_Range>, + _Comp, + _Proj> _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_Range> + operator()(_Range&& __range, iterator_t<_Range> __middle, _Comp __comp = {}, _Proj __proj = {}) const { + return __inplace_merge_impl( + ranges::begin(__range), std::move(__middle), ranges::end(__range), std::move(__comp), std::move(__proj)); + } + }; + +} // namespace __inplace_merge + +inline namespace __cpo { + inline constexpr auto inplace_merge = __inplace_merge::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_INPLACE_MERGE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_heap.h new file mode 100644 index 0000000..a16c075 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_heap.h @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_IS_HEAP_H +#define _LIBCPP___ALGORITHM_RANGES_IS_HEAP_H + +#include <__algorithm/is_heap_until.h> +#include <__algorithm/make_projected.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __is_heap { + +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr + static bool __is_heap_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + auto&& __projected_comp = std::__make_projected(__comp, __proj); + + auto __result = std::__is_heap_until(std::move(__first), std::move(__last_iter), __projected_comp); + return __result == __last; + } + + template _Sent, class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __is_heap_fn_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { + return __is_heap_fn_impl(ranges::begin(__range), ranges::end(__range), __comp, __proj); + } +}; + +} // namespace __is_heap + +inline namespace __cpo { + inline constexpr auto is_heap = __is_heap::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_IS_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_heap_until.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_heap_until.h new file mode 100644 index 0000000..8c8dac5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_heap_until.h @@ -0,0 +1,75 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_IS_HEAP_UNTIL_H +#define _LIBCPP___ALGORITHM_RANGES_IS_HEAP_UNTIL_H + +#include <__algorithm/is_heap_until.h> +#include <__algorithm/make_projected.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __is_heap_until { + +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr + static _Iter __is_heap_until_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + auto&& __projected_comp = std::__make_projected(__comp, __proj); + + return std::__is_heap_until(std::move(__first), std::move(__last_iter), __projected_comp); + } + + template _Sent, class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __is_heap_until_fn_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { + return __is_heap_until_fn_impl(ranges::begin(__range), ranges::end(__range), __comp, __proj); + } + +}; + +} // namespace __is_heap_until + +inline namespace __cpo { + inline constexpr auto is_heap_until = __is_heap_until::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_IS_HEAP_UNTIL_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_partitioned.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_partitioned.h new file mode 100644 index 0000000..b903953 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_partitioned.h @@ -0,0 +1,81 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_IS_PARTITIONED_H +#define _LIBCPP___ALGORITHM_RANGES_IS_PARTITIONED_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/indirectly_comparable.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __is_partitioned { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + bool __is_parititioned_impl(_Iter __first, _Sent __last, _Pred& __pred, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (!std::invoke(__pred, std::invoke(__proj, *__first))) + break; + } + + if (__first == __last) + return true; + ++__first; + + for (; __first != __last; ++__first) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) + return false; + } + + return true; + } + + template _Sent, + class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {}) const { + return __is_parititioned_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { + return __is_parititioned_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } +}; +} // namespace __is_partitioned + +inline namespace __cpo { + inline constexpr auto is_partitioned = __is_partitioned::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_IS_PARTITIONED_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_permutation.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_permutation.h new file mode 100644 index 0000000..b617500 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_permutation.h @@ -0,0 +1,89 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_IS_PERMUTATION_H +#define _LIBCPP___ALGORITHM_RANGES_IS_PERMUTATION_H + +#include <__algorithm/is_permutation.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/distance.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __is_permutation { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + bool __is_permutation_func_impl(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, + _Pred& __pred, _Proj1& __proj1, _Proj2& __proj2) { + return std::__is_permutation<_RangeAlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), + __pred, __proj1, __proj2); + } + + template _Sent1, + forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2, + class _Proj1 = identity, + class _Proj2 = identity, + indirect_equivalence_relation, + projected<_Iter2, _Proj2>> _Pred = ranges::equal_to> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, + _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { + return __is_permutation_func_impl( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), + __pred, __proj1, __proj2); + } + + template , _Proj1>, projected, _Proj2>> _Pred = ranges::equal_to> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range1&& __range1, _Range2&& __range2, + _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { + if constexpr (sized_range<_Range1> && sized_range<_Range2>) { + if (ranges::distance(__range1) != ranges::distance(__range2)) + return false; + } + + return __is_permutation_func_impl( + ranges::begin(__range1), ranges::end(__range1), ranges::begin(__range2), ranges::end(__range2), + __pred, __proj1, __proj2); + } +}; +} // namespace __is_permutation + +inline namespace __cpo { + inline constexpr auto is_permutation = __is_permutation::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_IS_PERMUTATION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_sorted.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_sorted.h new file mode 100644 index 0000000..ce3032f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_sorted.h @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP__ALGORITHM_RANGES_IS_SORTED_H +#define _LIBCPP__ALGORITHM_RANGES_IS_SORTED_H + +#include <__algorithm/ranges_is_sorted_until.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __is_sorted { +struct __fn { + template _Sent, + class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return ranges::__is_sorted_until_impl(std::move(__first), __last, __comp, __proj) == __last; + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { + auto __last = ranges::end(__range); + return ranges::__is_sorted_until_impl(ranges::begin(__range), __last, __comp, __proj) == __last; + } +}; +} // namespace __is_sorted + +inline namespace __cpo { + inline constexpr auto is_sorted = __is_sorted::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP__ALGORITHM_RANGES_IS_SORTED_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_sorted_until.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_sorted_until.h new file mode 100644 index 0000000..17fc42e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_is_sorted_until.h @@ -0,0 +1,76 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP__ALGORITHM_RANGES_IS_SORTED_UNTIL_H +#define _LIBCPP__ALGORITHM_RANGES_IS_SORTED_UNTIL_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +_LIBCPP_HIDE_FROM_ABI constexpr +_Iter __is_sorted_until_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + if (__first == __last) + return __first; + auto __i = __first; + while (++__i != __last) { + if (std::invoke(__comp, std::invoke(__proj, *__i), std::invoke(__proj, *__first))) + return __i; + __first = __i; + } + return __i; +} + +namespace __is_sorted_until { +struct __fn { + template _Sent, + class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return ranges::__is_sorted_until_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { + return ranges::__is_sorted_until_impl(ranges::begin(__range), ranges::end(__range), __comp, __proj); + } +}; +} // namespace __is_sorted_until + +inline namespace __cpo { + inline constexpr auto is_sorted_until = __is_sorted_until::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP__ALGORITHM_RANGES_IS_SORTED_UNTIL_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_iterator_concept.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_iterator_concept.h new file mode 100644 index 0000000..3ac6b31 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_iterator_concept.h @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_ITERATOR_CONCEPT_H +#define _LIBCPP___ALGORITHM_RANGES_ITERATOR_CONCEPT_H + +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/remove_cvref.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +consteval auto __get_iterator_concept() { + using _Iter = __remove_cvref_t<_IterMaybeQualified>; + + if constexpr (contiguous_iterator<_Iter>) + return contiguous_iterator_tag(); + else if constexpr (random_access_iterator<_Iter>) + return random_access_iterator_tag(); + else if constexpr (bidirectional_iterator<_Iter>) + return bidirectional_iterator_tag(); + else if constexpr (forward_iterator<_Iter>) + return forward_iterator_tag(); + else if constexpr (input_iterator<_Iter>) + return input_iterator_tag(); +} + +template +using __iterator_concept = decltype(__get_iterator_concept<_Iter>()); + +} // namespace ranges +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_ITERATOR_CONCEPT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_lexicographical_compare.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_lexicographical_compare.h new file mode 100644 index 0000000..2972e32 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_lexicographical_compare.h @@ -0,0 +1,98 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_LEXICOGRAPHICAL_COMPARE_H +#define _LIBCPP___ALGORITHM_RANGES_LEXICOGRAPHICAL_COMPARE_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __lexicographical_compare { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + bool __lexicographical_compare_impl(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Comp& __comp, + _Proj1& __proj1, + _Proj2& __proj2) { + while (__first2 != __last2) { + if (__first1 == __last1 + || std::invoke(__comp, std::invoke(__proj1, *__first1), std::invoke(__proj2, *__first2))) + return true; + if (std::invoke(__comp, std::invoke(__proj2, *__first2), std::invoke(__proj1, *__first1))) + return false; + ++__first1; + ++__first2; + } + return false; + } + + template _Sent1, + input_iterator _Iter2, sentinel_for<_Iter2> _Sent2, + class _Proj1 = identity, + class _Proj2 = identity, + indirect_strict_weak_order, projected<_Iter2, _Proj2>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + return __lexicographical_compare_impl(std::move(__first1), std::move(__last1), + std::move(__first2), std::move(__last2), + __comp, + __proj1, + __proj2); + } + + template , _Proj1>, + projected, _Proj2>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range1&& __range1, _Range2&& __range2, _Comp __comp = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { + return __lexicographical_compare_impl(ranges::begin(__range1), ranges::end(__range1), + ranges::begin(__range2), ranges::end(__range2), + __comp, + __proj1, + __proj2); + } + +}; +} // namespace __lexicographical_compare + +inline namespace __cpo { + inline constexpr auto lexicographical_compare = __lexicographical_compare::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_LEXICOGRAPHICAL_COMPARE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_lower_bound.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_lower_bound.h new file mode 100644 index 0000000..78cbb6d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_lower_bound.h @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_LOWER_BOUND_H +#define _LIBCPP___ALGORITHM_RANGES_LOWER_BOUND_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/lower_bound.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/advance.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +namespace __lower_bound { +struct __fn { + template _Sent, class _Type, class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, const _Type& __value, _Comp __comp = {}, _Proj __proj = {}) const { + return std::__lower_bound_impl<_RangeAlgPolicy>(__first, __last, __value, __comp, __proj); + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, + const _Type& __value, + _Comp __comp = {}, + _Proj __proj = {}) const { + return std::__lower_bound_impl<_RangeAlgPolicy>(ranges::begin(__r), ranges::end(__r), __value, __comp, __proj); + } +}; +} // namespace __lower_bound + +inline namespace __cpo { + inline constexpr auto lower_bound = __lower_bound::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_LOWER_BOUND_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_make_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_make_heap.h new file mode 100644 index 0000000..f25c7ab --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_make_heap.h @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MAKE_HEAP_H +#define _LIBCPP___ALGORITHM_RANGES_MAKE_HEAP_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_heap.h> +#include <__algorithm/make_projected.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __make_heap { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter __make_heap_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + + auto&& __projected_comp = std::__make_projected(__comp, __proj); + std::__make_heap<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp); + + return __last_iter; + } + + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __make_heap_fn_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + return __make_heap_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); + } +}; + +} // namespace __make_heap + +inline namespace __cpo { + inline constexpr auto make_heap = __make_heap::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_MAKE_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_max.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_max.h new file mode 100644 index 0000000..55aef99 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_max.h @@ -0,0 +1,93 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MAX_H +#define _LIBCPP___ALGORITHM_RANGES_MAX_H + +#include <__algorithm/ranges_min_element.h> +#include <__assert> +#include <__concepts/copyable.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __max { +struct __fn { + template > _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + const _Tp& operator()(const _Tp& __a, const _Tp& __b, _Comp __comp = {}, _Proj __proj = {}) const { + return std::invoke(__comp, std::invoke(__proj, __a), std::invoke(__proj, __b)) ? __b : __a; + } + + template > _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Tp operator()(initializer_list<_Tp> __il, _Comp __comp = {}, _Proj __proj = {}) const { + _LIBCPP_ASSERT(__il.begin() != __il.end(), "initializer_list must contain at least one element"); + + auto __comp_lhs_rhs_swapped = [&](auto&& __lhs, auto&& __rhs) { return std::invoke(__comp, __rhs, __lhs); }; + return *ranges::__min_element_impl(__il.begin(), __il.end(), __comp_lhs_rhs_swapped, __proj); + } + + template , _Proj>> _Comp = ranges::less> + requires indirectly_copyable_storable, range_value_t<_Rp>*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + range_value_t<_Rp> operator()(_Rp&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + auto __first = ranges::begin(__r); + auto __last = ranges::end(__r); + + _LIBCPP_ASSERT(__first != __last, "range must contain at least one element"); + + if constexpr (forward_range<_Rp>) { + auto __comp_lhs_rhs_swapped = [&](auto&& __lhs, auto&& __rhs) { return std::invoke(__comp, __rhs, __lhs); }; + return *ranges::__min_element_impl(std::move(__first), std::move(__last), __comp_lhs_rhs_swapped, __proj); + } else { + range_value_t<_Rp> __result = *__first; + while (++__first != __last) { + if (std::invoke(__comp, std::invoke(__proj, __result), std::invoke(__proj, *__first))) + __result = *__first; + } + return __result; + } + } +}; +} // namespace __max + +inline namespace __cpo { + inline constexpr auto max = __max::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP_STD_VER > 17 && + +#endif // _LIBCPP___ALGORITHM_RANGES_MAX_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_max_element.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_max_element.h new file mode 100644 index 0000000..490f320 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_max_element.h @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MAX_ELEMENT_H +#define _LIBCPP___ALGORITHM_RANGES_MAX_ELEMENT_H + +#include <__algorithm/ranges_min_element.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __max_element { +struct __fn { + template _Sp, class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Ip operator()(_Ip __first, _Sp __last, _Comp __comp = {}, _Proj __proj = {}) const { + auto __comp_lhs_rhs_swapped = [&](auto&& __lhs, auto&& __rhs) { return std::invoke(__comp, __rhs, __lhs); }; + return ranges::__min_element_impl(__first, __last, __comp_lhs_rhs_swapped, __proj); + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Rp> operator()(_Rp&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + auto __comp_lhs_rhs_swapped = [&](auto&& __lhs, auto&& __rhs) { return std::invoke(__comp, __rhs, __lhs); }; + return ranges::__min_element_impl(ranges::begin(__r), ranges::end(__r), __comp_lhs_rhs_swapped, __proj); + } +}; +} // namespace __max_element + +inline namespace __cpo { + inline constexpr auto max_element = __max_element::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_MAX_ELEMENT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_merge.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_merge.h new file mode 100644 index 0000000..b36a05a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_merge.h @@ -0,0 +1,142 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MERGE_H +#define _LIBCPP___ALGORITHM_RANGES_MERGE_H + +#include <__algorithm/in_in_out_result.h> +#include <__algorithm/ranges_copy.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/mergeable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using merge_result = in_in_out_result<_InIter1, _InIter2, _OutIter>; + +namespace __merge { + +template < + class _InIter1, + class _Sent1, + class _InIter2, + class _Sent2, + class _OutIter, + class _Comp, + class _Proj1, + class _Proj2> +_LIBCPP_HIDE_FROM_ABI constexpr merge_result<__remove_cvref_t<_InIter1>, __remove_cvref_t<_InIter2>, __remove_cvref_t<_OutIter>> +__merge_impl( + _InIter1&& __first1, + _Sent1&& __last1, + _InIter2&& __first2, + _Sent2&& __last2, + _OutIter&& __result, + _Comp&& __comp, + _Proj1&& __proj1, + _Proj2&& __proj2) { + for (; __first1 != __last1 && __first2 != __last2; ++__result) { + if (std::invoke(__comp, std::invoke(__proj2, *__first2), std::invoke(__proj1, *__first1))) { + *__result = *__first2; + ++__first2; + } else { + *__result = *__first1; + ++__first1; + } + } + auto __ret1 = ranges::copy(std::move(__first1), std::move(__last1), std::move(__result)); + auto __ret2 = ranges::copy(std::move(__first2), std::move(__last2), std::move(__ret1.out)); + return {std::move(__ret1.in), std::move(__ret2.in), std::move(__ret2.out)}; +} + +struct __fn { + template < + input_iterator _InIter1, + sentinel_for<_InIter1> _Sent1, + input_iterator _InIter2, + sentinel_for<_InIter2> _Sent2, + weakly_incrementable _OutIter, + class _Comp = less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable<_InIter1, _InIter2, _OutIter, _Comp, _Proj1, _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr merge_result<_InIter1, _InIter2, _OutIter> operator()( + _InIter1 __first1, + _Sent1 __last1, + _InIter2 __first2, + _Sent2 __last2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + return __merge::__merge_impl(__first1, __last1, __first2, __last2, __result, __comp, __proj1, __proj2); + } + + template < + input_range _Range1, + input_range _Range2, + weakly_incrementable _OutIter, + class _Comp = less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable< + iterator_t<_Range1>, + iterator_t<_Range2>, + _OutIter, + _Comp, + _Proj1, + _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr merge_result, borrowed_iterator_t<_Range2>, _OutIter> + operator()( + _Range1&& __range1, + _Range2&& __range2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + return __merge::__merge_impl( + ranges::begin(__range1), + ranges::end(__range1), + ranges::begin(__range2), + ranges::end(__range2), + __result, + __comp, + __proj1, + __proj2); + } +}; + +} // namespace __merge + +inline namespace __cpo { + inline constexpr auto merge = __merge::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_MERGE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_min.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_min.h new file mode 100644 index 0000000..0e31f57 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_min.h @@ -0,0 +1,89 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MIN_H +#define _LIBCPP___ALGORITHM_RANGES_MIN_H + +#include <__algorithm/ranges_min_element.h> +#include <__assert> +#include <__concepts/copyable.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __min { +struct __fn { + template > _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + const _Tp& operator()(const _Tp& __a, const _Tp& __b, _Comp __comp = {}, _Proj __proj = {}) const { + return std::invoke(__comp, std::invoke(__proj, __b), std::invoke(__proj, __a)) ? __b : __a; + } + + template > _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Tp operator()(initializer_list<_Tp> __il, _Comp __comp = {}, _Proj __proj = {}) const { + _LIBCPP_ASSERT(__il.begin() != __il.end(), "initializer_list must contain at least one element"); + return *ranges::__min_element_impl(__il.begin(), __il.end(), __comp, __proj); + } + + template , _Proj>> _Comp = ranges::less> + requires indirectly_copyable_storable, range_value_t<_Rp>*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + range_value_t<_Rp> operator()(_Rp&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + auto __first = ranges::begin(__r); + auto __last = ranges::end(__r); + + _LIBCPP_ASSERT(__first != __last, "range must contain at least one element"); + + if constexpr (forward_range<_Rp>) { + return *ranges::__min_element_impl(__first, __last, __comp, __proj); + } else { + range_value_t<_Rp> __result = *__first; + while (++__first != __last) { + if (std::invoke(__comp, std::invoke(__proj, *__first), std::invoke(__proj, __result))) + __result = *__first; + } + return __result; + } + } +}; +} // namespace __min + +inline namespace __cpo { + inline constexpr auto min = __min::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP_STD_VER > 17 && + +#endif // _LIBCPP___ALGORITHM_RANGES_MIN_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_min_element.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_min_element.h new file mode 100644 index 0000000..1751874 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_min_element.h @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MIN_ELEMENT_H +#define _LIBCPP___ALGORITHM_RANGES_MIN_ELEMENT_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +// TODO(ranges): `ranges::min_element` can now simply delegate to `std::__min_element`. +template +_LIBCPP_HIDE_FROM_ABI static constexpr +_Ip __min_element_impl(_Ip __first, _Sp __last, _Comp& __comp, _Proj& __proj) { + if (__first == __last) + return __first; + + _Ip __i = __first; + while (++__i != __last) + if (std::invoke(__comp, std::invoke(__proj, *__i), std::invoke(__proj, *__first))) + __first = __i; + return __first; +} + +namespace __min_element { +struct __fn { + template _Sp, class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Ip operator()(_Ip __first, _Sp __last, _Comp __comp = {}, _Proj __proj = {}) const { + return ranges::__min_element_impl(__first, __last, __comp, __proj); + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Rp> operator()(_Rp&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + return ranges::__min_element_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); + } +}; +} // namespace __min_element + +inline namespace __cpo { + inline constexpr auto min_element = __min_element::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_MIN_ELEMENT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_minmax.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_minmax.h new file mode 100644 index 0000000..f82e005 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_minmax.h @@ -0,0 +1,134 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MINMAX_H +#define _LIBCPP___ALGORITHM_RANGES_MINMAX_H + +#include <__algorithm/min_max_result.h> +#include <__algorithm/minmax_element.h> +#include <__assert> +#include <__concepts/copyable.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +template +using minmax_result = min_max_result<_T1>; + +namespace __minmax { +struct __fn { + template > _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr ranges::minmax_result + operator()(const _Type& __a, const _Type& __b, _Comp __comp = {}, _Proj __proj = {}) const { + if (std::invoke(__comp, std::invoke(__proj, __b), std::invoke(__proj, __a))) + return {__b, __a}; + return {__a, __b}; + } + + template > _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + ranges::minmax_result<_Type> operator()(initializer_list<_Type> __il, _Comp __comp = {}, _Proj __proj = {}) const { + _LIBCPP_ASSERT(__il.begin() != __il.end(), "initializer_list has to contain at least one element"); + auto __iters = std::__minmax_element_impl(__il.begin(), __il.end(), __comp, __proj); + return ranges::minmax_result<_Type> { *__iters.first, *__iters.second }; + } + + template , _Proj>> _Comp = ranges::less> + requires indirectly_copyable_storable, range_value_t<_Range>*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + ranges::minmax_result> operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + auto __first = ranges::begin(__r); + auto __last = ranges::end(__r); + using _ValueT = range_value_t<_Range>; + + _LIBCPP_ASSERT(__first != __last, "range has to contain at least one element"); + + if constexpr (forward_range<_Range>) { + auto __result = std::__minmax_element_impl(__first, __last, __comp, __proj); + return {*__result.first, *__result.second}; + } else { + // input_iterators can't be copied, so the implementation for input_iterators has to store + // the values instead of a pointer to the correct values + auto __less = [&](auto&& __a, auto&& __b) -> bool { + return std::invoke(__comp, std::invoke(__proj, std::forward(__a)), + std::invoke(__proj, std::forward(__b))); + }; + + ranges::minmax_result<_ValueT> __result = {*__first, __result.min}; + if (__first == __last || ++__first == __last) + return __result; + + if (__less(*__first, __result.min)) + __result.min = *__first; + else + __result.max = *__first; + + while (++__first != __last) { + _ValueT __i = *__first; + if (++__first == __last) { + if (__less(__i, __result.min)) + __result.min = __i; + else if (!__less(__i, __result.max)) + __result.max = __i; + return __result; + } + + if (__less(*__first, __i)) { + if (__less(*__first, __result.min)) + __result.min = *__first; + if (!__less(__i, __result.max)) + __result.max = std::move(__i); + } else { + if (__less(__i, __result.min)) + __result.min = std::move(__i); + if (!__less(*__first, __result.max)) + __result.max = *__first; + } + } + return __result; + } + } +}; +} // namespace __minmax + +inline namespace __cpo { + inline constexpr auto minmax = __minmax::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_MINMAX_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_minmax_element.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_minmax_element.h new file mode 100644 index 0000000..6699f96 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_minmax_element.h @@ -0,0 +1,72 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MINMAX_ELEMENT_H +#define _LIBCPP___ALGORITHM_RANGES_MINMAX_ELEMENT_H + +#include <__algorithm/min_max_result.h> +#include <__algorithm/minmax_element.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using minmax_element_result = min_max_result<_T1>; + +namespace __minmax_element { +struct __fn { + template _Sp, class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + ranges::minmax_element_result<_Ip> operator()(_Ip __first, _Sp __last, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__minmax_element_impl(std::move(__first), std::move(__last), __comp, __proj); + return {__ret.first, __ret.second}; + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + ranges::minmax_element_result> + operator()(_Rp&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__minmax_element_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); + return {__ret.first, __ret.second}; + } +}; +} // namespace __minmax_element + +inline namespace __cpo { + inline constexpr auto minmax_element = __minmax_element::__fn{}; +} // namespace __cpo + +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_MINMAX_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_mismatch.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_mismatch.h new file mode 100644 index 0000000..4fd0517 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_mismatch.h @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MISMATCH_H +#define _LIBCPP___ALGORITHM_RANGES_MISMATCH_H + +#include <__algorithm/in_in_result.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/indirectly_comparable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { + +template +using mismatch_result = in_in_result<_I1, _I2>; + +namespace __mismatch { +struct __fn { + template + static _LIBCPP_HIDE_FROM_ABI constexpr + mismatch_result<_I1, _I2> + __go(_I1 __first1, _S1 __last1, _I2 __first2, _S2 __last2, + _Pred& __pred, _Proj1& __proj1, _Proj2& __proj2) { + while (__first1 != __last1 && __first2 != __last2) { + if (!std::invoke(__pred, std::invoke(__proj1, *__first1), std::invoke(__proj2, *__first2))) + break; + ++__first1; + ++__first2; + } + return {std::move(__first1), std::move(__first2)}; + } + + template _S1, + input_iterator _I2, sentinel_for<_I2> _S2, + class _Pred = ranges::equal_to, class _Proj1 = identity, class _Proj2 = identity> + requires indirectly_comparable<_I1, _I2, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + mismatch_result<_I1, _I2> operator()(_I1 __first1, _S1 __last1, _I2 __first2, _S2 __last2, + _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { + return __go(std::move(__first1), __last1, std::move(__first2), __last2, __pred, __proj1, __proj2); + } + + template + requires indirectly_comparable, iterator_t<_R2>, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + mismatch_result, borrowed_iterator_t<_R2>> + operator()(_R1&& __r1, _R2&& __r2, _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { + return __go(ranges::begin(__r1), ranges::end(__r1), ranges::begin(__r2), ranges::end(__r2), + __pred, __proj1, __proj2); + } +}; +} // namespace __mismatch + +inline namespace __cpo { + constexpr inline auto mismatch = __mismatch::__fn{}; +} // namespace __cpo +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_RANGES_MISMATCH_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_move.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_move.h new file mode 100644 index 0000000..46a0970 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_move.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MOVE_H +#define _LIBCPP___ALGORITHM_RANGES_MOVE_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/move.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using move_result = in_out_result<_InIter, _OutIter>; + +namespace __move { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + move_result<_InIter, _OutIter> __move_impl(_InIter __first, _Sent __last, _OutIter __result) { + auto __ret = std::__move<_RangeAlgPolicy>(std::move(__first), std::move(__last), std::move(__result)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template _Sent, weakly_incrementable _OutIter> + requires indirectly_movable<_InIter, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + move_result<_InIter, _OutIter> operator()(_InIter __first, _Sent __last, _OutIter __result) const { + return __move_impl(std::move(__first), std::move(__last), std::move(__result)); + } + + template + requires indirectly_movable, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + move_result, _OutIter> operator()(_Range&& __range, _OutIter __result) const { + return __move_impl(ranges::begin(__range), ranges::end(__range), std::move(__result)); + } + +}; +} // namespace __move + +inline namespace __cpo { + inline constexpr auto move = __move::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_MOVE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_move_backward.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_move_backward.h new file mode 100644 index 0000000..d4e8eb1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_move_backward.h @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_MOVE_BACKWARD_H +#define _LIBCPP___ALGORITHM_RANGES_MOVE_BACKWARD_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/move_backward.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/iter_move.h> +#include <__iterator/next.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using move_backward_result = in_out_result<_InIter, _OutIter>; + +namespace __move_backward { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + move_backward_result<_InIter, _OutIter> __move_backward_impl(_InIter __first, _Sent __last, _OutIter __result) { + auto __ret = std::__move_backward<_RangeAlgPolicy>(std::move(__first), std::move(__last), std::move(__result)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template _Sent, bidirectional_iterator _OutIter> + requires indirectly_movable<_InIter, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + move_backward_result<_InIter, _OutIter> operator()(_InIter __first, _Sent __last, _OutIter __result) const { + return __move_backward_impl(std::move(__first), std::move(__last), std::move(__result)); + } + + template + requires indirectly_movable, _Iter> + _LIBCPP_HIDE_FROM_ABI constexpr + move_backward_result, _Iter> operator()(_Range&& __range, _Iter __result) const { + return __move_backward_impl(ranges::begin(__range), ranges::end(__range), std::move(__result)); + } + +}; +} // namespace __move_backward + +inline namespace __cpo { + inline constexpr auto move_backward = __move_backward::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_MOVE_BACKWARD_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_next_permutation.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_next_permutation.h new file mode 100644 index 0000000..6c8e8e1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_next_permutation.h @@ -0,0 +1,73 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_NEXT_PERMUTATION_H +#define _LIBCPP___ALGORITHM_RANGES_NEXT_PERMUTATION_H + +#include <__algorithm/in_found_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/next_permutation.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using next_permutation_result = in_found_result<_InIter>; + +namespace __next_permutation { + +struct __fn { + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr next_permutation_result<_Iter> + operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + auto __result = std::__next_permutation<_RangeAlgPolicy>( + std::move(__first), std::move(__last), std::__make_projected(__comp, __proj)); + return {std::move(__result.first), std::move(__result.second)}; + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr next_permutation_result> + operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { + auto __result = std::__next_permutation<_RangeAlgPolicy>( + ranges::begin(__range), ranges::end(__range), std::__make_projected(__comp, __proj)); + return {std::move(__result.first), std::move(__result.second)}; + } +}; + +} // namespace __next_permutation + +inline namespace __cpo { +constexpr inline auto next_permutation = __next_permutation::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_NEXT_PERMUTATION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_none_of.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_none_of.h new file mode 100644 index 0000000..b39e570 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_none_of.h @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_NONE_OF_H +#define _LIBCPP___ALGORITHM_RANGES_NONE_OF_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __none_of { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr static + bool __none_of_impl(_Iter __first, _Sent __last, _Pred& __pred, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) + return false; + } + return true; + } + + template _Sent, class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Iter __first, _Sent __last, _Pred __pred = {}, _Proj __proj = {}) const { + return __none_of_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + bool operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { + return __none_of_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } +}; +} // namespace __none_of + +inline namespace __cpo { + inline constexpr auto none_of = __none_of::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_NONE_OF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_nth_element.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_nth_element.h new file mode 100644 index 0000000..d9ec4f1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_nth_element.h @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_NTH_ELEMENT_H +#define _LIBCPP___ALGORITHM_RANGES_NTH_ELEMENT_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/nth_element.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __nth_element { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter __nth_element_fn_impl(_Iter __first, _Iter __nth, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + + auto&& __projected_comp = std::__make_projected(__comp, __proj); + std::__nth_element_impl<_RangeAlgPolicy>(std::move(__first), std::move(__nth), __last_iter, __projected_comp); + + return __last_iter; + } + + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Iter __nth, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __nth_element_fn_impl(std::move(__first), std::move(__nth), std::move(__last), __comp, __proj); + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, iterator_t<_Range> __nth, _Comp __comp = {}, + _Proj __proj = {}) const { + return __nth_element_fn_impl(ranges::begin(__r), std::move(__nth), ranges::end(__r), __comp, __proj); + } +}; + +} // namespace __nth_element + +inline namespace __cpo { + inline constexpr auto nth_element = __nth_element::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_NTH_ELEMENT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_partial_sort.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partial_sort.h new file mode 100644 index 0000000..3ea0a7f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partial_sort.h @@ -0,0 +1,78 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_PARTIAL_SORT_H +#define _LIBCPP___ALGORITHM_RANGES_PARTIAL_SORT_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/partial_sort.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __partial_sort { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter __partial_sort_fn_impl(_Iter __first, _Iter __middle, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto&& __projected_comp = std::__make_projected(__comp, __proj); + return std::__partial_sort<_RangeAlgPolicy>(std::move(__first), std::move(__middle), __last, __projected_comp); + } + + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Iter __middle, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __partial_sort_fn_impl(std::move(__first), std::move(__middle), std::move(__last), __comp, __proj); + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, iterator_t<_Range> __middle, _Comp __comp = {}, + _Proj __proj = {}) const { + return __partial_sort_fn_impl(ranges::begin(__r), std::move(__middle), ranges::end(__r), __comp, __proj); + } +}; + +} // namespace __partial_sort + +inline namespace __cpo { + inline constexpr auto partial_sort = __partial_sort::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_PARTIAL_SORT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_partial_sort_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partial_sort_copy.h new file mode 100644 index 0000000..212db55 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partial_sort_copy.h @@ -0,0 +1,92 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_PARTIAL_SORT_COPY_H +#define _LIBCPP___ALGORITHM_RANGES_PARTIAL_SORT_COPY_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/partial_sort_copy.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using partial_sort_copy_result = in_out_result<_InIter, _OutIter>; + +namespace __partial_sort_copy { + +struct __fn { + + template _Sent1, + random_access_iterator _Iter2, sentinel_for<_Iter2> _Sent2, + class _Comp = ranges::less, class _Proj1 = identity, class _Proj2 = identity> + requires indirectly_copyable<_Iter1, _Iter2> && sortable<_Iter2, _Comp, _Proj2> && + indirect_strict_weak_order<_Comp, projected<_Iter1, _Proj1>, projected<_Iter2, _Proj2>> + _LIBCPP_HIDE_FROM_ABI constexpr + partial_sort_copy_result<_Iter1, _Iter2> + operator()(_Iter1 __first, _Sent1 __last, _Iter2 __result_first, _Sent2 __result_last, + _Comp __comp = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { + auto __result = std::__partial_sort_copy<_RangeAlgPolicy>( + std::move(__first), std::move(__last), std::move(__result_first), std::move(__result_last), + __comp, __proj1, __proj2 + ); + return {std::move(__result.first), std::move(__result.second)}; + } + + template + requires indirectly_copyable, iterator_t<_Range2>> && + sortable, _Comp, _Proj2> && + indirect_strict_weak_order<_Comp, projected, _Proj1>, + projected, _Proj2>> + _LIBCPP_HIDE_FROM_ABI constexpr + partial_sort_copy_result, borrowed_iterator_t<_Range2>> + operator()(_Range1&& __range, _Range2&& __result_range, _Comp __comp = {}, + _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { + auto __result = std::__partial_sort_copy<_RangeAlgPolicy>( + ranges::begin(__range), ranges::end(__range), ranges::begin(__result_range), ranges::end(__result_range), + __comp, __proj1, __proj2 + ); + return {std::move(__result.first), std::move(__result.second)}; + } + +}; + +} // namespace __partial_sort_copy + +inline namespace __cpo { + inline constexpr auto partial_sort_copy = __partial_sort_copy::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_PARTIAL_SORT_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition.h new file mode 100644 index 0000000..8b3aae5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition.h @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_PARTITION_H +#define _LIBCPP___ALGORITHM_RANGES_PARTITION_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/partition.h> +#include <__algorithm/ranges_iterator_concept.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/permutable.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/subrange.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __partition { + +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI static constexpr + subrange<__remove_cvref_t<_Iter>> __partition_fn_impl(_Iter&& __first, _Sent&& __last, _Pred&& __pred, _Proj&& __proj) { + auto&& __projected_pred = std::__make_projected(__pred, __proj); + auto __result = std::__partition<_RangeAlgPolicy>( + std::move(__first), std::move(__last), __projected_pred, __iterator_concept<_Iter>()); + + return {std::move(__result.first), std::move(__result.second)}; + } + + template _Sent, class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_HIDE_FROM_ABI constexpr + subrange<_Iter> operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {}) const { + return __partition_fn_impl(__first, __last, __pred, __proj); + } + + template , _Proj>> _Pred> + requires permutable> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_subrange_t<_Range> operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { + return __partition_fn_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } + +}; + +} // namespace __partition + +inline namespace __cpo { + inline constexpr auto partition = __partition::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_PARTITION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition_copy.h new file mode 100644 index 0000000..e7a9a34 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition_copy.h @@ -0,0 +1,98 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_PARTITION_COPY_H +#define _LIBCPP___ALGORITHM_RANGES_PARTITION_COPY_H + +#include <__algorithm/in_out_out_result.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using partition_copy_result = in_out_out_result<_InIter, _OutIter1, _OutIter2>; + +namespace __partition_copy { + +struct __fn { + + // TODO(ranges): delegate to the classic algorithm. + template + _LIBCPP_HIDE_FROM_ABI constexpr + static partition_copy_result< + __remove_cvref_t<_InIter>, __remove_cvref_t<_OutIter1>, __remove_cvref_t<_OutIter2> + > __partition_copy_fn_impl( _InIter&& __first, _Sent&& __last, _OutIter1&& __out_true, _OutIter2&& __out_false, + _Pred& __pred, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) { + *__out_true = *__first; + ++__out_true; + + } else { + *__out_false = *__first; + ++__out_false; + } + } + + return {std::move(__first), std::move(__out_true), std::move(__out_false)}; + } + + template _Sent, + weakly_incrementable _OutIter1, weakly_incrementable _OutIter2, + class _Proj = identity, indirect_unary_predicate> _Pred> + requires indirectly_copyable<_InIter, _OutIter1> && indirectly_copyable<_InIter, _OutIter2> + _LIBCPP_HIDE_FROM_ABI constexpr + partition_copy_result<_InIter, _OutIter1, _OutIter2> + operator()(_InIter __first, _Sent __last, _OutIter1 __out_true, _OutIter2 __out_false, + _Pred __pred, _Proj __proj = {}) const { + return __partition_copy_fn_impl( + std::move(__first), std::move(__last), std::move(__out_true), std::move(__out_false), __pred, __proj); + } + + template , _Proj>> _Pred> + requires indirectly_copyable, _OutIter1> && indirectly_copyable, _OutIter2> + _LIBCPP_HIDE_FROM_ABI constexpr + partition_copy_result, _OutIter1, _OutIter2> + operator()(_Range&& __range, _OutIter1 __out_true, _OutIter2 __out_false, _Pred __pred, _Proj __proj = {}) const { + return __partition_copy_fn_impl( + ranges::begin(__range), ranges::end(__range), std::move(__out_true), std::move(__out_false), __pred, __proj); + } + +}; + +} // namespace __partition_copy + +inline namespace __cpo { + inline constexpr auto partition_copy = __partition_copy::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_PARTITION_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition_point.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition_point.h new file mode 100644 index 0000000..2bd118d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_partition_point.h @@ -0,0 +1,88 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_PARTITION_POINT_H +#define _LIBCPP___ALGORITHM_RANGES_PARTITION_POINT_H + +#include <__algorithm/half_positive.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __partition_point { + +struct __fn { + + // TODO(ranges): delegate to the classic algorithm. + template + _LIBCPP_HIDE_FROM_ABI constexpr + static _Iter __partition_point_fn_impl(_Iter&& __first, _Sent&& __last, _Pred& __pred, _Proj& __proj) { + auto __len = ranges::distance(__first, __last); + + while (__len != 0) { + auto __half_len = std::__half_positive(__len); + auto __mid = ranges::next(__first, __half_len); + + if (std::invoke(__pred, std::invoke(__proj, *__mid))) { + __first = ++__mid; + __len -= __half_len + 1; + + } else { + __len = __half_len; + } + } + + return __first; + } + + template _Sent, class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {}) const { + return __partition_point_fn_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>> _Pred> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { + return __partition_point_fn_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } + +}; + +} // namespace __partition_point + +inline namespace __cpo { + inline constexpr auto partition_point = __partition_point::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_PARTITION_POINT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_pop_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_pop_heap.h new file mode 100644 index 0000000..65beec8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_pop_heap.h @@ -0,0 +1,81 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_POP_HEAP_H +#define _LIBCPP___ALGORITHM_RANGES_POP_HEAP_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/pop_heap.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __pop_heap { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter __pop_heap_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + auto __len = __last_iter - __first; + + auto&& __projected_comp = std::__make_projected(__comp, __proj); + std::__pop_heap<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp, __len); + + return __last_iter; + } + + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __pop_heap_fn_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + return __pop_heap_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); + } +}; + +} // namespace __pop_heap + +inline namespace __cpo { + inline constexpr auto pop_heap = __pop_heap::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_POP_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_prev_permutation.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_prev_permutation.h new file mode 100644 index 0000000..6866d90 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_prev_permutation.h @@ -0,0 +1,77 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_PREV_PERMUTATION_H +#define _LIBCPP___ALGORITHM_RANGES_PREV_PERMUTATION_H + +#include <__algorithm/in_found_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/prev_permutation.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using prev_permutation_result = in_found_result<_InIter>; + +namespace __prev_permutation { + +struct __fn { + + template _Sent, + class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr prev_permutation_result<_Iter> + operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + auto __result = std::__prev_permutation<_RangeAlgPolicy>( + std::move(__first), std::move(__last), std::__make_projected(__comp, __proj)); + return {std::move(__result.first), std::move(__result.second)}; + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr prev_permutation_result> + operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { + auto __result = std::__prev_permutation<_RangeAlgPolicy>( + ranges::begin(__range), ranges::end(__range), std::__make_projected(__comp, __proj)); + return {std::move(__result.first), std::move(__result.second)}; + } + +}; + +} // namespace __prev_permutation + +inline namespace __cpo { +constexpr inline auto prev_permutation = __prev_permutation::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_PREV_PERMUTATION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_push_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_push_heap.h new file mode 100644 index 0000000..a1f4347 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_push_heap.h @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_PUSH_HEAP_H +#define _LIBCPP___ALGORITHM_RANGES_PUSH_HEAP_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/push_heap.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __push_heap { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter __push_heap_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + + auto&& __projected_comp = std::__make_projected(__comp, __proj); + std::__push_heap<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp); + + return __last_iter; + } + + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __push_heap_fn_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + return __push_heap_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); + } +}; + +} // namespace __push_heap + +inline namespace __cpo { + inline constexpr auto push_heap = __push_heap::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_PUSH_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove.h new file mode 100644 index 0000000..dd5c5fb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove.h @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REMOVE_H +#define _LIBCPP___ALGORITHM_RANGES_REMOVE_H +#include <__config> + +#include <__algorithm/ranges_remove_if.h> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/permutable.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/subrange.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __remove { +struct __fn { + + template _Sent, class _Type, class _Proj = identity> + requires indirect_binary_predicate, const _Type*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + subrange<_Iter> operator()(_Iter __first, _Sent __last, const _Type& __value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __other) { return __value == __other; }; + return ranges::__remove_if_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template + requires permutable> + && indirect_binary_predicate, _Proj>, const _Type*> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_subrange_t<_Range> operator()(_Range&& __range, const _Type& __value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __other) { return __value == __other; }; + return ranges::__remove_if_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } +}; +} // namespace __remove + +inline namespace __cpo { + inline constexpr auto remove = __remove::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REMOVE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_copy.h new file mode 100644 index 0000000..2102228 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_copy.h @@ -0,0 +1,76 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REMOVE_COPY_H +#define _LIBCPP___ALGORITHM_RANGES_REMOVE_COPY_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/ranges_remove_copy_if.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using remove_copy_result = in_out_result<_InIter, _OutIter>; + +namespace __remove_copy { + + struct __fn { + template _Sent, + weakly_incrementable _OutIter, + class _Type, + class _Proj = identity> + requires indirectly_copyable<_InIter, _OutIter> && + indirect_binary_predicate, const _Type*> + _LIBCPP_HIDE_FROM_ABI constexpr remove_copy_result<_InIter, _OutIter> + operator()(_InIter __first, _Sent __last, _OutIter __result, const _Type& __value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __val) { return __value == __val; }; + return ranges::__remove_copy_if_impl(std::move(__first), std::move(__last), std::move(__result), __pred, __proj); + } + + template + requires indirectly_copyable, _OutIter> && + indirect_binary_predicate, _Proj>, const _Type*> + _LIBCPP_HIDE_FROM_ABI constexpr remove_copy_result, _OutIter> + operator()(_Range&& __range, _OutIter __result, const _Type& __value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __val) { return __value == __val; }; + return ranges::__remove_copy_if_impl( + ranges::begin(__range), ranges::end(__range), std::move(__result), __pred, __proj); + } + }; + +} // namespace __remove_copy + +inline namespace __cpo { + inline constexpr auto remove_copy = __remove_copy::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REMOVE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_copy_if.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_copy_if.h new file mode 100644 index 0000000..4fc6745 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_copy_if.h @@ -0,0 +1,90 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REMOVE_COPY_IF_H +#define _LIBCPP___ALGORITHM_RANGES_REMOVE_COPY_IF_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/remove_copy_if.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using remove_copy_if_result = in_out_result<_InIter, _OutIter>; + +template +_LIBCPP_HIDE_FROM_ABI constexpr in_out_result<_InIter, _OutIter> +__remove_copy_if_impl(_InIter __first, _Sent __last, _OutIter __result, _Pred& __pred, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (!std::invoke(__pred, std::invoke(__proj, *__first))) { + *__result = *__first; + ++__result; + } + } + return {std::move(__first), std::move(__result)}; +} + +namespace __remove_copy_if { + + struct __fn { + template _Sent, + weakly_incrementable _OutIter, + class _Proj = identity, + indirect_unary_predicate> _Pred> + requires indirectly_copyable<_InIter, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr remove_copy_if_result<_InIter, _OutIter> + operator()(_InIter __first, _Sent __last, _OutIter __result, _Pred __pred, _Proj __proj = {}) const { + return ranges::__remove_copy_if_impl(std::move(__first), std::move(__last), std::move(__result), __pred, __proj); + } + + template , _Proj>> _Pred> + requires indirectly_copyable, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr remove_copy_if_result, _OutIter> + operator()(_Range&& __range, _OutIter __result, _Pred __pred, _Proj __proj = {}) const { + return ranges::__remove_copy_if_impl( + ranges::begin(__range), ranges::end(__range), std::move(__result), __pred, __proj); + } + }; + +} // namespace __remove_copy_if + +inline namespace __cpo { + inline constexpr auto remove_copy_if = __remove_copy_if::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REMOVE_COPY_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_if.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_if.h new file mode 100644 index 0000000..1f17467 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_remove_if.h @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REMOVE_IF_H +#define _LIBCPP___ALGORITHM_RANGES_REMOVE_IF_H +#include <__config> + +#include <__algorithm/ranges_find_if.h> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iter_move.h> +#include <__iterator/permutable.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/subrange.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +_LIBCPP_HIDE_FROM_ABI constexpr +subrange<_Iter> __remove_if_impl(_Iter __first, _Sent __last, _Pred& __pred, _Proj& __proj) { + auto __new_end = ranges::__find_if_impl(__first, __last, __pred, __proj); + if (__new_end == __last) + return {__new_end, __new_end}; + + _Iter __i = __new_end; + while (++__i != __last) { + if (!std::invoke(__pred, std::invoke(__proj, *__i))) { + *__new_end = ranges::iter_move(__i); + ++__new_end; + } + } + return {__new_end, __i}; +} + +namespace __remove_if { +struct __fn { + + template _Sent, + class _Proj = identity, + indirect_unary_predicate> _Pred> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + subrange<_Iter> operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {}) const { + return ranges::__remove_if_impl(std::move(__first), std::move(__last), __pred, __proj); + } + + template , _Proj>> _Pred> + requires permutable> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_subrange_t<_Range> operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { + return ranges::__remove_if_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } + +}; +} // namespace __remove_if + +inline namespace __cpo { + inline constexpr auto remove_if = __remove_if::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REMOVE_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace.h new file mode 100644 index 0000000..8b12bea --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace.h @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REPLACE_H +#define _LIBCPP___ALGORITHM_RANGES_REPLACE_H + +#include <__algorithm/ranges_replace_if.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __replace { +struct __fn { + + template _Sent, + class _Type1, + class _Type2, + class _Proj = identity> + requires indirectly_writable<_Iter, const _Type2&> + && indirect_binary_predicate, const _Type1*> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, + const _Type1& __old_value, + const _Type2& __new_value, + _Proj __proj = {}) const { + auto __pred = [&](const auto& __val) { return __val == __old_value; }; + return ranges::__replace_if_impl(std::move(__first), std::move(__last), __pred, __new_value, __proj); + } + + template + requires indirectly_writable, const _Type2&> + && indirect_binary_predicate, _Proj>, const _Type1*> + _LIBCPP_HIDE_FROM_ABI constexpr borrowed_iterator_t<_Range> + operator()(_Range&& __range, const _Type1& __old_value, const _Type2& __new_value, _Proj __proj = {}) const { + auto __pred = [&](auto&& __val) { return __val == __old_value; }; + return ranges::__replace_if_impl(ranges::begin(__range), ranges::end(__range), __pred, __new_value, __proj); + } + +}; +} // namespace __replace + +inline namespace __cpo { + inline constexpr auto replace = __replace::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REPLACE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_copy.h new file mode 100644 index 0000000..f87a236 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_copy.h @@ -0,0 +1,91 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REPLACE_COPY_H +#define _LIBCPP___ALGORITHM_RANGES_REPLACE_COPY_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/ranges_replace_copy_if.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using replace_copy_result = in_out_result<_InIter, _OutIter>; + +namespace __replace_copy { + + struct __fn { + template _Sent, + class _OldType, + class _NewType, + output_iterator _OutIter, + class _Proj = identity> + requires indirectly_copyable<_InIter, _OutIter> && + indirect_binary_predicate, const _OldType*> + _LIBCPP_HIDE_FROM_ABI constexpr replace_copy_result<_InIter, _OutIter> + operator()(_InIter __first, + _Sent __last, + _OutIter __result, + const _OldType& __old_value, + const _NewType& __new_value, + _Proj __proj = {}) const { + auto __pred = [&](const auto& __value) { return __value == __old_value; }; + return ranges::__replace_copy_if_impl( + std::move(__first), std::move(__last), std::move(__result), __pred, __new_value, __proj); + } + + template _OutIter, + class _Proj = identity> + requires indirectly_copyable, _OutIter> && + indirect_binary_predicate, _Proj>, const _OldType*> + _LIBCPP_HIDE_FROM_ABI constexpr replace_copy_result, _OutIter> + operator()(_Range&& __range, + _OutIter __result, + const _OldType& __old_value, + const _NewType& __new_value, + _Proj __proj = {}) const { + auto __pred = [&](const auto& __value) { return __value == __old_value; }; + return ranges::__replace_copy_if_impl( + ranges::begin(__range), ranges::end(__range), std::move(__result), __pred, __new_value, __proj); + } + }; + +} // namespace __replace_copy + +inline namespace __cpo { + inline constexpr auto replace_copy = __replace_copy::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REPLACE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_copy_if.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_copy_if.h new file mode 100644 index 0000000..b8741ec --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_copy_if.h @@ -0,0 +1,93 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REPLACE_COPY_IF_H +#define _LIBCPP___ALGORITHM_RANGES_REPLACE_COPY_IF_H + +#include <__algorithm/in_out_result.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using replace_copy_if_result = in_out_result<_InIter, _OutIter>; + +template +_LIBCPP_HIDE_FROM_ABI constexpr replace_copy_if_result<_InIter, _OutIter> __replace_copy_if_impl( + _InIter __first, _Sent __last, _OutIter __result, _Pred& __pred, const _Type& __new_value, _Proj& __proj) { + while (__first != __last) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) + *__result = __new_value; + else + *__result = *__first; + + ++__first; + ++__result; + } + + return {std::move(__first), std::move(__result)}; +} + +namespace __replace_copy_if { + + struct __fn { + template _Sent, + class _Type, + output_iterator _OutIter, + class _Proj = identity, + indirect_unary_predicate> _Pred> + requires indirectly_copyable<_InIter, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr replace_copy_if_result<_InIter, _OutIter> operator()( + _InIter __first, _Sent __last, _OutIter __result, _Pred __pred, const _Type& __new_value, _Proj __proj = {}) + const { + return ranges::__replace_copy_if_impl( + std::move(__first), std::move(__last), std::move(__result), __pred, __new_value, __proj); + } + + template _OutIter, + class _Proj = identity, + indirect_unary_predicate, _Proj>> _Pred> + requires indirectly_copyable, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr replace_copy_if_result, _OutIter> + operator()(_Range&& __range, _OutIter __result, _Pred __pred, const _Type& __new_value, _Proj __proj = {}) const { + return ranges::__replace_copy_if_impl( + ranges::begin(__range), ranges::end(__range), std::move(__result), __pred, __new_value, __proj); + } + }; + +} // namespace __replace_copy_if + +inline namespace __cpo { + inline constexpr auto replace_copy_if = __replace_copy_if::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REPLACE_COPY_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_if.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_if.h new file mode 100644 index 0000000..65be3c7 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_replace_if.h @@ -0,0 +1,77 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REPLACE_IF_H +#define _LIBCPP___ALGORITHM_RANGES_REPLACE_IF_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +_LIBCPP_HIDE_FROM_ABI constexpr +_Iter __replace_if_impl(_Iter __first, _Sent __last, _Pred& __pred, const _Type& __new_value, _Proj& __proj) { + for (; __first != __last; ++__first) { + if (std::invoke(__pred, std::invoke(__proj, *__first))) + *__first = __new_value; + } + return __first; +} + +namespace __replace_if { +struct __fn { + + template _Sent, + class _Type, + class _Proj = identity, + indirect_unary_predicate> _Pred> + requires indirectly_writable<_Iter, const _Type&> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Pred __pred, const _Type& __new_value, _Proj __proj = {}) const { + return ranges::__replace_if_impl(std::move(__first), std::move(__last), __pred, __new_value, __proj); + } + + template , _Proj>> _Pred> + requires indirectly_writable, const _Type&> + _LIBCPP_HIDE_FROM_ABI constexpr borrowed_iterator_t<_Range> + operator()(_Range&& __range, _Pred __pred, const _Type& __new_value, _Proj __proj = {}) const { + return ranges::__replace_if_impl(ranges::begin(__range), ranges::end(__range), __pred, __new_value, __proj); + } + +}; +} // namespace __replace_if + +inline namespace __cpo { + inline constexpr auto replace_if = __replace_if::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REPLACE_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_reverse.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_reverse.h new file mode 100644 index 0000000..e2a5d9a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_reverse.h @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REVERSE_H +#define _LIBCPP___ALGORITHM_RANGES_REVERSE_H + +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/iter_swap.h> +#include <__iterator/next.h> +#include <__iterator/permutable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __reverse { +struct __fn { + + template _Sent> + requires permutable<_Iter> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last) const { + if constexpr (random_access_iterator<_Iter>) { + if (__first == __last) + return __first; + + auto __end = ranges::next(__first, __last); + auto __ret = __end; + + while (__first < --__end) { + ranges::iter_swap(__first, __end); + ++__first; + } + return __ret; + } else { + auto __end = ranges::next(__first, __last); + auto __ret = __end; + + while (__first != __end) { + if (__first == --__end) + break; + + ranges::iter_swap(__first, __end); + ++__first; + } + return __ret; + } + } + + template + requires permutable> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __range) const { + return (*this)(ranges::begin(__range), ranges::end(__range)); + } + +}; +} // namespace __reverse + +inline namespace __cpo { + inline constexpr auto reverse = __reverse::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REVERSE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_reverse_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_reverse_copy.h new file mode 100644 index 0000000..a84b1ad --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_reverse_copy.h @@ -0,0 +1,67 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_REVERSE_COPY_H +#define _LIBCPP___ALGORITHM_RANGES_REVERSE_COPY_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/ranges_copy.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/next.h> +#include <__iterator/reverse_iterator.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__ranges/subrange.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using reverse_copy_result = in_out_result<_InIter, _OutIter>; + +namespace __reverse_copy { +struct __fn { + + template _Sent, weakly_incrementable _OutIter> + requires indirectly_copyable<_InIter, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + reverse_copy_result<_InIter, _OutIter> operator()(_InIter __first, _Sent __last, _OutIter __result) const { + return (*this)(subrange(std::move(__first), std::move(__last)), std::move(__result)); + } + + template + requires indirectly_copyable, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + reverse_copy_result, _OutIter> operator()(_Range&& __range, _OutIter __result) const { + auto __ret = ranges::copy(std::__reverse_range(__range), std::move(__result)); + return {ranges::next(ranges::begin(__range), ranges::end(__range)), std::move(__ret.out)}; + } + +}; +} // namespace __reverse_copy + +inline namespace __cpo { + inline constexpr auto reverse_copy = __reverse_copy::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_REVERSE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_rotate.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_rotate.h new file mode 100644 index 0000000..91ed402 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_rotate.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_ROTATE_H +#define _LIBCPP___ALGORITHM_RANGES_ROTATE_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/ranges_iterator_concept.h> +#include <__algorithm/rotate.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/permutable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/subrange.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __rotate { + +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI constexpr + static subrange<_Iter> __rotate_fn_impl(_Iter __first, _Iter __middle, _Sent __last) { + auto __ret = std::__rotate<_RangeAlgPolicy>( + std::move(__first), std::move(__middle), std::move(__last)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template _Sent> + _LIBCPP_HIDE_FROM_ABI constexpr + subrange<_Iter> operator()(_Iter __first, _Iter __middle, _Sent __last) const { + return __rotate_fn_impl(std::move(__first), std::move(__middle), std::move(__last)); + } + + template + requires permutable> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_subrange_t<_Range> operator()(_Range&& __range, iterator_t<_Range> __middle) const { + return __rotate_fn_impl(ranges::begin(__range), std::move(__middle), ranges::end(__range)); + } + +}; + +} // namespace __rotate + +inline namespace __cpo { + inline constexpr auto rotate = __rotate::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_ROTATE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_rotate_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_rotate_copy.h new file mode 100644 index 0000000..52f403c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_rotate_copy.h @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_ROTATE_COPY_H +#define _LIBCPP___ALGORITHM_RANGES_ROTATE_COPY_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/ranges_copy.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/reverse_iterator.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using rotate_copy_result = in_out_result<_InIter, _OutIter>; + +namespace __rotate_copy { +struct __fn { + + template _Sent, weakly_incrementable _OutIter> + requires indirectly_copyable<_InIter, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + rotate_copy_result<_InIter, _OutIter> + operator()(_InIter __first, _InIter __middle, _Sent __last, _OutIter __result) const { + auto __res1 = ranges::copy(__middle, __last, std::move(__result)); + auto __res2 = ranges::copy(__first, __middle, std::move(__res1.out)); + return {std::move(__res1.in), std::move(__res2.out)}; + } + + template + requires indirectly_copyable, _OutIter> + _LIBCPP_HIDE_FROM_ABI constexpr + rotate_copy_result, _OutIter> + operator()(_Range&& __range, iterator_t<_Range> __middle, _OutIter __result) const { + return (*this)(ranges::begin(__range), std::move(__middle), ranges::end(__range), std::move(__result)); + } + +}; +} // namespace __rotate_copy + +inline namespace __cpo { + inline constexpr auto rotate_copy = __rotate_copy::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_ROTATE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_sample.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_sample.h new file mode 100644 index 0000000..a37cb64 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_sample.h @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SAMPLE_H +#define _LIBCPP___ALGORITHM_RANGES_SAMPLE_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/sample.h> +#include <__algorithm/uniform_random_bit_generator_adaptor.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__random/uniform_random_bit_generator.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __sample { + +struct __fn { + + template _Sent, weakly_incrementable _OutIter, class _Gen> + requires (forward_iterator<_Iter> || random_access_iterator<_OutIter>) && + indirectly_copyable<_Iter, _OutIter> && + uniform_random_bit_generator> + _LIBCPP_HIDE_FROM_ABI + _OutIter operator()(_Iter __first, _Sent __last, + _OutIter __out_first, iter_difference_t<_Iter> __n, _Gen&& __gen) const { + _ClassicGenAdaptor<_Gen> __adapted_gen(__gen); + return std::__sample<_RangeAlgPolicy>( + std::move(__first), std::move(__last), std::move(__out_first), __n, __adapted_gen); + } + + template + requires (forward_range<_Range> || random_access_iterator<_OutIter>) && + indirectly_copyable, _OutIter> && + uniform_random_bit_generator> + _LIBCPP_HIDE_FROM_ABI + _OutIter operator()(_Range&& __range, _OutIter __out_first, range_difference_t<_Range> __n, _Gen&& __gen) const { + return (*this)(ranges::begin(__range), ranges::end(__range), + std::move(__out_first), __n, std::forward<_Gen>(__gen)); + } + +}; + +} // namespace __sample + +inline namespace __cpo { + inline constexpr auto sample = __sample::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_SAMPLE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_search.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_search.h new file mode 100644 index 0000000..388d5af --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_search.h @@ -0,0 +1,135 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SEARCH_H +#define _LIBCPP___ALGORITHM_RANGES_SEARCH_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/search.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/advance.h> +#include <__iterator/concepts.h> +#include <__iterator/distance.h> +#include <__iterator/indirectly_comparable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/size.h> +#include <__ranges/subrange.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __search { +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI static constexpr subrange<_Iter1> __ranges_search_impl( + _Iter1 __first1, + _Sent1 __last1, + _Iter2 __first2, + _Sent2 __last2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2) { + if constexpr (sized_sentinel_for<_Sent2, _Iter2>) { + auto __size2 = ranges::distance(__first2, __last2); + if (__size2 == 0) + return {__first1, __first1}; + + if constexpr (sized_sentinel_for<_Sent1, _Iter1>) { + auto __size1 = ranges::distance(__first1, __last1); + if (__size1 < __size2) { + ranges::advance(__first1, __last1); + return {__first1, __first1}; + } + + if constexpr (random_access_iterator<_Iter1> && random_access_iterator<_Iter2>) { + auto __ret = std::__search_random_access_impl<_RangeAlgPolicy>( + __first1, __last1, __first2, __last2, __pred, __proj1, __proj2, __size1, __size2); + return {__ret.first, __ret.second}; + } + } + } + + auto __ret = + std::__search_forward_impl<_RangeAlgPolicy>(__first1, __last1, __first2, __last2, __pred, __proj1, __proj2); + return {__ret.first, __ret.second}; + } + + template _Sent1, + forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2, + class _Pred = ranges::equal_to, + class _Proj1 = identity, + class _Proj2 = identity> + requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + subrange<_Iter1> operator()(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred __pred = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + return __ranges_search_impl(__first1, __last1, __first2, __last2, __pred, __proj1, __proj2); + } + + template + requires indirectly_comparable, iterator_t<_Range2>, _Pred, _Proj1, _Proj2> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_subrange_t<_Range1> operator()(_Range1&& __range1, + _Range2&& __range2, + _Pred __pred = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __first1 = ranges::begin(__range1); + if constexpr (sized_range<_Range2>) { + auto __size2 = ranges::size(__range2); + if (__size2 == 0) + return {__first1, __first1}; + if constexpr (sized_range<_Range1>) { + auto __size1 = ranges::size(__range1); + if (__size1 < __size2) { + ranges::advance(__first1, ranges::end(__range1)); + return {__first1, __first1}; + } + } + } + + return __ranges_search_impl( + ranges::begin(__range1), + ranges::end(__range1), + ranges::begin(__range2), + ranges::end(__range2), + __pred, + __proj1, + __proj2); + } + +}; +} // namespace __search + +inline namespace __cpo { + inline constexpr auto search = __search::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_SEARCH_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_search_n.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_search_n.h new file mode 100644 index 0000000..56ec8f3 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_search_n.h @@ -0,0 +1,117 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SEARCH_N_H +#define _LIBCPP___ALGORITHM_RANGES_SEARCH_N_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/search_n.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/advance.h> +#include <__iterator/concepts.h> +#include <__iterator/distance.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/indirectly_comparable.h> +#include <__iterator/iterator_traits.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/size.h> +#include <__ranges/subrange.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __search_n { +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI static constexpr subrange<_Iter1> __ranges_search_n_impl( + _Iter1 __first, _Sent1 __last, _SizeT __count, const _Type& __value, _Pred& __pred, _Proj& __proj) { + if (__count == 0) + return {__first, __first}; + + if constexpr (sized_sentinel_for<_Sent1, _Iter1>) { + auto __size = ranges::distance(__first, __last); + if (__size < __count) { + ranges::advance(__first, __last); + return {__first, __first}; + } + + if constexpr (random_access_iterator<_Iter1>) { + auto __ret = std::__search_n_random_access_impl<_RangeAlgPolicy>( + __first, __last, __count, __value, __pred, __proj, __size); + return {std::move(__ret.first), std::move(__ret.second)}; + } + } + + auto __ret = std::__search_n_forward_impl<_RangeAlgPolicy>(__first, __last, + __count, + __value, + __pred, + __proj); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template _Sent, + class _Type, + class _Pred = ranges::equal_to, + class _Proj = identity> + requires indirectly_comparable<_Iter, const _Type*, _Pred, _Proj> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + subrange<_Iter> operator()(_Iter __first, _Sent __last, + iter_difference_t<_Iter> __count, + const _Type& __value, + _Pred __pred = {}, + _Proj __proj = _Proj{}) const { + return __ranges_search_n_impl(__first, __last, __count, __value, __pred, __proj); + } + + template + requires indirectly_comparable, const _Type*, _Pred, _Proj> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_subrange_t<_Range> operator()(_Range&& __range, + range_difference_t<_Range> __count, + const _Type& __value, + _Pred __pred = {}, + _Proj __proj = {}) const { + auto __first = ranges::begin(__range); + if (__count <= 0) + return {__first, __first}; + if constexpr (sized_range<_Range>) { + auto __size1 = ranges::size(__range); + if (__size1 < static_cast>(__count)) { + ranges::advance(__first, ranges::end(__range)); + return {__first, __first}; + } + } + + return __ranges_search_n_impl(ranges::begin(__range), ranges::end(__range), __count, __value, __pred, __proj); + } +}; +} // namespace __search_n + +inline namespace __cpo { + inline constexpr auto search_n = __search_n::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_SEARCH_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_difference.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_difference.h new file mode 100644 index 0000000..607dd68 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_difference.h @@ -0,0 +1,106 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SET_DIFFERENCE_H +#define _LIBCPP___ALGORITHM_RANGES_SET_DIFFERENCE_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/set_difference.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/mergeable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__type_traits/decay.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using set_difference_result = in_out_result<_InIter, _OutIter>; + +namespace __set_difference { + +struct __fn { + template < + input_iterator _InIter1, + sentinel_for<_InIter1> _Sent1, + input_iterator _InIter2, + sentinel_for<_InIter2> _Sent2, + weakly_incrementable _OutIter, + class _Comp = less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable<_InIter1, _InIter2, _OutIter, _Comp, _Proj1, _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr set_difference_result<_InIter1, _OutIter> operator()( + _InIter1 __first1, + _Sent1 __last1, + _InIter2 __first2, + _Sent2 __last2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__set_difference<_RangeAlgPolicy>( + __first1, __last1, __first2, __last2, __result, ranges::__make_projected_comp(__comp, __proj1, __proj2)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template < + input_range _Range1, + input_range _Range2, + weakly_incrementable _OutIter, + class _Comp = less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable, iterator_t<_Range2>, _OutIter, _Comp, _Proj1, _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr set_difference_result, _OutIter> + operator()( + _Range1&& __range1, + _Range2&& __range2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__set_difference<_RangeAlgPolicy>( + ranges::begin(__range1), + ranges::end(__range1), + ranges::begin(__range2), + ranges::end(__range2), + __result, + ranges::__make_projected_comp(__comp, __proj1, __proj2)); + return {std::move(__ret.first), std::move(__ret.second)}; + } +}; + +} // namespace __set_difference + +inline namespace __cpo { + inline constexpr auto set_difference = __set_difference::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 +#endif // _LIBCPP___ALGORITHM_RANGES_SET_DIFFERENCE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_intersection.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_intersection.h new file mode 100644 index 0000000..aa9fd24 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_intersection.h @@ -0,0 +1,117 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SET_INTERSECTION_H +#define _LIBCPP___ALGORITHM_RANGES_SET_INTERSECTION_H + +#include <__algorithm/in_in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/set_intersection.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/mergeable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using set_intersection_result = in_in_out_result<_InIter1, _InIter2, _OutIter>; + +namespace __set_intersection { + +struct __fn { + template < + input_iterator _InIter1, + sentinel_for<_InIter1> _Sent1, + input_iterator _InIter2, + sentinel_for<_InIter2> _Sent2, + weakly_incrementable _OutIter, + class _Comp = less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable<_InIter1, _InIter2, _OutIter, _Comp, _Proj1, _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr set_intersection_result<_InIter1, _InIter2, _OutIter> operator()( + _InIter1 __first1, + _Sent1 __last1, + _InIter2 __first2, + _Sent2 __last2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__set_intersection<_RangeAlgPolicy>( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + ranges::__make_projected_comp(__comp, __proj1, __proj2)); + return {std::move(__ret.__in1_), std::move(__ret.__in2_), std::move(__ret.__out_)}; + } + + template < + input_range _Range1, + input_range _Range2, + weakly_incrementable _OutIter, + class _Comp = less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable< + iterator_t<_Range1>, + iterator_t<_Range2>, + _OutIter, + _Comp, + _Proj1, + _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr set_intersection_result, + borrowed_iterator_t<_Range2>, + _OutIter> + operator()( + _Range1&& __range1, + _Range2&& __range2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__set_intersection<_RangeAlgPolicy>( + ranges::begin(__range1), + ranges::end(__range1), + ranges::begin(__range2), + ranges::end(__range2), + std::move(__result), + ranges::__make_projected_comp(__comp, __proj1, __proj2)); + return {std::move(__ret.__in1_), std::move(__ret.__in2_), std::move(__ret.__out_)}; + } +}; + +} // namespace __set_intersection + +inline namespace __cpo { + inline constexpr auto set_intersection = __set_intersection::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 +#endif // _LIBCPP___ALGORITHM_RANGES_SET_INTERSECTION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_symmetric_difference.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_symmetric_difference.h new file mode 100644 index 0000000..bc4a906 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_symmetric_difference.h @@ -0,0 +1,117 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SET_SYMMETRIC_DIFFERENCE_H +#define _LIBCPP___ALGORITHM_RANGES_SET_SYMMETRIC_DIFFERENCE_H + +#include <__algorithm/in_in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/set_symmetric_difference.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/mergeable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using set_symmetric_difference_result = in_in_out_result<_InIter1, _InIter2, _OutIter>; + +namespace __set_symmetric_difference { + +struct __fn { + template < + input_iterator _InIter1, + sentinel_for<_InIter1> _Sent1, + input_iterator _InIter2, + sentinel_for<_InIter2> _Sent2, + weakly_incrementable _OutIter, + class _Comp = ranges::less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable<_InIter1, _InIter2, _OutIter, _Comp, _Proj1, _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr set_symmetric_difference_result<_InIter1, _InIter2, _OutIter> operator()( + _InIter1 __first1, + _Sent1 __last1, + _InIter2 __first2, + _Sent2 __last2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__set_symmetric_difference<_RangeAlgPolicy>( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + ranges::__make_projected_comp(__comp, __proj1, __proj2)); + return {std::move(__ret.__in1_), std::move(__ret.__in2_), std::move(__ret.__out_)}; + } + + template < + input_range _Range1, + input_range _Range2, + weakly_incrementable _OutIter, + class _Comp = ranges::less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable< + iterator_t<_Range1>, + iterator_t<_Range2>, + _OutIter, + _Comp, + _Proj1, + _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr set_symmetric_difference_result, + borrowed_iterator_t<_Range2>, + _OutIter> + operator()( + _Range1&& __range1, + _Range2&& __range2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__set_symmetric_difference<_RangeAlgPolicy>( + ranges::begin(__range1), + ranges::end(__range1), + ranges::begin(__range2), + ranges::end(__range2), + std::move(__result), + ranges::__make_projected_comp(__comp, __proj1, __proj2)); + return {std::move(__ret.__in1_), std::move(__ret.__in2_), std::move(__ret.__out_)}; + } +}; + +} // namespace __set_symmetric_difference + +inline namespace __cpo { + inline constexpr auto set_symmetric_difference = __set_symmetric_difference::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 +#endif // _LIBCPP___ALGORITHM_RANGES_SET_SYMMETRIC_DIFFERENCE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_union.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_union.h new file mode 100644 index 0000000..f8cd45c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_set_union.h @@ -0,0 +1,121 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SET_UNION_H +#define _LIBCPP___ALGORITHM_RANGES_SET_UNION_H + +#include <__algorithm/in_in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/set_union.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/mergeable.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using set_union_result = in_in_out_result<_InIter1, _InIter2, _OutIter>; + +namespace __set_union { + +struct __fn { + template < + input_iterator _InIter1, + sentinel_for<_InIter1> _Sent1, + input_iterator _InIter2, + sentinel_for<_InIter2> _Sent2, + weakly_incrementable _OutIter, + class _Comp = ranges::less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable<_InIter1, _InIter2, _OutIter, _Comp, _Proj1, _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr set_union_result<_InIter1, _InIter2, _OutIter> operator()( + _InIter1 __first1, + _Sent1 __last1, + _InIter2 __first2, + _Sent2 __last2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__set_union<_RangeAlgPolicy>( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + ranges::__make_projected_comp(__comp, __proj1, __proj2)); + return {std::move(__ret.__in1_), std::move(__ret.__in2_), std::move(__ret.__out_)}; + } + + template < + input_range _Range1, + input_range _Range2, + weakly_incrementable _OutIter, + class _Comp = ranges::less, + class _Proj1 = identity, + class _Proj2 = identity> + requires mergeable< + iterator_t<_Range1>, + iterator_t<_Range2>, + _OutIter, + _Comp, + _Proj1, + _Proj2> + _LIBCPP_HIDE_FROM_ABI constexpr set_union_result, + borrowed_iterator_t<_Range2>, + _OutIter> + operator()( + _Range1&& __range1, + _Range2&& __range2, + _OutIter __result, + _Comp __comp = {}, + _Proj1 __proj1 = {}, + _Proj2 __proj2 = {}) const { + auto __ret = std::__set_union<_RangeAlgPolicy>( + ranges::begin(__range1), + ranges::end(__range1), + ranges::begin(__range2), + ranges::end(__range2), + std::move(__result), + ranges::__make_projected_comp(__comp, __proj1, __proj2)); + return {std::move(__ret.__in1_), std::move(__ret.__in2_), std::move(__ret.__out_)}; + } +}; + +} // namespace __set_union + +inline namespace __cpo { + inline constexpr auto set_union = __set_union::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_SET_UNION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_shuffle.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_shuffle.h new file mode 100644 index 0000000..a2f2c0e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_shuffle.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SHUFFLE_H +#define _LIBCPP___ALGORITHM_RANGES_SHUFFLE_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/shuffle.h> +#include <__algorithm/uniform_random_bit_generator_adaptor.h> +#include <__config> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/permutable.h> +#include <__random/uniform_random_bit_generator.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __shuffle { + +struct __fn { + + template _Sent, class _Gen> + requires permutable<_Iter> && uniform_random_bit_generator> + _LIBCPP_HIDE_FROM_ABI + _Iter operator()(_Iter __first, _Sent __last, _Gen&& __gen) const { + _ClassicGenAdaptor<_Gen> __adapted_gen(__gen); + return std::__shuffle<_RangeAlgPolicy>(std::move(__first), std::move(__last), __adapted_gen); + } + + template + requires permutable> && uniform_random_bit_generator> + _LIBCPP_HIDE_FROM_ABI + borrowed_iterator_t<_Range> operator()(_Range&& __range, _Gen&& __gen) const { + return (*this)(ranges::begin(__range), ranges::end(__range), std::forward<_Gen>(__gen)); + } + +}; + +} // namespace __shuffle + +inline namespace __cpo { + inline constexpr auto shuffle = __shuffle::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_SHUFFLE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_sort.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_sort.h new file mode 100644 index 0000000..32391df --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_sort.h @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SORT_H +#define _LIBCPP___ALGORITHM_RANGES_SORT_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/sort.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __sort { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter __sort_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + + auto&& __projected_comp = std::__make_projected(__comp, __proj); + std::__sort_impl<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp); + + return __last_iter; + } + + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __sort_fn_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + return __sort_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); + } +}; + +} // namespace __sort + +inline namespace __cpo { + inline constexpr auto sort = __sort::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_SORT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_sort_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_sort_heap.h new file mode 100644 index 0000000..9feb0f6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_sort_heap.h @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SORT_HEAP_H +#define _LIBCPP___ALGORITHM_RANGES_SORT_HEAP_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/sort_heap.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __sort_heap { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI constexpr static + _Iter __sort_heap_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + + auto&& __projected_comp = std::__make_projected(__comp, __proj); + std::__sort_heap<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp); + + return __last_iter; + } + + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __sort_heap_fn_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + return __sort_heap_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); + } +}; + +} // namespace __sort_heap + +inline namespace __cpo { + inline constexpr auto sort_heap = __sort_heap::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_SORT_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_stable_partition.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_stable_partition.h new file mode 100644 index 0000000..c3469f1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_stable_partition.h @@ -0,0 +1,88 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_STABLE_PARTITION_H +#define _LIBCPP___ALGORITHM_RANGES_STABLE_PARTITION_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/ranges_iterator_concept.h> +#include <__algorithm/stable_partition.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/permutable.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__ranges/subrange.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __stable_partition { + +struct __fn { + + template + _LIBCPP_HIDE_FROM_ABI static + subrange<__remove_cvref_t<_Iter>> __stable_partition_fn_impl( + _Iter&& __first, _Sent&& __last, _Pred&& __pred, _Proj&& __proj) { + auto __last_iter = ranges::next(__first, __last); + + auto&& __projected_pred = std::__make_projected(__pred, __proj); + auto __result = std::__stable_partition<_RangeAlgPolicy>( + std::move(__first), __last_iter, __projected_pred, __iterator_concept<_Iter>()); + + return {std::move(__result), std::move(__last_iter)}; + } + + template _Sent, class _Proj = identity, + indirect_unary_predicate> _Pred> + requires permutable<_Iter> + _LIBCPP_HIDE_FROM_ABI + subrange<_Iter> operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {}) const { + return __stable_partition_fn_impl(__first, __last, __pred, __proj); + } + + template , _Proj>> _Pred> + requires permutable> + _LIBCPP_HIDE_FROM_ABI + borrowed_subrange_t<_Range> operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { + return __stable_partition_fn_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); + } + +}; + +} // namespace __stable_partition + +inline namespace __cpo { + inline constexpr auto stable_partition = __stable_partition::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_STABLE_PARTITION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_stable_sort.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_stable_sort.h new file mode 100644 index 0000000..d3c48dd --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_stable_sort.h @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_STABLE_SORT_H +#define _LIBCPP___ALGORITHM_RANGES_STABLE_SORT_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/stable_sort.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/projected.h> +#include <__iterator/sortable.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __stable_sort { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI + static _Iter __stable_sort_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { + auto __last_iter = ranges::next(__first, __last); + + auto&& __projected_comp = std::__make_projected(__comp, __proj); + std::__stable_sort_impl<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp); + + return __last_iter; + } + + template _Sent, class _Comp = ranges::less, class _Proj = identity> + requires sortable<_Iter, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI + _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + return __stable_sort_fn_impl(std::move(__first), std::move(__last), __comp, __proj); + } + + template + requires sortable, _Comp, _Proj> + _LIBCPP_HIDE_FROM_ABI + borrowed_iterator_t<_Range> operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { + return __stable_sort_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); + } +}; + +} // namespace __stable_sort + +inline namespace __cpo { + inline constexpr auto stable_sort = __stable_sort::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_STABLE_SORT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_swap_ranges.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_swap_ranges.h new file mode 100644 index 0000000..552fd55 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_swap_ranges.h @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_SWAP_RANGES_H +#define _LIBCPP___ALGORITHM_RANGES_SWAP_RANGES_H + +#include <__algorithm/in_in_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/swap_ranges.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/iter_swap.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using swap_ranges_result = in_in_result<_I1, _I2>; + +namespace __swap_ranges { +struct __fn { + template _S1, + input_iterator _I2, sentinel_for<_I2> _S2> + requires indirectly_swappable<_I1, _I2> + _LIBCPP_HIDE_FROM_ABI constexpr swap_ranges_result<_I1, _I2> + operator()(_I1 __first1, _S1 __last1, _I2 __first2, _S2 __last2) const { + auto __ret = std::__swap_ranges<_RangeAlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template + requires indirectly_swappable, iterator_t<_R2>> + _LIBCPP_HIDE_FROM_ABI constexpr + swap_ranges_result, borrowed_iterator_t<_R2>> + operator()(_R1&& __r1, _R2&& __r2) const { + return operator()(ranges::begin(__r1), ranges::end(__r1), + ranges::begin(__r2), ranges::end(__r2)); + } +}; +} // namespace __swap_ranges + +inline namespace __cpo { + inline constexpr auto swap_ranges = __swap_ranges::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_SWAP_RANGES_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_transform.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_transform.h new file mode 100644 index 0000000..c0981a0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_transform.h @@ -0,0 +1,170 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_TRANSFORM_H +#define _LIBCPP___ALGORITHM_RANGES_TRANSFORM_H + +#include <__algorithm/in_in_out_result.h> +#include <__algorithm/in_out_result.h> +#include <__concepts/constructible.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using unary_transform_result = in_out_result<_Ip, _Op>; + +template +using binary_transform_result = in_in_out_result<_I1, _I2, _O1>; + +namespace __transform { +struct __fn { +private: + template + _LIBCPP_HIDE_FROM_ABI static constexpr + unary_transform_result<_InIter, _OutIter> __unary(_InIter __first, _Sent __last, + _OutIter __result, + _Func& __operation, + _Proj& __projection) { + while (__first != __last) { + *__result = std::invoke(__operation, std::invoke(__projection, *__first)); + ++__first; + ++__result; + } + + return {std::move(__first), std::move(__result)}; + } + + template + _LIBCPP_HIDE_FROM_ABI static constexpr binary_transform_result<_InIter1, _InIter2, _OutIter> + __binary(_InIter1 __first1, _Sent1 __last1, + _InIter2 __first2, _Sent2 __last2, + _OutIter __result, + _Func& __binary_operation, + _Proj1& __projection1, + _Proj2& __projection2) { + while (__first1 != __last1 && __first2 != __last2) { + *__result = std::invoke(__binary_operation, std::invoke(__projection1, *__first1), + std::invoke(__projection2, *__first2)); + ++__first1; + ++__first2; + ++__result; + } + return {std::move(__first1), std::move(__first2), std::move(__result)}; + } +public: + template _Sent, + weakly_incrementable _OutIter, + copy_constructible _Func, + class _Proj = identity> + requires indirectly_writable<_OutIter, indirect_result_t<_Func&, projected<_InIter, _Proj>>> + _LIBCPP_HIDE_FROM_ABI constexpr + unary_transform_result<_InIter, _OutIter> operator()(_InIter __first, _Sent __last, + _OutIter __result, + _Func __operation, + _Proj __proj = {}) const { + return __unary(std::move(__first), std::move(__last), std::move(__result), __operation, __proj); + } + + template + requires indirectly_writable<_OutIter, indirect_result_t<_Func, projected, _Proj>>> + _LIBCPP_HIDE_FROM_ABI constexpr + unary_transform_result, _OutIter> operator()(_Range&& __range, + _OutIter __result, + _Func __operation, + _Proj __projection = {}) const { + return __unary(ranges::begin(__range), ranges::end(__range), std::move(__result), __operation, __projection); + } + + template _Sent1, + input_iterator _InIter2, sentinel_for<_InIter2> _Sent2, + weakly_incrementable _OutIter, + copy_constructible _Func, + class _Proj1 = identity, + class _Proj2 = identity> + requires indirectly_writable<_OutIter, indirect_result_t<_Func&, projected<_InIter1, _Proj1>, + projected<_InIter2, _Proj2>>> + _LIBCPP_HIDE_FROM_ABI constexpr + binary_transform_result<_InIter1, _InIter2, _OutIter> operator()(_InIter1 __first1, _Sent1 __last1, + _InIter2 __first2, _Sent2 __last2, + _OutIter __result, + _Func __binary_operation, + _Proj1 __projection1 = {}, + _Proj2 __projection2 = {}) const { + return __binary(std::move(__first1), std::move(__last1), + std::move(__first2), std::move(__last2), + std::move(__result), + __binary_operation, + __projection1, + __projection2); + } + + template + requires indirectly_writable<_OutIter, indirect_result_t<_Func&, projected, _Proj1>, + projected, _Proj2>>> + _LIBCPP_HIDE_FROM_ABI constexpr + binary_transform_result, borrowed_iterator_t<_Range2>, _OutIter> + operator()(_Range1&& __range1, + _Range2&& __range2, + _OutIter __result, + _Func __binary_operation, + _Proj1 __projection1 = {}, + _Proj2 __projection2 = {}) const { + return __binary(ranges::begin(__range1), ranges::end(__range1), + ranges::begin(__range2), ranges::end(__range2), + std::move(__result), + __binary_operation, + __projection1, + __projection2); + } + +}; +} // namespace __transform + +inline namespace __cpo { + inline constexpr auto transform = __transform::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_TRANSFORM_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_unique.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_unique.h new file mode 100644 index 0000000..be427cc --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_unique.h @@ -0,0 +1,79 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_UNIQUE_H +#define _LIBCPP___ALGORITHM_RANGES_UNIQUE_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/unique.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/permutable.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__ranges/subrange.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __unique { + + struct __fn { + template < + permutable _Iter, + sentinel_for<_Iter> _Sent, + class _Proj = identity, + indirect_equivalence_relation> _Comp = ranges::equal_to> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr subrange<_Iter> + operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__unique<_RangeAlgPolicy>( + std::move(__first), std::move(__last), std::__make_projected(__comp, __proj)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template < + forward_range _Range, + class _Proj = identity, + indirect_equivalence_relation, _Proj>> _Comp = ranges::equal_to> + requires permutable> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr borrowed_subrange_t<_Range> + operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__unique<_RangeAlgPolicy>( + ranges::begin(__range), ranges::end(__range), std::__make_projected(__comp, __proj)); + return {std::move(__ret.first), std::move(__ret.second)}; + } + }; + +} // namespace __unique + +inline namespace __cpo { + inline constexpr auto unique = __unique::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_UNIQUE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_unique_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_unique_copy.h new file mode 100644 index 0000000..3ad47b0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_unique_copy.h @@ -0,0 +1,116 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_UNIQUE_COPY_H +#define _LIBCPP___ALGORITHM_RANGES_UNIQUE_COPY_H + +#include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/make_projected.h> +#include <__algorithm/unique_copy.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/projected.h> +#include <__iterator/readable_traits.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +template +using unique_copy_result = in_out_result<_InIter, _OutIter>; + +namespace __unique_copy { + +template +concept __can_reread_from_output = (input_iterator<_OutIter> && same_as, iter_value_t<_OutIter>>); + +struct __fn { + template + static consteval auto __get_algo_tag() { + if constexpr (forward_iterator<_InIter>) { + return __unique_copy_tags::__reread_from_input_tag{}; + } else if constexpr (__can_reread_from_output<_InIter, _OutIter>) { + return __unique_copy_tags::__reread_from_output_tag{}; + } else if constexpr (indirectly_copyable_storable<_InIter, _OutIter>) { + return __unique_copy_tags::__read_from_tmp_value_tag{}; + } + } + + template + using __algo_tag_t = decltype(__get_algo_tag<_InIter, _OutIter>()); + + template _Sent, + weakly_incrementable _OutIter, + class _Proj = identity, + indirect_equivalence_relation> _Comp = ranges::equal_to> + requires indirectly_copyable<_InIter, _OutIter> && + (forward_iterator<_InIter> || + (input_iterator<_OutIter> && same_as, iter_value_t<_OutIter>>) || + indirectly_copyable_storable<_InIter, _OutIter>) + _LIBCPP_HIDE_FROM_ABI constexpr unique_copy_result<_InIter, _OutIter> + operator()(_InIter __first, _Sent __last, _OutIter __result, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__unique_copy<_RangeAlgPolicy>( + std::move(__first), + std::move(__last), + std::move(__result), + std::__make_projected(__comp, __proj), + __algo_tag_t<_InIter, _OutIter>()); + return {std::move(__ret.first), std::move(__ret.second)}; + } + + template , _Proj>> _Comp = ranges::equal_to> + requires indirectly_copyable, _OutIter> && + (forward_iterator> || + (input_iterator<_OutIter> && same_as, iter_value_t<_OutIter>>) || + indirectly_copyable_storable, _OutIter>) + _LIBCPP_HIDE_FROM_ABI constexpr unique_copy_result, _OutIter> + operator()(_Range&& __range, _OutIter __result, _Comp __comp = {}, _Proj __proj = {}) const { + auto __ret = std::__unique_copy<_RangeAlgPolicy>( + ranges::begin(__range), + ranges::end(__range), + std::move(__result), + std::__make_projected(__comp, __proj), + __algo_tag_t, _OutIter>()); + return {std::move(__ret.first), std::move(__ret.second)}; + } +}; + +} // namespace __unique_copy + +inline namespace __cpo { +inline constexpr auto unique_copy = __unique_copy::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_UNIQUE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/ranges_upper_bound.h b/app/src/main/cpp/libcxx/include/__algorithm/ranges_upper_bound.h new file mode 100644 index 0000000..a134080 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/ranges_upper_bound.h @@ -0,0 +1,75 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_UPPER_BOUND_H +#define _LIBCPP___ALGORITHM_RANGES_UPPER_BOUND_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/lower_bound.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/dangling.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { +namespace __upper_bound { +struct __fn { + template _Sent, class _Type, class _Proj = identity, + indirect_strict_weak_order> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + _Iter operator()(_Iter __first, _Sent __last, const _Type& __value, _Comp __comp = {}, _Proj __proj = {}) const { + auto __comp_lhs_rhs_swapped = [&](const auto& __lhs, const auto& __rhs) { + return !std::invoke(__comp, __rhs, __lhs); + }; + + return std::__lower_bound_impl<_RangeAlgPolicy>(__first, __last, __value, __comp_lhs_rhs_swapped, __proj); + } + + template , _Proj>> _Comp = ranges::less> + _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr + borrowed_iterator_t<_Range> operator()(_Range&& __r, + const _Type& __value, + _Comp __comp = {}, + _Proj __proj = {}) const { + auto __comp_lhs_rhs_swapped = [&](const auto& __lhs, const auto& __rhs) { + return !std::invoke(__comp, __rhs, __lhs); + }; + + return std::__lower_bound_impl<_RangeAlgPolicy>(ranges::begin(__r), + ranges::end(__r), + __value, + __comp_lhs_rhs_swapped, + __proj); + } +}; +} // namespace __upper_bound + +inline namespace __cpo { + inline constexpr auto upper_bound = __upper_bound::__fn{}; +} // namespace __cpo +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_UPPER_BOUND_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/remove.h b/app/src/main/cpp/libcxx/include/__algorithm/remove.h new file mode 100644 index 0000000..533e41b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/remove.h @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REMOVE_H +#define _LIBCPP___ALGORITHM_REMOVE_H + +#include <__algorithm/find.h> +#include <__algorithm/find_if.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) +{ + __first = _VSTD::find(__first, __last, __value); + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (!(*__i == __value)) + { + *__first = _VSTD::move(*__i); + ++__first; + } + } + } + return __first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REMOVE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/remove_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/remove_copy.h new file mode 100644 index 0000000..ecba08a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/remove_copy.h @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REMOVE_COPY_H +#define _LIBCPP___ALGORITHM_REMOVE_COPY_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +remove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value) +{ + for (; __first != __last; ++__first) + { + if (!(*__first == __value)) + { + *__result = *__first; + ++__result; + } + } + return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REMOVE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/remove_copy_if.h b/app/src/main/cpp/libcxx/include/__algorithm/remove_copy_if.h new file mode 100644 index 0000000..2f235fd --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/remove_copy_if.h @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REMOVE_COPY_IF_H +#define _LIBCPP___ALGORITHM_REMOVE_COPY_IF_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +remove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred) +{ + for (; __first != __last; ++__first) + { + if (!__pred(*__first)) + { + *__result = *__first; + ++__result; + } + } + return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REMOVE_COPY_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/remove_if.h b/app/src/main/cpp/libcxx/include/__algorithm/remove_if.h new file mode 100644 index 0000000..2735072 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/remove_if.h @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REMOVE_IF_H +#define _LIBCPP___ALGORITHM_REMOVE_IF_H + +#include <__algorithm/find_if.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) +{ + __first = _VSTD::find_if<_ForwardIterator, _Predicate&>(__first, __last, __pred); + if (__first != __last) + { + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (!__pred(*__i)) + { + *__first = _VSTD::move(*__i); + ++__first; + } + } + } + return __first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REMOVE_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/replace.h b/app/src/main/cpp/libcxx/include/__algorithm/replace.h new file mode 100644 index 0000000..ce62150 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/replace.h @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REPLACE_H +#define _LIBCPP___ALGORITHM_REPLACE_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +replace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value) +{ + for (; __first != __last; ++__first) + if (*__first == __old_value) + *__first = __new_value; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REPLACE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/replace_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/replace_copy.h new file mode 100644 index 0000000..bebb14c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/replace_copy.h @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REPLACE_COPY_H +#define _LIBCPP___ALGORITHM_REPLACE_COPY_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +replace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, + const _Tp& __old_value, const _Tp& __new_value) +{ + for (; __first != __last; ++__first, (void) ++__result) + if (*__first == __old_value) + *__result = __new_value; + else + *__result = *__first; + return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REPLACE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/replace_copy_if.h b/app/src/main/cpp/libcxx/include/__algorithm/replace_copy_if.h new file mode 100644 index 0000000..e1ddb52 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/replace_copy_if.h @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REPLACE_COPY_IF_H +#define _LIBCPP___ALGORITHM_REPLACE_COPY_IF_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +replace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, + _Predicate __pred, const _Tp& __new_value) +{ + for (; __first != __last; ++__first, (void) ++__result) + if (__pred(*__first)) + *__result = __new_value; + else + *__result = *__first; + return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REPLACE_COPY_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/replace_if.h b/app/src/main/cpp/libcxx/include/__algorithm/replace_if.h new file mode 100644 index 0000000..b3a3367 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/replace_if.h @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REPLACE_IF_H +#define _LIBCPP___ALGORITHM_REPLACE_IF_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +replace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value) +{ + for (; __first != __last; ++__first) + if (__pred(*__first)) + *__first = __new_value; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REPLACE_IF_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/reverse.h b/app/src/main/cpp/libcxx/include/__algorithm/reverse.h new file mode 100644 index 0000000..aa76951 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/reverse.h @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REVERSE_H +#define _LIBCPP___ALGORITHM_REVERSE_H + +#include <__algorithm/iter_swap.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +__reverse_impl(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag) +{ + while (__first != __last) + { + if (__first == --__last) + break; + _IterOps<_AlgPolicy>::iter_swap(__first, __last); + ++__first; + } +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +__reverse_impl(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag) +{ + if (__first != __last) + for (; __first < --__last; ++__first) + _IterOps<_AlgPolicy>::iter_swap(__first, __last); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void __reverse(_BidirectionalIterator __first, _Sentinel __last) { + using _IterCategory = typename _IterOps<_AlgPolicy>::template __iterator_category<_BidirectionalIterator>; + std::__reverse_impl<_AlgPolicy>(std::move(__first), std::move(__last), _IterCategory()); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +reverse(_BidirectionalIterator __first, _BidirectionalIterator __last) +{ + std::__reverse<_ClassicAlgPolicy>(std::move(__first), std::move(__last)); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REVERSE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/reverse_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/reverse_copy.h new file mode 100644 index 0000000..f4a0e97 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/reverse_copy.h @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_REVERSE_COPY_H +#define _LIBCPP___ALGORITHM_REVERSE_COPY_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result) +{ + for (; __first != __last; ++__result) + *__result = *--__last; + return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_REVERSE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/rotate.h b/app/src/main/cpp/libcxx/include/__algorithm/rotate.h new file mode 100644 index 0000000..8934ce0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/rotate.h @@ -0,0 +1,221 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_ROTATE_H +#define _LIBCPP___ALGORITHM_ROTATE_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/move.h> +#include <__algorithm/move_backward.h> +#include <__algorithm/swap_ranges.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator +__rotate_left(_ForwardIterator __first, _ForwardIterator __last) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; + using _Ops = _IterOps<_AlgPolicy>; + + value_type __tmp = _Ops::__iter_move(__first); + _ForwardIterator __lm1 = std::__move<_AlgPolicy>( + _Ops::next(__first), __last, __first).second; + *__lm1 = _VSTD::move(__tmp); + return __lm1; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _BidirectionalIterator +__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last) +{ + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + using _Ops = _IterOps<_AlgPolicy>; + + _BidirectionalIterator __lm1 = _Ops::prev(__last); + value_type __tmp = _Ops::__iter_move(__lm1); + _BidirectionalIterator __fp1 = std::__move_backward<_AlgPolicy>(__first, __lm1, std::move(__last)).second; + *__first = _VSTD::move(__tmp); + return __fp1; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _ForwardIterator +__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last) +{ + _ForwardIterator __i = __middle; + while (true) + { + _IterOps<_AlgPolicy>::iter_swap(__first, __i); + ++__first; + if (++__i == __last) + break; + if (__first == __middle) + __middle = __i; + } + _ForwardIterator __r = __first; + if (__first != __middle) + { + __i = __middle; + while (true) + { + _IterOps<_AlgPolicy>::iter_swap(__first, __i); + ++__first; + if (++__i == __last) + { + if (__first == __middle) + break; + __i = __middle; + } + else if (__first == __middle) + __middle = __i; + } + } + return __r; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR_SINCE_CXX17 _Integral +__algo_gcd(_Integral __x, _Integral __y) +{ + do + { + _Integral __t = __x % __y; + __x = __y; + __y = __t; + } while (__y); + return __x; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _RandomAccessIterator +__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + using _Ops = _IterOps<_AlgPolicy>; + + const difference_type __m1 = __middle - __first; + const difference_type __m2 = _Ops::distance(__middle, __last); + if (__m1 == __m2) + { + std::__swap_ranges<_AlgPolicy>(__first, __middle, __middle, __last); + return __middle; + } + const difference_type __g = _VSTD::__algo_gcd(__m1, __m2); + for (_RandomAccessIterator __p = __first + __g; __p != __first;) + { + value_type __t(_Ops::__iter_move(--__p)); + _RandomAccessIterator __p1 = __p; + _RandomAccessIterator __p2 = __p1 + __m1; + do + { + *__p1 = _Ops::__iter_move(__p2); + __p1 = __p2; + const difference_type __d = _Ops::distance(__p2, __last); + if (__m1 < __d) + __p2 += __m1; + else + __p2 = __first + (__m1 - __d); + } while (__p2 != __p); + *__p1 = _VSTD::move(__t); + } + return __first + __m2; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator +__rotate_impl(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, + _VSTD::forward_iterator_tag) +{ + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; + if (is_trivially_move_assignable::value) + { + if (_IterOps<_AlgPolicy>::next(__first) == __middle) + return std::__rotate_left<_AlgPolicy>(__first, __last); + } + return std::__rotate_forward<_AlgPolicy>(__first, __middle, __last); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR_SINCE_CXX14 _BidirectionalIterator +__rotate_impl(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, + bidirectional_iterator_tag) +{ + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + if (is_trivially_move_assignable::value) + { + if (_IterOps<_AlgPolicy>::next(__first) == __middle) + return std::__rotate_left<_AlgPolicy>(__first, __last); + if (_IterOps<_AlgPolicy>::next(__middle) == __last) + return std::__rotate_right<_AlgPolicy>(__first, __last); + } + return std::__rotate_forward<_AlgPolicy>(__first, __middle, __last); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR_SINCE_CXX14 _RandomAccessIterator +__rotate_impl(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, + random_access_iterator_tag) +{ + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + if (is_trivially_move_assignable::value) + { + if (_IterOps<_AlgPolicy>::next(__first) == __middle) + return std::__rotate_left<_AlgPolicy>(__first, __last); + if (_IterOps<_AlgPolicy>::next(__middle) == __last) + return std::__rotate_right<_AlgPolicy>(__first, __last); + return std::__rotate_gcd<_AlgPolicy>(__first, __middle, __last); + } + return std::__rotate_forward<_AlgPolicy>(__first, __middle, __last); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iterator, _Iterator> +__rotate(_Iterator __first, _Iterator __middle, _Sentinel __last) { + using _Ret = pair<_Iterator, _Iterator>; + _Iterator __last_iter = _IterOps<_AlgPolicy>::next(__middle, __last); + + if (__first == __middle) + return _Ret(__last_iter, __last_iter); + if (__middle == __last) + return _Ret(std::move(__first), std::move(__last_iter)); + + using _IterCategory = typename _IterOps<_AlgPolicy>::template __iterator_category<_Iterator>; + auto __result = std::__rotate_impl<_AlgPolicy>( + std::move(__first), std::move(__middle), __last_iter, _IterCategory()); + + return _Ret(std::move(__result), std::move(__last_iter)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last) +{ + return std::__rotate<_ClassicAlgPolicy>( + std::move(__first), std::move(__middle), std::move(__last)).first; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_ROTATE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/rotate_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/rotate_copy.h new file mode 100644 index 0000000..c154649 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/rotate_copy.h @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_ROTATE_COPY_H +#define _LIBCPP___ALGORITHM_ROTATE_COPY_H + +#include <__algorithm/copy.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +rotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result) +{ + return _VSTD::copy(__first, __middle, _VSTD::copy(__middle, __last, __result)); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_ROTATE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/sample.h b/app/src/main/cpp/libcxx/include/__algorithm/sample.h new file mode 100644 index 0000000..f403ba6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/sample.h @@ -0,0 +1,112 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SAMPLE_H +#define _LIBCPP___ALGORITHM_SAMPLE_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/min.h> +#include <__assert> +#include <__config> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__random/uniform_int_distribution.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_INLINE_VISIBILITY +_SampleIterator __sample(_PopulationIterator __first, + _PopulationSentinel __last, _SampleIterator __output_iter, + _Distance __n, + _UniformRandomNumberGenerator& __g, + input_iterator_tag) { + + _Distance __k = 0; + for (; __first != __last && __k < __n; ++__first, (void) ++__k) + __output_iter[__k] = *__first; + _Distance __sz = __k; + for (; __first != __last; ++__first, (void) ++__k) { + _Distance __r = uniform_int_distribution<_Distance>(0, __k)(__g); + if (__r < __sz) + __output_iter[__r] = *__first; + } + return __output_iter + _VSTD::min(__n, __k); +} + +template +_LIBCPP_INLINE_VISIBILITY +_SampleIterator __sample(_PopulationIterator __first, + _PopulationSentinel __last, _SampleIterator __output_iter, + _Distance __n, + _UniformRandomNumberGenerator& __g, + forward_iterator_tag) { + _Distance __unsampled_sz = _IterOps<_AlgPolicy>::distance(__first, __last); + for (__n = _VSTD::min(__n, __unsampled_sz); __n != 0; ++__first) { + _Distance __r = uniform_int_distribution<_Distance>(0, --__unsampled_sz)(__g); + if (__r < __n) { + *__output_iter++ = *__first; + --__n; + } + } + return __output_iter; +} + +template +_LIBCPP_INLINE_VISIBILITY +_SampleIterator __sample(_PopulationIterator __first, + _PopulationSentinel __last, _SampleIterator __output_iter, + _Distance __n, _UniformRandomNumberGenerator& __g) { + _LIBCPP_ASSERT(__n >= 0, "N must be a positive number."); + + using _PopIterCategory = typename _IterOps<_AlgPolicy>::template __iterator_category<_PopulationIterator>; + using _Difference = typename _IterOps<_AlgPolicy>::template __difference_type<_PopulationIterator>; + using _CommonType = typename common_type<_Distance, _Difference>::type; + + return std::__sample<_AlgPolicy>( + std::move(__first), std::move(__last), std::move(__output_iter), _CommonType(__n), + __g, _PopIterCategory()); +} + +#if _LIBCPP_STD_VER > 14 +template +inline _LIBCPP_INLINE_VISIBILITY +_SampleIterator sample(_PopulationIterator __first, + _PopulationIterator __last, _SampleIterator __output_iter, + _Distance __n, _UniformRandomNumberGenerator&& __g) { + static_assert(__is_cpp17_forward_iterator<_PopulationIterator>::value || + __is_cpp17_random_access_iterator<_SampleIterator>::value, + "SampleIterator must meet the requirements of RandomAccessIterator"); + + return std::__sample<_ClassicAlgPolicy>( + std::move(__first), std::move(__last), std::move(__output_iter), __n, __g); +} + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_SAMPLE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/search.h b/app/src/main/cpp/libcxx/include/__algorithm/search.h new file mode 100644 index 0000000..93771be --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/search.h @@ -0,0 +1,201 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SEARCH_H +#define _LIBCPP___ALGORITHM_SEARCH_H + +#include <__algorithm/comp.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__iterator/advance.h> +#include <__iterator/concepts.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/is_callable.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iter1, _Iter1> __search_forward_impl(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2) { + if (__first2 == __last2) + return std::make_pair(__first1, __first1); // Everything matches an empty sequence + while (true) { + // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks + while (true) { + if (__first1 == __last1) { // return __last1 if no element matches *__first2 + _IterOps<_AlgPolicy>::__advance_to(__first1, __last1); + return std::make_pair(__first1, __first1); + } + if (std::__invoke(__pred, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2))) + break; + ++__first1; + } + // *__first1 matches *__first2, now match elements after here + _Iter1 __m1 = __first1; + _Iter2 __m2 = __first2; + while (true) { + if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern) + return std::make_pair(__first1, ++__m1); + if (++__m1 == __last1) { // Otherwise if source exhaused, pattern not found + return std::make_pair(__m1, __m1); + } + + // if there is a mismatch, restart with a new __first1 + if (!std::__invoke(__pred, std::__invoke(__proj1, *__m1), std::__invoke(__proj2, *__m2))) + { + ++__first1; + break; + } // else there is a match, check next elements + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iter1, _Iter1> __search_random_access_impl(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2, + _DiffT1 __size1, + _DiffT2 __size2) { + const _Iter1 __s = __first1 + __size1 - _DiffT1(__size2 - 1); // Start of pattern match can't go beyond here + + while (true) { + while (true) { + if (__first1 == __s) { + _IterOps<_AlgPolicy>::__advance_to(__first1, __last1); + return std::make_pair(__first1, __first1); + } + if (std::__invoke(__pred, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2))) + break; + ++__first1; + } + + _Iter1 __m1 = __first1; + _Iter2 __m2 = __first2; + while (true) { + if (++__m2 == __last2) + return std::make_pair(__first1, __first1 + _DiffT1(__size2)); + ++__m1; // no need to check range on __m1 because __s guarantees we have enough source + if (!std::__invoke(__pred, std::__invoke(__proj1, *__m1), std::__invoke(__proj2, *__m2))) { + ++__first1; + break; + } + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iter1, _Iter1> __search_impl(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2, + __enable_if_t<__is_cpp17_random_access_iterator<_Iter1>::value + && __is_cpp17_random_access_iterator<_Iter2>::value>* = nullptr) { + + auto __size2 = __last2 - __first2; + if (__size2 == 0) + return std::make_pair(__first1, __first1); + + auto __size1 = __last1 - __first1; + if (__size1 < __size2) { + return std::make_pair(__last1, __last1); + } + + return std::__search_random_access_impl<_ClassicAlgPolicy>(__first1, __last1, + __first2, __last2, + __pred, + __proj1, + __proj2, + __size1, + __size2); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iter1, _Iter1> __search_impl(_Iter1 __first1, _Sent1 __last1, + _Iter2 __first2, _Sent2 __last2, + _Pred& __pred, + _Proj1& __proj1, + _Proj2& __proj2, + __enable_if_t<__is_cpp17_forward_iterator<_Iter1>::value + && __is_cpp17_forward_iterator<_Iter2>::value + && !(__is_cpp17_random_access_iterator<_Iter1>::value + && __is_cpp17_random_access_iterator<_Iter2>::value)>* = nullptr) { + return std::__search_forward_impl<_ClassicAlgPolicy>(__first1, __last1, + __first2, __last2, + __pred, + __proj1, + __proj2); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator1 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2, + _BinaryPredicate __pred) { + static_assert(__is_callable<_BinaryPredicate, decltype(*__first1), decltype(*__first2)>::value, + "BinaryPredicate has to be callable"); + auto __proj = __identity(); + return std::__search_impl(__first1, __last1, __first2, __last2, __pred, __proj, __proj).first; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator1 search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, + _ForwardIterator2 __first2, _ForwardIterator2 __last2) { + return std::search(__first1, __last1, __first2, __last2, __equal_to()); +} + +#if _LIBCPP_STD_VER > 14 +template +_LIBCPP_NODISCARD_EXT _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +search(_ForwardIterator __f, _ForwardIterator __l, const _Searcher& __s) { + return __s(__f, __l).first; +} + +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SEARCH_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/search_n.h b/app/src/main/cpp/libcxx/include/__algorithm/search_n.h new file mode 100644 index 0000000..60a0735 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/search_n.h @@ -0,0 +1,181 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SEARCH_N_H +#define _LIBCPP___ALGORITHM_SEARCH_N_H + +#include <__algorithm/comp.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__iterator/advance.h> +#include <__iterator/concepts.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__ranges/concepts.h> +#include <__utility/convert_to_integral.h> +#include <__utility/pair.h> +#include // __convert_to_integral + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iter, _Iter> __search_n_forward_impl(_Iter __first, _Sent __last, + _SizeT __count, + const _Type& __value, + _Pred& __pred, + _Proj& __proj) { + if (__count <= 0) + return std::make_pair(__first, __first); + while (true) { + // Find first element in sequence that matchs __value, with a mininum of loop checks + while (true) { + if (__first == __last) { // return __last if no element matches __value + _IterOps<_AlgPolicy>::__advance_to(__first, __last); + return std::make_pair(__first, __first); + } + if (std::__invoke(__pred, std::__invoke(__proj, *__first), __value)) + break; + ++__first; + } + // *__first matches __value, now match elements after here + _Iter __m = __first; + _SizeT __c(0); + while (true) { + if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern) + return std::make_pair(__first, ++__m); + if (++__m == __last) { // Otherwise if source exhaused, pattern not found + _IterOps<_AlgPolicy>::__advance_to(__first, __last); + return std::make_pair(__first, __first); + } + + // if there is a mismatch, restart with a new __first + if (!std::__invoke(__pred, std::__invoke(__proj, *__m), __value)) + { + __first = __m; + ++__first; + break; + } // else there is a match, check next elements + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +std::pair<_Iter, _Iter> __search_n_random_access_impl(_Iter __first, _Sent __last, + _SizeT __count, + const _Type& __value, + _Pred& __pred, + _Proj& __proj, + _DiffT __size1) { + using difference_type = typename iterator_traits<_Iter>::difference_type; + if (__count == 0) + return std::make_pair(__first, __first); + if (__size1 < static_cast<_DiffT>(__count)) { + _IterOps<_AlgPolicy>::__advance_to(__first, __last); + return std::make_pair(__first, __first); + } + + const auto __s = __first + __size1 - difference_type(__count - 1); // Start of pattern match can't go beyond here + while (true) { + // Find first element in sequence that matchs __value, with a mininum of loop checks + while (true) { + if (__first >= __s) { // return __last if no element matches __value + _IterOps<_AlgPolicy>::__advance_to(__first, __last); + return std::make_pair(__first, __first); + } + if (std::__invoke(__pred, std::__invoke(__proj, *__first), __value)) + break; + ++__first; + } + // *__first matches __value_, now match elements after here + auto __m = __first; + _SizeT __c(0); + while (true) { + if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern) + return std::make_pair(__first, __first + _DiffT(__count)); + ++__m; // no need to check range on __m because __s guarantees we have enough source + + // if there is a mismatch, restart with a new __first + if (!std::__invoke(__pred, std::__invoke(__proj, *__m), __value)) + { + __first = __m; + ++__first; + break; + } // else there is a match, check next elements + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iter, _Iter> __search_n_impl(_Iter __first, _Sent __last, + _DiffT __count, + const _Type& __value, + _Pred& __pred, + _Proj& __proj, + __enable_if_t<__is_cpp17_random_access_iterator<_Iter>::value>* = nullptr) { + return std::__search_n_random_access_impl<_ClassicAlgPolicy>(__first, __last, + __count, + __value, + __pred, + __proj, + __last - __first); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +pair<_Iter1, _Iter1> __search_n_impl(_Iter1 __first, _Sent1 __last, + _DiffT __count, + const _Type& __value, + _Pred& __pred, + _Proj& __proj, + __enable_if_t<__is_cpp17_forward_iterator<_Iter1>::value + && !__is_cpp17_random_access_iterator<_Iter1>::value>* = nullptr) { + return std::__search_n_forward_impl<_ClassicAlgPolicy>(__first, __last, + __count, + __value, + __pred, + __proj); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator search_n(_ForwardIterator __first, _ForwardIterator __last, + _Size __count, + const _Tp& __value, + _BinaryPredicate __pred) { + static_assert(__is_callable<_BinaryPredicate, decltype(*__first), const _Tp&>::value, + "BinaryPredicate has to be callable"); + auto __proj = __identity(); + return std::__search_n_impl(__first, __last, std::__convert_to_integral(__count), __value, __pred, __proj).first; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +_ForwardIterator search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value) { + return std::search_n(__first, __last, std::__convert_to_integral(__count), __value, __equal_to()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SEARCH_N_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/set_difference.h b/app/src/main/cpp/libcxx/include/__algorithm/set_difference.h new file mode 100644 index 0000000..cffdc8f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/set_difference.h @@ -0,0 +1,81 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SET_DIFFERENCE_H +#define _LIBCPP___ALGORITHM_SET_DIFFERENCE_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/copy.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<__remove_cvref_t<_InIter1>, __remove_cvref_t<_OutIter> > +__set_difference( + _InIter1&& __first1, _Sent1&& __last1, _InIter2&& __first2, _Sent2&& __last2, _OutIter&& __result, _Comp&& __comp) { + while (__first1 != __last1 && __first2 != __last2) { + if (__comp(*__first1, *__first2)) { + *__result = *__first1; + ++__first1; + ++__result; + } else if (__comp(*__first2, *__first1)) { + ++__first2; + } else { + ++__first1; + ++__first2; + } + } + return std::__copy<_AlgPolicy>(std::move(__first1), std::move(__last1), std::move(__result)); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_difference( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result, + _Compare __comp) { + return std::__set_difference<_ClassicAlgPolicy, __comp_ref_type<_Compare> >( + __first1, __last1, __first2, __last2, __result, __comp) + .second; +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_difference( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result) { + return std::__set_difference<_ClassicAlgPolicy>( + __first1, + __last1, + __first2, + __last2, + __result, + __less::value_type, + typename iterator_traits<_InputIterator2>::value_type>()).second; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SET_DIFFERENCE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/set_intersection.h b/app/src/main/cpp/libcxx/include/__algorithm/set_intersection.h new file mode 100644 index 0000000..9fa7799 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/set_intersection.h @@ -0,0 +1,99 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SET_INTERSECTION_H +#define _LIBCPP___ALGORITHM_SET_INTERSECTION_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct __set_intersection_result { + _InIter1 __in1_; + _InIter2 __in2_; + _OutIter __out_; + + // need a constructor as C++03 aggregate init is hard + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 + __set_intersection_result(_InIter1&& __in_iter1, _InIter2&& __in_iter2, _OutIter&& __out_iter) + : __in1_(std::move(__in_iter1)), __in2_(std::move(__in_iter2)), __out_(std::move(__out_iter)) {} +}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __set_intersection_result<_InIter1, _InIter2, _OutIter> +__set_intersection( + _InIter1 __first1, _Sent1 __last1, _InIter2 __first2, _Sent2 __last2, _OutIter __result, _Compare&& __comp) { + while (__first1 != __last1 && __first2 != __last2) { + if (__comp(*__first1, *__first2)) + ++__first1; + else { + if (!__comp(*__first2, *__first1)) { + *__result = *__first1; + ++__result; + ++__first1; + } + ++__first2; + } + } + + return __set_intersection_result<_InIter1, _InIter2, _OutIter>( + _IterOps<_AlgPolicy>::next(std::move(__first1), std::move(__last1)), + _IterOps<_AlgPolicy>::next(std::move(__first2), std::move(__last2)), + std::move(__result)); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_intersection( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result, + _Compare __comp) { + return std::__set_intersection<_ClassicAlgPolicy, __comp_ref_type<_Compare> >( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + __comp) + .__out_; +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_intersection( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result) { + return std::__set_intersection<_ClassicAlgPolicy>( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + __less::value_type, + typename iterator_traits<_InputIterator2>::value_type>()) + .__out_; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SET_INTERSECTION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/set_symmetric_difference.h b/app/src/main/cpp/libcxx/include/__algorithm/set_symmetric_difference.h new file mode 100644 index 0000000..bcb0958 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/set_symmetric_difference.h @@ -0,0 +1,105 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SET_SYMMETRIC_DIFFERENCE_H +#define _LIBCPP___ALGORITHM_SET_SYMMETRIC_DIFFERENCE_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/copy.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct __set_symmetric_difference_result { + _InIter1 __in1_; + _InIter2 __in2_; + _OutIter __out_; + + // need a constructor as C++03 aggregate init is hard + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 + __set_symmetric_difference_result(_InIter1&& __in_iter1, _InIter2&& __in_iter2, _OutIter&& __out_iter) + : __in1_(std::move(__in_iter1)), __in2_(std::move(__in_iter2)), __out_(std::move(__out_iter)) {} +}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __set_symmetric_difference_result<_InIter1, _InIter2, _OutIter> +__set_symmetric_difference( + _InIter1 __first1, _Sent1 __last1, _InIter2 __first2, _Sent2 __last2, _OutIter __result, _Compare&& __comp) { + while (__first1 != __last1) { + if (__first2 == __last2) { + auto __ret1 = std::__copy<_AlgPolicy>(std::move(__first1), std::move(__last1), std::move(__result)); + return __set_symmetric_difference_result<_InIter1, _InIter2, _OutIter>( + std::move(__ret1.first), std::move(__first2), std::move((__ret1.second))); + } + if (__comp(*__first1, *__first2)) { + *__result = *__first1; + ++__result; + ++__first1; + } else { + if (__comp(*__first2, *__first1)) { + *__result = *__first2; + ++__result; + } else { + ++__first1; + } + ++__first2; + } + } + auto __ret2 = std::__copy<_AlgPolicy>(std::move(__first2), std::move(__last2), std::move(__result)); + return __set_symmetric_difference_result<_InIter1, _InIter2, _OutIter>( + std::move(__first1), std::move(__ret2.first), std::move((__ret2.second))); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_symmetric_difference( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result, + _Compare __comp) { + return std::__set_symmetric_difference<_ClassicAlgPolicy, __comp_ref_type<_Compare> >( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + __comp) + .__out_; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_symmetric_difference( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result) { + return std::set_symmetric_difference( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + __less::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SET_SYMMETRIC_DIFFERENCE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/set_union.h b/app/src/main/cpp/libcxx/include/__algorithm/set_union.h new file mode 100644 index 0000000..4d154b8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/set_union.h @@ -0,0 +1,101 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SET_UNION_H +#define _LIBCPP___ALGORITHM_SET_UNION_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/copy.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct __set_union_result { + _InIter1 __in1_; + _InIter2 __in2_; + _OutIter __out_; + + // need a constructor as C++03 aggregate init is hard + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 + __set_union_result(_InIter1&& __in_iter1, _InIter2&& __in_iter2, _OutIter&& __out_iter) + : __in1_(std::move(__in_iter1)), __in2_(std::move(__in_iter2)), __out_(std::move(__out_iter)) {} +}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __set_union_result<_InIter1, _InIter2, _OutIter> __set_union( + _InIter1 __first1, _Sent1 __last1, _InIter2 __first2, _Sent2 __last2, _OutIter __result, _Compare&& __comp) { + for (; __first1 != __last1; ++__result) { + if (__first2 == __last2) { + auto __ret1 = std::__copy<_AlgPolicy>(std::move(__first1), std::move(__last1), std::move(__result)); + return __set_union_result<_InIter1, _InIter2, _OutIter>( + std::move(__ret1.first), std::move(__first2), std::move((__ret1.second))); + } + if (__comp(*__first2, *__first1)) { + *__result = *__first2; + ++__first2; + } else { + if (!__comp(*__first1, *__first2)) { + ++__first2; + } + *__result = *__first1; + ++__first1; + } + } + auto __ret2 = std::__copy<_AlgPolicy>(std::move(__first2), std::move(__last2), std::move(__result)); + return __set_union_result<_InIter1, _InIter2, _OutIter>( + std::move(__first1), std::move(__ret2.first), std::move((__ret2.second))); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_union( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result, + _Compare __comp) { + return std::__set_union<_ClassicAlgPolicy, __comp_ref_type<_Compare> >( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + __comp) + .__out_; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_union( + _InputIterator1 __first1, + _InputIterator1 __last1, + _InputIterator2 __first2, + _InputIterator2 __last2, + _OutputIterator __result) { + return std::set_union( + std::move(__first1), + std::move(__last1), + std::move(__first2), + std::move(__last2), + std::move(__result), + __less::value_type, + typename iterator_traits<_InputIterator2>::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SET_UNION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/shift_left.h b/app/src/main/cpp/libcxx/include/__algorithm/shift_left.h new file mode 100644 index 0000000..33f06d5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/shift_left.h @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SHIFT_LEFT_H +#define _LIBCPP___ALGORITHM_SHIFT_LEFT_H + +#include <__algorithm/move.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +inline _LIBCPP_INLINE_VISIBILITY constexpr +_ForwardIterator +shift_left(_ForwardIterator __first, _ForwardIterator __last, + typename iterator_traits<_ForwardIterator>::difference_type __n) +{ + if (__n == 0) { + return __last; + } + + _ForwardIterator __m = __first; + if constexpr (__is_cpp17_random_access_iterator<_ForwardIterator>::value) { + if (__n >= __last - __first) { + return __first; + } + __m += __n; + } else { + for (; __n > 0; --__n) { + if (__m == __last) { + return __first; + } + ++__m; + } + } + return _VSTD::move(__m, __last, __first); +} + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SHIFT_LEFT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/shift_right.h b/app/src/main/cpp/libcxx/include/__algorithm/shift_right.h new file mode 100644 index 0000000..14bc761 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/shift_right.h @@ -0,0 +1,102 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SHIFT_RIGHT_H +#define _LIBCPP___ALGORITHM_SHIFT_RIGHT_H + +#include <__algorithm/move.h> +#include <__algorithm/move_backward.h> +#include <__algorithm/swap_ranges.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/swap.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +inline _LIBCPP_INLINE_VISIBILITY constexpr +_ForwardIterator +shift_right(_ForwardIterator __first, _ForwardIterator __last, + typename iterator_traits<_ForwardIterator>::difference_type __n) +{ + if (__n == 0) { + return __first; + } + + if constexpr (__is_cpp17_random_access_iterator<_ForwardIterator>::value) { + decltype(__n) __d = __last - __first; + if (__n >= __d) { + return __last; + } + _ForwardIterator __m = __first + (__d - __n); + return _VSTD::move_backward(__first, __m, __last); + } else if constexpr (__is_cpp17_bidirectional_iterator<_ForwardIterator>::value) { + _ForwardIterator __m = __last; + for (; __n > 0; --__n) { + if (__m == __first) { + return __last; + } + --__m; + } + return _VSTD::move_backward(__first, __m, __last); + } else { + _ForwardIterator __ret = __first; + for (; __n > 0; --__n) { + if (__ret == __last) { + return __last; + } + ++__ret; + } + + // We have an __n-element scratch space from __first to __ret. + // Slide an __n-element window [__trail, __lead) from left to right. + // We're essentially doing swap_ranges(__first, __ret, __trail, __lead) + // over and over; but once __lead reaches __last we needn't bother + // to save the values of elements [__trail, __last). + + auto __trail = __first; + auto __lead = __ret; + while (__trail != __ret) { + if (__lead == __last) { + _VSTD::move(__first, __trail, __ret); + return __ret; + } + ++__trail; + ++__lead; + } + + _ForwardIterator __mid = __first; + while (true) { + if (__lead == __last) { + __trail = _VSTD::move(__mid, __ret, __trail); + _VSTD::move(__first, __mid, __trail); + return __ret; + } + swap(*__mid, *__trail); + ++__mid; + ++__trail; + ++__lead; + if (__mid == __ret) { + __mid = __first; + } + } + } +} + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SHIFT_RIGHT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/shuffle.h b/app/src/main/cpp/libcxx/include/__algorithm/shuffle.h new file mode 100644 index 0000000..f7bce68 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/shuffle.h @@ -0,0 +1,175 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SHUFFLE_H +#define _LIBCPP___ALGORITHM_SHUFFLE_H + +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__debug> +#include <__iterator/iterator_traits.h> +#include <__random/uniform_int_distribution.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/swap.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +class _LIBCPP_TYPE_VIS __libcpp_debug_randomizer { +public: + __libcpp_debug_randomizer() { + __state_ = __seed(); + __inc_ = __state_ + 0xda3e39cb94b95bdbULL; + __inc_ = (__inc_ << 1) | 1; + } + typedef uint_fast32_t result_type; + + static const result_type _Min = 0; + static const result_type _Max = 0xFFFFFFFF; + + _LIBCPP_HIDE_FROM_ABI result_type operator()() { + uint_fast64_t __oldstate = __state_; + __state_ = __oldstate * 6364136223846793005ULL + __inc_; + return __oldstate >> 32; + } + + static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR result_type min() { return _Min; } + static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR result_type max() { return _Max; } + +private: + uint_fast64_t __state_; + uint_fast64_t __inc_; + _LIBCPP_HIDE_FROM_ABI static uint_fast64_t __seed() { +#ifdef _LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY_SEED + return _LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY_SEED; +#else + static char __x; + return reinterpret_cast(&__x); +#endif + } +}; + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE) \ + || defined(_LIBCPP_BUILDING_LIBRARY) +class _LIBCPP_TYPE_VIS __rs_default; + +_LIBCPP_FUNC_VIS __rs_default __rs_get(); + +class _LIBCPP_TYPE_VIS __rs_default +{ + static unsigned __c_; + + __rs_default(); +public: + typedef uint_fast32_t result_type; + + static const result_type _Min = 0; + static const result_type _Max = 0xFFFFFFFF; + + __rs_default(const __rs_default&); + ~__rs_default(); + + result_type operator()(); + + static _LIBCPP_CONSTEXPR result_type min() {return _Min;} + static _LIBCPP_CONSTEXPR result_type max() {return _Max;} + + friend _LIBCPP_FUNC_VIS __rs_default __rs_get(); +}; + +_LIBCPP_FUNC_VIS __rs_default __rs_get(); + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_DEPRECATED_IN_CXX14 void +random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef uniform_int_distribution _Dp; + typedef typename _Dp::param_type _Pp; + difference_type __d = __last - __first; + if (__d > 1) + { + _Dp __uid; + __rs_default __g = __rs_get(); + for (--__last, (void) --__d; __first < __last; ++__first, (void) --__d) + { + difference_type __i = __uid(__g, _Pp(0, __d)); + if (__i != difference_type(0)) + swap(*__first, *(__first + __i)); + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_DEPRECATED_IN_CXX14 void +random_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, +#ifndef _LIBCPP_CXX03_LANG + _RandomNumberGenerator&& __rand) +#else + _RandomNumberGenerator& __rand) +#endif +{ + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + difference_type __d = __last - __first; + if (__d > 1) + { + for (--__last; __first < __last; ++__first, (void) --__d) + { + difference_type __i = __rand(__d); + if (__i != difference_type(0)) + swap(*__first, *(__first + __i)); + } + } +} +#endif + +template +_LIBCPP_HIDE_FROM_ABI _RandomAccessIterator __shuffle( + _RandomAccessIterator __first, _Sentinel __last_sentinel, _UniformRandomNumberGenerator&& __g) { + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef uniform_int_distribution _Dp; + typedef typename _Dp::param_type _Pp; + + auto __original_last = _IterOps<_AlgPolicy>::next(__first, __last_sentinel); + auto __last = __original_last; + difference_type __d = __last - __first; + if (__d > 1) + { + _Dp __uid; + for (--__last, (void) --__d; __first < __last; ++__first, (void) --__d) + { + difference_type __i = __uid(__g, _Pp(0, __d)); + if (__i != difference_type(0)) + _IterOps<_AlgPolicy>::iter_swap(__first, __first + __i); + } + } + + return __original_last; +} + +template +_LIBCPP_HIDE_FROM_ABI void +shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, _UniformRandomNumberGenerator&& __g) { + (void)std::__shuffle<_ClassicAlgPolicy>( + std::move(__first), std::move(__last), std::forward<_UniformRandomNumberGenerator>(__g)); +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___ALGORITHM_SHUFFLE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/sift_down.h b/app/src/main/cpp/libcxx/include/__algorithm/sift_down.h new file mode 100644 index 0000000..e3972fb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/sift_down.h @@ -0,0 +1,114 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SIFT_DOWN_H +#define _LIBCPP___ALGORITHM_SIFT_DOWN_H + +#include <__algorithm/iterator_operations.h> +#include <__assert> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void +__sift_down(_RandomAccessIterator __first, _Compare&& __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len, + _RandomAccessIterator __start) +{ + using _Ops = _IterOps<_AlgPolicy>; + + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + // left-child of __start is at 2 * __start + 1 + // right-child of __start is at 2 * __start + 2 + difference_type __child = __start - __first; + + if (__len < 2 || (__len - 2) / 2 < __child) + return; + + __child = 2 * __child + 1; + _RandomAccessIterator __child_i = __first + __child; + + if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + difference_type(1)))) { + // right-child exists and is greater than left-child + ++__child_i; + ++__child; + } + + // check if we are in heap-order + if (__comp(*__child_i, *__start)) + // we are, __start is larger than its largest child + return; + + value_type __top(_Ops::__iter_move(__start)); + do + { + // we are not in heap-order, swap the parent with its largest child + *__start = _Ops::__iter_move(__child_i); + __start = __child_i; + + if ((__len - 2) / 2 < __child) + break; + + // recompute the child based off of the updated parent + __child = 2 * __child + 1; + __child_i = __first + __child; + + if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + difference_type(1)))) { + // right-child exists and is greater than left-child + ++__child_i; + ++__child; + } + + // check if we are in heap-order + } while (!__comp(*__child_i, __top)); + *__start = _VSTD::move(__top); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _RandomAccessIterator +__floyd_sift_down(_RandomAccessIterator __first, _Compare&& __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len) +{ + using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type; + _LIBCPP_ASSERT(__len >= 2, "shouldn't be called unless __len >= 2"); + + _RandomAccessIterator __hole = __first; + _RandomAccessIterator __child_i = __first; + difference_type __child = 0; + + while (true) { + __child_i += difference_type(__child + 1); + __child = 2 * __child + 1; + + if ((__child + 1) < __len && __comp(*__child_i, *(__child_i + difference_type(1)))) { + // right-child exists and is greater than left-child + ++__child_i; + ++__child; + } + + // swap __hole with its largest child + *__hole = _IterOps<_AlgPolicy>::__iter_move(__child_i); + __hole = __child_i; + + // if __hole is now a leaf, we're done + if (__child > (__len - 2) / 2) + return __hole; + } +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SIFT_DOWN_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/sort.h b/app/src/main/cpp/libcxx/include/__algorithm/sort.h new file mode 100644 index 0000000..a7d2d55 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/sort.h @@ -0,0 +1,1001 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SORT_H +#define _LIBCPP___ALGORITHM_SORT_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iter_swap.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/min_element.h> +#include <__algorithm/partial_sort.h> +#include <__algorithm/unwrap_iter.h> +#include <__assert> +#include <__bit/blsr.h> +#include <__bit/countl.h> +#include <__bit/countr.h> +#include <__config> +#include <__debug> +#include <__debug_utils/randomize_range.h> +#include <__functional/operations.h> +#include <__functional/ranges_operations.h> +#include <__iterator/iterator_traits.h> +#include <__memory/destruct_n.h> +#include <__memory/unique_ptr.h> +#include <__type_traits/conditional.h> +#include <__type_traits/is_arithmetic.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Wraps an algorithm policy tag and a comparator in a single struct, used to pass the policy tag around without +// changing the number of template arguments (to keep the ABI stable). This is only used for the "range" policy tag. +// +// To create an object of this type, use `_WrapAlgPolicy::type` -- see the specialization below for the rationale. +template +struct _WrapAlgPolicy { + using type = _WrapAlgPolicy; + + using _AlgPolicy = _PolicyT; + using _Comp = _CompT; + _Comp& __comp; + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 + _WrapAlgPolicy(_Comp& __c) : __comp(__c) {} +}; + +// Specialization for the "classic" policy tag that avoids creating a struct and simply defines an alias for the +// comparator. When unwrapping, a pristine comparator is always considered to have the "classic" tag attached. Passing +// the pristine comparator where possible allows using template instantiations from the dylib. +template +struct _WrapAlgPolicy<_PolicyT, _CompT, __enable_if_t::value> > { + using type = _CompT; +}; + +// Unwraps a pristine functor (e.g. `std::less`) as if it were wrapped using `_WrapAlgPolicy`. The policy tag is always +// set to "classic". +template +struct _UnwrapAlgPolicy { + using _AlgPolicy = _ClassicAlgPolicy; + using _Comp = _CompT; + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 static + _Comp __get_comp(_Comp __comp) { return __comp; } +}; + +// Unwraps a `_WrapAlgPolicy` struct. +template +struct _UnwrapAlgPolicy<_WrapAlgPolicy<_Ts...> > { + using _Wrapped = _WrapAlgPolicy<_Ts...>; + using _AlgPolicy = typename _Wrapped::_AlgPolicy; + using _Comp = typename _Wrapped::_Comp; + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 static + _Comp __get_comp(_Wrapped& __w) { return __w.__comp; } +}; + +// stable, 2-3 compares, 0-2 swaps + +template +_LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX14 unsigned __sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, + _Compare __c) { + using _Ops = _IterOps<_AlgPolicy>; + + unsigned __r = 0; + if (!__c(*__y, *__x)) // if x <= y + { + if (!__c(*__z, *__y)) // if y <= z + return __r; // x <= y && y <= z + // x <= y && y > z + _Ops::iter_swap(__y, __z); // x <= z && y < z + __r = 1; + if (__c(*__y, *__x)) // if x > y + { + _Ops::iter_swap(__x, __y); // x < y && y <= z + __r = 2; + } + return __r; // x <= y && y < z + } + if (__c(*__z, *__y)) // x > y, if y > z + { + _Ops::iter_swap(__x, __z); // x < y && y < z + __r = 1; + return __r; + } + _Ops::iter_swap(__x, __y); // x > y && y <= z + __r = 1; // x < y && x <= z + if (__c(*__z, *__y)) // if y > z + { + _Ops::iter_swap(__y, __z); // x <= y && y < z + __r = 2; + } + return __r; +} // x <= y && y <= z + +// stable, 3-6 compares, 0-5 swaps + +template +_LIBCPP_HIDE_FROM_ABI +unsigned __sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, _ForwardIterator __x4, + _Compare __c) { + using _Ops = _IterOps<_AlgPolicy>; + unsigned __r = std::__sort3<_AlgPolicy, _Compare>(__x1, __x2, __x3, __c); + if (__c(*__x4, *__x3)) { + _Ops::iter_swap(__x3, __x4); + ++__r; + if (__c(*__x3, *__x2)) { + _Ops::iter_swap(__x2, __x3); + ++__r; + if (__c(*__x2, *__x1)) { + _Ops::iter_swap(__x1, __x2); + ++__r; + } + } + } + return __r; +} + +// stable, 4-10 compares, 0-9 swaps + +template +_LIBCPP_HIDDEN unsigned __sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, + _ForwardIterator __x4, _ForwardIterator __x5, _WrappedComp __wrapped_comp) { + using _Unwrap = _UnwrapAlgPolicy<_WrappedComp>; + using _AlgPolicy = typename _Unwrap::_AlgPolicy; + using _Ops = _IterOps<_AlgPolicy>; + + using _Compare = typename _Unwrap::_Comp; + _Compare __c = _Unwrap::__get_comp(__wrapped_comp); + + unsigned __r = std::__sort4<_AlgPolicy, _Compare>(__x1, __x2, __x3, __x4, __c); + if (__c(*__x5, *__x4)) { + _Ops::iter_swap(__x4, __x5); + ++__r; + if (__c(*__x4, *__x3)) { + _Ops::iter_swap(__x3, __x4); + ++__r; + if (__c(*__x3, *__x2)) { + _Ops::iter_swap(__x2, __x3); + ++__r; + if (__c(*__x2, *__x1)) { + _Ops::iter_swap(__x1, __x2); + ++__r; + } + } + } + } + return __r; +} + +template +_LIBCPP_HIDE_FROM_ABI unsigned __sort5_wrap_policy( + _ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, _ForwardIterator __x4, _ForwardIterator __x5, + _Compare __c) { + using _WrappedComp = typename _WrapAlgPolicy<_AlgPolicy, _Compare>::type; + _WrappedComp __wrapped_comp(__c); + return std::__sort5<_WrappedComp, _ForwardIterator>( + std::move(__x1), std::move(__x2), std::move(__x3), std::move(__x4), std::move(__x5), __wrapped_comp); +} + +// The comparator being simple is a prerequisite for using the branchless optimization. +template +struct __is_simple_comparator : false_type {}; +template +struct __is_simple_comparator<__less<_Tp>&> : true_type {}; +template +struct __is_simple_comparator&> : true_type {}; +template +struct __is_simple_comparator&> : true_type {}; +#if _LIBCPP_STD_VER > 17 +template <> +struct __is_simple_comparator : true_type {}; +template <> +struct __is_simple_comparator : true_type {}; +#endif + +template ::value_type> +using __use_branchless_sort = + integral_constant::value && sizeof(_Tp) <= sizeof(void*) && + is_arithmetic<_Tp>::value && __is_simple_comparator<_Compare>::value>; + +namespace __detail { + +// Size in bits for the bitset in use. +enum { __block_size = sizeof(uint64_t) * 8 }; + +} // namespace __detail + +// Ensures that __c(*__x, *__y) is true by swapping *__x and *__y if necessary. +template +inline _LIBCPP_HIDE_FROM_ABI void __cond_swap(_RandomAccessIterator __x, _RandomAccessIterator __y, _Compare __c) { + // Note: this function behaves correctly even with proxy iterators (because it relies on `value_type`). + using value_type = typename iterator_traits<_RandomAccessIterator>::value_type; + bool __r = __c(*__x, *__y); + value_type __tmp = __r ? *__x : *__y; + *__y = __r ? *__y : *__x; + *__x = __tmp; +} + +// Ensures that *__x, *__y and *__z are ordered according to the comparator __c, +// under the assumption that *__y and *__z are already ordered. +template +inline _LIBCPP_HIDE_FROM_ABI void __partially_sorted_swap(_RandomAccessIterator __x, _RandomAccessIterator __y, + _RandomAccessIterator __z, _Compare __c) { + // Note: this function behaves correctly even with proxy iterators (because it relies on `value_type`). + using value_type = typename iterator_traits<_RandomAccessIterator>::value_type; + bool __r = __c(*__z, *__x); + value_type __tmp = __r ? *__z : *__x; + *__z = __r ? *__x : *__z; + __r = __c(__tmp, *__y); + *__x = __r ? *__x : *__y; + *__y = __r ? *__y : __tmp; +} + +template +inline _LIBCPP_HIDE_FROM_ABI __enable_if_t<__use_branchless_sort<_Compare, _RandomAccessIterator>::value, void> +__sort3_maybe_branchless(_RandomAccessIterator __x1, _RandomAccessIterator __x2, _RandomAccessIterator __x3, + _Compare __c) { + std::__cond_swap<_Compare>(__x2, __x3, __c); + std::__partially_sorted_swap<_Compare>(__x1, __x2, __x3, __c); +} + +template +inline _LIBCPP_HIDE_FROM_ABI __enable_if_t::value, void> +__sort3_maybe_branchless(_RandomAccessIterator __x1, _RandomAccessIterator __x2, _RandomAccessIterator __x3, + _Compare __c) { + std::__sort3<_AlgPolicy, _Compare>(__x1, __x2, __x3, __c); +} + +template +inline _LIBCPP_HIDE_FROM_ABI __enable_if_t<__use_branchless_sort<_Compare, _RandomAccessIterator>::value, void> +__sort4_maybe_branchless(_RandomAccessIterator __x1, _RandomAccessIterator __x2, _RandomAccessIterator __x3, + _RandomAccessIterator __x4, _Compare __c) { + std::__cond_swap<_Compare>(__x1, __x3, __c); + std::__cond_swap<_Compare>(__x2, __x4, __c); + std::__cond_swap<_Compare>(__x1, __x2, __c); + std::__cond_swap<_Compare>(__x3, __x4, __c); + std::__cond_swap<_Compare>(__x2, __x3, __c); +} + +template +inline _LIBCPP_HIDE_FROM_ABI __enable_if_t::value, void> +__sort4_maybe_branchless(_RandomAccessIterator __x1, _RandomAccessIterator __x2, _RandomAccessIterator __x3, + _RandomAccessIterator __x4, _Compare __c) { + std::__sort4<_AlgPolicy, _Compare>(__x1, __x2, __x3, __x4, __c); +} + +template +inline _LIBCPP_HIDE_FROM_ABI __enable_if_t<__use_branchless_sort<_Compare, _RandomAccessIterator>::value, void> +__sort5_maybe_branchless( + _RandomAccessIterator __x1, + _RandomAccessIterator __x2, + _RandomAccessIterator __x3, + _RandomAccessIterator __x4, + _RandomAccessIterator __x5, + _Compare __c) { + std::__cond_swap<_Compare>(__x1, __x2, __c); + std::__cond_swap<_Compare>(__x4, __x5, __c); + std::__partially_sorted_swap<_Compare>(__x3, __x4, __x5, __c); + std::__cond_swap<_Compare>(__x2, __x5, __c); + std::__partially_sorted_swap<_Compare>(__x1, __x3, __x4, __c); + std::__partially_sorted_swap<_Compare>(__x2, __x3, __x4, __c); +} + +template +inline _LIBCPP_HIDE_FROM_ABI __enable_if_t::value, void> +__sort5_maybe_branchless(_RandomAccessIterator __x1, _RandomAccessIterator __x2, _RandomAccessIterator __x3, + _RandomAccessIterator __x4, _RandomAccessIterator __x5, _Compare __c) { + std::__sort5_wrap_policy<_AlgPolicy, _Compare>(__x1, __x2, __x3, __x4, __x5, __c); +} + +// Assumes size > 0 +template +_LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX14 void __selection_sort(_BidirectionalIterator __first, _BidirectionalIterator __last, + _Compare __comp) { + _BidirectionalIterator __lm1 = __last; + for (--__lm1; __first != __lm1; ++__first) { + _BidirectionalIterator __i = std::__min_element<_Compare>(__first, __last, __comp); + if (__i != __first) + _IterOps<_AlgPolicy>::iter_swap(__first, __i); + } +} + +// Sort the iterator range [__first, __last) using the comparator __comp using +// the insertion sort algorithm. +template +_LIBCPP_HIDE_FROM_ABI +void __insertion_sort(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) { + using _Ops = _IterOps<_AlgPolicy>; + + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + if (__first == __last) + return; + _BidirectionalIterator __i = __first; + for (++__i; __i != __last; ++__i) { + _BidirectionalIterator __j = __i; + --__j; + if (__comp(*__i, *__j)) { + value_type __t(_Ops::__iter_move(__i)); + _BidirectionalIterator __k = __j; + __j = __i; + do { + *__j = _Ops::__iter_move(__k); + __j = __k; + } while (__j != __first && __comp(__t, *--__k)); + *__j = std::move(__t); + } + } +} + +// Sort the iterator range [__first, __last) using the comparator __comp using +// the insertion sort algorithm. Insertion sort has two loops, outer and inner. +// The implementation below has not bounds check (unguarded) for the inner loop. +// Assumes that there is an element in the position (__first - 1) and that each +// element in the input range is greater or equal to the element at __first - 1. +template +_LIBCPP_HIDE_FROM_ABI void +__insertion_sort_unguarded(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + using _Ops = _IterOps<_AlgPolicy>; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + if (__first == __last) + return; + for (_RandomAccessIterator __i = __first + difference_type(1); __i != __last; ++__i) { + _RandomAccessIterator __j = __i - difference_type(1); + if (__comp(*__i, *__j)) { + value_type __t(_Ops::__iter_move(__i)); + _RandomAccessIterator __k = __j; + __j = __i; + do { + *__j = _Ops::__iter_move(__k); + __j = __k; + } while (__comp(__t, *--__k)); // No need for bounds check due to the assumption stated above. + *__j = std::move(__t); + } + } +} + +template +_LIBCPP_HIDDEN bool __insertion_sort_incomplete( + _RandomAccessIterator __first, _RandomAccessIterator __last, _WrappedComp __wrapped_comp) { + using _Unwrap = _UnwrapAlgPolicy<_WrappedComp>; + using _AlgPolicy = typename _Unwrap::_AlgPolicy; + using _Ops = _IterOps<_AlgPolicy>; + + using _Compare = typename _Unwrap::_Comp; + _Compare __comp = _Unwrap::__get_comp(__wrapped_comp); + + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + switch (__last - __first) { + case 0: + case 1: + return true; + case 2: + if (__comp(*--__last, *__first)) + _Ops::iter_swap(__first, __last); + return true; + case 3: + std::__sort3_maybe_branchless<_AlgPolicy, _Compare>(__first, __first + difference_type(1), --__last, __comp); + return true; + case 4: + std::__sort4_maybe_branchless<_AlgPolicy, _Compare>( + __first, __first + difference_type(1), __first + difference_type(2), --__last, __comp); + return true; + case 5: + std::__sort5_maybe_branchless<_AlgPolicy, _Compare>( + __first, __first + difference_type(1), __first + difference_type(2), __first + difference_type(3), + --__last, __comp); + return true; + } + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + _RandomAccessIterator __j = __first + difference_type(2); + std::__sort3_maybe_branchless<_AlgPolicy, _Compare>(__first, __first + difference_type(1), __j, __comp); + const unsigned __limit = 8; + unsigned __count = 0; + for (_RandomAccessIterator __i = __j + difference_type(1); __i != __last; ++__i) { + if (__comp(*__i, *__j)) { + value_type __t(_Ops::__iter_move(__i)); + _RandomAccessIterator __k = __j; + __j = __i; + do { + *__j = _Ops::__iter_move(__k); + __j = __k; + } while (__j != __first && __comp(__t, *--__k)); + *__j = std::move(__t); + if (++__count == __limit) + return ++__i == __last; + } + __j = __i; + } + return true; +} + +template +_LIBCPP_HIDE_FROM_ABI +void __insertion_sort_move(_BidirectionalIterator __first1, _BidirectionalIterator __last1, + typename iterator_traits<_BidirectionalIterator>::value_type* __first2, _Compare __comp) { + using _Ops = _IterOps<_AlgPolicy>; + + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + if (__first1 != __last1) { + __destruct_n __d(0); + unique_ptr __h(__first2, __d); + value_type* __last2 = __first2; + ::new ((void*)__last2) value_type(_Ops::__iter_move(__first1)); + __d.template __incr(); + for (++__last2; ++__first1 != __last1; ++__last2) { + value_type* __j2 = __last2; + value_type* __i2 = __j2; + if (__comp(*__first1, *--__i2)) { + ::new ((void*)__j2) value_type(std::move(*__i2)); + __d.template __incr(); + for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2) + *__j2 = std::move(*__i2); + *__j2 = _Ops::__iter_move(__first1); + } else { + ::new ((void*)__j2) value_type(_Ops::__iter_move(__first1)); + __d.template __incr(); + } + } + __h.release(); + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI void __swap_bitmap_pos( + _RandomAccessIterator __first, _RandomAccessIterator __last, uint64_t& __left_bitset, uint64_t& __right_bitset) { + using _Ops = _IterOps<_AlgPolicy>; + typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type difference_type; + // Swap one pair on each iteration as long as both bitsets have at least one + // element for swapping. + while (__left_bitset != 0 && __right_bitset != 0) { + difference_type tz_left = __libcpp_ctz(__left_bitset); + __left_bitset = __libcpp_blsr(__left_bitset); + difference_type tz_right = __libcpp_ctz(__right_bitset); + __right_bitset = __libcpp_blsr(__right_bitset); + _Ops::iter_swap(__first + tz_left, __last - tz_right); + } +} + +template ::value_type> +inline _LIBCPP_HIDE_FROM_ABI void +__populate_left_bitset(_RandomAccessIterator __first, _Compare __comp, _ValueType& __pivot, uint64_t& __left_bitset) { + // Possible vectorization. With a proper "-march" flag, the following loop + // will be compiled into a set of SIMD instructions. + _RandomAccessIterator __iter = __first; + for (int __j = 0; __j < __detail::__block_size;) { + bool __comp_result = !__comp(*__iter, __pivot); + __left_bitset |= (static_cast(__comp_result) << __j); + __j++; + ++__iter; + } +} + +template ::value_type> +inline _LIBCPP_HIDE_FROM_ABI void +__populate_right_bitset(_RandomAccessIterator __lm1, _Compare __comp, _ValueType& __pivot, uint64_t& __right_bitset) { + // Possible vectorization. With a proper "-march" flag, the following loop + // will be compiled into a set of SIMD instructions. + _RandomAccessIterator __iter = __lm1; + for (int __j = 0; __j < __detail::__block_size;) { + bool __comp_result = __comp(*__iter, __pivot); + __right_bitset |= (static_cast(__comp_result) << __j); + __j++; + --__iter; + } +} + +template ::value_type> +inline _LIBCPP_HIDE_FROM_ABI void __bitset_partition_partial_blocks( + _RandomAccessIterator& __first, + _RandomAccessIterator& __lm1, + _Compare __comp, + _ValueType& __pivot, + uint64_t& __left_bitset, + uint64_t& __right_bitset) { + typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type difference_type; + difference_type __remaining_len = __lm1 - __first + 1; + difference_type __l_size; + difference_type __r_size; + if (__left_bitset == 0 && __right_bitset == 0) { + __l_size = __remaining_len / 2; + __r_size = __remaining_len - __l_size; + } else if (__left_bitset == 0) { + // We know at least one side is a full block. + __l_size = __remaining_len - __detail::__block_size; + __r_size = __detail::__block_size; + } else { // if (__right_bitset == 0) + __l_size = __detail::__block_size; + __r_size = __remaining_len - __detail::__block_size; + } + // Record the comparison outcomes for the elements currently on the left side. + if (__left_bitset == 0) { + _RandomAccessIterator __iter = __first; + for (int j = 0; j < __l_size; j++) { + bool __comp_result = !__comp(*__iter, __pivot); + __left_bitset |= (static_cast(__comp_result) << j); + ++__iter; + } + } + // Record the comparison outcomes for the elements currently on the right + // side. + if (__right_bitset == 0) { + _RandomAccessIterator __iter = __lm1; + for (int j = 0; j < __r_size; j++) { + bool __comp_result = __comp(*__iter, __pivot); + __right_bitset |= (static_cast(__comp_result) << j); + --__iter; + } + } + std::__swap_bitmap_pos<_AlgPolicy, _RandomAccessIterator>(__first, __lm1, __left_bitset, __right_bitset); + __first += (__left_bitset == 0) ? __l_size : 0; + __lm1 -= (__right_bitset == 0) ? __r_size : 0; +} + +template +inline _LIBCPP_HIDE_FROM_ABI void __swap_bitmap_pos_within( + _RandomAccessIterator& __first, _RandomAccessIterator& __lm1, uint64_t& __left_bitset, uint64_t& __right_bitset) { + using _Ops = _IterOps<_AlgPolicy>; + typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type difference_type; + if (__left_bitset) { + // Swap within the left side. Need to find set positions in the reverse + // order. + while (__left_bitset != 0) { + difference_type __tz_left = __detail::__block_size - 1 - __libcpp_clz(__left_bitset); + __left_bitset &= (static_cast(1) << __tz_left) - 1; + _RandomAccessIterator it = __first + __tz_left; + if (it != __lm1) { + _Ops::iter_swap(it, __lm1); + } + --__lm1; + } + __first = __lm1 + difference_type(1); + } else if (__right_bitset) { + // Swap within the right side. Need to find set positions in the reverse + // order. + while (__right_bitset != 0) { + difference_type __tz_right = __detail::__block_size - 1 - __libcpp_clz(__right_bitset); + __right_bitset &= (static_cast(1) << __tz_right) - 1; + _RandomAccessIterator it = __lm1 - __tz_right; + if (it != __first) { + _Ops::iter_swap(it, __first); + } + ++__first; + } + } +} + +// Partition [__first, __last) using the comparator __comp. *__first has the +// chosen pivot. Elements that are equivalent are kept to the left of the +// pivot. Returns the iterator for the pivot and a bool value which is true if +// the provided range is already sorted, false otherwise. We assume that the +// length of the range is at least three elements. +// +// __bitset_partition uses bitsets for storing outcomes of the comparisons +// between the pivot and other elements. +template +_LIBCPP_HIDE_FROM_ABI std::pair<_RandomAccessIterator, bool> +__bitset_partition(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + using _Ops = _IterOps<_AlgPolicy>; + typedef typename std::iterator_traits<_RandomAccessIterator>::value_type value_type; + typedef typename std::iterator_traits<_RandomAccessIterator>::difference_type difference_type; + _LIBCPP_ASSERT(__last - __first >= difference_type(3), ""); + + _RandomAccessIterator __begin = __first; + value_type __pivot(_Ops::__iter_move(__first)); + // Find the first element greater than the pivot. + if (__comp(__pivot, *(__last - difference_type(1)))) { + // Not guarded since we know the last element is greater than the pivot. + while (!__comp(__pivot, *++__first)) { + } + } else { + while (++__first < __last && !__comp(__pivot, *__first)) { + } + } + // Find the last element less than or equal to the pivot. + if (__first < __last) { + // It will be always guarded because __introsort will do the median-of-three + // before calling this. + while (__comp(__pivot, *--__last)) { + } + } + // If the first element greater than the pivot is at or after the + // last element less than or equal to the pivot, then we have covered the + // entire range without swapping elements. This implies the range is already + // partitioned. + bool __already_partitioned = __first >= __last; + if (!__already_partitioned) { + _Ops::iter_swap(__first, __last); + ++__first; + } + + // In [__first, __last) __last is not inclusive. From now on, it uses last + // minus one to be inclusive on both sides. + _RandomAccessIterator __lm1 = __last - difference_type(1); + uint64_t __left_bitset = 0; + uint64_t __right_bitset = 0; + + // Reminder: length = __lm1 - __first + 1. + while (__lm1 - __first >= 2 * __detail::__block_size - 1) { + // Record the comparison outcomes for the elements currently on the left + // side. + if (__left_bitset == 0) + std::__populate_left_bitset<_Compare>(__first, __comp, __pivot, __left_bitset); + // Record the comparison outcomes for the elements currently on the right + // side. + if (__right_bitset == 0) + std::__populate_right_bitset<_Compare>(__lm1, __comp, __pivot, __right_bitset); + // Swap the elements recorded to be the candidates for swapping in the + // bitsets. + std::__swap_bitmap_pos<_AlgPolicy, _RandomAccessIterator>(__first, __lm1, __left_bitset, __right_bitset); + // Only advance the iterator if all the elements that need to be moved to + // other side were moved. + __first += (__left_bitset == 0) ? difference_type(__detail::__block_size) : difference_type(0); + __lm1 -= (__right_bitset == 0) ? difference_type(__detail::__block_size) : difference_type(0); + } + // Now, we have a less-than a block worth of elements on at least one of the + // sides. + std::__bitset_partition_partial_blocks<_AlgPolicy, _Compare>( + __first, __lm1, __comp, __pivot, __left_bitset, __right_bitset); + // At least one the bitsets would be empty. For the non-empty one, we need to + // properly partition the elements that appear within that bitset. + std::__swap_bitmap_pos_within<_AlgPolicy>(__first, __lm1, __left_bitset, __right_bitset); + + // Move the pivot to its correct position. + _RandomAccessIterator __pivot_pos = __first - difference_type(1); + if (__begin != __pivot_pos) { + *__begin = _Ops::__iter_move(__pivot_pos); + } + *__pivot_pos = std::move(__pivot); + return std::make_pair(__pivot_pos, __already_partitioned); +} + +// Partition [__first, __last) using the comparator __comp. *__first has the +// chosen pivot. Elements that are equivalent are kept to the right of the +// pivot. Returns the iterator for the pivot and a bool value which is true if +// the provided range is already sorted, false otherwise. We assume that the +// length of the range is at least three elements. +template +_LIBCPP_HIDE_FROM_ABI std::pair<_RandomAccessIterator, bool> +__partition_with_equals_on_right(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + using _Ops = _IterOps<_AlgPolicy>; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename std::iterator_traits<_RandomAccessIterator>::value_type value_type; + _LIBCPP_ASSERT(__last - __first >= difference_type(3), ""); + _RandomAccessIterator __begin = __first; + value_type __pivot(_Ops::__iter_move(__first)); + // Find the first element greater or equal to the pivot. It will be always + // guarded because __introsort will do the median-of-three before calling + // this. + while (__comp(*++__first, __pivot)) + ; + + // Find the last element less than the pivot. + if (__begin == __first - difference_type(1)) { + while (__first < __last && !__comp(*--__last, __pivot)) + ; + } else { + // Guarded. + while (!__comp(*--__last, __pivot)) + ; + } + + // If the first element greater than or equal to the pivot is at or after the + // last element less than the pivot, then we have covered the entire range + // without swapping elements. This implies the range is already partitioned. + bool __already_partitioned = __first >= __last; + // Go through the remaining elements. Swap pairs of elements (one to the + // right of the pivot and the other to left of the pivot) that are not on the + // correct side of the pivot. + while (__first < __last) { + _Ops::iter_swap(__first, __last); + while (__comp(*++__first, __pivot)) + ; + while (!__comp(*--__last, __pivot)) + ; + } + // Move the pivot to its correct position. + _RandomAccessIterator __pivot_pos = __first - difference_type(1); + if (__begin != __pivot_pos) { + *__begin = _Ops::__iter_move(__pivot_pos); + } + *__pivot_pos = std::move(__pivot); + return std::make_pair(__pivot_pos, __already_partitioned); +} + +// Similar to the above function. Elements equivalent to the pivot are put to +// the left of the pivot. Returns the iterator to the pivot element. +template +_LIBCPP_HIDE_FROM_ABI _RandomAccessIterator +__partition_with_equals_on_left(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + using _Ops = _IterOps<_AlgPolicy>; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + typedef typename std::iterator_traits<_RandomAccessIterator>::value_type value_type; + _RandomAccessIterator __begin = __first; + value_type __pivot(_Ops::__iter_move(__first)); + if (__comp(__pivot, *(__last - difference_type(1)))) { + // Guarded. + while (!__comp(__pivot, *++__first)) { + } + } else { + while (++__first < __last && !__comp(__pivot, *__first)) { + } + } + + if (__first < __last) { + // It will be always guarded because __introsort will do the + // median-of-three before calling this. + while (__comp(__pivot, *--__last)) { + } + } + while (__first < __last) { + _Ops::iter_swap(__first, __last); + while (!__comp(__pivot, *++__first)) + ; + while (__comp(__pivot, *--__last)) + ; + } + _RandomAccessIterator __pivot_pos = __first - difference_type(1); + if (__begin != __pivot_pos) { + *__begin = _Ops::__iter_move(__pivot_pos); + } + *__pivot_pos = std::move(__pivot); + return __first; +} + +// The main sorting function. Implements introsort combined with other ideas: +// - option of using block quick sort for partitioning, +// - guarded and unguarded insertion sort for small lengths, +// - Tuckey's ninther technique for computing the pivot, +// - check on whether partition was not required. +// The implementation is partly based on Orson Peters' pattern-defeating +// quicksort, published at: . +template +void __introsort(_RandomAccessIterator __first, + _RandomAccessIterator __last, + _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __depth, + bool __leftmost = true) { + using _Ops = _IterOps<_AlgPolicy>; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + using _Comp_ref = __comp_ref_type<_Compare>; + // Upper bound for using insertion sort for sorting. + _LIBCPP_CONSTEXPR difference_type __limit = 24; + // Lower bound for using Tuckey's ninther technique for median computation. + _LIBCPP_CONSTEXPR difference_type __ninther_threshold = 128; + while (true) { + difference_type __len = __last - __first; + switch (__len) { + case 0: + case 1: + return; + case 2: + if (__comp(*--__last, *__first)) + _Ops::iter_swap(__first, __last); + return; + case 3: + std::__sort3_maybe_branchless<_AlgPolicy, _Compare>(__first, __first + difference_type(1), --__last, __comp); + return; + case 4: + std::__sort4_maybe_branchless<_AlgPolicy, _Compare>( + __first, __first + difference_type(1), __first + difference_type(2), --__last, __comp); + return; + case 5: + std::__sort5_maybe_branchless<_AlgPolicy, _Compare>( + __first, __first + difference_type(1), __first + difference_type(2), __first + difference_type(3), + --__last, __comp); + return; + } + // Use insertion sort if the length of the range is below the specified limit. + if (__len < __limit) { + if (__leftmost) { + std::__insertion_sort<_AlgPolicy, _Compare>(__first, __last, __comp); + } else { + std::__insertion_sort_unguarded<_AlgPolicy, _Compare>(__first, __last, __comp); + } + return; + } + if (__depth == 0) { + // Fallback to heap sort as Introsort suggests. + std::__partial_sort<_AlgPolicy, _Compare>(__first, __last, __last, __comp); + return; + } + --__depth; + { + difference_type __half_len = __len / 2; + // Use Tuckey's ninther technique or median of 3 for pivot selection + // depending on the length of the range being sorted. + if (__len > __ninther_threshold) { + std::__sort3<_AlgPolicy, _Compare>(__first, __first + __half_len, __last - difference_type(1), __comp); + std::__sort3<_AlgPolicy, _Compare>( + __first + difference_type(1), __first + (__half_len - 1), __last - difference_type(2), __comp); + std::__sort3<_AlgPolicy, _Compare>( + __first + difference_type(2), __first + (__half_len + 1), __last - difference_type(3), __comp); + std::__sort3<_AlgPolicy, _Compare>( + __first + (__half_len - 1), __first + __half_len, __first + (__half_len + 1), __comp); + _Ops::iter_swap(__first, __first + __half_len); + } else { + std::__sort3<_AlgPolicy, _Compare>(__first + __half_len, __first, __last - difference_type(1), __comp); + } + } + // The elements to the left of the current iterator range are already + // sorted. If the current iterator range to be sorted is not the + // leftmost part of the entire iterator range and the pivot is same as + // the highest element in the range to the left, then we know that all + // the elements in the range [first, pivot] would be equal to the pivot, + // assuming the equal elements are put on the left side when + // partitioned. This also means that we do not need to sort the left + // side of the partition. + if (!__leftmost && !__comp(*(__first - difference_type(1)), *__first)) { + __first = std::__partition_with_equals_on_left<_AlgPolicy, _RandomAccessIterator, _Comp_ref>( + __first, __last, _Comp_ref(__comp)); + continue; + } + // Use bitset partition only if asked for. + auto __ret = + _UseBitSetPartition + ? std::__bitset_partition<_AlgPolicy, _RandomAccessIterator, _Compare>(__first, __last, __comp) + : std::__partition_with_equals_on_right<_AlgPolicy, _RandomAccessIterator, _Compare>(__first, __last, __comp); + _RandomAccessIterator __i = __ret.first; + // [__first, __i) < *__i and *__i <= [__i+1, __last) + // If we were given a perfect partition, see if insertion sort is quick... + if (__ret.second) { + using _WrappedComp = typename _WrapAlgPolicy<_AlgPolicy, _Compare>::type; + _WrappedComp __wrapped_comp(__comp); + bool __fs = std::__insertion_sort_incomplete<_WrappedComp>(__first, __i, __wrapped_comp); + if (std::__insertion_sort_incomplete<_WrappedComp>(__i + difference_type(1), __last, __wrapped_comp)) { + if (__fs) + return; + __last = __i; + continue; + } else { + if (__fs) { + __first = ++__i; + continue; + } + } + } + // Sort the left partiton recursively and the right partition with tail recursion elimination. + std::__introsort<_AlgPolicy, _Compare, _RandomAccessIterator, _UseBitSetPartition>( + __first, __i, __comp, __depth, __leftmost); + __leftmost = false; + __first = ++__i; + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI _Number __log2i(_Number __n) { + if (__n == 0) + return 0; + if (sizeof(__n) <= sizeof(unsigned)) + return sizeof(unsigned) * CHAR_BIT - 1 - __libcpp_clz(static_cast(__n)); + if (sizeof(__n) <= sizeof(unsigned long)) + return sizeof(unsigned long) * CHAR_BIT - 1 - __libcpp_clz(static_cast(__n)); + if (sizeof(__n) <= sizeof(unsigned long long)) + return sizeof(unsigned long long) * CHAR_BIT - 1 - __libcpp_clz(static_cast(__n)); + + _Number __log2 = 0; + while (__n > 1) { + __log2++; + __n >>= 1; + } + return __log2; +} + +template +_LIBCPP_HIDDEN void __sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _WrappedComp __wrapped_comp) { + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + difference_type __depth_limit = 2 * std::__log2i(__last - __first); + + using _Unwrap = _UnwrapAlgPolicy<_WrappedComp>; + using _AlgPolicy = typename _Unwrap::_AlgPolicy; + using _Compare = typename _Unwrap::_Comp; + _Compare __comp = _Unwrap::__get_comp(__wrapped_comp); + // Only use bitset partitioning for arithmetic types. We should also check + // that the default comparator is in use so that we are sure that there are no + // branches in the comparator. + std::__introsort<_AlgPolicy, + _Compare, + _RandomAccessIterator, + __use_branchless_sort<_Compare, _RandomAccessIterator>::value>( + __first, __last, __comp, __depth_limit); +} + +template +inline _LIBCPP_INLINE_VISIBILITY void __sort(_Tp** __first, _Tp** __last, __less<_Tp*>&) { + __less __comp; + std::__sort<__less&, uintptr_t*>((uintptr_t*)__first, (uintptr_t*)__last, __comp); +} + +extern template _LIBCPP_FUNC_VIS void __sort<__less&, char*>(char*, char*, __less&); +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +extern template _LIBCPP_FUNC_VIS void __sort<__less&, wchar_t*>(wchar_t*, wchar_t*, __less&); +#endif +extern template _LIBCPP_FUNC_VIS void __sort<__less&, signed char*>(signed char*, signed char*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, unsigned char*>(unsigned char*, unsigned char*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, short*>(short*, short*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, unsigned short*>(unsigned short*, unsigned short*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, int*>(int*, int*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, unsigned*>(unsigned*, unsigned*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, long*>(long*, long*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, unsigned long*>(unsigned long*, unsigned long*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, long long*>(long long*, long long*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, unsigned long long*>(unsigned long long*, unsigned long long*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, float*>(float*, float*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, double*>(double*, double*, __less&); +extern template _LIBCPP_FUNC_VIS void __sort<__less&, long double*>(long double*, long double*, __less&); + +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, char*>(char*, char*, __less&); +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, wchar_t*>(wchar_t*, wchar_t*, __less&); +#endif +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, signed char*>(signed char*, signed char*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, unsigned char*>(unsigned char*, unsigned char*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, short*>(short*, short*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, unsigned short*>(unsigned short*, unsigned short*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, int*>(int*, int*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, unsigned*>(unsigned*, unsigned*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, long*>(long*, long*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, unsigned long*>(unsigned long*, unsigned long*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, long long*>(long long*, long long*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, unsigned long long*>(unsigned long long*, unsigned long long*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, float*>(float*, float*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, double*>(double*, double*, __less&); +extern template _LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less&, long double*>(long double*, long double*, __less&); + +extern template _LIBCPP_FUNC_VIS unsigned __sort5<__less&, long double*>(long double*, long double*, long double*, long double*, long double*, __less&); + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void __sort_impl(_RandomAccessIterator __first, _RandomAccessIterator __last, _Comp& __comp) { + std::__debug_randomize_range<_AlgPolicy>(__first, __last); + + using _Comp_ref = __comp_ref_type<_Comp>; + if (__libcpp_is_constant_evaluated()) { + std::__partial_sort<_AlgPolicy>(__first, __last, __last, __comp); + + } else { + using _WrappedComp = typename _WrapAlgPolicy<_AlgPolicy, _Comp_ref>::type; + _Comp_ref __comp_ref(__comp); + _WrappedComp __wrapped_comp(__comp_ref); + std::__sort<_WrappedComp>(std::__unwrap_iter(__first), std::__unwrap_iter(__last), __wrapped_comp); + } +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) { + std::__sort_impl<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void sort(_RandomAccessIterator __first, _RandomAccessIterator __last) { + std::sort(__first, __last, __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SORT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/sort_heap.h b/app/src/main/cpp/libcxx/include/__algorithm/sort_heap.h new file mode 100644 index 0000000..8249407 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/sort_heap.h @@ -0,0 +1,55 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SORT_HEAP_H +#define _LIBCPP___ALGORITHM_SORT_HEAP_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/pop_heap.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +void __sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp) { + __comp_ref_type<_Compare> __comp_ref = __comp; + + using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type; + for (difference_type __n = __last - __first; __n > 1; --__last, (void) --__n) + std::__pop_heap<_AlgPolicy>(__first, __last, __comp_ref, __n); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + static_assert(std::is_copy_constructible<_RandomAccessIterator>::value, "Iterators must be copy constructible."); + static_assert(std::is_copy_assignable<_RandomAccessIterator>::value, "Iterators must be copy assignable."); + + std::__sort_heap<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +void sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) { + std::sort_heap(std::move(__first), std::move(__last), + __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SORT_HEAP_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/stable_partition.h b/app/src/main/cpp/libcxx/include/__algorithm/stable_partition.h new file mode 100644 index 0000000..a49de6d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/stable_partition.h @@ -0,0 +1,329 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_STABLE_PARTITION_H +#define _LIBCPP___ALGORITHM_STABLE_PARTITION_H + +#include <__algorithm/iterator_operations.h> +#include <__algorithm/rotate.h> +#include <__config> +#include <__iterator/advance.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__memory/destruct_n.h> +#include <__memory/temporary_buffer.h> +#include <__memory/unique_ptr.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _ForwardIterator +__stable_partition_impl(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, + _Distance __len, _Pair __p, forward_iterator_tag __fit) +{ + using _Ops = _IterOps<_AlgPolicy>; + + // *__first is known to be false + // __len >= 1 + if (__len == 1) + return __first; + if (__len == 2) + { + _ForwardIterator __m = __first; + if (__pred(*++__m)) + { + _Ops::iter_swap(__first, __m); + return __m; + } + return __first; + } + if (__len <= __p.second) + { // The buffer is big enough to use + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; + __destruct_n __d(0); + unique_ptr __h(__p.first, __d); + // Move the falses into the temporary buffer, and the trues to the front of the line + // Update __first to always point to the end of the trues + value_type* __t = __p.first; + ::new ((void*)__t) value_type(_Ops::__iter_move(__first)); + __d.template __incr(); + ++__t; + _ForwardIterator __i = __first; + while (++__i != __last) + { + if (__pred(*__i)) + { + *__first = _Ops::__iter_move(__i); + ++__first; + } + else + { + ::new ((void*)__t) value_type(_Ops::__iter_move(__i)); + __d.template __incr(); + ++__t; + } + } + // All trues now at start of range, all falses in buffer + // Move falses back into range, but don't mess up __first which points to first false + __i = __first; + for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, (void) ++__i) + *__i = _Ops::__iter_move(__t2); + // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer + return __first; + } + // Else not enough buffer, do in place + // __len >= 3 + _ForwardIterator __m = __first; + _Distance __len2 = __len / 2; // __len2 >= 2 + _Ops::advance(__m, __len2); + // recurse on [__first, __m), *__first know to be false + // F????????????????? + // f m l + _ForwardIterator __first_false = std::__stable_partition_impl<_AlgPolicy, _Predicate&>( + __first, __m, __pred, __len2, __p, __fit); + // TTTFFFFF?????????? + // f ff m l + // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true + _ForwardIterator __m1 = __m; + _ForwardIterator __second_false = __last; + _Distance __len_half = __len - __len2; + while (__pred(*__m1)) + { + if (++__m1 == __last) + goto __second_half_done; + --__len_half; + } + // TTTFFFFFTTTF?????? + // f ff m m1 l + __second_false = std::__stable_partition_impl<_AlgPolicy, _Predicate&>( + __m1, __last, __pred, __len_half, __p, __fit); +__second_half_done: + // TTTFFFFFTTTTTFFFFF + // f ff m sf l + return std::__rotate<_AlgPolicy>(__first_false, __m, __second_false).first; + // TTTTTTTTFFFFFFFFFF + // | +} + +template +_LIBCPP_HIDE_FROM_ABI _ForwardIterator +__stable_partition_impl(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, + forward_iterator_tag) +{ + const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment + // Either prove all true and return __first or point to first false + while (true) + { + if (__first == __last) + return __first; + if (!__pred(*__first)) + break; + ++__first; + } + // We now have a reduced range [__first, __last) + // *__first is known to be false + typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; + typedef typename iterator_traits<_ForwardIterator>::value_type value_type; + difference_type __len = _IterOps<_AlgPolicy>::distance(__first, __last); + pair __p(0, 0); + unique_ptr __h; + if (__len >= __alloc_limit) + { +// TODO: Remove the use of std::get_temporary_buffer +_LIBCPP_SUPPRESS_DEPRECATED_PUSH + __p = _VSTD::get_temporary_buffer(__len); +_LIBCPP_SUPPRESS_DEPRECATED_POP + __h.reset(__p.first); + } + return std::__stable_partition_impl<_AlgPolicy, _Predicate&>( + std::move(__first), std::move(__last), __pred, __len, __p, forward_iterator_tag()); +} + +template +_BidirectionalIterator +__stable_partition_impl(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, + _Distance __len, _Pair __p, bidirectional_iterator_tag __bit) +{ + using _Ops = _IterOps<_AlgPolicy>; + + // *__first is known to be false + // *__last is known to be true + // __len >= 2 + if (__len == 2) + { + _Ops::iter_swap(__first, __last); + return __last; + } + if (__len == 3) + { + _BidirectionalIterator __m = __first; + if (__pred(*++__m)) + { + _Ops::iter_swap(__first, __m); + _Ops::iter_swap(__m, __last); + return __last; + } + _Ops::iter_swap(__m, __last); + _Ops::iter_swap(__first, __m); + return __m; + } + if (__len <= __p.second) + { // The buffer is big enough to use + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + __destruct_n __d(0); + unique_ptr __h(__p.first, __d); + // Move the falses into the temporary buffer, and the trues to the front of the line + // Update __first to always point to the end of the trues + value_type* __t = __p.first; + ::new ((void*)__t) value_type(_Ops::__iter_move(__first)); + __d.template __incr(); + ++__t; + _BidirectionalIterator __i = __first; + while (++__i != __last) + { + if (__pred(*__i)) + { + *__first = _Ops::__iter_move(__i); + ++__first; + } + else + { + ::new ((void*)__t) value_type(_Ops::__iter_move(__i)); + __d.template __incr(); + ++__t; + } + } + // move *__last, known to be true + *__first = _Ops::__iter_move(__i); + __i = ++__first; + // All trues now at start of range, all falses in buffer + // Move falses back into range, but don't mess up __first which points to first false + for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, (void) ++__i) + *__i = _Ops::__iter_move(__t2); + // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer + return __first; + } + // Else not enough buffer, do in place + // __len >= 4 + _BidirectionalIterator __m = __first; + _Distance __len2 = __len / 2; // __len2 >= 2 + _Ops::advance(__m, __len2); + // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false + // F????????????????T + // f m l + _BidirectionalIterator __m1 = __m; + _BidirectionalIterator __first_false = __first; + _Distance __len_half = __len2; + while (!__pred(*--__m1)) + { + if (__m1 == __first) + goto __first_half_done; + --__len_half; + } + // F???TFFF?????????T + // f m1 m l + __first_false = std::__stable_partition_impl<_AlgPolicy, _Predicate&>( + __first, __m1, __pred, __len_half, __p, __bit); +__first_half_done: + // TTTFFFFF?????????T + // f ff m l + // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true + __m1 = __m; + _BidirectionalIterator __second_false = __last; + ++__second_false; + __len_half = __len - __len2; + while (__pred(*__m1)) + { + if (++__m1 == __last) + goto __second_half_done; + --__len_half; + } + // TTTFFFFFTTTF?????T + // f ff m m1 l + __second_false = std::__stable_partition_impl<_AlgPolicy, _Predicate&>( + __m1, __last, __pred, __len_half, __p, __bit); +__second_half_done: + // TTTFFFFFTTTTTFFFFF + // f ff m sf l + return std::__rotate<_AlgPolicy>(__first_false, __m, __second_false).first; + // TTTTTTTTFFFFFFFFFF + // | +} + +template +_LIBCPP_HIDE_FROM_ABI _BidirectionalIterator +__stable_partition_impl(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, + bidirectional_iterator_tag) +{ + typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; + typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; + const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment + // Either prove all true and return __first or point to first false + while (true) + { + if (__first == __last) + return __first; + if (!__pred(*__first)) + break; + ++__first; + } + // __first points to first false, everything prior to __first is already set. + // Either prove [__first, __last) is all false and return __first, or point __last to last true + do + { + if (__first == --__last) + return __first; + } while (!__pred(*__last)); + // We now have a reduced range [__first, __last] + // *__first is known to be false + // *__last is known to be true + // __len >= 2 + difference_type __len = _IterOps<_AlgPolicy>::distance(__first, __last) + 1; + pair __p(0, 0); + unique_ptr __h; + if (__len >= __alloc_limit) + { +// TODO: Remove the use of std::get_temporary_buffer +_LIBCPP_SUPPRESS_DEPRECATED_PUSH + __p = _VSTD::get_temporary_buffer(__len); +_LIBCPP_SUPPRESS_DEPRECATED_POP + __h.reset(__p.first); + } + return std::__stable_partition_impl<_AlgPolicy, _Predicate&>( + std::move(__first), std::move(__last), __pred, __len, __p, bidirectional_iterator_tag()); +} + +template +_LIBCPP_HIDE_FROM_ABI +_ForwardIterator __stable_partition( + _ForwardIterator __first, _ForwardIterator __last, _Predicate&& __pred, _IterCategory __iter_category) { + return std::__stable_partition_impl<_AlgPolicy, __remove_cvref_t<_Predicate>&>( + std::move(__first), std::move(__last), __pred, __iter_category); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_ForwardIterator +stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) +{ + using _IterCategory = typename iterator_traits<_ForwardIterator>::iterator_category; + return std::__stable_partition<_ClassicAlgPolicy, _Predicate&>( + std::move(__first), std::move(__last), __pred, _IterCategory()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_STABLE_PARTITION_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/stable_sort.h b/app/src/main/cpp/libcxx/include/__algorithm/stable_sort.h new file mode 100644 index 0000000..8e70978 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/stable_sort.h @@ -0,0 +1,247 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_STABLE_SORT_H +#define _LIBCPP___ALGORITHM_STABLE_SORT_H + +#include <__algorithm/comp.h> +#include <__algorithm/comp_ref_type.h> +#include <__algorithm/inplace_merge.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/sort.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__memory/destruct_n.h> +#include <__memory/temporary_buffer.h> +#include <__memory/unique_ptr.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI void +__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp) +{ + using _Ops = _IterOps<_AlgPolicy>; + + typedef typename iterator_traits<_InputIterator1>::value_type value_type; + __destruct_n __d(0); + unique_ptr __h(__result, __d); + for (; true; ++__result) + { + if (__first1 == __last1) + { + for (; __first2 != __last2; ++__first2, (void) ++__result, __d.template __incr()) + ::new ((void*)__result) value_type(_Ops::__iter_move(__first2)); + __h.release(); + return; + } + if (__first2 == __last2) + { + for (; __first1 != __last1; ++__first1, (void) ++__result, __d.template __incr()) + ::new ((void*)__result) value_type(_Ops::__iter_move(__first1)); + __h.release(); + return; + } + if (__comp(*__first2, *__first1)) + { + ::new ((void*)__result) value_type(_Ops::__iter_move(__first2)); + __d.template __incr(); + ++__first2; + } + else + { + ::new ((void*)__result) value_type(_Ops::__iter_move(__first1)); + __d.template __incr(); + ++__first1; + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI void +__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1, + _InputIterator2 __first2, _InputIterator2 __last2, + _OutputIterator __result, _Compare __comp) +{ + using _Ops = _IterOps<_AlgPolicy>; + + for (; __first1 != __last1; ++__result) + { + if (__first2 == __last2) + { + for (; __first1 != __last1; ++__first1, (void) ++__result) + *__result = _Ops::__iter_move(__first1); + return; + } + if (__comp(*__first2, *__first1)) + { + *__result = _Ops::__iter_move(__first2); + ++__first2; + } + else + { + *__result = _Ops::__iter_move(__first1); + ++__first1; + } + } + for (; __first2 != __last2; ++__first2, (void) ++__result) + *__result = _Ops::__iter_move(__first2); +} + +template +void +__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len, + typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size); + +template +void +__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len, + typename iterator_traits<_RandomAccessIterator>::value_type* __first2) +{ + using _Ops = _IterOps<_AlgPolicy>; + + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + switch (__len) + { + case 0: + return; + case 1: + ::new ((void*)__first2) value_type(_Ops::__iter_move(__first1)); + return; + case 2: + __destruct_n __d(0); + unique_ptr __h2(__first2, __d); + if (__comp(*--__last1, *__first1)) + { + ::new ((void*)__first2) value_type(_Ops::__iter_move(__last1)); + __d.template __incr(); + ++__first2; + ::new ((void*)__first2) value_type(_Ops::__iter_move(__first1)); + } + else + { + ::new ((void*)__first2) value_type(_Ops::__iter_move(__first1)); + __d.template __incr(); + ++__first2; + ::new ((void*)__first2) value_type(_Ops::__iter_move(__last1)); + } + __h2.release(); + return; + } + if (__len <= 8) + { + std::__insertion_sort_move<_AlgPolicy, _Compare>(__first1, __last1, __first2, __comp); + return; + } + typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2; + _RandomAccessIterator __m = __first1 + __l2; + std::__stable_sort<_AlgPolicy, _Compare>(__first1, __m, __comp, __l2, __first2, __l2); + std::__stable_sort<_AlgPolicy, _Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2); + std::__merge_move_construct<_AlgPolicy, _Compare>(__first1, __m, __m, __last1, __first2, __comp); +} + +template +struct __stable_sort_switch +{ + static const unsigned value = 128*is_trivially_copy_assignable<_Tp>::value; +}; + +template +void +__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, + typename iterator_traits<_RandomAccessIterator>::difference_type __len, + typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size) +{ + typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; + typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; + switch (__len) + { + case 0: + case 1: + return; + case 2: + if (__comp(*--__last, *__first)) + _IterOps<_AlgPolicy>::iter_swap(__first, __last); + return; + } + if (__len <= static_cast(__stable_sort_switch::value)) + { + std::__insertion_sort<_AlgPolicy, _Compare>(__first, __last, __comp); + return; + } + typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2; + _RandomAccessIterator __m = __first + __l2; + if (__len <= __buff_size) + { + __destruct_n __d(0); + unique_ptr __h2(__buff, __d); + std::__stable_sort_move<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff); + __d.__set(__l2, (value_type*)nullptr); + std::__stable_sort_move<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff + __l2); + __d.__set(__len, (value_type*)nullptr); + std::__merge_move_assign<_AlgPolicy, _Compare>( + __buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp); +// _VSTD::__merge<_Compare>(move_iterator(__buff), +// move_iterator(__buff + __l2), +// move_iterator<_RandomAccessIterator>(__buff + __l2), +// move_iterator<_RandomAccessIterator>(__buff + __len), +// __first, __comp); + return; + } + std::__stable_sort<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff, __buff_size); + std::__stable_sort<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size); + std::__inplace_merge<_AlgPolicy>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size); +} + +template +inline _LIBCPP_HIDE_FROM_ABI +void __stable_sort_impl(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp) { + using value_type = typename iterator_traits<_RandomAccessIterator>::value_type; + using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type; + + difference_type __len = __last - __first; + pair __buf(0, 0); + unique_ptr __h; + if (__len > static_cast(__stable_sort_switch::value)) { +// TODO: Remove the use of std::get_temporary_buffer +_LIBCPP_SUPPRESS_DEPRECATED_PUSH + __buf = std::get_temporary_buffer(__len); +_LIBCPP_SUPPRESS_DEPRECATED_POP + __h.reset(__buf.first); + } + + std::__stable_sort<_AlgPolicy, __comp_ref_type<_Compare> >(__first, __last, __comp, __len, __buf.first, __buf.second); +} + +template +inline _LIBCPP_HIDE_FROM_ABI +void stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) { + std::__stable_sort_impl<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp); +} + +template +inline _LIBCPP_HIDE_FROM_ABI +void stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) { + std::stable_sort(__first, __last, __less::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_STABLE_SORT_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/swap_ranges.h b/app/src/main/cpp/libcxx/include/__algorithm/swap_ranges.h new file mode 100644 index 0000000..5ce5ed8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/swap_ranges.h @@ -0,0 +1,60 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_SWAP_RANGES_H +#define _LIBCPP___ALGORITHM_SWAP_RANGES_H + +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// 2+2 iterators: the shorter size will be used. +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +pair<_ForwardIterator1, _ForwardIterator2> +__swap_ranges(_ForwardIterator1 __first1, _Sentinel1 __last1, _ForwardIterator2 __first2, _Sentinel2 __last2) { + while (__first1 != __last1 && __first2 != __last2) { + _IterOps<_AlgPolicy>::iter_swap(__first1, __first2); + ++__first1; + ++__first2; + } + + return pair<_ForwardIterator1, _ForwardIterator2>(std::move(__first1), std::move(__first2)); +} + +// 2+1 iterators: size2 >= size1. +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +pair<_ForwardIterator1, _ForwardIterator2> +__swap_ranges(_ForwardIterator1 __first1, _Sentinel1 __last1, _ForwardIterator2 __first2) { + while (__first1 != __last1) { + _IterOps<_AlgPolicy>::iter_swap(__first1, __first2); + ++__first1; + ++__first2; + } + + return pair<_ForwardIterator1, _ForwardIterator2>(std::move(__first1), std::move(__first2)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator2 +swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) { + return std::__swap_ranges<_ClassicAlgPolicy>( + std::move(__first1), std::move(__last1), std::move(__first2)).second; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_SWAP_RANGES_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/transform.h b/app/src/main/cpp/libcxx/include/__algorithm/transform.h new file mode 100644 index 0000000..4722c15 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/transform.h @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_TRANSFORM_H +#define _LIBCPP___ALGORITHM_TRANSFORM_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op) +{ + for (; __first != __last; ++__first, (void) ++__result) + *__result = __op(*__first); + return __result; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +_OutputIterator +transform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, + _OutputIterator __result, _BinaryOperation __binary_op) +{ + for (; __first1 != __last1; ++__first1, (void) ++__first2, ++__result) + *__result = __binary_op(*__first1, *__first2); + return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_TRANSFORM_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/uniform_random_bit_generator_adaptor.h b/app/src/main/cpp/libcxx/include/__algorithm/uniform_random_bit_generator_adaptor.h new file mode 100644 index 0000000..1e86074 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/uniform_random_bit_generator_adaptor.h @@ -0,0 +1,62 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_RANGES_UNIFORM_RANDOM_BIT_GENERATOR_ADAPTOR_H +#define _LIBCPP___ALGORITHM_RANGES_UNIFORM_RANDOM_BIT_GENERATOR_ADAPTOR_H + +#include <__config> +#include <__functional/invoke.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Range versions of random algorithms (e.g. `std::shuffle`) are less constrained than their classic counterparts. +// Range algorithms only require the given generator to satisfy the `std::uniform_random_bit_generator` concept. +// Classic algorithms require the given generator to meet the uniform random bit generator requirements; these +// requirements include satisfying `std::uniform_random_bit_generator` and add a requirement for the generator to +// provide a nested `result_type` typedef (see `[rand.req.urng]`). +// +// To be able to reuse classic implementations, make the given generator meet the classic requirements by wrapping +// it into an adaptor type that forwards all of its interface and adds the required typedef. +template +class _ClassicGenAdaptor { +private: + // The generator is not required to be copyable or movable, so it has to be stored as a reference. + _Gen& __gen_; + +public: + using result_type = invoke_result_t<_Gen&>; + + _LIBCPP_HIDE_FROM_ABI + static constexpr auto min() { return __remove_cvref_t<_Gen>::min(); } + _LIBCPP_HIDE_FROM_ABI + static constexpr auto max() { return __remove_cvref_t<_Gen>::max(); } + + _LIBCPP_HIDE_FROM_ABI + constexpr explicit _ClassicGenAdaptor(_Gen& __g) : __gen_(__g) {} + + _LIBCPP_HIDE_FROM_ABI + constexpr auto operator()() const { return __gen_(); } +}; + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___ALGORITHM_RANGES_UNIFORM_RANDOM_BIT_GENERATOR_ADAPTOR_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/unique.h b/app/src/main/cpp/libcxx/include/__algorithm/unique.h new file mode 100644 index 0000000..1717a00 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/unique.h @@ -0,0 +1,59 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_UNIQUE_H +#define _LIBCPP___ALGORITHM_UNIQUE_H + +#include <__algorithm/adjacent_find.h> +#include <__algorithm/comp.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// unique + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 std::pair<_Iter, _Iter> +__unique(_Iter __first, _Sent __last, _BinaryPredicate&& __pred) { + __first = std::__adjacent_find(__first, __last, __pred); + if (__first != __last) { + // ... a a ? ... + // f i + _Iter __i = __first; + for (++__i; ++__i != __last;) + if (!__pred(*__first, *__i)) + *++__first = _IterOps<_AlgPolicy>::__iter_move(__i); + ++__first; + return std::pair<_Iter, _Iter>(std::move(__first), std::move(__i)); + } + return std::pair<_Iter, _Iter>(__first, __first); +} + +template +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) { + return std::__unique<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __pred).first; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +unique(_ForwardIterator __first, _ForwardIterator __last) { + return std::unique(__first, __last, __equal_to()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_UNIQUE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/unique_copy.h b/app/src/main/cpp/libcxx/include/__algorithm/unique_copy.h new file mode 100644 index 0000000..81fcd50 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/unique_copy.h @@ -0,0 +1,122 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_UNIQUE_COPY_H +#define _LIBCPP___ALGORITHM_UNIQUE_COPY_H + +#include <__algorithm/comp.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__type_traits/conditional.h> +#include <__type_traits/is_base_of.h> +#include <__type_traits/is_same.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace __unique_copy_tags { + +struct __reread_from_input_tag {}; +struct __reread_from_output_tag {}; +struct __read_from_tmp_value_tag {}; + +} // namespace __unique_copy_tags + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _OutputIterator> +__unique_copy(_InputIterator __first, + _Sent __last, + _OutputIterator __result, + _BinaryPredicate&& __pred, + __unique_copy_tags::__read_from_tmp_value_tag) { + if (__first != __last) { + typename _IterOps<_AlgPolicy>::template __value_type<_InputIterator> __t(*__first); + *__result = __t; + ++__result; + while (++__first != __last) { + if (!__pred(__t, *__first)) { + __t = *__first; + *__result = __t; + ++__result; + } + } + } + return pair<_InputIterator, _OutputIterator>(std::move(__first), std::move(__result)); +} + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pair<_ForwardIterator, _OutputIterator> +__unique_copy(_ForwardIterator __first, + _Sent __last, + _OutputIterator __result, + _BinaryPredicate&& __pred, + __unique_copy_tags::__reread_from_input_tag) { + if (__first != __last) { + _ForwardIterator __i = __first; + *__result = *__i; + ++__result; + while (++__first != __last) { + if (!__pred(*__i, *__first)) { + *__result = *__first; + ++__result; + __i = __first; + } + } + } + return pair<_ForwardIterator, _OutputIterator>(std::move(__first), std::move(__result)); +} + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pair<_InputIterator, _InputAndOutputIterator> +__unique_copy(_InputIterator __first, + _Sent __last, + _InputAndOutputIterator __result, + _BinaryPredicate&& __pred, + __unique_copy_tags::__reread_from_output_tag) { + if (__first != __last) { + *__result = *__first; + while (++__first != __last) + if (!__pred(*__result, *__first)) + *++__result = *__first; + ++__result; + } + return pair<_InputIterator, _InputAndOutputIterator>(std::move(__first), std::move(__result)); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator +unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred) { + using __algo_tag = __conditional_t< + is_base_of::iterator_category>::value, + __unique_copy_tags::__reread_from_input_tag, + __conditional_t< + is_base_of::iterator_category>::value && + is_same< typename iterator_traits<_InputIterator>::value_type, + typename iterator_traits<_OutputIterator>::value_type>::value, + __unique_copy_tags::__reread_from_output_tag, + __unique_copy_tags::__read_from_tmp_value_tag> >; + return std::__unique_copy<_ClassicAlgPolicy>( + std::move(__first), std::move(__last), std::move(__result), __pred, __algo_tag()) + .second; +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator +unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { + return std::unique_copy(std::move(__first), std::move(__last), std::move(__result), __equal_to()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_UNIQUE_COPY_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/unwrap_iter.h b/app/src/main/cpp/libcxx/include/__algorithm/unwrap_iter.h new file mode 100644 index 0000000..0f661e1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/unwrap_iter.h @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_UNWRAP_ITER_H +#define _LIBCPP___ALGORITHM_UNWRAP_ITER_H + +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__memory/pointer_traits.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_copy_constructible.h> +#include <__utility/declval.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// TODO: Change the name of __unwrap_iter_impl to something more appropriate +// The job of __unwrap_iter is to remove iterator wrappers (like reverse_iterator or __wrap_iter), +// to reduce the number of template instantiations and to enable pointer-based optimizations e.g. in std::copy. +// In debug mode, we don't do this. +// +// Some algorithms (e.g. std::copy, but not std::sort) need to convert an +// "unwrapped" result back into the original iterator type. Doing that is the job of __rewrap_iter. + +// Default case - we can't unwrap anything +template ::value> +struct __unwrap_iter_impl { + static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Iter __rewrap(_Iter, _Iter __iter) { return __iter; } + static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Iter __unwrap(_Iter __i) _NOEXCEPT { return __i; } +}; + +#ifndef _LIBCPP_ENABLE_DEBUG_MODE + +// It's a contiguous iterator, so we can use a raw pointer instead +template +struct __unwrap_iter_impl<_Iter, true> { + using _ToAddressT = decltype(std::__to_address(std::declval<_Iter>())); + + static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Iter __rewrap(_Iter __orig_iter, _ToAddressT __unwrapped_iter) { + return __orig_iter + (__unwrapped_iter - std::__to_address(__orig_iter)); + } + + static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToAddressT __unwrap(_Iter __i) _NOEXCEPT { + return std::__to_address(__i); + } +}; + +#endif // !_LIBCPP_ENABLE_DEBUG_MODE + +template, + __enable_if_t::value, int> = 0> +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +decltype(_Impl::__unwrap(std::declval<_Iter>())) __unwrap_iter(_Iter __i) _NOEXCEPT { + return _Impl::__unwrap(__i); +} + +template > +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _OrigIter __rewrap_iter(_OrigIter __orig_iter, _Iter __iter) _NOEXCEPT { + return _Impl::__rewrap(std::move(__orig_iter), std::move(__iter)); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_UNWRAP_ITER_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/unwrap_range.h b/app/src/main/cpp/libcxx/include/__algorithm/unwrap_range.h new file mode 100644 index 0000000..2c5d23e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/unwrap_range.h @@ -0,0 +1,97 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_UNWRAP_RANGE_H +#define _LIBCPP___ALGORITHM_UNWRAP_RANGE_H + +#include <__algorithm/unwrap_iter.h> +#include <__concepts/constructible.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/next.h> +#include <__utility/declval.h> +#include <__utility/move.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// __unwrap_range and __rewrap_range are used to unwrap ranges which may have different iterator and sentinel types. +// __unwrap_iter and __rewrap_iter don't work for this, because they assume that the iterator and sentinel have +// the same type. __unwrap_range tries to get two iterators and then forward to __unwrap_iter. + +#if _LIBCPP_STD_VER > 17 +template +struct __unwrap_range_impl { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __unwrap(_Iter __first, _Sent __sent) + requires random_access_iterator<_Iter> && sized_sentinel_for<_Sent, _Iter> + { + auto __last = ranges::next(__first, __sent); + return pair{std::__unwrap_iter(std::move(__first)), std::__unwrap_iter(std::move(__last))}; + } + + _LIBCPP_HIDE_FROM_ABI static constexpr auto __unwrap(_Iter __first, _Sent __last) { + return pair{std::move(__first), std::move(__last)}; + } + + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __rewrap(_Iter __orig_iter, decltype(std::__unwrap_iter(__orig_iter)) __iter) + requires random_access_iterator<_Iter> && sized_sentinel_for<_Sent, _Iter> + { + return std::__rewrap_iter(std::move(__orig_iter), std::move(__iter)); + } + + _LIBCPP_HIDE_FROM_ABI static constexpr auto __rewrap(const _Iter&, _Iter __iter) + requires (!(random_access_iterator<_Iter> && sized_sentinel_for<_Sent, _Iter>)) + { + return __iter; + } +}; + +template +struct __unwrap_range_impl<_Iter, _Iter> { + _LIBCPP_HIDE_FROM_ABI static constexpr auto __unwrap(_Iter __first, _Iter __last) { + return pair{std::__unwrap_iter(std::move(__first)), std::__unwrap_iter(std::move(__last))}; + } + + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __rewrap(_Iter __orig_iter, decltype(std::__unwrap_iter(__orig_iter)) __iter) { + return std::__rewrap_iter(std::move(__orig_iter), std::move(__iter)); + } +}; + +template +_LIBCPP_HIDE_FROM_ABI constexpr auto __unwrap_range(_Iter __first, _Sent __last) { + return __unwrap_range_impl<_Iter, _Sent>::__unwrap(std::move(__first), std::move(__last)); +} + +template < + class _Sent, + class _Iter, + class _Unwrapped = decltype(std::__unwrap_range(std::declval<_Iter>(), std::declval<_Sent>()))> +_LIBCPP_HIDE_FROM_ABI constexpr _Iter __rewrap_range(_Iter __orig_iter, _Unwrapped __iter) { + return __unwrap_range_impl<_Iter, _Sent>::__rewrap(std::move(__orig_iter), std::move(__iter)); +} +#else // _LIBCPP_STD_VER > 17 +template ()))> +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR pair<_Unwrapped, _Unwrapped> __unwrap_range(_Iter __first, _Iter __last) { + return std::make_pair(std::__unwrap_iter(std::move(__first)), std::__unwrap_iter(std::move(__last))); +} + +template ()))> +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _Iter __rewrap_range(_Iter __orig_iter, _Unwrapped __iter) { + return std::__rewrap_iter(std::move(__orig_iter), std::move(__iter)); +} +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_UNWRAP_RANGE_H diff --git a/app/src/main/cpp/libcxx/include/__algorithm/upper_bound.h b/app/src/main/cpp/libcxx/include/__algorithm/upper_bound.h new file mode 100644 index 0000000..96552ce --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__algorithm/upper_bound.h @@ -0,0 +1,68 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ALGORITHM_UPPER_BOUND_H +#define _LIBCPP___ALGORITHM_UPPER_BOUND_H + +#include <__algorithm/comp.h> +#include <__algorithm/half_positive.h> +#include <__algorithm/iterator_operations.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h> +#include <__iterator/advance.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/is_copy_constructible.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter +__upper_bound(_Iter __first, _Sent __last, const _Tp& __value, _Compare&& __comp, _Proj&& __proj) { + auto __len = _IterOps<_AlgPolicy>::distance(__first, __last); + while (__len != 0) { + auto __half_len = std::__half_positive(__len); + auto __mid = _IterOps<_AlgPolicy>::next(__first, __half_len); + if (std::__invoke(__comp, __value, std::__invoke(__proj, *__mid))) + __len = __half_len; + else { + __first = ++__mid; + __len -= __half_len + 1; + } + } + return __first; +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) { + static_assert(is_copy_constructible<_ForwardIterator>::value, + "Iterator has to be copy constructible"); + return std::__upper_bound<_ClassicAlgPolicy>( + std::move(__first), std::move(__last), __value, std::move(__comp), std::__identity()); +} + +template +_LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator +upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) { + return std::upper_bound( + std::move(__first), + std::move(__last), + __value, + __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>()); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ALGORITHM_UPPER_BOUND_H diff --git a/app/src/main/cpp/libcxx/include/__assert b/app/src/main/cpp/libcxx/include/__assert new file mode 100644 index 0000000..9c0cd1b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__assert @@ -0,0 +1,55 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ASSERT +#define _LIBCPP___ASSERT + +#include <__config> +#include <__verbose_abort> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +// TODO: Remove in LLVM 17. +#if defined(_LIBCPP_DEBUG) +# error "Defining _LIBCPP_DEBUG is not supported anymore. Please use _LIBCPP_ENABLE_DEBUG_MODE instead." +#endif + +// Automatically enable assertions when the debug mode is enabled. +#if defined(_LIBCPP_ENABLE_DEBUG_MODE) +# ifndef _LIBCPP_ENABLE_ASSERTIONS +# define _LIBCPP_ENABLE_ASSERTIONS 1 +# endif +#endif + +#ifndef _LIBCPP_ENABLE_ASSERTIONS +# define _LIBCPP_ENABLE_ASSERTIONS _LIBCPP_ENABLE_ASSERTIONS_DEFAULT +#endif + +#if _LIBCPP_ENABLE_ASSERTIONS != 0 && _LIBCPP_ENABLE_ASSERTIONS != 1 +# error "_LIBCPP_ENABLE_ASSERTIONS must be set to 0 or 1" +#endif + +#if _LIBCPP_ENABLE_ASSERTIONS +# define _LIBCPP_ASSERT(expression, message) \ + (__builtin_expect(static_cast(expression), 1) ? \ + (void)0 : \ + _LIBCPP_VERBOSE_ABORT("%s:%d: assertion %s failed: %s", __FILE__, __LINE__, #expression, message)) +#elif !defined(_LIBCPP_ASSERTIONS_DISABLE_ASSUME) && __has_builtin(__builtin_assume) +# define _LIBCPP_ASSERT(expression, message) \ + (_LIBCPP_DIAGNOSTIC_PUSH \ + _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wassume") \ + __builtin_assume(static_cast(expression)) \ + _LIBCPP_DIAGNOSTIC_POP) +#else +# define _LIBCPP_ASSERT(expression, message) ((void)0) +#endif + +#endif // _LIBCPP___ASSERT diff --git a/app/src/main/cpp/libcxx/include/__availability b/app/src/main/cpp/libcxx/include/__availability new file mode 100644 index 0000000..6dfca3f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__availability @@ -0,0 +1,288 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___AVAILABILITY +#define _LIBCPP___AVAILABILITY + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +// Libc++ is shipped by various vendors. In particular, it is used as a system +// library on macOS, iOS and other Apple platforms. In order for users to be +// able to compile a binary that is intended to be deployed to an older version +// of a platform, Clang provides availability attributes [1]. These attributes +// can be placed on declarations and are used to describe the life cycle of a +// symbol in the library. +// +// The main goal is to ensure a compile-time error if a symbol that hasn't been +// introduced in a previously released library is used in a program that targets +// that previously released library. Normally, this would be a load-time error +// when one tries to launch the program against the older library. +// +// For example, the filesystem library was introduced in the dylib in macOS 10.15. +// If a user compiles on a macOS 10.15 host but targets macOS 10.13 with their +// program, the compiler would normally not complain (because the required +// declarations are in the headers), but the dynamic loader would fail to find +// the symbols when actually trying to launch the program on macOS 10.13. To +// turn this into a compile-time issue instead, declarations are annotated with +// when they were introduced, and the compiler can produce a diagnostic if the +// program references something that isn't available on the deployment target. +// +// This mechanism is general in nature, and any vendor can add their markup to +// the library (see below). Whenever a new feature is added that requires support +// in the shared library, a macro should be added below to mark this feature +// as unavailable. When vendors decide to ship the feature as part of their +// shared library, they can update the markup appropriately. +// +// Furthermore, many features in the standard library have corresponding +// feature-test macros. When a feature is made unavailable on some deployment +// target, a macro should be defined to signal that it is unavailable. That +// macro can then be picked up when feature-test macros are generated (see +// generate_feature_test_macro_components.py) to make sure that feature-test +// macros don't announce a feature as being implemented if it has been marked +// as unavailable. +// +// Note that this mechanism is disabled by default in the "upstream" libc++. +// Availability annotations are only meaningful when shipping libc++ inside +// a platform (i.e. as a system library), and so vendors that want them should +// turn those annotations on at CMake configuration time. +// +// [1]: https://clang.llvm.org/docs/AttributeReference.html#availability + + +// For backwards compatibility, allow users to define _LIBCPP_DISABLE_AVAILABILITY +// for a while. +#if defined(_LIBCPP_DISABLE_AVAILABILITY) +# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) +# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS +# endif +#endif + +// Availability markup is disabled when building the library, or when the compiler +// doesn't support the proper attributes. +#if defined(_LIBCPP_BUILDING_LIBRARY) || \ + defined(_LIBCXXABI_BUILDING_LIBRARY) || \ + !__has_feature(attribute_availability_with_strict) || \ + !__has_feature(attribute_availability_in_templates) || \ + !__has_extension(pragma_clang_attribute_external_declaration) +# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) +# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS +# endif +#endif + +#if defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) + + // This controls the availability of std::shared_mutex and std::shared_timed_mutex, + // which were added to the dylib later. +# define _LIBCPP_AVAILABILITY_SHARED_MUTEX +// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_mutex +// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_timed_mutex + + // These macros control the availability of std::bad_optional_access and + // other exception types. These were put in the shared library to prevent + // code bloat from every user program defining the vtable for these exception + // types. + // + // Note that when exceptions are disabled, the methods that normally throw + // these exceptions can be used even on older deployment targets, but those + // methods will abort instead of throwing. +# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST + + // This controls the availability of std::uncaught_exceptions(). +# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS + + // This controls the availability of the sized version of ::operator delete, + // ::operator delete[], and their align_val_t variants, which were all added + // in C++17, and hence not present in early dylibs. +# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE + + // This controls the availability of the std::future_error exception. + // + // Note that when exceptions are disabled, the methods that normally throw + // std::future_error can be used even on older deployment targets, but those + // methods will abort instead of throwing. +# define _LIBCPP_AVAILABILITY_FUTURE_ERROR + + // This controls the availability of std::type_info's vtable. + // I can't imagine how using std::type_info can work at all if + // this isn't supported. +# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE + + // This controls the availability of std::locale::category members + // (e.g. std::locale::collate), which are defined in the dylib. +# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY + + // This controls the availability of atomic operations on std::shared_ptr + // (e.g. `std::atomic_store(std::shared_ptr)`), which require a shared + // lock table located in the dylib. +# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR + + // These macros control the availability of all parts of that + // depend on something in the dylib. +# define _LIBCPP_AVAILABILITY_FILESYSTEM +# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH +# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP +// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_filesystem + + // This controls the availability of floating-point std::to_chars functions. + // These overloads were added later than the integer overloads. +# define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT + + // This controls the availability of the C++20 synchronization library, + // which requires shared library support for various operations + // (see libcxx/src/atomic.cpp). This includes , , + // , and notification functions on std::atomic. +# define _LIBCPP_AVAILABILITY_SYNC +// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_atomic_wait +// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_barrier +// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_latch +// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_semaphore + + // This controls the availability of the C++20 format library. + // The library is in development and not ABI stable yet. P2216 is + // retroactively accepted in C++20. This paper contains ABI breaking + // changes. +# define _LIBCPP_AVAILABILITY_FORMAT +// # define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format + + // This controls whether the library claims to provide a default verbose + // termination function, and consequently whether the headers will try + // to use it when the mechanism isn't overriden at compile-time. +// # define _LIBCPP_HAS_NO_VERBOSE_ABORT_IN_LIBRARY + +#elif defined(__APPLE__) + +# define _LIBCPP_AVAILABILITY_SHARED_MUTEX \ + __attribute__((availability(macos,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) +# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101200) || \ + (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 100000) || \ + (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 100000) || \ + (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 30000) +# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_mutex +# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_timed_mutex +# endif + + // Note: bad_optional_access & friends were not introduced in the matching + // macOS and iOS versions, so the version mismatch between macOS and others + // is intended. +# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS \ + __attribute__((availability(macos,strict,introduced=10.13))) \ + __attribute__((availability(ios,strict,introduced=12.0))) \ + __attribute__((availability(tvos,strict,introduced=12.0))) \ + __attribute__((availability(watchos,strict,introduced=5.0))) +# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS \ + _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST \ + _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS + +# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS \ + __attribute__((availability(macos,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) + +# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE \ + __attribute__((availability(macos,strict,introduced=10.12))) \ + __attribute__((availability(ios,strict,introduced=10.0))) \ + __attribute__((availability(tvos,strict,introduced=10.0))) \ + __attribute__((availability(watchos,strict,introduced=3.0))) + +# define _LIBCPP_AVAILABILITY_FUTURE_ERROR \ + __attribute__((availability(ios,strict,introduced=6.0))) + +# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE \ + __attribute__((availability(macos,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) + +# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY \ + __attribute__((availability(macos,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) + +# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR \ + __attribute__((availability(macos,strict,introduced=10.9))) \ + __attribute__((availability(ios,strict,introduced=7.0))) + +# define _LIBCPP_AVAILABILITY_FILESYSTEM \ + __attribute__((availability(macos,strict,introduced=10.15))) \ + __attribute__((availability(ios,strict,introduced=13.0))) \ + __attribute__((availability(tvos,strict,introduced=13.0))) \ + __attribute__((availability(watchos,strict,introduced=6.0))) +# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH \ + _Pragma("clang attribute push(__attribute__((availability(macos,strict,introduced=10.15))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \ + _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))") +# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") \ + _Pragma("clang attribute pop") +# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) || \ + (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 130000) || \ + (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 130000) || \ + (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 60000) +# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_filesystem +# endif + +# define _LIBCPP_AVAILABILITY_TO_CHARS_FLOATING_POINT \ + __attribute__((unavailable)) + +# define _LIBCPP_AVAILABILITY_SYNC \ + __attribute__((availability(macos,strict,introduced=11.0))) \ + __attribute__((availability(ios,strict,introduced=14.0))) \ + __attribute__((availability(tvos,strict,introduced=14.0))) \ + __attribute__((availability(watchos,strict,introduced=7.0))) +# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 110000) || \ + (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 140000) || \ + (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 140000) || \ + (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 70000) +# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_atomic_wait +# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_barrier +# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_latch +# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_semaphore +# endif + +# define _LIBCPP_AVAILABILITY_FORMAT \ + __attribute__((unavailable)) +# define _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format + +# define _LIBCPP_HAS_NO_VERBOSE_ABORT_IN_LIBRARY + +#else + +// ...New vendors can add availability markup here... + +# error "It looks like you're trying to enable vendor availability markup, but you haven't defined the corresponding macros yet!" + +#endif + +// Define availability attributes that depend on _LIBCPP_NO_EXCEPTIONS. +// Those are defined in terms of the availability attributes above, and +// should not be vendor-specific. +#if defined(_LIBCPP_NO_EXCEPTIONS) +# define _LIBCPP_AVAILABILITY_FUTURE +# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST +# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS +#else +# define _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_AVAILABILITY_FUTURE_ERROR +# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST +# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS +# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS +#endif + +#endif // _LIBCPP___AVAILABILITY diff --git a/app/src/main/cpp/libcxx/include/__bit/bit_cast.h b/app/src/main/cpp/libcxx/include/__bit/bit_cast.h new file mode 100644 index 0000000..2ca4120 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/bit_cast.h @@ -0,0 +1,36 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_BIT_CAST_H +#define _LIBCPP___BIT_BIT_CAST_H + +#include <__config> +#include <__type_traits/is_trivially_copyable.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template + requires(sizeof(_ToType) == sizeof(_FromType) && + is_trivially_copyable_v<_ToType> && + is_trivially_copyable_v<_FromType>) +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr _ToType bit_cast(const _FromType& __from) noexcept { + return __builtin_bit_cast(_ToType, __from); +} + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_BIT_CAST_H diff --git a/app/src/main/cpp/libcxx/include/__bit/bit_ceil.h b/app/src/main/cpp/libcxx/include/__bit/bit_ceil.h new file mode 100644 index 0000000..a558d61 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/bit_ceil.h @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_BIT_CEIL_H +#define _LIBCPP___BIT_BIT_CEIL_H + +#include <__assert> +#include <__bit/countl.h> +#include <__concepts/arithmetic.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 20 + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr _Tp bit_ceil(_Tp __t) noexcept { + if (__t < 2) + return 1; + const unsigned __n = numeric_limits<_Tp>::digits - std::countl_zero((_Tp)(__t - 1u)); + _LIBCPP_ASSERT(__n != numeric_limits<_Tp>::digits, "Bad input to bit_ceil"); + + if constexpr (sizeof(_Tp) >= sizeof(unsigned)) + return _Tp{1} << __n; + else { + const unsigned __extra = numeric_limits::digits - numeric_limits<_Tp>::digits; + const unsigned __retVal = 1u << (__n + __extra); + return (_Tp)(__retVal >> __extra); + } +} + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_BIT_CEIL_H diff --git a/app/src/main/cpp/libcxx/include/__bit/bit_floor.h b/app/src/main/cpp/libcxx/include/__bit/bit_floor.h new file mode 100644 index 0000000..b2e3809 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/bit_floor.h @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_BIT_FLOOR_H +#define _LIBCPP___BIT_BIT_FLOOR_H + +#include <__bit/bit_log2.h> +#include <__concepts/arithmetic.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 20 + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr _Tp bit_floor(_Tp __t) noexcept { + return __t == 0 ? 0 : _Tp{1} << std::__bit_log2(__t); +} + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_BIT_FLOOR_H diff --git a/app/src/main/cpp/libcxx/include/__bit/bit_log2.h b/app/src/main/cpp/libcxx/include/__bit/bit_log2.h new file mode 100644 index 0000000..62936f6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/bit_log2.h @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_BIT_LOG2_H +#define _LIBCPP___BIT_BIT_LOG2_H + +#include <__bit/countl.h> +#include <__concepts/arithmetic.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 20 + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr _Tp __bit_log2(_Tp __t) noexcept { + return numeric_limits<_Tp>::digits - 1 - std::countl_zero(__t); +} + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_BIT_LOG2_H diff --git a/app/src/main/cpp/libcxx/include/__bit/bit_width.h b/app/src/main/cpp/libcxx/include/__bit/bit_width.h new file mode 100644 index 0000000..4381f22 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/bit_width.h @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_BIT_WIDTH_H +#define _LIBCPP___BIT_BIT_WIDTH_H + +#include <__bit/bit_log2.h> +#include <__concepts/arithmetic.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 20 + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr int bit_width(_Tp __t) noexcept { + return __t == 0 ? 0 : std::__bit_log2(__t) + 1; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 20 + +#endif // _LIBCPP___BIT_BIT_WIDTH_H diff --git a/app/src/main/cpp/libcxx/include/__bit/blsr.h b/app/src/main/cpp/libcxx/include/__bit/blsr.h new file mode 100644 index 0000000..de991e9 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/blsr.h @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_BLSR_H +#define _LIBCPP___BIT_BLSR_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unsigned __libcpp_blsr(unsigned __x) _NOEXCEPT { + return __x ^ (__x & -__x); +} + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unsigned long __libcpp_blsr(unsigned long __x) _NOEXCEPT { + return __x ^ (__x & -__x); +} + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR unsigned long long __libcpp_blsr(unsigned long long __x) _NOEXCEPT { + return __x ^ (__x & -__x); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_BLSR_H diff --git a/app/src/main/cpp/libcxx/include/__bit/byteswap.h b/app/src/main/cpp/libcxx/include/__bit/byteswap.h new file mode 100644 index 0000000..6fa8d48 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/byteswap.h @@ -0,0 +1,55 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_BYTESWAP_H +#define _LIBCPP___BIT_BYTESWAP_H + +#include <__concepts/arithmetic.h> +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 20 + +template +_LIBCPP_HIDE_FROM_ABI constexpr _Tp byteswap(_Tp __val) noexcept { + + if constexpr (sizeof(_Tp) == 1) { + return __val; + } else if constexpr (sizeof(_Tp) == 2) { + return __builtin_bswap16(__val); + } else if constexpr (sizeof(_Tp) == 4) { + return __builtin_bswap32(__val); + } else if constexpr (sizeof(_Tp) == 8) { + return __builtin_bswap64(__val); +#ifndef _LIBCPP_HAS_NO_INT128 + } else if constexpr (sizeof(_Tp) == 16) { +#if __has_builtin(__builtin_bswap128) + return __builtin_bswap128(__val); +#else + return static_cast<_Tp>(byteswap(static_cast(__val))) << 64 | + static_cast<_Tp>(byteswap(static_cast(__val >> 64))); +#endif // __has_builtin(__builtin_bswap128) +#endif // _LIBCPP_HAS_NO_INT128 + } else { + static_assert(sizeof(_Tp) == 0, "byteswap is unimplemented for integral types of this size"); + } +} + +#endif // _LIBCPP_STD_VER > 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_BYTESWAP_H diff --git a/app/src/main/cpp/libcxx/include/__bit/countl.h b/app/src/main/cpp/libcxx/include/__bit/countl.h new file mode 100644 index 0000000..86eaee0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/countl.h @@ -0,0 +1,104 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_COUNTL_H +#define _LIBCPP___BIT_COUNTL_H + +#include <__bit/rotate.h> +#include <__concepts/arithmetic.h> +#include <__config> +#include <__type_traits/is_unsigned_integer.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_clz(unsigned __x) _NOEXCEPT { return __builtin_clz(__x); } + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_clz(unsigned long __x) _NOEXCEPT { return __builtin_clzl(__x); } + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_clz(unsigned long long __x) _NOEXCEPT { return __builtin_clzll(__x); } + +# ifndef _LIBCPP_HAS_NO_INT128 +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_clz(__uint128_t __x) _NOEXCEPT { + // The function is written in this form due to C++ constexpr limitations. + // The algorithm: + // - Test whether any bit in the high 64-bits is set + // - No bits set: + // - The high 64-bits contain 64 leading zeros, + // - Add the result of the low 64-bits. + // - Any bits set: + // - The number of leading zeros of the input is the number of leading + // zeros in the high 64-bits. + return ((__x >> 64) == 0) + ? (64 + __builtin_clzll(static_cast(__x))) + : __builtin_clzll(static_cast(__x >> 64)); +} +# endif // _LIBCPP_HAS_NO_INT128 + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +int __countl_zero(_Tp __t) _NOEXCEPT +{ + static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__countl_zero requires an unsigned integer type"); + if (__t == 0) + return numeric_limits<_Tp>::digits; + + if (sizeof(_Tp) <= sizeof(unsigned int)) + return std::__libcpp_clz(static_cast(__t)) + - (numeric_limits::digits - numeric_limits<_Tp>::digits); + else if (sizeof(_Tp) <= sizeof(unsigned long)) + return std::__libcpp_clz(static_cast(__t)) + - (numeric_limits::digits - numeric_limits<_Tp>::digits); + else if (sizeof(_Tp) <= sizeof(unsigned long long)) + return std::__libcpp_clz(static_cast(__t)) + - (numeric_limits::digits - numeric_limits<_Tp>::digits); + else + { + int __ret = 0; + int __iter = 0; + const unsigned int __ulldigits = numeric_limits::digits; + while (true) { + __t = std::__rotr(__t, __ulldigits); + if ((__iter = std::__countl_zero(static_cast(__t))) != __ulldigits) + break; + __ret += __iter; + } + return __ret + __iter; + } +} + +#if _LIBCPP_STD_VER >= 20 + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr int countl_zero(_Tp __t) noexcept { + return std::__countl_zero(__t); +} + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr int countl_one(_Tp __t) noexcept { + return __t != numeric_limits<_Tp>::max() ? std::countl_zero(static_cast<_Tp>(~__t)) : numeric_limits<_Tp>::digits; +} + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___BIT_COUNTL_H diff --git a/app/src/main/cpp/libcxx/include/__bit/countr.h b/app/src/main/cpp/libcxx/include/__bit/countr.h new file mode 100644 index 0000000..d3ca5b6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/countr.h @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_COUNTR_H +#define _LIBCPP___BIT_COUNTR_H + +#include <__bit/rotate.h> +#include <__concepts/arithmetic.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_ctz(unsigned __x) _NOEXCEPT { return __builtin_ctz(__x); } + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_ctz(unsigned long __x) _NOEXCEPT { return __builtin_ctzl(__x); } + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_ctz(unsigned long long __x) _NOEXCEPT { return __builtin_ctzll(__x); } + +#if _LIBCPP_STD_VER >= 20 + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr int countr_zero(_Tp __t) noexcept { + if (__t == 0) + return numeric_limits<_Tp>::digits; + + if (sizeof(_Tp) <= sizeof(unsigned int)) + return std::__libcpp_ctz(static_cast(__t)); + else if (sizeof(_Tp) <= sizeof(unsigned long)) + return std::__libcpp_ctz(static_cast(__t)); + else if (sizeof(_Tp) <= sizeof(unsigned long long)) + return std::__libcpp_ctz(static_cast(__t)); + else { + int __ret = 0; + const unsigned int __ulldigits = numeric_limits::digits; + while (static_cast(__t) == 0uLL) { + __ret += __ulldigits; + __t >>= __ulldigits; + } + return __ret + std::__libcpp_ctz(static_cast(__t)); + } +} + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr int countr_one(_Tp __t) noexcept { + return __t != numeric_limits<_Tp>::max() ? std::countr_zero(static_cast<_Tp>(~__t)) : numeric_limits<_Tp>::digits; +} + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___BIT_COUNTR_H diff --git a/app/src/main/cpp/libcxx/include/__bit/endian.h b/app/src/main/cpp/libcxx/include/__bit/endian.h new file mode 100644 index 0000000..52635f2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/endian.h @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_ENDIAN_H +#define _LIBCPP___BIT_ENDIAN_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 20 + +_LIBCPP_BEGIN_NAMESPACE_STD + +enum class endian { + little = 0xDEAD, + big = 0xFACE, +# if defined(_LIBCPP_LITTLE_ENDIAN) + native = little +# elif defined(_LIBCPP_BIG_ENDIAN) + native = big +# else + native = 0xCAFE +# endif +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 20 + +#endif // _LIBCPP___BIT_ENDIAN_H diff --git a/app/src/main/cpp/libcxx/include/__bit/has_single_bit.h b/app/src/main/cpp/libcxx/include/__bit/has_single_bit.h new file mode 100644 index 0000000..b89f599 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/has_single_bit.h @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_HAS_SINGLE_BIT_H +#define _LIBCPP___BIT_HAS_SINGLE_BIT_H + +#include <__concepts/arithmetic.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +#if _LIBCPP_STD_VER >= 20 + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr bool has_single_bit(_Tp __t) noexcept { + return __t != 0 && (((__t & (__t - 1)) == 0)); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___BIT_HAS_SINGLE_BIT_H diff --git a/app/src/main/cpp/libcxx/include/__bit/popcount.h b/app/src/main/cpp/libcxx/include/__bit/popcount.h new file mode 100644 index 0000000..33b94cf --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/popcount.h @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_POPCOUNT_H +#define _LIBCPP___BIT_POPCOUNT_H + +#include <__bit/rotate.h> +#include <__concepts/arithmetic.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_popcount(unsigned __x) _NOEXCEPT { return __builtin_popcount(__x); } + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_popcount(unsigned long __x) _NOEXCEPT { return __builtin_popcountl(__x); } + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +int __libcpp_popcount(unsigned long long __x) _NOEXCEPT { return __builtin_popcountll(__x); } + +#if _LIBCPP_STD_VER >= 20 + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr int popcount(_Tp __t) noexcept { + if (sizeof(_Tp) <= sizeof(unsigned int)) + return std::__libcpp_popcount(static_cast(__t)); + else if (sizeof(_Tp) <= sizeof(unsigned long)) + return std::__libcpp_popcount(static_cast(__t)); + else if (sizeof(_Tp) <= sizeof(unsigned long long)) + return std::__libcpp_popcount(static_cast(__t)); + else { + int __ret = 0; + while (__t != 0) { + __ret += std::__libcpp_popcount(static_cast(__t)); + __t >>= numeric_limits::digits; + } + return __ret; + } +} + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___BIT_POPCOUNT_H diff --git a/app/src/main/cpp/libcxx/include/__bit/rotate.h b/app/src/main/cpp/libcxx/include/__bit/rotate.h new file mode 100644 index 0000000..5aa7518 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit/rotate.h @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_ROTATE_H +#define _LIBCPP___BIT_ROTATE_H + +#include <__concepts/arithmetic.h> +#include <__config> +#include <__type_traits/is_unsigned_integer.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp __rotr(_Tp __t, unsigned int __cnt) _NOEXCEPT +{ + static_assert(__libcpp_is_unsigned_integer<_Tp>::value, "__rotr requires an unsigned integer type"); + const unsigned int __dig = numeric_limits<_Tp>::digits; + if ((__cnt % __dig) == 0) + return __t; + return (__t >> (__cnt % __dig)) | (__t << (__dig - (__cnt % __dig))); +} + +#if _LIBCPP_STD_VER >= 20 + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr _Tp rotl(_Tp __t, unsigned int __cnt) noexcept { + const unsigned int __dig = numeric_limits<_Tp>::digits; + if ((__cnt % __dig) == 0) + return __t; + return (__t << (__cnt % __dig)) | (__t >> (__dig - (__cnt % __dig))); +} + +template <__libcpp_unsigned_integer _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr _Tp rotr(_Tp __t, unsigned int __cnt) noexcept { + return std::__rotr(__t, __cnt); +} + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_ROTATE_H diff --git a/app/src/main/cpp/libcxx/include/__bit_reference b/app/src/main/cpp/libcxx/include/__bit_reference new file mode 100644 index 0000000..2665749 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bit_reference @@ -0,0 +1,1360 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BIT_REFERENCE +#define _LIBCPP___BIT_REFERENCE + +#include <__algorithm/copy_n.h> +#include <__algorithm/fill_n.h> +#include <__algorithm/min.h> +#include <__bit/countr.h> +#include <__bit/popcount.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__memory/construct_at.h> +#include <__memory/pointer_traits.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + + +_LIBCPP_BEGIN_NAMESPACE_STD + +template class __bit_iterator; +template class __bit_const_reference; + +template +struct __has_storage_type +{ + static const bool value = false; +}; + +template ::value> +class __bit_reference +{ + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::__storage_pointer __storage_pointer; + + __storage_pointer __seg_; + __storage_type __mask_; + + friend typename _Cp::__self; + + friend class __bit_const_reference<_Cp>; + friend class __bit_iterator<_Cp, false>; +public: + using __container = typename _Cp::__self; + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + __bit_reference(const __bit_reference&) = default; + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 operator bool() const _NOEXCEPT + {return static_cast(*__seg_ & __mask_);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 bool operator ~() const _NOEXCEPT + {return !static_cast(*this);} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + __bit_reference& operator=(bool __x) _NOEXCEPT + { + if (__x) + *__seg_ |= __mask_; + else + *__seg_ &= ~__mask_; + return *this; + } + +#if _LIBCPP_STD_VER > 20 + _LIBCPP_HIDE_FROM_ABI constexpr const __bit_reference& operator=(bool __x) const noexcept { + if (__x) + *__seg_ |= __mask_; + else + *__seg_ &= ~__mask_; + return *this; + } +#endif + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT + {return operator=(static_cast(__x));} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 void flip() _NOEXCEPT {*__seg_ ^= __mask_;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false> operator&() const _NOEXCEPT + {return __bit_iterator<_Cp, false>(__seg_, static_cast(std::__libcpp_ctz(__mask_)));} +private: + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + explicit __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT + : __seg_(__s), __mask_(__m) {} +}; + +template +class __bit_reference<_Cp, false> +{ +}; + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +swap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +swap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +swap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT +{ + bool __t = __x; + __x = __y; + __y = __t; +} + +template +class __bit_const_reference +{ + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::__const_storage_pointer __storage_pointer; + + __storage_pointer __seg_; + __storage_type __mask_; + + friend typename _Cp::__self; + friend class __bit_iterator<_Cp, true>; +public: + _LIBCPP_INLINE_VISIBILITY + __bit_const_reference(const __bit_const_reference&) = default; + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT + : __seg_(__x.__seg_), __mask_(__x.__mask_) {} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT + {return static_cast(*__seg_ & __mask_);} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, true> operator&() const _NOEXCEPT + {return __bit_iterator<_Cp, true>(__seg_, static_cast(std::__libcpp_ctz(__mask_)));} +private: + _LIBCPP_INLINE_VISIBILITY + _LIBCPP_CONSTEXPR + explicit __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT + : __seg_(__s), __mask_(__m) {} + + __bit_const_reference& operator=(const __bit_const_reference&) = delete; +}; + +// find + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, _IsConst> +__find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, _IsConst> _It; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + if (__n == __dn) + return __first + __n; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + if (*__first.__seg_) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(*__first.__seg_))); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + } + return _It(__first.__seg_, static_cast(__n)); +} + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, _IsConst> +__find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, _IsConst> _It; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = ~*__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + if (__n == __dn) + return __first + __n; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + { + __storage_type __b = ~*__first.__seg_; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + } + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = ~*__first.__seg_ & __m; + if (__b) + return _It(__first.__seg_, static_cast(_VSTD::__libcpp_ctz(__b))); + } + return _It(__first.__seg_, static_cast(__n)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +__bit_iterator<_Cp, _IsConst> +find(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value) +{ + if (static_cast(__value)) + return _VSTD::__find_bool_true(__first, static_cast(__last - __first)); + return _VSTD::__find_bool_false(__first, static_cast(__last - __first)); +} + +// count + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 typename __bit_iterator<_Cp, _IsConst>::difference_type +__count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, _IsConst> _It; + typedef typename _It::__storage_type __storage_type; + typedef typename _It::difference_type difference_type; + const int __bits_per_word = _It::__bits_per_word; + difference_type __r = 0; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __r = _VSTD::__libcpp_popcount(*__first.__seg_ & __m); + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + __r += _VSTD::__libcpp_popcount(*__first.__seg_); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __r += _VSTD::__libcpp_popcount(*__first.__seg_ & __m); + } + return __r; +} + +template +_LIBCPP_HIDE_FROM_ABI typename __bit_iterator<_Cp, _IsConst>::difference_type +__count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, _IsConst> _It; + typedef typename _It::__storage_type __storage_type; + typedef typename _It::difference_type difference_type; + const int __bits_per_word = _It::__bits_per_word; + difference_type __r = 0; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __r = _VSTD::__libcpp_popcount(~*__first.__seg_ & __m); + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word) + __r += _VSTD::__libcpp_popcount(~*__first.__seg_); + // do last partial word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __r += _VSTD::__libcpp_popcount(~*__first.__seg_ & __m); + } + return __r; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +typename __bit_iterator<_Cp, _IsConst>::difference_type +count(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value) +{ + if (static_cast(__value)) + return _VSTD::__count_bool_true(__first, static_cast(__last - __first)); + return _VSTD::__count_bool_false(__first, static_cast(__last - __first)); +} + +// fill_n + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void +__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + *__first.__seg_ &= ~__m; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + __storage_type __nw = __n / __bits_per_word; + std::fill_n(std::__to_address(__first.__seg_), __nw, 0); + __n -= __nw * __bits_per_word; + // do last partial word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__first.__seg_ &= ~__m; + } +} + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void +__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n) +{ + typedef __bit_iterator<_Cp, false> _It; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + // do first partial word + if (__first.__ctz_ != 0) + { + __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_); + __storage_type __dn = _VSTD::min(__clz_f, __n); + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + *__first.__seg_ |= __m; + __n -= __dn; + ++__first.__seg_; + } + // do middle whole words + __storage_type __nw = __n / __bits_per_word; + // __storage_type is always an unsigned type, so -1 sets all bits + std::fill_n(std::__to_address(__first.__seg_), __nw, static_cast<__storage_type>(-1)); + __n -= __nw * __bits_per_word; + // do last partial word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__first.__seg_ |= __m; + } +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +fill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value) +{ + if (__n > 0) + { + if (__value) + _VSTD::__fill_n_true(__first, __n); + else + _VSTD::__fill_n_false(__first, __n); + } +} + +// fill + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +void +fill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value) +{ + _VSTD::fill_n(__first, static_cast(__last - __first), __value); +} + +// copy + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> +__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + const int __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + __storage_type __b = *__first.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + __storage_type __nw = __n / __bits_per_word; + std::copy_n(std::__to_address(__first.__seg_), __nw, std::__to_address(__result.__seg_)); + __n -= __nw * __bits_per_word; + __result.__seg_ += __nw; + // do last word + if (__n > 0) + { + __first.__seg_ += __nw; + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast(__n); + } + } + return __result; +} + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> +__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + const int __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __first.__ctz_) + *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_); + else + *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_); + __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__ddn + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn); + __result.__ctz_ = static_cast(__dn); + } + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __m = ~__storage_type(0) << __result.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) + { + __storage_type __b = *__first.__seg_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << __result.__ctz_; + ++__result.__seg_; + *__result.__seg_ &= __m; + *__result.__seg_ |= __b >> __clz_r; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first.__seg_ & __m; + __storage_type __dn = _VSTD::min(__n, static_cast(__clz_r)); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << __result.__ctz_; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> __dn; + __result.__ctz_ = static_cast(__n); + } + } + } + return __result; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +__bit_iterator<_Cp, false> +copy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + if (__first.__ctz_ == __result.__ctz_) + return _VSTD::__copy_aligned(__first, __last, __result); + return _VSTD::__copy_unaligned(__first, __last, __result); +} + +// copy_backward + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> +__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + const int __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__last.__ctz_ != 0) + { + difference_type __dn = _VSTD::min(static_cast(__last.__ctz_), __n); + __n -= __dn; + unsigned __clz = __bits_per_word - __last.__ctz_; + __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz); + __storage_type __b = *__last.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast(((-__dn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + // __last.__ctz_ = 0 + } + // __last.__ctz_ == 0 || __n == 0 + // __result.__ctz_ == 0 || __n == 0 + // do middle words + __storage_type __nw = __n / __bits_per_word; + __result.__seg_ -= __nw; + __last.__seg_ -= __nw; + std::copy_n(std::__to_address(__last.__seg_), __nw, std::__to_address(__result.__seg_)); + __n -= __nw * __bits_per_word; + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n); + __storage_type __b = *--__last.__seg_ & __m; + *--__result.__seg_ &= ~__m; + *__result.__seg_ |= __b; + __result.__ctz_ = static_cast(-__n & (__bits_per_word - 1)); + } + } + return __result; +} + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> +__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, + __bit_iterator<_Cp, false> __result) +{ + typedef __bit_iterator<_Cp, _IsConst> _In; + typedef typename _In::difference_type difference_type; + typedef typename _In::__storage_type __storage_type; + const int __bits_per_word = _In::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__last.__ctz_ != 0) + { + difference_type __dn = _VSTD::min(static_cast(__last.__ctz_), __n); + __n -= __dn; + unsigned __clz_l = __bits_per_word - __last.__ctz_; + __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l); + __storage_type __b = *__last.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min(__dn, static_cast(__result.__ctz_)); + if (__ddn > 0) + { + __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r); + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __last.__ctz_) + *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_); + else + *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_); + __result.__ctz_ = static_cast(((-__ddn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + } + if (__dn > 0) + { + // __result.__ctz_ == 0 + --__result.__seg_; + __result.__ctz_ = static_cast(-__dn & (__bits_per_word - 1)); + __m = ~__storage_type(0) << __result.__ctz_; + *__result.__seg_ &= ~__m; + __last.__ctz_ -= __dn + __ddn; + *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_); + } + // __last.__ctz_ = 0 + } + // __last.__ctz_ == 0 || __n == 0 + // __result.__ctz_ != 0 || __n == 0 + // do middle words + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __m = ~__storage_type(0) >> __clz_r; + for (; __n >= __bits_per_word; __n -= __bits_per_word) + { + __storage_type __b = *--__last.__seg_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> __clz_r; + *--__result.__seg_ &= __m; + *__result.__seg_ |= __b << __result.__ctz_; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) << (__bits_per_word - __n); + __storage_type __b = *--__last.__seg_ & __m; + __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __dn = _VSTD::min(__n, static_cast(__result.__ctz_)); + __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r); + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_); + __result.__ctz_ = static_cast(((-__dn & (__bits_per_word - 1)) + + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + // __result.__ctz_ == 0 + --__result.__seg_; + __result.__ctz_ = static_cast(-__n & (__bits_per_word - 1)); + __m = ~__storage_type(0) << __result.__ctz_; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn)); + } + } + } + return __result; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +__bit_iterator<_Cp, false> +copy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + if (__last.__ctz_ == __result.__ctz_) + return _VSTD::__copy_backward_aligned(__first, __last, __result); + return _VSTD::__copy_backward_unaligned(__first, __last, __result); +} + +// move + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +move(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + return _VSTD::copy(__first, __last, __result); +} + +// move_backward + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<_Cp, false> +move_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) +{ + return _VSTD::copy_backward(__first, __last, __result); +} + +// swap_ranges + +template +_LIBCPP_HIDE_FROM_ABI __bit_iterator<__C2, false> +__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last, + __bit_iterator<__C2, false> __result) +{ + typedef __bit_iterator<__C1, false> _I1; + typedef typename _I1::difference_type difference_type; + typedef typename _I1::__storage_type __storage_type; + const int __bits_per_word = _I1::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1; + *__first.__seg_ |= __b2; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_) + swap(*__first.__seg_, *__result.__seg_); + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1; + *__first.__seg_ |= __b2; + __result.__ctz_ = static_cast(__n); + } + } + return __result; +} + +template +_LIBCPP_HIDE_FROM_ABI __bit_iterator<__C2, false> +__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last, + __bit_iterator<__C2, false> __result) +{ + typedef __bit_iterator<__C1, false> _I1; + typedef typename _I1::difference_type difference_type; + typedef typename _I1::__storage_type __storage_type; + const int __bits_per_word = _I1::__bits_per_word; + difference_type __n = __last - __first; + if (__n > 0) + { + // do first word + if (__first.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + if (__result.__ctz_ > __first.__ctz_) + { + unsigned __s = __result.__ctz_ - __first.__ctz_; + *__result.__seg_ |= __b1 << __s; + *__first.__seg_ |= __b2 >> __s; + } + else + { + unsigned __s = __first.__ctz_ - __result.__ctz_; + *__result.__seg_ |= __b1 >> __s; + *__first.__seg_ |= __b2 << __s; + } + __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__ddn + __result.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + unsigned __s = __first.__ctz_ + __ddn; + *__result.__seg_ |= __b1 >> __s; + *__first.__seg_ |= __b2 << __s; + __result.__ctz_ = static_cast(__dn); + } + ++__first.__seg_; + // __first.__ctz_ = 0; + } + // __first.__ctz_ == 0; + // do middle words + __storage_type __m = ~__storage_type(0) << __result.__ctz_; + unsigned __clz_r = __bits_per_word - __result.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) + { + __storage_type __b1 = *__first.__seg_; + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 << __result.__ctz_; + *__first.__seg_ = __b2 >> __result.__ctz_; + ++__result.__seg_; + __b2 = *__result.__seg_ & ~__m; + *__result.__seg_ &= __m; + *__result.__seg_ |= __b1 >> __clz_r; + *__first.__seg_ |= __b2 << __clz_r; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b1 = *__first.__seg_ & __m; + *__first.__seg_ &= ~__m; + __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r); + __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + __storage_type __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 << __result.__ctz_; + *__first.__seg_ |= __b2 >> __result.__ctz_; + __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; + __result.__ctz_ = static_cast((__dn + __result.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __b2 = *__result.__seg_ & __m; + *__result.__seg_ &= ~__m; + *__result.__seg_ |= __b1 >> __dn; + *__first.__seg_ |= __b2 << __dn; + __result.__ctz_ = static_cast(__n); + } + } + } + return __result; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +__bit_iterator<__C2, false> +swap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1, + __bit_iterator<__C2, false> __first2) +{ + if (__first1.__ctz_ == __first2.__ctz_) + return _VSTD::__swap_ranges_aligned(__first1, __last1, __first2); + return _VSTD::__swap_ranges_unaligned(__first1, __last1, __first2); +} + +// rotate + +template +struct __bit_array +{ + typedef typename _Cp::difference_type difference_type; + typedef typename _Cp::__storage_type __storage_type; + typedef typename _Cp::__storage_pointer __storage_pointer; + typedef typename _Cp::iterator iterator; + static const unsigned __bits_per_word = _Cp::__bits_per_word; + static const unsigned _Np = 4; + + difference_type __size_; + __storage_type __word_[_Np]; + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 static difference_type capacity() + {return static_cast(_Np * __bits_per_word);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit __bit_array(difference_type __s) : __size_(__s) { + if (__libcpp_is_constant_evaluated()) { + for (size_t __i = 0; __i != __bit_array<_Cp>::_Np; ++__i) + std::__construct_at(__word_ + __i, 0); + } + } + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator begin() + { + return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0); + } + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator end() + { + return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word, + static_cast(__size_ % __bits_per_word)); + } +}; + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> +rotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last) +{ + typedef __bit_iterator<_Cp, false> _I1; + typedef typename _I1::difference_type difference_type; + difference_type __d1 = __middle - __first; + difference_type __d2 = __last - __middle; + _I1 __r = __first + __d2; + while (__d1 != 0 && __d2 != 0) + { + if (__d1 <= __d2) + { + if (__d1 <= __bit_array<_Cp>::capacity()) + { + __bit_array<_Cp> __b(__d1); + _VSTD::copy(__first, __middle, __b.begin()); + _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first)); + break; + } + else + { + __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle); + __first = __middle; + __middle = __mp; + __d2 -= __d1; + } + } + else + { + if (__d2 <= __bit_array<_Cp>::capacity()) + { + __bit_array<_Cp> __b(__d2); + _VSTD::copy(__middle, __last, __b.begin()); + _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last)); + break; + } + else + { + __bit_iterator<_Cp, false> __mp = __first + __d2; + _VSTD::swap_ranges(__first, __mp, __middle); + __first = __mp; + __d1 -= __d2; + } + } + } + return __r; +} + +// equal + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool +__equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, + __bit_iterator<_Cp, _IC2> __first2) +{ + typedef __bit_iterator<_Cp, _IC1> _It; + typedef typename _It::difference_type difference_type; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + difference_type __n = __last1 - __first1; + if (__n > 0) + { + // do first word + if (__first1.__ctz_ != 0) + { + unsigned __clz_f = __bits_per_word - __first1.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz_f), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); + __storage_type __b = *__first1.__seg_ & __m; + unsigned __clz_r = __bits_per_word - __first2.__ctz_; + __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r); + __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); + if (__first2.__ctz_ > __first1.__ctz_) + { + if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_))) + return false; + } + else + { + if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_))) + return false; + } + __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word; + __first2.__ctz_ = static_cast((__ddn + __first2.__ctz_) % __bits_per_word); + __dn -= __ddn; + if (__dn > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __dn); + if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn))) + return false; + __first2.__ctz_ = static_cast(__dn); + } + ++__first1.__seg_; + // __first1.__ctz_ = 0; + } + // __first1.__ctz_ == 0; + // do middle words + unsigned __clz_r = __bits_per_word - __first2.__ctz_; + __storage_type __m = ~__storage_type(0) << __first2.__ctz_; + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_) + { + __storage_type __b = *__first1.__seg_; + if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_)) + return false; + ++__first2.__seg_; + if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r)) + return false; + } + // do last word + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + __storage_type __b = *__first1.__seg_ & __m; + __storage_type __dn = _VSTD::min(__n, static_cast(__clz_r)); + __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); + if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_)) + return false; + __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word; + __first2.__ctz_ = static_cast((__dn + __first2.__ctz_) % __bits_per_word); + __n -= __dn; + if (__n > 0) + { + __m = ~__storage_type(0) >> (__bits_per_word - __n); + if ((*__first2.__seg_ & __m) != (__b >> __dn)) + return false; + } + } + } + return true; +} + +template +_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool +__equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, + __bit_iterator<_Cp, _IC2> __first2) +{ + typedef __bit_iterator<_Cp, _IC1> _It; + typedef typename _It::difference_type difference_type; + typedef typename _It::__storage_type __storage_type; + const int __bits_per_word = _It::__bits_per_word; + difference_type __n = __last1 - __first1; + if (__n > 0) + { + // do first word + if (__first1.__ctz_ != 0) + { + unsigned __clz = __bits_per_word - __first1.__ctz_; + difference_type __dn = _VSTD::min(static_cast(__clz), __n); + __n -= __dn; + __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); + if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) + return false; + ++__first2.__seg_; + ++__first1.__seg_; + // __first1.__ctz_ = 0; + // __first2.__ctz_ = 0; + } + // __first1.__ctz_ == 0; + // __first2.__ctz_ == 0; + // do middle words + for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_) + if (*__first2.__seg_ != *__first1.__seg_) + return false; + // do last word + if (__n > 0) + { + __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); + if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m)) + return false; + } + } + return true; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +bool +equal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2) +{ + if (__first1.__ctz_ == __first2.__ctz_) + return _VSTD::__equal_aligned(__first1, __last1, __first2); + return _VSTD::__equal_unaligned(__first1, __last1, __first2); +} + +template +class __bit_iterator +{ +public: + typedef typename _Cp::difference_type difference_type; + typedef bool value_type; + typedef __bit_iterator pointer; +#ifndef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL + typedef __conditional_t<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> > reference; +#else + using reference = __conditional_t<_IsConst, bool, __bit_reference<_Cp> >; +#endif + typedef random_access_iterator_tag iterator_category; + +private: + typedef typename _Cp::__storage_type __storage_type; + typedef __conditional_t<_IsConst, typename _Cp::__const_storage_pointer, typename _Cp::__storage_pointer> + __storage_pointer; + static const unsigned __bits_per_word = _Cp::__bits_per_word; + + __storage_pointer __seg_; + unsigned __ctz_; + +public: + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator() _NOEXCEPT +#if _LIBCPP_STD_VER > 11 + : __seg_(nullptr), __ctz_(0) +#endif + {} + + // When _IsConst=false, this is the copy constructor. + // It is non-trivial. Making it trivial would break ABI. + // When _IsConst=true, this is a converting constructor; + // the copy and move constructors are implicitly generated + // and trivial. + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + __bit_iterator(const __bit_iterator<_Cp, false>& __it) _NOEXCEPT + : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {} + + // When _IsConst=false, we have a user-provided copy constructor, + // so we must also provide a copy assignment operator because + // the implicit generation of a defaulted one is deprecated. + // When _IsConst=true, the assignment operators are + // implicitly generated and trivial. + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + __bit_iterator& operator=(const _If<_IsConst, struct __private_nat, __bit_iterator>& __it) { + __seg_ = __it.__seg_; + __ctz_ = __it.__ctz_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator*() const _NOEXCEPT { + return __conditional_t<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >( + __seg_, __storage_type(1) << __ctz_); + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator& operator++() + { + if (__ctz_ != __bits_per_word-1) + ++__ctz_; + else + { + __ctz_ = 0; + ++__seg_; + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator operator++(int) + { + __bit_iterator __tmp = *this; + ++(*this); + return __tmp; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator& operator--() + { + if (__ctz_ != 0) + --__ctz_; + else + { + __ctz_ = __bits_per_word - 1; + --__seg_; + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator operator--(int) + { + __bit_iterator __tmp = *this; + --(*this); + return __tmp; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator& operator+=(difference_type __n) + { + if (__n >= 0) + __seg_ += (__n + __ctz_) / __bits_per_word; + else + __seg_ += static_cast(__n - __bits_per_word + __ctz_ + 1) + / static_cast(__bits_per_word); + __n &= (__bits_per_word - 1); + __ctz_ = static_cast((__n + __ctz_) % __bits_per_word); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator& operator-=(difference_type __n) + { + return *this += -__n; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator operator+(difference_type __n) const + { + __bit_iterator __t(*this); + __t += __n; + return __t; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator operator-(difference_type __n) const + { + __bit_iterator __t(*this); + __t -= __n; + return __t; + } + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y) + {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator[](difference_type __n) const {return *(*this + __n);} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y) + {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__x == __y);} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y) + {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y) + {return __y < __x;} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__y < __x);} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y) + {return !(__x < __y);} + +private: + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + explicit __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT + : __seg_(__s), __ctz_(__ctz) {} + + friend typename _Cp::__self; + + friend class __bit_reference<_Cp>; + friend class __bit_const_reference<_Cp>; + friend class __bit_iterator<_Cp, true>; + template friend struct __bit_array; + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n); + + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n); + + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first, + __bit_iterator<_Dp, _IC> __last, + __bit_iterator<_Dp, false> __result); + template friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>, + __bit_iterator<__C1, false>, + __bit_iterator<__C2, false>); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>, + __bit_iterator<_Dp, false>, + __bit_iterator<_Dp, false>); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend bool __equal_aligned(__bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC2>); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend bool __equal_unaligned(__bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC2>); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend bool equal(__bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC1>, + __bit_iterator<_Dp, _IC2>); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, _IC> __find_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type); + template + _LIBCPP_CONSTEXPR_SINCE_CXX20 + friend __bit_iterator<_Dp, _IC> __find_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type); + template friend typename __bit_iterator<_Dp, _IC>::difference_type + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 + __count_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type); + template friend typename __bit_iterator<_Dp, _IC>::difference_type + __count_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type); +}; + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___BIT_REFERENCE diff --git a/app/src/main/cpp/libcxx/include/__bsd_locale_defaults.h b/app/src/main/cpp/libcxx/include/__bsd_locale_defaults.h new file mode 100644 index 0000000..4d99048 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bsd_locale_defaults.h @@ -0,0 +1,36 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// The BSDs have lots of *_l functions. We don't want to define those symbols +// on other platforms though, for fear of conflicts with user code. So here, +// we will define the mapping from an internal macro to the real BSD symbol. +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BSD_LOCALE_DEFAULTS_H +#define _LIBCPP___BSD_LOCALE_DEFAULTS_H + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#define __libcpp_mb_cur_max_l(loc) MB_CUR_MAX_L(loc) +#define __libcpp_btowc_l(ch, loc) btowc_l(ch, loc) +#define __libcpp_wctob_l(wch, loc) wctob_l(wch, loc) +#define __libcpp_wcsnrtombs_l(dst, src, nwc, len, ps, loc) wcsnrtombs_l(dst, src, nwc, len, ps, loc) +#define __libcpp_wcrtomb_l(src, wc, ps, loc) wcrtomb_l(src, wc, ps, loc) +#define __libcpp_mbsnrtowcs_l(dst, src, nms, len, ps, loc) mbsnrtowcs_l(dst, src, nms, len, ps, loc) +#define __libcpp_mbrtowc_l(pwc, s, n, ps, l) mbrtowc_l(pwc, s, n, ps, l) +#define __libcpp_mbtowc_l(pwc, pmb, max, l) mbtowc_l(pwc, pmb, max, l) +#define __libcpp_mbrlen_l(s, n, ps, l) mbrlen_l(s, n, ps, l) +#define __libcpp_localeconv_l(l) localeconv_l(l) +#define __libcpp_mbsrtowcs_l(dest, src, len, ps, l) mbsrtowcs_l(dest, src, len, ps, l) +#define __libcpp_snprintf_l(...) snprintf_l(__VA_ARGS__) +#define __libcpp_asprintf_l(...) asprintf_l(__VA_ARGS__) +#define __libcpp_sscanf_l(...) sscanf_l(__VA_ARGS__) + +#endif // _LIBCPP___BSD_LOCALE_DEFAULTS_H diff --git a/app/src/main/cpp/libcxx/include/__bsd_locale_fallbacks.h b/app/src/main/cpp/libcxx/include/__bsd_locale_fallbacks.h new file mode 100644 index 0000000..9abd7e7 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__bsd_locale_fallbacks.h @@ -0,0 +1,142 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// The BSDs have lots of *_l functions. This file provides reimplementations +// of those functions for non-BSD platforms. +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___BSD_LOCALE_FALLBACKS_H +#define _LIBCPP___BSD_LOCALE_FALLBACKS_H + +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +inline _LIBCPP_INLINE_VISIBILITY +decltype(MB_CUR_MAX) __libcpp_mb_cur_max_l(locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return MB_CUR_MAX; +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +inline _LIBCPP_INLINE_VISIBILITY +wint_t __libcpp_btowc_l(int __c, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return btowc(__c); +} + +inline _LIBCPP_INLINE_VISIBILITY +int __libcpp_wctob_l(wint_t __c, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return wctob(__c); +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t __libcpp_wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc, + size_t __len, mbstate_t *__ps, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return wcsnrtombs(__dest, __src, __nwc, __len, __ps); +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t __libcpp_wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return wcrtomb(__s, __wc, __ps); +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t __libcpp_mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms, + size_t __len, mbstate_t *__ps, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return mbsnrtowcs(__dest, __src, __nms, __len, __ps); +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t __libcpp_mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n, + mbstate_t *__ps, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return mbrtowc(__pwc, __s, __n, __ps); +} + +inline _LIBCPP_INLINE_VISIBILITY +int __libcpp_mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return mbtowc(__pwc, __pmb, __max); +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t __libcpp_mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return mbrlen(__s, __n, __ps); +} +#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS + +inline _LIBCPP_INLINE_VISIBILITY +lconv *__libcpp_localeconv_l(locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return localeconv(); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +inline _LIBCPP_INLINE_VISIBILITY +size_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len, + mbstate_t *__ps, locale_t __l) +{ + __libcpp_locale_guard __current(__l); + return mbsrtowcs(__dest, __src, __len, __ps); +} +#endif + +inline _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 4, 5) +int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); + __libcpp_locale_guard __current(__l); + int __res = vsnprintf(__s, __n, __format, __va); + va_end(__va); + return __res; +} + +inline _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 3, 4) +int __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); + __libcpp_locale_guard __current(__l); + int __res = vasprintf(__s, __format, __va); + va_end(__va); + return __res; +} + +inline _LIBCPP_ATTRIBUTE_FORMAT(__scanf__, 3, 4) +int __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); + __libcpp_locale_guard __current(__l); + int __res = vsscanf(__s, __format, __va); + va_end(__va); + return __res; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BSD_LOCALE_FALLBACKS_H diff --git a/app/src/main/cpp/libcxx/include/__charconv/chars_format.h b/app/src/main/cpp/libcxx/include/__charconv/chars_format.h new file mode 100644 index 0000000..695bd87 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__charconv/chars_format.h @@ -0,0 +1,77 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHARCONV_CHARS_FORMAT_H +#define _LIBCPP___CHARCONV_CHARS_FORMAT_H + +#include <__config> +#include <__utility/to_underlying.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +enum class _LIBCPP_ENUM_VIS chars_format +{ + scientific = 0x1, + fixed = 0x2, + hex = 0x4, + general = fixed | scientific +}; + +inline _LIBCPP_INLINE_VISIBILITY constexpr chars_format +operator~(chars_format __x) { + return chars_format(~_VSTD::__to_underlying(__x)); +} + +inline _LIBCPP_INLINE_VISIBILITY constexpr chars_format +operator&(chars_format __x, chars_format __y) { + return chars_format(_VSTD::__to_underlying(__x) & + _VSTD::__to_underlying(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY constexpr chars_format +operator|(chars_format __x, chars_format __y) { + return chars_format(_VSTD::__to_underlying(__x) | + _VSTD::__to_underlying(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY constexpr chars_format +operator^(chars_format __x, chars_format __y) { + return chars_format(_VSTD::__to_underlying(__x) ^ + _VSTD::__to_underlying(__y)); +} + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 chars_format& +operator&=(chars_format& __x, chars_format __y) { + __x = __x & __y; + return __x; +} + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 chars_format& +operator|=(chars_format& __x, chars_format __y) { + __x = __x | __y; + return __x; +} + +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 chars_format& +operator^=(chars_format& __x, chars_format __y) { + __x = __x ^ __y; + return __x; +} + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHARCONV_CHARS_FORMAT_H diff --git a/app/src/main/cpp/libcxx/include/__charconv/from_chars_result.h b/app/src/main/cpp/libcxx/include/__charconv/from_chars_result.h new file mode 100644 index 0000000..05ffe14 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__charconv/from_chars_result.h @@ -0,0 +1,37 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHARCONV_FROM_CHARS_RESULT_H +#define _LIBCPP___CHARCONV_FROM_CHARS_RESULT_H + +#include <__config> +#include <__errc> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +struct _LIBCPP_TYPE_VIS from_chars_result +{ + const char* ptr; + errc ec; +# if _LIBCPP_STD_VER > 17 + _LIBCPP_HIDE_FROM_ABI friend bool operator==(const from_chars_result&, const from_chars_result&) = default; +# endif +}; + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHARCONV_FROM_CHARS_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__charconv/tables.h b/app/src/main/cpp/libcxx/include/__charconv/tables.h new file mode 100644 index 0000000..9b82440 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__charconv/tables.h @@ -0,0 +1,154 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHARCONV_TABLES +#define _LIBCPP___CHARCONV_TABLES + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +namespace __itoa { + +inline constexpr char __base_2_lut[64] = { + '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '1', '0', '0', '0', '1', '1', '0', '1', '0', '0', '0', '1', + '0', '1', '0', '1', '1', '0', '0', '1', '1', '1', '1', '0', '0', '0', '1', '0', '0', '1', '1', '0', '1', '0', + '1', '0', '1', '1', '1', '1', '0', '0', '1', '1', '0', '1', '1', '1', '1', '0', '1', '1', '1', '1'}; + +inline constexpr char __base_8_lut[128] = { + '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '1', '0', '1', '1', '1', '2', + '1', '3', '1', '4', '1', '5', '1', '6', '1', '7', '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', '2', '5', + '2', '6', '2', '7', '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '4', '0', + '4', '1', '4', '2', '4', '3', '4', '4', '4', '5', '4', '6', '4', '7', '5', '0', '5', '1', '5', '2', '5', '3', + '5', '4', '5', '5', '5', '6', '5', '7', '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', + '6', '7', '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', '7', '5', '7', '6', '7', '7'}; + +inline constexpr char __base_16_lut[512] = { + '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', '0', 'a', '0', + 'b', '0', 'c', '0', 'd', '0', 'e', '0', 'f', '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', '1', '5', '1', '6', + '1', '7', '1', '8', '1', '9', '1', 'a', '1', 'b', '1', 'c', '1', 'd', '1', 'e', '1', 'f', '2', '0', '2', '1', '2', + '2', '2', '3', '2', '4', '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', '2', 'a', '2', 'b', '2', 'c', '2', 'd', + '2', 'e', '2', 'f', '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '3', '8', '3', + '9', '3', 'a', '3', 'b', '3', 'c', '3', 'd', '3', 'e', '3', 'f', '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', + '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', '4', 'a', '4', 'b', '4', 'c', '4', 'd', '4', 'e', '4', 'f', '5', + '0', '5', '1', '5', '2', '5', '3', '5', '4', '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', '5', 'a', '5', 'b', + '5', 'c', '5', 'd', '5', 'e', '5', 'f', '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', '6', + '7', '6', '8', '6', '9', '6', 'a', '6', 'b', '6', 'c', '6', 'd', '6', 'e', '6', 'f', '7', '0', '7', '1', '7', '2', + '7', '3', '7', '4', '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', '7', 'a', '7', 'b', '7', 'c', '7', 'd', '7', + 'e', '7', 'f', '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', + '8', 'a', '8', 'b', '8', 'c', '8', 'd', '8', 'e', '8', 'f', '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', '9', + '5', '9', '6', '9', '7', '9', '8', '9', '9', '9', 'a', '9', 'b', '9', 'c', '9', 'd', '9', 'e', '9', 'f', 'a', '0', + 'a', '1', 'a', '2', 'a', '3', 'a', '4', 'a', '5', 'a', '6', 'a', '7', 'a', '8', 'a', '9', 'a', 'a', 'a', 'b', 'a', + 'c', 'a', 'd', 'a', 'e', 'a', 'f', 'b', '0', 'b', '1', 'b', '2', 'b', '3', 'b', '4', 'b', '5', 'b', '6', 'b', '7', + 'b', '8', 'b', '9', 'b', 'a', 'b', 'b', 'b', 'c', 'b', 'd', 'b', 'e', 'b', 'f', 'c', '0', 'c', '1', 'c', '2', 'c', + '3', 'c', '4', 'c', '5', 'c', '6', 'c', '7', 'c', '8', 'c', '9', 'c', 'a', 'c', 'b', 'c', 'c', 'c', 'd', 'c', 'e', + 'c', 'f', 'd', '0', 'd', '1', 'd', '2', 'd', '3', 'd', '4', 'd', '5', 'd', '6', 'd', '7', 'd', '8', 'd', '9', 'd', + 'a', 'd', 'b', 'd', 'c', 'd', 'd', 'd', 'e', 'd', 'f', 'e', '0', 'e', '1', 'e', '2', 'e', '3', 'e', '4', 'e', '5', + 'e', '6', 'e', '7', 'e', '8', 'e', '9', 'e', 'a', 'e', 'b', 'e', 'c', 'e', 'd', 'e', 'e', 'e', 'f', 'f', '0', 'f', + '1', 'f', '2', 'f', '3', 'f', '4', 'f', '5', 'f', '6', 'f', '7', 'f', '8', 'f', '9', 'f', 'a', 'f', 'b', 'f', 'c', + 'f', 'd', 'f', 'e', 'f', 'f'}; + +inline constexpr uint32_t __pow10_32[10] = { + UINT32_C(0), UINT32_C(10), UINT32_C(100), UINT32_C(1000), UINT32_C(10000), + UINT32_C(100000), UINT32_C(1000000), UINT32_C(10000000), UINT32_C(100000000), UINT32_C(1000000000)}; + +inline constexpr uint64_t __pow10_64[20] = {UINT64_C(0), + UINT64_C(10), + UINT64_C(100), + UINT64_C(1000), + UINT64_C(10000), + UINT64_C(100000), + UINT64_C(1000000), + UINT64_C(10000000), + UINT64_C(100000000), + UINT64_C(1000000000), + UINT64_C(10000000000), + UINT64_C(100000000000), + UINT64_C(1000000000000), + UINT64_C(10000000000000), + UINT64_C(100000000000000), + UINT64_C(1000000000000000), + UINT64_C(10000000000000000), + UINT64_C(100000000000000000), + UINT64_C(1000000000000000000), + UINT64_C(10000000000000000000)}; + +# ifndef _LIBCPP_HAS_NO_INT128 +inline constexpr int __pow10_128_offset = 0; +inline constexpr __uint128_t __pow10_128[40] = { + UINT64_C(0), + UINT64_C(10), + UINT64_C(100), + UINT64_C(1000), + UINT64_C(10000), + UINT64_C(100000), + UINT64_C(1000000), + UINT64_C(10000000), + UINT64_C(100000000), + UINT64_C(1000000000), + UINT64_C(10000000000), + UINT64_C(100000000000), + UINT64_C(1000000000000), + UINT64_C(10000000000000), + UINT64_C(100000000000000), + UINT64_C(1000000000000000), + UINT64_C(10000000000000000), + UINT64_C(100000000000000000), + UINT64_C(1000000000000000000), + UINT64_C(10000000000000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(100000000000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(1000000000000000000), + __uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000000), + (__uint128_t(UINT64_C(10000000000000000000)) * UINT64_C(10000000000000000000)) * 10}; +# endif + +inline constexpr char __digits_base_10[200] = { + // clang-format off + '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'}; +// clang-format on + +} // namespace __itoa + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHARCONV_TABLES diff --git a/app/src/main/cpp/libcxx/include/__charconv/to_chars_base_10.h b/app/src/main/cpp/libcxx/include/__charconv/to_chars_base_10.h new file mode 100644 index 0000000..fc7fb76 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__charconv/to_chars_base_10.h @@ -0,0 +1,185 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHARCONV_TO_CHARS_BASE_10_H +#define _LIBCPP___CHARCONV_TO_CHARS_BASE_10_H + +#include <__algorithm/copy_n.h> +#include <__charconv/tables.h> +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +namespace __itoa { + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append1(char* __first, uint32_t __value) noexcept { + *__first = '0' + static_cast(__value); + return __first + 1; +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append2(char* __first, uint32_t __value) noexcept { + return std::copy_n(&__digits_base_10[__value * 2], 2, __first); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append3(char* __first, uint32_t __value) noexcept { + return __itoa::__append2(__itoa::__append1(__first, __value / 100), __value % 100); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append4(char* __first, uint32_t __value) noexcept { + return __itoa::__append2(__itoa::__append2(__first, __value / 100), __value % 100); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append5(char* __first, uint32_t __value) noexcept { + return __itoa::__append4(__itoa::__append1(__first, __value / 10000), __value % 10000); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append6(char* __first, uint32_t __value) noexcept { + return __itoa::__append4(__itoa::__append2(__first, __value / 10000), __value % 10000); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append7(char* __first, uint32_t __value) noexcept { + return __itoa::__append6(__itoa::__append1(__first, __value / 1000000), __value % 1000000); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append8(char* __first, uint32_t __value) noexcept { + return __itoa::__append6(__itoa::__append2(__first, __value / 1000000), __value % 1000000); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __append9(char* __first, uint32_t __value) noexcept { + return __itoa::__append8(__itoa::__append1(__first, __value / 100000000), __value % 100000000); +} + +template +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI char* __append10(char* __first, _Tp __value) noexcept { + return __itoa::__append8(__itoa::__append2(__first, static_cast(__value / 100000000)), + static_cast(__value % 100000000)); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __base_10_u32(char* __first, uint32_t __value) noexcept { + if (__value < 1000000) { + if (__value < 10000) { + if (__value < 100) { + // 0 <= __value < 100 + if (__value < 10) + return __itoa::__append1(__first, __value); + return __itoa::__append2(__first, __value); + } + // 100 <= __value < 10'000 + if (__value < 1000) + return __itoa::__append3(__first, __value); + return __itoa::__append4(__first, __value); + } + + // 10'000 <= __value < 1'000'000 + if (__value < 100000) + return __itoa::__append5(__first, __value); + return __itoa::__append6(__first, __value); + } + + // __value => 1'000'000 + if (__value < 100000000) { + // 1'000'000 <= __value < 100'000'000 + if (__value < 10000000) + return __itoa::__append7(__first, __value); + return __itoa::__append8(__first, __value); + } + + // 100'000'000 <= __value < max + if (__value < 1000000000) + return __itoa::__append9(__first, __value); + return __itoa::__append10(__first, __value); +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __base_10_u64(char* __buffer, uint64_t __value) noexcept { + if (__value <= UINT32_MAX) + return __itoa::__base_10_u32(__buffer, static_cast(__value)); + + // Numbers in the range UINT32_MAX <= val < 10'000'000'000 always contain 10 + // digits and are outputted after this if statement. + if (__value >= 10000000000) { + // This function properly deterimines the first non-zero leading digit. + __buffer = __itoa::__base_10_u32(__buffer, static_cast(__value / 10000000000)); + __value %= 10000000000; + } + return __itoa::__append10(__buffer, __value); +} + +# ifndef _LIBCPP_HAS_NO_INT128 +/// \returns 10^\a exp +/// +/// \pre \a exp [19, 39] +/// +/// \note The lookup table contains a partial set of exponents limiting the +/// range that can be used. However the range is sufficient for +/// \ref __base_10_u128. +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline __uint128_t __pow_10(int __exp) noexcept { + _LIBCPP_ASSERT(__exp >= __pow10_128_offset, "Index out of bounds"); + return __pow10_128[__exp - __pow10_128_offset]; +} + +_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI inline char* __base_10_u128(char* __buffer, __uint128_t __value) noexcept { + _LIBCPP_ASSERT( + __value > numeric_limits::max(), "The optimizations for this algorithm fail when this isn't true."); + + // Unlike the 64 to 32 bit case the 128 bit case the "upper half" can't be + // stored in the "lower half". Instead we first need to handle the top most + // digits separately. + // + // Maximum unsigned values + // 64 bit 18'446'744'073'709'551'615 (20 digits) + // 128 bit 340'282'366'920'938'463'463'374'607'431'768'211'455 (39 digits) + // step 1 ^ ([0-1] digits) + // step 2 ^^^^^^^^^^^^^^^^^^^^^^^^^ ([0-19] digits) + // step 3 ^^^^^^^^^^^^^^^^^^^^^^^^^ (19 digits) + if (__value >= __itoa::__pow_10(38)) { + // step 1 + __buffer = __itoa::__append1(__buffer, static_cast(__value / __itoa::__pow_10(38))); + __value %= __itoa::__pow_10(38); + + // step 2 always 19 digits. + // They are handled here since leading zeros need to be appended to the buffer, + __buffer = __itoa::__append9(__buffer, static_cast(__value / __itoa::__pow_10(29))); + __value %= __itoa::__pow_10(29); + __buffer = __itoa::__append10(__buffer, static_cast(__value / __itoa::__pow_10(19))); + __value %= __itoa::__pow_10(19); + } + else { + // step 2 + // This version needs to determine the position of the leading non-zero digit. + __buffer = __base_10_u64(__buffer, static_cast(__value / __itoa::__pow_10(19))); + __value %= __itoa::__pow_10(19); + } + + // Step 3 + __buffer = __itoa::__append9(__buffer, static_cast(__value / 10000000000)); + __buffer = __itoa::__append10(__buffer, static_cast(__value % 10000000000)); + + return __buffer; +} +# endif +} // namespace __itoa + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___CHARCONV_TO_CHARS_BASE_10_H diff --git a/app/src/main/cpp/libcxx/include/__charconv/to_chars_result.h b/app/src/main/cpp/libcxx/include/__charconv/to_chars_result.h new file mode 100644 index 0000000..2eb4098 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__charconv/to_chars_result.h @@ -0,0 +1,37 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHARCONV_TO_CHARS_RESULT_H +#define _LIBCPP___CHARCONV_TO_CHARS_RESULT_H + +#include <__config> +#include <__errc> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +struct _LIBCPP_TYPE_VIS to_chars_result +{ + char* ptr; + errc ec; +# if _LIBCPP_STD_VER > 17 + _LIBCPP_HIDE_FROM_ABI friend bool operator==(const to_chars_result&, const to_chars_result&) = default; +# endif +}; + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHARCONV_TO_CHARS_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/calendar.h b/app/src/main/cpp/libcxx/include/__chrono/calendar.h new file mode 100644 index 0000000..d3762a6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/calendar.h @@ -0,0 +1,44 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_CALENDAR_H +#define _LIBCPP___CHRONO_CALENDAR_H + +#include <__chrono/duration.h> +#include <__chrono/time_point.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +struct local_t {}; +template +using local_time = time_point; +using local_seconds = local_time; +using local_days = local_time; + +struct last_spec { _LIBCPP_HIDE_FROM_ABI explicit last_spec() = default; }; +inline constexpr last_spec last{}; + + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_CALENDAR_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/convert_to_timespec.h b/app/src/main/cpp/libcxx/include/__chrono/convert_to_timespec.h new file mode 100644 index 0000000..fab07f2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/convert_to_timespec.h @@ -0,0 +1,56 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_CONVERT_TO_TIMESPEC_H +#define _LIBCPP___CHRONO_CONVERT_TO_TIMESPEC_H + +#include <__chrono/duration.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Convert a nanoseconds duration to the given TimeSpec type, which must have +// the same properties as std::timespec. +template +_LIBCPP_HIDE_FROM_ABI inline +_TimeSpec __convert_to_timespec(const chrono::nanoseconds& __ns) +{ + using namespace chrono; + seconds __s = duration_cast(__ns); + _TimeSpec __ts; + typedef decltype(__ts.tv_sec) __ts_sec; + const __ts_sec __ts_sec_max = numeric_limits<__ts_sec>::max(); + + if (__s.count() < __ts_sec_max) + { + __ts.tv_sec = static_cast<__ts_sec>(__s.count()); + __ts.tv_nsec = static_cast((__ns - __s).count()); + } + else + { + __ts.tv_sec = __ts_sec_max; + __ts.tv_nsec = 999999999; // (10^9 - 1) + } + + return __ts; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___CHRONO_CONVERT_TO_TIMESPEC_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/convert_to_tm.h b/app/src/main/cpp/libcxx/include/__chrono/convert_to_tm.h new file mode 100644 index 0000000..36846b3 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/convert_to_tm.h @@ -0,0 +1,127 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_CONVERT_TO_TM_H +#define _LIBCPP___CHRONO_CONVERT_TO_TM_H + +#include <__chrono/day.h> +#include <__chrono/duration.h> +#include <__chrono/hh_mm_ss.h> +#include <__chrono/month.h> +#include <__chrono/month_weekday.h> +#include <__chrono/monthday.h> +#include <__chrono/statically_widen.h> +#include <__chrono/system_clock.h> +#include <__chrono/time_point.h> +#include <__chrono/weekday.h> +#include <__chrono/year.h> +#include <__chrono/year_month.h> +#include <__chrono/year_month_day.h> +#include <__chrono/year_month_weekday.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__memory/addressof.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// Conerts a chrono date and weekday to a given _Tm type. +// +// This is an implementation detail for the function +// template +// _Tm __convert_to_tm(const _ChronoT& __value) +// +// This manually converts the two values to the proper type. It is possible to +// convert from sys_days to time_t and then to _Tm. But this leads to the Y2K +// bug when time_t is a 32-bit signed integer. Chrono considers years beyond +// the year 2038 valid, so instead do the transformation manually. +template + requires(same_as<_Date, chrono::year_month_day> || same_as<_Date, chrono::year_month_day_last>) +_LIBCPP_HIDE_FROM_ABI _Tm __convert_to_tm(const _Date& __date, chrono::weekday __weekday) { + _Tm __result = {}; +# ifdef __GLIBC__ + __result.tm_zone = "UTC"; +# endif + __result.tm_year = static_cast(__date.year()) - 1900; + __result.tm_mon = static_cast(__date.month()) - 1; + __result.tm_mday = static_cast(__date.day()); + __result.tm_wday = static_cast(__weekday.c_encoding()); + __result.tm_yday = + (static_cast(__date) - + static_cast(chrono::year_month_day{__date.year(), chrono::January, chrono::day{1}})) + .count(); + + return __result; +} + +// Convert a chrono (calendar) time point, or dururation to the given _Tm type, +// which must have the same properties as std::tm. +template +_LIBCPP_HIDE_FROM_ABI _Tm __convert_to_tm(const _ChronoT& __value) { + _Tm __result = {}; +# ifdef __GLIBC__ + __result.tm_zone = "UTC"; +# endif + + if constexpr (chrono::__is_duration<_ChronoT>::value) { + // [time.format]/6 + // ... However, if a flag refers to a "time of day" (e.g. %H, %I, %p, + // etc.), then a specialization of duration is interpreted as the time of + // day elapsed since midnight. + uint64_t __sec = chrono::duration_cast(__value).count(); + __sec %= 24 * 3600; + __result.tm_hour = __sec / 3600; + __sec %= 3600; + __result.tm_min = __sec / 60; + __result.tm_sec = __sec % 60; + } else if constexpr (same_as<_ChronoT, chrono::day>) + __result.tm_mday = static_cast(__value); + else if constexpr (same_as<_ChronoT, chrono::month>) + __result.tm_mon = static_cast(__value) - 1; + else if constexpr (same_as<_ChronoT, chrono::year>) + __result.tm_year = static_cast(__value) - 1900; + else if constexpr (same_as<_ChronoT, chrono::weekday>) + __result.tm_wday = __value.c_encoding(); + else if constexpr (same_as<_ChronoT, chrono::weekday_indexed> || same_as<_ChronoT, chrono::weekday_last>) + __result.tm_wday = __value.weekday().c_encoding(); + else if constexpr (same_as<_ChronoT, chrono::month_day>) { + __result.tm_mday = static_cast(__value.day()); + __result.tm_mon = static_cast(__value.month()) - 1; + } else if constexpr (same_as<_ChronoT, chrono::month_day_last>) { + __result.tm_mon = static_cast(__value.month()) - 1; + } else if constexpr (same_as<_ChronoT, chrono::month_weekday> || same_as<_ChronoT, chrono::month_weekday_last>) { + __result.tm_wday = __value.weekday_indexed().weekday().c_encoding(); + __result.tm_mon = static_cast(__value.month()) - 1; + } else if constexpr (same_as<_ChronoT, chrono::year_month>) { + __result.tm_year = static_cast(__value.year()) - 1900; + __result.tm_mon = static_cast(__value.month()) - 1; + } else if constexpr (same_as<_ChronoT, chrono::year_month_day> || same_as<_ChronoT, chrono::year_month_day_last>) { + return std::__convert_to_tm<_Tm>( + chrono::year_month_day{__value}, chrono::weekday{static_cast(__value)}); + } else if constexpr (same_as<_ChronoT, chrono::year_month_weekday> || + same_as<_ChronoT, chrono::year_month_weekday_last>) { + return std::__convert_to_tm<_Tm>(chrono::year_month_day{static_cast(__value)}, __value.weekday()); + } else + static_assert(sizeof(_ChronoT) == 0, "Add the missing type specialization"); + + return __result; +} + +#endif //if _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHRONO_CONVERT_TO_TM_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/day.h b/app/src/main/cpp/libcxx/include/__chrono/day.h new file mode 100644 index 0000000..35ecfcf --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/day.h @@ -0,0 +1,84 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_DAY_H +#define _LIBCPP___CHRONO_DAY_H + +#include <__chrono/duration.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class day { +private: + unsigned char __d_; +public: + _LIBCPP_HIDE_FROM_ABI day() = default; + _LIBCPP_HIDE_FROM_ABI explicit inline constexpr day(unsigned __val) noexcept : __d_(static_cast(__val)) {} + _LIBCPP_HIDE_FROM_ABI inline constexpr day& operator++() noexcept { ++__d_; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr day operator++(int) noexcept { day __tmp = *this; ++(*this); return __tmp; } + _LIBCPP_HIDE_FROM_ABI inline constexpr day& operator--() noexcept { --__d_; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr day operator--(int) noexcept { day __tmp = *this; --(*this); return __tmp; } + _LIBCPP_HIDE_FROM_ABI constexpr day& operator+=(const days& __dd) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr day& operator-=(const days& __dd) noexcept; + _LIBCPP_HIDE_FROM_ABI explicit inline constexpr operator unsigned() const noexcept { return __d_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __d_ >= 1 && __d_ <= 31; } + }; + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const day& __lhs, const day& __rhs) noexcept +{ return static_cast(__lhs) == static_cast(__rhs); } + +_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering operator<=>(const day& __lhs, const day& __rhs) noexcept { + return static_cast(__lhs) <=> static_cast(__rhs); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +day operator+ (const day& __lhs, const days& __rhs) noexcept +{ return day(static_cast(__lhs) + __rhs.count()); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +day operator+ (const days& __lhs, const day& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +day operator- (const day& __lhs, const days& __rhs) noexcept +{ return __lhs + -__rhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +days operator-(const day& __lhs, const day& __rhs) noexcept +{ return days(static_cast(static_cast(__lhs)) - + static_cast(static_cast(__rhs))); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +day& day::operator+=(const days& __dd) noexcept +{ *this = *this + __dd; return *this; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +day& day::operator-=(const days& __dd) noexcept +{ *this = *this - __dd; return *this; } + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_DAY_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/duration.h b/app/src/main/cpp/libcxx/include/__chrono/duration.h new file mode 100644 index 0000000..afcc38b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/duration.h @@ -0,0 +1,622 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_DURATION_H +#define _LIBCPP___CHRONO_DURATION_H + +#include <__config> +#include <__type_traits/common_type.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_convertible.h> +#include <__type_traits/is_floating_point.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +template > class _LIBCPP_TEMPLATE_VIS duration; + +template +struct __is_duration : false_type {}; + +template +struct __is_duration > : true_type {}; + +template +struct __is_duration > : true_type {}; + +template +struct __is_duration > : true_type {}; + +template +struct __is_duration > : true_type {}; + +} // namespace chrono + +template +struct _LIBCPP_TEMPLATE_VIS common_type, + chrono::duration<_Rep2, _Period2> > +{ + typedef chrono::duration::type, + typename __ratio_gcd<_Period1, _Period2>::type> type; +}; + +namespace chrono { + +// duration_cast + +template ::type, + bool = _Period::num == 1, + bool = _Period::den == 1> +struct __duration_cast; + +template +struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true> +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + _ToDuration operator()(const _FromDuration& __fd) const + { + return _ToDuration(static_cast(__fd.count())); + } +}; + +template +struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false> +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + _ToDuration operator()(const _FromDuration& __fd) const + { + typedef typename common_type::type _Ct; + return _ToDuration(static_cast( + static_cast<_Ct>(__fd.count()) / static_cast<_Ct>(_Period::den))); + } +}; + +template +struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true> +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + _ToDuration operator()(const _FromDuration& __fd) const + { + typedef typename common_type::type _Ct; + return _ToDuration(static_cast( + static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num))); + } +}; + +template +struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false> +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + _ToDuration operator()(const _FromDuration& __fd) const + { + typedef typename common_type::type _Ct; + return _ToDuration(static_cast( + static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num) + / static_cast<_Ct>(_Period::den))); + } +}; + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename enable_if +< + __is_duration<_ToDuration>::value, + _ToDuration +>::type +duration_cast(const duration<_Rep, _Period>& __fd) +{ + return __duration_cast, _ToDuration>()(__fd); +} + +template +struct _LIBCPP_TEMPLATE_VIS treat_as_floating_point : is_floating_point<_Rep> {}; + +#if _LIBCPP_STD_VER > 14 +template +inline constexpr bool treat_as_floating_point_v = treat_as_floating_point<_Rep>::value; +#endif + +template +struct _LIBCPP_TEMPLATE_VIS duration_values +{ +public: + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() _NOEXCEPT {return _Rep(0);} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max() _NOEXCEPT {return numeric_limits<_Rep>::max();} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min() _NOEXCEPT {return numeric_limits<_Rep>::lowest();} +}; + +#if _LIBCPP_STD_VER > 14 +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + __is_duration<_ToDuration>::value, + _ToDuration +>::type +floor(const duration<_Rep, _Period>& __d) +{ + _ToDuration __t = chrono::duration_cast<_ToDuration>(__d); + if (__t > __d) + __t = __t - _ToDuration{1}; + return __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + __is_duration<_ToDuration>::value, + _ToDuration +>::type +ceil(const duration<_Rep, _Period>& __d) +{ + _ToDuration __t = chrono::duration_cast<_ToDuration>(__d); + if (__t < __d) + __t = __t + _ToDuration{1}; + return __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + __is_duration<_ToDuration>::value, + _ToDuration +>::type +round(const duration<_Rep, _Period>& __d) +{ + _ToDuration __lower = chrono::floor<_ToDuration>(__d); + _ToDuration __upper = __lower + _ToDuration{1}; + auto __lowerDiff = __d - __lower; + auto __upperDiff = __upper - __d; + if (__lowerDiff < __upperDiff) + return __lower; + if (__lowerDiff > __upperDiff) + return __upper; + return __lower.count() & 1 ? __upper : __lower; +} +#endif + +// duration + +template +class _LIBCPP_TEMPLATE_VIS duration +{ + static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration"); + static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio"); + static_assert(_Period::num > 0, "duration period must be positive"); + + template + struct __no_overflow + { + private: + static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; + static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value; + static const intmax_t __n1 = _R1::num / __gcd_n1_n2; + static const intmax_t __d1 = _R1::den / __gcd_d1_d2; + static const intmax_t __n2 = _R2::num / __gcd_n1_n2; + static const intmax_t __d2 = _R2::den / __gcd_d1_d2; + static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1); + + template + struct __mul // __overflow == false + { + static const intmax_t value = _Xp * _Yp; + }; + + template + struct __mul<_Xp, _Yp, true> + { + static const intmax_t value = 1; + }; + + public: + static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1); + typedef ratio<__mul<__n1, __d2, !value>::value, + __mul<__n2, __d1, !value>::value> type; + }; + +public: + typedef _Rep rep; + typedef typename _Period::type period; +private: + rep __rep_; +public: + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +#ifndef _LIBCPP_CXX03_LANG + duration() = default; +#else + duration() {} +#endif + + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + explicit duration(const _Rep2& __r, + typename enable_if + < + is_convertible::value && + (treat_as_floating_point::value || + !treat_as_floating_point<_Rep2>::value) + >::type* = nullptr) + : __rep_(__r) {} + + // conversions + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + duration(const duration<_Rep2, _Period2>& __d, + typename enable_if + < + __no_overflow<_Period2, period>::value && ( + treat_as_floating_point::value || + (__no_overflow<_Period2, period>::type::den == 1 && + !treat_as_floating_point<_Rep2>::value)) + >::type* = nullptr) + : __rep_(chrono::duration_cast(__d).count()) {} + + // observer + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR rep count() const {return __rep_;} + + // arithmetic + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type::type operator+() const {return typename common_type::type(*this);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type::type operator-() const {return typename common_type::type(-__rep_);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator++() {++__rep_; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration operator++(int) {return duration(__rep_++);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator--() {--__rep_; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration operator--(int) {return duration(__rep_--);} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator*=(const rep& __rhs) {__rep_ *= __rhs; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator/=(const rep& __rhs) {__rep_ /= __rhs; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator%=(const rep& __rhs) {__rep_ %= __rhs; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator%=(const duration& __rhs) {__rep_ %= __rhs.count(); return *this;} + + // special values + + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() _NOEXCEPT {return duration(duration_values::zero());} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min() _NOEXCEPT {return duration(duration_values::min());} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max() _NOEXCEPT {return duration(duration_values::max());} +}; + +typedef duration nanoseconds; +typedef duration microseconds; +typedef duration milliseconds; +typedef duration seconds; +typedef duration< long, ratio< 60> > minutes; +typedef duration< long, ratio<3600> > hours; +#if _LIBCPP_STD_VER > 17 +typedef duration< int, ratio_multiply, hours::period>> days; +typedef duration< int, ratio_multiply, days::period>> weeks; +typedef duration< int, ratio_multiply, days::period>> years; +typedef duration< int, ratio_divide>> months; +#endif +// Duration == + +template +struct __duration_eq +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const + { + typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; + return _Ct(__lhs).count() == _Ct(__rhs).count(); + } +}; + +template +struct __duration_eq<_LhsDuration, _LhsDuration> +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const + {return __lhs.count() == __rhs.count();} +}; + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +bool +operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return __duration_eq, duration<_Rep2, _Period2> >()(__lhs, __rhs); +} + +// Duration != + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +bool +operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return !(__lhs == __rhs); +} + +// Duration < + +template +struct __duration_lt +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const + { + typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; + return _Ct(__lhs).count() < _Ct(__rhs).count(); + } +}; + +template +struct __duration_lt<_LhsDuration, _LhsDuration> +{ + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR + bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const + {return __lhs.count() < __rhs.count();} +}; + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +bool +operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return __duration_lt, duration<_Rep2, _Period2> >()(__lhs, __rhs); +} + +// Duration > + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +bool +operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return __rhs < __lhs; +} + +// Duration <= + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +bool +operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return !(__rhs < __lhs); +} + +// Duration >= + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +bool +operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + return !(__lhs < __rhs); +} + +// Duration + + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename common_type, duration<_Rep2, _Period2> >::type +operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typedef typename common_type, duration<_Rep2, _Period2> >::type _Cd; + return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count()); +} + +// Duration - + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename common_type, duration<_Rep2, _Period2> >::type +operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typedef typename common_type, duration<_Rep2, _Period2> >::type _Cd; + return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count()); +} + +// Duration * + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename enable_if +< + is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value, + duration::type, _Period> +>::type +operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s) +{ + typedef typename common_type<_Rep1, _Rep2>::type _Cr; + typedef duration<_Cr, _Period> _Cd; + return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename enable_if +< + is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value, + duration::type, _Period> +>::type +operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d) +{ + return __d * __s; +} + +// Duration / + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename enable_if +< + !__is_duration<_Rep2>::value && + is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value, + duration::type, _Period> +>::type +operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s) +{ + typedef typename common_type<_Rep1, _Rep2>::type _Cr; + typedef duration<_Cr, _Period> _Cd; + return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename common_type<_Rep1, _Rep2>::type +operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typedef typename common_type, duration<_Rep2, _Period2> >::type _Ct; + return _Ct(__lhs).count() / _Ct(__rhs).count(); +} + +// Duration % + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename enable_if +< + !__is_duration<_Rep2>::value && + is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value, + duration::type, _Period> +>::type +operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s) +{ + typedef typename common_type<_Rep1, _Rep2>::type _Cr; + typedef duration<_Cr, _Period> _Cd; + return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR +typename common_type, duration<_Rep2, _Period2> >::type +operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typedef typename common_type<_Rep1, _Rep2>::type _Cr; + typedef typename common_type, duration<_Rep2, _Period2> >::type _Cd; + return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count())); +} + +} // namespace chrono + +#if _LIBCPP_STD_VER > 11 +// Suffixes for duration literals [time.duration.literals] +inline namespace literals +{ + inline namespace chrono_literals + { + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::hours operator""h(unsigned long long __h) + { + return chrono::hours(static_cast(__h)); + } + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration> operator""h(long double __h) + { + return chrono::duration>(__h); + } + + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::minutes operator""min(unsigned long long __m) + { + return chrono::minutes(static_cast(__m)); + } + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration> operator""min(long double __m) + { + return chrono::duration> (__m); + } + + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::seconds operator""s(unsigned long long __s) + { + return chrono::seconds(static_cast(__s)); + } + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration operator""s(long double __s) + { + return chrono::duration (__s); + } + + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::milliseconds operator""ms(unsigned long long __ms) + { + return chrono::milliseconds(static_cast(__ms)); + } + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration operator""ms(long double __ms) + { + return chrono::duration(__ms); + } + + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::microseconds operator""us(unsigned long long __us) + { + return chrono::microseconds(static_cast(__us)); + } + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration operator""us(long double __us) + { + return chrono::duration (__us); + } + + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::nanoseconds operator""ns(unsigned long long __ns) + { + return chrono::nanoseconds(static_cast(__ns)); + } + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration operator""ns(long double __ns) + { + return chrono::duration (__ns); + } + +} // namespace chrono_literals +} // namespace literals + +namespace chrono { // hoist the literals into namespace std::chrono + using namespace literals::chrono_literals; +} // namespace chrono + +#endif // _LIBCPP_STD_VER > 11 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 +# include +#endif + +#endif // _LIBCPP___CHRONO_DURATION_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/file_clock.h b/app/src/main/cpp/libcxx/include/__chrono/file_clock.h new file mode 100644 index 0000000..ef62b83 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/file_clock.h @@ -0,0 +1,85 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_FILE_CLOCK_H +#define _LIBCPP___CHRONO_FILE_CLOCK_H + +#include <__availability> +#include <__chrono/duration.h> +#include <__chrono/system_clock.h> +#include <__chrono/time_point.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM +struct _FilesystemClock; +_LIBCPP_END_NAMESPACE_FILESYSTEM +#endif // !_LIBCPP_CXX03_LANG + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +// [time.clock.file], type file_clock +using file_clock = _VSTD_FS::_FilesystemClock; + +template +using file_time = time_point; + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#ifndef _LIBCPP_CXX03_LANG +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM +struct _FilesystemClock { +#if !defined(_LIBCPP_HAS_NO_INT128) + typedef __int128_t rep; + typedef nano period; +#else + typedef long long rep; + typedef nano period; +#endif + + typedef chrono::duration duration; + typedef chrono::time_point<_FilesystemClock> time_point; + + _LIBCPP_EXPORTED_FROM_ABI + static _LIBCPP_CONSTEXPR_SINCE_CXX14 const bool is_steady = false; + + _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_FUNC_VIS static time_point now() noexcept; + +#if _LIBCPP_STD_VER > 17 + template + _LIBCPP_HIDE_FROM_ABI + static chrono::sys_time<_Duration> to_sys(const chrono::file_time<_Duration>& __t) { + return chrono::sys_time<_Duration>(__t.time_since_epoch()); + } + + template + _LIBCPP_HIDE_FROM_ABI + static chrono::file_time<_Duration> from_sys(const chrono::sys_time<_Duration>& __t) { + return chrono::file_time<_Duration>(__t.time_since_epoch()); + } +#endif // _LIBCPP_STD_VER > 17 +}; +_LIBCPP_END_NAMESPACE_FILESYSTEM +#endif // !_LIBCPP_CXX03_LANG + +#endif // _LIBCPP___CHRONO_FILE_CLOCK_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/formatter.h b/app/src/main/cpp/libcxx/include/__chrono/formatter.h new file mode 100644 index 0000000..2015783 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/formatter.h @@ -0,0 +1,716 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_FORMATTER_H +#define _LIBCPP___CHRONO_FORMATTER_H + +#include <__chrono/calendar.h> +#include <__chrono/convert_to_tm.h> +#include <__chrono/day.h> +#include <__chrono/duration.h> +#include <__chrono/hh_mm_ss.h> +#include <__chrono/month.h> +#include <__chrono/month_weekday.h> +#include <__chrono/monthday.h> +#include <__chrono/ostream.h> +#include <__chrono/parser_std_format_spec.h> +#include <__chrono/statically_widen.h> +#include <__chrono/time_point.h> +#include <__chrono/weekday.h> +#include <__chrono/year.h> +#include <__chrono/year_month.h> +#include <__chrono/year_month_day.h> +#include <__chrono/year_month_weekday.h> +#include <__concepts/arithmetic.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_error.h> +#include <__format/format_functions.h> +#include <__format/format_parse_context.h> +#include <__format/formatter.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include <__memory/addressof.h> +#include +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) + +namespace __formatter { + +/// Formats a time based on a tm struct. +/// +/// This formatter passes the formatting to time_put which uses strftime. When +/// the value is outside the valid range it's unspecified what strftime will +/// output. For example weekday 8 can print 1 when the day is processed modulo +/// 7 since that handles the Sunday for 0-based weekday. It can also print 8 if +/// 7 is handled as a special case. +/// +/// The Standard doesn't specify what to do in this case so the result depends +/// on the result of the underlying code. +/// +/// \pre When the (abbreviated) weekday or month name are used, the caller +/// validates whether the value is valid. So the caller handles that +/// requirement of Table 97: Meaning of conversion specifiers +/// [tab:time.format.spec]. +/// +/// When no chrono-specs are provided it uses the stream formatter. + +// For tiny ratios it's not possible to convert a duration to a hh_mm_ss. This +// fails compile-time due to the limited precision of the ratio (64-bit is too +// small). Therefore a duration uses its own conversion. +template + requires(chrono::__is_duration<_Tp>::value) +_LIBCPP_HIDE_FROM_ABI void __format_sub_seconds(const _Tp& __value, basic_stringstream<_CharT>& __sstr) { + __sstr << std::use_facet>(__sstr.getloc()).decimal_point(); + + auto __fraction = __value - chrono::duration_cast(__value); + if constexpr (chrono::treat_as_floating_point_v) + // When the floating-point value has digits itself they are ignored based + // on the wording in [tab:time.format.spec] + // If the precision of the input cannot be exactly represented with + // seconds, then the format is a decimal floating-point number with a + // fixed format and a precision matching that of the precision of the + // input (or to a microseconds precision if the conversion to + // floating-point decimal seconds cannot be made within 18 fractional + // digits). + // + // This matches the behaviour of MSVC STL, fmtlib interprets this + // differently and uses 3 decimals. + // https://godbolt.org/z/6dsbnW8ba + std::format_to(std::ostreambuf_iterator<_CharT>{__sstr}, + _LIBCPP_STATICALLY_WIDEN(_CharT, "{:0{}.0f}"), + __fraction.count(), + chrono::hh_mm_ss<_Tp>::fractional_width); + else + std::format_to(std::ostreambuf_iterator<_CharT>{__sstr}, + _LIBCPP_STATICALLY_WIDEN(_CharT, "{:0{}}"), + __fraction.count(), + chrono::hh_mm_ss<_Tp>::fractional_width); +} + +template +consteval bool __use_fraction() { + if constexpr (chrono::__is_duration<_Tp>::value) + return chrono::hh_mm_ss<_Tp>::fractional_width; + else + return false; +} + +template +_LIBCPP_HIDE_FROM_ABI void __format_year(int __year, basic_stringstream<_CharT>& __sstr) { + if (__year < 0) { + __sstr << _CharT('-'); + __year = -__year; + } + + // TODO FMT Write an issue + // If the result has less than four digits it is zero-padded with 0 to two digits. + // is less -> has less + // left-padded -> zero-padded, otherwise the proper value would be 000-0. + + // Note according to the wording it should be left padded, which is odd. + __sstr << std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:04}"), __year); +} + +template +_LIBCPP_HIDE_FROM_ABI void __format_century(int __year, basic_stringstream<_CharT>& __sstr) { + // TODO FMT Write an issue + // [tab:time.format.spec] + // %C The year divided by 100 using floored division. If the result is a + // single decimal digit, it is prefixed with 0. + + bool __negative = __year < 0; + int __century = (__year - (99 * __negative)) / 100; // floored division + __sstr << std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:02}"), __century); +} + +template +_LIBCPP_HIDE_FROM_ABI void __format_chrono_using_chrono_specs( + const _Tp& __value, basic_stringstream<_CharT>& __sstr, basic_string_view<_CharT> __chrono_specs) { + tm __t = std::__convert_to_tm(__value); + const auto& __facet = std::use_facet>(__sstr.getloc()); + for (auto __it = __chrono_specs.begin(); __it != __chrono_specs.end(); ++__it) { + if (*__it == _CharT('%')) { + auto __s = __it; + ++__it; + // We only handle the types that can't be directly handled by time_put. + // (as an optimization n, t, and % are also handled directly.) + switch (*__it) { + case _CharT('n'): + __sstr << _CharT('\n'); + break; + case _CharT('t'): + __sstr << _CharT('\t'); + break; + case _CharT('%'): + __sstr << *__it; + break; + + case _CharT('C'): { + // strftime's output is only defined in the range [00, 99]. + int __year = __t.tm_year + 1900; + if (__year < 1000 || __year > 9999) + __formatter::__format_century(__year, __sstr); + else + __facet.put({__sstr}, __sstr, _CharT(' '), std::addressof(__t), __s, __it + 1); + } break; + + case _CharT('j'): + if constexpr (chrono::__is_duration<_Tp>::value) + // Converting a duration where the period has a small ratio to days + // may fail to compile. This due to loss of precision in the + // conversion. In order to avoid that issue convert to seconds as + // an intemediate step. + __sstr << chrono::duration_cast(chrono::duration_cast(__value)).count(); + else + __facet.put({__sstr}, __sstr, _CharT(' '), std::addressof(__t), __s, __it + 1); + break; + + case _CharT('q'): + if constexpr (chrono::__is_duration<_Tp>::value) { + __sstr << chrono::__units_suffix<_CharT, typename _Tp::period>(); + break; + } + __builtin_unreachable(); + + case _CharT('Q'): + // TODO FMT Determine the proper ideas + // - Should it honour the precision? + // - Shoult it honour the locale setting for the separators? + // The wording for Q doesn't use the word locale and the effect of + // precision is unspecified. + // + // MSVC STL ignores precision but uses separator + // FMT honours precision and has a bug for separator + // https://godbolt.org/z/78b7sMxns + if constexpr (chrono::__is_duration<_Tp>::value) { + __sstr << std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{}"), __value.count()); + break; + } + __builtin_unreachable(); + + case _CharT('S'): + case _CharT('T'): + __facet.put({__sstr}, __sstr, _CharT(' '), std::addressof(__t), __s, __it + 1); + if constexpr (__use_fraction<_Tp>()) + __formatter::__format_sub_seconds(__value, __sstr); + break; + + // Unlike time_put and strftime the formatting library requires %Y + // + // [tab:time.format.spec] + // The year as a decimal number. If the result is less than four digits + // it is left-padded with 0 to four digits. + // + // This means years in the range (-1000, 1000) need manual formatting. + // It's unclear whether %EY needs the same treatment. For example the + // Japanese EY contains the era name and year. This is zero-padded to 2 + // digits in time_put (note that older glibc versions didn't do + // padding.) However most eras won't reach 100 years, let alone 1000. + // So padding to 4 digits seems unwanted for Japanese. + // + // The same applies to %Ex since that too depends on the era. + // + // %x the locale's date representation is currently doesn't handle the + // zero-padding too. + // + // The 4 digits can be implemented better at a later time. On POSIX + // systems the required information can be extracted by nl_langinfo + // https://man7.org/linux/man-pages/man3/nl_langinfo.3.html + // + // Note since year < -1000 is expected to be rare it uses the more + // expensive year routine. + // + // TODO FMT evaluate the comment above. + +# if defined(__GLIBC__) || defined(_AIX) + case _CharT('y'): + // Glibc fails for negative values, AIX for positive values too. + __sstr << std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:02}"), (std::abs(__t.tm_year + 1900)) % 100); + break; +# endif // defined(__GLIBC__) || defined(_AIX) + + case _CharT('Y'): { + int __year = __t.tm_year + 1900; + if (__year < 1000) + __formatter::__format_year(__year, __sstr); + else + __facet.put({__sstr}, __sstr, _CharT(' '), std::addressof(__t), __s, __it + 1); + } break; + + case _CharT('F'): { + int __year = __t.tm_year + 1900; + if (__year < 1000) { + __formatter::__format_year(__year, __sstr); + __sstr << std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "-{:02}-{:02}"), __t.tm_mon + 1, __t.tm_mday); + } else + __facet.put({__sstr}, __sstr, _CharT(' '), std::addressof(__t), __s, __it + 1); + } break; + + case _CharT('O'): + if constexpr (__use_fraction<_Tp>()) { + // Handle OS using the normal representation for the non-fractional + // part. There seems to be no locale information regarding how the + // fractional part should be formatted. + if (*(__it + 1) == 'S') { + ++__it; + __facet.put({__sstr}, __sstr, _CharT(' '), std::addressof(__t), __s, __it + 1); + __formatter::__format_sub_seconds(__value, __sstr); + break; + } + } + [[fallthrough]]; + case _CharT('E'): + ++__it; + [[fallthrough]]; + default: + __facet.put({__sstr}, __sstr, _CharT(' '), std::addressof(__t), __s, __it + 1); + break; + } + } else { + __sstr << *__it; + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool __weekday_ok(const _Tp& __value) { + if constexpr (same_as<_Tp, chrono::day>) + return true; + else if constexpr (same_as<_Tp, chrono::month>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday_indexed>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday_last>) + return true; + else if constexpr (same_as<_Tp, chrono::month_day>) + return true; + else if constexpr (same_as<_Tp, chrono::month_day_last>) + return true; + else if constexpr (same_as<_Tp, chrono::month_weekday>) + return true; + else if constexpr (same_as<_Tp, chrono::month_weekday_last>) + return true; + else if constexpr (same_as<_Tp, chrono::year_month>) + return true; + else if constexpr (same_as<_Tp, chrono::year_month_day>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year_month_day_last>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year_month_weekday>) + return __value.weekday().ok(); + else if constexpr (same_as<_Tp, chrono::year_month_weekday_last>) + return __value.weekday().ok(); + else + static_assert(sizeof(_Tp) == 0, "Add the missing type specialization"); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool __weekday_name_ok(const _Tp& __value) { + if constexpr (same_as<_Tp, chrono::day>) + return true; + else if constexpr (same_as<_Tp, chrono::month>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::weekday_indexed>) + return __value.weekday().ok(); + else if constexpr (same_as<_Tp, chrono::weekday_last>) + return __value.weekday().ok(); + else if constexpr (same_as<_Tp, chrono::month_day>) + return true; + else if constexpr (same_as<_Tp, chrono::month_day_last>) + return true; + else if constexpr (same_as<_Tp, chrono::month_weekday>) + return __value.weekday_indexed().ok(); + else if constexpr (same_as<_Tp, chrono::month_weekday_last>) + return __value.weekday_indexed().ok(); + else if constexpr (same_as<_Tp, chrono::year_month>) + return true; + else if constexpr (same_as<_Tp, chrono::year_month_day>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year_month_day_last>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year_month_weekday>) + return __value.weekday().ok(); + else if constexpr (same_as<_Tp, chrono::year_month_weekday_last>) + return __value.weekday().ok(); + else + static_assert(sizeof(_Tp) == 0, "Add the missing type specialization"); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool __date_ok(const _Tp& __value) { + if constexpr (same_as<_Tp, chrono::day>) + return true; + else if constexpr (same_as<_Tp, chrono::month>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday_indexed>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday_last>) + return true; + else if constexpr (same_as<_Tp, chrono::month_day>) + return true; + else if constexpr (same_as<_Tp, chrono::month_day_last>) + return true; + else if constexpr (same_as<_Tp, chrono::month_weekday>) + return true; + else if constexpr (same_as<_Tp, chrono::month_weekday_last>) + return true; + else if constexpr (same_as<_Tp, chrono::year_month>) + return true; + else if constexpr (same_as<_Tp, chrono::year_month_day>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year_month_day_last>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year_month_weekday>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year_month_weekday_last>) + return __value.ok(); + else + static_assert(sizeof(_Tp) == 0, "Add the missing type specialization"); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr bool __month_name_ok(const _Tp& __value) { + if constexpr (same_as<_Tp, chrono::day>) + return true; + else if constexpr (same_as<_Tp, chrono::month>) + return __value.ok(); + else if constexpr (same_as<_Tp, chrono::year>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday_indexed>) + return true; + else if constexpr (same_as<_Tp, chrono::weekday_last>) + return true; + else if constexpr (same_as<_Tp, chrono::month_day>) + return __value.month().ok(); + else if constexpr (same_as<_Tp, chrono::month_day_last>) + return __value.month().ok(); + else if constexpr (same_as<_Tp, chrono::month_weekday>) + return __value.month().ok(); + else if constexpr (same_as<_Tp, chrono::month_weekday_last>) + return __value.month().ok(); + else if constexpr (same_as<_Tp, chrono::year_month>) + return __value.month().ok(); + else if constexpr (same_as<_Tp, chrono::year_month_day>) + return __value.month().ok(); + else if constexpr (same_as<_Tp, chrono::year_month_day_last>) + return __value.month().ok(); + else if constexpr (same_as<_Tp, chrono::year_month_weekday>) + return __value.month().ok(); + else if constexpr (same_as<_Tp, chrono::year_month_weekday_last>) + return __value.month().ok(); + else + static_assert(sizeof(_Tp) == 0, "Add the missing type specialization"); +} + +template +_LIBCPP_HIDE_FROM_ABI auto +__format_chrono(const _Tp& __value, + auto& __ctx, + __format_spec::__parsed_specifications<_CharT> __specs, + basic_string_view<_CharT> __chrono_specs) -> decltype(__ctx.out()) { + basic_stringstream<_CharT> __sstr; + // [time.format]/2 + // 2.1 - the "C" locale if the L option is not present in chrono-format-spec, otherwise + // 2.2 - the locale passed to the formatting function if any, otherwise + // 2.3 - the global locale. + // Note that the __ctx's locale() call does 2.2 and 2.3. + if (__specs.__chrono_.__locale_specific_form_) + __sstr.imbue(__ctx.locale()); + else + __sstr.imbue(locale::classic()); + + if (__chrono_specs.empty()) + __sstr << __value; + else { + if constexpr (chrono::__is_duration<_Tp>::value) { + if (__value < __value.zero()) + __sstr << _CharT('-'); + __formatter::__format_chrono_using_chrono_specs(chrono::abs(__value), __sstr, __chrono_specs); + // TODO FMT When keeping the precision it will truncate the string. + // Note that the behaviour what the precision does isn't specified. + __specs.__precision_ = -1; + } else { + // Test __weekday_name_ before __weekday_ to give a better error. + if (__specs.__chrono_.__weekday_name_ && !__formatter::__weekday_name_ok(__value)) + std::__throw_format_error("formatting a weekday name needs a valid weekday"); + + if (__specs.__chrono_.__weekday_ && !__formatter::__weekday_ok(__value)) + std::__throw_format_error("formatting a weekday needs a valid weekday"); + + if (__specs.__chrono_.__day_of_year_ && !__formatter::__date_ok(__value)) + std::__throw_format_error("formatting a day of year needs a valid date"); + + if (__specs.__chrono_.__week_of_year_ && !__formatter::__date_ok(__value)) + std::__throw_format_error("formatting a week of year needs a valid date"); + + if (__specs.__chrono_.__month_name_ && !__formatter::__month_name_ok(__value)) + std::__throw_format_error("formatting a month name from an invalid month number"); + + __formatter::__format_chrono_using_chrono_specs(__value, __sstr, __chrono_specs); + } + } + + // TODO FMT Use the stringstream's view after P0408R7 has been implemented. + basic_string<_CharT> __str = __sstr.str(); + return __formatter::__write_string(basic_string_view<_CharT>{__str}, __ctx.out(), __specs); +} + +} // namespace __formatter + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __formatter_chrono { +public: + _LIBCPP_HIDE_FROM_ABI constexpr auto __parse( + basic_format_parse_context<_CharT>& __parse_ctx, __format_spec::__fields __fields, __format_spec::__flags __flags) + -> decltype(__parse_ctx.begin()) { + return __parser_.__parse(__parse_ctx, __fields, __flags); + } + + template + _LIBCPP_HIDE_FROM_ABI auto format(const _Tp& __value, auto& __ctx) const -> decltype(__ctx.out()) const { + return __formatter::__format_chrono( + __value, __ctx, __parser_.__parser_.__get_parsed_chrono_specifications(__ctx), __parser_.__chrono_specs_); + } + + __format_spec::__parser_chrono<_CharT> __parser_; +}; + +template +struct formatter, _CharT> : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + // [time.format]/1 + // Giving a precision specification in the chrono-format-spec is valid only + // for std::chrono::duration types where the representation type Rep is a + // floating-point type. For all other Rep types, an exception of type + // format_error is thrown if the chrono-format-spec contains a precision + // specification. + // + // Note this doesn't refer to chrono::treat_as_floating_point_v<_Rep>. + if constexpr (std::floating_point<_Rep>) + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono_fractional, __format_spec::__flags::__duration); + else + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__duration); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__day); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__month); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__year); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__weekday); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__weekday); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__weekday); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__month_day); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__month); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__month_weekday); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__month_weekday); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__year_month); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__date); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__date); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__date); + } +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_chrono<_CharT> { +public: + using _Base = __formatter_chrono<_CharT>; + + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + return _Base::__parse(__parse_ctx, __format_spec::__fields_chrono, __format_spec::__flags::__date); + } +}; + +#endif // if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHRONO_FORMATTER_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/hh_mm_ss.h b/app/src/main/cpp/libcxx/include/__chrono/hh_mm_ss.h new file mode 100644 index 0000000..fd61cbe --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/hh_mm_ss.h @@ -0,0 +1,112 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_HH_MM_SS_H +#define _LIBCPP___CHRONO_HH_MM_SS_H + +#include <__chrono/duration.h> +#include <__chrono/time_point.h> +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +template +class hh_mm_ss +{ +private: + static_assert(__is_duration<_Duration>::value, "template parameter of hh_mm_ss must be a std::chrono::duration"); + using __CommonType = common_type_t<_Duration, chrono::seconds>; + + _LIBCPP_HIDE_FROM_ABI static constexpr uint64_t __pow10(unsigned __exp) + { + uint64_t __ret = 1; + for (unsigned __i = 0; __i < __exp; ++__i) + __ret *= 10U; + return __ret; + } + + _LIBCPP_HIDE_FROM_ABI static constexpr unsigned __width(uint64_t __n, uint64_t __d = 10, unsigned __w = 0) + { + if (__n >= 2 && __d != 0 && __w < 19) + return 1 + __width(__n, __d % __n * 10, __w+1); + return 0; + } + +public: + _LIBCPP_HIDE_FROM_ABI static unsigned constexpr fractional_width = __width(__CommonType::period::den) < 19 ? + __width(__CommonType::period::den) : 6u; + using precision = duration>; + + _LIBCPP_HIDE_FROM_ABI constexpr hh_mm_ss() noexcept : hh_mm_ss{_Duration::zero()} {} + + _LIBCPP_HIDE_FROM_ABI constexpr explicit hh_mm_ss(_Duration __d) noexcept : + __is_neg_(__d < _Duration(0)), + __h_(chrono::duration_cast (chrono::abs(__d))), + __m_(chrono::duration_cast(chrono::abs(__d) - hours())), + __s_(chrono::duration_cast(chrono::abs(__d) - hours() - minutes())), + __f_(chrono::duration_cast (chrono::abs(__d) - hours() - minutes() - seconds())) + {} + + _LIBCPP_HIDE_FROM_ABI constexpr bool is_negative() const noexcept { return __is_neg_; } + _LIBCPP_HIDE_FROM_ABI constexpr chrono::hours hours() const noexcept { return __h_; } + _LIBCPP_HIDE_FROM_ABI constexpr chrono::minutes minutes() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI constexpr chrono::seconds seconds() const noexcept { return __s_; } + _LIBCPP_HIDE_FROM_ABI constexpr precision subseconds() const noexcept { return __f_; } + + _LIBCPP_HIDE_FROM_ABI constexpr precision to_duration() const noexcept + { + auto __dur = __h_ + __m_ + __s_ + __f_; + return __is_neg_ ? -__dur : __dur; + } + + _LIBCPP_HIDE_FROM_ABI constexpr explicit operator precision() const noexcept { return to_duration(); } + +private: + bool __is_neg_; + chrono::hours __h_; + chrono::minutes __m_; + chrono::seconds __s_; + precision __f_; +}; + +_LIBCPP_HIDE_FROM_ABI constexpr bool is_am(const hours& __h) noexcept { return __h >= hours( 0) && __h < hours(12); } +_LIBCPP_HIDE_FROM_ABI constexpr bool is_pm(const hours& __h) noexcept { return __h >= hours(12) && __h < hours(24); } + +_LIBCPP_HIDE_FROM_ABI constexpr hours make12(const hours& __h) noexcept +{ + if (__h == hours( 0)) return hours(12); + else if (__h <= hours(12)) return __h; + else return __h - hours(12); +} + +_LIBCPP_HIDE_FROM_ABI constexpr hours make24(const hours& __h, bool __is_pm) noexcept +{ + if (__is_pm) + return __h == hours(12) ? __h : __h + hours(12); + else + return __h == hours(12) ? hours(0) : __h; +} +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_HH_MM_SS_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/high_resolution_clock.h b/app/src/main/cpp/libcxx/include/__chrono/high_resolution_clock.h new file mode 100644 index 0000000..778ff44 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/high_resolution_clock.h @@ -0,0 +1,36 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_HIGH_RESOLUTION_CLOCK_H +#define _LIBCPP___CHRONO_HIGH_RESOLUTION_CLOCK_H + +#include <__chrono/steady_clock.h> +#include <__chrono/system_clock.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK +typedef steady_clock high_resolution_clock; +#else +typedef system_clock high_resolution_clock; +#endif + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHRONO_HIGH_RESOLUTION_CLOCK_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/literals.h b/app/src/main/cpp/libcxx/include/__chrono/literals.h new file mode 100644 index 0000000..50529bd --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/literals.h @@ -0,0 +1,49 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_LITERALS_H +#define _LIBCPP___CHRONO_LITERALS_H + +#include <__chrono/day.h> +#include <__chrono/year.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +inline namespace literals +{ + inline namespace chrono_literals + { + _LIBCPP_HIDE_FROM_ABI constexpr chrono::day operator ""d(unsigned long long __d) noexcept + { + return chrono::day(static_cast(__d)); + } + + _LIBCPP_HIDE_FROM_ABI constexpr chrono::year operator ""y(unsigned long long __y) noexcept + { + return chrono::year(static_cast(__y)); + } +} // namespace chrono_literals +} // namespace literals + +namespace chrono { // hoist the literals into namespace std::chrono + using namespace literals::chrono_literals; +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_LITERALS_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/month.h b/app/src/main/cpp/libcxx/include/__chrono/month.h new file mode 100644 index 0000000..e929f24 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/month.h @@ -0,0 +1,103 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_MONTH_H +#define _LIBCPP___CHRONO_MONTH_H + +#include <__chrono/duration.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class month { +private: + unsigned char __m_; +public: + _LIBCPP_HIDE_FROM_ABI month() = default; + _LIBCPP_HIDE_FROM_ABI explicit inline constexpr month(unsigned __val) noexcept : __m_(static_cast(__val)) {} + _LIBCPP_HIDE_FROM_ABI inline constexpr month& operator++() noexcept { ++__m_; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr month operator++(int) noexcept { month __tmp = *this; ++(*this); return __tmp; } + _LIBCPP_HIDE_FROM_ABI inline constexpr month& operator--() noexcept { --__m_; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr month operator--(int) noexcept { month __tmp = *this; --(*this); return __tmp; } + _LIBCPP_HIDE_FROM_ABI constexpr month& operator+=(const months& __m1) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr month& operator-=(const months& __m1) noexcept; + _LIBCPP_HIDE_FROM_ABI explicit inline constexpr operator unsigned() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_ >= 1 && __m_ <= 12; } +}; + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const month& __lhs, const month& __rhs) noexcept +{ return static_cast(__lhs) == static_cast(__rhs); } + +_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering operator<=>(const month& __lhs, const month& __rhs) noexcept { + return static_cast(__lhs) <=> static_cast(__rhs); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month operator+ (const month& __lhs, const months& __rhs) noexcept +{ + auto const __mu = static_cast(static_cast(__lhs)) + (__rhs.count() - 1); + auto const __yr = (__mu >= 0 ? __mu : __mu - 11) / 12; + return month{static_cast(__mu - __yr * 12 + 1)}; +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month operator+ (const months& __lhs, const month& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month operator- (const month& __lhs, const months& __rhs) noexcept +{ return __lhs + -__rhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +months operator-(const month& __lhs, const month& __rhs) noexcept +{ + auto const __dm = static_cast(__lhs) - static_cast(__rhs); + return months(__dm <= 11 ? __dm : __dm + 12); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month& month::operator+=(const months& __dm) noexcept +{ *this = *this + __dm; return *this; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month& month::operator-=(const months& __dm) noexcept +{ *this = *this - __dm; return *this; } + +inline constexpr month January{1}; +inline constexpr month February{2}; +inline constexpr month March{3}; +inline constexpr month April{4}; +inline constexpr month May{5}; +inline constexpr month June{6}; +inline constexpr month July{7}; +inline constexpr month August{8}; +inline constexpr month September{9}; +inline constexpr month October{10}; +inline constexpr month November{11}; +inline constexpr month December{12}; + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_MONTH_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/month_weekday.h b/app/src/main/cpp/libcxx/include/__chrono/month_weekday.h new file mode 100644 index 0000000..01cdf76 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/month_weekday.h @@ -0,0 +1,106 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_MONTH_WEEKDAY_H +#define _LIBCPP___CHRONO_MONTH_WEEKDAY_H + +#include <__chrono/month.h> +#include <__chrono/weekday.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class month_weekday { +private: + chrono::month __m_; + chrono::weekday_indexed __wdi_; +public: + _LIBCPP_HIDE_FROM_ABI constexpr month_weekday(const chrono::month& __mval, const chrono::weekday_indexed& __wdival) noexcept + : __m_{__mval}, __wdi_{__wdival} {} + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept { return __wdi_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok() && __wdi_.ok(); } +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const month_weekday& __lhs, const month_weekday& __rhs) noexcept +{ return __lhs.month() == __rhs.month() && __lhs.weekday_indexed() == __rhs.weekday_indexed(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator!=(const month_weekday& __lhs, const month_weekday& __rhs) noexcept +{ return !(__lhs == __rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_weekday operator/(const month& __lhs, const weekday_indexed& __rhs) noexcept +{ return month_weekday{__lhs, __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_weekday operator/(int __lhs, const weekday_indexed& __rhs) noexcept +{ return month_weekday{month(__lhs), __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_weekday operator/(const weekday_indexed& __lhs, const month& __rhs) noexcept +{ return month_weekday{__rhs, __lhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_weekday operator/(const weekday_indexed& __lhs, int __rhs) noexcept +{ return month_weekday{month(__rhs), __lhs}; } + + +class month_weekday_last { + chrono::month __m_; + chrono::weekday_last __wdl_; + public: + _LIBCPP_HIDE_FROM_ABI constexpr month_weekday_last(const chrono::month& __mval, const chrono::weekday_last& __wdlval) noexcept + : __m_{__mval}, __wdl_{__wdlval} {} + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_last weekday_last() const noexcept { return __wdl_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok() && __wdl_.ok(); } +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const month_weekday_last& __lhs, const month_weekday_last& __rhs) noexcept +{ return __lhs.month() == __rhs.month() && __lhs.weekday_last() == __rhs.weekday_last(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator!=(const month_weekday_last& __lhs, const month_weekday_last& __rhs) noexcept +{ return !(__lhs == __rhs); } + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_weekday_last operator/(const month& __lhs, const weekday_last& __rhs) noexcept +{ return month_weekday_last{__lhs, __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_weekday_last operator/(int __lhs, const weekday_last& __rhs) noexcept +{ return month_weekday_last{month(__lhs), __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_weekday_last operator/(const weekday_last& __lhs, const month& __rhs) noexcept +{ return month_weekday_last{__rhs, __lhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_weekday_last operator/(const weekday_last& __lhs, int __rhs) noexcept +{ return month_weekday_last{month(__rhs), __lhs}; } +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_MONTH_WEEKDAY_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/monthday.h b/app/src/main/cpp/libcxx/include/__chrono/monthday.h new file mode 100644 index 0000000..c0ee3e4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/monthday.h @@ -0,0 +1,129 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_MONTHDAY_H +#define _LIBCPP___CHRONO_MONTHDAY_H + +#include <__chrono/calendar.h> +#include <__chrono/day.h> +#include <__chrono/month.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class month_day { +private: + chrono::month __m_; + chrono::day __d_; +public: + _LIBCPP_HIDE_FROM_ABI month_day() = default; + _LIBCPP_HIDE_FROM_ABI constexpr month_day(const chrono::month& __mval, const chrono::day& __dval) noexcept + : __m_{__mval}, __d_{__dval} {} + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::day day() const noexcept { return __d_; } + _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept; +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool month_day::ok() const noexcept +{ + if (!__m_.ok()) return false; + const unsigned __dval = static_cast(__d_); + if (__dval < 1 || __dval > 31) return false; + if (__dval <= 29) return true; +// Now we've got either 30 or 31 + const unsigned __mval = static_cast(__m_); + if (__mval == 2) return false; + if (__mval == 4 || __mval == 6 || __mval == 9 || __mval == 11) + return __dval == 30; + return true; +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const month_day& __lhs, const month_day& __rhs) noexcept +{ return __lhs.month() == __rhs.month() && __lhs.day() == __rhs.day(); } + +_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering operator<=>(const month_day& __lhs, const month_day& __rhs) noexcept { + if (auto __c = __lhs.month() <=> __rhs.month(); __c != 0) + return __c; + return __lhs.day() <=> __rhs.day(); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_day operator/(const month& __lhs, const day& __rhs) noexcept +{ return month_day{__lhs, __rhs}; } + +_LIBCPP_HIDE_FROM_ABI constexpr +month_day operator/(const day& __lhs, const month& __rhs) noexcept +{ return __rhs / __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_day operator/(const month& __lhs, int __rhs) noexcept +{ return __lhs / day(__rhs); } + +_LIBCPP_HIDE_FROM_ABI constexpr +month_day operator/(int __lhs, const day& __rhs) noexcept +{ return month(__lhs) / __rhs; } + +_LIBCPP_HIDE_FROM_ABI constexpr +month_day operator/(const day& __lhs, int __rhs) noexcept +{ return month(__rhs) / __lhs; } + +class month_day_last { +private: + chrono::month __m_; +public: + _LIBCPP_HIDE_FROM_ABI explicit constexpr month_day_last(const chrono::month& __val) noexcept + : __m_{__val} {} + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __m_.ok(); } +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const month_day_last& __lhs, const month_day_last& __rhs) noexcept +{ return __lhs.month() == __rhs.month(); } + +_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering +operator<=>(const month_day_last& __lhs, const month_day_last& __rhs) noexcept { + return __lhs.month() <=> __rhs.month(); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_day_last operator/(const month& __lhs, last_spec) noexcept +{ return month_day_last{__lhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_day_last operator/(last_spec, const month& __rhs) noexcept +{ return month_day_last{__rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_day_last operator/(int __lhs, last_spec) noexcept +{ return month_day_last{month(__lhs)}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +month_day_last operator/(last_spec, int __rhs) noexcept +{ return month_day_last{month(__rhs)}; } + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_MONTHDAY_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/ostream.h b/app/src/main/cpp/libcxx/include/__chrono/ostream.h new file mode 100644 index 0000000..30a04bd --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/ostream.h @@ -0,0 +1,238 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_OSTREAM_H +#define _LIBCPP___CHRONO_OSTREAM_H + +#include <__chrono/day.h> +#include <__chrono/duration.h> +#include <__chrono/month.h> +#include <__chrono/month_weekday.h> +#include <__chrono/monthday.h> +#include <__chrono/statically_widen.h> +#include <__chrono/weekday.h> +#include <__chrono/year.h> +#include <__chrono/year_month.h> +#include <__chrono/year_month_day.h> +#include <__chrono/year_month_weekday.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/format_functions.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) + +namespace chrono { + +// Depending on the type the return is a const _CharT* or a basic_string<_CharT> +template +_LIBCPP_HIDE_FROM_ABI auto __units_suffix() { + // TODO FMT LWG issue the suffixes are always char and not STATICALLY-WIDEN'ed. + if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "as"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "fs"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "ps"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "ns"); + else if constexpr (same_as) +# ifndef _LIBCPP_HAS_NO_UNICODE + return _LIBCPP_STATICALLY_WIDEN(_CharT, "\u00b5s"); +# else + return _LIBCPP_STATICALLY_WIDEN(_CharT, "us"); +# endif + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "ms"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "cs"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "ds"); + else if constexpr (same_as>) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "s"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "das"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "hs"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "ks"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "Ms"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "Gs"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "Ts"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "Ps"); + else if constexpr (same_as) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "Es"); + else if constexpr (same_as>) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "min"); + else if constexpr (same_as>) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "h"); + else if constexpr (same_as>) + return _LIBCPP_STATICALLY_WIDEN(_CharT, "d"); + else if constexpr (_Period::den == 1) + return std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "[{}]s"), _Period::num); + else + return std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "[{}/{}]s"), _Period::num, _Period::den); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const duration<_Rep, _Period>& __d) { + basic_ostringstream<_CharT, _Traits> __s; + __s.flags(__os.flags()); + __s.imbue(__os.getloc()); + __s.precision(__os.precision()); + __s << __d.count() << chrono::__units_suffix<_CharT, _Period>(); + return __os << __s.str(); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const day& __d) { + return __os + << (__d.ok() + ? std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:%d}"), __d) + // Note this error differs from the wording of the Standard. The + // Standard wording doesn't work well on AIX or Windows. There + // the formatted day seems to be either modulo 100 or completely + // omitted. Judging by the wording this is valid. + // TODO FMT Write a paper of file an LWG issue. + : std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:02} is not a valid day"), static_cast(__d))); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const month& __m) { + return __os << (__m.ok() ? std::format(__os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L%b}"), __m) + : std::format(__os.getloc(), + _LIBCPP_STATICALLY_WIDEN(_CharT, "{} is not a valid month"), + static_cast(__m))); // TODO FMT Standard mandated locale isn't used. +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const year& __y) { + return __os << (__y.ok() ? std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:%Y}"), __y) + : std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:%Y} is not a valid year"), __y)); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const weekday& __wd) { + return __os << (__wd.ok() ? std::format(__os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L%a}"), __wd) + : std::format(__os.getloc(), // TODO FMT Standard mandated locale isn't used. + _LIBCPP_STATICALLY_WIDEN(_CharT, "{} is not a valid weekday"), + static_cast(__wd.c_encoding()))); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const weekday_indexed& __wdi) { + auto __i = __wdi.index(); + return __os << (__i >= 1 && __i <= 5 + ? std::format(__os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L}[{}]"), __wdi.weekday(), __i) + : std::format(__os.getloc(), + _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L}[{} is not a valid index]"), + __wdi.weekday(), + __i)); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const weekday_last& __wdl) { + return __os << std::format(__os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L}[last]"), __wdl.weekday()); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const month_day& __md) { + // TODO FMT The Standard allows 30th of February to be printed. + // It would be nice to show an error message instead. + return __os << std::format(__os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L}/{}"), __md.month(), __md.day()); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const month_day_last& __mdl) { + return __os << std::format(__os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L}/last"), __mdl.month()); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const month_weekday& __mwd) { + return __os << std::format( + __os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L}/{:L}"), __mwd.month(), __mwd.weekday_indexed()); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const month_weekday_last& __mwdl) { + return __os << std::format( + __os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{:L}/{:L}"), __mwdl.month(), __mwdl.weekday_last()); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const year_month& __ym) { + return __os << std::format(__os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{}/{:L}"), __ym.year(), __ym.month()); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const year_month_day& __ymd) { + return __os << (__ymd.ok() ? std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:%F}"), __ymd) + : std::format(_LIBCPP_STATICALLY_WIDEN(_CharT, "{:%F} is not a valid date"), __ymd)); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const year_month_day_last& __ymdl) { + return __os << std::format( + __os.getloc(), _LIBCPP_STATICALLY_WIDEN(_CharT, "{}/{:L}"), __ymdl.year(), __ymdl.month_day_last()); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const year_month_weekday& __ymwd) { + return __os << std::format( + __os.getloc(), + _LIBCPP_STATICALLY_WIDEN(_CharT, "{}/{:L}/{:L}"), + __ymwd.year(), + __ymwd.month(), + __ymwd.weekday_indexed()); +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const year_month_weekday_last& __ymwdl) { + return __os << std::format( + __os.getloc(), + _LIBCPP_STATICALLY_WIDEN(_CharT, "{}/{:L}/{:L}"), + __ymwdl.year(), + __ymwdl.month(), + __ymwdl.weekday_last()); +} + +} // namespace chrono + +#endif //if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHRONO_OSTREAM_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/parser_std_format_spec.h b/app/src/main/cpp/libcxx/include/__chrono/parser_std_format_spec.h new file mode 100644 index 0000000..dbcfe6d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/parser_std_format_spec.h @@ -0,0 +1,410 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_PARSER_STD_FORMAT_SPEC_H +#define _LIBCPP___CHRONO_PARSER_STD_FORMAT_SPEC_H + +#include <__config> +#include <__format/concepts.h> +#include <__format/format_error.h> +#include <__format/format_parse_context.h> +#include <__format/formatter_string.h> +#include <__format/parser_std_format_spec.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) + +namespace __format_spec { + +// By not placing this constant in the formatter class it's not duplicated for char and wchar_t +inline constexpr __fields __fields_chrono_fractional{ + .__precision_ = true, .__locale_specific_form_ = true, .__type_ = false}; +inline constexpr __fields __fields_chrono{.__locale_specific_form_ = true, .__type_ = false}; + +/// Flags available or required in a chrono type. +/// +/// The caller of the chrono formatter lists the types it has available and the +/// validation tests whether the requested type spec (e.g. %M) is available in +/// the formatter. +/// When the type in the chrono-format-spec isn't present in the data a +/// \ref format_error is thrown. +enum class __flags { + __second = 0x1, + __minute = 0x2, + __hour = 0x4, + __time = __hour | __minute | __second, + + __day = 0x8, + __month = 0x10, + __year = 0x20, + + __weekday = 0x40, + + __month_day = __day | __month, + __month_weekday = __weekday | __month, + __year_month = __month | __year, + __date = __day | __month | __year | __weekday, + + __date_time = __date | __time, + + __duration = 0x80 | __time, + + __time_zone = 0x100, + + __clock = __date_time | __time_zone +}; + +_LIBCPP_HIDE_FROM_ABI constexpr __flags operator&(__flags __lhs, __flags __rhs) { + return static_cast<__flags>(static_cast(__lhs) & static_cast(__rhs)); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_second(__flags __flags) { + if ((__flags & __flags::__second) != __flags::__second) + std::__throw_format_error("The supplied date time doesn't contain a second"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_minute(__flags __flags) { + if ((__flags & __flags::__minute) != __flags::__minute) + std::__throw_format_error("The supplied date time doesn't contain a minute"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_hour(__flags __flags) { + if ((__flags & __flags::__hour) != __flags::__hour) + std::__throw_format_error("The supplied date time doesn't contain an hour"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_time(__flags __flags) { + if ((__flags & __flags::__time) != __flags::__time) + std::__throw_format_error("The supplied date time doesn't contain a time"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_day(__flags __flags) { + if ((__flags & __flags::__day) != __flags::__day) + std::__throw_format_error("The supplied date time doesn't contain a day"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_month(__flags __flags) { + if ((__flags & __flags::__month) != __flags::__month) + std::__throw_format_error("The supplied date time doesn't contain a month"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_year(__flags __flags) { + if ((__flags & __flags::__year) != __flags::__year) + std::__throw_format_error("The supplied date time doesn't contain a year"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_date(__flags __flags) { + if ((__flags & __flags::__date) != __flags::__date) + std::__throw_format_error("The supplied date time doesn't contain a date"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_date_or_duration(__flags __flags) { + if (((__flags & __flags::__date) != __flags::__date) && ((__flags & __flags::__duration) != __flags::__duration)) + std::__throw_format_error("The supplied date time doesn't contain a date or duration"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_date_time(__flags __flags) { + if ((__flags & __flags::__date_time) != __flags::__date_time) + std::__throw_format_error("The supplied date time doesn't contain a date and time"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_weekday(__flags __flags) { + if ((__flags & __flags::__weekday) != __flags::__weekday) + std::__throw_format_error("The supplied date time doesn't contain a weekday"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_duration(__flags __flags) { + if ((__flags & __flags::__duration) != __flags::__duration) + std::__throw_format_error("The supplied date time doesn't contain a duration"); +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __validate_time_zone(__flags __flags) { + if ((__flags & __flags::__time_zone) != __flags::__time_zone) + std::__throw_format_error("The supplied date time doesn't contain a time zone"); +} + +template +class _LIBCPP_TEMPLATE_VIS __parser_chrono { +public: + _LIBCPP_HIDE_FROM_ABI constexpr auto + __parse(basic_format_parse_context<_CharT>& __parse_ctx, __fields __fields, __flags __flags) + -> decltype(__parse_ctx.begin()) { + const _CharT* __begin = __parser_.__parse(__parse_ctx, __fields); + const _CharT* __end = __parse_ctx.end(); + if (__begin == __end) + return __begin; + + const _CharT* __last = __parse_chrono_specs(__begin, __end, __flags); + __chrono_specs_ = basic_string_view<_CharT>{__begin, __last}; + + return __last; + } + + __parser<_CharT> __parser_; + basic_string_view<_CharT> __chrono_specs_; + +private: + _LIBCPP_HIDE_FROM_ABI constexpr const _CharT* + __parse_chrono_specs(const _CharT* __begin, const _CharT* __end, __flags __flags) { + _LIBCPP_ASSERT(__begin != __end, + "When called with an empty input the function will cause " + "undefined behavior by evaluating data not in the input"); + + if (*__begin != _CharT('%') && *__begin != _CharT('}')) + std::__throw_format_error("Expected '%' or '}' in the chrono format-string"); + + do { + switch (*__begin) { + case _CharT('{'): + std::__throw_format_error("The chrono-specs contains a '{'"); + + case _CharT('}'): + return __begin; + + case _CharT('%'): + __parse_conversion_spec(__begin, __end, __flags); + [[fallthrough]]; + + default: + // All other literals + ++__begin; + } + + } while (__begin != __end && *__begin != _CharT('}')); + + return __begin; + } + + /// \pre *__begin == '%' + /// \post __begin points at the end parsed conversion-spec + _LIBCPP_HIDE_FROM_ABI constexpr void + __parse_conversion_spec(const _CharT*& __begin, const _CharT* __end, __flags __flags) { + ++__begin; + if (__begin == __end) + std::__throw_format_error("End of input while parsing the modifier chrono conversion-spec"); + + switch (*__begin) { + case _CharT('n'): + case _CharT('t'): + case _CharT('%'): + break; + + case _CharT('S'): + __format_spec::__validate_second(__flags); + break; + + case _CharT('M'): + __format_spec::__validate_minute(__flags); + break; + + case _CharT('p'): // TODO FMT does the formater require an hour or a time? + case _CharT('H'): + case _CharT('I'): + __validate_hour(__flags); + break; + + case _CharT('r'): + case _CharT('R'): + case _CharT('T'): + case _CharT('X'): + __format_spec::__validate_time(__flags); + break; + + case _CharT('d'): + case _CharT('e'): + __format_spec::__validate_day(__flags); + break; + + case _CharT('b'): + case _CharT('h'): + case _CharT('B'): + __parser_.__month_name_ = true; + [[fallthrough]]; + case _CharT('m'): + __format_spec::__validate_month(__flags); + break; + + case _CharT('y'): + case _CharT('C'): + case _CharT('Y'): + __format_spec::__validate_year(__flags); + break; + + case _CharT('j'): + __parser_.__day_of_year_ = true; + __format_spec::__validate_date_or_duration(__flags); + break; + + case _CharT('g'): + case _CharT('G'): + case _CharT('U'): + case _CharT('V'): + case _CharT('W'): + __parser_.__week_of_year_ = true; + [[fallthrough]]; + case _CharT('x'): + case _CharT('D'): + case _CharT('F'): + __format_spec::__validate_date(__flags); + break; + + case _CharT('c'): + __format_spec::__validate_date_time(__flags); + break; + + case _CharT('a'): + case _CharT('A'): + __parser_.__weekday_name_ = true; + [[fallthrough]]; + case _CharT('u'): + case _CharT('w'): + __parser_.__weekday_ = true; + __validate_weekday(__flags); + __format_spec::__validate_weekday(__flags); + break; + + case _CharT('q'): + case _CharT('Q'): + __format_spec::__validate_duration(__flags); + break; + + case _CharT('E'): + __parse_modifier_E(__begin, __end, __flags); + break; + + case _CharT('O'): + __parse_modifier_O(__begin, __end, __flags); + break; + + case _CharT('z'): + case _CharT('Z'): + // Currently there's no time zone information. However some clocks have a + // hard-coded "time zone", for these clocks the information can be used. + // TODO FMT implement time zones. + __format_spec::__validate_time_zone(__flags); + break; + + default: // unknown type; + std::__throw_format_error("The date time type specifier is invalid"); + } + } + + /// \pre *__begin == 'E' + /// \post __begin is incremented by one. + _LIBCPP_HIDE_FROM_ABI constexpr void + __parse_modifier_E(const _CharT*& __begin, const _CharT* __end, __flags __flags) { + ++__begin; + if (__begin == __end) + std::__throw_format_error("End of input while parsing the modifier E"); + + switch (*__begin) { + case _CharT('X'): + __format_spec::__validate_time(__flags); + break; + + case _CharT('y'): + case _CharT('C'): + case _CharT('Y'): + __format_spec::__validate_year(__flags); + break; + + case _CharT('x'): + __format_spec::__validate_date(__flags); + break; + + case _CharT('c'): + __format_spec::__validate_date_time(__flags); + break; + + case _CharT('z'): + // Currently there's no time zone information. However some clocks have a + // hard-coded "time zone", for these clocks the information can be used. + // TODO FMT implement time zones. + __format_spec::__validate_time_zone(__flags); + break; + + default: + std::__throw_format_error("The date time type specifier for modifier E is invalid"); + } + } + + /// \pre *__begin == 'O' + /// \post __begin is incremented by one. + _LIBCPP_HIDE_FROM_ABI constexpr void + __parse_modifier_O(const _CharT*& __begin, const _CharT* __end, __flags __flags) { + ++__begin; + if (__begin == __end) + std::__throw_format_error("End of input while parsing the modifier O"); + + switch (*__begin) { + case _CharT('S'): + __format_spec::__validate_second(__flags); + break; + + case _CharT('M'): + __format_spec::__validate_minute(__flags); + break; + + case _CharT('I'): + case _CharT('H'): + __format_spec::__validate_hour(__flags); + break; + + case _CharT('d'): + case _CharT('e'): + __format_spec::__validate_day(__flags); + break; + + case _CharT('m'): + __format_spec::__validate_month(__flags); + break; + + case _CharT('y'): + __format_spec::__validate_year(__flags); + break; + + case _CharT('U'): + case _CharT('V'): + case _CharT('W'): + __parser_.__week_of_year_ = true; + __format_spec::__validate_date(__flags); + break; + + case _CharT('u'): + case _CharT('w'): + __parser_.__weekday_ = true; + __format_spec::__validate_weekday(__flags); + break; + + case _CharT('z'): + // Currently there's no time zone information. However some clocks have a + // hard-coded "time zone", for these clocks the information can be used. + // TODO FMT implement time zones. + __format_spec::__validate_time_zone(__flags); + break; + + default: + std::__throw_format_error("The date time type specifier for modifier O is invalid"); + } + } +}; + +} // namespace __format_spec + +#endif //_LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHRONO_PARSER_STD_FORMAT_SPEC_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/statically_widen.h b/app/src/main/cpp/libcxx/include/__chrono/statically_widen.h new file mode 100644 index 0000000..360b6c2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/statically_widen.h @@ -0,0 +1,52 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_STATICALLY_WIDEN_H +#define _LIBCPP___CHRONO_STATICALLY_WIDEN_H + +// Implements the STATICALLY-WIDEN exposition-only function. ([time.general]/2) + +#include <__concepts/same_as.h> +#include <__config> +#include <__format/concepts.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template <__fmt_char_type _CharT> +_LIBCPP_HIDE_FROM_ABI constexpr const _CharT* __statically_widen(const char* __str, const wchar_t* __wstr) { + if constexpr (same_as<_CharT, char>) + return __str; + else + return __wstr; +} +# define _LIBCPP_STATICALLY_WIDEN(_CharT, __str) ::std::__statically_widen<_CharT>(__str, L##__str) +# else // _LIBCPP_HAS_NO_WIDE_CHARACTERS + +// Without this indirection the unit test test/libcxx/modules_include.sh.cpp +// fails for the CI build "No wide characters". This seems like a bug. +// TODO FMT investigate why this is needed. +template <__fmt_char_type _CharT> +_LIBCPP_HIDE_FROM_ABI constexpr const _CharT* __statically_widen(const char* __str) { + return __str; +} +# define _LIBCPP_STATICALLY_WIDEN(_CharT, __str) ::std::__statically_widen<_CharT>(__str) +# endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHRONO_STATICALLY_WIDEN_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/steady_clock.h b/app/src/main/cpp/libcxx/include/__chrono/steady_clock.h new file mode 100644 index 0000000..ba83351 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/steady_clock.h @@ -0,0 +1,44 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_STEADY_CLOCK_H +#define _LIBCPP___CHRONO_STEADY_CLOCK_H + +#include <__chrono/duration.h> +#include <__chrono/time_point.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK +class _LIBCPP_TYPE_VIS steady_clock +{ +public: + typedef nanoseconds duration; + typedef duration::rep rep; + typedef duration::period period; + typedef chrono::time_point time_point; + static _LIBCPP_CONSTEXPR_SINCE_CXX14 const bool is_steady = true; + + static time_point now() _NOEXCEPT; +}; +#endif + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHRONO_STEADY_CLOCK_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/system_clock.h b/app/src/main/cpp/libcxx/include/__chrono/system_clock.h new file mode 100644 index 0000000..331db46 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/system_clock.h @@ -0,0 +1,54 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_SYSTEM_CLOCK_H +#define _LIBCPP___CHRONO_SYSTEM_CLOCK_H + +#include <__chrono/duration.h> +#include <__chrono/time_point.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class _LIBCPP_TYPE_VIS system_clock +{ +public: + typedef microseconds duration; + typedef duration::rep rep; + typedef duration::period period; + typedef chrono::time_point time_point; + static _LIBCPP_CONSTEXPR_SINCE_CXX14 const bool is_steady = false; + + static time_point now() _NOEXCEPT; + static time_t to_time_t (const time_point& __t) _NOEXCEPT; + static time_point from_time_t(time_t __t) _NOEXCEPT; +}; + +#if _LIBCPP_STD_VER > 17 + +template +using sys_time = time_point; +using sys_seconds = sys_time; +using sys_days = sys_time; + +#endif + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CHRONO_SYSTEM_CLOCK_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/time_point.h b/app/src/main/cpp/libcxx/include/__chrono/time_point.h new file mode 100644 index 0000000..8a8fa21 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/time_point.h @@ -0,0 +1,251 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_TIME_POINT_H +#define _LIBCPP___CHRONO_TIME_POINT_H + +#include <__chrono/duration.h> +#include <__config> +#include <__type_traits/common_type.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_convertible.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +template +class _LIBCPP_TEMPLATE_VIS time_point +{ + static_assert(__is_duration<_Duration>::value, + "Second template parameter of time_point must be a std::chrono::duration"); +public: + typedef _Clock clock; + typedef _Duration duration; + typedef typename duration::rep rep; + typedef typename duration::period period; +private: + duration __d_; + +public: + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 time_point() : __d_(duration::zero()) {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit time_point(const duration& __d) : __d_(__d) {} + + // conversions + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 + time_point(const time_point& __t, + typename enable_if + < + is_convertible<_Duration2, duration>::value + >::type* = nullptr) + : __d_(__t.time_since_epoch()) {} + + // observer + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 duration time_since_epoch() const {return __d_;} + + // arithmetic + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 time_point& operator+=(const duration& __d) {__d_ += __d; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;} + + // special values + + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() _NOEXCEPT {return time_point(duration::min());} + _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() _NOEXCEPT {return time_point(duration::max());} +}; + +} // namespace chrono + +template +struct _LIBCPP_TEMPLATE_VIS common_type, + chrono::time_point<_Clock, _Duration2> > +{ + typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type; +}; + +namespace chrono { + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +time_point<_Clock, _ToDuration> +time_point_cast(const time_point<_Clock, _Duration>& __t) +{ + return time_point<_Clock, _ToDuration>(chrono::duration_cast<_ToDuration>(__t.time_since_epoch())); +} + +#if _LIBCPP_STD_VER > 14 +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + __is_duration<_ToDuration>::value, + time_point<_Clock, _ToDuration> +>::type +floor(const time_point<_Clock, _Duration>& __t) +{ + return time_point<_Clock, _ToDuration>{chrono::floor<_ToDuration>(__t.time_since_epoch())}; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + __is_duration<_ToDuration>::value, + time_point<_Clock, _ToDuration> +>::type +ceil(const time_point<_Clock, _Duration>& __t) +{ + return time_point<_Clock, _ToDuration>{chrono::ceil<_ToDuration>(__t.time_since_epoch())}; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + __is_duration<_ToDuration>::value, + time_point<_Clock, _ToDuration> +>::type +round(const time_point<_Clock, _Duration>& __t) +{ + return time_point<_Clock, _ToDuration>{chrono::round<_ToDuration>(__t.time_since_epoch())}; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR +typename enable_if +< + numeric_limits<_Rep>::is_signed, + duration<_Rep, _Period> +>::type +abs(duration<_Rep, _Period> __d) +{ + return __d >= __d.zero() ? +__d : -__d; +} +#endif // _LIBCPP_STD_VER > 14 + +// time_point == + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +bool +operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __lhs.time_since_epoch() == __rhs.time_since_epoch(); +} + +// time_point != + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +bool +operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return !(__lhs == __rhs); +} + +// time_point < + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +bool +operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __lhs.time_since_epoch() < __rhs.time_since_epoch(); +} + +// time_point > + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +bool +operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __rhs < __lhs; +} + +// time_point <= + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +bool +operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return !(__rhs < __lhs); +} + +// time_point >= + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +bool +operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return !(__lhs < __rhs); +} + +// time_point operator+(time_point x, duration y); + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> +operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr; + return _Tr (__lhs.time_since_epoch() + __rhs); +} + +// time_point operator+(duration x, time_point y); + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +time_point<_Clock, typename common_type, _Duration2>::type> +operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __rhs + __lhs; +} + +// time_point operator-(time_point x, duration y); + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> +operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) +{ + typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Ret; + return _Ret(__lhs.time_since_epoch() -__rhs); +} + +// duration operator-(time_point x, time_point y); + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +typename common_type<_Duration1, _Duration2>::type +operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) +{ + return __lhs.time_since_epoch() - __rhs.time_since_epoch(); +} + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___CHRONO_TIME_POINT_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/weekday.h b/app/src/main/cpp/libcxx/include/__chrono/weekday.h new file mode 100644 index 0000000..e0bc8a4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/weekday.h @@ -0,0 +1,185 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_WEEKDAY_H +#define _LIBCPP___CHRONO_WEEKDAY_H + +#include <__chrono/calendar.h> +#include <__chrono/duration.h> +#include <__chrono/system_clock.h> +#include <__chrono/time_point.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class weekday_indexed; +class weekday_last; + +class weekday { +private: + unsigned char __wd_; + _LIBCPP_HIDE_FROM_ABI static constexpr unsigned char __weekday_from_days(int __days) noexcept; +public: + _LIBCPP_HIDE_FROM_ABI weekday() = default; + _LIBCPP_HIDE_FROM_ABI inline explicit constexpr weekday(unsigned __val) noexcept : __wd_(static_cast(__val == 7 ? 0 : __val)) {} + _LIBCPP_HIDE_FROM_ABI inline constexpr weekday(const sys_days& __sysd) noexcept + : __wd_(__weekday_from_days(__sysd.time_since_epoch().count())) {} + _LIBCPP_HIDE_FROM_ABI inline explicit constexpr weekday(const local_days& __locd) noexcept + : __wd_(__weekday_from_days(__locd.time_since_epoch().count())) {} + + _LIBCPP_HIDE_FROM_ABI inline constexpr weekday& operator++() noexcept { __wd_ = (__wd_ == 6 ? 0 : __wd_ + 1); return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr weekday operator++(int) noexcept { weekday __tmp = *this; ++(*this); return __tmp; } + _LIBCPP_HIDE_FROM_ABI inline constexpr weekday& operator--() noexcept { __wd_ = (__wd_ == 0 ? 6 : __wd_ - 1); return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr weekday operator--(int) noexcept { weekday __tmp = *this; --(*this); return __tmp; } + _LIBCPP_HIDE_FROM_ABI constexpr weekday& operator+=(const days& __dd) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr weekday& operator-=(const days& __dd) noexcept; + _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned c_encoding() const noexcept { return __wd_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned iso_encoding() const noexcept { return __wd_ == 0u ? 7 : __wd_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __wd_ <= 6; } + _LIBCPP_HIDE_FROM_ABI constexpr weekday_indexed operator[](unsigned __index) const noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr weekday_last operator[](last_spec) const noexcept; +}; + + +// https://howardhinnant.github.io/date_algorithms.html#weekday_from_days +_LIBCPP_HIDE_FROM_ABI inline constexpr +unsigned char weekday::__weekday_from_days(int __days) noexcept +{ + return static_cast( + static_cast(__days >= -4 ? (__days+4) % 7 : (__days+5) % 7 + 6) + ); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const weekday& __lhs, const weekday& __rhs) noexcept +{ return __lhs.c_encoding() == __rhs.c_encoding(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator!=(const weekday& __lhs, const weekday& __rhs) noexcept +{ return !(__lhs == __rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator< (const weekday& __lhs, const weekday& __rhs) noexcept +{ return __lhs.c_encoding() < __rhs.c_encoding(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator> (const weekday& __lhs, const weekday& __rhs) noexcept +{ return __rhs < __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator<=(const weekday& __lhs, const weekday& __rhs) noexcept +{ return !(__rhs < __lhs);} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator>=(const weekday& __lhs, const weekday& __rhs) noexcept +{ return !(__lhs < __rhs); } + +_LIBCPP_HIDE_FROM_ABI constexpr +weekday operator+(const weekday& __lhs, const days& __rhs) noexcept +{ + auto const __mu = static_cast(__lhs.c_encoding()) + __rhs.count(); + auto const __yr = (__mu >= 0 ? __mu : __mu - 6) / 7; + return weekday{static_cast(__mu - __yr * 7)}; +} + +_LIBCPP_HIDE_FROM_ABI constexpr +weekday operator+(const days& __lhs, const weekday& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI constexpr +weekday operator-(const weekday& __lhs, const days& __rhs) noexcept +{ return __lhs + -__rhs; } + +_LIBCPP_HIDE_FROM_ABI constexpr +days operator-(const weekday& __lhs, const weekday& __rhs) noexcept +{ + const int __wdu = __lhs.c_encoding() - __rhs.c_encoding(); + const int __wk = (__wdu >= 0 ? __wdu : __wdu-6) / 7; + return days{__wdu - __wk * 7}; +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +weekday& weekday::operator+=(const days& __dd) noexcept +{ *this = *this + __dd; return *this; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +weekday& weekday::operator-=(const days& __dd) noexcept +{ *this = *this - __dd; return *this; } + +class weekday_indexed { +private: + chrono::weekday __wd_; + unsigned char __idx_; +public: + _LIBCPP_HIDE_FROM_ABI weekday_indexed() = default; + _LIBCPP_HIDE_FROM_ABI inline constexpr weekday_indexed(const chrono::weekday& __wdval, unsigned __idxval) noexcept + : __wd_{__wdval}, __idx_(__idxval) {} + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wd_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned index() const noexcept { return __idx_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __wd_.ok() && __idx_ >= 1 && __idx_ <= 5; } +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const weekday_indexed& __lhs, const weekday_indexed& __rhs) noexcept +{ return __lhs.weekday() == __rhs.weekday() && __lhs.index() == __rhs.index(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator!=(const weekday_indexed& __lhs, const weekday_indexed& __rhs) noexcept +{ return !(__lhs == __rhs); } + + +class weekday_last { +private: + chrono::weekday __wd_; +public: + _LIBCPP_HIDE_FROM_ABI explicit constexpr weekday_last(const chrono::weekday& __val) noexcept + : __wd_{__val} {} + _LIBCPP_HIDE_FROM_ABI constexpr chrono::weekday weekday() const noexcept { return __wd_; } + _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept { return __wd_.ok(); } +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const weekday_last& __lhs, const weekday_last& __rhs) noexcept +{ return __lhs.weekday() == __rhs.weekday(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator!=(const weekday_last& __lhs, const weekday_last& __rhs) noexcept +{ return !(__lhs == __rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +weekday_indexed weekday::operator[](unsigned __index) const noexcept { return weekday_indexed{*this, __index}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +weekday_last weekday::operator[](last_spec) const noexcept { return weekday_last{*this}; } + + +inline constexpr weekday Sunday{0}; +inline constexpr weekday Monday{1}; +inline constexpr weekday Tuesday{2}; +inline constexpr weekday Wednesday{3}; +inline constexpr weekday Thursday{4}; +inline constexpr weekday Friday{5}; +inline constexpr weekday Saturday{6}; + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_WEEKDAY_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/year.h b/app/src/main/cpp/libcxx/include/__chrono/year.h new file mode 100644 index 0000000..79ee8a0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/year.h @@ -0,0 +1,102 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_YEAR_H +#define _LIBCPP___CHRONO_YEAR_H + +#include <__chrono/duration.h> +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class year { +private: + short __y_; +public: + _LIBCPP_HIDE_FROM_ABI year() = default; + _LIBCPP_HIDE_FROM_ABI explicit inline constexpr year(int __val) noexcept : __y_(static_cast(__val)) {} + + _LIBCPP_HIDE_FROM_ABI inline constexpr year& operator++() noexcept { ++__y_; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr year operator++(int) noexcept { year __tmp = *this; ++(*this); return __tmp; } + _LIBCPP_HIDE_FROM_ABI inline constexpr year& operator--() noexcept { --__y_; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr year operator--(int) noexcept { year __tmp = *this; --(*this); return __tmp; } + _LIBCPP_HIDE_FROM_ABI constexpr year& operator+=(const years& __dy) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year& operator-=(const years& __dy) noexcept; + _LIBCPP_HIDE_FROM_ABI inline constexpr year operator+() const noexcept { return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr year operator-() const noexcept { return year{-__y_}; } + + _LIBCPP_HIDE_FROM_ABI inline constexpr bool is_leap() const noexcept { return __y_ % 4 == 0 && (__y_ % 100 != 0 || __y_ % 400 == 0); } + _LIBCPP_HIDE_FROM_ABI explicit inline constexpr operator int() const noexcept { return __y_; } + _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept; + _LIBCPP_HIDE_FROM_ABI static inline constexpr year min() noexcept { return year{-32767}; } + _LIBCPP_HIDE_FROM_ABI static inline constexpr year max() noexcept { return year{ 32767}; } +}; + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const year& __lhs, const year& __rhs) noexcept +{ return static_cast(__lhs) == static_cast(__rhs); } + +_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering operator<=>(const year& __lhs, const year& __rhs) noexcept { + return static_cast(__lhs) <=> static_cast(__rhs); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year operator+ (const year& __lhs, const years& __rhs) noexcept +{ return year(static_cast(__lhs) + __rhs.count()); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year operator+ (const years& __lhs, const year& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year operator- (const year& __lhs, const years& __rhs) noexcept +{ return __lhs + -__rhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +years operator-(const year& __lhs, const year& __rhs) noexcept +{ return years{static_cast(__lhs) - static_cast(__rhs)}; } + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year& year::operator+=(const years& __dy) noexcept +{ *this = *this + __dy; return *this; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year& year::operator-=(const years& __dy) noexcept +{ *this = *this - __dy; return *this; } + +_LIBCPP_HIDE_FROM_ABI constexpr bool year::ok() const noexcept { + static_assert(static_cast(std::numeric_limits::max()) == static_cast(max())); + return static_cast(min()) <= __y_; +} + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___CHRONO_YEAR_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/year_month.h b/app/src/main/cpp/libcxx/include/__chrono/year_month.h new file mode 100644 index 0000000..9f1e65c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/year_month.h @@ -0,0 +1,101 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_YEAR_MONTH_H +#define _LIBCPP___CHRONO_YEAR_MONTH_H + +#include <__chrono/duration.h> +#include <__chrono/month.h> +#include <__chrono/year.h> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class year_month { + chrono::year __y_; + chrono::month __m_; +public: + _LIBCPP_HIDE_FROM_ABI year_month() = default; + _LIBCPP_HIDE_FROM_ABI constexpr year_month(const chrono::year& __yval, const chrono::month& __mval) noexcept + : __y_{__yval}, __m_{__mval} {} + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& operator+=(const months& __dm) noexcept { this->__m_ += __dm; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& operator-=(const months& __dm) noexcept { this->__m_ -= __dm; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& operator+=(const years& __dy) noexcept { this->__y_ += __dy; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr year_month& operator-=(const years& __dy) noexcept { this->__y_ -= __dy; return *this; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __m_.ok(); } +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month operator/(const year& __y, const month& __m) noexcept { return year_month{__y, __m}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month operator/(const year& __y, int __m) noexcept { return year_month{__y, month(__m)}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const year_month& __lhs, const year_month& __rhs) noexcept +{ return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month(); } + +_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering operator<=>(const year_month& __lhs, const year_month& __rhs) noexcept { + if (auto __c = __lhs.year() <=> __rhs.year(); __c != 0) + return __c; + return __lhs.month() <=> __rhs.month(); +} + +_LIBCPP_HIDE_FROM_ABI constexpr +year_month operator+(const year_month& __lhs, const months& __rhs) noexcept +{ + int __dmi = static_cast(static_cast(__lhs.month())) - 1 + __rhs.count(); + const int __dy = (__dmi >= 0 ? __dmi : __dmi-11) / 12; + __dmi = __dmi - __dy * 12 + 1; + return (__lhs.year() + years(__dy)) / month(static_cast(__dmi)); +} + +_LIBCPP_HIDE_FROM_ABI constexpr +year_month operator+(const months& __lhs, const year_month& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI constexpr +year_month operator+(const year_month& __lhs, const years& __rhs) noexcept +{ return (__lhs.year() + __rhs) / __lhs.month(); } + +_LIBCPP_HIDE_FROM_ABI constexpr +year_month operator+(const years& __lhs, const year_month& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI constexpr +months operator-(const year_month& __lhs, const year_month& __rhs) noexcept +{ return (__lhs.year() - __rhs.year()) + months(static_cast(__lhs.month()) - static_cast(__rhs.month())); } + +_LIBCPP_HIDE_FROM_ABI constexpr +year_month operator-(const year_month& __lhs, const months& __rhs) noexcept +{ return __lhs + -__rhs; } + +_LIBCPP_HIDE_FROM_ABI constexpr +year_month operator-(const year_month& __lhs, const years& __rhs) noexcept +{ return __lhs + -__rhs; } + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_YEAR_MONTH_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/year_month_day.h b/app/src/main/cpp/libcxx/include/__chrono/year_month_day.h new file mode 100644 index 0000000..b749014 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/year_month_day.h @@ -0,0 +1,307 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_YEAR_MONTH_DAY_H +#define _LIBCPP___CHRONO_YEAR_MONTH_DAY_H + +#include <__chrono/calendar.h> +#include <__chrono/day.h> +#include <__chrono/duration.h> +#include <__chrono/month.h> +#include <__chrono/monthday.h> +#include <__chrono/system_clock.h> +#include <__chrono/time_point.h> +#include <__chrono/year.h> +#include <__chrono/year_month.h> +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class year_month_day_last; + +class year_month_day { +private: + chrono::year __y_; + chrono::month __m_; + chrono::day __d_; +public: + _LIBCPP_HIDE_FROM_ABI year_month_day() = default; + _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day( + const chrono::year& __yval, const chrono::month& __mval, const chrono::day& __dval) noexcept + : __y_{__yval}, __m_{__mval}, __d_{__dval} {} + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day(const year_month_day_last& __ymdl) noexcept; + _LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day(const sys_days& __sysd) noexcept + : year_month_day(__from_days(__sysd.time_since_epoch())) {} + _LIBCPP_HIDE_FROM_ABI inline explicit constexpr year_month_day(const local_days& __locd) noexcept + : year_month_day(__from_days(__locd.time_since_epoch())) {} + + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day& operator+=(const months& __dm) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day& operator-=(const months& __dm) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day& operator+=(const years& __dy) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day& operator-=(const years& __dy) noexcept; + + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::day day() const noexcept { return __d_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; } + _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept { return local_days{__to_days()}; } + + _LIBCPP_HIDE_FROM_ABI constexpr bool ok() const noexcept; + + _LIBCPP_HIDE_FROM_ABI static constexpr year_month_day __from_days(days __d) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr days __to_days() const noexcept; +}; + + +// https://howardhinnant.github.io/date_algorithms.html#civil_from_days +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day year_month_day::__from_days(days __d) noexcept +{ + static_assert(numeric_limits::digits >= 18, ""); + static_assert(numeric_limits::digits >= 20 , ""); + const int __z = __d.count() + 719468; + const int __era = (__z >= 0 ? __z : __z - 146096) / 146097; + const unsigned __doe = static_cast(__z - __era * 146097); // [0, 146096] + const unsigned __yoe = (__doe - __doe/1460 + __doe/36524 - __doe/146096) / 365; // [0, 399] + const int __yr = static_cast(__yoe) + __era * 400; + const unsigned __doy = __doe - (365 * __yoe + __yoe/4 - __yoe/100); // [0, 365] + const unsigned __mp = (5 * __doy + 2)/153; // [0, 11] + const unsigned __dy = __doy - (153 * __mp + 2)/5 + 1; // [1, 31] + const unsigned __mth = __mp + (__mp < 10 ? 3 : -9); // [1, 12] + return year_month_day{chrono::year{__yr + (__mth <= 2)}, chrono::month{__mth}, chrono::day{__dy}}; +} + +// https://howardhinnant.github.io/date_algorithms.html#days_from_civil +_LIBCPP_HIDE_FROM_ABI inline constexpr +days year_month_day::__to_days() const noexcept +{ + static_assert(numeric_limits::digits >= 18, ""); + static_assert(numeric_limits::digits >= 20 , ""); + + const int __yr = static_cast(__y_) - (__m_ <= February); + const unsigned __mth = static_cast(__m_); + const unsigned __dy = static_cast(__d_); + + const int __era = (__yr >= 0 ? __yr : __yr - 399) / 400; + const unsigned __yoe = static_cast(__yr - __era * 400); // [0, 399] + const unsigned __doy = (153 * (__mth + (__mth > 2 ? -3 : 9)) + 2) / 5 + __dy-1; // [0, 365] + const unsigned __doe = __yoe * 365 + __yoe/4 - __yoe/100 + __doy; // [0, 146096] + return days{__era * 146097 + static_cast(__doe) - 719468}; +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const year_month_day& __lhs, const year_month_day& __rhs) noexcept +{ return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() && __lhs.day() == __rhs.day(); } + +_LIBCPP_HIDE_FROM_ABI constexpr strong_ordering +operator<=>(const year_month_day& __lhs, const year_month_day& __rhs) noexcept { + if (auto __c = __lhs.year() <=> __rhs.year(); __c != 0) + return __c; + if (auto __c = __lhs.month() <=> __rhs.month(); __c != 0) + return __c; + return __lhs.day() <=> __rhs.day(); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator/(const year_month& __lhs, const day& __rhs) noexcept +{ return year_month_day{__lhs.year(), __lhs.month(), __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator/(const year_month& __lhs, int __rhs) noexcept +{ return __lhs / day(__rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator/(const year& __lhs, const month_day& __rhs) noexcept +{ return __lhs / __rhs.month() / __rhs.day(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator/(int __lhs, const month_day& __rhs) noexcept +{ return year(__lhs) / __rhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator/(const month_day& __lhs, const year& __rhs) noexcept +{ return __rhs / __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator/(const month_day& __lhs, int __rhs) noexcept +{ return year(__rhs) / __lhs; } + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator+(const year_month_day& __lhs, const months& __rhs) noexcept +{ return (__lhs.year()/__lhs.month() + __rhs)/__lhs.day(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator+(const months& __lhs, const year_month_day& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator-(const year_month_day& __lhs, const months& __rhs) noexcept +{ return __lhs + -__rhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator+(const year_month_day& __lhs, const years& __rhs) noexcept +{ return (__lhs.year() + __rhs) / __lhs.month() / __lhs.day(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator+(const years& __lhs, const year_month_day& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day operator-(const year_month_day& __lhs, const years& __rhs) noexcept +{ return __lhs + -__rhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day& year_month_day::operator+=(const months& __dm) noexcept { *this = *this + __dm; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day& year_month_day::operator-=(const months& __dm) noexcept { *this = *this - __dm; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day& year_month_day::operator+=(const years& __dy) noexcept { *this = *this + __dy; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day& year_month_day::operator-=(const years& __dy) noexcept { *this = *this - __dy; return *this; } + +class year_month_day_last { +private: + chrono::year __y_; + chrono::month_day_last __mdl_; +public: + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day_last(const year& __yval, const month_day_last& __mdlval) noexcept + : __y_{__yval}, __mdl_{__mdlval} {} + + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day_last& operator+=(const months& __m) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day_last& operator-=(const months& __m) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day_last& operator+=(const years& __y) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_day_last& operator-=(const years& __y) noexcept; + + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __mdl_.month(); } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month_day_last month_day_last() const noexcept { return __mdl_; } + _LIBCPP_HIDE_FROM_ABI constexpr chrono::day day() const noexcept; + _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{year()/month()/day()}; } + _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept { return local_days{year()/month()/day()}; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __mdl_.ok(); } +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +chrono::day year_month_day_last::day() const noexcept +{ + constexpr chrono::day __d[] = + { + chrono::day(31), chrono::day(28), chrono::day(31), + chrono::day(30), chrono::day(31), chrono::day(30), + chrono::day(31), chrono::day(31), chrono::day(30), + chrono::day(31), chrono::day(30), chrono::day(31) + }; + return (month() != February || !__y_.is_leap()) && month().ok() ? + __d[static_cast(month()) - 1] : chrono::day{29}; +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept +{ return __lhs.year() == __rhs.year() && __lhs.month_day_last() == __rhs.month_day_last(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator!=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept +{ return !(__lhs == __rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator< (const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept +{ + if (__lhs.year() < __rhs.year()) return true; + if (__lhs.year() > __rhs.year()) return false; + return __lhs.month_day_last() < __rhs.month_day_last(); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator> (const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept +{ return __rhs < __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator<=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept +{ return !(__rhs < __lhs);} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator>=(const year_month_day_last& __lhs, const year_month_day_last& __rhs) noexcept +{ return !(__lhs < __rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator/(const year_month& __lhs, last_spec) noexcept +{ return year_month_day_last{__lhs.year(), month_day_last{__lhs.month()}}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator/(const year& __lhs, const month_day_last& __rhs) noexcept +{ return year_month_day_last{__lhs, __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator/(int __lhs, const month_day_last& __rhs) noexcept +{ return year_month_day_last{year{__lhs}, __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last +operator/(const month_day_last& __lhs, const year& __rhs) noexcept +{ return __rhs / __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator/(const month_day_last& __lhs, int __rhs) noexcept +{ return year{__rhs} / __lhs; } + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator+(const year_month_day_last& __lhs, const months& __rhs) noexcept +{ return (__lhs.year() / __lhs.month() + __rhs) / last; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator+(const months& __lhs, const year_month_day_last& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator-(const year_month_day_last& __lhs, const months& __rhs) noexcept +{ return __lhs + (-__rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator+(const year_month_day_last& __lhs, const years& __rhs) noexcept +{ return year_month_day_last{__lhs.year() + __rhs, __lhs.month_day_last()}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator+(const years& __lhs, const year_month_day_last& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day_last operator-(const year_month_day_last& __lhs, const years& __rhs) noexcept +{ return __lhs + (-__rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last& year_month_day_last::operator+=(const months& __dm) noexcept { *this = *this + __dm; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last& year_month_day_last::operator-=(const months& __dm) noexcept { *this = *this - __dm; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last& year_month_day_last::operator+=(const years& __dy) noexcept { *this = *this + __dy; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_day_last& year_month_day_last::operator-=(const years& __dy) noexcept { *this = *this - __dy; return *this; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_day::year_month_day(const year_month_day_last& __ymdl) noexcept + : __y_{__ymdl.year()}, __m_{__ymdl.month()}, __d_{__ymdl.day()} {} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool year_month_day::ok() const noexcept +{ + if (!__y_.ok() || !__m_.ok()) return false; + return chrono::day{1} <= __d_ && __d_ <= (__y_ / __m_ / last).day(); +} + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_YEAR_MONTH_DAY_H diff --git a/app/src/main/cpp/libcxx/include/__chrono/year_month_weekday.h b/app/src/main/cpp/libcxx/include/__chrono/year_month_weekday.h new file mode 100644 index 0000000..6604dea --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__chrono/year_month_weekday.h @@ -0,0 +1,255 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CHRONO_YEAR_MONTH_WEEKDAY_H +#define _LIBCPP___CHRONO_YEAR_MONTH_WEEKDAY_H + +#include <__chrono/calendar.h> +#include <__chrono/day.h> +#include <__chrono/duration.h> +#include <__chrono/month.h> +#include <__chrono/month_weekday.h> +#include <__chrono/system_clock.h> +#include <__chrono/time_point.h> +#include <__chrono/weekday.h> +#include <__chrono/year.h> +#include <__chrono/year_month.h> +#include <__chrono/year_month_day.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace chrono +{ + +class year_month_weekday { + chrono::year __y_; + chrono::month __m_; + chrono::weekday_indexed __wdi_; +public: + _LIBCPP_HIDE_FROM_ABI year_month_weekday() = default; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday(const chrono::year& __yval, const chrono::month& __mval, + const chrono::weekday_indexed& __wdival) noexcept + : __y_{__yval}, __m_{__mval}, __wdi_{__wdival} {} + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday(const sys_days& __sysd) noexcept + : year_month_weekday(__from_days(__sysd.time_since_epoch())) {} + _LIBCPP_HIDE_FROM_ABI inline explicit constexpr year_month_weekday(const local_days& __locd) noexcept + : year_month_weekday(__from_days(__locd.time_since_epoch())) {} + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator+=(const months&) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator-=(const months&) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator+=(const years&) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday& operator-=(const years&) noexcept; + + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wdi_.weekday(); } + _LIBCPP_HIDE_FROM_ABI inline constexpr unsigned index() const noexcept { return __wdi_.index(); } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_indexed weekday_indexed() const noexcept { return __wdi_; } + + _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; } + _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept { return local_days{__to_days()}; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept + { + if (!__y_.ok() || !__m_.ok() || !__wdi_.ok()) return false; + if (__wdi_.index() <= 4) return true; + auto __nth_weekday_day = + __wdi_.weekday() - + chrono::weekday{static_cast(__y_ / __m_ / 1)} + + days{(__wdi_.index() - 1) * 7 + 1}; + return static_cast(__nth_weekday_day.count()) <= + static_cast((__y_ / __m_ / last).day()); + } + + _LIBCPP_HIDE_FROM_ABI static constexpr year_month_weekday __from_days(days __d) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr days __to_days() const noexcept; +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday year_month_weekday::__from_days(days __d) noexcept +{ + const sys_days __sysd{__d}; + const chrono::weekday __wd = chrono::weekday(__sysd); + const year_month_day __ymd = year_month_day(__sysd); + return year_month_weekday{__ymd.year(), __ymd.month(), + __wd[(static_cast(__ymd.day())-1)/7+1]}; +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +days year_month_weekday::__to_days() const noexcept +{ + const sys_days __sysd = sys_days(__y_/__m_/1); + return (__sysd + (__wdi_.weekday() - chrono::weekday(__sysd) + days{(__wdi_.index()-1)*7})) + .time_since_epoch(); +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const year_month_weekday& __lhs, const year_month_weekday& __rhs) noexcept +{ return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() && __lhs.weekday_indexed() == __rhs.weekday_indexed(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator!=(const year_month_weekday& __lhs, const year_month_weekday& __rhs) noexcept +{ return !(__lhs == __rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator/(const year_month& __lhs, const weekday_indexed& __rhs) noexcept +{ return year_month_weekday{__lhs.year(), __lhs.month(), __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator/(const year& __lhs, const month_weekday& __rhs) noexcept +{ return year_month_weekday{__lhs, __rhs.month(), __rhs.weekday_indexed()}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator/(int __lhs, const month_weekday& __rhs) noexcept +{ return year(__lhs) / __rhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator/(const month_weekday& __lhs, const year& __rhs) noexcept +{ return __rhs / __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator/(const month_weekday& __lhs, int __rhs) noexcept +{ return year(__rhs) / __lhs; } + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator+(const year_month_weekday& __lhs, const months& __rhs) noexcept +{ return (__lhs.year() / __lhs.month() + __rhs) / __lhs.weekday_indexed(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator+(const months& __lhs, const year_month_weekday& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator-(const year_month_weekday& __lhs, const months& __rhs) noexcept +{ return __lhs + (-__rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator+(const year_month_weekday& __lhs, const years& __rhs) noexcept +{ return year_month_weekday{__lhs.year() + __rhs, __lhs.month(), __lhs.weekday_indexed()}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator+(const years& __lhs, const year_month_weekday& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday operator-(const year_month_weekday& __lhs, const years& __rhs) noexcept +{ return __lhs + (-__rhs); } + + +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday& year_month_weekday::operator+=(const months& __dm) noexcept { *this = *this + __dm; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday& year_month_weekday::operator-=(const months& __dm) noexcept { *this = *this - __dm; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday& year_month_weekday::operator+=(const years& __dy) noexcept { *this = *this + __dy; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday& year_month_weekday::operator-=(const years& __dy) noexcept { *this = *this - __dy; return *this; } + +class year_month_weekday_last { +private: + chrono::year __y_; + chrono::month __m_; + chrono::weekday_last __wdl_; +public: + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last(const chrono::year& __yval, const chrono::month& __mval, + const chrono::weekday_last& __wdlval) noexcept + : __y_{__yval}, __m_{__mval}, __wdl_{__wdlval} {} + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator+=(const months& __dm) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator-=(const months& __dm) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator+=(const years& __dy) noexcept; + _LIBCPP_HIDE_FROM_ABI constexpr year_month_weekday_last& operator-=(const years& __dy) noexcept; + + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::year year() const noexcept { return __y_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::month month() const noexcept { return __m_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday weekday() const noexcept { return __wdl_.weekday(); } + _LIBCPP_HIDE_FROM_ABI inline constexpr chrono::weekday_last weekday_last() const noexcept { return __wdl_; } + _LIBCPP_HIDE_FROM_ABI inline constexpr operator sys_days() const noexcept { return sys_days{__to_days()}; } + _LIBCPP_HIDE_FROM_ABI inline explicit constexpr operator local_days() const noexcept { return local_days{__to_days()}; } + _LIBCPP_HIDE_FROM_ABI inline constexpr bool ok() const noexcept { return __y_.ok() && __m_.ok() && __wdl_.ok(); } + + _LIBCPP_HIDE_FROM_ABI constexpr days __to_days() const noexcept; + +}; + +_LIBCPP_HIDE_FROM_ABI inline constexpr +days year_month_weekday_last::__to_days() const noexcept +{ + const sys_days __last = sys_days{__y_/__m_/last}; + return (__last - (chrono::weekday{__last} - __wdl_.weekday())).time_since_epoch(); + +} + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator==(const year_month_weekday_last& __lhs, const year_month_weekday_last& __rhs) noexcept +{ return __lhs.year() == __rhs.year() && __lhs.month() == __rhs.month() && __lhs.weekday_last() == __rhs.weekday_last(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +bool operator!=(const year_month_weekday_last& __lhs, const year_month_weekday_last& __rhs) noexcept +{ return !(__lhs == __rhs); } + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator/(const year_month& __lhs, const weekday_last& __rhs) noexcept +{ return year_month_weekday_last{__lhs.year(), __lhs.month(), __rhs}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator/(const year& __lhs, const month_weekday_last& __rhs) noexcept +{ return year_month_weekday_last{__lhs, __rhs.month(), __rhs.weekday_last()}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator/(int __lhs, const month_weekday_last& __rhs) noexcept +{ return year(__lhs) / __rhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator/(const month_weekday_last& __lhs, const year& __rhs) noexcept +{ return __rhs / __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator/(const month_weekday_last& __lhs, int __rhs) noexcept +{ return year(__rhs) / __lhs; } + + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator+(const year_month_weekday_last& __lhs, const months& __rhs) noexcept +{ return (__lhs.year() / __lhs.month() + __rhs) / __lhs.weekday_last(); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator+(const months& __lhs, const year_month_weekday_last& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator-(const year_month_weekday_last& __lhs, const months& __rhs) noexcept +{ return __lhs + (-__rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator+(const year_month_weekday_last& __lhs, const years& __rhs) noexcept +{ return year_month_weekday_last{__lhs.year() + __rhs, __lhs.month(), __lhs.weekday_last()}; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator+(const years& __lhs, const year_month_weekday_last& __rhs) noexcept +{ return __rhs + __lhs; } + +_LIBCPP_HIDE_FROM_ABI inline constexpr +year_month_weekday_last operator-(const year_month_weekday_last& __lhs, const years& __rhs) noexcept +{ return __lhs + (-__rhs); } + +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last& year_month_weekday_last::operator+=(const months& __dm) noexcept { *this = *this + __dm; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last& year_month_weekday_last::operator-=(const months& __dm) noexcept { *this = *this - __dm; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last& year_month_weekday_last::operator+=(const years& __dy) noexcept { *this = *this + __dy; return *this; } +_LIBCPP_HIDE_FROM_ABI inline constexpr year_month_weekday_last& year_month_weekday_last::operator-=(const years& __dy) noexcept { *this = *this - __dy; return *this; } + +} // namespace chrono + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___CHRONO_YEAR_MONTH_WEEKDAY_H diff --git a/app/src/main/cpp/libcxx/include/__compare/common_comparison_category.h b/app/src/main/cpp/libcxx/include/__compare/common_comparison_category.h new file mode 100644 index 0000000..06c4b28 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/common_comparison_category.h @@ -0,0 +1,95 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_COMMON_COMPARISON_CATEGORY_H +#define _LIBCPP___COMPARE_COMMON_COMPARISON_CATEGORY_H + +#include <__compare/ordering.h> +#include <__config> +#include <__type_traits/is_same.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __comp_detail { + +enum _ClassifyCompCategory : unsigned { + _None, + _PartialOrd, + _WeakOrd, + _StrongOrd, + _CCC_Size +}; + +template +_LIBCPP_HIDE_FROM_ABI +constexpr _ClassifyCompCategory __type_to_enum() noexcept { + if (is_same_v<_Tp, partial_ordering>) + return _PartialOrd; + if (is_same_v<_Tp, weak_ordering>) + return _WeakOrd; + if (is_same_v<_Tp, strong_ordering>) + return _StrongOrd; + return _None; +} + +template +_LIBCPP_HIDE_FROM_ABI +constexpr _ClassifyCompCategory +__compute_comp_type(const _ClassifyCompCategory (&__types)[_Size]) { + int __seen[_CCC_Size] = {}; + for (auto __type : __types) + ++__seen[__type]; + if (__seen[_None]) + return _None; + if (__seen[_PartialOrd]) + return _PartialOrd; + if (__seen[_WeakOrd]) + return _WeakOrd; + return _StrongOrd; +} + +template +_LIBCPP_HIDE_FROM_ABI +constexpr auto __get_comp_type() { + using _CCC = _ClassifyCompCategory; + constexpr _CCC __type_kinds[] = {_StrongOrd, __type_to_enum<_Ts>()...}; + constexpr _CCC _Cat = __comp_detail::__compute_comp_type(__type_kinds); + if constexpr (_Cat == _None) + return void(); + else if constexpr (_Cat == _PartialOrd) + return partial_ordering::equivalent; + else if constexpr (_Cat == _WeakOrd) + return weak_ordering::equivalent; + else if constexpr (_Cat == _StrongOrd) + return strong_ordering::equivalent; + else + static_assert(_False, "unhandled case"); +} +} // namespace __comp_detail + +// [cmp.common], common comparison category type +template +struct _LIBCPP_TEMPLATE_VIS common_comparison_category { + using type = decltype(__comp_detail::__get_comp_type<_Ts...>()); +}; + +template +using common_comparison_category_t = typename common_comparison_category<_Ts...>::type; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_COMMON_COMPARISON_CATEGORY_H diff --git a/app/src/main/cpp/libcxx/include/__compare/compare_partial_order_fallback.h b/app/src/main/cpp/libcxx/include/__compare/compare_partial_order_fallback.h new file mode 100644 index 0000000..06f03fe --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/compare_partial_order_fallback.h @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_COMPARE_PARTIAL_ORDER_FALLBACK +#define _LIBCPP___COMPARE_COMPARE_PARTIAL_ORDER_FALLBACK + +#include <__compare/ordering.h> +#include <__compare/partial_order.h> +#include <__config> +#include <__type_traits/decay.h> +#include <__type_traits/is_same.h> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [cmp.alg] +namespace __compare_partial_order_fallback { + struct __fn { + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) + noexcept(noexcept(_VSTD::partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + -> decltype( _VSTD::partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))) + { return _VSTD::partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)); } + + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) + noexcept(noexcept(_VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? partial_ordering::equivalent : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? partial_ordering::less : + _VSTD::forward<_Up>(__u) < _VSTD::forward<_Tp>(__t) ? partial_ordering::greater : + partial_ordering::unordered)) + -> decltype( _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? partial_ordering::equivalent : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? partial_ordering::less : + _VSTD::forward<_Up>(__u) < _VSTD::forward<_Tp>(__t) ? partial_ordering::greater : + partial_ordering::unordered) + { + return _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? partial_ordering::equivalent : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? partial_ordering::less : + _VSTD::forward<_Up>(__u) < _VSTD::forward<_Tp>(__t) ? partial_ordering::greater : + partial_ordering::unordered; + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>()))) + -> decltype( __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>())) + { return __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>()); } + }; +} // namespace __compare_partial_order_fallback + +inline namespace __cpo { + inline constexpr auto compare_partial_order_fallback = __compare_partial_order_fallback::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_COMPARE_PARTIAL_ORDER_FALLBACK diff --git a/app/src/main/cpp/libcxx/include/__compare/compare_strong_order_fallback.h b/app/src/main/cpp/libcxx/include/__compare/compare_strong_order_fallback.h new file mode 100644 index 0000000..8693868 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/compare_strong_order_fallback.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_COMPARE_STRONG_ORDER_FALLBACK +#define _LIBCPP___COMPARE_COMPARE_STRONG_ORDER_FALLBACK + +#include <__compare/ordering.h> +#include <__compare/strong_order.h> +#include <__config> +#include <__type_traits/decay.h> +#include <__type_traits/is_same.h> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [cmp.alg] +namespace __compare_strong_order_fallback { + struct __fn { + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) + noexcept(noexcept(_VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + -> decltype( _VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))) + { return _VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)); } + + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) + noexcept(noexcept(_VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? strong_ordering::equal : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? strong_ordering::less : + strong_ordering::greater)) + -> decltype( _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? strong_ordering::equal : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? strong_ordering::less : + strong_ordering::greater) + { + return _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? strong_ordering::equal : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? strong_ordering::less : + strong_ordering::greater; + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>()))) + -> decltype( __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>())) + { return __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>()); } + }; +} // namespace __compare_strong_order_fallback + +inline namespace __cpo { + inline constexpr auto compare_strong_order_fallback = __compare_strong_order_fallback::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_COMPARE_STRONG_ORDER_FALLBACK diff --git a/app/src/main/cpp/libcxx/include/__compare/compare_three_way.h b/app/src/main/cpp/libcxx/include/__compare/compare_three_way.h new file mode 100644 index 0000000..fdbba04 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/compare_three_way.h @@ -0,0 +1,41 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_COMPARE_THREE_WAY_H +#define _LIBCPP___COMPARE_COMPARE_THREE_WAY_H + +#include <__compare/three_way_comparable.h> +#include <__config> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +struct _LIBCPP_TEMPLATE_VIS compare_three_way +{ + template + requires three_way_comparable_with<_T1, _T2> + constexpr _LIBCPP_HIDE_FROM_ABI + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) <=> _VSTD::forward<_T2>(__u))) + { return _VSTD::forward<_T1>(__t) <=> _VSTD::forward<_T2>(__u); } + + using is_transparent = void; +}; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_COMPARE_THREE_WAY_H diff --git a/app/src/main/cpp/libcxx/include/__compare/compare_three_way_result.h b/app/src/main/cpp/libcxx/include/__compare/compare_three_way_result.h new file mode 100644 index 0000000..8885d7e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/compare_three_way_result.h @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_COMPARE_THREE_WAY_RESULT_H +#define _LIBCPP___COMPARE_COMPARE_THREE_WAY_RESULT_H + +#include <__config> +#include <__type_traits/make_const_lvalue_ref.h> +#include <__utility/declval.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +struct _LIBCPP_HIDE_FROM_ABI __compare_three_way_result { }; + +template +struct _LIBCPP_HIDE_FROM_ABI __compare_three_way_result<_Tp, _Up, decltype( + std::declval<__make_const_lvalue_ref<_Tp>>() <=> std::declval<__make_const_lvalue_ref<_Up>>(), void() +)> { + using type = decltype(std::declval<__make_const_lvalue_ref<_Tp>>() <=> std::declval<__make_const_lvalue_ref<_Up>>()); +}; + +template +struct _LIBCPP_TEMPLATE_VIS compare_three_way_result : __compare_three_way_result<_Tp, _Up, void> { }; + +template +using compare_three_way_result_t = typename compare_three_way_result<_Tp, _Up>::type; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_COMPARE_THREE_WAY_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__compare/compare_weak_order_fallback.h b/app/src/main/cpp/libcxx/include/__compare/compare_weak_order_fallback.h new file mode 100644 index 0000000..f434dcb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/compare_weak_order_fallback.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_COMPARE_WEAK_ORDER_FALLBACK +#define _LIBCPP___COMPARE_COMPARE_WEAK_ORDER_FALLBACK + +#include <__compare/ordering.h> +#include <__compare/weak_order.h> +#include <__config> +#include <__type_traits/decay.h> +#include <__type_traits/is_same.h> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [cmp.alg] +namespace __compare_weak_order_fallback { + struct __fn { + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) + noexcept(noexcept(_VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + -> decltype( _VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))) + { return _VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)); } + + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) + noexcept(noexcept(_VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? weak_ordering::equivalent : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? weak_ordering::less : + weak_ordering::greater)) + -> decltype( _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? weak_ordering::equivalent : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? weak_ordering::less : + weak_ordering::greater) + { + return _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u) ? weak_ordering::equivalent : + _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u) ? weak_ordering::less : + weak_ordering::greater; + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>()))) + -> decltype( __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>())) + { return __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<1>()); } + }; +} // namespace __compare_weak_order_fallback + +inline namespace __cpo { + inline constexpr auto compare_weak_order_fallback = __compare_weak_order_fallback::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_COMPARE_WEAK_ORDER_FALLBACK diff --git a/app/src/main/cpp/libcxx/include/__compare/is_eq.h b/app/src/main/cpp/libcxx/include/__compare/is_eq.h new file mode 100644 index 0000000..4964892 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/is_eq.h @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_IS_EQ_H +#define _LIBCPP___COMPARE_IS_EQ_H + +#include <__compare/ordering.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_HIDE_FROM_ABI inline constexpr bool is_eq(partial_ordering __c) noexcept { return __c == 0; } +_LIBCPP_HIDE_FROM_ABI inline constexpr bool is_neq(partial_ordering __c) noexcept { return __c != 0; } +_LIBCPP_HIDE_FROM_ABI inline constexpr bool is_lt(partial_ordering __c) noexcept { return __c < 0; } +_LIBCPP_HIDE_FROM_ABI inline constexpr bool is_lteq(partial_ordering __c) noexcept { return __c <= 0; } +_LIBCPP_HIDE_FROM_ABI inline constexpr bool is_gt(partial_ordering __c) noexcept { return __c > 0; } +_LIBCPP_HIDE_FROM_ABI inline constexpr bool is_gteq(partial_ordering __c) noexcept { return __c >= 0; } + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_IS_EQ_H diff --git a/app/src/main/cpp/libcxx/include/__compare/ordering.h b/app/src/main/cpp/libcxx/include/__compare/ordering.h new file mode 100644 index 0000000..ff148ab --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/ordering.h @@ -0,0 +1,326 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_ORDERING_H +#define _LIBCPP___COMPARE_ORDERING_H + +#include <__config> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_same.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// exposition only +enum class _LIBCPP_ENUM_VIS _OrdResult : signed char { + __less = -1, + __equiv = 0, + __greater = 1 +}; + +enum class _LIBCPP_ENUM_VIS _NCmpResult : signed char { + __unordered = -127 +}; + +class partial_ordering; +class weak_ordering; +class strong_ordering; + +template +inline constexpr bool __one_of_v = (is_same_v<_Tp, _Args> || ...); + +struct _CmpUnspecifiedParam { + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEVAL + _CmpUnspecifiedParam(int _CmpUnspecifiedParam::*) noexcept {} + + template>> + _CmpUnspecifiedParam(_Tp) = delete; +}; + +class partial_ordering { + using _ValueT = signed char; + + _LIBCPP_HIDE_FROM_ABI + explicit constexpr partial_ordering(_OrdResult __v) noexcept + : __value_(_ValueT(__v)) {} + + _LIBCPP_HIDE_FROM_ABI + explicit constexpr partial_ordering(_NCmpResult __v) noexcept + : __value_(_ValueT(__v)) {} + + _LIBCPP_HIDE_FROM_ABI + constexpr bool __is_ordered() const noexcept { + return __value_ != _ValueT(_NCmpResult::__unordered); + } +public: + // valid values + static const partial_ordering less; + static const partial_ordering equivalent; + static const partial_ordering greater; + static const partial_ordering unordered; + + // comparisons + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==(partial_ordering, partial_ordering) noexcept = default; + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==(partial_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__is_ordered() && __v.__value_ == 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator< (partial_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__is_ordered() && __v.__value_ < 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator<=(partial_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__is_ordered() && __v.__value_ <= 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator> (partial_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__is_ordered() && __v.__value_ > 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator>=(partial_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__is_ordered() && __v.__value_ >= 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator< (_CmpUnspecifiedParam, partial_ordering __v) noexcept { + return __v.__is_ordered() && 0 < __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator<=(_CmpUnspecifiedParam, partial_ordering __v) noexcept { + return __v.__is_ordered() && 0 <= __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator> (_CmpUnspecifiedParam, partial_ordering __v) noexcept { + return __v.__is_ordered() && 0 > __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator>=(_CmpUnspecifiedParam, partial_ordering __v) noexcept { + return __v.__is_ordered() && 0 >= __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr partial_ordering operator<=>(partial_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr partial_ordering operator<=>(_CmpUnspecifiedParam, partial_ordering __v) noexcept { + return __v < 0 ? partial_ordering::greater : (__v > 0 ? partial_ordering::less : __v); + } +private: + _ValueT __value_; +}; + +inline constexpr partial_ordering partial_ordering::less(_OrdResult::__less); +inline constexpr partial_ordering partial_ordering::equivalent(_OrdResult::__equiv); +inline constexpr partial_ordering partial_ordering::greater(_OrdResult::__greater); +inline constexpr partial_ordering partial_ordering::unordered(_NCmpResult ::__unordered); + +class weak_ordering { + using _ValueT = signed char; + + _LIBCPP_HIDE_FROM_ABI + explicit constexpr weak_ordering(_OrdResult __v) noexcept : __value_(_ValueT(__v)) {} + +public: + static const weak_ordering less; + static const weak_ordering equivalent; + static const weak_ordering greater; + + _LIBCPP_HIDE_FROM_ABI + constexpr operator partial_ordering() const noexcept { + return __value_ == 0 ? partial_ordering::equivalent + : (__value_ < 0 ? partial_ordering::less : partial_ordering::greater); + } + + // comparisons + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==(weak_ordering, weak_ordering) noexcept = default; + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==(weak_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ == 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator< (weak_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ < 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator<=(weak_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ <= 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator> (weak_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ > 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator>=(weak_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ >= 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator< (_CmpUnspecifiedParam, weak_ordering __v) noexcept { + return 0 < __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator<=(_CmpUnspecifiedParam, weak_ordering __v) noexcept { + return 0 <= __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator> (_CmpUnspecifiedParam, weak_ordering __v) noexcept { + return 0 > __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator>=(_CmpUnspecifiedParam, weak_ordering __v) noexcept { + return 0 >= __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr weak_ordering operator<=>(weak_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr weak_ordering operator<=>(_CmpUnspecifiedParam, weak_ordering __v) noexcept { + return __v < 0 ? weak_ordering::greater : (__v > 0 ? weak_ordering::less : __v); + } + +private: + _ValueT __value_; +}; + +inline constexpr weak_ordering weak_ordering::less(_OrdResult::__less); +inline constexpr weak_ordering weak_ordering::equivalent(_OrdResult::__equiv); +inline constexpr weak_ordering weak_ordering::greater(_OrdResult::__greater); + +class strong_ordering { + using _ValueT = signed char; + + _LIBCPP_HIDE_FROM_ABI + explicit constexpr strong_ordering(_OrdResult __v) noexcept : __value_(_ValueT(__v)) {} + +public: + static const strong_ordering less; + static const strong_ordering equal; + static const strong_ordering equivalent; + static const strong_ordering greater; + + // conversions + _LIBCPP_HIDE_FROM_ABI + constexpr operator partial_ordering() const noexcept { + return __value_ == 0 ? partial_ordering::equivalent + : (__value_ < 0 ? partial_ordering::less : partial_ordering::greater); + } + + _LIBCPP_HIDE_FROM_ABI + constexpr operator weak_ordering() const noexcept { + return __value_ == 0 ? weak_ordering::equivalent + : (__value_ < 0 ? weak_ordering::less : weak_ordering::greater); + } + + // comparisons + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==(strong_ordering, strong_ordering) noexcept = default; + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==(strong_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ == 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator< (strong_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ < 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator<=(strong_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ <= 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator> (strong_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ > 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator>=(strong_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v.__value_ >= 0; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator< (_CmpUnspecifiedParam, strong_ordering __v) noexcept { + return 0 < __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator<=(_CmpUnspecifiedParam, strong_ordering __v) noexcept { + return 0 <= __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator> (_CmpUnspecifiedParam, strong_ordering __v) noexcept { + return 0 > __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator>=(_CmpUnspecifiedParam, strong_ordering __v) noexcept { + return 0 >= __v.__value_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr strong_ordering operator<=>(strong_ordering __v, _CmpUnspecifiedParam) noexcept { + return __v; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr strong_ordering operator<=>(_CmpUnspecifiedParam, strong_ordering __v) noexcept { + return __v < 0 ? strong_ordering::greater : (__v > 0 ? strong_ordering::less : __v); + } + +private: + _ValueT __value_; +}; + +inline constexpr strong_ordering strong_ordering::less(_OrdResult::__less); +inline constexpr strong_ordering strong_ordering::equal(_OrdResult::__equiv); +inline constexpr strong_ordering strong_ordering::equivalent(_OrdResult::__equiv); +inline constexpr strong_ordering strong_ordering::greater(_OrdResult::__greater); + +/// [cmp.categories.pre]/1 +/// The types partial_ordering, weak_ordering, and strong_ordering are +/// collectively termed the comparison category types. +template +concept __comparison_category = __one_of_v<_Tp, partial_ordering, weak_ordering, strong_ordering>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_ORDERING_H diff --git a/app/src/main/cpp/libcxx/include/__compare/partial_order.h b/app/src/main/cpp/libcxx/include/__compare/partial_order.h new file mode 100644 index 0000000..aee07eb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/partial_order.h @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_PARTIAL_ORDER +#define _LIBCPP___COMPARE_PARTIAL_ORDER + +#include <__compare/compare_three_way.h> +#include <__compare/ordering.h> +#include <__compare/weak_order.h> +#include <__config> +#include <__type_traits/decay.h> +#include <__type_traits/is_same.h> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [cmp.alg] +namespace __partial_order { + struct __fn { + // NOLINTBEGIN(libcpp-robust-against-adl) partial_order should use ADL, but only here + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<2>) + noexcept(noexcept(partial_ordering(partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) + -> decltype( partial_ordering(partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { return partial_ordering(partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + // NOLINTEND(libcpp-robust-against-adl) + + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) + noexcept(noexcept(partial_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) + -> decltype( partial_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { return partial_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) + noexcept(noexcept(partial_ordering(_VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) + -> decltype( partial_ordering(_VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { return partial_ordering(_VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + + template + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>()))) + -> decltype( __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>())) + { return __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>()); } + }; +} // namespace __partial_order + +inline namespace __cpo { + inline constexpr auto partial_order = __partial_order::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_PARTIAL_ORDER diff --git a/app/src/main/cpp/libcxx/include/__compare/strong_order.h b/app/src/main/cpp/libcxx/include/__compare/strong_order.h new file mode 100644 index 0000000..05856c2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/strong_order.h @@ -0,0 +1,139 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_STRONG_ORDER +#define _LIBCPP___COMPARE_STRONG_ORDER + +#include <__bit/bit_cast.h> +#include <__compare/compare_three_way.h> +#include <__compare/ordering.h> +#include <__config> +#include <__type_traits/conditional.h> +#include <__type_traits/decay.h> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> +#include +#include +#include + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [cmp.alg] +namespace __strong_order { + struct __fn { + // NOLINTBEGIN(libcpp-robust-against-adl) strong_order should use ADL, but only here + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<2>) + noexcept(noexcept(strong_ordering(strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) + -> decltype( strong_ordering(strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { return strong_ordering(strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + // NOLINTEND(libcpp-robust-against-adl) + + template> + requires is_same_v<_Dp, decay_t<_Up>> && is_floating_point_v<_Dp> + _LIBCPP_HIDE_FROM_ABI static constexpr strong_ordering + __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) noexcept + { + if constexpr (numeric_limits<_Dp>::is_iec559 && sizeof(_Dp) == sizeof(int32_t)) { + int32_t __rx = _VSTD::bit_cast(__t); + int32_t __ry = _VSTD::bit_cast(__u); + __rx = (__rx < 0) ? (numeric_limits::min() - __rx - 1) : __rx; + __ry = (__ry < 0) ? (numeric_limits::min() - __ry - 1) : __ry; + return (__rx <=> __ry); + } else if constexpr (numeric_limits<_Dp>::is_iec559 && sizeof(_Dp) == sizeof(int64_t)) { + int64_t __rx = _VSTD::bit_cast(__t); + int64_t __ry = _VSTD::bit_cast(__u); + __rx = (__rx < 0) ? (numeric_limits::min() - __rx - 1) : __rx; + __ry = (__ry < 0) ? (numeric_limits::min() - __ry - 1) : __ry; + return (__rx <=> __ry); + } else if (__t < __u) { + return strong_ordering::less; + } else if (__t > __u) { + return strong_ordering::greater; + } else if (__t == __u) { + if constexpr (numeric_limits<_Dp>::radix == 2) { + return _VSTD::signbit(__u) <=> _VSTD::signbit(__t); + } else { + // This is bullet 3 of the IEEE754 algorithm, relevant + // only for decimal floating-point; + // see https://stackoverflow.com/questions/69068075/ + if (__t == 0 || _VSTD::isinf(__t)) { + return _VSTD::signbit(__u) <=> _VSTD::signbit(__t); + } else { + int __texp, __uexp; + (void)_VSTD::frexp(__t, &__texp); + (void)_VSTD::frexp(__u, &__uexp); + return (__t < 0) ? (__texp <=> __uexp) : (__uexp <=> __texp); + } + } + } else { + // They're unordered, so one of them must be a NAN. + // The order is -QNAN, -SNAN, numbers, +SNAN, +QNAN. + bool __t_is_nan = _VSTD::isnan(__t); + bool __u_is_nan = _VSTD::isnan(__u); + bool __t_is_negative = _VSTD::signbit(__t); + bool __u_is_negative = _VSTD::signbit(__u); + using _IntType = conditional_t< + sizeof(__t) == sizeof(int32_t), int32_t, conditional_t< + sizeof(__t) == sizeof(int64_t), int64_t, void> + >; + if constexpr (is_same_v<_IntType, void>) { + static_assert(sizeof(_Dp) == 0, "std::strong_order is unimplemented for this floating-point type"); + } else if (__t_is_nan && __u_is_nan) { + // Order by sign bit, then by "payload bits" (we'll just use bit_cast). + if (__t_is_negative != __u_is_negative) { + return (__u_is_negative <=> __t_is_negative); + } else { + return _VSTD::bit_cast<_IntType>(__t) <=> _VSTD::bit_cast<_IntType>(__u); + } + } else if (__t_is_nan) { + return __t_is_negative ? strong_ordering::less : strong_ordering::greater; + } else { + return __u_is_negative ? strong_ordering::greater : strong_ordering::less; + } + } + } + + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) + noexcept(noexcept(strong_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) + -> decltype( strong_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { return strong_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + + template + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>()))) + -> decltype( __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>())) + { return __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>()); } + }; +} // namespace __strong_order + +inline namespace __cpo { + inline constexpr auto strong_order = __strong_order::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___COMPARE_STRONG_ORDER diff --git a/app/src/main/cpp/libcxx/include/__compare/synth_three_way.h b/app/src/main/cpp/libcxx/include/__compare/synth_three_way.h new file mode 100644 index 0000000..7d33898 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/synth_three_way.h @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_SYNTH_THREE_WAY_H +#define _LIBCPP___COMPARE_SYNTH_THREE_WAY_H + +#include <__compare/ordering.h> +#include <__compare/three_way_comparable.h> +#include <__concepts/boolean_testable.h> +#include <__config> +#include <__utility/declval.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [expos.only.func] + +_LIBCPP_HIDE_FROM_ABI inline constexpr auto __synth_three_way = + [](const _Tp& __t, const _Up& __u) + requires requires { + { __t < __u } -> __boolean_testable; + { __u < __t } -> __boolean_testable; + } + { + if constexpr (three_way_comparable_with<_Tp, _Up>) { + return __t <=> __u; + } else { + if (__t < __u) return weak_ordering::less; + if (__u < __t) return weak_ordering::greater; + return weak_ordering::equivalent; + } + }; + +template +using __synth_three_way_result = decltype(std::__synth_three_way(std::declval<_Tp&>(), std::declval<_Up&>())); + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_SYNTH_THREE_WAY_H diff --git a/app/src/main/cpp/libcxx/include/__compare/three_way_comparable.h b/app/src/main/cpp/libcxx/include/__compare/three_way_comparable.h new file mode 100644 index 0000000..6c98916 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/three_way_comparable.h @@ -0,0 +1,59 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_THREE_WAY_COMPARABLE_H +#define _LIBCPP___COMPARE_THREE_WAY_COMPARABLE_H + +#include <__compare/common_comparison_category.h> +#include <__compare/ordering.h> +#include <__concepts/common_reference_with.h> +#include <__concepts/equality_comparable.h> +#include <__concepts/same_as.h> +#include <__concepts/totally_ordered.h> +#include <__config> +#include <__type_traits/common_reference.h> +#include <__type_traits/make_const_lvalue_ref.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +concept __compares_as = + same_as, _Cat>; + +template +concept three_way_comparable = + __weakly_equality_comparable_with<_Tp, _Tp> && + __partially_ordered_with<_Tp, _Tp> && + requires(__make_const_lvalue_ref<_Tp> __a, __make_const_lvalue_ref<_Tp> __b) { + { __a <=> __b } -> __compares_as<_Cat>; + }; + +template +concept three_way_comparable_with = + three_way_comparable<_Tp, _Cat> && + three_way_comparable<_Up, _Cat> && + common_reference_with<__make_const_lvalue_ref<_Tp>, __make_const_lvalue_ref<_Up>> && + three_way_comparable, __make_const_lvalue_ref<_Up>>, _Cat> && + __weakly_equality_comparable_with<_Tp, _Up> && + __partially_ordered_with<_Tp, _Up> && + requires(__make_const_lvalue_ref<_Tp> __t, __make_const_lvalue_ref<_Up> __u) { + { __t <=> __u } -> __compares_as<_Cat>; + { __u <=> __t } -> __compares_as<_Cat>; + }; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_THREE_WAY_COMPARABLE_H diff --git a/app/src/main/cpp/libcxx/include/__compare/weak_order.h b/app/src/main/cpp/libcxx/include/__compare/weak_order.h new file mode 100644 index 0000000..abb24e3 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__compare/weak_order.h @@ -0,0 +1,102 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COMPARE_WEAK_ORDER +#define _LIBCPP___COMPARE_WEAK_ORDER + +#include <__compare/compare_three_way.h> +#include <__compare/ordering.h> +#include <__compare/strong_order.h> +#include <__config> +#include <__type_traits/decay.h> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> +#include + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [cmp.alg] +namespace __weak_order { + struct __fn { + // NOLINTBEGIN(libcpp-robust-against-adl) weak_order should use ADL, but only here + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<3>) + noexcept(noexcept(weak_ordering(weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) + -> decltype( weak_ordering(weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { return weak_ordering(weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + // NOLINTEND(libcpp-robust-against-adl) + + template> + requires is_same_v<_Dp, decay_t<_Up>> && is_floating_point_v<_Dp> + _LIBCPP_HIDE_FROM_ABI static constexpr weak_ordering + __go(_Tp&& __t, _Up&& __u, __priority_tag<2>) noexcept + { + partial_ordering __po = (__t <=> __u); + if (__po == partial_ordering::less) { + return weak_ordering::less; + } else if (__po == partial_ordering::equivalent) { + return weak_ordering::equivalent; + } else if (__po == partial_ordering::greater) { + return weak_ordering::greater; + } else { + // Otherwise, at least one of them is a NaN. + bool __t_is_nan = _VSTD::isnan(__t); + bool __u_is_nan = _VSTD::isnan(__u); + bool __t_is_negative = _VSTD::signbit(__t); + bool __u_is_negative = _VSTD::signbit(__u); + if (__t_is_nan && __u_is_nan) { + return (__u_is_negative <=> __t_is_negative); + } else if (__t_is_nan) { + return __t_is_negative ? weak_ordering::less : weak_ordering::greater; + } else { + return __u_is_negative ? weak_ordering::greater : weak_ordering::less; + } + } + } + + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) + noexcept(noexcept(weak_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) + -> decltype( weak_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { return weak_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + + template + requires is_same_v, decay_t<_Up>> + _LIBCPP_HIDE_FROM_ABI static constexpr auto + __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) + noexcept(noexcept(weak_ordering(_VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) + -> decltype( weak_ordering(_VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { return weak_ordering(_VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + + template + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<3>()))) + -> decltype( __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<3>())) + { return __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<3>()); } + }; +} // namespace __weak_order + +inline namespace __cpo { + inline constexpr auto weak_order = __weak_order::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_WEAK_ORDER diff --git a/app/src/main/cpp/libcxx/include/__concepts/arithmetic.h b/app/src/main/cpp/libcxx/include/__concepts/arithmetic.h new file mode 100644 index 0000000..215b52a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/arithmetic.h @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_ARITHMETIC_H +#define _LIBCPP___CONCEPTS_ARITHMETIC_H + +#include <__config> +#include <__type_traits/is_floating_point.h> +#include <__type_traits/is_integral.h> +#include <__type_traits/is_signed.h> +#include <__type_traits/is_signed_integer.h> +#include <__type_traits/is_unsigned_integer.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concepts.arithmetic], arithmetic concepts + +template +concept integral = is_integral_v<_Tp>; + +template +concept signed_integral = integral<_Tp> && is_signed_v<_Tp>; + +template +concept unsigned_integral = integral<_Tp> && !signed_integral<_Tp>; + +template +concept floating_point = is_floating_point_v<_Tp>; + +// Concept helpers for the internal type traits for the fundamental types. + +template +concept __libcpp_unsigned_integer = __libcpp_is_unsigned_integer<_Tp>::value; +template +concept __libcpp_signed_integer = __libcpp_is_signed_integer<_Tp>::value; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_ARITHMETIC_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/assignable.h b/app/src/main/cpp/libcxx/include/__concepts/assignable.h new file mode 100644 index 0000000..91edd40 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/assignable.h @@ -0,0 +1,41 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_ASSIGNABLE_H +#define _LIBCPP___CONCEPTS_ASSIGNABLE_H + +#include <__concepts/common_reference_with.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__type_traits/is_reference.h> +#include <__type_traits/make_const_lvalue_ref.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.assignable] + +template +concept assignable_from = + is_lvalue_reference_v<_Lhs> && + common_reference_with<__make_const_lvalue_ref<_Lhs>, __make_const_lvalue_ref<_Rhs>> && + requires (_Lhs __lhs, _Rhs&& __rhs) { + { __lhs = _VSTD::forward<_Rhs>(__rhs) } -> same_as<_Lhs>; + }; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_ASSIGNABLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/boolean_testable.h b/app/src/main/cpp/libcxx/include/__concepts/boolean_testable.h new file mode 100644 index 0000000..a96bde7 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/boolean_testable.h @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_BOOLEAN_TESTABLE_H +#define _LIBCPP___CONCEPTS_BOOLEAN_TESTABLE_H + +#include <__concepts/convertible_to.h> +#include <__config> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concepts.booleantestable] + +template +concept __boolean_testable_impl = convertible_to<_Tp, bool>; + +template +concept __boolean_testable = __boolean_testable_impl<_Tp> && requires(_Tp&& __t) { + { !_VSTD::forward<_Tp>(__t) } -> __boolean_testable_impl; +}; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_BOOLEAN_TESTABLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/class_or_enum.h b/app/src/main/cpp/libcxx/include/__concepts/class_or_enum.h new file mode 100644 index 0000000..c4d2f98 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/class_or_enum.h @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_CLASS_OR_ENUM_H +#define _LIBCPP___CONCEPTS_CLASS_OR_ENUM_H + +#include <__config> +#include <__type_traits/is_class.h> +#include <__type_traits/is_enum.h> +#include <__type_traits/is_union.h> +#include <__type_traits/remove_cvref.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// Whether a type is a class type or enumeration type according to the Core wording. + +template +concept __class_or_enum = is_class_v<_Tp> || is_union_v<_Tp> || is_enum_v<_Tp>; + +// Work around Clang bug https://llvm.org/PR52970 +// TODO: remove this workaround once libc++ no longer has to support Clang 13 (it was fixed in Clang 14). +template +concept __workaround_52970 = is_class_v<__remove_cvref_t<_Tp>> || is_union_v<__remove_cvref_t<_Tp>>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_CLASS_OR_ENUM_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/common_reference_with.h b/app/src/main/cpp/libcxx/include/__concepts/common_reference_with.h new file mode 100644 index 0000000..cc92762 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/common_reference_with.h @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_COMMON_REFERENCE_WITH_H +#define _LIBCPP___CONCEPTS_COMMON_REFERENCE_WITH_H + +#include <__concepts/convertible_to.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__type_traits/common_reference.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.commonref] + +template +concept common_reference_with = + same_as, common_reference_t<_Up, _Tp>> && + convertible_to<_Tp, common_reference_t<_Tp, _Up>> && + convertible_to<_Up, common_reference_t<_Tp, _Up>>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_COMMON_REFERENCE_WITH_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/common_with.h b/app/src/main/cpp/libcxx/include/__concepts/common_with.h new file mode 100644 index 0000000..569a0ee --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/common_with.h @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_COMMON_WITH_H +#define _LIBCPP___CONCEPTS_COMMON_WITH_H + +#include <__concepts/common_reference_with.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__type_traits/add_lvalue_reference.h> +#include <__type_traits/common_reference.h> +#include <__type_traits/common_type.h> +#include <__utility/declval.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.common] + +template +concept common_with = + same_as, common_type_t<_Up, _Tp>> && + requires { + static_cast>(std::declval<_Tp>()); + static_cast>(std::declval<_Up>()); + } && + common_reference_with< + add_lvalue_reference_t, + add_lvalue_reference_t> && + common_reference_with< + add_lvalue_reference_t>, + common_reference_t< + add_lvalue_reference_t, + add_lvalue_reference_t>>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_COMMON_WITH_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/constructible.h b/app/src/main/cpp/libcxx/include/__concepts/constructible.h new file mode 100644 index 0000000..1d78eb5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/constructible.h @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_CONSTRUCTIBLE_H +#define _LIBCPP___CONCEPTS_CONSTRUCTIBLE_H + +#include <__concepts/convertible_to.h> +#include <__concepts/destructible.h> +#include <__config> +#include <__type_traits/is_constructible.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.constructible] +template +concept constructible_from = + destructible<_Tp> && is_constructible_v<_Tp, _Args...>; + +// [concept.default.init] + +template +concept __default_initializable = requires { ::new _Tp; }; + +template +concept default_initializable = constructible_from<_Tp> && + requires { _Tp{}; } && __default_initializable<_Tp>; + +// [concept.moveconstructible] +template +concept move_constructible = + constructible_from<_Tp, _Tp> && convertible_to<_Tp, _Tp>; + +// [concept.copyconstructible] +template +concept copy_constructible = + move_constructible<_Tp> && + constructible_from<_Tp, _Tp&> && convertible_to<_Tp&, _Tp> && + constructible_from<_Tp, const _Tp&> && convertible_to && + constructible_from<_Tp, const _Tp> && convertible_to; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_CONSTRUCTIBLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/convertible_to.h b/app/src/main/cpp/libcxx/include/__concepts/convertible_to.h new file mode 100644 index 0000000..2c1d267 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/convertible_to.h @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_CONVERTIBLE_TO_H +#define _LIBCPP___CONCEPTS_CONVERTIBLE_TO_H + +#include <__config> +#include <__type_traits/is_convertible.h> +#include <__utility/declval.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.convertible] + +template +concept convertible_to = + is_convertible_v<_From, _To> && + requires { + static_cast<_To>(std::declval<_From>()); + }; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_CONVERTIBLE_TO_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/copyable.h b/app/src/main/cpp/libcxx/include/__concepts/copyable.h new file mode 100644 index 0000000..c5d8a80 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/copyable.h @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_COPYABLE_H +#define _LIBCPP___CONCEPTS_COPYABLE_H + +#include <__concepts/assignable.h> +#include <__concepts/constructible.h> +#include <__concepts/movable.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concepts.object] + +template +concept copyable = + copy_constructible<_Tp> && + movable<_Tp> && + assignable_from<_Tp&, _Tp&> && + assignable_from<_Tp&, const _Tp&> && + assignable_from<_Tp&, const _Tp>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_COPYABLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/derived_from.h b/app/src/main/cpp/libcxx/include/__concepts/derived_from.h new file mode 100644 index 0000000..0d3462d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/derived_from.h @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_DERIVED_FROM_H +#define _LIBCPP___CONCEPTS_DERIVED_FROM_H + +#include <__config> +#include <__type_traits/is_base_of.h> +#include <__type_traits/is_convertible.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.derived] + +template +concept derived_from = + is_base_of_v<_Bp, _Dp> && + is_convertible_v; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_DERIVED_FROM_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/destructible.h b/app/src/main/cpp/libcxx/include/__concepts/destructible.h new file mode 100644 index 0000000..ad3819d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/destructible.h @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_DESTRUCTIBLE_H +#define _LIBCPP___CONCEPTS_DESTRUCTIBLE_H + +#include <__config> +#include <__type_traits/is_nothrow_destructible.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.destructible] + +template +concept destructible = is_nothrow_destructible_v<_Tp>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_DESTRUCTIBLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/different_from.h b/app/src/main/cpp/libcxx/include/__concepts/different_from.h new file mode 100644 index 0000000..15fd8f0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/different_from.h @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_DIFFERENT_FROM_H +#define _LIBCPP___CONCEPTS_DIFFERENT_FROM_H + +#include <__concepts/same_as.h> +#include <__config> +#include <__type_traits/remove_cvref.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +concept __different_from = !same_as, remove_cvref_t<_Up>>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_DIFFERENT_FROM_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/equality_comparable.h b/app/src/main/cpp/libcxx/include/__concepts/equality_comparable.h new file mode 100644 index 0000000..b865141 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/equality_comparable.h @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_EQUALITY_COMPARABLE_H +#define _LIBCPP___CONCEPTS_EQUALITY_COMPARABLE_H + +#include <__concepts/boolean_testable.h> +#include <__concepts/common_reference_with.h> +#include <__config> +#include <__type_traits/common_reference.h> +#include <__type_traits/make_const_lvalue_ref.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.equalitycomparable] + +template +concept __weakly_equality_comparable_with = + requires(__make_const_lvalue_ref<_Tp> __t, __make_const_lvalue_ref<_Up> __u) { + { __t == __u } -> __boolean_testable; + { __t != __u } -> __boolean_testable; + { __u == __t } -> __boolean_testable; + { __u != __t } -> __boolean_testable; + }; + +template +concept equality_comparable = __weakly_equality_comparable_with<_Tp, _Tp>; + +template +concept equality_comparable_with = + equality_comparable<_Tp> && equality_comparable<_Up> && + common_reference_with<__make_const_lvalue_ref<_Tp>, __make_const_lvalue_ref<_Up>> && + equality_comparable< + common_reference_t< + __make_const_lvalue_ref<_Tp>, + __make_const_lvalue_ref<_Up>>> && + __weakly_equality_comparable_with<_Tp, _Up>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_EQUALITY_COMPARABLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/invocable.h b/app/src/main/cpp/libcxx/include/__concepts/invocable.h new file mode 100644 index 0000000..ec39b7b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/invocable.h @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_INVOCABLE_H +#define _LIBCPP___CONCEPTS_INVOCABLE_H + +#include <__config> +#include <__functional/invoke.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.invocable] + +template +concept invocable = requires(_Fn&& __fn, _Args&&... __args) { + _VSTD::invoke(_VSTD::forward<_Fn>(__fn), _VSTD::forward<_Args>(__args)...); // not required to be equality preserving +}; + +// [concept.regular.invocable] + +template +concept regular_invocable = invocable<_Fn, _Args...>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_INVOCABLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/movable.h b/app/src/main/cpp/libcxx/include/__concepts/movable.h new file mode 100644 index 0000000..749b78a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/movable.h @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_MOVABLE_H +#define _LIBCPP___CONCEPTS_MOVABLE_H + +#include <__concepts/assignable.h> +#include <__concepts/constructible.h> +#include <__concepts/swappable.h> +#include <__config> +#include <__type_traits/is_object.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concepts.object] + +template +concept movable = + is_object_v<_Tp> && + move_constructible<_Tp> && + assignable_from<_Tp&, _Tp> && + swappable<_Tp>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_MOVABLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/predicate.h b/app/src/main/cpp/libcxx/include/__concepts/predicate.h new file mode 100644 index 0000000..7ae9783 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/predicate.h @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_PREDICATE_H +#define _LIBCPP___CONCEPTS_PREDICATE_H + +#include <__concepts/boolean_testable.h> +#include <__concepts/invocable.h> +#include <__config> +#include <__functional/invoke.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.predicate] + +template +concept predicate = + regular_invocable<_Fn, _Args...> && __boolean_testable>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_PREDICATE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/regular.h b/app/src/main/cpp/libcxx/include/__concepts/regular.h new file mode 100644 index 0000000..d15728d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/regular.h @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_REGULAR_H +#define _LIBCPP___CONCEPTS_REGULAR_H + +#include <__concepts/equality_comparable.h> +#include <__concepts/semiregular.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.object] + +template +concept regular = semiregular<_Tp> && equality_comparable<_Tp>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_REGULAR_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/relation.h b/app/src/main/cpp/libcxx/include/__concepts/relation.h new file mode 100644 index 0000000..7d5141c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/relation.h @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_RELATION_H +#define _LIBCPP___CONCEPTS_RELATION_H + +#include <__concepts/predicate.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.relation] + +template +concept relation = + predicate<_Rp, _Tp, _Tp> && predicate<_Rp, _Up, _Up> && + predicate<_Rp, _Tp, _Up> && predicate<_Rp, _Up, _Tp>; + +// [concept.equiv] + +template +concept equivalence_relation = relation<_Rp, _Tp, _Up>; + +// [concept.strictweakorder] + +template +concept strict_weak_order = relation<_Rp, _Tp, _Up>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_RELATION_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/same_as.h b/app/src/main/cpp/libcxx/include/__concepts/same_as.h new file mode 100644 index 0000000..554ebc3 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/same_as.h @@ -0,0 +1,35 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_SAME_AS_H +#define _LIBCPP___CONCEPTS_SAME_AS_H + +#include <__config> +#include <__type_traits/is_same.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.same] + +template +concept __same_as_impl = _IsSame<_Tp, _Up>::value; + +template +concept same_as = __same_as_impl<_Tp, _Up> && __same_as_impl<_Up, _Tp>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_SAME_AS_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/semiregular.h b/app/src/main/cpp/libcxx/include/__concepts/semiregular.h new file mode 100644 index 0000000..d15bb3b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/semiregular.h @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_SEMIREGULAR_H +#define _LIBCPP___CONCEPTS_SEMIREGULAR_H + +#include <__concepts/constructible.h> +#include <__concepts/copyable.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.object] + +template +concept semiregular = copyable<_Tp> && default_initializable<_Tp>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_SEMIREGULAR_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/swappable.h b/app/src/main/cpp/libcxx/include/__concepts/swappable.h new file mode 100644 index 0000000..d91a7a1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/swappable.h @@ -0,0 +1,121 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_SWAPPABLE_H +#define _LIBCPP___CONCEPTS_SWAPPABLE_H + +#include <__concepts/assignable.h> +#include <__concepts/class_or_enum.h> +#include <__concepts/common_reference_with.h> +#include <__concepts/constructible.h> +#include <__config> +#include <__type_traits/extent.h> +#include <__type_traits/is_nothrow_move_assignable.h> +#include <__type_traits/is_nothrow_move_constructible.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/exchange.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/swap.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.swappable] + +namespace ranges { +namespace __swap { + + template + void swap(_Tp&, _Tp&) = delete; + + template + concept __unqualified_swappable_with = + (__class_or_enum> || __class_or_enum>) && + requires(_Tp&& __t, _Up&& __u) { + swap(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)); + }; + + struct __fn; + + template + concept __swappable_arrays = + !__unqualified_swappable_with<_Tp(&)[_Size], _Up(&)[_Size]> && + extent_v<_Tp> == extent_v<_Up> && + requires(_Tp(& __t)[_Size], _Up(& __u)[_Size], const __fn& __swap) { + __swap(__t[0], __u[0]); + }; + + template + concept __exchangeable = + !__unqualified_swappable_with<_Tp&, _Tp&> && + move_constructible<_Tp> && + assignable_from<_Tp&, _Tp>; + + struct __fn { + // 2.1 `S` is `(void)swap(E1, E2)`* if `E1` or `E2` has class or enumeration type and... + // *The name `swap` is used here unqualified. + template + requires __unqualified_swappable_with<_Tp, _Up> + constexpr void operator()(_Tp&& __t, _Up&& __u) const + noexcept(noexcept(swap(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) + { + swap(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)); + } + + // 2.2 Otherwise, if `E1` and `E2` are lvalues of array types with equal extent and... + template + requires __swappable_arrays<_Tp, _Up, _Size> + constexpr void operator()(_Tp(& __t)[_Size], _Up(& __u)[_Size]) const + noexcept(noexcept((*this)(*__t, *__u))) + { + // TODO(cjdb): replace with `ranges::swap_ranges`. + for (size_t __i = 0; __i < _Size; ++__i) { + (*this)(__t[__i], __u[__i]); + } + } + + // 2.3 Otherwise, if `E1` and `E2` are lvalues of the same type `T` that models... + template<__exchangeable _Tp> + constexpr void operator()(_Tp& __x, _Tp& __y) const + noexcept(is_nothrow_move_constructible_v<_Tp> && is_nothrow_move_assignable_v<_Tp>) + { + __y = _VSTD::exchange(__x, _VSTD::move(__y)); + } + }; +} // namespace __swap + +inline namespace __cpo { + inline constexpr auto swap = __swap::__fn{}; +} // namespace __cpo +} // namespace ranges + +template +concept swappable = requires(_Tp& __a, _Tp& __b) { ranges::swap(__a, __b); }; + +template +concept swappable_with = + common_reference_with<_Tp, _Up> && + requires(_Tp&& __t, _Up&& __u) { + ranges::swap(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Tp>(__t)); + ranges::swap(_VSTD::forward<_Up>(__u), _VSTD::forward<_Up>(__u)); + ranges::swap(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)); + ranges::swap(_VSTD::forward<_Up>(__u), _VSTD::forward<_Tp>(__t)); + }; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_SWAPPABLE_H diff --git a/app/src/main/cpp/libcxx/include/__concepts/totally_ordered.h b/app/src/main/cpp/libcxx/include/__concepts/totally_ordered.h new file mode 100644 index 0000000..f12d26b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__concepts/totally_ordered.h @@ -0,0 +1,58 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONCEPTS_TOTALLY_ORDERED_H +#define _LIBCPP___CONCEPTS_TOTALLY_ORDERED_H + +#include <__concepts/boolean_testable.h> +#include <__concepts/equality_comparable.h> +#include <__config> +#include <__type_traits/common_reference.h> +#include <__type_traits/make_const_lvalue_ref.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [concept.totallyordered] + +template +concept __partially_ordered_with = + requires(__make_const_lvalue_ref<_Tp> __t, __make_const_lvalue_ref<_Up> __u) { + { __t < __u } -> __boolean_testable; + { __t > __u } -> __boolean_testable; + { __t <= __u } -> __boolean_testable; + { __t >= __u } -> __boolean_testable; + { __u < __t } -> __boolean_testable; + { __u > __t } -> __boolean_testable; + { __u <= __t } -> __boolean_testable; + { __u >= __t } -> __boolean_testable; + }; + +template +concept totally_ordered = equality_comparable<_Tp> && __partially_ordered_with<_Tp, _Tp>; + +template +concept totally_ordered_with = + totally_ordered<_Tp> && totally_ordered<_Up> && + equality_comparable_with<_Tp, _Up> && + totally_ordered< + common_reference_t< + __make_const_lvalue_ref<_Tp>, + __make_const_lvalue_ref<_Up>>> && + __partially_ordered_with<_Tp, _Up>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___CONCEPTS_TOTALLY_ORDERED_H diff --git a/app/src/main/cpp/libcxx/include/__config b/app/src/main/cpp/libcxx/include/__config new file mode 100644 index 0000000..40c9deb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__config @@ -0,0 +1,1255 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONFIG +#define _LIBCPP___CONFIG + +#include <__config_site> + +#if defined(_MSC_VER) && !defined(__clang__) +# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# endif +#endif + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +# pragma GCC system_header +#endif + +#if defined(__apple_build_version__) +# define _LIBCPP_COMPILER_CLANG_BASED +# define _LIBCPP_APPLE_CLANG_VER (__apple_build_version__ / 10000) +#elif defined(__clang__) +# define _LIBCPP_COMPILER_CLANG_BASED +# define _LIBCPP_CLANG_VER (__clang_major__ * 100 + __clang_minor__) +#elif defined(__GNUC__) +# define _LIBCPP_COMPILER_GCC +#endif + +#ifdef __cplusplus + +// _LIBCPP_VERSION represents the version of libc++, which matches the version of LLVM. +// Given a LLVM release LLVM XX.YY.ZZ (e.g. LLVM 17.0.1 == 17.00.01), _LIBCPP_VERSION is +// defined to XXYYZZ. +# define _LIBCPP_VERSION 170000 + +# define _LIBCPP_CONCAT_IMPL(_X, _Y) _X##_Y +# define _LIBCPP_CONCAT(_X, _Y) _LIBCPP_CONCAT_IMPL(_X, _Y) + +// Valid C++ identifier that revs with every libc++ version. This can be used to +// generate identifiers that must be unique for every released libc++ version. +# define _LIBCPP_VERSIONED_IDENTIFIER _LIBCPP_CONCAT(v, _LIBCPP_VERSION) + +# if __STDC_HOSTED__ == 0 +# define _LIBCPP_FREESTANDING +# endif + +# ifndef _LIBCPP_STD_VER +# if __cplusplus <= 201103L +# define _LIBCPP_STD_VER 11 +# elif __cplusplus <= 201402L +# define _LIBCPP_STD_VER 14 +# elif __cplusplus <= 201703L +# define _LIBCPP_STD_VER 17 +# elif __cplusplus <= 202002L +# define _LIBCPP_STD_VER 20 +# else +// Expected release year of the next C++ standard +# define _LIBCPP_STD_VER 23 +# endif +# endif // _LIBCPP_STD_VER + +# if defined(__ELF__) +# define _LIBCPP_OBJECT_FORMAT_ELF 1 +# elif defined(__MACH__) +# define _LIBCPP_OBJECT_FORMAT_MACHO 1 +# elif defined(_WIN32) +# define _LIBCPP_OBJECT_FORMAT_COFF 1 +# elif defined(__wasm__) +# define _LIBCPP_OBJECT_FORMAT_WASM 1 +# elif defined(_AIX) +# define _LIBCPP_OBJECT_FORMAT_XCOFF 1 +# else +// ... add new file formats here ... +# endif + +# if _LIBCPP_ABI_VERSION >= 2 +// Change short string representation so that string data starts at offset 0, +// improving its alignment in some cases. +# define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT +// Fix deque iterator type in order to support incomplete types. +# define _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE +// Fix undefined behavior in how std::list stores its linked nodes. +# define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB +// Fix undefined behavior in how __tree stores its end and parent nodes. +# define _LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB +// Fix undefined behavior in how __hash_table stores its pointer types. +# define _LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB +# define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB +# define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE +// Define a key function for `bad_function_call` in the library, to centralize +// its vtable and typeinfo to libc++ rather than having all other libraries +// using that class define their own copies. +# define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION +// Override the default return value of exception::what() for +// bad_function_call::what() with a string that is specific to +// bad_function_call (see http://wg21.link/LWG2233). This is an ABI break +// because it changes the vtable layout of bad_function_call. +# define _LIBCPP_ABI_BAD_FUNCTION_CALL_GOOD_WHAT_MESSAGE +// Enable optimized version of __do_get_(un)signed which avoids redundant copies. +# define _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET +// Give reverse_iterator one data member of type T, not two. +// Also, in C++17 and later, don't derive iterator types from std::iterator. +# define _LIBCPP_ABI_NO_ITERATOR_BASES +// Use the smallest possible integer type to represent the index of the variant. +// Previously libc++ used "unsigned int" exclusively. +# define _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION +// Unstable attempt to provide a more optimized std::function +# define _LIBCPP_ABI_OPTIMIZED_FUNCTION +// All the regex constants must be distinct and nonzero. +# define _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO +// Re-worked external template instantiations for std::string with a focus on +// performance and fast-path inlining. +# define _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION +// Enable clang::trivial_abi on std::unique_ptr. +# define _LIBCPP_ABI_ENABLE_UNIQUE_PTR_TRIVIAL_ABI +// Enable clang::trivial_abi on std::shared_ptr and std::weak_ptr +# define _LIBCPP_ABI_ENABLE_SHARED_PTR_TRIVIAL_ABI +// std::random_device holds some state when it uses an implementation that gets +// entropy from a file (see _LIBCPP_USING_DEV_RANDOM). When switching from this +// implementation to another one on a platform that has already shipped +// std::random_device, one needs to retain the same object layout to remain ABI +// compatible. This switch removes these workarounds for platforms that don't care +// about ABI compatibility. +# define _LIBCPP_ABI_NO_RANDOM_DEVICE_COMPATIBILITY_LAYOUT +// Don't export the legacy __basic_string_common class and its methods from the built library. +# define _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON +// Don't export the legacy __vector_base_common class and its methods from the built library. +# define _LIBCPP_ABI_DO_NOT_EXPORT_VECTOR_BASE_COMMON +// According to the Standard, `bitset::operator[] const` returns bool +# define _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL +// Remove the base 10 implementation of std::to_chars from the dylib. +// The implementation moved to the header, but we still export the symbols from +// the dylib for backwards compatibility. +# define _LIBCPP_ABI_DO_NOT_EXPORT_TO_CHARS_BASE_10 +# elif _LIBCPP_ABI_VERSION == 1 +# if !(defined(_LIBCPP_OBJECT_FORMAT_COFF) || defined(_LIBCPP_OBJECT_FORMAT_XCOFF)) +// Enable compiling copies of now inline methods into the dylib to support +// applications compiled against older libraries. This is unnecessary with +// COFF dllexport semantics, since dllexport forces a non-inline definition +// of inline functions to be emitted anyway. Our own non-inline copy would +// conflict with the dllexport-emitted copy, so we disable it. For XCOFF, +// the linker will take issue with the symbols in the shared object if the +// weak inline methods get visibility (such as from -fvisibility-inlines-hidden), +// so disable it. +# define _LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS +# endif +// Feature macros for disabling pre ABI v1 features. All of these options +// are deprecated. +# if defined(__FreeBSD__) +# define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR +# endif +# endif + +# if defined(_LIBCPP_BUILDING_LIBRARY) || _LIBCPP_ABI_VERSION >= 2 +// Enable additional explicit instantiations of iostreams components. This +// reduces the number of weak definitions generated in programs that use +// iostreams by providing a single strong definition in the shared library. +# define _LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1 + +// Define a key function for `bad_function_call` in the library, to centralize +// its vtable and typeinfo to libc++ rather than having all other libraries +// using that class define their own copies. +# define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION +# endif + +# define _LIBCPP_TOSTRING2(x) #x +# define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x) + +# if __cplusplus < 201103L +# define _LIBCPP_CXX03_LANG +# endif + +# ifndef __has_attribute +# define __has_attribute(__x) 0 +# endif + +# ifndef __has_builtin +# define __has_builtin(__x) 0 +# endif + +# ifndef __has_extension +# define __has_extension(__x) 0 +# endif + +# ifndef __has_feature +# define __has_feature(__x) 0 +# endif + +# ifndef __has_cpp_attribute +# define __has_cpp_attribute(__x) 0 +# endif + +# ifndef __has_constexpr_builtin +# define __has_constexpr_builtin(x) 0 +# endif + +// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by +// the compiler and '1' otherwise. +# ifndef __is_identifier +# define __is_identifier(__x) 1 +# endif + +# ifndef __has_declspec_attribute +# define __has_declspec_attribute(__x) 0 +# endif + +# define __has_keyword(__x) !(__is_identifier(__x)) + +# ifndef __has_include +# define __has_include(...) 0 +# endif + +# if !defined(_LIBCPP_COMPILER_CLANG_BASED) && __cplusplus < 201103L +# error "libc++ only supports C++03 with Clang-based compilers. Please enable C++11" +# endif + +// FIXME: ABI detection should be done via compiler builtin macros. This +// is just a placeholder until Clang implements such macros. For now assume +// that Windows compilers pretending to be MSVC++ target the Microsoft ABI, +// and allow the user to explicitly specify the ABI to handle cases where this +// heuristic falls short. +# if defined(_LIBCPP_ABI_FORCE_ITANIUM) && defined(_LIBCPP_ABI_FORCE_MICROSOFT) +# error "Only one of _LIBCPP_ABI_FORCE_ITANIUM and _LIBCPP_ABI_FORCE_MICROSOFT can be defined" +# elif defined(_LIBCPP_ABI_FORCE_ITANIUM) +# define _LIBCPP_ABI_ITANIUM +# elif defined(_LIBCPP_ABI_FORCE_MICROSOFT) +# define _LIBCPP_ABI_MICROSOFT +# else +# if defined(_WIN32) && defined(_MSC_VER) +# define _LIBCPP_ABI_MICROSOFT +# else +# define _LIBCPP_ABI_ITANIUM +# endif +# endif + +# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME) +# define _LIBCPP_ABI_VCRUNTIME +# endif + +# if __has_feature(experimental_library) +# ifndef _LIBCPP_ENABLE_EXPERIMENTAL +# define _LIBCPP_ENABLE_EXPERIMENTAL +# endif +# endif + +// Incomplete features get their own specific disabling flags. This makes it +// easier to grep for target specific flags once the feature is complete. +# if !defined(_LIBCPP_ENABLE_EXPERIMENTAL) && !defined(_LIBCPP_BUILDING_LIBRARY) +# define _LIBCPP_HAS_NO_INCOMPLETE_FORMAT +# endif + +// Need to detect which libc we're using if we're on Linux. +# if defined(__linux__) +# include +# if defined(__GLIBC_PREREQ) +# define _LIBCPP_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b) +# else +# define _LIBCPP_GLIBC_PREREQ(a, b) 0 +# endif // defined(__GLIBC_PREREQ) +# endif // defined(__linux__) + +# if defined(__MVS__) +# include // for __NATIVE_ASCII_F +# endif + +# ifdef __LITTLE_ENDIAN__ +# if __LITTLE_ENDIAN__ +# define _LIBCPP_LITTLE_ENDIAN +# endif // __LITTLE_ENDIAN__ +# endif // __LITTLE_ENDIAN__ + +# ifdef __BIG_ENDIAN__ +# if __BIG_ENDIAN__ +# define _LIBCPP_BIG_ENDIAN +# endif // __BIG_ENDIAN__ +# endif // __BIG_ENDIAN__ + +# ifdef __BYTE_ORDER__ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define _LIBCPP_LITTLE_ENDIAN +# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# define _LIBCPP_BIG_ENDIAN +# endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +# endif // __BYTE_ORDER__ + +# ifdef __FreeBSD__ +# include +# include +# if _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN +# else // _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_BIG_ENDIAN +# endif // _BYTE_ORDER == _LITTLE_ENDIAN +# endif // __FreeBSD__ + +# if defined(__NetBSD__) || defined(__OpenBSD__) +# include +# if _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN +# else // _BYTE_ORDER == _LITTLE_ENDIAN +# define _LIBCPP_BIG_ENDIAN +# endif // _BYTE_ORDER == _LITTLE_ENDIAN +# endif // defined(__NetBSD__) || defined(__OpenBSD__) + +# if defined(_WIN32) +# define _LIBCPP_WIN32API +# define _LIBCPP_LITTLE_ENDIAN +# define _LIBCPP_SHORT_WCHAR 1 +// Both MinGW and native MSVC provide a "MSVC"-like environment +# define _LIBCPP_MSVCRT_LIKE +// If mingw not explicitly detected, assume using MS C runtime only if +// a MS compatibility version is specified. +# if defined(_MSC_VER) && !defined(__MINGW32__) +# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library +# endif +# if (defined(_M_AMD64) || defined(__x86_64__)) || (defined(_M_ARM) || defined(__arm__)) +# define _LIBCPP_HAS_BITSCAN64 +# endif +# define _LIBCPP_HAS_OPEN_WITH_WCHAR +# endif // defined(_WIN32) + +# ifdef __sun__ +# include +# ifdef _LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN +# else +# define _LIBCPP_BIG_ENDIAN +# endif +# endif // __sun__ + +# if defined(_AIX) && !defined(__64BIT__) +// The size of wchar is 2 byte on 32-bit mode on AIX. +# define _LIBCPP_SHORT_WCHAR 1 +# endif + +// Libc++ supports various implementations of std::random_device. +// +// _LIBCPP_USING_DEV_RANDOM +// Read entropy from the given file, by default `/dev/urandom`. +// If a token is provided, it is assumed to be the path to a file +// to read entropy from. This is the default behavior if nothing +// else is specified. This implementation requires storing state +// inside `std::random_device`. +// +// _LIBCPP_USING_ARC4_RANDOM +// Use arc4random(). This allows obtaining random data even when +// using sandboxing mechanisms. On some platforms like Apple, this +// is the recommended source of entropy for user-space programs. +// When this option is used, the token passed to `std::random_device`'s +// constructor *must* be "/dev/urandom" -- anything else is an error. +// +// _LIBCPP_USING_GETENTROPY +// Use getentropy(). +// When this option is used, the token passed to `std::random_device`'s +// constructor *must* be "/dev/urandom" -- anything else is an error. +// +// _LIBCPP_USING_FUCHSIA_CPRNG +// Use Fuchsia's zx_cprng_draw() system call, which is specified to +// deliver high-quality entropy and cannot fail. +// When this option is used, the token passed to `std::random_device`'s +// constructor *must* be "/dev/urandom" -- anything else is an error. +// +// _LIBCPP_USING_NACL_RANDOM +// NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access, +// including accesses to the special files under `/dev`. This implementation +// uses the NaCL syscall `nacl_secure_random_init()` to get entropy. +// When this option is used, the token passed to `std::random_device`'s +// constructor *must* be "/dev/urandom" -- anything else is an error. +// +// _LIBCPP_USING_WIN32_RANDOM +// Use rand_s(), for use on Windows. +// When this option is used, the token passed to `std::random_device`'s +// constructor *must* be "/dev/urandom" -- anything else is an error. +# if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \ + defined(__DragonFly__) || defined(__sun__) +# define _LIBCPP_USING_ARC4_RANDOM +# elif defined(__wasi__) || defined(__EMSCRIPTEN__) +# define _LIBCPP_USING_GETENTROPY +# elif defined(__Fuchsia__) +# define _LIBCPP_USING_FUCHSIA_CPRNG +# elif defined(__native_client__) +# define _LIBCPP_USING_NACL_RANDOM +# elif defined(_LIBCPP_WIN32API) +# define _LIBCPP_USING_WIN32_RANDOM +# else +# define _LIBCPP_USING_DEV_RANDOM +# endif + +# if !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN) +# include +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define _LIBCPP_LITTLE_ENDIAN +# elif __BYTE_ORDER == __BIG_ENDIAN +# define _LIBCPP_BIG_ENDIAN +# else // __BYTE_ORDER == __BIG_ENDIAN +# error unable to determine endian +# endif +# endif // !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN) + +# if __has_attribute(__no_sanitize__) && !defined(_LIBCPP_COMPILER_GCC) +# define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi"))) +# else +# define _LIBCPP_NO_CFI +# endif + +# ifndef _LIBCPP_CXX03_LANG + +# define _LIBCPP_ALIGNOF(_Tp) alignof(_Tp) +# define _ALIGNAS_TYPE(x) alignas(x) +# define _ALIGNAS(x) alignas(x) +# define _LIBCPP_NORETURN [[noreturn]] +# define _NOEXCEPT noexcept +# define _NOEXCEPT_(x) noexcept(x) +# define _LIBCPP_CONSTEXPR constexpr + +# else + +# define _LIBCPP_ALIGNOF(_Tp) _Alignof(_Tp) +# define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x)))) +# define _ALIGNAS(x) __attribute__((__aligned__(x))) +# define _LIBCPP_NORETURN __attribute__((__noreturn__)) +# define _LIBCPP_HAS_NO_NOEXCEPT +# define nullptr __nullptr +# define _NOEXCEPT throw() +# define _NOEXCEPT_(x) +# define static_assert(...) _Static_assert(__VA_ARGS__) +# define decltype(...) __decltype(__VA_ARGS__) +# define _LIBCPP_CONSTEXPR + +typedef __char16_t char16_t; +typedef __char32_t char32_t; + +# endif + +# if !defined(__cpp_exceptions) || __cpp_exceptions < 199711L +# define _LIBCPP_NO_EXCEPTIONS +# endif + +# define _LIBCPP_PREFERRED_ALIGNOF(_Tp) __alignof(_Tp) + +# if defined(_LIBCPP_COMPILER_CLANG_BASED) + +# if defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && (!defined(__arm__) || __ARM_ARCH_7K__ >= 2) +# define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT +# endif + +// Objective-C++ features (opt-in) +# if __has_feature(objc_arc) +# define _LIBCPP_HAS_OBJC_ARC +# endif + +# if __has_feature(objc_arc_weak) +# define _LIBCPP_HAS_OBJC_ARC_WEAK +# endif + +# if __has_extension(blocks) +# define _LIBCPP_HAS_EXTENSION_BLOCKS +# endif + +# if defined(_LIBCPP_HAS_EXTENSION_BLOCKS) && defined(__APPLE__) +# define _LIBCPP_HAS_BLOCKS_RUNTIME +# endif + +# if !__has_feature(address_sanitizer) +# define _LIBCPP_HAS_NO_ASAN +# endif + +// Allow for build-time disabling of unsigned integer sanitization +# if __has_attribute(no_sanitize) +# define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK __attribute__((__no_sanitize__("unsigned-integer-overflow"))) +# endif + +# define _LIBCPP_ALWAYS_INLINE __attribute__((__always_inline__)) + +# define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ + +# elif defined(_LIBCPP_COMPILER_GCC) + +# if !defined(__SANITIZE_ADDRESS__) +# define _LIBCPP_HAS_NO_ASAN +# endif + +# define _LIBCPP_ALWAYS_INLINE __attribute__((__always_inline__)) + +# define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__ + +# endif // _LIBCPP_COMPILER_[CLANG|GCC] + +# if defined(_LIBCPP_OBJECT_FORMAT_COFF) + +# ifdef _DLL +# define _LIBCPP_CRT_FUNC __declspec(dllimport) +# else +# define _LIBCPP_CRT_FUNC +# endif + +# if defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) || (defined(__MINGW32__) && !defined(_LIBCPP_BUILDING_LIBRARY)) +# define _LIBCPP_DLL_VIS +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS +# define _LIBCPP_OVERRIDABLE_FUNC_VIS +# define _LIBCPP_EXPORTED_FROM_ABI +# elif defined(_LIBCPP_BUILDING_LIBRARY) +# define _LIBCPP_DLL_VIS __declspec(dllexport) +# if defined(__MINGW32__) +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS +# else +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DLL_VIS +# endif +# define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_DLL_VIS +# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllexport) +# else +# define _LIBCPP_DLL_VIS __declspec(dllimport) +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS +# define _LIBCPP_OVERRIDABLE_FUNC_VIS +# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllimport) +# endif + +# define _LIBCPP_TYPE_VIS _LIBCPP_DLL_VIS +# define _LIBCPP_FUNC_VIS _LIBCPP_DLL_VIS +# define _LIBCPP_EXCEPTION_ABI _LIBCPP_DLL_VIS +# define _LIBCPP_HIDDEN +# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS +# define _LIBCPP_TEMPLATE_VIS +# define _LIBCPP_TEMPLATE_DATA_VIS +# define _LIBCPP_ENUM_VIS + +# else + +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# define _LIBCPP_VISIBILITY(vis) __attribute__((__visibility__(vis))) +# else +# define _LIBCPP_VISIBILITY(vis) +# endif + +# define _LIBCPP_HIDDEN _LIBCPP_VISIBILITY("hidden") +# define _LIBCPP_FUNC_VIS _LIBCPP_VISIBILITY("default") +# define _LIBCPP_TYPE_VIS _LIBCPP_VISIBILITY("default") +# define _LIBCPP_TEMPLATE_DATA_VIS _LIBCPP_VISIBILITY("default") +# define _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_VISIBILITY("default") +# define _LIBCPP_EXCEPTION_ABI _LIBCPP_VISIBILITY("default") +# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_VISIBILITY("default") +# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS + +// TODO: Make this a proper customization point or remove the option to override it. +# ifndef _LIBCPP_OVERRIDABLE_FUNC_VIS +# define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_VISIBILITY("default") +# endif + +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +// The inline should be removed once PR32114 is resolved +# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS inline _LIBCPP_HIDDEN +# else +# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS +# endif + +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# if __has_attribute(__type_visibility__) +# define _LIBCPP_TEMPLATE_VIS __attribute__((__type_visibility__("default"))) +# else +# define _LIBCPP_TEMPLATE_VIS __attribute__((__visibility__("default"))) +# endif +# else +# define _LIBCPP_TEMPLATE_VIS +# endif + +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__) +# define _LIBCPP_ENUM_VIS __attribute__((__type_visibility__("default"))) +# else +# define _LIBCPP_ENUM_VIS +# endif + +# endif // defined(_LIBCPP_OBJECT_FORMAT_COFF) + +# if __has_attribute(exclude_from_explicit_instantiation) +# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__((__exclude_from_explicit_instantiation__)) +# else +// Try to approximate the effect of exclude_from_explicit_instantiation +// (which is that entities are not assumed to be provided by explicit +// template instantiations in the dylib) by always inlining those entities. +# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION _LIBCPP_ALWAYS_INLINE +# endif + +// This macro marks a symbol as being hidden from libc++'s ABI. This is achieved +// on two levels: +// 1. The symbol is given hidden visibility, which ensures that users won't start exporting +// symbols from their dynamic library by means of using the libc++ headers. This ensures +// that those symbols stay private to the dynamic library in which it is defined. +// +// 2. The symbol is given an ABI tag that changes with each version of libc++. This ensures +// that no ODR violation can arise from mixing two TUs compiled with different versions +// of libc++ where we would have changed the definition of a symbol. If the symbols shared +// the same name, the ODR would require that their definitions be token-by-token equivalent, +// which basically prevents us from being able to make any change to any function in our +// headers. Using this ABI tag ensures that the symbol name is "bumped" artificially at +// each release, which lets us change the definition of these symbols at our leisure. +// Note that historically, this has been achieved in various ways, including force-inlining +// all functions or giving internal linkage to all functions. Both these (previous) solutions +// suffer from drawbacks that lead notably to code bloat. +// +// Note that we use _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION to ensure that we don't depend +// on _LIBCPP_HIDE_FROM_ABI methods of classes explicitly instantiated in the dynamic library. +// +// Also note that the _LIBCPP_HIDE_FROM_ABI_VIRTUAL macro should be used on virtual functions +// instead of _LIBCPP_HIDE_FROM_ABI. That macro does not use an ABI tag. Indeed, the mangled +// name of a virtual function is part of its ABI, since some architectures like arm64e can sign +// the virtual function pointer in the vtable based on the mangled name of the function. Since +// we use an ABI tag that changes with each released version, the mangled name of the virtual +// function would change, which is incorrect. Note that it doesn't make much sense to change +// the implementation of a virtual function in an ABI-incompatible way in the first place, +// since that would be an ABI break anyway. Hence, the lack of ABI tag should not be noticeable. +// +// TODO: We provide a escape hatch with _LIBCPP_NO_ABI_TAG for folks who want to avoid increasing +// the length of symbols with an ABI tag. In practice, we should remove the escape hatch and +// use compression mangling instead, see https://github.com/itanium-cxx-abi/cxx-abi/issues/70. +# ifndef _LIBCPP_NO_ABI_TAG +# define _LIBCPP_HIDE_FROM_ABI \ + _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION \ + __attribute__((__abi_tag__(_LIBCPP_TOSTRING(_LIBCPP_VERSIONED_IDENTIFIER)))) +# else +# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION +# endif +# define _LIBCPP_HIDE_FROM_ABI_VIRTUAL _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION + +// This macro provides a HIDE_FROM_ABI equivalent that can be applied to extern +// "C" function, as those lack mangling. +# define _LIBCPP_HIDE_FROM_ABI_C _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION + +# ifdef _LIBCPP_BUILDING_LIBRARY +# if _LIBCPP_ABI_VERSION > 1 +# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI +# else +# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 +# endif +# else +# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI +# endif + +// Just so we can migrate to the new macros gradually. +# define _LIBCPP_INLINE_VISIBILITY _LIBCPP_HIDE_FROM_ABI + +// Inline namespaces are available in Clang/GCC/MSVC regardless of C++ dialect. +// clang-format off +# define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { inline namespace _LIBCPP_ABI_NAMESPACE { +# define _LIBCPP_END_NAMESPACE_STD }} +# define _VSTD std + +_LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD + +# if _LIBCPP_STD_VER > 14 +# define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \ + _LIBCPP_BEGIN_NAMESPACE_STD inline namespace __fs { namespace filesystem { +# else +# define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \ + _LIBCPP_BEGIN_NAMESPACE_STD namespace __fs { namespace filesystem { +# endif + +# define _LIBCPP_END_NAMESPACE_FILESYSTEM _LIBCPP_END_NAMESPACE_STD }} +// clang-format on + +# define _VSTD_FS std::__fs::filesystem + +# if __has_attribute(__enable_if__) +# define _LIBCPP_PREFERRED_OVERLOAD __attribute__((__enable_if__(true, ""))) +# endif + +# ifndef __SIZEOF_INT128__ +# define _LIBCPP_HAS_NO_INT128 +# endif + +# ifndef __cpp_consteval +# define _LIBCPP_CONSTEVAL _LIBCPP_CONSTEXPR +# else +# define _LIBCPP_CONSTEVAL consteval +# endif + +# if __has_attribute(__malloc__) +# define _LIBCPP_NOALIAS __attribute__((__malloc__)) +# else +# define _LIBCPP_NOALIAS +# endif + +# if __has_attribute(__using_if_exists__) +# define _LIBCPP_USING_IF_EXISTS __attribute__((__using_if_exists__)) +# else +# define _LIBCPP_USING_IF_EXISTS +# endif + +# ifdef _LIBCPP_CXX03_LANG +# define _LIBCPP_DECLARE_STRONG_ENUM(x) \ + struct _LIBCPP_TYPE_VIS x { \ + enum __lx +// clang-format off +# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \ + __lx __v_; \ + _LIBCPP_INLINE_VISIBILITY x(__lx __v) : __v_(__v) {} \ + _LIBCPP_INLINE_VISIBILITY explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \ + _LIBCPP_INLINE_VISIBILITY operator int() const { return __v_; } \ + }; +// clang-format on + +# else // _LIBCPP_CXX03_LANG +# define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_ENUM_VIS x +# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) +# endif // _LIBCPP_CXX03_LANG + +# if defined(__APPLE__) || defined(__FreeBSD__) || defined(_LIBCPP_MSVCRT_LIKE) || defined(__sun__) || \ + defined(__NetBSD__) +# define _LIBCPP_LOCALE__L_EXTENSIONS 1 +# endif + +# ifdef __FreeBSD__ +# define _DECLARE_C99_LDBL_MATH 1 +# endif + +// If we are getting operator new from the MSVC CRT, then allocation overloads +// for align_val_t were added in 19.12, aka VS 2017 version 15.3. +# if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912 +# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION +# elif defined(_LIBCPP_ABI_VCRUNTIME) && !defined(__cpp_aligned_new) +// We're deferring to Microsoft's STL to provide aligned new et al. We don't +// have it unless the language feature test macro is defined. +# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION +# elif defined(__MVS__) +# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION +# endif + +# if defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) || (!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606) +# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION +# endif + +// It is not yet possible to use aligned_alloc() on all Apple platforms since +// 10.15 was the first version to ship an implementation of aligned_alloc(). +# if defined(__APPLE__) +# if (defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && \ + __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101500) +# define _LIBCPP_HAS_NO_C11_ALIGNED_ALLOC +# endif +# elif defined(__ANDROID__) && __ANDROID_API__ < 28 +// Android only provides aligned_alloc when targeting API 28 or higher. +# define _LIBCPP_HAS_NO_C11_ALIGNED_ALLOC +# endif + +# if defined(__APPLE__) || defined(__FreeBSD__) +# define _LIBCPP_HAS_DEFAULTRUNELOCALE +# endif + +# if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__) +# define _LIBCPP_WCTYPE_IS_MASK +# endif + +# if _LIBCPP_STD_VER <= 17 || !defined(__cpp_char8_t) +# define _LIBCPP_HAS_NO_CHAR8_T +# endif + +// Deprecation macros. +// +// Deprecations warnings are always enabled, except when users explicitly opt-out +// by defining _LIBCPP_DISABLE_DEPRECATION_WARNINGS. +# if !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS) +# if __has_attribute(deprecated) +# define _LIBCPP_DEPRECATED __attribute__((deprecated)) +# define _LIBCPP_DEPRECATED_(m) __attribute__((deprecated(m))) +# elif _LIBCPP_STD_VER > 11 +# define _LIBCPP_DEPRECATED [[deprecated]] +# define _LIBCPP_DEPRECATED_(m) [[deprecated(m)]] +# else +# define _LIBCPP_DEPRECATED +# define _LIBCPP_DEPRECATED_(m) +# endif +# else +# define _LIBCPP_DEPRECATED +# define _LIBCPP_DEPRECATED_(m) +# endif + +# if !defined(_LIBCPP_CXX03_LANG) +# define _LIBCPP_DEPRECATED_IN_CXX11 _LIBCPP_DEPRECATED +# else +# define _LIBCPP_DEPRECATED_IN_CXX11 +# endif + +# if _LIBCPP_STD_VER > 11 +# define _LIBCPP_DEPRECATED_IN_CXX14 _LIBCPP_DEPRECATED +# else +# define _LIBCPP_DEPRECATED_IN_CXX14 +# endif + +# if _LIBCPP_STD_VER > 14 +# define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED +# else +# define _LIBCPP_DEPRECATED_IN_CXX17 +# endif + +# if _LIBCPP_STD_VER > 17 +# define _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_DEPRECATED +# else +# define _LIBCPP_DEPRECATED_IN_CXX20 +# endif + +#if _LIBCPP_STD_VER >= 23 +# define _LIBCPP_DEPRECATED_IN_CXX23 _LIBCPP_DEPRECATED +#else +# define _LIBCPP_DEPRECATED_IN_CXX23 +#endif + +# if !defined(_LIBCPP_HAS_NO_CHAR8_T) +# define _LIBCPP_DEPRECATED_WITH_CHAR8_T _LIBCPP_DEPRECATED +# else +# define _LIBCPP_DEPRECATED_WITH_CHAR8_T +# endif + +// Macros to enter and leave a state where deprecation warnings are suppressed. +# if defined(_LIBCPP_COMPILER_CLANG_BASED) || defined(_LIBCPP_COMPILER_GCC) +# define _LIBCPP_SUPPRESS_DEPRECATED_PUSH \ + _Pragma("GCC diagnostic push") _Pragma("GCC diagnostic ignored \"-Wdeprecated\"") \ + _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +# define _LIBCPP_SUPPRESS_DEPRECATED_POP _Pragma("GCC diagnostic pop") +# else +# define _LIBCPP_SUPPRESS_DEPRECATED_PUSH +# define _LIBCPP_SUPPRESS_DEPRECATED_POP +# endif + +# if _LIBCPP_STD_VER <= 11 +# define _LIBCPP_EXPLICIT_AFTER_CXX11 +# else +# define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit +# endif + +# if _LIBCPP_STD_VER > 11 +# define _LIBCPP_CONSTEXPR_SINCE_CXX14 constexpr +# else +# define _LIBCPP_CONSTEXPR_SINCE_CXX14 +# endif + +# if _LIBCPP_STD_VER > 14 +# define _LIBCPP_CONSTEXPR_SINCE_CXX17 constexpr +# else +# define _LIBCPP_CONSTEXPR_SINCE_CXX17 +# endif + +# if _LIBCPP_STD_VER > 17 +# define _LIBCPP_CONSTEXPR_SINCE_CXX20 constexpr +# else +# define _LIBCPP_CONSTEXPR_SINCE_CXX20 +# endif + +# if _LIBCPP_STD_VER > 20 +# define _LIBCPP_CONSTEXPR_SINCE_CXX23 constexpr +# else +# define _LIBCPP_CONSTEXPR_SINCE_CXX23 +# endif + +# if __has_cpp_attribute(nodiscard) +# define _LIBCPP_NODISCARD [[nodiscard]] +# else +// We can't use GCC's [[gnu::warn_unused_result]] and +// __attribute__((warn_unused_result)), because GCC does not silence them via +// (void) cast. +# define _LIBCPP_NODISCARD +# endif + +// _LIBCPP_NODISCARD_EXT may be used to apply [[nodiscard]] to entities not +// specified as such as an extension. +# if !defined(_LIBCPP_DISABLE_NODISCARD_EXT) +# define _LIBCPP_NODISCARD_EXT _LIBCPP_NODISCARD +# else +# define _LIBCPP_NODISCARD_EXT +# endif + +# if _LIBCPP_STD_VER > 17 || !defined(_LIBCPP_DISABLE_NODISCARD_EXT) +# define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD +# else +# define _LIBCPP_NODISCARD_AFTER_CXX17 +# endif + +# if __has_attribute(__no_destroy__) +# define _LIBCPP_NO_DESTROY __attribute__((__no_destroy__)) +# else +# define _LIBCPP_NO_DESTROY +# endif + +# ifndef _LIBCPP_HAS_NO_ASAN + extern "C" _LIBCPP_FUNC_VIS void + __sanitizer_annotate_contiguous_container(const void*, const void*, const void*, const void*); +# endif + +// Try to find out if RTTI is disabled. +# if !defined(__cpp_rtti) || __cpp_rtti < 199711L +# define _LIBCPP_NO_RTTI +# endif + +# ifndef _LIBCPP_WEAK +# define _LIBCPP_WEAK __attribute__((__weak__)) +# endif + +// Thread API +// clang-format off +# if !defined(_LIBCPP_HAS_NO_THREADS) && \ + !defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \ + !defined(_LIBCPP_HAS_THREAD_API_WIN32) && \ + !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) + +# if defined(__FreeBSD__) || \ + defined(__wasi__) || \ + defined(__NetBSD__) || \ + defined(__OpenBSD__) || \ + defined(__NuttX__) || \ + defined(__linux__) || \ + defined(__GNU__) || \ + defined(__APPLE__) || \ + defined(__sun__) || \ + defined(__MVS__) || \ + defined(_AIX) || \ + defined(__EMSCRIPTEN__) +// clang-format on +# define _LIBCPP_HAS_THREAD_API_PTHREAD +# elif defined(__Fuchsia__) +// TODO(44575): Switch to C11 thread API when possible. +# define _LIBCPP_HAS_THREAD_API_PTHREAD +# elif defined(_LIBCPP_WIN32API) +# define _LIBCPP_HAS_THREAD_API_WIN32 +# else +# error "No thread API" +# endif // _LIBCPP_HAS_THREAD_API +# endif // _LIBCPP_HAS_NO_THREADS + +# if defined(_LIBCPP_HAS_THREAD_API_PTHREAD) +# if defined(__ANDROID__) && __ANDROID_API__ >= 30 +# define _LIBCPP_HAS_COND_CLOCKWAIT +# elif defined(_LIBCPP_GLIBC_PREREQ) +# if _LIBCPP_GLIBC_PREREQ(2, 30) +# define _LIBCPP_HAS_COND_CLOCKWAIT +# endif +# endif +# endif + +# if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD) +# error _LIBCPP_HAS_THREAD_API_PTHREAD may only be defined when \ + _LIBCPP_HAS_NO_THREADS is not defined. +# endif + +# if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_EXTERNAL) +# error _LIBCPP_HAS_THREAD_API_EXTERNAL may not be defined when \ + _LIBCPP_HAS_NO_THREADS is defined. +# endif + +# if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS) +# error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \ + _LIBCPP_HAS_NO_THREADS is defined. +# endif + +# if !defined(_LIBCPP_HAS_NO_THREADS) && !defined(__STDCPP_THREADS__) +# define __STDCPP_THREADS__ 1 +# endif + +// The glibc and Bionic implementation of pthreads implements +// pthread_mutex_destroy as nop for regular mutexes. Additionally, Win32 +// mutexes have no destroy mechanism. +// +// This optimization can't be performed on Apple platforms, where +// pthread_mutex_destroy can allow the kernel to release resources. +// See https://llvm.org/D64298 for details. +// +// TODO(EricWF): Enable this optimization on Bionic after speaking to their +// respective stakeholders. +// clang-format off +# if (defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && defined(__GLIBC__)) || \ + (defined(_LIBCPP_HAS_THREAD_API_C11) && defined(__Fuchsia__)) || \ + defined(_LIBCPP_HAS_THREAD_API_WIN32) +// clang-format on +# define _LIBCPP_HAS_TRIVIAL_MUTEX_DESTRUCTION +# endif + +// Destroying a condvar is a nop on Windows. +// +// This optimization can't be performed on Apple platforms, where +// pthread_cond_destroy can allow the kernel to release resources. +// See https://llvm.org/D64298 for details. +// +// TODO(EricWF): This is potentially true for some pthread implementations +// as well. +# if (defined(_LIBCPP_HAS_THREAD_API_C11) && defined(__Fuchsia__)) || defined(_LIBCPP_HAS_THREAD_API_WIN32) +# define _LIBCPP_HAS_TRIVIAL_CONDVAR_DESTRUCTION +# endif + +// Some systems do not provide gets() in their C library, for security reasons. +# if defined(_LIBCPP_MSVCRT) || (defined(__FreeBSD_version) && __FreeBSD_version >= 1300043) || defined(__OpenBSD__) +# define _LIBCPP_C_HAS_NO_GETS +# endif + +# if defined(__BIONIC__) || defined(__NuttX__) || defined(__Fuchsia__) || defined(__wasi__) || \ + defined(_LIBCPP_HAS_MUSL_LIBC) || defined(__OpenBSD__) +# define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE +# endif + +# if __has_feature(cxx_atomic) || __has_extension(c_atomic) || __has_keyword(_Atomic) +# define _LIBCPP_HAS_C_ATOMIC_IMP +# elif defined(_LIBCPP_COMPILER_GCC) +# define _LIBCPP_HAS_GCC_ATOMIC_IMP +# endif + +# if !defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP) && \ + !defined(_LIBCPP_HAS_EXTERNAL_ATOMIC_IMP) +# define _LIBCPP_HAS_NO_ATOMIC_HEADER +# else +# ifndef _LIBCPP_ATOMIC_FLAG_TYPE +# define _LIBCPP_ATOMIC_FLAG_TYPE bool +# endif +# ifdef _LIBCPP_FREESTANDING +# define _LIBCPP_ATOMIC_ONLY_USE_BUILTINS +# endif +# endif + +# ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK +# define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK +# endif + +# if defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) +# if defined(__clang__) && __has_attribute(acquire_capability) +// Work around the attribute handling in clang. When both __declspec and +// __attribute__ are present, the processing goes awry preventing the definition +// of the types. In MinGW mode, __declspec evaluates to __attribute__, and thus +// combining the two does work. +# if !defined(_MSC_VER) +# define _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS +# endif +# endif +# endif + +# ifdef _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS +# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x) __attribute__((x)) +# else +# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x) +# endif + +# if _LIBCPP_STD_VER > 17 +# define _LIBCPP_CONSTINIT constinit +# elif __has_attribute(__require_constant_initialization__) +# define _LIBCPP_CONSTINIT __attribute__((__require_constant_initialization__)) +# else +# define _LIBCPP_CONSTINIT +# endif + +# if __has_attribute(__diagnose_if__) && !defined(_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS) +# define _LIBCPP_DIAGNOSE_WARNING(...) __attribute__((__diagnose_if__(__VA_ARGS__, "warning"))) +# else +# define _LIBCPP_DIAGNOSE_WARNING(...) +# endif + +// Use a function like macro to imply that it must be followed by a semicolon +# if __has_cpp_attribute(fallthrough) +# define _LIBCPP_FALLTHROUGH() [[fallthrough]] +# elif __has_attribute(__fallthrough__) +# define _LIBCPP_FALLTHROUGH() __attribute__((__fallthrough__)) +# else +# define _LIBCPP_FALLTHROUGH() ((void)0) +# endif + +# if __has_cpp_attribute(_Clang::__lifetimebound__) +# define _LIBCPP_LIFETIMEBOUND [[_Clang::__lifetimebound__]] +# else +# define _LIBCPP_LIFETIMEBOUND +# endif + +# if __has_attribute(__nodebug__) +# define _LIBCPP_NODEBUG __attribute__((__nodebug__)) +# else +# define _LIBCPP_NODEBUG +# endif + +# if __has_attribute(__standalone_debug__) +# define _LIBCPP_STANDALONE_DEBUG __attribute__((__standalone_debug__)) +# else +# define _LIBCPP_STANDALONE_DEBUG +# endif + +# if __has_attribute(__preferred_name__) +# define _LIBCPP_PREFERRED_NAME(x) __attribute__((__preferred_name__(x))) +# else +# define _LIBCPP_PREFERRED_NAME(x) +# endif + +// We often repeat things just for handling wide characters in the library. +// When wide characters are disabled, it can be useful to have a quick way of +// disabling it without having to resort to #if-#endif, which has a larger +// impact on readability. +# if defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS) +# define _LIBCPP_IF_WIDE_CHARACTERS(...) +# else +# define _LIBCPP_IF_WIDE_CHARACTERS(...) __VA_ARGS__ +# endif + +# if defined(_LIBCPP_ABI_MICROSOFT) && __has_declspec_attribute(empty_bases) +# define _LIBCPP_DECLSPEC_EMPTY_BASES __declspec(empty_bases) +# else +# define _LIBCPP_DECLSPEC_EMPTY_BASES +# endif + +# if defined(_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES) +# define _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR +# define _LIBCPP_ENABLE_CXX17_REMOVED_BINDERS +# define _LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE +# define _LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS +# define _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION +# endif // _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES + +# if defined(_LIBCPP_ENABLE_CXX20_REMOVED_FEATURES) +# define _LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS +# define _LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_VOID_SPECIALIZATION +# define _LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS +# define _LIBCPP_ENABLE_CXX20_REMOVED_NEGATORS +# define _LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR +# define _LIBCPP_ENABLE_CXX20_REMOVED_TYPE_TRAITS +# endif // _LIBCPP_ENABLE_CXX20_REMOVED_FEATURES + +# define _LIBCPP_PUSH_MACROS _Pragma("push_macro(\"min\")") _Pragma("push_macro(\"max\")") +# define _LIBCPP_POP_MACROS _Pragma("pop_macro(\"min\")") _Pragma("pop_macro(\"max\")") + +# ifndef _LIBCPP_NO_AUTO_LINK +# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY) +# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) +# pragma comment(lib, "c++.lib") +# else +# pragma comment(lib, "libc++.lib") +# endif +# endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY) +# endif // _LIBCPP_NO_AUTO_LINK + +// Configures the fopen close-on-exec mode character, if any. This string will +// be appended to any mode string used by fstream for fopen/fdopen. +// +// Not all platforms support this, but it helps avoid fd-leaks on platforms that +// do. +# if defined(__BIONIC__) +# define _LIBCPP_FOPEN_CLOEXEC_MODE "e" +# else +# define _LIBCPP_FOPEN_CLOEXEC_MODE +# endif + +// Support for _FILE_OFFSET_BITS=64 landed gradually in Android, so the full set +// of functions used in cstdio may not be available for low API levels when +// using 64-bit file offsets on LP32. +# if defined(__BIONIC__) && defined(__USE_FILE_OFFSET64) && __ANDROID_API__ < 24 +# define _LIBCPP_HAS_NO_FGETPOS_FSETPOS +# endif + +# if __has_attribute(__init_priority__) +# define _LIBCPP_INIT_PRIORITY_MAX __attribute__((__init_priority__(100))) +# else +# define _LIBCPP_INIT_PRIORITY_MAX +# endif + +# if __has_attribute(__format__) +// The attribute uses 1-based indices for ordinary and static member functions. +// The attribute uses 2-based indices for non-static member functions. +# define _LIBCPP_ATTRIBUTE_FORMAT(archetype, format_string_index, first_format_arg_index) \ + __attribute__((__format__(archetype, format_string_index, first_format_arg_index))) +# else +# define _LIBCPP_ATTRIBUTE_FORMAT(archetype, format_string_index, first_format_arg_index) /* nothing */ +# endif + +# if __has_cpp_attribute(msvc::no_unique_address) +// MSVC implements [[no_unique_address]] as a silent no-op currently. +// (If/when MSVC breaks its C++ ABI, it will be changed to work as intended.) +// However, MSVC implements [[msvc::no_unique_address]] which does what +// [[no_unique_address]] is supposed to do, in general. + +// Clang-cl does not yet (14.0) implement either [[no_unique_address]] or +// [[msvc::no_unique_address]] though. If/when it does implement +// [[msvc::no_unique_address]], this should be preferred though. +# define _LIBCPP_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]] +# elif __has_cpp_attribute(no_unique_address) +# define _LIBCPP_NO_UNIQUE_ADDRESS [[no_unique_address]] +# else +# define _LIBCPP_NO_UNIQUE_ADDRESS /* nothing */ +// Note that this can be replaced by #error as soon as clang-cl +// implements msvc::no_unique_address, since there should be no C++20 +// compiler that doesn't support one of the two attributes at that point. +// We generally don't want to use this macro outside of C++20-only code, +// because using it conditionally in one language version only would make +// the ABI inconsistent. +# endif + +# ifdef _LIBCPP_COMPILER_CLANG_BASED +# define _LIBCPP_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") +# define _LIBCPP_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str) _Pragma(_LIBCPP_TOSTRING(clang diagnostic ignored str)) +# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str) +# elif defined(_LIBCPP_COMPILER_GCC) +# define _LIBCPP_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") +# define _LIBCPP_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str) +# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str) _Pragma(_LIBCPP_TOSTRING(GCC diagnostic ignored str)) +# else +# define _LIBCPP_DIAGNOSTIC_PUSH +# define _LIBCPP_DIAGNOSTIC_POP +# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED(str) +# define _LIBCPP_GCC_DIAGNOSTIC_IGNORED(str) +# endif + +# if defined(_AIX) && !defined(_LIBCPP_COMPILER_GCC) +# define _LIBCPP_PACKED_BYTE_FOR_AIX _Pragma("pack(1)") +# define _LIBCPP_PACKED_BYTE_FOR_AIX_END _Pragma("pack(pop)") +# else +# define _LIBCPP_PACKED_BYTE_FOR_AIX /* empty */ +# define _LIBCPP_PACKED_BYTE_FOR_AIX_END /* empty */ +# endif + +# if __has_attribute(__packed__) +# define _LIBCPP_PACKED __attribute__((__packed__)) +# else +# define _LIBCPP_PACKED +# endif + +// c8rtomb() and mbrtoc8() were added in C++20 and C23. Support for these +// functions is gradually being added to existing C libraries. The conditions +// below check for known C library versions and conditions under which these +// functions are declared by the C library. +# define _LIBCPP_HAS_NO_C8RTOMB_MBRTOC8 +// GNU libc 2.36 and newer declare c8rtomb() and mbrtoc8() in C++ modes if +// __cpp_char8_t is defined or if C2X extensions are enabled. Unfortunately, +// determining the latter depends on internal GNU libc details. If the +// __cpp_char8_t feature test macro is not defined, then a char8_t typedef +// will be declared as well. +# if defined(_LIBCPP_GLIBC_PREREQ) && defined(__GLIBC_USE) +# if _LIBCPP_GLIBC_PREREQ(2, 36) && (defined(__cpp_char8_t) || __GLIBC_USE(ISOC2X)) +# undef _LIBCPP_HAS_NO_C8RTOMB_MBRTOC8 +# endif +# endif + +// There are a handful of public standard library types that are intended to +// support CTAD but don't need any explicit deduction guides to do so. This +// macro is used to mark them as such, which suppresses the +// '-Wctad-maybe-unsupported' compiler warning when CTAD is used in user code +// with these classes. +#if _LIBCPP_STD_VER >= 17 +# define _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(_ClassName) \ + template \ + _ClassName(typename _Tag::__allow_ctad...) -> _ClassName<_Tag...> +#else +# define _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(_ClassName) static_assert(true, "") +#endif + +#endif // __cplusplus + +#endif // _LIBCPP___CONFIG diff --git a/app/src/main/cpp/libcxx/include/__config_site b/app/src/main/cpp/libcxx/include/__config_site new file mode 100644 index 0000000..76d809b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__config_site @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONFIG_SITE +#define _LIBCPP___CONFIG_SITE + +/* #undef _LIBCPP_ABI_VERSION */ +/* #undef _LIBCPP_ABI_NAMESPACE */ +/* #undef _LIBCPP_ABI_FORCE_ITANIUM */ +/* #undef _LIBCPP_ABI_FORCE_MICROSOFT */ +/* #undef _LIBCPP_HAS_NO_THREADS */ +/* #undef _LIBCPP_HAS_NO_MONOTONIC_CLOCK */ +/* #undef _LIBCPP_HAS_MUSL_LIBC */ +/* #undef _LIBCPP_HAS_THREAD_API_PTHREAD */ +/* #undef _LIBCPP_HAS_THREAD_API_EXTERNAL */ +/* #undef _LIBCPP_HAS_THREAD_API_WIN32 */ +/* #undef _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL */ +/* #undef _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS */ +#define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS +/* #undef _LIBCPP_NO_VCRUNTIME */ +/* #undef _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION */ +/* #undef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY */ +/* #undef _LIBCPP_HAS_PARALLEL_ALGORITHMS */ +/* #undef _LIBCPP_HAS_NO_RANDOM_DEVICE */ +/* #undef _LIBCPP_HAS_NO_LOCALIZATION */ +/* #undef _LIBCPP_HAS_NO_FSTREAM */ +/* #undef _LIBCPP_HAS_NO_WIDE_CHARACTERS */ +/* #undef _LIBCPP_ENABLE_ASSERTIONS_DEFAULT */ +/* #undef _LIBCPP_ENABLE_DEBUG_MODE */ + + + + +#endif // _LIBCPP___CONFIG_SITE diff --git a/app/src/main/cpp/libcxx/include/__config_site.in b/app/src/main/cpp/libcxx/include/__config_site.in new file mode 100644 index 0000000..2ff6725 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__config_site.in @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___CONFIG_SITE +#define _LIBCPP___CONFIG_SITE + +#cmakedefine _LIBCPP_ABI_VERSION @_LIBCPP_ABI_VERSION@ +#cmakedefine _LIBCPP_ABI_NAMESPACE @_LIBCPP_ABI_NAMESPACE@ +#cmakedefine _LIBCPP_ABI_FORCE_ITANIUM +#cmakedefine _LIBCPP_ABI_FORCE_MICROSOFT +#cmakedefine _LIBCPP_HAS_NO_THREADS +#cmakedefine _LIBCPP_HAS_NO_MONOTONIC_CLOCK +#cmakedefine _LIBCPP_HAS_MUSL_LIBC +#cmakedefine _LIBCPP_HAS_THREAD_API_PTHREAD +#cmakedefine _LIBCPP_HAS_THREAD_API_EXTERNAL +#cmakedefine _LIBCPP_HAS_THREAD_API_WIN32 +#cmakedefine _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL +#cmakedefine _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS +#cmakedefine _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS +#cmakedefine _LIBCPP_NO_VCRUNTIME +#cmakedefine _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION @_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION@ +#cmakedefine _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +#cmakedefine _LIBCPP_HAS_PARALLEL_ALGORITHMS +#cmakedefine _LIBCPP_HAS_NO_RANDOM_DEVICE +#cmakedefine _LIBCPP_HAS_NO_LOCALIZATION +#cmakedefine _LIBCPP_HAS_NO_FSTREAM +#cmakedefine _LIBCPP_HAS_NO_WIDE_CHARACTERS +#cmakedefine01 _LIBCPP_ENABLE_ASSERTIONS_DEFAULT +#cmakedefine _LIBCPP_ENABLE_DEBUG_MODE + +// __USE_MINGW_ANSI_STDIO gets redefined on MinGW +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wmacro-redefined" +#endif + +@_LIBCPP_ABI_DEFINES@ +@_LIBCPP_EXTRA_SITE_DEFINES@ + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + +#endif // _LIBCPP___CONFIG_SITE diff --git a/app/src/main/cpp/libcxx/include/__coroutine/coroutine_handle.h b/app/src/main/cpp/libcxx/include/__coroutine/coroutine_handle.h new file mode 100644 index 0000000..0a6cc1c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__coroutine/coroutine_handle.h @@ -0,0 +1,203 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COROUTINE_COROUTINE_HANDLE_H +#define _LIBCPP___COROUTINE_COROUTINE_HANDLE_H + +#include <__assert> +#include <__config> +#include <__functional/hash.h> +#include <__memory/addressof.h> +#include <__type_traits/remove_cv.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +// [coroutine.handle] +template +struct _LIBCPP_TEMPLATE_VIS coroutine_handle; + +template <> +struct _LIBCPP_TEMPLATE_VIS coroutine_handle { +public: + // [coroutine.handle.con], construct/reset + _LIBCPP_HIDE_FROM_ABI + constexpr coroutine_handle() noexcept = default; + + _LIBCPP_HIDE_FROM_ABI + constexpr coroutine_handle(nullptr_t) noexcept {} + + _LIBCPP_HIDE_FROM_ABI + coroutine_handle& operator=(nullptr_t) noexcept { + __handle_ = nullptr; + return *this; + } + + // [coroutine.handle.export.import], export/import + _LIBCPP_HIDE_FROM_ABI + constexpr void* address() const noexcept { return __handle_; } + + _LIBCPP_HIDE_FROM_ABI + static constexpr coroutine_handle from_address(void* __addr) noexcept { + coroutine_handle __tmp; + __tmp.__handle_ = __addr; + return __tmp; + } + + // [coroutine.handle.observers], observers + _LIBCPP_HIDE_FROM_ABI + constexpr explicit operator bool() const noexcept { + return __handle_ != nullptr; + } + + _LIBCPP_HIDE_FROM_ABI + bool done() const { + _LIBCPP_ASSERT(__is_suspended(), "done() can be called only on suspended coroutines"); + return __builtin_coro_done(__handle_); + } + + // [coroutine.handle.resumption], resumption + _LIBCPP_HIDE_FROM_ABI + void operator()() const { resume(); } + + _LIBCPP_HIDE_FROM_ABI + void resume() const { + _LIBCPP_ASSERT(__is_suspended(), "resume() can be called only on suspended coroutines"); + _LIBCPP_ASSERT(!done(), "resume() has undefined behavior when the coroutine is done"); + __builtin_coro_resume(__handle_); + } + + _LIBCPP_HIDE_FROM_ABI + void destroy() const { + _LIBCPP_ASSERT(__is_suspended(), "destroy() can be called only on suspended coroutines"); + __builtin_coro_destroy(__handle_); + } + +private: + bool __is_suspended() const { + // FIXME actually implement a check for if the coro is suspended. + return __handle_ != nullptr; + } + + void* __handle_ = nullptr; +}; + +// [coroutine.handle.compare] +inline _LIBCPP_HIDE_FROM_ABI +constexpr bool operator==(coroutine_handle<> __x, coroutine_handle<> __y) noexcept { + return __x.address() == __y.address(); +} +inline _LIBCPP_HIDE_FROM_ABI +constexpr strong_ordering operator<=>(coroutine_handle<> __x, coroutine_handle<> __y) noexcept { + return compare_three_way()(__x.address(), __y.address()); +} + +template +struct _LIBCPP_TEMPLATE_VIS coroutine_handle { +public: + // [coroutine.handle.con], construct/reset + _LIBCPP_HIDE_FROM_ABI + constexpr coroutine_handle() noexcept = default; + + _LIBCPP_HIDE_FROM_ABI + constexpr coroutine_handle(nullptr_t) noexcept {} + + _LIBCPP_HIDE_FROM_ABI + static coroutine_handle from_promise(_Promise& __promise) { + using _RawPromise = __remove_cv_t<_Promise>; + coroutine_handle __tmp; + __tmp.__handle_ = + __builtin_coro_promise(_VSTD::addressof(const_cast<_RawPromise&>(__promise)), alignof(_Promise), true); + return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI + coroutine_handle& operator=(nullptr_t) noexcept { + __handle_ = nullptr; + return *this; + } + + // [coroutine.handle.export.import], export/import + _LIBCPP_HIDE_FROM_ABI + constexpr void* address() const noexcept { return __handle_; } + + _LIBCPP_HIDE_FROM_ABI + static constexpr coroutine_handle from_address(void* __addr) noexcept { + coroutine_handle __tmp; + __tmp.__handle_ = __addr; + return __tmp; + } + + // [coroutine.handle.conv], conversion + _LIBCPP_HIDE_FROM_ABI + constexpr operator coroutine_handle<>() const noexcept { + return coroutine_handle<>::from_address(address()); + } + + // [coroutine.handle.observers], observers + _LIBCPP_HIDE_FROM_ABI + constexpr explicit operator bool() const noexcept { + return __handle_ != nullptr; + } + + _LIBCPP_HIDE_FROM_ABI + bool done() const { + _LIBCPP_ASSERT(__is_suspended(), "done() can be called only on suspended coroutines"); + return __builtin_coro_done(__handle_); + } + + // [coroutine.handle.resumption], resumption + _LIBCPP_HIDE_FROM_ABI + void operator()() const { resume(); } + + _LIBCPP_HIDE_FROM_ABI + void resume() const { + _LIBCPP_ASSERT(__is_suspended(), "resume() can be called only on suspended coroutines"); + _LIBCPP_ASSERT(!done(), "resume() has undefined behavior when the coroutine is done"); + __builtin_coro_resume(__handle_); + } + + _LIBCPP_HIDE_FROM_ABI + void destroy() const { + _LIBCPP_ASSERT(__is_suspended(), "destroy() can be called only on suspended coroutines"); + __builtin_coro_destroy(__handle_); + } + + // [coroutine.handle.promise], promise access + _LIBCPP_HIDE_FROM_ABI + _Promise& promise() const { + return *static_cast<_Promise*>(__builtin_coro_promise(this->__handle_, alignof(_Promise), false)); + } + +private: + bool __is_suspended() const { + // FIXME actually implement a check for if the coro is suspended. + return __handle_ != nullptr; + } + void* __handle_ = nullptr; +}; + +// [coroutine.handle.hash] +template +struct hash> { + _LIBCPP_HIDE_FROM_ABI + size_t operator()(const coroutine_handle<_Tp>& __v) const noexcept { return hash()(__v.address()); } +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // __LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___COROUTINE_COROUTINE_HANDLE_H diff --git a/app/src/main/cpp/libcxx/include/__coroutine/coroutine_traits.h b/app/src/main/cpp/libcxx/include/__coroutine/coroutine_traits.h new file mode 100644 index 0000000..d513075 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__coroutine/coroutine_traits.h @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COROUTINE_COROUTINE_TRAITS_H +#define _LIBCPP___COROUTINE_COROUTINE_TRAITS_H + +#include <__config> +#include <__type_traits/void_t.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +// [coroutine.traits] +// [coroutine.traits.primary] +// The header defined the primary template coroutine_traits such that +// if ArgTypes is a parameter pack of types and if the qualified-id R::promise_type +// is valid and denotes a type ([temp.deduct]), then coroutine_traits +// has the following publicly accessible memebr: +// +// using promise_type = typename R::promise_type; +// +// Otherwise, coroutine_traits has no members. +template +struct __coroutine_traits_sfinae {}; + +template +struct __coroutine_traits_sfinae< + _Tp, __void_t > +{ + using promise_type = typename _Tp::promise_type; +}; + +template +struct coroutine_traits + : public __coroutine_traits_sfinae<_Ret> +{ +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // __LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___COROUTINE_COROUTINE_TRAITS_H diff --git a/app/src/main/cpp/libcxx/include/__coroutine/noop_coroutine_handle.h b/app/src/main/cpp/libcxx/include/__coroutine/noop_coroutine_handle.h new file mode 100644 index 0000000..2993047 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__coroutine/noop_coroutine_handle.h @@ -0,0 +1,112 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___COROUTINE_NOOP_COROUTINE_HANDLE_H +#define _LIBCPP___COROUTINE_NOOP_COROUTINE_HANDLE_H + +#include <__config> +#include <__coroutine/coroutine_handle.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if __has_builtin(__builtin_coro_noop) || defined(_LIBCPP_COMPILER_GCC) + +// [coroutine.noop] +// [coroutine.promise.noop] +struct noop_coroutine_promise {}; + +// [coroutine.handle.noop] +template <> +struct _LIBCPP_TEMPLATE_VIS coroutine_handle { +public: + // [coroutine.handle.noop.conv], conversion + _LIBCPP_HIDE_FROM_ABI + constexpr operator coroutine_handle<>() const noexcept { + return coroutine_handle<>::from_address(address()); + } + + // [coroutine.handle.noop.observers], observers + _LIBCPP_HIDE_FROM_ABI + constexpr explicit operator bool() const noexcept { return true; } + _LIBCPP_HIDE_FROM_ABI + constexpr bool done() const noexcept { return false; } + + // [coroutine.handle.noop.resumption], resumption + _LIBCPP_HIDE_FROM_ABI + constexpr void operator()() const noexcept {} + _LIBCPP_HIDE_FROM_ABI + constexpr void resume() const noexcept {} + _LIBCPP_HIDE_FROM_ABI + constexpr void destroy() const noexcept {} + + // [coroutine.handle.noop.promise], promise access + _LIBCPP_HIDE_FROM_ABI + noop_coroutine_promise& promise() const noexcept { + return *static_cast( + __builtin_coro_promise(this->__handle_, alignof(noop_coroutine_promise), false)); + } + + // [coroutine.handle.noop.address], address + _LIBCPP_HIDE_FROM_ABI + constexpr void* address() const noexcept { return __handle_; } + +private: + _LIBCPP_HIDE_FROM_ABI + friend coroutine_handle noop_coroutine() noexcept; + +#if __has_builtin(__builtin_coro_noop) + _LIBCPP_HIDE_FROM_ABI coroutine_handle() noexcept { + this->__handle_ = __builtin_coro_noop(); + } + + void* __handle_ = nullptr; + +#elif defined(_LIBCPP_COMPILER_GCC) + // GCC doesn't implement __builtin_coro_noop(). + // Construct the coroutine frame manually instead. + struct __noop_coroutine_frame_ty_ { + static void __dummy_resume_destroy_func() { } + + void (*__resume_)() = __dummy_resume_destroy_func; + void (*__destroy_)() = __dummy_resume_destroy_func; + struct noop_coroutine_promise __promise_; + }; + + static __noop_coroutine_frame_ty_ __noop_coroutine_frame_; + + void* __handle_ = &__noop_coroutine_frame_; + + _LIBCPP_HIDE_FROM_ABI coroutine_handle() noexcept = default; + +#endif // __has_builtin(__builtin_coro_noop) +}; + +using noop_coroutine_handle = coroutine_handle; + +#if defined(_LIBCPP_COMPILER_GCC) +inline noop_coroutine_handle::__noop_coroutine_frame_ty_ + noop_coroutine_handle::__noop_coroutine_frame_{}; +#endif + +// [coroutine.noop.coroutine] +inline _LIBCPP_HIDE_FROM_ABI +noop_coroutine_handle noop_coroutine() noexcept { return noop_coroutine_handle(); } + +#endif // __has_builtin(__builtin_coro_noop) || defined(_LIBCPP_COMPILER_GCC) + +_LIBCPP_END_NAMESPACE_STD + +#endif // __LIBCPP_STD_VER > 17 + +#endif // _LIBCPP___COROUTINE_NOOP_COROUTINE_HANDLE_H diff --git a/app/src/main/cpp/libcxx/include/__coroutine/trivial_awaitables.h b/app/src/main/cpp/libcxx/include/__coroutine/trivial_awaitables.h new file mode 100644 index 0000000..bbbae7a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__coroutine/trivial_awaitables.h @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef __LIBCPP___COROUTINE_TRIVIAL_AWAITABLES_H +#define __LIBCPP___COROUTINE_TRIVIAL_AWAITABLES_H + +#include <__config> +#include <__coroutine/coroutine_handle.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER > 17 + +_LIBCPP_BEGIN_NAMESPACE_STD + +// [coroutine.trivial.awaitables] +struct suspend_never { + _LIBCPP_HIDE_FROM_ABI + constexpr bool await_ready() const noexcept { return true; } + _LIBCPP_HIDE_FROM_ABI + constexpr void await_suspend(coroutine_handle<>) const noexcept {} + _LIBCPP_HIDE_FROM_ABI + constexpr void await_resume() const noexcept {} +}; + +struct suspend_always { + _LIBCPP_HIDE_FROM_ABI + constexpr bool await_ready() const noexcept { return false; } + _LIBCPP_HIDE_FROM_ABI + constexpr void await_suspend(coroutine_handle<>) const noexcept {} + _LIBCPP_HIDE_FROM_ABI + constexpr void await_resume() const noexcept {} +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // __LIBCPP_STD_VER > 17 + +#endif // __LIBCPP___COROUTINE_TRIVIAL_AWAITABLES_H diff --git a/app/src/main/cpp/libcxx/include/__debug b/app/src/main/cpp/libcxx/include/__debug new file mode 100644 index 0000000..140cc91 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__debug @@ -0,0 +1,266 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___DEBUG +#define _LIBCPP___DEBUG + +#include <__assert> +#include <__config> +#include <__type_traits/is_constant_evaluated.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if defined(_LIBCPP_ENABLE_DEBUG_MODE) && !defined(_LIBCPP_CXX03_LANG) && !defined(_LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY) +# define _LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY +#endif + +#if defined(_LIBCPP_ENABLE_DEBUG_MODE) && !defined(_LIBCPP_DEBUG_ITERATOR_BOUNDS_CHECKING) +# define _LIBCPP_DEBUG_ITERATOR_BOUNDS_CHECKING +#endif + +#ifdef _LIBCPP_ENABLE_DEBUG_MODE +# define _LIBCPP_DEBUG_ASSERT(x, m) _LIBCPP_ASSERT(::std::__libcpp_is_constant_evaluated() || (x), m) +#else +# define _LIBCPP_DEBUG_ASSERT(x, m) ((void)0) +#endif + +#if defined(_LIBCPP_ENABLE_DEBUG_MODE) || defined(_LIBCPP_BUILDING_LIBRARY) + +_LIBCPP_BEGIN_NAMESPACE_STD + +struct _LIBCPP_TYPE_VIS __c_node; + +struct _LIBCPP_TYPE_VIS __i_node +{ + void* __i_; + __i_node* __next_; + __c_node* __c_; + + __i_node(const __i_node&) = delete; + __i_node& operator=(const __i_node&) = delete; + + _LIBCPP_INLINE_VISIBILITY + __i_node(void* __i, __i_node* __next, __c_node* __c) + : __i_(__i), __next_(__next), __c_(__c) {} + ~__i_node(); +}; + +struct _LIBCPP_TYPE_VIS __c_node +{ + void* __c_; + __c_node* __next_; + __i_node** beg_; + __i_node** end_; + __i_node** cap_; + + __c_node(const __c_node&) = delete; + __c_node& operator=(const __c_node&) = delete; + + _LIBCPP_INLINE_VISIBILITY + explicit __c_node(void* __c, __c_node* __next) + : __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {} + virtual ~__c_node(); + + virtual bool __dereferenceable(const void*) const = 0; + virtual bool __decrementable(const void*) const = 0; + virtual bool __addable(const void*, ptrdiff_t) const = 0; + virtual bool __subscriptable(const void*, ptrdiff_t) const = 0; + + void __add(__i_node* __i); + _LIBCPP_HIDDEN void __remove(__i_node* __i); +}; + +template +struct _C_node + : public __c_node +{ + explicit _C_node(void* __c, __c_node* __n) + : __c_node(__c, __n) {} + + bool __dereferenceable(const void*) const override; + bool __decrementable(const void*) const override; + bool __addable(const void*, ptrdiff_t) const override; + bool __subscriptable(const void*, ptrdiff_t) const override; +}; + +template +inline bool +_C_node<_Cont>::__dereferenceable(const void* __i) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__dereferenceable(__j); +} + +template +inline bool +_C_node<_Cont>::__decrementable(const void* __i) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__decrementable(__j); +} + +template +inline bool +_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__addable(__j, __n); +} + +template +inline bool +_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const +{ + typedef typename _Cont::const_iterator iterator; + const iterator* __j = static_cast(__i); + _Cont* _Cp = static_cast<_Cont*>(__c_); + return _Cp->__subscriptable(__j, __n); +} + +class _LIBCPP_TYPE_VIS __libcpp_db +{ + __c_node** __cbeg_; + __c_node** __cend_; + size_t __csz_; + __i_node** __ibeg_; + __i_node** __iend_; + size_t __isz_; + + explicit __libcpp_db(); +public: + __libcpp_db(const __libcpp_db&) = delete; + __libcpp_db& operator=(const __libcpp_db&) = delete; + + ~__libcpp_db(); + + class __db_c_iterator; + class __db_c_const_iterator; + class __db_i_iterator; + class __db_i_const_iterator; + + __db_c_const_iterator __c_end() const; + __db_i_const_iterator __i_end() const; + + typedef __c_node*(_InsertConstruct)(void*, void*, __c_node*); + + template + _LIBCPP_INLINE_VISIBILITY static __c_node* __create_C_node(void *__mem, void *__c, __c_node *__next) { + return ::new (__mem) _C_node<_Cont>(__c, __next); + } + + template + _LIBCPP_INLINE_VISIBILITY + void __insert_c(_Cont* __c) + { + __insert_c(static_cast(__c), &__create_C_node<_Cont>); + } + + void __insert_i(void* __i); + void __insert_c(void* __c, _InsertConstruct* __fn); + void __erase_c(void* __c); + + void __insert_ic(void* __i, const void* __c); + void __iterator_copy(void* __i, const void* __i0); + void __erase_i(void* __i); + + void* __find_c_from_i(void* __i) const; + void __invalidate_all(void* __c); + __c_node* __find_c_and_lock(void* __c) const; + __c_node* __find_c(void* __c) const; + void unlock() const; + + void swap(void* __c1, void* __c2); + + + bool __dereferenceable(const void* __i) const; + bool __decrementable(const void* __i) const; + bool __addable(const void* __i, ptrdiff_t __n) const; + bool __subscriptable(const void* __i, ptrdiff_t __n) const; + bool __less_than_comparable(const void* __i, const void* __j) const; +private: + _LIBCPP_HIDDEN + __i_node* __insert_iterator(void* __i); + _LIBCPP_HIDDEN + __i_node* __find_iterator(const void* __i) const; + + friend _LIBCPP_FUNC_VIS __libcpp_db* __get_db(); +}; + +_LIBCPP_FUNC_VIS __libcpp_db* __get_db(); +_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db(); + +_LIBCPP_END_NAMESPACE_STD + +#endif // defined(_LIBCPP_ENABLE_DEBUG_MODE) || defined(_LIBCPP_BUILDING_LIBRARY) + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_insert_c(_Tp* __c) { +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + if (!__libcpp_is_constant_evaluated()) + __get_db()->__insert_c(__c); +#else + (void)(__c); +#endif +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_insert_i(_Tp* __i) { +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + if (!__libcpp_is_constant_evaluated()) + __get_db()->__insert_i(__i); +#else + (void)(__i); +#endif +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_erase_c(_Tp* __c) { +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + if (!__libcpp_is_constant_evaluated()) + __get_db()->__erase_c(__c); +#else + (void)(__c); +#endif +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_swap(_Tp* __lhs, _Tp* __rhs) { +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + if (!__libcpp_is_constant_evaluated()) + __get_db()->swap(__lhs, __rhs); +#else + (void)(__lhs); + (void)(__rhs); +#endif +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 inline void __debug_db_invalidate_all(_Tp* __c) { +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + if (!__libcpp_is_constant_evaluated()) + __get_db()->__invalidate_all(__c); +#else + (void)(__c); +#endif +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___DEBUG diff --git a/app/src/main/cpp/libcxx/include/__debug_utils/randomize_range.h b/app/src/main/cpp/libcxx/include/__debug_utils/randomize_range.h new file mode 100644 index 0000000..dce6192 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__debug_utils/randomize_range.h @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___LIBCXX_DEBUG_RANDOMIZE_RANGE_H +#define _LIBCPP___LIBCXX_DEBUG_RANDOMIZE_RANGE_H + +#include <__config> + +#ifdef _LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY +# include <__algorithm/shuffle.h> +# include <__type_traits/is_constant_evaluated.h> +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 +void __debug_randomize_range(_Iterator __first, _Sentinel __last) { +#ifdef _LIBCPP_DEBUG_RANDOMIZE_UNSPECIFIED_STABILITY +# ifdef _LIBCPP_CXX03_LANG +# error Support for unspecified stability is only for C++11 and higher +# endif + + if (!__libcpp_is_constant_evaluated()) + std::__shuffle<_AlgPolicy>(__first, __last, __libcpp_debug_randomizer()); +#else + (void)__first; + (void)__last; +#endif +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___LIBCXX_DEBUG_RANDOMIZE_RANGE_H diff --git a/app/src/main/cpp/libcxx/include/__errc b/app/src/main/cpp/libcxx/include/__errc new file mode 100644 index 0000000..17bbe0e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__errc @@ -0,0 +1,217 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ERRC +#define _LIBCPP___ERRC + +/* + system_error synopsis + +namespace std +{ + +enum class errc +{ + address_family_not_supported, // EAFNOSUPPORT + address_in_use, // EADDRINUSE + address_not_available, // EADDRNOTAVAIL + already_connected, // EISCONN + argument_list_too_long, // E2BIG + argument_out_of_domain, // EDOM + bad_address, // EFAULT + bad_file_descriptor, // EBADF + bad_message, // EBADMSG + broken_pipe, // EPIPE + connection_aborted, // ECONNABORTED + connection_already_in_progress, // EALREADY + connection_refused, // ECONNREFUSED + connection_reset, // ECONNRESET + cross_device_link, // EXDEV + destination_address_required, // EDESTADDRREQ + device_or_resource_busy, // EBUSY + directory_not_empty, // ENOTEMPTY + executable_format_error, // ENOEXEC + file_exists, // EEXIST + file_too_large, // EFBIG + filename_too_long, // ENAMETOOLONG + function_not_supported, // ENOSYS + host_unreachable, // EHOSTUNREACH + identifier_removed, // EIDRM + illegal_byte_sequence, // EILSEQ + inappropriate_io_control_operation, // ENOTTY + interrupted, // EINTR + invalid_argument, // EINVAL + invalid_seek, // ESPIPE + io_error, // EIO + is_a_directory, // EISDIR + message_size, // EMSGSIZE + network_down, // ENETDOWN + network_reset, // ENETRESET + network_unreachable, // ENETUNREACH + no_buffer_space, // ENOBUFS + no_child_process, // ECHILD + no_link, // ENOLINK + no_lock_available, // ENOLCK + no_message_available, // ENODATA + no_message, // ENOMSG + no_protocol_option, // ENOPROTOOPT + no_space_on_device, // ENOSPC + no_stream_resources, // ENOSR + no_such_device_or_address, // ENXIO + no_such_device, // ENODEV + no_such_file_or_directory, // ENOENT + no_such_process, // ESRCH + not_a_directory, // ENOTDIR + not_a_socket, // ENOTSOCK + not_a_stream, // ENOSTR + not_connected, // ENOTCONN + not_enough_memory, // ENOMEM + not_supported, // ENOTSUP + operation_canceled, // ECANCELED + operation_in_progress, // EINPROGRESS + operation_not_permitted, // EPERM + operation_not_supported, // EOPNOTSUPP + operation_would_block, // EWOULDBLOCK + owner_dead, // EOWNERDEAD + permission_denied, // EACCES + protocol_error, // EPROTO + protocol_not_supported, // EPROTONOSUPPORT + read_only_file_system, // EROFS + resource_deadlock_would_occur, // EDEADLK + resource_unavailable_try_again, // EAGAIN + result_out_of_range, // ERANGE + state_not_recoverable, // ENOTRECOVERABLE + stream_timeout, // ETIME + text_file_busy, // ETXTBSY + timed_out, // ETIMEDOUT + too_many_files_open_in_system, // ENFILE + too_many_files_open, // EMFILE + too_many_links, // EMLINK + too_many_symbolic_link_levels, // ELOOP + value_too_large, // EOVERFLOW + wrong_protocol_type // EPROTOTYPE +}; + +*/ + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Some error codes are not present on all platforms, so we provide equivalents +// for them: + +//enum class errc +_LIBCPP_DECLARE_STRONG_ENUM(errc) +{ + address_family_not_supported = EAFNOSUPPORT, + address_in_use = EADDRINUSE, + address_not_available = EADDRNOTAVAIL, + already_connected = EISCONN, + argument_list_too_long = E2BIG, + argument_out_of_domain = EDOM, + bad_address = EFAULT, + bad_file_descriptor = EBADF, + bad_message = EBADMSG, + broken_pipe = EPIPE, + connection_aborted = ECONNABORTED, + connection_already_in_progress = EALREADY, + connection_refused = ECONNREFUSED, + connection_reset = ECONNRESET, + cross_device_link = EXDEV, + destination_address_required = EDESTADDRREQ, + device_or_resource_busy = EBUSY, + directory_not_empty = ENOTEMPTY, + executable_format_error = ENOEXEC, + file_exists = EEXIST, + file_too_large = EFBIG, + filename_too_long = ENAMETOOLONG, + function_not_supported = ENOSYS, + host_unreachable = EHOSTUNREACH, + identifier_removed = EIDRM, + illegal_byte_sequence = EILSEQ, + inappropriate_io_control_operation = ENOTTY, + interrupted = EINTR, + invalid_argument = EINVAL, + invalid_seek = ESPIPE, + io_error = EIO, + is_a_directory = EISDIR, + message_size = EMSGSIZE, + network_down = ENETDOWN, + network_reset = ENETRESET, + network_unreachable = ENETUNREACH, + no_buffer_space = ENOBUFS, + no_child_process = ECHILD, + no_link = ENOLINK, + no_lock_available = ENOLCK, +#ifdef ENODATA + no_message_available = ENODATA, +#else + no_message_available = ENOMSG, +#endif + no_message = ENOMSG, + no_protocol_option = ENOPROTOOPT, + no_space_on_device = ENOSPC, +#ifdef ENOSR + no_stream_resources = ENOSR, +#else + no_stream_resources = ENOMEM, +#endif + no_such_device_or_address = ENXIO, + no_such_device = ENODEV, + no_such_file_or_directory = ENOENT, + no_such_process = ESRCH, + not_a_directory = ENOTDIR, + not_a_socket = ENOTSOCK, +#ifdef ENOSTR + not_a_stream = ENOSTR, +#else + not_a_stream = EINVAL, +#endif + not_connected = ENOTCONN, + not_enough_memory = ENOMEM, + not_supported = ENOTSUP, + operation_canceled = ECANCELED, + operation_in_progress = EINPROGRESS, + operation_not_permitted = EPERM, + operation_not_supported = EOPNOTSUPP, + operation_would_block = EWOULDBLOCK, + owner_dead = EOWNERDEAD, + permission_denied = EACCES, + protocol_error = EPROTO, + protocol_not_supported = EPROTONOSUPPORT, + read_only_file_system = EROFS, + resource_deadlock_would_occur = EDEADLK, + resource_unavailable_try_again = EAGAIN, + result_out_of_range = ERANGE, + state_not_recoverable = ENOTRECOVERABLE, +#ifdef ETIME + stream_timeout = ETIME, +#else + stream_timeout = ETIMEDOUT, +#endif + text_file_busy = ETXTBSY, + timed_out = ETIMEDOUT, + too_many_files_open_in_system = ENFILE, + too_many_files_open = EMFILE, + too_many_links = EMLINK, + too_many_symbolic_link_levels = ELOOP, + value_too_large = EOVERFLOW, + wrong_protocol_type = EPROTOTYPE +}; +_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(errc) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ERRC diff --git a/app/src/main/cpp/libcxx/include/__expected/bad_expected_access.h b/app/src/main/cpp/libcxx/include/__expected/bad_expected_access.h new file mode 100644 index 0000000..361eab4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__expected/bad_expected_access.h @@ -0,0 +1,64 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef _LIBCPP___EXPECTED_BAD_EXPECTED_ACCESS_H +#define _LIBCPP___EXPECTED_BAD_EXPECTED_ACCESS_H + +#include <__config> +#include <__utility/move.h> + +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 23 + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class bad_expected_access; + +template <> +class bad_expected_access : public exception { +protected: + _LIBCPP_HIDE_FROM_ABI bad_expected_access() noexcept = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access(const bad_expected_access&) = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access(bad_expected_access&&) = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access& operator=(const bad_expected_access&) = default; + _LIBCPP_HIDE_FROM_ABI bad_expected_access& operator=(bad_expected_access&&) = default; + ~bad_expected_access() override = default; + +public: + // The way this has been designed (by using a class template below) means that we'll already + // have a profusion of these vtables in TUs, and the dynamic linker will already have a bunch + // of work to do. So it is not worth hiding the specialization in the dylib, given that + // it adds deployment target restrictions. + const char* what() const noexcept override { return "bad access to std::expected"; } +}; + +template +class bad_expected_access : public bad_expected_access { +public: + _LIBCPP_HIDE_FROM_ABI explicit bad_expected_access(_Err __e) : __unex_(std::move(__e)) {} + + _LIBCPP_HIDE_FROM_ABI _Err& error() & noexcept { return __unex_; } + _LIBCPP_HIDE_FROM_ABI const _Err& error() const& noexcept { return __unex_; } + _LIBCPP_HIDE_FROM_ABI _Err&& error() && noexcept { return std::move(__unex_); } + _LIBCPP_HIDE_FROM_ABI const _Err&& error() const&& noexcept { return std::move(__unex_); } + +private: + _Err __unex_; +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 23 + +#endif // _LIBCPP___EXPECTED_BAD_EXPECTED_ACCESS_H diff --git a/app/src/main/cpp/libcxx/include/__expected/expected.h b/app/src/main/cpp/libcxx/include/__expected/expected.h new file mode 100644 index 0000000..e1f590c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__expected/expected.h @@ -0,0 +1,973 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef _LIBCPP___EXPECTED_EXPECTED_H +#define _LIBCPP___EXPECTED_EXPECTED_H + +#include <__assert> +#include <__config> +#include <__expected/bad_expected_access.h> +#include <__expected/unexpect.h> +#include <__expected/unexpected.h> +#include <__memory/addressof.h> +#include <__memory/construct_at.h> +#include <__type_traits/conjunction.h> +#include <__type_traits/disjunction.h> +#include <__type_traits/is_assignable.h> +#include <__type_traits/is_constructible.h> +#include <__type_traits/is_convertible.h> +#include <__type_traits/is_copy_assignable.h> +#include <__type_traits/is_copy_constructible.h> +#include <__type_traits/is_default_constructible.h> +#include <__type_traits/is_function.h> +#include <__type_traits/is_move_assignable.h> +#include <__type_traits/is_move_constructible.h> +#include <__type_traits/is_nothrow_constructible.h> +#include <__type_traits/is_nothrow_copy_assignable.h> +#include <__type_traits/is_nothrow_copy_constructible.h> +#include <__type_traits/is_nothrow_default_constructible.h> +#include <__type_traits/is_nothrow_move_assignable.h> +#include <__type_traits/is_nothrow_move_constructible.h> +#include <__type_traits/is_reference.h> +#include <__type_traits/is_same.h> +#include <__type_traits/is_swappable.h> +#include <__type_traits/is_trivially_copy_constructible.h> +#include <__type_traits/is_trivially_destructible.h> +#include <__type_traits/is_trivially_move_constructible.h> +#include <__type_traits/is_void.h> +#include <__type_traits/lazy.h> +#include <__type_traits/negation.h> +#include <__type_traits/remove_cv.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/exception_guard.h> +#include <__utility/forward.h> +#include <__utility/in_place.h> +#include <__utility/move.h> +#include <__utility/swap.h> +#include // for std::abort +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 23 + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace __expected { + +template +_LIBCPP_HIDE_FROM_ABI void __throw_bad_expected_access(_Arg&& __arg) { +# ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_expected_access<_Err>(std::forward<_Arg>(__arg)); +# else + (void)__arg; + std::abort(); +# endif +} + +} // namespace __expected + +template +class expected { + static_assert( + !is_reference_v<_Tp> && + !is_function_v<_Tp> && + !is_same_v, in_place_t> && + !is_same_v, unexpect_t> && + !__is_std_unexpected>::value && + __valid_std_unexpected<_Err>::value + , + "[expected.object.general] A program that instantiates the definition of template expected for a " + "reference type, a function type, or for possibly cv-qualified types in_place_t, unexpect_t, or a " + "specialization of unexpected for the T parameter is ill-formed. A program that instantiates the " + "definition of the template expected with a type for the E parameter that is not a valid " + "template argument for unexpected is ill-formed."); + + template + friend class expected; + +public: + using value_type = _Tp; + using error_type = _Err; + using unexpected_type = unexpected<_Err>; + + template + using rebind = expected<_Up, error_type>; + + // [expected.object.ctor], constructors + _LIBCPP_HIDE_FROM_ABI constexpr expected() + noexcept(is_nothrow_default_constructible_v<_Tp>) // strengthened + requires is_default_constructible_v<_Tp> + : __has_val_(true) { + std::construct_at(std::addressof(__union_.__val_)); + } + + _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&) = delete; + + _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&) + requires(is_copy_constructible_v<_Tp> && + is_copy_constructible_v<_Err> && + is_trivially_copy_constructible_v<_Tp> && + is_trivially_copy_constructible_v<_Err>) + = default; + + _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected& __other) + noexcept(is_nothrow_copy_constructible_v<_Tp> && is_nothrow_copy_constructible_v<_Err>) // strengthened + requires(is_copy_constructible_v<_Tp> && is_copy_constructible_v<_Err> && + !(is_trivially_copy_constructible_v<_Tp> && is_trivially_copy_constructible_v<_Err>)) + : __has_val_(__other.__has_val_) { + if (__has_val_) { + std::construct_at(std::addressof(__union_.__val_), __other.__union_.__val_); + } else { + std::construct_at(std::addressof(__union_.__unex_), __other.__union_.__unex_); + } + } + + + _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&&) + requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> + && is_trivially_move_constructible_v<_Tp> && is_trivially_move_constructible_v<_Err>) + = default; + + _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&& __other) + noexcept(is_nothrow_move_constructible_v<_Tp> && is_nothrow_move_constructible_v<_Err>) + requires(is_move_constructible_v<_Tp> && is_move_constructible_v<_Err> && + !(is_trivially_move_constructible_v<_Tp> && is_trivially_move_constructible_v<_Err>)) + : __has_val_(__other.__has_val_) { + if (__has_val_) { + std::construct_at(std::addressof(__union_.__val_), std::move(__other.__union_.__val_)); + } else { + std::construct_at(std::addressof(__union_.__unex_), std::move(__other.__union_.__unex_)); + } + } + +private: + template + using __can_convert = + _And< is_constructible<_Tp, _UfQual>, + is_constructible<_Err, _OtherErrQual>, + _Not&>>, + _Not>>, + _Not&>>, + _Not>>, + _Not&, _Tp>>, + _Not&&, _Tp>>, + _Not&, _Tp>>, + _Not&&, _Tp>>, + _Not, expected<_Up, _OtherErr>&>>, + _Not, expected<_Up, _OtherErr>>>, + _Not, const expected<_Up, _OtherErr>&>>, + _Not, const expected<_Up, _OtherErr>>> >; + + +public: + template + requires __can_convert<_Up, _OtherErr, const _Up&, const _OtherErr&>::value + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v || + !is_convertible_v) + expected(const expected<_Up, _OtherErr>& __other) + noexcept(is_nothrow_constructible_v<_Tp, const _Up&> && + is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened + : __has_val_(__other.__has_val_) { + if (__has_val_) { + std::construct_at(std::addressof(__union_.__val_), __other.__union_.__val_); + } else { + std::construct_at(std::addressof(__union_.__unex_), __other.__union_.__unex_); + } + } + + template + requires __can_convert<_Up, _OtherErr, _Up, _OtherErr>::value + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_Up, _Tp> || !is_convertible_v<_OtherErr, _Err>) + expected(expected<_Up, _OtherErr>&& __other) + noexcept(is_nothrow_constructible_v<_Tp, _Up> && is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened + : __has_val_(__other.__has_val_) { + if (__has_val_) { + std::construct_at(std::addressof(__union_.__val_), std::move(__other.__union_.__val_)); + } else { + std::construct_at(std::addressof(__union_.__unex_), std::move(__other.__union_.__unex_)); + } + } + + template + requires(!is_same_v, in_place_t> && !is_same_v> && + !__is_std_unexpected>::value && is_constructible_v<_Tp, _Up>) + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_Up, _Tp>) + expected(_Up&& __u) + noexcept(is_nothrow_constructible_v<_Tp, _Up>) // strengthened + : __has_val_(true) { + std::construct_at(std::addressof(__union_.__val_), std::forward<_Up>(__u)); + } + + + template + requires is_constructible_v<_Err, const _OtherErr&> + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v) + expected(const unexpected<_OtherErr>& __unex) + noexcept(is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened + : __has_val_(false) { + std::construct_at(std::addressof(__union_.__unex_), __unex.error()); + } + + template + requires is_constructible_v<_Err, _OtherErr> + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>) + expected(unexpected<_OtherErr>&& __unex) + noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened + : __has_val_(false) { + std::construct_at(std::addressof(__union_.__unex_), std::move(__unex.error())); + } + + template + requires is_constructible_v<_Tp, _Args...> + _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(in_place_t, _Args&&... __args) + noexcept(is_nothrow_constructible_v<_Tp, _Args...>) // strengthened + : __has_val_(true) { + std::construct_at(std::addressof(__union_.__val_), std::forward<_Args>(__args)...); + } + + template + requires is_constructible_v< _Tp, initializer_list<_Up>&, _Args... > + _LIBCPP_HIDE_FROM_ABI constexpr explicit + expected(in_place_t, initializer_list<_Up> __il, _Args&&... __args) + noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>) // strengthened + : __has_val_(true) { + std::construct_at(std::addressof(__union_.__val_), __il, std::forward<_Args>(__args)...); + } + + template + requires is_constructible_v<_Err, _Args...> + _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, _Args&&... __args) + noexcept(is_nothrow_constructible_v<_Err, _Args...>) // strengthened + : __has_val_(false) { + std::construct_at(std::addressof(__union_.__unex_), std::forward<_Args>(__args)...); + } + + template + requires is_constructible_v< _Err, initializer_list<_Up>&, _Args... > + _LIBCPP_HIDE_FROM_ABI constexpr explicit + expected(unexpect_t, initializer_list<_Up> __il, _Args&&... __args) + noexcept(is_nothrow_constructible_v<_Err, initializer_list<_Up>&, _Args...>) // strengthened + : __has_val_(false) { + std::construct_at(std::addressof(__union_.__unex_), __il, std::forward<_Args>(__args)...); + } + + // [expected.object.dtor], destructor + + _LIBCPP_HIDE_FROM_ABI constexpr ~expected() + requires(is_trivially_destructible_v<_Tp> && is_trivially_destructible_v<_Err>) + = default; + + _LIBCPP_HIDE_FROM_ABI constexpr ~expected() + requires(!is_trivially_destructible_v<_Tp> || !is_trivially_destructible_v<_Err>) + { + if (__has_val_) { + std::destroy_at(std::addressof(__union_.__val_)); + } else { + std::destroy_at(std::addressof(__union_.__unex_)); + } + } + +private: + template + _LIBCPP_HIDE_FROM_ABI static constexpr void __reinit_expected(_T1& __newval, _T2& __oldval, _Args&&... __args) { + if constexpr (is_nothrow_constructible_v<_T1, _Args...>) { + std::destroy_at(std::addressof(__oldval)); + std::construct_at(std::addressof(__newval), std::forward<_Args>(__args)...); + } else if constexpr (is_nothrow_move_constructible_v<_T1>) { + _T1 __tmp(std::forward<_Args>(__args)...); + std::destroy_at(std::addressof(__oldval)); + std::construct_at(std::addressof(__newval), std::move(__tmp)); + } else { + static_assert( + is_nothrow_move_constructible_v<_T2>, + "To provide strong exception guarantee, T2 has to satisfy `is_nothrow_move_constructible_v` so that it can " + "be reverted to the previous state in case an exception is thrown during the assignment."); + _T2 __tmp(std::move(__oldval)); + std::destroy_at(std::addressof(__oldval)); + __exception_guard __trans([&] { std::construct_at(std::addressof(__oldval), std::move(__tmp)); }); + std::construct_at(std::addressof(__newval), std::forward<_Args>(__args)...); + __trans.__complete(); + } + } + +public: + // [expected.object.assign], assignment + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected&) = delete; + + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected& __rhs) + noexcept(is_nothrow_copy_assignable_v<_Tp> && + is_nothrow_copy_constructible_v<_Tp> && + is_nothrow_copy_assignable_v<_Err> && + is_nothrow_copy_constructible_v<_Err>) // strengthened + requires(is_copy_assignable_v<_Tp> && + is_copy_constructible_v<_Tp> && + is_copy_assignable_v<_Err> && + is_copy_constructible_v<_Err> && + (is_nothrow_move_constructible_v<_Tp> || + is_nothrow_move_constructible_v<_Err>)) + { + if (__has_val_ && __rhs.__has_val_) { + __union_.__val_ = __rhs.__union_.__val_; + } else if (__has_val_) { + __reinit_expected(__union_.__unex_, __union_.__val_, __rhs.__union_.__unex_); + } else if (__rhs.__has_val_) { + __reinit_expected(__union_.__val_, __union_.__unex_, __rhs.__union_.__val_); + } else { + __union_.__unex_ = __rhs.__union_.__unex_; + } + // note: only reached if no exception+rollback was done inside __reinit_expected + __has_val_ = __rhs.__has_val_; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(expected&& __rhs) + noexcept(is_nothrow_move_assignable_v<_Tp> && + is_nothrow_move_constructible_v<_Tp> && + is_nothrow_move_assignable_v<_Err> && + is_nothrow_move_constructible_v<_Err>) + requires(is_move_constructible_v<_Tp> && + is_move_assignable_v<_Tp> && + is_move_constructible_v<_Err> && + is_move_assignable_v<_Err> && + (is_nothrow_move_constructible_v<_Tp> || + is_nothrow_move_constructible_v<_Err>)) + { + if (__has_val_ && __rhs.__has_val_) { + __union_.__val_ = std::move(__rhs.__union_.__val_); + } else if (__has_val_) { + __reinit_expected(__union_.__unex_, __union_.__val_, std::move(__rhs.__union_.__unex_)); + } else if (__rhs.__has_val_) { + __reinit_expected(__union_.__val_, __union_.__unex_, std::move(__rhs.__union_.__val_)); + } else { + __union_.__unex_ = std::move(__rhs.__union_.__unex_); + } + // note: only reached if no exception+rollback was done inside __reinit_expected + __has_val_ = __rhs.__has_val_; + return *this; + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(_Up&& __v) + requires(!is_same_v> && + !__is_std_unexpected>::value && + is_constructible_v<_Tp, _Up> && + is_assignable_v<_Tp&, _Up> && + (is_nothrow_constructible_v<_Tp, _Up> || + is_nothrow_move_constructible_v<_Tp> || + is_nothrow_move_constructible_v<_Err>)) + { + if (__has_val_) { + __union_.__val_ = std::forward<_Up>(__v); + } else { + __reinit_expected(__union_.__val_, __union_.__unex_, std::forward<_Up>(__v)); + __has_val_ = true; + } + return *this; + } + +private: + template + static constexpr bool __can_assign_from_unexpected = + _And< is_constructible<_Err, _OtherErrQual>, + is_assignable<_Err&, _OtherErrQual>, + _Lazy<_Or, + is_nothrow_constructible<_Err, _OtherErrQual>, + is_nothrow_move_constructible<_Tp>, + is_nothrow_move_constructible<_Err>> >::value; + +public: + template + requires(__can_assign_from_unexpected) + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const unexpected<_OtherErr>& __un) { + if (__has_val_) { + __reinit_expected(__union_.__unex_, __union_.__val_, __un.error()); + __has_val_ = false; + } else { + __union_.__unex_ = __un.error(); + } + return *this; + } + + template + requires(__can_assign_from_unexpected<_OtherErr>) + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(unexpected<_OtherErr>&& __un) { + if (__has_val_) { + __reinit_expected(__union_.__unex_, __union_.__val_, std::move(__un.error())); + __has_val_ = false; + } else { + __union_.__unex_ = std::move(__un.error()); + } + return *this; + } + + template + requires is_nothrow_constructible_v<_Tp, _Args...> + _LIBCPP_HIDE_FROM_ABI constexpr _Tp& emplace(_Args&&... __args) noexcept { + if (__has_val_) { + std::destroy_at(std::addressof(__union_.__val_)); + } else { + std::destroy_at(std::addressof(__union_.__unex_)); + __has_val_ = true; + } + return *std::construct_at(std::addressof(__union_.__val_), std::forward<_Args>(__args)...); + } + + template + requires is_nothrow_constructible_v< _Tp, initializer_list<_Up>&, _Args... > + _LIBCPP_HIDE_FROM_ABI constexpr _Tp& emplace(initializer_list<_Up> __il, _Args&&... __args) noexcept { + if (__has_val_) { + std::destroy_at(std::addressof(__union_.__val_)); + } else { + std::destroy_at(std::addressof(__union_.__unex_)); + __has_val_ = true; + } + return *std::construct_at(std::addressof(__union_.__val_), __il, std::forward<_Args>(__args)...); + } + + +public: + // [expected.object.swap], swap + _LIBCPP_HIDE_FROM_ABI constexpr void swap(expected& __rhs) + noexcept(is_nothrow_move_constructible_v<_Tp> && + is_nothrow_swappable_v<_Tp> && + is_nothrow_move_constructible_v<_Err> && + is_nothrow_swappable_v<_Err>) + requires(is_swappable_v<_Tp> && + is_swappable_v<_Err> && + is_move_constructible_v<_Tp> && + is_move_constructible_v<_Err> && + (is_nothrow_move_constructible_v<_Tp> || + is_nothrow_move_constructible_v<_Err>)) + { + auto __swap_val_unex_impl = [&](expected& __with_val, expected& __with_err) { + if constexpr (is_nothrow_move_constructible_v<_Err>) { + _Err __tmp(std::move(__with_err.__union_.__unex_)); + std::destroy_at(std::addressof(__with_err.__union_.__unex_)); + __exception_guard __trans([&] { + std::construct_at(std::addressof(__with_err.__union_.__unex_), std::move(__tmp)); + }); + std::construct_at(std::addressof(__with_err.__union_.__val_), std::move(__with_val.__union_.__val_)); + __trans.__complete(); + std::destroy_at(std::addressof(__with_val.__union_.__val_)); + std::construct_at(std::addressof(__with_val.__union_.__unex_), std::move(__tmp)); + } else { + static_assert(is_nothrow_move_constructible_v<_Tp>, + "To provide strong exception guarantee, Tp has to satisfy `is_nothrow_move_constructible_v` so " + "that it can be reverted to the previous state in case an exception is thrown during swap."); + _Tp __tmp(std::move(__with_val.__union_.__val_)); + std::destroy_at(std::addressof(__with_val.__union_.__val_)); + __exception_guard __trans([&] { + std::construct_at(std::addressof(__with_val.__union_.__val_), std::move(__tmp)); + }); + std::construct_at(std::addressof(__with_val.__union_.__unex_), std::move(__with_err.__union_.__unex_)); + __trans.__complete(); + std::destroy_at(std::addressof(__with_err.__union_.__unex_)); + std::construct_at(std::addressof(__with_err.__union_.__val_), std::move(__tmp)); + } + __with_val.__has_val_ = false; + __with_err.__has_val_ = true; + }; + + if (__has_val_) { + if (__rhs.__has_val_) { + using std::swap; + swap(__union_.__val_, __rhs.__union_.__val_); + } else { + __swap_val_unex_impl(*this, __rhs); + } + } else { + if (__rhs.__has_val_) { + __swap_val_unex_impl(__rhs, *this); + } else { + using std::swap; + swap(__union_.__unex_, __rhs.__union_.__unex_); + } + } + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr void swap(expected& __x, expected& __y) + noexcept(noexcept(__x.swap(__y))) + requires requires { __x.swap(__y); } + { + __x.swap(__y); + } + + // [expected.object.obs], observers + _LIBCPP_HIDE_FROM_ABI constexpr const _Tp* operator->() const noexcept { + _LIBCPP_ASSERT(__has_val_, "expected::operator-> requires the expected to contain a value"); + return std::addressof(__union_.__val_); + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Tp* operator->() noexcept { + _LIBCPP_ASSERT(__has_val_, "expected::operator-> requires the expected to contain a value"); + return std::addressof(__union_.__val_); + } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& operator*() const& noexcept { + _LIBCPP_ASSERT(__has_val_, "expected::operator* requires the expected to contain a value"); + return __union_.__val_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Tp& operator*() & noexcept { + _LIBCPP_ASSERT(__has_val_, "expected::operator* requires the expected to contain a value"); + return __union_.__val_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&& operator*() const&& noexcept { + _LIBCPP_ASSERT(__has_val_, "expected::operator* requires the expected to contain a value"); + return std::move(__union_.__val_); + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Tp&& operator*() && noexcept { + _LIBCPP_ASSERT(__has_val_, "expected::operator* requires the expected to contain a value"); + return std::move(__union_.__val_); + } + + _LIBCPP_HIDE_FROM_ABI constexpr explicit operator bool() const noexcept { return __has_val_; } + + _LIBCPP_HIDE_FROM_ABI constexpr bool has_value() const noexcept { return __has_val_; } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Tp& value() const& { + if (!__has_val_) { + __expected::__throw_bad_expected_access<_Err>(__union_.__unex_); + } + return __union_.__val_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Tp& value() & { + if (!__has_val_) { + __expected::__throw_bad_expected_access<_Err>(__union_.__unex_); + } + return __union_.__val_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Tp&& value() const&& { + if (!__has_val_) { + __expected::__throw_bad_expected_access<_Err>(std::move(__union_.__unex_)); + } + return std::move(__union_.__val_); + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Tp&& value() && { + if (!__has_val_) { + __expected::__throw_bad_expected_access<_Err>(std::move(__union_.__unex_)); + } + return std::move(__union_.__val_); + } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Err& error() const& noexcept { + _LIBCPP_ASSERT(!__has_val_, "expected::error requires the expected to contain an error"); + return __union_.__unex_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Err& error() & noexcept { + _LIBCPP_ASSERT(!__has_val_, "expected::error requires the expected to contain an error"); + return __union_.__unex_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Err&& error() const&& noexcept { + _LIBCPP_ASSERT(!__has_val_, "expected::error requires the expected to contain an error"); + return std::move(__union_.__unex_); + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Err&& error() && noexcept { + _LIBCPP_ASSERT(!__has_val_, "expected::error requires the expected to contain an error"); + return std::move(__union_.__unex_); + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr _Tp value_or(_Up&& __v) const& { + static_assert(is_copy_constructible_v<_Tp>, "value_type has to be copy constructible"); + static_assert(is_convertible_v<_Up, _Tp>, "argument has to be convertible to value_type"); + return __has_val_ ? __union_.__val_ : static_cast<_Tp>(std::forward<_Up>(__v)); + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr _Tp value_or(_Up&& __v) && { + static_assert(is_move_constructible_v<_Tp>, "value_type has to be move constructible"); + static_assert(is_convertible_v<_Up, _Tp>, "argument has to be convertible to value_type"); + return __has_val_ ? std::move(__union_.__val_) : static_cast<_Tp>(std::forward<_Up>(__v)); + } + + // [expected.object.eq], equality operators + template + requires(!is_void_v<_T2>) + _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const expected<_T2, _E2>& __y) { + if (__x.__has_val_ != __y.__has_val_) { + return false; + } else { + if (__x.__has_val_) { + return __x.__union_.__val_ == __y.__union_.__val_; + } else { + return __x.__union_.__unex_ == __y.__union_.__unex_; + } + } + } + + template + _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const _T2& __v) { + return __x.__has_val_ && static_cast(__x.__union_.__val_ == __v); + } + + template + _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const unexpected<_E2>& __e) { + return !__x.__has_val_ && static_cast(__x.__union_.__unex_ == __e.error()); + } + +private: + struct __empty_t {}; + // use named union because [[no_unique_address]] cannot be applied to an unnamed union + _LIBCPP_NO_UNIQUE_ADDRESS union __union_t { + _LIBCPP_HIDE_FROM_ABI constexpr __union_t() : __empty_() {} + + _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t() + requires(is_trivially_destructible_v<_Tp> && is_trivially_destructible_v<_Err>) + = default; + + // the expected's destructor handles this + _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t() + requires(!is_trivially_destructible_v<_Tp> || !is_trivially_destructible_v<_Err>) + {} + + _LIBCPP_NO_UNIQUE_ADDRESS __empty_t __empty_; + _LIBCPP_NO_UNIQUE_ADDRESS _Tp __val_; + _LIBCPP_NO_UNIQUE_ADDRESS _Err __unex_; + } __union_; + + bool __has_val_; +}; + +template + requires is_void_v<_Tp> +class expected<_Tp, _Err> { + static_assert(__valid_std_unexpected<_Err>::value, + "[expected.void.general] A program that instantiates expected with a E that is not a " + "valid argument for unexpected is ill-formed"); + + template + friend class expected; + + template + using __can_convert = + _And< is_void<_Up>, + is_constructible<_Err, _OtherErrQual>, + _Not, expected<_Up, _OtherErr>&>>, + _Not, expected<_Up, _OtherErr>>>, + _Not, const expected<_Up, _OtherErr>&>>, + _Not, const expected<_Up, _OtherErr>>>>; + +public: + using value_type = _Tp; + using error_type = _Err; + using unexpected_type = unexpected<_Err>; + + template + using rebind = expected<_Up, error_type>; + + // [expected.void.ctor], constructors + _LIBCPP_HIDE_FROM_ABI constexpr expected() noexcept : __has_val_(true) {} + + _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&) = delete; + + _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected&) + requires(is_copy_constructible_v<_Err> && is_trivially_copy_constructible_v<_Err>) + = default; + + _LIBCPP_HIDE_FROM_ABI constexpr expected(const expected& __rhs) + noexcept(is_nothrow_copy_constructible_v<_Err>) // strengthened + requires(is_copy_constructible_v<_Err> && !is_trivially_copy_constructible_v<_Err>) + : __has_val_(__rhs.__has_val_) { + if (!__rhs.__has_val_) { + std::construct_at(std::addressof(__union_.__unex_), __rhs.__union_.__unex_); + } + } + + _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&&) + requires(is_move_constructible_v<_Err> && is_trivially_move_constructible_v<_Err>) + = default; + + _LIBCPP_HIDE_FROM_ABI constexpr expected(expected&& __rhs) + noexcept(is_nothrow_move_constructible_v<_Err>) + requires(is_move_constructible_v<_Err> && !is_trivially_move_constructible_v<_Err>) + : __has_val_(__rhs.__has_val_) { + if (!__rhs.__has_val_) { + std::construct_at(std::addressof(__union_.__unex_), std::move(__rhs.__union_.__unex_)); + } + } + + template + requires __can_convert<_Up, _OtherErr, const _OtherErr&>::value + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v) + expected(const expected<_Up, _OtherErr>& __rhs) + noexcept(is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened + : __has_val_(__rhs.__has_val_) { + if (!__rhs.__has_val_) { + std::construct_at(std::addressof(__union_.__unex_), __rhs.__union_.__unex_); + } + } + + template + requires __can_convert<_Up, _OtherErr, _OtherErr>::value + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>) + expected(expected<_Up, _OtherErr>&& __rhs) + noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened + : __has_val_(__rhs.__has_val_) { + if (!__rhs.__has_val_) { + std::construct_at(std::addressof(__union_.__unex_), std::move(__rhs.__union_.__unex_)); + } + } + + template + requires is_constructible_v<_Err, const _OtherErr&> + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v) + expected(const unexpected<_OtherErr>& __unex) + noexcept(is_nothrow_constructible_v<_Err, const _OtherErr&>) // strengthened + : __has_val_(false) { + std::construct_at(std::addressof(__union_.__unex_), __unex.error()); + } + + template + requires is_constructible_v<_Err, _OtherErr> + _LIBCPP_HIDE_FROM_ABI constexpr explicit(!is_convertible_v<_OtherErr, _Err>) + expected(unexpected<_OtherErr>&& __unex) + noexcept(is_nothrow_constructible_v<_Err, _OtherErr>) // strengthened + : __has_val_(false) { + std::construct_at(std::addressof(__union_.__unex_), std::move(__unex.error())); + } + + _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(in_place_t) noexcept : __has_val_(true) {} + + template + requires is_constructible_v<_Err, _Args...> + _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, _Args&&... __args) + noexcept(is_nothrow_constructible_v<_Err, _Args...>) // strengthened + : __has_val_(false) { + std::construct_at(std::addressof(__union_.__unex_), std::forward<_Args>(__args)...); + } + + template + requires is_constructible_v< _Err, initializer_list<_Up>&, _Args... > + _LIBCPP_HIDE_FROM_ABI constexpr explicit expected(unexpect_t, initializer_list<_Up> __il, _Args&&... __args) + noexcept(is_nothrow_constructible_v<_Err, initializer_list<_Up>&, _Args...>) // strengthened + : __has_val_(false) { + std::construct_at(std::addressof(__union_.__unex_), __il, std::forward<_Args>(__args)...); + } + + // [expected.void.dtor], destructor + + _LIBCPP_HIDE_FROM_ABI constexpr ~expected() + requires is_trivially_destructible_v<_Err> + = default; + + _LIBCPP_HIDE_FROM_ABI constexpr ~expected() + requires(!is_trivially_destructible_v<_Err>) + { + if (!__has_val_) { + std::destroy_at(std::addressof(__union_.__unex_)); + } + } + + // [expected.void.assign], assignment + + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected&) = delete; + + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const expected& __rhs) + noexcept(is_nothrow_copy_assignable_v<_Err> && is_nothrow_copy_constructible_v<_Err>) // strengthened + requires(is_copy_assignable_v<_Err> && is_copy_constructible_v<_Err>) + { + if (__has_val_) { + if (!__rhs.__has_val_) { + std::construct_at(std::addressof(__union_.__unex_), __rhs.__union_.__unex_); + __has_val_ = false; + } + } else { + if (__rhs.__has_val_) { + std::destroy_at(std::addressof(__union_.__unex_)); + __has_val_ = true; + } else { + __union_.__unex_ = __rhs.__union_.__unex_; + } + } + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(expected&&) = delete; + + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(expected&& __rhs) + noexcept(is_nothrow_move_assignable_v<_Err> && + is_nothrow_move_constructible_v<_Err>) + requires(is_move_assignable_v<_Err> && + is_move_constructible_v<_Err>) + { + if (__has_val_) { + if (!__rhs.__has_val_) { + std::construct_at(std::addressof(__union_.__unex_), std::move(__rhs.__union_.__unex_)); + __has_val_ = false; + } + } else { + if (__rhs.__has_val_) { + std::destroy_at(std::addressof(__union_.__unex_)); + __has_val_ = true; + } else { + __union_.__unex_ = std::move(__rhs.__union_.__unex_); + } + } + return *this; + } + + template + requires(is_constructible_v<_Err, const _OtherErr&> && is_assignable_v<_Err&, const _OtherErr&>) + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(const unexpected<_OtherErr>& __un) { + if (__has_val_) { + std::construct_at(std::addressof(__union_.__unex_), __un.error()); + __has_val_ = false; + } else { + __union_.__unex_ = __un.error(); + } + return *this; + } + + template + requires(is_constructible_v<_Err, _OtherErr> && is_assignable_v<_Err&, _OtherErr>) + _LIBCPP_HIDE_FROM_ABI constexpr expected& operator=(unexpected<_OtherErr>&& __un) { + if (__has_val_) { + std::construct_at(std::addressof(__union_.__unex_), std::move(__un.error())); + __has_val_ = false; + } else { + __union_.__unex_ = std::move(__un.error()); + } + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr void emplace() noexcept { + if (!__has_val_) { + std::destroy_at(std::addressof(__union_.__unex_)); + __has_val_ = true; + } + } + + // [expected.void.swap], swap + _LIBCPP_HIDE_FROM_ABI constexpr void swap(expected& __rhs) + noexcept(is_nothrow_move_constructible_v<_Err> && is_nothrow_swappable_v<_Err>) + requires(is_swappable_v<_Err> && is_move_constructible_v<_Err>) + { + auto __swap_val_unex_impl = [&](expected& __with_val, expected& __with_err) { + std::construct_at(std::addressof(__with_val.__union_.__unex_), std::move(__with_err.__union_.__unex_)); + std::destroy_at(std::addressof(__with_err.__union_.__unex_)); + __with_val.__has_val_ = false; + __with_err.__has_val_ = true; + }; + + if (__has_val_) { + if (!__rhs.__has_val_) { + __swap_val_unex_impl(*this, __rhs); + } + } else { + if (__rhs.__has_val_) { + __swap_val_unex_impl(__rhs, *this); + } else { + using std::swap; + swap(__union_.__unex_, __rhs.__union_.__unex_); + } + } + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr void swap(expected& __x, expected& __y) + noexcept(noexcept(__x.swap(__y))) + requires requires { __x.swap(__y); } + { + __x.swap(__y); + } + + // [expected.void.obs], observers + _LIBCPP_HIDE_FROM_ABI constexpr explicit operator bool() const noexcept { return __has_val_; } + + _LIBCPP_HIDE_FROM_ABI constexpr bool has_value() const noexcept { return __has_val_; } + + _LIBCPP_HIDE_FROM_ABI constexpr void operator*() const noexcept { + _LIBCPP_ASSERT(__has_val_, "expected::operator* requires the expected to contain a value"); + } + + _LIBCPP_HIDE_FROM_ABI constexpr void value() const& { + if (!__has_val_) { + __expected::__throw_bad_expected_access<_Err>(__union_.__unex_); + } + } + + _LIBCPP_HIDE_FROM_ABI constexpr void value() && { + if (!__has_val_) { + __expected::__throw_bad_expected_access<_Err>(std::move(__union_.__unex_)); + } + } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Err& error() const& noexcept { + _LIBCPP_ASSERT(!__has_val_, "expected::error requires the expected to contain an error"); + return __union_.__unex_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Err& error() & noexcept { + _LIBCPP_ASSERT(!__has_val_, "expected::error requires the expected to contain an error"); + return __union_.__unex_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Err&& error() const&& noexcept { + _LIBCPP_ASSERT(!__has_val_, "expected::error requires the expected to contain an error"); + return std::move(__union_.__unex_); + } + + _LIBCPP_HIDE_FROM_ABI constexpr _Err&& error() && noexcept { + _LIBCPP_ASSERT(!__has_val_, "expected::error requires the expected to contain an error"); + return std::move(__union_.__unex_); + } + + // [expected.void.eq], equality operators + template + requires is_void_v<_T2> + _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const expected<_T2, _E2>& __y) { + if (__x.__has_val_ != __y.__has_val_) { + return false; + } else { + return __x.__has_val_ || static_cast(__x.__union_.__unex_ == __y.__union_.__unex_); + } + } + + template + _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const unexpected<_E2>& __y) { + return !__x.__has_val_ && static_cast(__x.__union_.__unex_ == __y.error()); + } + +private: + struct __empty_t {}; + // use named union because [[no_unique_address]] cannot be applied to an unnamed union + _LIBCPP_NO_UNIQUE_ADDRESS union __union_t { + _LIBCPP_HIDE_FROM_ABI constexpr __union_t() : __empty_() {} + + _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t() + requires(is_trivially_destructible_v<_Err>) + = default; + + // the expected's destructor handles this + _LIBCPP_HIDE_FROM_ABI constexpr ~__union_t() + requires(!is_trivially_destructible_v<_Err>) + {} + + _LIBCPP_NO_UNIQUE_ADDRESS __empty_t __empty_; + _LIBCPP_NO_UNIQUE_ADDRESS _Err __unex_; + } __union_; + + bool __has_val_; +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 23 + +#endif // _LIBCPP___EXPECTED_EXPECTED_H diff --git a/app/src/main/cpp/libcxx/include/__expected/unexpect.h b/app/src/main/cpp/libcxx/include/__expected/unexpect.h new file mode 100644 index 0000000..20bafc1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__expected/unexpect.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef _LIBCPP___EXPECTED_UNEXPECT_H +#define _LIBCPP___EXPECTED_UNEXPECT_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 23 + +_LIBCPP_BEGIN_NAMESPACE_STD + +struct unexpect_t { + _LIBCPP_HIDE_FROM_ABI explicit unexpect_t() = default; +}; + +inline constexpr unexpect_t unexpect{}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 23 + +#endif // _LIBCPP___EXPECTED_UNEXPECT_H diff --git a/app/src/main/cpp/libcxx/include/__expected/unexpected.h b/app/src/main/cpp/libcxx/include/__expected/unexpected.h new file mode 100644 index 0000000..075963a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__expected/unexpected.h @@ -0,0 +1,122 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +#ifndef _LIBCPP___EXPECTED_UNEXPECTED_H +#define _LIBCPP___EXPECTED_UNEXPECTED_H + +#include <__config> +#include <__type_traits/conjunction.h> +#include <__type_traits/is_array.h> +#include <__type_traits/is_const.h> +#include <__type_traits/is_constructible.h> +#include <__type_traits/is_nothrow_constructible.h> +#include <__type_traits/is_object.h> +#include <__type_traits/is_same.h> +#include <__type_traits/is_swappable.h> +#include <__type_traits/is_volatile.h> +#include <__type_traits/negation.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/forward.h> +#include <__utility/in_place.h> +#include <__utility/move.h> +#include <__utility/swap.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 23 + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class unexpected; + +template +struct __is_std_unexpected : false_type {}; + +template +struct __is_std_unexpected> : true_type {}; + +template +using __valid_std_unexpected = _BoolConstant< // + is_object_v<_Tp> && // + !is_array_v<_Tp> && // + !__is_std_unexpected<_Tp>::value && // + !is_const_v<_Tp> && // + !is_volatile_v<_Tp> // + >; + +template +class unexpected { + static_assert(__valid_std_unexpected<_Err>::value, + "[expected.un.general] states a program that instantiates std::unexpected for a non-object type, an " + "array type, a specialization of unexpected, or a cv-qualified type is ill-formed."); + +public: + _LIBCPP_HIDE_FROM_ABI constexpr unexpected(const unexpected&) = default; + _LIBCPP_HIDE_FROM_ABI constexpr unexpected(unexpected&&) = default; + + template + requires(!is_same_v, unexpected> && // + !is_same_v, in_place_t> && // + is_constructible_v<_Err, _Error>) + _LIBCPP_HIDE_FROM_ABI constexpr explicit unexpected(_Error&& __error) // + noexcept(is_nothrow_constructible_v<_Err, _Error>) // strengthened + : __unex_(std::forward<_Error>(__error)) {} + + template + requires is_constructible_v<_Err, _Args...> + _LIBCPP_HIDE_FROM_ABI constexpr explicit unexpected(in_place_t, _Args&&... __args) // + noexcept(is_nothrow_constructible_v<_Err, _Args...>) // strengthened + : __unex_(std::forward<_Args>(__args)...) {} + + template + requires is_constructible_v<_Err, initializer_list<_Up>&, _Args...> + _LIBCPP_HIDE_FROM_ABI constexpr explicit unexpected(in_place_t, initializer_list<_Up> __il, _Args&&... __args) // + noexcept(is_nothrow_constructible_v<_Err, initializer_list<_Up>&, _Args...>) // strengthened + : __unex_(__il, std::forward<_Args>(__args)...) {} + + _LIBCPP_HIDE_FROM_ABI constexpr unexpected& operator=(const unexpected&) = default; + _LIBCPP_HIDE_FROM_ABI constexpr unexpected& operator=(unexpected&&) = default; + + _LIBCPP_HIDE_FROM_ABI constexpr const _Err& error() const& noexcept { return __unex_; } + _LIBCPP_HIDE_FROM_ABI constexpr _Err& error() & noexcept { return __unex_; } + _LIBCPP_HIDE_FROM_ABI constexpr const _Err&& error() const&& noexcept { return std::move(__unex_); } + _LIBCPP_HIDE_FROM_ABI constexpr _Err&& error() && noexcept { return std::move(__unex_); } + + _LIBCPP_HIDE_FROM_ABI constexpr void swap(unexpected& __other) noexcept(is_nothrow_swappable_v<_Err>) { + static_assert(is_swappable_v<_Err>, "unexpected::swap requires is_swappable_v to be true"); + using std::swap; + swap(__unex_, __other.__unex_); + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr void swap(unexpected& __x, unexpected& __y) noexcept(noexcept(__x.swap(__y))) + requires is_swappable_v<_Err> + { + __x.swap(__y); + } + + template + _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const unexpected& __x, const unexpected<_Err2>& __y) { + return __x.__unex_ == __y.__unex_; + } + +private: + _Err __unex_; +}; + +template +unexpected(_Err) -> unexpected<_Err>; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 23 + +#endif // _LIBCPP___EXPECTED_UNEXPECTED_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/copy_options.h b/app/src/main/cpp/libcxx/include/__filesystem/copy_options.h new file mode 100644 index 0000000..96c7535 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/copy_options.h @@ -0,0 +1,84 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_COPY_OPTIONS_H +#define _LIBCPP___FILESYSTEM_COPY_OPTIONS_H + +#include <__availability> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +enum class _LIBCPP_ENUM_VIS copy_options : unsigned short { + none = 0, + skip_existing = 1, + overwrite_existing = 2, + update_existing = 4, + recursive = 8, + copy_symlinks = 16, + skip_symlinks = 32, + directories_only = 64, + create_symlinks = 128, + create_hard_links = 256, + __in_recursive_copy = 512, +}; + +_LIBCPP_INLINE_VISIBILITY +inline constexpr copy_options operator&(copy_options __lhs, copy_options __rhs) { + return static_cast(static_cast(__lhs) & + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr copy_options operator|(copy_options __lhs, copy_options __rhs) { + return static_cast(static_cast(__lhs) | + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr copy_options operator^(copy_options __lhs, copy_options __rhs) { + return static_cast(static_cast(__lhs) ^ + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr copy_options operator~(copy_options __lhs) { + return static_cast(~static_cast(__lhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline copy_options& operator&=(copy_options& __lhs, copy_options __rhs) { + return __lhs = __lhs & __rhs; +} + +_LIBCPP_INLINE_VISIBILITY +inline copy_options& operator|=(copy_options& __lhs, copy_options __rhs) { + return __lhs = __lhs | __rhs; +} + +_LIBCPP_INLINE_VISIBILITY +inline copy_options& operator^=(copy_options& __lhs, copy_options __rhs) { + return __lhs = __lhs ^ __rhs; +} + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_COPY_OPTIONS_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/directory_entry.h b/app/src/main/cpp/libcxx/include/__filesystem/directory_entry.h new file mode 100644 index 0000000..b17eaaa --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/directory_entry.h @@ -0,0 +1,527 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_DIRECTORY_ENTRY_H +#define _LIBCPP___FILESYSTEM_DIRECTORY_ENTRY_H + +#include <__availability> +#include <__chrono/time_point.h> +#include <__config> +#include <__errc> +#include <__filesystem/file_status.h> +#include <__filesystem/file_time_type.h> +#include <__filesystem/file_type.h> +#include <__filesystem/filesystem_error.h> +#include <__filesystem/operations.h> +#include <__filesystem/path.h> +#include <__filesystem/perms.h> +#include <__utility/unreachable.h> +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + + +class directory_entry { + typedef _VSTD_FS::path _Path; + +public: + // constructors and destructors + directory_entry() noexcept = default; + directory_entry(directory_entry const&) = default; + directory_entry(directory_entry&&) noexcept = default; + + _LIBCPP_INLINE_VISIBILITY + explicit directory_entry(_Path const& __p) : __p_(__p) { + error_code __ec; + __refresh(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + directory_entry(_Path const& __p, error_code& __ec) : __p_(__p) { + __refresh(&__ec); + } + + ~directory_entry() {} + + directory_entry& operator=(directory_entry const&) = default; + directory_entry& operator=(directory_entry&&) noexcept = default; + + _LIBCPP_INLINE_VISIBILITY + void assign(_Path const& __p) { + __p_ = __p; + error_code __ec; + __refresh(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + void assign(_Path const& __p, error_code& __ec) { + __p_ = __p; + __refresh(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + void replace_filename(_Path const& __p) { + __p_.replace_filename(__p); + error_code __ec; + __refresh(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + void replace_filename(_Path const& __p, error_code& __ec) { + __p_ = __p_.parent_path() / __p; + __refresh(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + void refresh() { __refresh(); } + + _LIBCPP_INLINE_VISIBILITY + void refresh(error_code& __ec) noexcept { __refresh(&__ec); } + + _LIBCPP_INLINE_VISIBILITY + _Path const& path() const noexcept { return __p_; } + + _LIBCPP_INLINE_VISIBILITY + operator const _Path&() const noexcept { return __p_; } + + _LIBCPP_INLINE_VISIBILITY + bool exists() const { return _VSTD_FS::exists(file_status{__get_ft()}); } + + _LIBCPP_INLINE_VISIBILITY + bool exists(error_code& __ec) const noexcept { + return _VSTD_FS::exists(file_status{__get_ft(&__ec)}); + } + + _LIBCPP_INLINE_VISIBILITY + bool is_block_file() const { return __get_ft() == file_type::block; } + + _LIBCPP_INLINE_VISIBILITY + bool is_block_file(error_code& __ec) const noexcept { + return __get_ft(&__ec) == file_type::block; + } + + _LIBCPP_INLINE_VISIBILITY + bool is_character_file() const { return __get_ft() == file_type::character; } + + _LIBCPP_INLINE_VISIBILITY + bool is_character_file(error_code& __ec) const noexcept { + return __get_ft(&__ec) == file_type::character; + } + + _LIBCPP_INLINE_VISIBILITY + bool is_directory() const { return __get_ft() == file_type::directory; } + + _LIBCPP_INLINE_VISIBILITY + bool is_directory(error_code& __ec) const noexcept { + return __get_ft(&__ec) == file_type::directory; + } + + _LIBCPP_INLINE_VISIBILITY + bool is_fifo() const { return __get_ft() == file_type::fifo; } + + _LIBCPP_INLINE_VISIBILITY + bool is_fifo(error_code& __ec) const noexcept { + return __get_ft(&__ec) == file_type::fifo; + } + + _LIBCPP_INLINE_VISIBILITY + bool is_other() const { return _VSTD_FS::is_other(file_status{__get_ft()}); } + + _LIBCPP_INLINE_VISIBILITY + bool is_other(error_code& __ec) const noexcept { + return _VSTD_FS::is_other(file_status{__get_ft(&__ec)}); + } + + _LIBCPP_INLINE_VISIBILITY + bool is_regular_file() const { return __get_ft() == file_type::regular; } + + _LIBCPP_INLINE_VISIBILITY + bool is_regular_file(error_code& __ec) const noexcept { + return __get_ft(&__ec) == file_type::regular; + } + + _LIBCPP_INLINE_VISIBILITY + bool is_socket() const { return __get_ft() == file_type::socket; } + + _LIBCPP_INLINE_VISIBILITY + bool is_socket(error_code& __ec) const noexcept { + return __get_ft(&__ec) == file_type::socket; + } + + _LIBCPP_INLINE_VISIBILITY + bool is_symlink() const { return __get_sym_ft() == file_type::symlink; } + + _LIBCPP_INLINE_VISIBILITY + bool is_symlink(error_code& __ec) const noexcept { + return __get_sym_ft(&__ec) == file_type::symlink; + } + _LIBCPP_INLINE_VISIBILITY + uintmax_t file_size() const { return __get_size(); } + + _LIBCPP_INLINE_VISIBILITY + uintmax_t file_size(error_code& __ec) const noexcept { + return __get_size(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + uintmax_t hard_link_count() const { return __get_nlink(); } + + _LIBCPP_INLINE_VISIBILITY + uintmax_t hard_link_count(error_code& __ec) const noexcept { + return __get_nlink(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + file_time_type last_write_time() const { return __get_write_time(); } + + _LIBCPP_INLINE_VISIBILITY + file_time_type last_write_time(error_code& __ec) const noexcept { + return __get_write_time(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + file_status status() const { return __get_status(); } + + _LIBCPP_INLINE_VISIBILITY + file_status status(error_code& __ec) const noexcept { + return __get_status(&__ec); + } + + _LIBCPP_INLINE_VISIBILITY + file_status symlink_status() const { return __get_symlink_status(); } + + _LIBCPP_INLINE_VISIBILITY + file_status symlink_status(error_code& __ec) const noexcept { + return __get_symlink_status(&__ec); + } + + + _LIBCPP_INLINE_VISIBILITY + bool operator==(directory_entry const& __rhs) const noexcept { + return __p_ == __rhs.__p_; + } + +#if _LIBCPP_STD_VER <= 17 + _LIBCPP_INLINE_VISIBILITY + bool operator!=(directory_entry const& __rhs) const noexcept { + return __p_ != __rhs.__p_; + } + + _LIBCPP_INLINE_VISIBILITY + bool operator<(directory_entry const& __rhs) const noexcept { + return __p_ < __rhs.__p_; + } + + _LIBCPP_INLINE_VISIBILITY + bool operator<=(directory_entry const& __rhs) const noexcept { + return __p_ <= __rhs.__p_; + } + + _LIBCPP_INLINE_VISIBILITY + bool operator>(directory_entry const& __rhs) const noexcept { + return __p_ > __rhs.__p_; + } + + _LIBCPP_INLINE_VISIBILITY + bool operator>=(directory_entry const& __rhs) const noexcept { + return __p_ >= __rhs.__p_; + } + +#else // _LIBCPP_STD_VER <= 17 + + _LIBCPP_HIDE_FROM_ABI + strong_ordering operator<=>(const directory_entry& __rhs) const noexcept { + return __p_ <=> __rhs.__p_; + } + +#endif // _LIBCPP_STD_VER <= 17 + + template + _LIBCPP_INLINE_VISIBILITY + friend basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& __os, const directory_entry& __d) { + return __os << __d.path(); + } + +private: + friend class directory_iterator; + friend class recursive_directory_iterator; + friend class _LIBCPP_HIDDEN __dir_stream; + + enum _CacheType : unsigned char { + _Empty, + _IterSymlink, + _IterNonSymlink, + _RefreshSymlink, + _RefreshSymlinkUnresolved, + _RefreshNonSymlink + }; + + struct __cached_data { + uintmax_t __size_; + uintmax_t __nlink_; + file_time_type __write_time_; + perms __sym_perms_; + perms __non_sym_perms_; + file_type __type_; + _CacheType __cache_type_; + + _LIBCPP_INLINE_VISIBILITY + __cached_data() noexcept { __reset(); } + + _LIBCPP_INLINE_VISIBILITY + void __reset() { + __cache_type_ = _Empty; + __type_ = file_type::none; + __sym_perms_ = __non_sym_perms_ = perms::unknown; + __size_ = __nlink_ = uintmax_t(-1); + __write_time_ = file_time_type::min(); + } + }; + + _LIBCPP_INLINE_VISIBILITY + static __cached_data __create_iter_result(file_type __ft) { + __cached_data __data; + __data.__type_ = __ft; + __data.__cache_type_ = [&]() { + switch (__ft) { + case file_type::none: + return _Empty; + case file_type::symlink: + return _IterSymlink; + default: + return _IterNonSymlink; + } + }(); + return __data; + } + + _LIBCPP_INLINE_VISIBILITY + void __assign_iter_entry(_Path&& __p, __cached_data __dt) { + __p_ = _VSTD::move(__p); + __data_ = __dt; + } + + _LIBCPP_FUNC_VIS + error_code __do_refresh() noexcept; + + _LIBCPP_INLINE_VISIBILITY + static bool __is_dne_error(error_code const& __ec) { + if (!__ec) + return true; + switch (static_cast(__ec.value())) { + case errc::no_such_file_or_directory: + case errc::not_a_directory: + return true; + default: + return false; + } + } + + _LIBCPP_INLINE_VISIBILITY + void __handle_error(const char* __msg, error_code* __dest_ec, + error_code const& __ec, bool __allow_dne = false) const { + if (__dest_ec) { + *__dest_ec = __ec; + return; + } + if (__ec && (!__allow_dne || !__is_dne_error(__ec))) + __throw_filesystem_error(__msg, __p_, __ec); + } + + _LIBCPP_INLINE_VISIBILITY + void __refresh(error_code* __ec = nullptr) { + __handle_error("in directory_entry::refresh", __ec, __do_refresh(), + /*allow_dne*/ true); + } + + _LIBCPP_INLINE_VISIBILITY + file_type __get_sym_ft(error_code* __ec = nullptr) const { + switch (__data_.__cache_type_) { + case _Empty: + return __symlink_status(__p_, __ec).type(); + case _IterSymlink: + case _RefreshSymlink: + case _RefreshSymlinkUnresolved: + if (__ec) + __ec->clear(); + return file_type::symlink; + case _IterNonSymlink: + case _RefreshNonSymlink: + file_status __st(__data_.__type_); + if (__ec && !_VSTD_FS::exists(__st)) + *__ec = make_error_code(errc::no_such_file_or_directory); + else if (__ec) + __ec->clear(); + return __data_.__type_; + } + __libcpp_unreachable(); + } + + _LIBCPP_INLINE_VISIBILITY + file_type __get_ft(error_code* __ec = nullptr) const { + switch (__data_.__cache_type_) { + case _Empty: + case _IterSymlink: + case _RefreshSymlinkUnresolved: + return __status(__p_, __ec).type(); + case _IterNonSymlink: + case _RefreshNonSymlink: + case _RefreshSymlink: { + file_status __st(__data_.__type_); + if (__ec && !_VSTD_FS::exists(__st)) + *__ec = make_error_code(errc::no_such_file_or_directory); + else if (__ec) + __ec->clear(); + return __data_.__type_; + } + } + __libcpp_unreachable(); + } + + _LIBCPP_INLINE_VISIBILITY + file_status __get_status(error_code* __ec = nullptr) const { + switch (__data_.__cache_type_) { + case _Empty: + case _IterNonSymlink: + case _IterSymlink: + case _RefreshSymlinkUnresolved: + return __status(__p_, __ec); + case _RefreshNonSymlink: + case _RefreshSymlink: + return file_status(__get_ft(__ec), __data_.__non_sym_perms_); + } + __libcpp_unreachable(); + } + + _LIBCPP_INLINE_VISIBILITY + file_status __get_symlink_status(error_code* __ec = nullptr) const { + switch (__data_.__cache_type_) { + case _Empty: + case _IterNonSymlink: + case _IterSymlink: + return __symlink_status(__p_, __ec); + case _RefreshNonSymlink: + return file_status(__get_sym_ft(__ec), __data_.__non_sym_perms_); + case _RefreshSymlink: + case _RefreshSymlinkUnresolved: + return file_status(__get_sym_ft(__ec), __data_.__sym_perms_); + } + __libcpp_unreachable(); + } + + _LIBCPP_INLINE_VISIBILITY + uintmax_t __get_size(error_code* __ec = nullptr) const { + switch (__data_.__cache_type_) { + case _Empty: + case _IterNonSymlink: + case _IterSymlink: + case _RefreshSymlinkUnresolved: + return _VSTD_FS::__file_size(__p_, __ec); + case _RefreshSymlink: + case _RefreshNonSymlink: { + error_code __m_ec; + file_status __st(__get_ft(&__m_ec)); + __handle_error("in directory_entry::file_size", __ec, __m_ec); + if (_VSTD_FS::exists(__st) && !_VSTD_FS::is_regular_file(__st)) { + errc __err_kind = _VSTD_FS::is_directory(__st) ? errc::is_a_directory + : errc::not_supported; + __handle_error("in directory_entry::file_size", __ec, + make_error_code(__err_kind)); + } + return __data_.__size_; + } + } + __libcpp_unreachable(); + } + + _LIBCPP_INLINE_VISIBILITY + uintmax_t __get_nlink(error_code* __ec = nullptr) const { + switch (__data_.__cache_type_) { + case _Empty: + case _IterNonSymlink: + case _IterSymlink: + case _RefreshSymlinkUnresolved: + return _VSTD_FS::__hard_link_count(__p_, __ec); + case _RefreshSymlink: + case _RefreshNonSymlink: { + error_code __m_ec; + (void)__get_ft(&__m_ec); + __handle_error("in directory_entry::hard_link_count", __ec, __m_ec); + return __data_.__nlink_; + } + } + __libcpp_unreachable(); + } + + _LIBCPP_INLINE_VISIBILITY + file_time_type __get_write_time(error_code* __ec = nullptr) const { + switch (__data_.__cache_type_) { + case _Empty: + case _IterNonSymlink: + case _IterSymlink: + case _RefreshSymlinkUnresolved: + return _VSTD_FS::__last_write_time(__p_, __ec); + case _RefreshSymlink: + case _RefreshNonSymlink: { + error_code __m_ec; + file_status __st(__get_ft(&__m_ec)); + __handle_error("in directory_entry::last_write_time", __ec, __m_ec); + if (_VSTD_FS::exists(__st) && + __data_.__write_time_ == file_time_type::min()) + __handle_error("in directory_entry::last_write_time", __ec, + make_error_code(errc::value_too_large)); + return __data_.__write_time_; + } + } + __libcpp_unreachable(); + } + +private: + _Path __p_; + __cached_data __data_; +}; + +class __dir_element_proxy { +public: + inline _LIBCPP_INLINE_VISIBILITY directory_entry operator*() { + return _VSTD::move(__elem_); + } + +private: + friend class directory_iterator; + friend class recursive_directory_iterator; + explicit __dir_element_proxy(directory_entry const& __e) : __elem_(__e) {} + __dir_element_proxy(__dir_element_proxy&& __o) + : __elem_(_VSTD::move(__o.__elem_)) {} + directory_entry __elem_; +}; + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___FILESYSTEM_DIRECTORY_ENTRY_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/directory_iterator.h b/app/src/main/cpp/libcxx/include/__filesystem/directory_iterator.h new file mode 100644 index 0000000..5ff2f01 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/directory_iterator.h @@ -0,0 +1,165 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_DIRECTORY_ITERATOR_H +#define _LIBCPP___FILESYSTEM_DIRECTORY_ITERATOR_H + +#include <__assert> +#include <__availability> +#include <__config> +#include <__filesystem/directory_entry.h> +#include <__filesystem/directory_options.h> +#include <__filesystem/path.h> +#include <__iterator/iterator_traits.h> +#include <__memory/shared_ptr.h> +#include <__ranges/enable_borrowed_range.h> +#include <__ranges/enable_view.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +class _LIBCPP_HIDDEN __dir_stream; +class directory_iterator { +public: + typedef directory_entry value_type; + typedef ptrdiff_t difference_type; + typedef value_type const* pointer; + typedef value_type const& reference; + typedef input_iterator_tag iterator_category; + +public: + //ctor & dtor + _LIBCPP_HIDE_FROM_ABI + directory_iterator() noexcept {} + + _LIBCPP_HIDE_FROM_ABI + explicit directory_iterator(const path& __p) + : directory_iterator(__p, nullptr) {} + + _LIBCPP_HIDE_FROM_ABI + directory_iterator(const path& __p, directory_options __opts) + : directory_iterator(__p, nullptr, __opts) {} + + _LIBCPP_HIDE_FROM_ABI + directory_iterator(const path& __p, error_code& __ec) + : directory_iterator(__p, &__ec) {} + + _LIBCPP_HIDE_FROM_ABI + directory_iterator(const path& __p, directory_options __opts, + error_code& __ec) + : directory_iterator(__p, &__ec, __opts) {} + + _LIBCPP_HIDE_FROM_ABI directory_iterator(const directory_iterator&) = default; + _LIBCPP_HIDE_FROM_ABI directory_iterator(directory_iterator&&) = default; + _LIBCPP_HIDE_FROM_ABI directory_iterator& operator=(const directory_iterator&) = default; + + _LIBCPP_HIDE_FROM_ABI + directory_iterator& operator=(directory_iterator&& __o) noexcept { + // non-default implementation provided to support self-move assign. + if (this != &__o) { + __imp_ = _VSTD::move(__o.__imp_); + } + return *this; + } + + _LIBCPP_HIDE_FROM_ABI ~directory_iterator() = default; + + _LIBCPP_HIDE_FROM_ABI + const directory_entry& operator*() const { + _LIBCPP_ASSERT(__imp_, "The end iterator cannot be dereferenced"); + return __dereference(); + } + + _LIBCPP_HIDE_FROM_ABI + const directory_entry* operator->() const { return &**this; } + + _LIBCPP_HIDE_FROM_ABI + directory_iterator& operator++() { return __increment(); } + + _LIBCPP_HIDE_FROM_ABI + __dir_element_proxy operator++(int) { + __dir_element_proxy __p(**this); + __increment(); + return __p; + } + + _LIBCPP_HIDE_FROM_ABI + directory_iterator& increment(error_code& __ec) { return __increment(&__ec); } + +private: + inline _LIBCPP_HIDE_FROM_ABI friend bool + operator==(const directory_iterator& __lhs, + const directory_iterator& __rhs) noexcept; + + // construct the dir_stream + _LIBCPP_FUNC_VIS + directory_iterator(const path&, error_code*, + directory_options = directory_options::none); + + _LIBCPP_FUNC_VIS + directory_iterator& __increment(error_code* __ec = nullptr); + + _LIBCPP_FUNC_VIS + const directory_entry& __dereference() const; + +private: + shared_ptr<__dir_stream> __imp_; +}; + +inline _LIBCPP_HIDE_FROM_ABI bool +operator==(const directory_iterator& __lhs, + const directory_iterator& __rhs) noexcept { + return __lhs.__imp_ == __rhs.__imp_; +} + +inline _LIBCPP_HIDE_FROM_ABI bool +operator!=(const directory_iterator& __lhs, + const directory_iterator& __rhs) noexcept { + return !(__lhs == __rhs); +} + +// enable directory_iterator range-based for statements +inline _LIBCPP_HIDE_FROM_ABI directory_iterator +begin(directory_iterator __iter) noexcept { + return __iter; +} + +inline _LIBCPP_HIDE_FROM_ABI directory_iterator +end(directory_iterator) noexcept { + return directory_iterator(); +} + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#if _LIBCPP_STD_VER > 17 + +template <> +_LIBCPP_AVAILABILITY_FILESYSTEM +inline constexpr bool _VSTD::ranges::enable_borrowed_range<_VSTD_FS::directory_iterator> = true; + +template <> +_LIBCPP_AVAILABILITY_FILESYSTEM +inline constexpr bool _VSTD::ranges::enable_view<_VSTD_FS::directory_iterator> = true; + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_DIRECTORY_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/directory_options.h b/app/src/main/cpp/libcxx/include/__filesystem/directory_options.h new file mode 100644 index 0000000..c5c031a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/directory_options.h @@ -0,0 +1,82 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_DIRECTORY_OPTIONS_H +#define _LIBCPP___FILESYSTEM_DIRECTORY_OPTIONS_H + +#include <__availability> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +enum class _LIBCPP_ENUM_VIS directory_options : unsigned char { + none = 0, + follow_directory_symlink = 1, + skip_permission_denied = 2 +}; + +_LIBCPP_INLINE_VISIBILITY +inline constexpr directory_options operator&(directory_options __lhs, + directory_options __rhs) { + return static_cast(static_cast(__lhs) & + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr directory_options operator|(directory_options __lhs, + directory_options __rhs) { + return static_cast(static_cast(__lhs) | + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr directory_options operator^(directory_options __lhs, + directory_options __rhs) { + return static_cast(static_cast(__lhs) ^ + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr directory_options operator~(directory_options __lhs) { + return static_cast(~static_cast(__lhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline directory_options& operator&=(directory_options& __lhs, + directory_options __rhs) { + return __lhs = __lhs & __rhs; +} + +_LIBCPP_INLINE_VISIBILITY +inline directory_options& operator|=(directory_options& __lhs, + directory_options __rhs) { + return __lhs = __lhs | __rhs; +} + +_LIBCPP_INLINE_VISIBILITY +inline directory_options& operator^=(directory_options& __lhs, + directory_options __rhs) { + return __lhs = __lhs ^ __rhs; +} + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_DIRECTORY_OPTIONS_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/file_status.h b/app/src/main/cpp/libcxx/include/__filesystem/file_status.h new file mode 100644 index 0000000..ac3f6cb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/file_status.h @@ -0,0 +1,72 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_FILE_STATUS_H +#define _LIBCPP___FILESYSTEM_FILE_STATUS_H + +#include <__availability> +#include <__config> +#include <__filesystem/file_type.h> +#include <__filesystem/perms.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +class _LIBCPP_TYPE_VIS file_status { +public: + // constructors + _LIBCPP_INLINE_VISIBILITY + file_status() noexcept : file_status(file_type::none) {} + _LIBCPP_INLINE_VISIBILITY + explicit file_status(file_type __ft, perms __prms = perms::unknown) noexcept + : __ft_(__ft), + __prms_(__prms) {} + + file_status(const file_status&) noexcept = default; + file_status(file_status&&) noexcept = default; + + _LIBCPP_INLINE_VISIBILITY + ~file_status() {} + + file_status& operator=(const file_status&) noexcept = default; + file_status& operator=(file_status&&) noexcept = default; + + // observers + _LIBCPP_INLINE_VISIBILITY + file_type type() const noexcept { return __ft_; } + + _LIBCPP_INLINE_VISIBILITY + perms permissions() const noexcept { return __prms_; } + + // modifiers + _LIBCPP_INLINE_VISIBILITY + void type(file_type __ft) noexcept { __ft_ = __ft; } + + _LIBCPP_INLINE_VISIBILITY + void permissions(perms __p) noexcept { __prms_ = __p; } + +private: + file_type __ft_; + perms __prms_; +}; + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_FILE_STATUS_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/file_time_type.h b/app/src/main/cpp/libcxx/include/__filesystem/file_time_type.h new file mode 100644 index 0000000..7c4932e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/file_time_type.h @@ -0,0 +1,32 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_FILE_TIME_TYPE_H +#define _LIBCPP___FILESYSTEM_FILE_TIME_TYPE_H + +#include <__availability> +#include <__chrono/file_clock.h> +#include <__chrono/time_point.h> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +typedef chrono::time_point<_FilesystemClock> file_time_type; + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_FILE_TIME_TYPE_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/file_type.h b/app/src/main/cpp/libcxx/include/__filesystem/file_type.h new file mode 100644 index 0000000..c756a05 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/file_type.h @@ -0,0 +1,43 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_FILE_TYPE_H +#define _LIBCPP___FILESYSTEM_FILE_TYPE_H + +#include <__availability> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +// On Windows, the library never identifies files as block, character, fifo +// or socket. +enum class _LIBCPP_ENUM_VIS file_type : signed char { + none = 0, + not_found = -1, + regular = 1, + directory = 2, + symlink = 3, + block = 4, + character = 5, + fifo = 6, + socket = 7, + unknown = 8 +}; + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_FILE_TYPE_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/filesystem_error.h b/app/src/main/cpp/libcxx/include/__filesystem/filesystem_error.h new file mode 100644 index 0000000..effe699 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/filesystem_error.h @@ -0,0 +1,104 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H +#define _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H + +#include <__availability> +#include <__config> +#include <__filesystem/path.h> +#include <__memory/shared_ptr.h> +#include <__utility/forward.h> +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +class _LIBCPP_AVAILABILITY_FILESYSTEM _LIBCPP_EXCEPTION_ABI filesystem_error : public system_error { +public: + _LIBCPP_INLINE_VISIBILITY + filesystem_error(const string& __what, error_code __ec) + : system_error(__ec, __what), + __storage_(make_shared<_Storage>(path(), path())) { + __create_what(0); + } + + _LIBCPP_INLINE_VISIBILITY + filesystem_error(const string& __what, const path& __p1, error_code __ec) + : system_error(__ec, __what), + __storage_(make_shared<_Storage>(__p1, path())) { + __create_what(1); + } + + _LIBCPP_INLINE_VISIBILITY + filesystem_error(const string& __what, const path& __p1, const path& __p2, + error_code __ec) + : system_error(__ec, __what), + __storage_(make_shared<_Storage>(__p1, __p2)) { + __create_what(2); + } + + _LIBCPP_INLINE_VISIBILITY + const path& path1() const noexcept { return __storage_->__p1_; } + + _LIBCPP_INLINE_VISIBILITY + const path& path2() const noexcept { return __storage_->__p2_; } + + filesystem_error(const filesystem_error&) = default; + ~filesystem_error() override; // key function + + _LIBCPP_HIDE_FROM_ABI_VIRTUAL + const char* what() const noexcept override { + return __storage_->__what_.c_str(); + } + + void __create_what(int __num_paths); + +private: + struct _LIBCPP_HIDDEN _Storage { + _LIBCPP_INLINE_VISIBILITY + _Storage(const path& __p1, const path& __p2) : __p1_(__p1), __p2_(__p2) {} + + path __p1_; + path __p2_; + string __what_; + }; + shared_ptr<_Storage> __storage_; +}; + +// TODO(ldionne): We need to pop the pragma and push it again after +// filesystem_error to work around PR41078. +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +template +_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY +#ifndef _LIBCPP_NO_EXCEPTIONS +void __throw_filesystem_error(_Args&&... __args) { + throw filesystem_error(_VSTD::forward<_Args>(__args)...); +} +#else +void __throw_filesystem_error(_Args&&...) { + _VSTD::abort(); +} +#endif +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_FILESYSTEM_ERROR_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/operations.h b/app/src/main/cpp/libcxx/include/__filesystem/operations.h new file mode 100644 index 0000000..f48d301 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/operations.h @@ -0,0 +1,201 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_OPERATIONS_H +#define _LIBCPP___FILESYSTEM_OPERATIONS_H + +#include <__availability> +#include <__chrono/time_point.h> +#include <__config> +#include <__filesystem/copy_options.h> +#include <__filesystem/file_status.h> +#include <__filesystem/file_time_type.h> +#include <__filesystem/file_type.h> +#include <__filesystem/path.h> +#include <__filesystem/perm_options.h> +#include <__filesystem/perms.h> +#include <__filesystem/space_info.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +_LIBCPP_FUNC_VIS path __absolute(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS path __canonical(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS bool __copy_file(const path& __from, const path& __to, copy_options __opt, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS void __copy_symlink(const path& __existing_symlink, const path& __new_symlink, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS void __copy(const path& __from, const path& __to, copy_options __opt, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS bool __create_directories(const path&, error_code* = nullptr); +_LIBCPP_FUNC_VIS void __create_directory_symlink(const path& __to, const path& __new_symlink, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS bool __create_directory(const path&, error_code* = nullptr); +_LIBCPP_FUNC_VIS bool __create_directory(const path&, const path& __attributes, error_code* = nullptr); +_LIBCPP_FUNC_VIS void __create_hard_link(const path& __to, const path& __new_hard_link, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS void __create_symlink(const path& __to, const path& __new_symlink, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS path __current_path(error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS void __current_path(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS bool __equivalent(const path&, const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS file_status __status(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS uintmax_t __file_size(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS uintmax_t __hard_link_count(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS file_status __symlink_status(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS file_time_type __last_write_time(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS void __last_write_time(const path&, file_time_type __new_time, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS path __weakly_canonical(path const& __p, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS path __read_symlink(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS uintmax_t __remove_all(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS bool __remove(const path&, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS void __rename(const path& __from, const path& __to, error_code* __ec = nullptr); +_LIBCPP_FUNC_VIS void __resize_file(const path&, uintmax_t __size, error_code* = nullptr); +_LIBCPP_FUNC_VIS path __temp_directory_path(error_code* __ec = nullptr); + +inline _LIBCPP_HIDE_FROM_ABI path absolute(const path& __p) { return __absolute(__p); } +inline _LIBCPP_HIDE_FROM_ABI path absolute(const path& __p, error_code& __ec) { return __absolute(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI path canonical(const path& __p) { return __canonical(__p); } +inline _LIBCPP_HIDE_FROM_ABI path canonical(const path& __p, error_code& __ec) { return __canonical(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool copy_file(const path& __from, const path& __to) { return __copy_file(__from, __to, copy_options::none); } +inline _LIBCPP_HIDE_FROM_ABI bool copy_file(const path& __from, const path& __to, error_code& __ec) { return __copy_file(__from, __to, copy_options::none, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool copy_file(const path& __from, const path& __to, copy_options __opt) { return __copy_file(__from, __to, __opt); } +inline _LIBCPP_HIDE_FROM_ABI bool copy_file(const path& __from, const path& __to, copy_options __opt, error_code& __ec) { return __copy_file(__from, __to, __opt, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void copy_symlink(const path& __from, const path& __to) { __copy_symlink(__from, __to); } +inline _LIBCPP_HIDE_FROM_ABI void copy_symlink(const path& __from, const path& __to, error_code& __ec) noexcept { __copy_symlink(__from, __to, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void copy(const path& __from, const path& __to) { __copy(__from, __to, copy_options::none); } +inline _LIBCPP_HIDE_FROM_ABI void copy(const path& __from, const path& __to, error_code& __ec) { __copy(__from, __to, copy_options::none, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void copy(const path& __from, const path& __to, copy_options __opt) { __copy(__from, __to, __opt); } +inline _LIBCPP_HIDE_FROM_ABI void copy(const path& __from, const path& __to, copy_options __opt, error_code& __ec) { __copy(__from, __to, __opt, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool create_directories(const path& __p) { return __create_directories(__p); } +inline _LIBCPP_HIDE_FROM_ABI bool create_directories(const path& __p, error_code& __ec) { return __create_directories(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void create_directory_symlink(const path& __target, const path& __link) { __create_directory_symlink(__target, __link); } +inline _LIBCPP_HIDE_FROM_ABI void create_directory_symlink(const path& __target, const path& __link, error_code& __ec) noexcept { __create_directory_symlink(__target, __link, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool create_directory(const path& __p) { return __create_directory(__p); } +inline _LIBCPP_HIDE_FROM_ABI bool create_directory(const path& __p, error_code& __ec) noexcept { return __create_directory(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool create_directory(const path& __p, const path& __attrs) { return __create_directory(__p, __attrs); } +inline _LIBCPP_HIDE_FROM_ABI bool create_directory(const path& __p, const path& __attrs, error_code& __ec) noexcept { return __create_directory(__p, __attrs, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void create_hard_link(const path& __target, const path& __link) { __create_hard_link(__target, __link); } +inline _LIBCPP_HIDE_FROM_ABI void create_hard_link(const path& __target, const path& __link, error_code& __ec) noexcept { __create_hard_link(__target, __link, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void create_symlink(const path& __target, const path& __link) { __create_symlink(__target, __link); } +inline _LIBCPP_HIDE_FROM_ABI void create_symlink(const path& __target, const path& __link, error_code& __ec) noexcept { return __create_symlink(__target, __link, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI path current_path() { return __current_path(); } +inline _LIBCPP_HIDE_FROM_ABI path current_path(error_code& __ec) { return __current_path(&__ec); } +inline _LIBCPP_HIDE_FROM_ABI void current_path(const path& __p) { __current_path(__p); } +inline _LIBCPP_HIDE_FROM_ABI void current_path(const path& __p, error_code& __ec) noexcept { __current_path(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool equivalent(const path& __p1, const path& __p2) { return __equivalent(__p1, __p2); } +inline _LIBCPP_HIDE_FROM_ABI bool equivalent(const path& __p1, const path& __p2, error_code& __ec) noexcept { return __equivalent(__p1, __p2, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool status_known(file_status __s) noexcept { return __s.type() != file_type::none; } +inline _LIBCPP_HIDE_FROM_ABI bool exists(file_status __s) noexcept { return status_known(__s) && __s.type() != file_type::not_found; } +inline _LIBCPP_HIDE_FROM_ABI bool exists(const path& __p) { return exists(__status(__p)); } + +inline _LIBCPP_INLINE_VISIBILITY bool exists(const path& __p, error_code& __ec) noexcept { + auto __s = __status(__p, &__ec); + if (status_known(__s)) + __ec.clear(); + return exists(__s); +} + +inline _LIBCPP_HIDE_FROM_ABI uintmax_t file_size(const path& __p) { return __file_size(__p); } +inline _LIBCPP_HIDE_FROM_ABI uintmax_t file_size(const path& __p, error_code& __ec) noexcept { return __file_size(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI uintmax_t hard_link_count(const path& __p) { return __hard_link_count(__p); } +inline _LIBCPP_HIDE_FROM_ABI uintmax_t hard_link_count(const path& __p, error_code& __ec) noexcept { return __hard_link_count(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool is_block_file(file_status __s) noexcept { return __s.type() == file_type::block; } +inline _LIBCPP_HIDE_FROM_ABI bool is_block_file(const path& __p) { return is_block_file(__status(__p)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_block_file(const path& __p, error_code& __ec) noexcept { return is_block_file(__status(__p, &__ec)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_character_file(file_status __s) noexcept { return __s.type() == file_type::character; } +inline _LIBCPP_HIDE_FROM_ABI bool is_character_file(const path& __p) { return is_character_file(__status(__p)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_character_file(const path& __p, error_code& __ec) noexcept { return is_character_file(__status(__p, &__ec)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_directory(file_status __s) noexcept { return __s.type() == file_type::directory; } +inline _LIBCPP_HIDE_FROM_ABI bool is_directory(const path& __p) { return is_directory(__status(__p)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_directory(const path& __p, error_code& __ec) noexcept { return is_directory(__status(__p, &__ec)); } +_LIBCPP_FUNC_VIS bool __fs_is_empty(const path& __p, error_code* __ec = nullptr); +inline _LIBCPP_HIDE_FROM_ABI bool is_empty(const path& __p) { return __fs_is_empty(__p); } +inline _LIBCPP_HIDE_FROM_ABI bool is_empty(const path& __p, error_code& __ec) { return __fs_is_empty(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool is_fifo(file_status __s) noexcept { return __s.type() == file_type::fifo; } +inline _LIBCPP_HIDE_FROM_ABI bool is_fifo(const path& __p) { return is_fifo(__status(__p)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_fifo(const path& __p, error_code& __ec) noexcept { return is_fifo(__status(__p, &__ec)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_regular_file(file_status __s) noexcept { return __s.type() == file_type::regular; } +inline _LIBCPP_HIDE_FROM_ABI bool is_regular_file(const path& __p) { return is_regular_file(__status(__p)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_regular_file(const path& __p, error_code& __ec) noexcept { return is_regular_file(__status(__p, &__ec)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_symlink(file_status __s) noexcept { return __s.type() == file_type::symlink; } +inline _LIBCPP_HIDE_FROM_ABI bool is_symlink(const path& __p) { return is_symlink(__symlink_status(__p)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_symlink(const path& __p, error_code& __ec) noexcept { return is_symlink(__symlink_status(__p, &__ec)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_other(file_status __s) noexcept { return exists(__s) && !is_regular_file(__s) && !is_directory(__s) && !is_symlink(__s); } +inline _LIBCPP_HIDE_FROM_ABI bool is_other(const path& __p) { return is_other(__status(__p)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_other(const path& __p, error_code& __ec) noexcept { return is_other(__status(__p, &__ec)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_socket(file_status __s) noexcept { return __s.type() == file_type::socket; } +inline _LIBCPP_HIDE_FROM_ABI bool is_socket(const path& __p) { return is_socket(__status(__p)); } +inline _LIBCPP_HIDE_FROM_ABI bool is_socket(const path& __p, error_code& __ec) noexcept { return is_socket(__status(__p, &__ec)); } +inline _LIBCPP_HIDE_FROM_ABI file_time_type last_write_time(const path& __p) { return __last_write_time(__p); } +inline _LIBCPP_HIDE_FROM_ABI file_time_type last_write_time(const path& __p, error_code& __ec) noexcept { return __last_write_time(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void last_write_time(const path& __p, file_time_type __t) { __last_write_time(__p, __t); } +inline _LIBCPP_HIDE_FROM_ABI void last_write_time(const path& __p, file_time_type __t, error_code& __ec) noexcept { __last_write_time(__p, __t, &__ec); } +_LIBCPP_FUNC_VIS void __permissions(const path&, perms, perm_options, error_code* = nullptr); +inline _LIBCPP_HIDE_FROM_ABI void permissions(const path& __p, perms __prms, perm_options __opts = perm_options::replace) { __permissions(__p, __prms, __opts); } +inline _LIBCPP_HIDE_FROM_ABI void permissions(const path& __p, perms __prms, error_code& __ec) noexcept { __permissions(__p, __prms, perm_options::replace, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void permissions(const path& __p, perms __prms, perm_options __opts, error_code& __ec) { __permissions(__p, __prms, __opts, &__ec); } + +inline _LIBCPP_INLINE_VISIBILITY path proximate(const path& __p, const path& __base, error_code& __ec) { + path __tmp = __weakly_canonical(__p, &__ec); + if (__ec) + return {}; + path __tmp_base = __weakly_canonical(__base, &__ec); + if (__ec) + return {}; + return __tmp.lexically_proximate(__tmp_base); +} + +inline _LIBCPP_HIDE_FROM_ABI path proximate(const path& __p, error_code& __ec) { return proximate(__p, current_path(), __ec); } +inline _LIBCPP_HIDE_FROM_ABI path proximate(const path& __p, const path& __base = current_path()) { return __weakly_canonical(__p).lexically_proximate(__weakly_canonical(__base)); } +inline _LIBCPP_HIDE_FROM_ABI path read_symlink(const path& __p) { return __read_symlink(__p); } +inline _LIBCPP_HIDE_FROM_ABI path read_symlink(const path& __p, error_code& __ec) { return __read_symlink(__p, &__ec); } + +inline _LIBCPP_INLINE_VISIBILITY path relative(const path& __p, const path& __base, error_code& __ec) { + path __tmp = __weakly_canonical(__p, &__ec); + if (__ec) + return path(); + path __tmpbase = __weakly_canonical(__base, &__ec); + if (__ec) + return path(); + return __tmp.lexically_relative(__tmpbase); +} + +inline _LIBCPP_HIDE_FROM_ABI path relative(const path& __p, error_code& __ec) { return relative(__p, current_path(), __ec); } +inline _LIBCPP_HIDE_FROM_ABI path relative(const path& __p, const path& __base = current_path()) { return __weakly_canonical(__p).lexically_relative(__weakly_canonical(__base)); } +inline _LIBCPP_HIDE_FROM_ABI uintmax_t remove_all(const path& __p) { return __remove_all(__p); } +inline _LIBCPP_HIDE_FROM_ABI uintmax_t remove_all(const path& __p, error_code& __ec) { return __remove_all(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI bool remove(const path& __p) { return __remove(__p); } +inline _LIBCPP_HIDE_FROM_ABI bool remove(const path& __p, error_code& __ec) noexcept { return __remove(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void rename(const path& __from, const path& __to) { return __rename(__from, __to); } +inline _LIBCPP_HIDE_FROM_ABI void rename(const path& __from, const path& __to, error_code& __ec) noexcept { return __rename(__from, __to, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI void resize_file(const path& __p, uintmax_t __ns) { return __resize_file(__p, __ns); } +inline _LIBCPP_HIDE_FROM_ABI void resize_file(const path& __p, uintmax_t __ns, error_code& __ec) noexcept { return __resize_file(__p, __ns, &__ec); } +_LIBCPP_FUNC_VIS space_info __space(const path&, error_code* __ec = nullptr); +inline _LIBCPP_HIDE_FROM_ABI space_info space(const path& __p) { return __space(__p); } +inline _LIBCPP_HIDE_FROM_ABI space_info space(const path& __p, error_code& __ec) noexcept { return __space(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI file_status status(const path& __p) { return __status(__p); } +inline _LIBCPP_HIDE_FROM_ABI file_status status(const path& __p, error_code& __ec) noexcept { return __status(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI file_status symlink_status(const path& __p) { return __symlink_status(__p); } +inline _LIBCPP_HIDE_FROM_ABI file_status symlink_status(const path& __p, error_code& __ec) noexcept { return __symlink_status(__p, &__ec); } +inline _LIBCPP_HIDE_FROM_ABI path temp_directory_path() { return __temp_directory_path(); } +inline _LIBCPP_HIDE_FROM_ABI path temp_directory_path(error_code& __ec) { return __temp_directory_path(&__ec); } +inline _LIBCPP_HIDE_FROM_ABI path weakly_canonical(path const& __p) { return __weakly_canonical(__p); } +inline _LIBCPP_HIDE_FROM_ABI path weakly_canonical(path const& __p, error_code& __ec) { return __weakly_canonical(__p, &__ec); } + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_OPERATIONS_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/path.h b/app/src/main/cpp/libcxx/include/__filesystem/path.h new file mode 100644 index 0000000..4e6912f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/path.h @@ -0,0 +1,1091 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_PATH_H +#define _LIBCPP___FILESYSTEM_PATH_H + +#include <__algorithm/replace.h> +#include <__algorithm/replace_copy.h> +#include <__availability> +#include <__config> +#include <__iterator/back_insert_iterator.h> +#include <__iterator/iterator_traits.h> +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) +# include // for quoted +# include +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +template +struct __can_convert_char { + static const bool value = false; +}; +template +struct __can_convert_char : public __can_convert_char<_Tp> {}; +template <> +struct __can_convert_char { + static const bool value = true; + using __char_type = char; +}; +template <> +struct __can_convert_char { + static const bool value = true; + using __char_type = wchar_t; +}; +#ifndef _LIBCPP_HAS_NO_CHAR8_T +template <> +struct __can_convert_char { + static const bool value = true; + using __char_type = char8_t; +}; +#endif +template <> +struct __can_convert_char { + static const bool value = true; + using __char_type = char16_t; +}; +template <> +struct __can_convert_char { + static const bool value = true; + using __char_type = char32_t; +}; + +template +_LIBCPP_HIDE_FROM_ABI +typename enable_if<__can_convert_char<_ECharT>::value, bool>::type +__is_separator(_ECharT __e) { +#if defined(_LIBCPP_WIN32API) + return __e == _ECharT('/') || __e == _ECharT('\\'); +#else + return __e == _ECharT('/'); +#endif +} + +#ifndef _LIBCPP_HAS_NO_CHAR8_T +typedef u8string __u8_string; +#else +typedef string __u8_string; +#endif + +struct _NullSentinel {}; + +template +using _Void = void; + +template +struct __is_pathable_string : public false_type {}; + +template +struct __is_pathable_string< + basic_string<_ECharT, _Traits, _Alloc>, + _Void::__char_type> > + : public __can_convert_char<_ECharT> { + using _Str = basic_string<_ECharT, _Traits, _Alloc>; + using _Base = __can_convert_char<_ECharT>; + + _LIBCPP_HIDE_FROM_ABI + static _ECharT const* __range_begin(_Str const& __s) { return __s.data(); } + + _LIBCPP_HIDE_FROM_ABI + static _ECharT const* __range_end(_Str const& __s) { + return __s.data() + __s.length(); + } + + _LIBCPP_HIDE_FROM_ABI + static _ECharT __first_or_null(_Str const& __s) { + return __s.empty() ? _ECharT{} : __s[0]; + } +}; + +template +struct __is_pathable_string< + basic_string_view<_ECharT, _Traits>, + _Void::__char_type> > + : public __can_convert_char<_ECharT> { + using _Str = basic_string_view<_ECharT, _Traits>; + using _Base = __can_convert_char<_ECharT>; + + _LIBCPP_HIDE_FROM_ABI + static _ECharT const* __range_begin(_Str const& __s) { return __s.data(); } + + _LIBCPP_HIDE_FROM_ABI + static _ECharT const* __range_end(_Str const& __s) { + return __s.data() + __s.length(); + } + + _LIBCPP_HIDE_FROM_ABI + static _ECharT __first_or_null(_Str const& __s) { + return __s.empty() ? _ECharT{} : __s[0]; + } +}; + +template ::type, + class _UnqualPtrType = + __remove_const_t<__remove_pointer_t<_DS> >, + bool _IsCharPtr = is_pointer<_DS>::value&& + __can_convert_char<_UnqualPtrType>::value> +struct __is_pathable_char_array : false_type {}; + +template +struct __is_pathable_char_array<_Source, _ECharT*, _UPtr, true> + : __can_convert_char<__remove_const_t<_ECharT> > { + using _Base = __can_convert_char<__remove_const_t<_ECharT> >; + + _LIBCPP_HIDE_FROM_ABI + static _ECharT const* __range_begin(const _ECharT* __b) { return __b; } + + _LIBCPP_HIDE_FROM_ABI + static _ECharT const* __range_end(const _ECharT* __b) { + using _Iter = const _ECharT*; + const _ECharT __sentinel = _ECharT{}; + _Iter __e = __b; + for (; *__e != __sentinel; ++__e) + ; + return __e; + } + + _LIBCPP_HIDE_FROM_ABI + static _ECharT __first_or_null(const _ECharT* __b) { return *__b; } +}; + +template ::value, + class = void> +struct __is_pathable_iter : false_type {}; + +template +struct __is_pathable_iter< + _Iter, true, + _Void::value_type>::__char_type> > + : __can_convert_char::value_type> { + using _ECharT = typename iterator_traits<_Iter>::value_type; + using _Base = __can_convert_char<_ECharT>; + + _LIBCPP_HIDE_FROM_ABI + static _Iter __range_begin(_Iter __b) { return __b; } + + _LIBCPP_HIDE_FROM_ABI + static _NullSentinel __range_end(_Iter) { return _NullSentinel{}; } + + _LIBCPP_HIDE_FROM_ABI + static _ECharT __first_or_null(_Iter __b) { return *__b; } +}; + +template ::value, + bool _IsCharIterT = __is_pathable_char_array<_Tp>::value, + bool _IsIterT = !_IsCharIterT && __is_pathable_iter<_Tp>::value> +struct __is_pathable : false_type { + static_assert(!_IsStringT && !_IsCharIterT && !_IsIterT, "Must all be false"); +}; + +template +struct __is_pathable<_Tp, true, false, false> : __is_pathable_string<_Tp> {}; + +template +struct __is_pathable<_Tp, false, true, false> : __is_pathable_char_array<_Tp> { +}; + +template +struct __is_pathable<_Tp, false, false, true> : __is_pathable_iter<_Tp> {}; + +#if defined(_LIBCPP_WIN32API) +typedef wstring __path_string; +typedef wchar_t __path_value; +#else +typedef string __path_string; +typedef char __path_value; +#endif + +#if defined(_LIBCPP_WIN32API) +_LIBCPP_FUNC_VIS +size_t __wide_to_char(const wstring&, char*, size_t); +_LIBCPP_FUNC_VIS +size_t __char_to_wide(const string&, wchar_t*, size_t); +#endif + +template +struct _PathCVT; + +#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) +template +struct _PathCVT { + static_assert(__can_convert_char<_ECharT>::value, + "Char type not convertible"); + + typedef __narrow_to_utf8 _Narrower; +#if defined(_LIBCPP_WIN32API) + typedef __widen_from_utf8 _Widener; +#endif + + _LIBCPP_HIDE_FROM_ABI + static void __append_range(__path_string& __dest, _ECharT const* __b, + _ECharT const* __e) { +#if defined(_LIBCPP_WIN32API) + string __utf8; + _Narrower()(back_inserter(__utf8), __b, __e); + _Widener()(back_inserter(__dest), __utf8.data(), __utf8.data() + __utf8.size()); +#else + _Narrower()(back_inserter(__dest), __b, __e); +#endif + } + + template + _LIBCPP_HIDE_FROM_ABI + static void __append_range(__path_string& __dest, _Iter __b, _Iter __e) { + static_assert(!is_same<_Iter, _ECharT*>::value, "Call const overload"); + if (__b == __e) + return; + basic_string<_ECharT> __tmp(__b, __e); +#if defined(_LIBCPP_WIN32API) + string __utf8; + _Narrower()(back_inserter(__utf8), __tmp.data(), + __tmp.data() + __tmp.length()); + _Widener()(back_inserter(__dest), __utf8.data(), __utf8.data() + __utf8.size()); +#else + _Narrower()(back_inserter(__dest), __tmp.data(), + __tmp.data() + __tmp.length()); +#endif + } + + template + _LIBCPP_HIDE_FROM_ABI + static void __append_range(__path_string& __dest, _Iter __b, _NullSentinel) { + static_assert(!is_same<_Iter, _ECharT*>::value, "Call const overload"); + const _ECharT __sentinel = _ECharT{}; + if (*__b == __sentinel) + return; + basic_string<_ECharT> __tmp; + for (; *__b != __sentinel; ++__b) + __tmp.push_back(*__b); +#if defined(_LIBCPP_WIN32API) + string __utf8; + _Narrower()(back_inserter(__utf8), __tmp.data(), + __tmp.data() + __tmp.length()); + _Widener()(back_inserter(__dest), __utf8.data(), __utf8.data() + __utf8.size()); +#else + _Narrower()(back_inserter(__dest), __tmp.data(), + __tmp.data() + __tmp.length()); +#endif + } + + template + _LIBCPP_HIDE_FROM_ABI + static void __append_source(__path_string& __dest, _Source const& __s) { + using _Traits = __is_pathable<_Source>; + __append_range(__dest, _Traits::__range_begin(__s), + _Traits::__range_end(__s)); + } +}; +#endif // !_LIBCPP_HAS_NO_LOCALIZATION + +template <> +struct _PathCVT<__path_value> { + + template + _LIBCPP_HIDE_FROM_ABI + static typename enable_if<__is_exactly_cpp17_input_iterator<_Iter>::value>::type + __append_range(__path_string& __dest, _Iter __b, _Iter __e) { + for (; __b != __e; ++__b) + __dest.push_back(*__b); + } + + template + _LIBCPP_HIDE_FROM_ABI + static typename enable_if<__is_cpp17_forward_iterator<_Iter>::value>::type + __append_range(__path_string& __dest, _Iter __b, _Iter __e) { + __dest.append(__b, __e); + } + + template + _LIBCPP_HIDE_FROM_ABI + static void __append_range(__path_string& __dest, _Iter __b, _NullSentinel) { + const char __sentinel = char{}; + for (; *__b != __sentinel; ++__b) + __dest.push_back(*__b); + } + + template + _LIBCPP_HIDE_FROM_ABI + static void __append_source(__path_string& __dest, _Source const& __s) { + using _Traits = __is_pathable<_Source>; + __append_range(__dest, _Traits::__range_begin(__s), + _Traits::__range_end(__s)); + } +}; + +#if defined(_LIBCPP_WIN32API) +template <> +struct _PathCVT { + + _LIBCPP_HIDE_FROM_ABI + static void + __append_string(__path_string& __dest, const basic_string &__str) { + size_t __size = __char_to_wide(__str, nullptr, 0); + size_t __pos = __dest.size(); + __dest.resize(__pos + __size); + __char_to_wide(__str, const_cast<__path_value*>(__dest.data()) + __pos, __size); + } + + template + _LIBCPP_HIDE_FROM_ABI + static typename enable_if<__is_exactly_cpp17_input_iterator<_Iter>::value>::type + __append_range(__path_string& __dest, _Iter __b, _Iter __e) { + basic_string __tmp(__b, __e); + __append_string(__dest, __tmp); + } + + template + _LIBCPP_HIDE_FROM_ABI + static typename enable_if<__is_cpp17_forward_iterator<_Iter>::value>::type + __append_range(__path_string& __dest, _Iter __b, _Iter __e) { + basic_string __tmp(__b, __e); + __append_string(__dest, __tmp); + } + + template + _LIBCPP_HIDE_FROM_ABI + static void __append_range(__path_string& __dest, _Iter __b, _NullSentinel) { + const char __sentinel = char{}; + basic_string __tmp; + for (; *__b != __sentinel; ++__b) + __tmp.push_back(*__b); + __append_string(__dest, __tmp); + } + + template + _LIBCPP_HIDE_FROM_ABI + static void __append_source(__path_string& __dest, _Source const& __s) { + using _Traits = __is_pathable<_Source>; + __append_range(__dest, _Traits::__range_begin(__s), + _Traits::__range_end(__s)); + } +}; + +template +struct _PathExport { + typedef __narrow_to_utf8 _Narrower; + typedef __widen_from_utf8 _Widener; + + template + _LIBCPP_HIDE_FROM_ABI + static void __append(_Str& __dest, const __path_string& __src) { + string __utf8; + _Narrower()(back_inserter(__utf8), __src.data(), __src.data() + __src.size()); + _Widener()(back_inserter(__dest), __utf8.data(), __utf8.data() + __utf8.size()); + } +}; + +template <> +struct _PathExport { + template + _LIBCPP_HIDE_FROM_ABI + static void __append(_Str& __dest, const __path_string& __src) { + size_t __size = __wide_to_char(__src, nullptr, 0); + size_t __pos = __dest.size(); + __dest.resize(__size); + __wide_to_char(__src, const_cast(__dest.data()) + __pos, __size); + } +}; + +template <> +struct _PathExport { + template + _LIBCPP_HIDE_FROM_ABI + static void __append(_Str& __dest, const __path_string& __src) { + __dest.append(__src.begin(), __src.end()); + } +}; + +template <> +struct _PathExport { + template + _LIBCPP_HIDE_FROM_ABI + static void __append(_Str& __dest, const __path_string& __src) { + __dest.append(__src.begin(), __src.end()); + } +}; + +#ifndef _LIBCPP_HAS_NO_CHAR8_T +template <> +struct _PathExport { + typedef __narrow_to_utf8 _Narrower; + + template + _LIBCPP_HIDE_FROM_ABI + static void __append(_Str& __dest, const __path_string& __src) { + _Narrower()(back_inserter(__dest), __src.data(), __src.data() + __src.size()); + } +}; +#endif /* !_LIBCPP_HAS_NO_CHAR8_T */ +#endif /* _LIBCPP_WIN32API */ + +class _LIBCPP_TYPE_VIS path { + template + using _EnableIfPathable = + typename enable_if<__is_pathable<_SourceOrIter>::value, _Tp>::type; + + template + using _SourceChar = typename __is_pathable<_Tp>::__char_type; + + template + using _SourceCVT = _PathCVT<_SourceChar<_Tp> >; + +public: +#if defined(_LIBCPP_WIN32API) + typedef wchar_t value_type; + static constexpr value_type preferred_separator = L'\\'; +#else + typedef char value_type; + static constexpr value_type preferred_separator = '/'; +#endif + typedef basic_string string_type; + typedef basic_string_view __string_view; + + enum _LIBCPP_ENUM_VIS format : unsigned char { + auto_format, + native_format, + generic_format + }; + + // constructors and destructor + _LIBCPP_HIDE_FROM_ABI path() noexcept {} + _LIBCPP_HIDE_FROM_ABI path(const path& __p) : __pn_(__p.__pn_) {} + _LIBCPP_HIDE_FROM_ABI path(path&& __p) noexcept + : __pn_(_VSTD::move(__p.__pn_)) {} + + _LIBCPP_HIDE_FROM_ABI + path(string_type&& __s, format = format::auto_format) noexcept + : __pn_(_VSTD::move(__s)) {} + + template > + _LIBCPP_HIDE_FROM_ABI + path(const _Source& __src, format = format::auto_format) { + _SourceCVT<_Source>::__append_source(__pn_, __src); + } + + template + _LIBCPP_HIDE_FROM_ABI + path(_InputIt __first, _InputIt __last, format = format::auto_format) { + typedef typename iterator_traits<_InputIt>::value_type _ItVal; + _PathCVT<_ItVal>::__append_range(__pn_, __first, __last); + } + +/* +#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) + // TODO Implement locale conversions. + template > + path(const _Source& __src, const locale& __loc, format = format::auto_format); + template + path(_InputIt __first, _InputIt _last, const locale& __loc, + format = format::auto_format); +#endif +*/ + + _LIBCPP_HIDE_FROM_ABI + ~path() = default; + + // assignments + _LIBCPP_HIDE_FROM_ABI + path& operator=(const path& __p) { + __pn_ = __p.__pn_; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& operator=(path&& __p) noexcept { + __pn_ = _VSTD::move(__p.__pn_); + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& operator=(string_type&& __s) noexcept { + __pn_ = _VSTD::move(__s); + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& assign(string_type&& __s) noexcept { + __pn_ = _VSTD::move(__s); + return *this; + } + + template + _LIBCPP_HIDE_FROM_ABI _EnableIfPathable<_Source> + operator=(const _Source& __src) { + return this->assign(__src); + } + + template + _LIBCPP_HIDE_FROM_ABI + _EnableIfPathable<_Source> assign(const _Source& __src) { + __pn_.clear(); + _SourceCVT<_Source>::__append_source(__pn_, __src); + return *this; + } + + template + _LIBCPP_HIDE_FROM_ABI + path& assign(_InputIt __first, _InputIt __last) { + typedef typename iterator_traits<_InputIt>::value_type _ItVal; + __pn_.clear(); + _PathCVT<_ItVal>::__append_range(__pn_, __first, __last); + return *this; + } + +public: + // appends +#if defined(_LIBCPP_WIN32API) + _LIBCPP_HIDE_FROM_ABI + path& operator/=(const path& __p) { + auto __p_root_name = __p.__root_name(); + auto __p_root_name_size = __p_root_name.size(); + if (__p.is_absolute() || + (!__p_root_name.empty() && __p_root_name != __string_view(root_name().__pn_))) { + __pn_ = __p.__pn_; + return *this; + } + if (__p.has_root_directory()) { + path __root_name_str = root_name(); + __pn_ = __root_name_str.native(); + __pn_ += __string_view(__p.__pn_).substr(__p_root_name_size); + return *this; + } + if (has_filename() || (!has_root_directory() && is_absolute())) + __pn_ += preferred_separator; + __pn_ += __string_view(__p.__pn_).substr(__p_root_name_size); + return *this; + } + template + _LIBCPP_INLINE_VISIBILITY _EnableIfPathable<_Source> + operator/=(const _Source& __src) { + return operator/=(path(__src)); + } + + template + _LIBCPP_HIDE_FROM_ABI + _EnableIfPathable<_Source> append(const _Source& __src) { + return operator/=(path(__src)); + } + + template + _LIBCPP_HIDE_FROM_ABI + path& append(_InputIt __first, _InputIt __last) { + return operator/=(path(__first, __last)); + } +#else + _LIBCPP_HIDE_FROM_ABI + path& operator/=(const path& __p) { + if (__p.is_absolute()) { + __pn_ = __p.__pn_; + return *this; + } + if (has_filename()) + __pn_ += preferred_separator; + __pn_ += __p.native(); + return *this; + } + + // FIXME: Use _LIBCPP_DIAGNOSE_WARNING to produce a diagnostic when __src + // is known at compile time to be "/' since the user almost certainly intended + // to append a separator instead of overwriting the path with "/" + template + _LIBCPP_HIDE_FROM_ABI _EnableIfPathable<_Source> + operator/=(const _Source& __src) { + return this->append(__src); + } + + template + _LIBCPP_HIDE_FROM_ABI + _EnableIfPathable<_Source> append(const _Source& __src) { + using _Traits = __is_pathable<_Source>; + using _CVT = _PathCVT<_SourceChar<_Source> >; + bool __source_is_absolute = _VSTD_FS::__is_separator(_Traits::__first_or_null(__src)); + if (__source_is_absolute) + __pn_.clear(); + else if (has_filename()) + __pn_ += preferred_separator; + _CVT::__append_source(__pn_, __src); + return *this; + } + + template + _LIBCPP_HIDE_FROM_ABI + path& append(_InputIt __first, _InputIt __last) { + typedef typename iterator_traits<_InputIt>::value_type _ItVal; + static_assert(__can_convert_char<_ItVal>::value, "Must convertible"); + using _CVT = _PathCVT<_ItVal>; + if (__first != __last && _VSTD_FS::__is_separator(*__first)) + __pn_.clear(); + else if (has_filename()) + __pn_ += preferred_separator; + _CVT::__append_range(__pn_, __first, __last); + return *this; + } +#endif + + // concatenation + _LIBCPP_HIDE_FROM_ABI + path& operator+=(const path& __x) { + __pn_ += __x.__pn_; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& operator+=(const string_type& __x) { + __pn_ += __x; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& operator+=(__string_view __x) { + __pn_ += __x; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& operator+=(const value_type* __x) { + __pn_ += __x; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& operator+=(value_type __x) { + __pn_ += __x; + return *this; + } + + template + _LIBCPP_HIDE_FROM_ABI + typename enable_if<__can_convert_char<_ECharT>::value, path&>::type + operator+=(_ECharT __x) { + _PathCVT<_ECharT>::__append_source(__pn_, + basic_string_view<_ECharT>(&__x, 1)); + return *this; + } + + template + _LIBCPP_HIDE_FROM_ABI + _EnableIfPathable<_Source> operator+=(const _Source& __x) { + return this->concat(__x); + } + + template + _LIBCPP_HIDE_FROM_ABI + _EnableIfPathable<_Source> concat(const _Source& __x) { + _SourceCVT<_Source>::__append_source(__pn_, __x); + return *this; + } + + template + _LIBCPP_HIDE_FROM_ABI + path& concat(_InputIt __first, _InputIt __last) { + typedef typename iterator_traits<_InputIt>::value_type _ItVal; + _PathCVT<_ItVal>::__append_range(__pn_, __first, __last); + return *this; + } + + // modifiers + _LIBCPP_HIDE_FROM_ABI + void clear() noexcept { __pn_.clear(); } + + _LIBCPP_HIDE_FROM_ABI + path& make_preferred() { +#if defined(_LIBCPP_WIN32API) + _VSTD::replace(__pn_.begin(), __pn_.end(), L'/', L'\\'); +#endif + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& remove_filename() { + auto __fname = __filename(); + if (!__fname.empty()) + __pn_.erase(__fname.data() - __pn_.data()); + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + path& replace_filename(const path& __replacement) { + remove_filename(); + return (*this /= __replacement); + } + + path& replace_extension(const path& __replacement = path()); + + friend _LIBCPP_HIDE_FROM_ABI bool operator==(const path& __lhs, const path& __rhs) noexcept { + return __lhs.__compare(__rhs.__pn_) == 0; + } +# if _LIBCPP_STD_VER <= 17 + friend _LIBCPP_HIDE_FROM_ABI bool operator!=(const path& __lhs, const path& __rhs) noexcept { + return __lhs.__compare(__rhs.__pn_) != 0; + } + friend _LIBCPP_HIDE_FROM_ABI bool operator<(const path& __lhs, const path& __rhs) noexcept { + return __lhs.__compare(__rhs.__pn_) < 0; + } + friend _LIBCPP_HIDE_FROM_ABI bool operator<=(const path& __lhs, const path& __rhs) noexcept { + return __lhs.__compare(__rhs.__pn_) <= 0; + } + friend _LIBCPP_HIDE_FROM_ABI bool operator>(const path& __lhs, const path& __rhs) noexcept { + return __lhs.__compare(__rhs.__pn_) > 0; + } + friend _LIBCPP_HIDE_FROM_ABI bool operator>=(const path& __lhs, const path& __rhs) noexcept { + return __lhs.__compare(__rhs.__pn_) >= 0; + } +# else // _LIBCPP_STD_VER <= 17 + friend _LIBCPP_HIDE_FROM_ABI strong_ordering operator<=>(const path& __lhs, const path& __rhs) noexcept { + return __lhs.__compare(__rhs.__pn_) <=> 0; + } +# endif // _LIBCPP_STD_VER <= 17 + + friend _LIBCPP_HIDE_FROM_ABI path operator/(const path& __lhs, const path& __rhs) { + path __result(__lhs); + __result /= __rhs; + return __result; + } + + _LIBCPP_HIDE_FROM_ABI + void swap(path& __rhs) noexcept { __pn_.swap(__rhs.__pn_); } + + // private helper to allow reserving memory in the path + _LIBCPP_HIDE_FROM_ABI + void __reserve(size_t __s) { __pn_.reserve(__s); } + + // native format observers + _LIBCPP_HIDE_FROM_ABI + const string_type& native() const noexcept { return __pn_; } + + _LIBCPP_HIDE_FROM_ABI + const value_type* c_str() const noexcept { return __pn_.c_str(); } + + _LIBCPP_HIDE_FROM_ABI operator string_type() const { return __pn_; } + +#if defined(_LIBCPP_WIN32API) + _LIBCPP_HIDE_FROM_ABI _VSTD::wstring wstring() const { return __pn_; } + + _LIBCPP_HIDE_FROM_ABI + _VSTD::wstring generic_wstring() const { + _VSTD::wstring __s; + __s.resize(__pn_.size()); + _VSTD::replace_copy(__pn_.begin(), __pn_.end(), __s.begin(), '\\', '/'); + return __s; + } + +#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) + template , + class _Allocator = allocator<_ECharT> > + _LIBCPP_HIDE_FROM_ABI + basic_string<_ECharT, _Traits, _Allocator> + string(const _Allocator& __a = _Allocator()) const { + using _Str = basic_string<_ECharT, _Traits, _Allocator>; + _Str __s(__a); + __s.reserve(__pn_.size()); + _PathExport<_ECharT>::__append(__s, __pn_); + return __s; + } + + _LIBCPP_HIDE_FROM_ABI _VSTD::string string() const { + return string(); + } + _LIBCPP_HIDE_FROM_ABI __u8_string u8string() const { + using _CVT = __narrow_to_utf8; + __u8_string __s; + __s.reserve(__pn_.size()); + _CVT()(back_inserter(__s), __pn_.data(), __pn_.data() + __pn_.size()); + return __s; + } + + _LIBCPP_HIDE_FROM_ABI _VSTD::u16string u16string() const { + return string(); + } + _LIBCPP_HIDE_FROM_ABI _VSTD::u32string u32string() const { + return string(); + } + + // generic format observers + template , + class _Allocator = allocator<_ECharT> > + _LIBCPP_HIDE_FROM_ABI + basic_string<_ECharT, _Traits, _Allocator> + generic_string(const _Allocator& __a = _Allocator()) const { + using _Str = basic_string<_ECharT, _Traits, _Allocator>; + _Str __s = string<_ECharT, _Traits, _Allocator>(__a); + // Note: This (and generic_u8string below) is slightly suboptimal as + // it iterates twice over the string; once to convert it to the right + // character type, and once to replace path delimiters. + _VSTD::replace(__s.begin(), __s.end(), + static_cast<_ECharT>('\\'), static_cast<_ECharT>('/')); + return __s; + } + + _LIBCPP_HIDE_FROM_ABI _VSTD::string generic_string() const { return generic_string(); } + _LIBCPP_HIDE_FROM_ABI _VSTD::u16string generic_u16string() const { return generic_string(); } + _LIBCPP_HIDE_FROM_ABI _VSTD::u32string generic_u32string() const { return generic_string(); } + _LIBCPP_HIDE_FROM_ABI + __u8_string generic_u8string() const { + __u8_string __s = u8string(); + _VSTD::replace(__s.begin(), __s.end(), '\\', '/'); + return __s; + } +#endif /* !_LIBCPP_HAS_NO_LOCALIZATION */ +#else /* _LIBCPP_WIN32API */ + + _LIBCPP_HIDE_FROM_ABI _VSTD::string string() const { return __pn_; } +#ifndef _LIBCPP_HAS_NO_CHAR8_T + _LIBCPP_HIDE_FROM_ABI _VSTD::u8string u8string() const { return _VSTD::u8string(__pn_.begin(), __pn_.end()); } +#else + _LIBCPP_HIDE_FROM_ABI _VSTD::string u8string() const { return __pn_; } +#endif + +#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) + template , + class _Allocator = allocator<_ECharT> > + _LIBCPP_HIDE_FROM_ABI + basic_string<_ECharT, _Traits, _Allocator> + string(const _Allocator& __a = _Allocator()) const { + using _CVT = __widen_from_utf8; + using _Str = basic_string<_ECharT, _Traits, _Allocator>; + _Str __s(__a); + __s.reserve(__pn_.size()); + _CVT()(std::back_inserter(__s), __pn_.data(), __pn_.data() + __pn_.size()); + return __s; + } + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS + _LIBCPP_HIDE_FROM_ABI _VSTD::wstring wstring() const { + return string(); + } +#endif + _LIBCPP_HIDE_FROM_ABI _VSTD::u16string u16string() const { + return string(); + } + _LIBCPP_HIDE_FROM_ABI _VSTD::u32string u32string() const { + return string(); + } +#endif /* !_LIBCPP_HAS_NO_LOCALIZATION */ + + // generic format observers + _LIBCPP_HIDE_FROM_ABI _VSTD::string generic_string() const { return __pn_; } +#ifndef _LIBCPP_HAS_NO_CHAR8_T + _LIBCPP_HIDE_FROM_ABI _VSTD::u8string generic_u8string() const { return _VSTD::u8string(__pn_.begin(), __pn_.end()); } +#else + _LIBCPP_HIDE_FROM_ABI _VSTD::string generic_u8string() const { return __pn_; } +#endif + +#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) + template , + class _Allocator = allocator<_ECharT> > + _LIBCPP_HIDE_FROM_ABI + basic_string<_ECharT, _Traits, _Allocator> + generic_string(const _Allocator& __a = _Allocator()) const { + return string<_ECharT, _Traits, _Allocator>(__a); + } + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS + _LIBCPP_HIDE_FROM_ABI _VSTD::wstring generic_wstring() const { return string(); } +#endif + _LIBCPP_HIDE_FROM_ABI _VSTD::u16string generic_u16string() const { return string(); } + _LIBCPP_HIDE_FROM_ABI _VSTD::u32string generic_u32string() const { return string(); } +#endif /* !_LIBCPP_HAS_NO_LOCALIZATION */ +#endif /* !_LIBCPP_WIN32API */ + +private: + int __compare(__string_view) const; + __string_view __root_name() const; + __string_view __root_directory() const; + __string_view __root_path_raw() const; + __string_view __relative_path() const; + __string_view __parent_path() const; + __string_view __filename() const; + __string_view __stem() const; + __string_view __extension() const; + +public: + // compare + _LIBCPP_HIDE_FROM_ABI int compare(const path& __p) const noexcept { + return __compare(__p.__pn_); + } + _LIBCPP_HIDE_FROM_ABI int compare(const string_type& __s) const { + return __compare(__s); + } + _LIBCPP_HIDE_FROM_ABI int compare(__string_view __s) const { + return __compare(__s); + } + _LIBCPP_HIDE_FROM_ABI int compare(const value_type* __s) const { + return __compare(__s); + } + + // decomposition + _LIBCPP_HIDE_FROM_ABI path root_name() const { + return string_type(__root_name()); + } + _LIBCPP_HIDE_FROM_ABI path root_directory() const { + return string_type(__root_directory()); + } + _LIBCPP_HIDE_FROM_ABI path root_path() const { +#if defined(_LIBCPP_WIN32API) + return string_type(__root_path_raw()); +#else + return root_name().append(string_type(__root_directory())); +#endif + } + _LIBCPP_HIDE_FROM_ABI path relative_path() const { + return string_type(__relative_path()); + } + _LIBCPP_HIDE_FROM_ABI path parent_path() const { + return string_type(__parent_path()); + } + _LIBCPP_HIDE_FROM_ABI path filename() const { + return string_type(__filename()); + } + _LIBCPP_HIDE_FROM_ABI path stem() const { return string_type(__stem()); } + _LIBCPP_HIDE_FROM_ABI path extension() const { + return string_type(__extension()); + } + + // query + _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI bool + empty() const noexcept { + return __pn_.empty(); + } + + _LIBCPP_HIDE_FROM_ABI bool has_root_name() const { + return !__root_name().empty(); + } + _LIBCPP_HIDE_FROM_ABI bool has_root_directory() const { + return !__root_directory().empty(); + } + _LIBCPP_HIDE_FROM_ABI bool has_root_path() const { + return !__root_path_raw().empty(); + } + _LIBCPP_HIDE_FROM_ABI bool has_relative_path() const { + return !__relative_path().empty(); + } + _LIBCPP_HIDE_FROM_ABI bool has_parent_path() const { + return !__parent_path().empty(); + } + _LIBCPP_HIDE_FROM_ABI bool has_filename() const { + return !__filename().empty(); + } + _LIBCPP_HIDE_FROM_ABI bool has_stem() const { return !__stem().empty(); } + _LIBCPP_HIDE_FROM_ABI bool has_extension() const { + return !__extension().empty(); + } + + _LIBCPP_HIDE_FROM_ABI bool is_absolute() const { +#if defined(_LIBCPP_WIN32API) + __string_view __root_name_str = __root_name(); + __string_view __root_dir = __root_directory(); + if (__root_name_str.size() == 2 && __root_name_str[1] == ':') { + // A drive letter with no root directory is relative, e.g. x:example. + return !__root_dir.empty(); + } + // If no root name, it's relative, e.g. \example is relative to the current drive + if (__root_name_str.empty()) + return false; + if (__root_name_str.size() < 3) + return false; + // A server root name, like \\server, is always absolute + if (__root_name_str[0] != '/' && __root_name_str[0] != '\\') + return false; + if (__root_name_str[1] != '/' && __root_name_str[1] != '\\') + return false; + // Seems to be a server root name + return true; +#else + return has_root_directory(); +#endif + } + _LIBCPP_HIDE_FROM_ABI bool is_relative() const { return !is_absolute(); } + + // relative paths + path lexically_normal() const; + path lexically_relative(const path& __base) const; + + _LIBCPP_HIDE_FROM_ABI path lexically_proximate(const path& __base) const { + path __result = this->lexically_relative(__base); + if (__result.native().empty()) + return *this; + return __result; + } + + // iterators + class _LIBCPP_TYPE_VIS iterator; + typedef iterator const_iterator; + + iterator begin() const; + iterator end() const; + +#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) + template + _LIBCPP_HIDE_FROM_ABI friend + typename enable_if::value && + is_same<_Traits, char_traits >::value, + basic_ostream<_CharT, _Traits>&>::type + operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p) { + __os << _VSTD::__quoted(__p.native()); + return __os; + } + + template + _LIBCPP_HIDE_FROM_ABI friend + typename enable_if::value || + !is_same<_Traits, char_traits >::value, + basic_ostream<_CharT, _Traits>&>::type + operator<<(basic_ostream<_CharT, _Traits>& __os, const path& __p) { + __os << _VSTD::__quoted(__p.string<_CharT, _Traits>()); + return __os; + } + + template + _LIBCPP_HIDE_FROM_ABI friend basic_istream<_CharT, _Traits>& + operator>>(basic_istream<_CharT, _Traits>& __is, path& __p) { + basic_string<_CharT, _Traits> __tmp; + __is >> _VSTD::__quoted(__tmp); + __p = __tmp; + return __is; + } +#endif // !_LIBCPP_HAS_NO_LOCALIZATION + +private: + inline _LIBCPP_HIDE_FROM_ABI path& + __assign_view(__string_view const& __s) noexcept { + __pn_ = string_type(__s); + return *this; + } + string_type __pn_; +}; + +inline _LIBCPP_HIDE_FROM_ABI void swap(path& __lhs, path& __rhs) noexcept { + __lhs.swap(__rhs); +} + +_LIBCPP_FUNC_VIS +size_t hash_value(const path& __p) noexcept; + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_PATH_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/path_iterator.h b/app/src/main/cpp/libcxx/include/__filesystem/path_iterator.h new file mode 100644 index 0000000..6f2baf8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/path_iterator.h @@ -0,0 +1,134 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_PATH_ITERATOR_H +#define _LIBCPP___FILESYSTEM_PATH_ITERATOR_H + +#include <__assert> +#include <__availability> +#include <__config> +#include <__filesystem/path.h> +#include <__iterator/iterator_traits.h> +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +class _LIBCPP_TYPE_VIS path::iterator { +public: + enum _ParserState : unsigned char { + _Singular, + _BeforeBegin, + _InRootName, + _InRootDir, + _InFilenames, + _InTrailingSep, + _AtEnd + }; + +public: + typedef input_iterator_tag iterator_category; + typedef bidirectional_iterator_tag iterator_concept; + + typedef path value_type; + typedef ptrdiff_t difference_type; + typedef const path* pointer; + typedef path reference; + +public: + _LIBCPP_INLINE_VISIBILITY + iterator() + : __stashed_elem_(), __path_ptr_(nullptr), __entry_(), + __state_(_Singular) {} + + iterator(const iterator&) = default; + ~iterator() = default; + + iterator& operator=(const iterator&) = default; + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const { return __stashed_elem_; } + + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const { return &__stashed_elem_; } + + _LIBCPP_INLINE_VISIBILITY + iterator& operator++() { + _LIBCPP_ASSERT(__state_ != _Singular, + "attempting to increment a singular iterator"); + _LIBCPP_ASSERT(__state_ != _AtEnd, + "attempting to increment the end iterator"); + return __increment(); + } + + _LIBCPP_INLINE_VISIBILITY + iterator operator++(int) { + iterator __it(*this); + this->operator++(); + return __it; + } + + _LIBCPP_INLINE_VISIBILITY + iterator& operator--() { + _LIBCPP_ASSERT(__state_ != _Singular, + "attempting to decrement a singular iterator"); + _LIBCPP_ASSERT(__entry_.data() != __path_ptr_->native().data(), + "attempting to decrement the begin iterator"); + return __decrement(); + } + + _LIBCPP_INLINE_VISIBILITY + iterator operator--(int) { + iterator __it(*this); + this->operator--(); + return __it; + } + +private: + friend class path; + + inline _LIBCPP_INLINE_VISIBILITY friend bool operator==(const iterator&, + const iterator&); + + iterator& __increment(); + iterator& __decrement(); + + path __stashed_elem_; + const path* __path_ptr_; + path::__string_view __entry_; + _ParserState __state_; +}; + +inline _LIBCPP_INLINE_VISIBILITY bool operator==(const path::iterator& __lhs, + const path::iterator& __rhs) { + return __lhs.__path_ptr_ == __rhs.__path_ptr_ && + __lhs.__entry_.data() == __rhs.__entry_.data(); +} + +inline _LIBCPP_INLINE_VISIBILITY bool operator!=(const path::iterator& __lhs, + const path::iterator& __rhs) { + return !(__lhs == __rhs); +} + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_PATH_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/perm_options.h b/app/src/main/cpp/libcxx/include/__filesystem/perm_options.h new file mode 100644 index 0000000..4aba302 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/perm_options.h @@ -0,0 +1,77 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_PERM_OPTIONS_H +#define _LIBCPP___FILESYSTEM_PERM_OPTIONS_H + +#include <__availability> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +enum class _LIBCPP_ENUM_VIS perm_options : unsigned char { + replace = 1, + add = 2, + remove = 4, + nofollow = 8 +}; + +_LIBCPP_INLINE_VISIBILITY +inline constexpr perm_options operator&(perm_options __lhs, perm_options __rhs) { + return static_cast(static_cast(__lhs) & + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr perm_options operator|(perm_options __lhs, perm_options __rhs) { + return static_cast(static_cast(__lhs) | + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr perm_options operator^(perm_options __lhs, perm_options __rhs) { + return static_cast(static_cast(__lhs) ^ + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr perm_options operator~(perm_options __lhs) { + return static_cast(~static_cast(__lhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline perm_options& operator&=(perm_options& __lhs, perm_options __rhs) { + return __lhs = __lhs & __rhs; +} + +_LIBCPP_INLINE_VISIBILITY +inline perm_options& operator|=(perm_options& __lhs, perm_options __rhs) { + return __lhs = __lhs | __rhs; +} + +_LIBCPP_INLINE_VISIBILITY +inline perm_options& operator^=(perm_options& __lhs, perm_options __rhs) { + return __lhs = __lhs ^ __rhs; +} + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_PERM_OPTIONS_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/perms.h b/app/src/main/cpp/libcxx/include/__filesystem/perms.h new file mode 100644 index 0000000..df45900 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/perms.h @@ -0,0 +1,95 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_PERMS_H +#define _LIBCPP___FILESYSTEM_PERMS_H + +#include <__availability> +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +// On Windows, these permission bits map to one single readonly flag per +// file, and the executable bit is always returned as set. When setting +// permissions, as long as the write bit is set for either owner, group or +// others, the readonly flag is cleared. +enum class _LIBCPP_ENUM_VIS perms : unsigned { + none = 0, + + owner_read = 0400, + owner_write = 0200, + owner_exec = 0100, + owner_all = 0700, + + group_read = 040, + group_write = 020, + group_exec = 010, + group_all = 070, + + others_read = 04, + others_write = 02, + others_exec = 01, + others_all = 07, + + all = 0777, + + set_uid = 04000, + set_gid = 02000, + sticky_bit = 01000, + mask = 07777, + unknown = 0xFFFF, +}; + +_LIBCPP_INLINE_VISIBILITY +inline constexpr perms operator&(perms __lhs, perms __rhs) { + return static_cast(static_cast(__lhs) & + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr perms operator|(perms __lhs, perms __rhs) { + return static_cast(static_cast(__lhs) | + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr perms operator^(perms __lhs, perms __rhs) { + return static_cast(static_cast(__lhs) ^ + static_cast(__rhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline constexpr perms operator~(perms __lhs) { + return static_cast(~static_cast(__lhs)); +} + +_LIBCPP_INLINE_VISIBILITY +inline perms& operator&=(perms& __lhs, perms __rhs) { return __lhs = __lhs & __rhs; } + +_LIBCPP_INLINE_VISIBILITY +inline perms& operator|=(perms& __lhs, perms __rhs) { return __lhs = __lhs | __rhs; } + +_LIBCPP_INLINE_VISIBILITY +inline perms& operator^=(perms& __lhs, perms __rhs) { return __lhs = __lhs ^ __rhs; } + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_PERMS_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/recursive_directory_iterator.h b/app/src/main/cpp/libcxx/include/__filesystem/recursive_directory_iterator.h new file mode 100644 index 0000000..b20d201 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/recursive_directory_iterator.h @@ -0,0 +1,185 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_RECURSIVE_DIRECTORY_ITERATOR_H +#define _LIBCPP___FILESYSTEM_RECURSIVE_DIRECTORY_ITERATOR_H + +#include <__availability> +#include <__config> +#include <__filesystem/directory_entry.h> +#include <__filesystem/directory_options.h> +#include <__filesystem/path.h> +#include <__iterator/iterator_traits.h> +#include <__memory/shared_ptr.h> +#include <__ranges/enable_borrowed_range.h> +#include <__ranges/enable_view.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +class recursive_directory_iterator { +public: + using value_type = directory_entry; + using difference_type = ptrdiff_t; + using pointer = directory_entry const*; + using reference = directory_entry const&; + using iterator_category = input_iterator_tag; + +public: + // constructors and destructor + _LIBCPP_INLINE_VISIBILITY + recursive_directory_iterator() noexcept : __rec_(false) {} + + _LIBCPP_INLINE_VISIBILITY + explicit recursive_directory_iterator( + const path& __p, directory_options __xoptions = directory_options::none) + : recursive_directory_iterator(__p, __xoptions, nullptr) {} + + _LIBCPP_INLINE_VISIBILITY + recursive_directory_iterator(const path& __p, directory_options __xoptions, + error_code& __ec) + : recursive_directory_iterator(__p, __xoptions, &__ec) {} + + _LIBCPP_INLINE_VISIBILITY + recursive_directory_iterator(const path& __p, error_code& __ec) + : recursive_directory_iterator(__p, directory_options::none, &__ec) {} + + recursive_directory_iterator(const recursive_directory_iterator&) = default; + recursive_directory_iterator(recursive_directory_iterator&&) = default; + + recursive_directory_iterator& + operator=(const recursive_directory_iterator&) = default; + + _LIBCPP_INLINE_VISIBILITY + recursive_directory_iterator& + operator=(recursive_directory_iterator&& __o) noexcept { + // non-default implementation provided to support self-move assign. + if (this != &__o) { + __imp_ = _VSTD::move(__o.__imp_); + __rec_ = __o.__rec_; + } + return *this; + } + + ~recursive_directory_iterator() = default; + + _LIBCPP_INLINE_VISIBILITY + const directory_entry& operator*() const { return __dereference(); } + + _LIBCPP_INLINE_VISIBILITY + const directory_entry* operator->() const { return &__dereference(); } + + recursive_directory_iterator& operator++() { return __increment(); } + + _LIBCPP_INLINE_VISIBILITY + __dir_element_proxy operator++(int) { + __dir_element_proxy __p(**this); + __increment(); + return __p; + } + + _LIBCPP_INLINE_VISIBILITY + recursive_directory_iterator& increment(error_code& __ec) { + return __increment(&__ec); + } + + _LIBCPP_FUNC_VIS directory_options options() const; + _LIBCPP_FUNC_VIS int depth() const; + + _LIBCPP_INLINE_VISIBILITY + void pop() { __pop(); } + + _LIBCPP_INLINE_VISIBILITY + void pop(error_code& __ec) { __pop(&__ec); } + + _LIBCPP_INLINE_VISIBILITY + bool recursion_pending() const { return __rec_; } + + _LIBCPP_INLINE_VISIBILITY + void disable_recursion_pending() { __rec_ = false; } + +private: + _LIBCPP_FUNC_VIS + recursive_directory_iterator(const path& __p, directory_options __opt, + error_code* __ec); + + _LIBCPP_FUNC_VIS + const directory_entry& __dereference() const; + + _LIBCPP_FUNC_VIS + bool __try_recursion(error_code* __ec); + + _LIBCPP_FUNC_VIS + void __advance(error_code* __ec = nullptr); + + _LIBCPP_FUNC_VIS + recursive_directory_iterator& __increment(error_code* __ec = nullptr); + + _LIBCPP_FUNC_VIS + void __pop(error_code* __ec = nullptr); + + inline _LIBCPP_INLINE_VISIBILITY friend bool + operator==(const recursive_directory_iterator&, + const recursive_directory_iterator&) noexcept; + + struct _LIBCPP_HIDDEN __shared_imp; + shared_ptr<__shared_imp> __imp_; + bool __rec_; +}; // class recursive_directory_iterator + +inline _LIBCPP_INLINE_VISIBILITY bool +operator==(const recursive_directory_iterator& __lhs, + const recursive_directory_iterator& __rhs) noexcept { + return __lhs.__imp_ == __rhs.__imp_; +} + +_LIBCPP_INLINE_VISIBILITY +inline bool operator!=(const recursive_directory_iterator& __lhs, + const recursive_directory_iterator& __rhs) noexcept { + return !(__lhs == __rhs); +} +// enable recursive_directory_iterator range-based for statements +inline _LIBCPP_INLINE_VISIBILITY recursive_directory_iterator +begin(recursive_directory_iterator __iter) noexcept { + return __iter; +} + +inline _LIBCPP_INLINE_VISIBILITY recursive_directory_iterator +end(recursive_directory_iterator) noexcept { + return recursive_directory_iterator(); +} + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#if _LIBCPP_STD_VER > 17 + +template <> +_LIBCPP_AVAILABILITY_FILESYSTEM +inline constexpr bool _VSTD::ranges::enable_borrowed_range<_VSTD_FS::recursive_directory_iterator> = true; + +template <> +_LIBCPP_AVAILABILITY_FILESYSTEM +inline constexpr bool _VSTD::ranges::enable_view<_VSTD_FS::recursive_directory_iterator> = true; + +#endif // _LIBCPP_STD_VER > 17 + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_RECURSIVE_DIRECTORY_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/space_info.h b/app/src/main/cpp/libcxx/include/__filesystem/space_info.h new file mode 100644 index 0000000..d0747e3 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/space_info.h @@ -0,0 +1,43 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_SPACE_INFO_H +#define _LIBCPP___FILESYSTEM_SPACE_INFO_H + +#include <__availability> +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +struct _LIBCPP_TYPE_VIS space_info { + uintmax_t capacity; + uintmax_t free; + uintmax_t available; + +# if _LIBCPP_STD_VER > 17 + friend _LIBCPP_HIDE_FROM_ABI bool operator==(const space_info&, const space_info&) = default; +# endif +}; + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_SPACE_INFO_H diff --git a/app/src/main/cpp/libcxx/include/__filesystem/u8path.h b/app/src/main/cpp/libcxx/include/__filesystem/u8path.h new file mode 100644 index 0000000..d35faa1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__filesystem/u8path.h @@ -0,0 +1,108 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FILESYSTEM_U8PATH_H +#define _LIBCPP___FILESYSTEM_U8PATH_H + +#include <__algorithm/unwrap_iter.h> +#include <__availability> +#include <__config> +#include <__filesystem/path.h> +#include +#include + +// Only required on Windows for __widen_from_utf8, and included conservatively +// because it requires support for localization. +#if defined(_LIBCPP_WIN32API) +# include +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_FILESYSTEM + +_LIBCPP_AVAILABILITY_FILESYSTEM_PUSH + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_WITH_CHAR8_T + typename enable_if<__is_pathable<_InputIt>::value, path>::type + u8path(_InputIt __f, _InputIt __l) { + static_assert( +#ifndef _LIBCPP_HAS_NO_CHAR8_T + is_same::__char_type, char8_t>::value || +#endif + is_same::__char_type, char>::value, + "u8path(Iter, Iter) requires Iter have a value_type of type 'char'" + " or 'char8_t'"); +#if defined(_LIBCPP_WIN32API) + string __tmp(__f, __l); + using _CVT = __widen_from_utf8; + _VSTD::wstring __w; + __w.reserve(__tmp.size()); + _CVT()(back_inserter(__w), __tmp.data(), __tmp.data() + __tmp.size()); + return path(__w); +#else + return path(__f, __l); +#endif /* !_LIBCPP_WIN32API */ +} + +#if defined(_LIBCPP_WIN32API) +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_WITH_CHAR8_T + typename enable_if<__is_pathable<_InputIt>::value, path>::type + u8path(_InputIt __f, _NullSentinel) { + static_assert( +#ifndef _LIBCPP_HAS_NO_CHAR8_T + is_same::__char_type, char8_t>::value || +#endif + is_same::__char_type, char>::value, + "u8path(Iter, Iter) requires Iter have a value_type of type 'char'" + " or 'char8_t'"); + string __tmp; + const char __sentinel = char{}; + for (; *__f != __sentinel; ++__f) + __tmp.push_back(*__f); + using _CVT = __widen_from_utf8; + _VSTD::wstring __w; + __w.reserve(__tmp.size()); + _CVT()(back_inserter(__w), __tmp.data(), __tmp.data() + __tmp.size()); + return path(__w); +} +#endif /* _LIBCPP_WIN32API */ + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_DEPRECATED_WITH_CHAR8_T + typename enable_if<__is_pathable<_Source>::value, path>::type + u8path(const _Source& __s) { + static_assert( +#ifndef _LIBCPP_HAS_NO_CHAR8_T + is_same::__char_type, char8_t>::value || +#endif + is_same::__char_type, char>::value, + "u8path(Source const&) requires Source have a character type of type " + "'char' or 'char8_t'"); +#if defined(_LIBCPP_WIN32API) + using _Traits = __is_pathable<_Source>; + return u8path(_VSTD::__unwrap_iter(_Traits::__range_begin(__s)), _VSTD::__unwrap_iter(_Traits::__range_end(__s))); +#else + return path(__s); +#endif +} + +_LIBCPP_AVAILABILITY_FILESYSTEM_POP + +_LIBCPP_END_NAMESPACE_FILESYSTEM + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FILESYSTEM_U8PATH_H diff --git a/app/src/main/cpp/libcxx/include/__format/buffer.h b/app/src/main/cpp/libcxx/include/__format/buffer.h new file mode 100644 index 0000000..ddfe767 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/buffer.h @@ -0,0 +1,573 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_BUFFER_H +#define _LIBCPP___FORMAT_BUFFER_H + +#include <__algorithm/copy_n.h> +#include <__algorithm/fill_n.h> +#include <__algorithm/max.h> +#include <__algorithm/min.h> +#include <__algorithm/ranges_copy_n.h> +#include <__algorithm/transform.h> +#include <__algorithm/unwrap_iter.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/enable_insertable.h> +#include <__format/format_to_n_result.h> +#include <__iterator/back_insert_iterator.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/wrap_iter.h> +#include <__utility/move.h> +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __format { + +/// A "buffer" that handles writing to the proper iterator. +/// +/// This helper is used together with the @ref back_insert_iterator to offer +/// type-erasure for the formatting functions. This reduces the number to +/// template instantiations. +template <__fmt_char_type _CharT> +class _LIBCPP_TEMPLATE_VIS __output_buffer { +public: + using value_type = _CharT; + + template + _LIBCPP_HIDE_FROM_ABI explicit __output_buffer(_CharT* __ptr, size_t __capacity, _Tp* __obj) + : __ptr_(__ptr), + __capacity_(__capacity), + __flush_([](_CharT* __p, size_t __n, void* __o) { static_cast<_Tp*>(__o)->__flush(__p, __n); }), + __obj_(__obj) {} + + _LIBCPP_HIDE_FROM_ABI void __reset(_CharT* __ptr, size_t __capacity) { + __ptr_ = __ptr; + __capacity_ = __capacity; + } + + _LIBCPP_HIDE_FROM_ABI auto __make_output_iterator() { return std::back_insert_iterator{*this}; } + + // Used in std::back_insert_iterator. + _LIBCPP_HIDE_FROM_ABI void push_back(_CharT __c) { + __ptr_[__size_++] = __c; + + // Profiling showed flushing after adding is more efficient than flushing + // when entering the function. + if (__size_ == __capacity_) + __flush(); + } + + /// Copies the input __str to the buffer. + /// + /// Since some of the input is generated by std::to_chars, there needs to be a + /// conversion when _CharT is wchar_t. + template <__fmt_char_type _InCharT> + _LIBCPP_HIDE_FROM_ABI void __copy(basic_string_view<_InCharT> __str) { + // When the underlying iterator is a simple iterator the __capacity_ is + // infinite. For a string or container back_inserter it isn't. This means + // adding a large string the the buffer can cause some overhead. In that + // case a better approach could be: + // - flush the buffer + // - container.append(__str.begin(), __str.end()); + // The same holds true for the fill. + // For transform it might be slightly harder, however the use case for + // transform is slightly less common; it converts hexadecimal values to + // upper case. For integral these strings are short. + // TODO FMT Look at the improvements above. + size_t __n = __str.size(); + + __flush_on_overflow(__n); + if (__n <= __capacity_) { + _VSTD::copy_n(__str.data(), __n, _VSTD::addressof(__ptr_[__size_])); + __size_ += __n; + return; + } + + // The output doesn't fit in the internal buffer. + // Copy the data in "__capacity_" sized chunks. + _LIBCPP_ASSERT(__size_ == 0, "the buffer should be flushed by __flush_on_overflow"); + const _InCharT* __first = __str.data(); + do { + size_t __chunk = _VSTD::min(__n, __capacity_); + _VSTD::copy_n(__first, __chunk, _VSTD::addressof(__ptr_[__size_])); + __size_ = __chunk; + __first += __chunk; + __n -= __chunk; + __flush(); + } while (__n); + } + + /// A std::transform wrapper. + /// + /// Like @ref __copy it may need to do type conversion. + template <__fmt_char_type _InCharT, class _UnaryOperation> + _LIBCPP_HIDE_FROM_ABI void __transform(const _InCharT* __first, const _InCharT* __last, _UnaryOperation __operation) { + _LIBCPP_ASSERT(__first <= __last, "not a valid range"); + + size_t __n = static_cast(__last - __first); + __flush_on_overflow(__n); + if (__n <= __capacity_) { + _VSTD::transform(__first, __last, _VSTD::addressof(__ptr_[__size_]), _VSTD::move(__operation)); + __size_ += __n; + return; + } + + // The output doesn't fit in the internal buffer. + // Transform the data in "__capacity_" sized chunks. + _LIBCPP_ASSERT(__size_ == 0, "the buffer should be flushed by __flush_on_overflow"); + do { + size_t __chunk = _VSTD::min(__n, __capacity_); + _VSTD::transform(__first, __first + __chunk, _VSTD::addressof(__ptr_[__size_]), __operation); + __size_ = __chunk; + __first += __chunk; + __n -= __chunk; + __flush(); + } while (__n); + } + + /// A \c fill_n wrapper. + _LIBCPP_HIDE_FROM_ABI void __fill(size_t __n, _CharT __value) { + __flush_on_overflow(__n); + if (__n <= __capacity_) { + _VSTD::fill_n(_VSTD::addressof(__ptr_[__size_]), __n, __value); + __size_ += __n; + return; + } + + // The output doesn't fit in the internal buffer. + // Fill the buffer in "__capacity_" sized chunks. + _LIBCPP_ASSERT(__size_ == 0, "the buffer should be flushed by __flush_on_overflow"); + do { + size_t __chunk = _VSTD::min(__n, __capacity_); + _VSTD::fill_n(_VSTD::addressof(__ptr_[__size_]), __chunk, __value); + __size_ = __chunk; + __n -= __chunk; + __flush(); + } while (__n); + } + + _LIBCPP_HIDE_FROM_ABI void __flush() { + __flush_(__ptr_, __size_, __obj_); + __size_ = 0; + } + +private: + _CharT* __ptr_; + size_t __capacity_; + size_t __size_{0}; + void (*__flush_)(_CharT*, size_t, void*); + void* __obj_; + + /// Flushes the buffer when the output operation would overflow the buffer. + /// + /// A simple approach for the overflow detection would be something along the + /// lines: + /// \code + /// // The internal buffer is large enough. + /// if (__n <= __capacity_) { + /// // Flush when we really would overflow. + /// if (__size_ + __n >= __capacity_) + /// __flush(); + /// ... + /// } + /// \endcode + /// + /// This approach works for all cases but one: + /// A __format_to_n_buffer_base where \ref __enable_direct_output is true. + /// In that case the \ref __capacity_ of the buffer changes during the first + /// \ref __flush. During that operation the output buffer switches from its + /// __writer_ to its __storage_. The \ref __capacity_ of the former depends + /// on the value of n, of the latter is a fixed size. For example: + /// - a format_to_n call with a 10'000 char buffer, + /// - the buffer is filled with 9'500 chars, + /// - adding 1'000 elements would overflow the buffer so the buffer gets + /// changed and the \ref __capacity_ decreases from 10'000 to + /// __buffer_size (256 at the time of writing). + /// + /// This means that the \ref __flush for this class may need to copy a part of + /// the internal buffer to the proper output. In this example there will be + /// 500 characters that need this copy operation. + /// + /// Note it would be more efficient to write 500 chars directly and then swap + /// the buffers. This would make the code more complex and \ref format_to_n is + /// not the most common use case. Therefore the optimization isn't done. + _LIBCPP_HIDE_FROM_ABI void __flush_on_overflow(size_t __n) { + if (__size_ + __n >= __capacity_) + __flush(); + } +}; + +/// A storage using an internal buffer. +/// +/// This storage is used when writing a single element to the output iterator +/// is expensive. +template <__fmt_char_type _CharT> +class _LIBCPP_TEMPLATE_VIS __internal_storage { +public: + _LIBCPP_HIDE_FROM_ABI _CharT* __begin() { return __buffer_; } + + static constexpr size_t __buffer_size = 256 / sizeof(_CharT); + +private: + _CharT __buffer_[__buffer_size]; +}; + +/// A storage writing directly to the storage. +/// +/// This requires the storage to be a contiguous buffer of \a _CharT. +/// Since the output is directly written to the underlying storage this class +/// is just an empty class. +template <__fmt_char_type _CharT> +class _LIBCPP_TEMPLATE_VIS __direct_storage {}; + +template +concept __enable_direct_output = __fmt_char_type<_CharT> && + (same_as<_OutIt, _CharT*> +#ifndef _LIBCPP_ENABLE_DEBUG_MODE + || same_as<_OutIt, __wrap_iter<_CharT*>> +#endif + ); + +/// Write policy for directly writing to the underlying output. +template +class _LIBCPP_TEMPLATE_VIS __writer_direct { +public: + _LIBCPP_HIDE_FROM_ABI explicit __writer_direct(_OutIt __out_it) + : __out_it_(__out_it) {} + + _LIBCPP_HIDE_FROM_ABI _OutIt __out_it() { return __out_it_; } + + _LIBCPP_HIDE_FROM_ABI void __flush(_CharT*, size_t __n) { + // _OutIt can be a __wrap_iter. Therefore the original iterator + // is adjusted. + __out_it_ += __n; + } + +private: + _OutIt __out_it_; +}; + +/// Write policy for copying the buffer to the output. +template +class _LIBCPP_TEMPLATE_VIS __writer_iterator { +public: + _LIBCPP_HIDE_FROM_ABI explicit __writer_iterator(_OutIt __out_it) + : __out_it_{_VSTD::move(__out_it)} {} + + _LIBCPP_HIDE_FROM_ABI _OutIt __out_it() && { return std::move(__out_it_); } + + _LIBCPP_HIDE_FROM_ABI void __flush(_CharT* __ptr, size_t __n) { + __out_it_ = std::ranges::copy_n(__ptr, __n, std::move(__out_it_)).out; + } + +private: + _OutIt __out_it_; +}; + +/// Concept to see whether a \a _Container is insertable. +/// +/// The concept is used to validate whether multiple calls to a +/// \ref back_insert_iterator can be replace by a call to \c _Container::insert. +/// +/// \note a \a _Container needs to opt-in to the concept by specializing +/// \ref __enable_insertable. +template +concept __insertable = + __enable_insertable<_Container> && __fmt_char_type && + requires(_Container& __t, add_pointer_t __first, + add_pointer_t __last) { __t.insert(__t.end(), __first, __last); }; + +/// Extract the container type of a \ref back_insert_iterator. +template +struct _LIBCPP_TEMPLATE_VIS __back_insert_iterator_container { + using type = void; +}; + +template <__insertable _Container> +struct _LIBCPP_TEMPLATE_VIS __back_insert_iterator_container> { + using type = _Container; +}; + +/// Write policy for inserting the buffer in a container. +template +class _LIBCPP_TEMPLATE_VIS __writer_container { +public: + using _CharT = typename _Container::value_type; + + _LIBCPP_HIDE_FROM_ABI explicit __writer_container(back_insert_iterator<_Container> __out_it) + : __container_{__out_it.__get_container()} {} + + _LIBCPP_HIDE_FROM_ABI auto __out_it() { return std::back_inserter(*__container_); } + + _LIBCPP_HIDE_FROM_ABI void __flush(_CharT* __ptr, size_t __n) { + __container_->insert(__container_->end(), __ptr, __ptr + __n); + } + +private: + _Container* __container_; +}; + +/// Selects the type of the writer used for the output iterator. +template +class _LIBCPP_TEMPLATE_VIS __writer_selector { + using _Container = typename __back_insert_iterator_container<_OutIt>::type; + +public: + using type = conditional_t, __writer_container<_Container>, + conditional_t<__enable_direct_output<_OutIt, _CharT>, __writer_direct<_OutIt, _CharT>, + __writer_iterator<_OutIt, _CharT>>>; +}; + +/// The generic formatting buffer. +template +requires(output_iterator<_OutIt, const _CharT&>) class _LIBCPP_TEMPLATE_VIS + __format_buffer { + using _Storage = + conditional_t<__enable_direct_output<_OutIt, _CharT>, + __direct_storage<_CharT>, __internal_storage<_CharT>>; + +public: + _LIBCPP_HIDE_FROM_ABI explicit __format_buffer(_OutIt __out_it) + requires(same_as<_Storage, __internal_storage<_CharT>>) + : __output_(__storage_.__begin(), __storage_.__buffer_size, this), __writer_(_VSTD::move(__out_it)) {} + + _LIBCPP_HIDE_FROM_ABI explicit __format_buffer(_OutIt __out_it) requires( + same_as<_Storage, __direct_storage<_CharT>>) + : __output_(_VSTD::__unwrap_iter(__out_it), size_t(-1), this), + __writer_(_VSTD::move(__out_it)) {} + + _LIBCPP_HIDE_FROM_ABI auto __make_output_iterator() { return __output_.__make_output_iterator(); } + + _LIBCPP_HIDE_FROM_ABI void __flush(_CharT* __ptr, size_t __n) { __writer_.__flush(__ptr, __n); } + + _LIBCPP_HIDE_FROM_ABI _OutIt __out_it() && { + __output_.__flush(); + return _VSTD::move(__writer_).__out_it(); + } + +private: + _LIBCPP_NO_UNIQUE_ADDRESS _Storage __storage_; + __output_buffer<_CharT> __output_; + typename __writer_selector<_OutIt, _CharT>::type __writer_; +}; + +/// A buffer that counts the number of insertions. +/// +/// Since \ref formatted_size only needs to know the size, the output itself is +/// discarded. +template <__fmt_char_type _CharT> +class _LIBCPP_TEMPLATE_VIS __formatted_size_buffer { +public: + _LIBCPP_HIDE_FROM_ABI auto __make_output_iterator() { return __output_.__make_output_iterator(); } + + _LIBCPP_HIDE_FROM_ABI void __flush(const _CharT*, size_t __n) { __size_ += __n; } + + _LIBCPP_HIDE_FROM_ABI size_t __result() && { + __output_.__flush(); + return __size_; + } + +private: + __internal_storage<_CharT> __storage_; + __output_buffer<_CharT> __output_{__storage_.__begin(), __storage_.__buffer_size, this}; + size_t __size_{0}; +}; + +/// The base of a buffer that counts and limits the number of insertions. +template + requires(output_iterator<_OutIt, const _CharT&>) +struct _LIBCPP_TEMPLATE_VIS __format_to_n_buffer_base { + using _Size = iter_difference_t<_OutIt>; + +public: + _LIBCPP_HIDE_FROM_ABI explicit __format_to_n_buffer_base(_OutIt __out_it, _Size __max_size) + : __writer_(_VSTD::move(__out_it)), __max_size_(_VSTD::max(_Size(0), __max_size)) {} + + _LIBCPP_HIDE_FROM_ABI void __flush(_CharT* __ptr, size_t __n) { + if (_Size(__size_) <= __max_size_) + __writer_.__flush(__ptr, _VSTD::min(_Size(__n), __max_size_ - __size_)); + __size_ += __n; + } + +protected: + __internal_storage<_CharT> __storage_; + __output_buffer<_CharT> __output_{__storage_.__begin(), __storage_.__buffer_size, this}; + typename __writer_selector<_OutIt, _CharT>::type __writer_; + + _Size __max_size_; + _Size __size_{0}; +}; + +/// The base of a buffer that counts and limits the number of insertions. +/// +/// This version is used when \c __enable_direct_output<_OutIt, _CharT> == true. +/// +/// This class limits the size available to the direct writer so it will not +/// exceed the maximum number of code units. +template + requires(output_iterator<_OutIt, const _CharT&>) +class _LIBCPP_TEMPLATE_VIS __format_to_n_buffer_base<_OutIt, _CharT, true> { + using _Size = iter_difference_t<_OutIt>; + +public: + _LIBCPP_HIDE_FROM_ABI explicit __format_to_n_buffer_base(_OutIt __out_it, _Size __max_size) + : __output_(_VSTD::__unwrap_iter(__out_it), __max_size, this), + __writer_(_VSTD::move(__out_it)), + __max_size_(__max_size) { + if (__max_size <= 0) [[unlikely]] + __output_.__reset(__storage_.__begin(), __storage_.__buffer_size); + } + + _LIBCPP_HIDE_FROM_ABI void __flush(_CharT* __ptr, size_t __n) { + // A __flush to the direct writer happens in the following occasions: + // - The format function has written the maximum number of allowed code + // units. At this point it's no longer valid to write to this writer. So + // switch to the internal storage. This internal storage doesn't need to + // be written anywhere so the __flush for that storage writes no output. + // - Like above, but the next "mass write" operation would overflow the + // buffer. In that case the buffer is pre-emptively switched. The still + // valid code units will be written separately. + // - The format_to_n function is finished. In this case there's no need to + // switch the buffer, but for simplicity the buffers are still switched. + // When the __max_size <= 0 the constructor already switched the buffers. + if (__size_ == 0 && __ptr != __storage_.__begin()) { + __writer_.__flush(__ptr, __n); + __output_.__reset(__storage_.__begin(), __storage_.__buffer_size); + } else if (__size_ < __max_size_) { + // Copies a part of the internal buffer to the output up to n characters. + // See __output_buffer<_CharT>::__flush_on_overflow for more information. + _Size __s = _VSTD::min(_Size(__n), __max_size_ - __size_); + std::copy_n(__ptr, __s, __writer_.__out_it()); + __writer_.__flush(__ptr, __s); + } + + __size_ += __n; + } + +protected: + __internal_storage<_CharT> __storage_; + __output_buffer<_CharT> __output_; + __writer_direct<_OutIt, _CharT> __writer_; + + _Size __max_size_; + _Size __size_{0}; +}; + +/// The buffer that counts and limits the number of insertions. +template + requires(output_iterator<_OutIt, const _CharT&>) +struct _LIBCPP_TEMPLATE_VIS __format_to_n_buffer final + : public __format_to_n_buffer_base< _OutIt, _CharT, __enable_direct_output<_OutIt, _CharT>> { + using _Base = __format_to_n_buffer_base<_OutIt, _CharT, __enable_direct_output<_OutIt, _CharT>>; + using _Size = iter_difference_t<_OutIt>; + +public: + _LIBCPP_HIDE_FROM_ABI explicit __format_to_n_buffer(_OutIt __out_it, _Size __max_size) + : _Base(_VSTD::move(__out_it), __max_size) {} + _LIBCPP_HIDE_FROM_ABI auto __make_output_iterator() { return this->__output_.__make_output_iterator(); } + + _LIBCPP_HIDE_FROM_ABI format_to_n_result<_OutIt> __result() && { + this->__output_.__flush(); + return {_VSTD::move(this->__writer_).__out_it(), this->__size_}; + } +}; + +// A dynamically growing buffer intended to be used for retargeting a context. +// +// P2286 Formatting ranges adds range formatting support. It allows the user to +// specify the minimum width for the entire formatted range. The width of the +// range is not known until the range is formatted. Formatting is done to an +// output_iterator so there's no guarantee it would be possible to add the fill +// to the front of the output. Instead the range is formatted to a temporary +// buffer and that buffer is formatted as a string. +// +// There is an issue with that approach, the format context used in +// std::formatter::format contains the output iterator used as part of its +// type. So using this output iterator means there needs to be a new format +// context and the format arguments need to be retargeted to the new context. +// This retargeting is done by a basic_format_context specialized for the +// __iterator of this container. +template <__fmt_char_type _CharT> +class _LIBCPP_TEMPLATE_VIS __retarget_buffer { +public: + using value_type = _CharT; + + struct __iterator { + using difference_type = ptrdiff_t; + + _LIBCPP_HIDE_FROM_ABI constexpr explicit __iterator(__retarget_buffer& __buffer) + : __buffer_(std::addressof(__buffer)) {} + _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator=(const _CharT& __c) { + __buffer_->push_back(__c); + return *this; + } + _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator=(_CharT&& __c) { + __buffer_->push_back(__c); + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator*() { return *this; } + _LIBCPP_HIDE_FROM_ABI constexpr __iterator& operator++() { return *this; } + _LIBCPP_HIDE_FROM_ABI constexpr __iterator operator++(int) { return *this; } + __retarget_buffer* __buffer_; + }; + + _LIBCPP_HIDE_FROM_ABI explicit __retarget_buffer(size_t __size_hint) { __buffer_.reserve(__size_hint); } + + _LIBCPP_HIDE_FROM_ABI __iterator __make_output_iterator() { return __iterator{*this}; } + + _LIBCPP_HIDE_FROM_ABI void push_back(_CharT __c) { __buffer_.push_back(__c); } + + template <__fmt_char_type _InCharT> + _LIBCPP_HIDE_FROM_ABI void __copy(basic_string_view<_InCharT> __str) { + __buffer_.insert(__buffer_.end(), __str.begin(), __str.end()); + } + + template <__fmt_char_type _InCharT, class _UnaryOperation> + _LIBCPP_HIDE_FROM_ABI void __transform(const _InCharT* __first, const _InCharT* __last, _UnaryOperation __operation) { + _LIBCPP_ASSERT(__first <= __last, "not a valid range"); + std::transform(__first, __last, std::back_inserter(__buffer_), std::move(__operation)); + } + + _LIBCPP_HIDE_FROM_ABI void __fill(size_t __n, _CharT __value) { __buffer_.insert(__buffer_.end(), __n, __value); } + + _LIBCPP_HIDE_FROM_ABI basic_string_view<_CharT> __view() { return {__buffer_.data(), __buffer_.size()}; } + +private: + // Use vector instead of string to avoid adding zeros after every append + // operation. The buffer is exposed as a string_view and not as a c-string. + vector<_CharT> __buffer_; +}; + +} // namespace __format + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___FORMAT_BUFFER_H diff --git a/app/src/main/cpp/libcxx/include/__format/concepts.h b/app/src/main/cpp/libcxx/include/__format/concepts.h new file mode 100644 index 0000000..fe4a7b9 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/concepts.h @@ -0,0 +1,78 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_CONCEPTS_H +#define _LIBCPP___FORMAT_CONCEPTS_H + +#include <__concepts/same_as.h> +#include <__concepts/semiregular.h> +#include <__config> +#include <__format/format_fwd.h> +#include <__format/format_parse_context.h> +#include <__type_traits/is_specialization.h> +#include <__utility/pair.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +/// The character type specializations of \ref formatter. +template +concept __fmt_char_type = + same_as<_CharT, char> +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS + || same_as<_CharT, wchar_t> +# endif + ; + +// The output iterator isn't specified. A formatter should accept any +// output_iterator. This iterator is a minimal iterator to test the concept. +// (Note testing for (w)format_context would be a valid choice, but requires +// selecting the proper one depending on the type of _CharT.) +template +using __fmt_iter_for = _CharT*; + +template +concept __formattable = + (semiregular, _CharT>>) && + requires(formatter, _CharT> __f, + const formatter, _CharT> __cf, + _Tp __t, + basic_format_context<__fmt_iter_for<_CharT>, _CharT> __fc, + basic_format_parse_context<_CharT> __pc) { + { __f.parse(__pc) } -> same_as::iterator>; + { __cf.format(__t, __fc) } -> same_as<__fmt_iter_for<_CharT>>; + }; + +# if _LIBCPP_STD_VER > 20 +template +concept formattable = __formattable<_Tp, _CharT>; + +// [tuple.like] defines a tuple-like exposition only concept. This concept is +// not related to that. Therefore it uses a different name for the concept. +// +// TODO FMT Add a test to validate we fail when using that concept after P2165 +// has been implemented. +template +concept __fmt_pair_like = __is_specialization_v<_Tp, pair> || + // Use a requires since tuple_size_v may fail to instantiate, + (__is_specialization_v<_Tp, tuple> && requires { tuple_size_v<_Tp> == 2; }); + +# endif //_LIBCPP_STD_VER > 20 +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_CONCEPTS_H diff --git a/app/src/main/cpp/libcxx/include/__format/container_adaptor.h b/app/src/main/cpp/libcxx/include/__format/container_adaptor.h new file mode 100644 index 0000000..62b6981 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/container_adaptor.h @@ -0,0 +1,70 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H +#define _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#include <__availability> +#include <__config> +#include <__format/concepts.h> +#include <__format/formatter.h> +#include <__format/range_default_formatter.h> +#include +#include + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 20 + +// [container.adaptors.format] only specifies the library should provide the +// formatter specializations, not which header should provide them. +// Since includes a lot of headers, add these headers here instead of +// adding more dependencies like, locale, optinal, string, tuple, etc. to the +// adaptor headers. To use the format functions users already include . + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __formatter_container_adaptor { +private: + using __maybe_const_adaptor = __fmt_maybe_const<_Adaptor, _CharT>; + formatter __underlying_; + +public: + template + _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) { + return __underlying_.parse(__ctx); + } + + template + _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator + format(__maybe_const_adaptor& __adaptor, _FormatContext& __ctx) const { + return __underlying_.format(__adaptor.__get_container(), __ctx); + } +}; + +template _Container> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter, _CharT> + : public __formatter_container_adaptor, _CharT> {}; + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter, _CharT> + : public __formatter_container_adaptor, _CharT> {}; + +template _Container> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter, _CharT> + : public __formatter_container_adaptor, _CharT> {}; + +#endif //_LIBCPP_STD_VER > 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_CONTAINER_ADAPTOR_H diff --git a/app/src/main/cpp/libcxx/include/__format/enable_insertable.h b/app/src/main/cpp/libcxx/include/__format/enable_insertable.h new file mode 100644 index 0000000..71b4252 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/enable_insertable.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_ENABLE_INSERTABLE_H +#define _LIBCPP___FORMAT_ENABLE_INSERTABLE_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __format { + +/// Opt-in to enable \ref __insertable for a \a _Container. +template +inline constexpr bool __enable_insertable = false; + +} // namespace __format + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_ENABLE_INSERTABLE_H diff --git a/app/src/main/cpp/libcxx/include/__format/escaped_output_table.h b/app/src/main/cpp/libcxx/include/__format/escaped_output_table.h new file mode 100644 index 0000000..bd2994b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/escaped_output_table.h @@ -0,0 +1,1038 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// WARNING, this entire header is generated by +// utils/generate_escaped_output_table.py +// DO NOT MODIFY! + +// UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE +// +// See Terms of Use +// for definitions of Unicode Inc.'s Data Files and Software. +// +// NOTICE TO USER: Carefully read the following legal agreement. +// BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +// DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +// YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +// TERMS AND CONDITIONS OF THIS AGREEMENT. +// IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +// THE DATA FILES OR SOFTWARE. +// +// COPYRIGHT AND PERMISSION NOTICE +// +// Copyright (c) 1991-2022 Unicode, Inc. All rights reserved. +// Distributed under the Terms of Use in https://www.unicode.org/copyright.html. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Unicode data files and any associated documentation +// (the "Data Files") or Unicode software and any associated documentation +// (the "Software") to deal in the Data Files or Software +// without restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, and/or sell copies of +// the Data Files or Software, and to permit persons to whom the Data Files +// or Software are furnished to do so, provided that either +// (a) this copyright and permission notice appear with all copies +// of the Data Files or Software, or +// (b) this copyright and permission notice appear in associated +// Documentation. +// +// THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +// NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +// DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THE DATA FILES OR SOFTWARE. +// +// Except as contained in this notice, the name of a copyright holder +// shall not be used in advertising or otherwise to promote the sale, +// use or other dealings in these Data Files or Software without prior +// written authorization of the copyright holder. + +#ifndef _LIBCPP___FORMAT_ESCAPED_OUTPUT_TABLE_H +#define _LIBCPP___FORMAT_ESCAPED_OUTPUT_TABLE_H + +#include <__algorithm/ranges_upper_bound.h> +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 20 + +namespace __escaped_output_table { + +/// The entries of the characters to escape in format's debug string. +/// +/// Contains the entries for [format.string.escaped]/2.2.1.2.1 +/// CE is a Unicode encoding and C corresponds to either a UCS scalar value +/// whose Unicode property General_Category has a value in the groups +/// Separator (Z) or Other (C) or to a UCS scalar value which has the Unicode +/// property Grapheme_Extend=Yes, as described by table 12 of UAX #44 +/// +/// Separator (Z) consists of General_Category +/// - Space_Separator, +/// - Line_Separator, +/// - Paragraph_Separator. +/// +/// Other (C) consists of General_Category +/// - Control, +/// - Format, +/// - Surrogate, +/// - Private_Use, +/// - Unassigned. +/// +/// The data is generated from +/// - https://www.unicode.org/Public/UCD/latest/ucd/DerivedCoreProperties.txt +/// - https://www.unicode.org/Public/UCD/latest/ucd/extracted/DerivedGeneralCategory.txt +/// +/// The table is similar to the table +/// __extended_grapheme_custer_property_boundary::__entries +/// which explains the details of these classes. The only difference is this +/// table lacks a property, thus having more bits available for the size. +/// +/// The data has 2 values: +/// - bits [0, 10] The size of the range, allowing 2048 elements. +/// - bits [11, 31] The lower bound code point of the range. The upper bound of +/// the range is lower bound + size. +inline constexpr uint32_t __entries[893] = { + 0x00000020, + 0x0003f821, + 0x00056800, + 0x0018006f, + 0x001bc001, + 0x001c0003, + 0x001c5800, + 0x001c6800, + 0x001d1000, + 0x00241806, + 0x00298000, + 0x002ab801, + 0x002c5801, + 0x002c802d, + 0x002df800, + 0x002e0801, + 0x002e2001, + 0x002e3808, + 0x002f5803, + 0x002fa810, + 0x0030800a, + 0x0030e000, + 0x00325814, + 0x00338000, + 0x0036b007, + 0x0036f805, + 0x00373801, + 0x00375003, + 0x00387001, + 0x00388800, + 0x0039801c, + 0x003d300a, + 0x003d900d, + 0x003f5808, + 0x003fd802, + 0x0040b003, + 0x0040d808, + 0x00412802, + 0x00414806, + 0x0041f800, + 0x0042c804, + 0x0042f800, + 0x00435804, + 0x00447810, + 0x00465038, + 0x0049d000, + 0x0049e000, + 0x004a0807, + 0x004a6800, + 0x004a8806, + 0x004b1001, + 0x004c0800, + 0x004c2000, + 0x004c6801, + 0x004c8801, + 0x004d4800, + 0x004d8800, + 0x004d9802, + 0x004dd002, + 0x004df000, + 0x004e0805, + 0x004e4801, + 0x004e6800, + 0x004e780c, + 0x004ef000, + 0x004f1003, + 0x004ff004, + 0x00502000, + 0x00505803, + 0x00508801, + 0x00514800, + 0x00518800, + 0x0051a000, + 0x0051b800, + 0x0051d003, + 0x00520817, + 0x0052e800, + 0x0052f806, + 0x00538001, + 0x0053a800, + 0x0053b80b, + 0x00542000, + 0x00547000, + 0x00549000, + 0x00554800, + 0x00558800, + 0x0055a000, + 0x0055d002, + 0x00560807, + 0x00565000, + 0x00566802, + 0x0056880e, + 0x00571003, + 0x00579006, + 0x0057d007, + 0x00582000, + 0x00586801, + 0x00588801, + 0x00594800, + 0x00598800, + 0x0059a000, + 0x0059d002, + 0x0059f001, + 0x005a0805, + 0x005a4801, + 0x005a680e, + 0x005af000, + 0x005b1003, + 0x005bc00a, + 0x005c2000, + 0x005c5802, + 0x005c8800, + 0x005cb002, + 0x005cd800, + 0x005ce800, + 0x005d0002, + 0x005d2802, + 0x005d5802, + 0x005dd004, + 0x005e0000, + 0x005e1802, + 0x005e4800, + 0x005e6802, + 0x005e8814, + 0x005fd805, + 0x00602000, + 0x00606800, + 0x00608800, + 0x00614800, + 0x0061d002, + 0x0061f002, + 0x00622812, + 0x0062d801, + 0x0062f001, + 0x00631003, + 0x00638006, + 0x00640800, + 0x00646800, + 0x00648800, + 0x00654800, + 0x0065a000, + 0x0065d002, + 0x0065f800, + 0x00661000, + 0x00662801, + 0x00664800, + 0x00666010, + 0x0066f800, + 0x00671003, + 0x00678000, + 0x0067a00d, + 0x00686800, + 0x00688800, + 0x0069d801, + 0x0069f000, + 0x006a0804, + 0x006a4800, + 0x006a6800, + 0x006a8003, + 0x006ab800, + 0x006b1003, + 0x006c0001, + 0x006c2000, + 0x006cb802, + 0x006d9000, + 0x006de000, + 0x006df001, + 0x006e3808, + 0x006e9005, + 0x006ef806, + 0x006f8001, + 0x006fa80b, + 0x00718800, + 0x0071a00a, + 0x00723807, + 0x0072e024, + 0x00741800, + 0x00742800, + 0x00745800, + 0x00752000, + 0x00753000, + 0x00758800, + 0x0075a008, + 0x0075f001, + 0x00762800, + 0x00763808, + 0x0076d001, + 0x0077001f, + 0x0078c001, + 0x0079a800, + 0x0079b800, + 0x0079c800, + 0x007a4000, + 0x007b6811, + 0x007c0004, + 0x007c3001, + 0x007c6830, + 0x007e3000, + 0x007e6800, + 0x007ed824, + 0x00816803, + 0x00819005, + 0x0081c801, + 0x0081e801, + 0x0082c001, + 0x0082f002, + 0x00838803, + 0x00841000, + 0x00842801, + 0x00846800, + 0x0084e800, + 0x00863000, + 0x00864004, + 0x00867001, + 0x00924800, + 0x00927001, + 0x0092b800, + 0x0092c800, + 0x0092f001, + 0x00944800, + 0x00947001, + 0x00958800, + 0x0095b001, + 0x0095f800, + 0x00960800, + 0x00963001, + 0x0096b800, + 0x00988800, + 0x0098b001, + 0x009ad804, + 0x009be802, + 0x009cd005, + 0x009fb001, + 0x009ff001, + 0x00b40000, + 0x00b4e802, + 0x00b7c806, + 0x00b89002, + 0x00b8b008, + 0x00b99001, + 0x00b9b808, + 0x00ba900d, + 0x00bb6800, + 0x00bb880e, + 0x00bda001, + 0x00bdb806, + 0x00be3000, + 0x00be480a, + 0x00bee802, + 0x00bf5005, + 0x00bfd005, + 0x00c05804, + 0x00c0d005, + 0x00c3c806, + 0x00c42801, + 0x00c54800, + 0x00c55804, + 0x00c7b009, + 0x00c8f803, + 0x00c93801, + 0x00c96003, + 0x00c99000, + 0x00c9c806, + 0x00ca0802, + 0x00cb7001, + 0x00cba80a, + 0x00cd6003, + 0x00ce5005, + 0x00ced802, + 0x00d0b801, + 0x00d0d802, + 0x00d2b000, + 0x00d2c008, + 0x00d31000, + 0x00d32807, + 0x00d3980c, + 0x00d45005, + 0x00d4d005, + 0x00d57055, + 0x00d9a006, + 0x00d9e000, + 0x00da1000, + 0x00da6802, + 0x00db5808, + 0x00dbf802, + 0x00dd1003, + 0x00dd4001, + 0x00dd5802, + 0x00df3000, + 0x00df4001, + 0x00df6800, + 0x00df7802, + 0x00dfa007, + 0x00e16007, + 0x00e1b004, + 0x00e25002, + 0x00e44806, + 0x00e5d801, + 0x00e6400a, + 0x00e6a00c, + 0x00e71006, + 0x00e76800, + 0x00e7a000, + 0x00e7c001, + 0x00e7d804, + 0x00ee003f, + 0x00f8b001, + 0x00f8f001, + 0x00fa3001, + 0x00fa7001, + 0x00fac000, + 0x00fad000, + 0x00fae000, + 0x00faf000, + 0x00fbf001, + 0x00fda800, + 0x00fe2800, + 0x00fea001, + 0x00fee000, + 0x00ff8001, + 0x00ffa800, + 0x00fff810, + 0x01014007, + 0x0102f810, + 0x01039001, + 0x01047800, + 0x0104e802, + 0x0106083e, + 0x010c6003, + 0x01213818, + 0x01225814, + 0x015ba001, + 0x015cb000, + 0x01677802, + 0x0167a004, + 0x01693000, + 0x01694004, + 0x01697001, + 0x016b4006, + 0x016b880e, + 0x016cb808, + 0x016d3800, + 0x016d7800, + 0x016db800, + 0x016df800, + 0x016e3800, + 0x016e7800, + 0x016eb800, + 0x016ef820, + 0x0172f021, + 0x0174d000, + 0x0177a00b, + 0x017eb019, + 0x017fe004, + 0x01815005, + 0x01820000, + 0x0184b803, + 0x01880004, + 0x01898000, + 0x018c7800, + 0x018f200b, + 0x0190f800, + 0x05246802, + 0x05263808, + 0x05316013, + 0x05337803, + 0x0533a009, + 0x0534f001, + 0x05378001, + 0x0537c007, + 0x053e5804, + 0x053e9000, + 0x053ea000, + 0x053ed017, + 0x05401000, + 0x05403000, + 0x05405800, + 0x05412801, + 0x05416003, + 0x0541d005, + 0x0543c007, + 0x05462009, + 0x0546d017, + 0x0547f800, + 0x05493007, + 0x054a380a, + 0x054aa00a, + 0x054be805, + 0x054d9800, + 0x054db003, + 0x054de001, + 0x054e7000, + 0x054ed003, + 0x054f2800, + 0x054ff800, + 0x05514805, + 0x05518801, + 0x0551a80a, + 0x05521800, + 0x05526000, + 0x05527001, + 0x0552d001, + 0x0553e000, + 0x05558000, + 0x05559002, + 0x0555b801, + 0x0555f001, + 0x05560800, + 0x05561817, + 0x05576001, + 0x0557b00a, + 0x05583801, + 0x05587801, + 0x0558b808, + 0x05593800, + 0x05597800, + 0x055b6003, + 0x055f2800, + 0x055f4000, + 0x055f6802, + 0x055fd005, + 0x06bd200b, + 0x06be3803, + 0x06bfe7ff, + 0x06ffe7ff, + 0x073fe7ff, + 0x077fe7ff, + 0x07bfe103, + 0x07d37001, + 0x07d6d025, + 0x07d8380b, + 0x07d8c004, + 0x07d8f000, + 0x07d9b800, + 0x07d9e800, + 0x07d9f800, + 0x07da1000, + 0x07da2800, + 0x07de180f, + 0x07ec8001, + 0x07ee4006, + 0x07ee801f, + 0x07f0000f, + 0x07f0d015, + 0x07f29800, + 0x07f33800, + 0x07f36003, + 0x07f3a800, + 0x07f7e803, + 0x07fcf001, + 0x07fdf802, + 0x07fe4001, + 0x07fe8001, + 0x07fec001, + 0x07fee802, + 0x07ff3800, + 0x07ff780c, + 0x07fff001, + 0x08006000, + 0x08013800, + 0x0801d800, + 0x0801f000, + 0x08027001, + 0x0802f021, + 0x0807d804, + 0x08081803, + 0x0809a002, + 0x080c7800, + 0x080ce802, + 0x080d082e, + 0x080fe882, + 0x0814e802, + 0x0816880f, + 0x0817e003, + 0x08192008, + 0x081a5804, + 0x081bb009, + 0x081cf000, + 0x081e2003, + 0x081eb029, + 0x0824f001, + 0x08255005, + 0x0826a003, + 0x0827e003, + 0x08294007, + 0x082b200a, + 0x082bd800, + 0x082c5800, + 0x082c9800, + 0x082cb000, + 0x082d1000, + 0x082d9000, + 0x082dd000, + 0x082de842, + 0x0839b808, + 0x083ab009, + 0x083b4017, + 0x083c3000, + 0x083d8800, + 0x083dd844, + 0x08403001, + 0x08404800, + 0x0841b000, + 0x0841c802, + 0x0841e801, + 0x0842b000, + 0x0844f807, + 0x0845802f, + 0x08479800, + 0x0847b004, + 0x0848e002, + 0x0849d004, + 0x084a003f, + 0x084dc003, + 0x084e8001, + 0x0850080e, + 0x0850a000, + 0x0850c000, + 0x0851b009, + 0x08524806, + 0x0852c806, + 0x0855001f, + 0x08572805, + 0x0857b808, + 0x0859b002, + 0x085ab001, + 0x085b9804, + 0x085c9006, + 0x085ce80b, + 0x085d804f, + 0x08624836, + 0x0865980c, + 0x08679806, + 0x0869200b, + 0x0869d125, + 0x0873f800, + 0x08755002, + 0x08757001, + 0x0875904d, + 0x08794007, + 0x087a300a, + 0x087ad015, + 0x087c1003, + 0x087c5025, + 0x087e6013, + 0x087fb808, + 0x08800800, + 0x0881c00e, + 0x08827003, + 0x08838000, + 0x08839801, + 0x0883b00b, + 0x08859803, + 0x0885c801, + 0x0885e800, + 0x0886100d, + 0x08874806, + 0x0887d008, + 0x08893804, + 0x08896808, + 0x088a4007, + 0x088b9800, + 0x088bb80a, + 0x088db008, + 0x088e4803, + 0x088e7800, + 0x088f0000, + 0x088fa80a, + 0x08909000, + 0x08917802, + 0x0891a000, + 0x0891b001, + 0x0891f000, + 0x0892083e, + 0x08943800, + 0x08944800, + 0x08947000, + 0x0894f000, + 0x08955005, + 0x0896f800, + 0x0897180c, + 0x0897d007, + 0x08982000, + 0x08986801, + 0x08988801, + 0x08994800, + 0x08998800, + 0x0899a000, + 0x0899d002, + 0x0899f000, + 0x089a0000, + 0x089a2801, + 0x089a4801, + 0x089a7001, + 0x089a880b, + 0x089b209b, + 0x08a1c007, + 0x08a21002, + 0x08a23000, + 0x08a2e000, + 0x08a2f000, + 0x08a3101d, + 0x08a58000, + 0x08a59805, + 0x08a5d000, + 0x08a5e800, + 0x08a5f801, + 0x08a61001, + 0x08a64007, + 0x08a6d0a5, + 0x08ad7800, + 0x08ad9005, + 0x08ade001, + 0x08adf801, + 0x08aee023, + 0x08b19807, + 0x08b1e800, + 0x08b1f801, + 0x08b2280a, + 0x08b2d005, + 0x08b36812, + 0x08b55800, + 0x08b56800, + 0x08b58005, + 0x08b5b800, + 0x08b5d005, + 0x08b65035, + 0x08b8d804, + 0x08b91003, + 0x08b93808, + 0x08ba38b8, + 0x08c17808, + 0x08c1c801, + 0x08c1e063, + 0x08c7980b, + 0x08c83801, + 0x08c85001, + 0x08c8a000, + 0x08c8b800, + 0x08c98000, + 0x08c9b000, + 0x08c9c803, + 0x08c9f000, + 0x08ca1800, + 0x08ca3808, + 0x08cad045, + 0x08cd4001, + 0x08cea007, + 0x08cf0000, + 0x08cf281a, + 0x08d00809, + 0x08d19805, + 0x08d1d803, + 0x08d23808, + 0x08d28805, + 0x08d2c802, + 0x08d4500c, + 0x08d4c001, + 0x08d5180c, + 0x08d7c806, + 0x08d850f5, + 0x08e04800, + 0x08e1800d, + 0x08e1f800, + 0x08e23009, + 0x08e36802, + 0x08e48018, + 0x08e55006, + 0x08e59001, + 0x08e5a84a, + 0x08e83800, + 0x08e85000, + 0x08e98814, + 0x08ea3808, + 0x08ead005, + 0x08eb3000, + 0x08eb4800, + 0x08ec7803, + 0x08eca800, + 0x08ecb800, + 0x08ecc806, + 0x08ed5135, + 0x08f79801, + 0x08f7c808, + 0x08f88800, + 0x08f9b007, + 0x08fa0000, + 0x08fa1000, + 0x08fad055, + 0x08fd880e, + 0x08ff900c, + 0x091cd065, + 0x09237800, + 0x0923a80a, + 0x092a27ff, + 0x096a224b, + 0x097f980c, + 0x09a18010, + 0x09a23fff, + 0x09e23fb8, + 0x0a323fff, + 0x0a723fff, + 0x0ab23fff, + 0x0af23fff, + 0x0b3239b8, + 0x0b51c806, + 0x0b52f800, + 0x0b535003, + 0x0b55f800, + 0x0b565005, + 0x0b577006, + 0x0b57b009, + 0x0b598006, + 0x0b5a3009, + 0x0b5ad000, + 0x0b5b1000, + 0x0b5bc004, + 0x0b5c82af, + 0x0b74d864, + 0x0b7a5804, + 0x0b7c400a, + 0x0b7d003f, + 0x0b7f200b, + 0x0b7f900d, + 0x0c3fc007, + 0x0c66b029, + 0x0c684fff, + 0x0ca84fff, + 0x0ce84fff, + 0x0d284fff, + 0x0d684ae6, + 0x0d7fa000, + 0x0d7fe000, + 0x0d7ff800, + 0x0d89180e, + 0x0d89981c, + 0x0d8a9801, + 0x0d8ab00d, + 0x0d8b4007, + 0x0d97e7ff, + 0x0dd7e103, + 0x0de35804, + 0x0de3e802, + 0x0de44806, + 0x0de4d001, + 0x0de4e801, + 0x0de507ff, + 0x0e2507ff, + 0x0e6502af, + 0x0e7e203b, + 0x0e87b009, + 0x0e893801, + 0x0e8b2800, + 0x0e8b3802, + 0x0e8b7014, + 0x0e8c2806, + 0x0e8d5003, + 0x0e8f5814, + 0x0e921002, + 0x0e923079, + 0x0e96a00b, + 0x0e97a00b, + 0x0e9ab808, + 0x0e9bc886, + 0x0ea2a800, + 0x0ea4e800, + 0x0ea50001, + 0x0ea51801, + 0x0ea53801, + 0x0ea56800, + 0x0ea5d000, + 0x0ea5e000, + 0x0ea62000, + 0x0ea83000, + 0x0ea85801, + 0x0ea8a800, + 0x0ea8e800, + 0x0ea9d000, + 0x0ea9f800, + 0x0eaa2800, + 0x0eaa3802, + 0x0eaa8800, + 0x0eb53001, + 0x0ebe6001, + 0x0ed00036, + 0x0ed1d831, + 0x0ed3a800, + 0x0ed42000, + 0x0ed46473, + 0x0ef8f805, + 0x0ef95904, + 0x0f037091, + 0x0f096809, + 0x0f09f001, + 0x0f0a5003, + 0x0f0a813f, + 0x0f157011, + 0x0f176003, + 0x0f17d004, + 0x0f1801cf, + 0x0f276003, + 0x0f27d2e5, + 0x0f3f3800, + 0x0f3f6000, + 0x0f3f7800, + 0x0f3ff800, + 0x0f462801, + 0x0f46802f, + 0x0f4a2006, + 0x0f4a6003, + 0x0f4ad003, + 0x0f4b0310, + 0x0f65a84b, + 0x0f69f0c1, + 0x0f702000, + 0x0f710000, + 0x0f711800, + 0x0f712801, + 0x0f714000, + 0x0f719800, + 0x0f71c000, + 0x0f71d000, + 0x0f71e005, + 0x0f721803, + 0x0f724000, + 0x0f725000, + 0x0f726000, + 0x0f728000, + 0x0f729800, + 0x0f72a801, + 0x0f72c000, + 0x0f72d000, + 0x0f72e000, + 0x0f72f000, + 0x0f730000, + 0x0f731800, + 0x0f732801, + 0x0f735800, + 0x0f739800, + 0x0f73c000, + 0x0f73e800, + 0x0f73f800, + 0x0f745000, + 0x0f74e004, + 0x0f752000, + 0x0f755000, + 0x0f75e033, + 0x0f77910d, + 0x0f816003, + 0x0f84a00b, + 0x0f857801, + 0x0f860000, + 0x0f868000, + 0x0f87b009, + 0x0f8d7037, + 0x0f90180c, + 0x0f91e003, + 0x0f924806, + 0x0f92900d, + 0x0f933099, + 0x0fb6c003, + 0x0fb76802, + 0x0fb7e802, + 0x0fbbb803, + 0x0fbed005, + 0x0fbf6003, + 0x0fbf880e, + 0x0fc06003, + 0x0fc24007, + 0x0fc2d005, + 0x0fc44007, + 0x0fc57001, + 0x0fc5904d, + 0x0fd2a00b, + 0x0fd37001, + 0x0fd3e802, + 0x0fd44806, + 0x0fd5f000, + 0x0fd63007, + 0x0fd6e003, + 0x0fd74806, + 0x0fd7c806, + 0x0fdc9800, + 0x0fde5824, + 0x0fdfd405, + 0x1537001f, + 0x15b9d005, + 0x15c0f001, + 0x1675100d, + 0x175f0fff, + 0x179f0c1e, + 0x17d0f5e1, + 0x189a5804}; + +/// At the end of the valid Unicode code points space a lot of code points are +/// either reserved or a noncharacter. Adding all these entries to the +/// lookup table would add 446 entries to the table (in Unicode 14). +/// Instead the only the start of the region is stored, every code point in +/// this region needs to be escaped. +inline constexpr uint32_t __unallocated_region_lower_bound = 0x000323b0; + +/// Returns whether the code unit needs to be escaped. +/// +/// \pre The code point is a valid Unicode code point. +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool __needs_escape(const char32_t __code_point) noexcept { + // Since __unallocated_region_lower_bound contains the unshifted range do the + // comparison without shifting. + if (__code_point >= __unallocated_region_lower_bound) + return true; + + ptrdiff_t __i = std::ranges::upper_bound(__entries, (__code_point << 11) | 0x7ffu) - __entries; + if (__i == 0) + return false; + + --__i; + uint32_t __upper_bound = (__entries[__i] >> 11) + (__entries[__i] & 0x7ffu); + return __code_point <= __upper_bound; +} + +} // namespace __escaped_output_table + +#endif //_LIBCPP_STD_VER > 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_ESCAPED_OUTPUT_TABLE_H diff --git a/app/src/main/cpp/libcxx/include/__format/extended_grapheme_cluster_table.h b/app/src/main/cpp/libcxx/include/__format/extended_grapheme_cluster_table.h new file mode 100644 index 0000000..1ffcfeb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/extended_grapheme_cluster_table.h @@ -0,0 +1,1661 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// WARNING, this entire header is generated by +// utils/generate_extended_grapheme_cluster_table.py +// DO NOT MODIFY! + +// UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE +// +// See Terms of Use +// for definitions of Unicode Inc.'s Data Files and Software. +// +// NOTICE TO USER: Carefully read the following legal agreement. +// BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +// DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +// YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +// TERMS AND CONDITIONS OF THIS AGREEMENT. +// IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +// THE DATA FILES OR SOFTWARE. +// +// COPYRIGHT AND PERMISSION NOTICE +// +// Copyright (c) 1991-2022 Unicode, Inc. All rights reserved. +// Distributed under the Terms of Use in https://www.unicode.org/copyright.html. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Unicode data files and any associated documentation +// (the "Data Files") or Unicode software and any associated documentation +// (the "Software") to deal in the Data Files or Software +// without restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, and/or sell copies of +// the Data Files or Software, and to permit persons to whom the Data Files +// or Software are furnished to do so, provided that either +// (a) this copyright and permission notice appear with all copies +// of the Data Files or Software, or +// (b) this copyright and permission notice appear in associated +// Documentation. +// +// THE DATA FILES AND SOFTWARE ARE 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 OF THIRD PARTY RIGHTS. +// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +// NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +// DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THE DATA FILES OR SOFTWARE. +// +// Except as contained in this notice, the name of a copyright holder +// shall not be used in advertising or otherwise to promote the sale, +// use or other dealings in these Data Files or Software without prior +// written authorization of the copyright holder. + +#ifndef _LIBCPP___FORMAT_EXTENDED_GRAPHEME_CLUSTER_TABLE_H +#define _LIBCPP___FORMAT_EXTENDED_GRAPHEME_CLUSTER_TABLE_H + +#include <__algorithm/ranges_upper_bound.h> +#include <__config> +#include <__iterator/access.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __extended_grapheme_custer_property_boundary { + +enum class __property : uint8_t { + // Values generated from the data files. + __CR, + __Control, + __Extend, + __Extended_Pictographic, + __L, + __LF, + __LV, + __LVT, + __Prepend, + __Regional_Indicator, + __SpacingMark, + __T, + __V, + __ZWJ, + + // The properies below aren't stored in the "database". + + // Text position properties. + __sot, + __eot, + + // The code unit has none of above properties. + __none +}; + +/// The entries of the extended grapheme cluster bondary property table. +/// +/// The data is generated from +/// - https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt +/// - https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt +/// +/// The data has 3 values +/// - bits [0, 3] The property. One of the values generated from the datafiles +/// of \ref __property +/// - bits [4, 10] The size of the range. +/// - bits [11, 31] The lower bound code point of the range. The upper bound of +/// the range is lower bound + size. +/// +/// The 7 bits for the size allow a maximum range of 128 elements. Some ranges +/// in the Unicode tables are larger. They are stored in multiple consecutive +/// ranges in the data table. An alternative would be to store the sizes in a +/// separate 16-bit value. The original MSVC STL code had such an approach, but +/// this approach uses less space for the data and is about 4% faster in the +/// following benchmark. +/// libcxx/benchmarks/std_format_spec_string_unicode.bench.cpp +inline constexpr uint32_t __entries[1496] = { + 0x00000091, + 0x00005005, + 0x00005811, + 0x00006800, + 0x00007111, + 0x0003fa01, + 0x00054803, + 0x00056801, + 0x00057003, + 0x001806f2, + 0x00241862, + 0x002c8ac2, + 0x002df802, + 0x002e0812, + 0x002e2012, + 0x002e3802, + 0x00300058, + 0x003080a2, + 0x0030e001, + 0x00325942, + 0x00338002, + 0x0036b062, + 0x0036e808, + 0x0036f852, + 0x00373812, + 0x00375032, + 0x00387808, + 0x00388802, + 0x003981a2, + 0x003d30a2, + 0x003f5882, + 0x003fe802, + 0x0040b032, + 0x0040d882, + 0x00412822, + 0x00414842, + 0x0042c822, + 0x00448018, + 0x0044c072, + 0x00465172, + 0x00471008, + 0x004719f2, + 0x0048180a, + 0x0049d002, + 0x0049d80a, + 0x0049e002, + 0x0049f02a, + 0x004a0872, + 0x004a483a, + 0x004a6802, + 0x004a701a, + 0x004a8862, + 0x004b1012, + 0x004c0802, + 0x004c101a, + 0x004de002, + 0x004df002, + 0x004df81a, + 0x004e0832, + 0x004e381a, + 0x004e581a, + 0x004e6802, + 0x004eb802, + 0x004f1012, + 0x004ff002, + 0x00500812, + 0x0050180a, + 0x0051e002, + 0x0051f02a, + 0x00520812, + 0x00523812, + 0x00525822, + 0x00528802, + 0x00538012, + 0x0053a802, + 0x00540812, + 0x0054180a, + 0x0055e002, + 0x0055f02a, + 0x00560842, + 0x00563812, + 0x0056480a, + 0x0056581a, + 0x00566802, + 0x00571012, + 0x0057d052, + 0x00580802, + 0x0058101a, + 0x0059e002, + 0x0059f012, + 0x005a000a, + 0x005a0832, + 0x005a381a, + 0x005a581a, + 0x005a6802, + 0x005aa822, + 0x005b1012, + 0x005c1002, + 0x005df002, + 0x005df80a, + 0x005e0002, + 0x005e081a, + 0x005e302a, + 0x005e502a, + 0x005e6802, + 0x005eb802, + 0x00600002, + 0x0060082a, + 0x00602002, + 0x0061e002, + 0x0061f022, + 0x0062083a, + 0x00623022, + 0x00625032, + 0x0062a812, + 0x00631012, + 0x00640802, + 0x0064101a, + 0x0065e002, + 0x0065f00a, + 0x0065f802, + 0x0066001a, + 0x00661002, + 0x0066181a, + 0x00663002, + 0x0066381a, + 0x0066501a, + 0x00666012, + 0x0066a812, + 0x00671012, + 0x0067980a, + 0x00680012, + 0x0068101a, + 0x0069d812, + 0x0069f002, + 0x0069f81a, + 0x006a0832, + 0x006a302a, + 0x006a502a, + 0x006a6802, + 0x006a7008, + 0x006ab802, + 0x006b1012, + 0x006c0802, + 0x006c101a, + 0x006e5002, + 0x006e7802, + 0x006e801a, + 0x006e9022, + 0x006eb002, + 0x006ec06a, + 0x006ef802, + 0x006f901a, + 0x00718802, + 0x0071980a, + 0x0071a062, + 0x00723872, + 0x00758802, + 0x0075980a, + 0x0075a082, + 0x00764062, + 0x0078c012, + 0x0079a802, + 0x0079b802, + 0x0079c802, + 0x0079f01a, + 0x007b88d2, + 0x007bf80a, + 0x007c0042, + 0x007c3012, + 0x007c68a2, + 0x007cca32, + 0x007e3002, + 0x00816832, + 0x0081880a, + 0x00819052, + 0x0081c812, + 0x0081d81a, + 0x0081e812, + 0x0082b01a, + 0x0082c012, + 0x0082f022, + 0x00838832, + 0x00841002, + 0x0084200a, + 0x00842812, + 0x00846802, + 0x0084e802, + 0x008805f4, + 0x008b047c, + 0x008d457b, + 0x009ae822, + 0x00b89022, + 0x00b8a80a, + 0x00b99012, + 0x00b9a00a, + 0x00ba9012, + 0x00bb9012, + 0x00bda012, + 0x00bdb00a, + 0x00bdb862, + 0x00bdf07a, + 0x00be3002, + 0x00be381a, + 0x00be48a2, + 0x00bee802, + 0x00c05822, + 0x00c07001, + 0x00c07802, + 0x00c42812, + 0x00c54802, + 0x00c90022, + 0x00c9183a, + 0x00c93812, + 0x00c9482a, + 0x00c9801a, + 0x00c99002, + 0x00c9985a, + 0x00c9c822, + 0x00d0b812, + 0x00d0c81a, + 0x00d0d802, + 0x00d2a80a, + 0x00d2b002, + 0x00d2b80a, + 0x00d2c062, + 0x00d30002, + 0x00d31002, + 0x00d32872, + 0x00d3685a, + 0x00d39892, + 0x00d3f802, + 0x00d581e2, + 0x00d80032, + 0x00d8200a, + 0x00d9a062, + 0x00d9d80a, + 0x00d9e002, + 0x00d9e84a, + 0x00da1002, + 0x00da181a, + 0x00db5882, + 0x00dc0012, + 0x00dc100a, + 0x00dd080a, + 0x00dd1032, + 0x00dd301a, + 0x00dd4012, + 0x00dd500a, + 0x00dd5822, + 0x00df3002, + 0x00df380a, + 0x00df4012, + 0x00df502a, + 0x00df6802, + 0x00df700a, + 0x00df7822, + 0x00df901a, + 0x00e1207a, + 0x00e16072, + 0x00e1a01a, + 0x00e1b012, + 0x00e68022, + 0x00e6a0c2, + 0x00e7080a, + 0x00e71062, + 0x00e76802, + 0x00e7a002, + 0x00e7b80a, + 0x00e7c012, + 0x00ee03f2, + 0x01005801, + 0x01006002, + 0x0100680d, + 0x01007011, + 0x01014061, + 0x0101e003, + 0x01024803, + 0x010300f1, + 0x01068202, + 0x01091003, + 0x0109c803, + 0x010ca053, + 0x010d4813, + 0x0118d013, + 0x01194003, + 0x011c4003, + 0x011e7803, + 0x011f48a3, + 0x011fc023, + 0x01261003, + 0x012d5013, + 0x012db003, + 0x012e0003, + 0x012fd833, + 0x01300053, + 0x013038b3, + 0x0130a713, + 0x01348753, + 0x013840a3, + 0x0138a003, + 0x0138b003, + 0x0138e803, + 0x01390803, + 0x01394003, + 0x01399813, + 0x013a2003, + 0x013a3803, + 0x013a6003, + 0x013a7003, + 0x013a9823, + 0x013ab803, + 0x013b1843, + 0x013ca823, + 0x013d0803, + 0x013d8003, + 0x013df803, + 0x0149a013, + 0x01582823, + 0x0158d813, + 0x015a8003, + 0x015aa803, + 0x01677822, + 0x016bf802, + 0x016f01f2, + 0x01815052, + 0x01818003, + 0x0181e803, + 0x0184c812, + 0x0194b803, + 0x0194c803, + 0x05337832, + 0x0533a092, + 0x0534f012, + 0x05378012, + 0x05401002, + 0x05403002, + 0x05405802, + 0x0541181a, + 0x05412812, + 0x0541380a, + 0x05416002, + 0x0544001a, + 0x0545a0fa, + 0x05462012, + 0x05470112, + 0x0547f802, + 0x05493072, + 0x054a38a2, + 0x054a901a, + 0x054b01c4, + 0x054c0022, + 0x054c180a, + 0x054d9802, + 0x054da01a, + 0x054db032, + 0x054dd01a, + 0x054de012, + 0x054df02a, + 0x054f2802, + 0x05514852, + 0x0551781a, + 0x05518812, + 0x0551981a, + 0x0551a812, + 0x05521802, + 0x05526002, + 0x0552680a, + 0x0553e002, + 0x05558002, + 0x05559022, + 0x0555b812, + 0x0555f012, + 0x05560802, + 0x0557580a, + 0x05576012, + 0x0557701a, + 0x0557a80a, + 0x0557b002, + 0x055f181a, + 0x055f2802, + 0x055f301a, + 0x055f4002, + 0x055f481a, + 0x055f600a, + 0x055f6802, + 0x05600006, + 0x056009a7, + 0x0560e006, + 0x0560e9a7, + 0x0561c006, + 0x0561c9a7, + 0x0562a006, + 0x0562a9a7, + 0x05638006, + 0x056389a7, + 0x05646006, + 0x056469a7, + 0x05654006, + 0x056549a7, + 0x05662006, + 0x056629a7, + 0x05670006, + 0x056709a7, + 0x0567e006, + 0x0567e9a7, + 0x0568c006, + 0x0568c9a7, + 0x0569a006, + 0x0569a9a7, + 0x056a8006, + 0x056a89a7, + 0x056b6006, + 0x056b69a7, + 0x056c4006, + 0x056c49a7, + 0x056d2006, + 0x056d29a7, + 0x056e0006, + 0x056e09a7, + 0x056ee006, + 0x056ee9a7, + 0x056fc006, + 0x056fc9a7, + 0x0570a006, + 0x0570a9a7, + 0x05718006, + 0x057189a7, + 0x05726006, + 0x057269a7, + 0x05734006, + 0x057349a7, + 0x05742006, + 0x057429a7, + 0x05750006, + 0x057509a7, + 0x0575e006, + 0x0575e9a7, + 0x0576c006, + 0x0576c9a7, + 0x0577a006, + 0x0577a9a7, + 0x05788006, + 0x057889a7, + 0x05796006, + 0x057969a7, + 0x057a4006, + 0x057a49a7, + 0x057b2006, + 0x057b29a7, + 0x057c0006, + 0x057c09a7, + 0x057ce006, + 0x057ce9a7, + 0x057dc006, + 0x057dc9a7, + 0x057ea006, + 0x057ea9a7, + 0x057f8006, + 0x057f89a7, + 0x05806006, + 0x058069a7, + 0x05814006, + 0x058149a7, + 0x05822006, + 0x058229a7, + 0x05830006, + 0x058309a7, + 0x0583e006, + 0x0583e9a7, + 0x0584c006, + 0x0584c9a7, + 0x0585a006, + 0x0585a9a7, + 0x05868006, + 0x058689a7, + 0x05876006, + 0x058769a7, + 0x05884006, + 0x058849a7, + 0x05892006, + 0x058929a7, + 0x058a0006, + 0x058a09a7, + 0x058ae006, + 0x058ae9a7, + 0x058bc006, + 0x058bc9a7, + 0x058ca006, + 0x058ca9a7, + 0x058d8006, + 0x058d89a7, + 0x058e6006, + 0x058e69a7, + 0x058f4006, + 0x058f49a7, + 0x05902006, + 0x059029a7, + 0x05910006, + 0x059109a7, + 0x0591e006, + 0x0591e9a7, + 0x0592c006, + 0x0592c9a7, + 0x0593a006, + 0x0593a9a7, + 0x05948006, + 0x059489a7, + 0x05956006, + 0x059569a7, + 0x05964006, + 0x059649a7, + 0x05972006, + 0x059729a7, + 0x05980006, + 0x059809a7, + 0x0598e006, + 0x0598e9a7, + 0x0599c006, + 0x0599c9a7, + 0x059aa006, + 0x059aa9a7, + 0x059b8006, + 0x059b89a7, + 0x059c6006, + 0x059c69a7, + 0x059d4006, + 0x059d49a7, + 0x059e2006, + 0x059e29a7, + 0x059f0006, + 0x059f09a7, + 0x059fe006, + 0x059fe9a7, + 0x05a0c006, + 0x05a0c9a7, + 0x05a1a006, + 0x05a1a9a7, + 0x05a28006, + 0x05a289a7, + 0x05a36006, + 0x05a369a7, + 0x05a44006, + 0x05a449a7, + 0x05a52006, + 0x05a529a7, + 0x05a60006, + 0x05a609a7, + 0x05a6e006, + 0x05a6e9a7, + 0x05a7c006, + 0x05a7c9a7, + 0x05a8a006, + 0x05a8a9a7, + 0x05a98006, + 0x05a989a7, + 0x05aa6006, + 0x05aa69a7, + 0x05ab4006, + 0x05ab49a7, + 0x05ac2006, + 0x05ac29a7, + 0x05ad0006, + 0x05ad09a7, + 0x05ade006, + 0x05ade9a7, + 0x05aec006, + 0x05aec9a7, + 0x05afa006, + 0x05afa9a7, + 0x05b08006, + 0x05b089a7, + 0x05b16006, + 0x05b169a7, + 0x05b24006, + 0x05b249a7, + 0x05b32006, + 0x05b329a7, + 0x05b40006, + 0x05b409a7, + 0x05b4e006, + 0x05b4e9a7, + 0x05b5c006, + 0x05b5c9a7, + 0x05b6a006, + 0x05b6a9a7, + 0x05b78006, + 0x05b789a7, + 0x05b86006, + 0x05b869a7, + 0x05b94006, + 0x05b949a7, + 0x05ba2006, + 0x05ba29a7, + 0x05bb0006, + 0x05bb09a7, + 0x05bbe006, + 0x05bbe9a7, + 0x05bcc006, + 0x05bcc9a7, + 0x05bda006, + 0x05bda9a7, + 0x05be8006, + 0x05be89a7, + 0x05bf6006, + 0x05bf69a7, + 0x05c04006, + 0x05c049a7, + 0x05c12006, + 0x05c129a7, + 0x05c20006, + 0x05c209a7, + 0x05c2e006, + 0x05c2e9a7, + 0x05c3c006, + 0x05c3c9a7, + 0x05c4a006, + 0x05c4a9a7, + 0x05c58006, + 0x05c589a7, + 0x05c66006, + 0x05c669a7, + 0x05c74006, + 0x05c749a7, + 0x05c82006, + 0x05c829a7, + 0x05c90006, + 0x05c909a7, + 0x05c9e006, + 0x05c9e9a7, + 0x05cac006, + 0x05cac9a7, + 0x05cba006, + 0x05cba9a7, + 0x05cc8006, + 0x05cc89a7, + 0x05cd6006, + 0x05cd69a7, + 0x05ce4006, + 0x05ce49a7, + 0x05cf2006, + 0x05cf29a7, + 0x05d00006, + 0x05d009a7, + 0x05d0e006, + 0x05d0e9a7, + 0x05d1c006, + 0x05d1c9a7, + 0x05d2a006, + 0x05d2a9a7, + 0x05d38006, + 0x05d389a7, + 0x05d46006, + 0x05d469a7, + 0x05d54006, + 0x05d549a7, + 0x05d62006, + 0x05d629a7, + 0x05d70006, + 0x05d709a7, + 0x05d7e006, + 0x05d7e9a7, + 0x05d8c006, + 0x05d8c9a7, + 0x05d9a006, + 0x05d9a9a7, + 0x05da8006, + 0x05da89a7, + 0x05db6006, + 0x05db69a7, + 0x05dc4006, + 0x05dc49a7, + 0x05dd2006, + 0x05dd29a7, + 0x05de0006, + 0x05de09a7, + 0x05dee006, + 0x05dee9a7, + 0x05dfc006, + 0x05dfc9a7, + 0x05e0a006, + 0x05e0a9a7, + 0x05e18006, + 0x05e189a7, + 0x05e26006, + 0x05e269a7, + 0x05e34006, + 0x05e349a7, + 0x05e42006, + 0x05e429a7, + 0x05e50006, + 0x05e509a7, + 0x05e5e006, + 0x05e5e9a7, + 0x05e6c006, + 0x05e6c9a7, + 0x05e7a006, + 0x05e7a9a7, + 0x05e88006, + 0x05e889a7, + 0x05e96006, + 0x05e969a7, + 0x05ea4006, + 0x05ea49a7, + 0x05eb2006, + 0x05eb29a7, + 0x05ec0006, + 0x05ec09a7, + 0x05ece006, + 0x05ece9a7, + 0x05edc006, + 0x05edc9a7, + 0x05eea006, + 0x05eea9a7, + 0x05ef8006, + 0x05ef89a7, + 0x05f06006, + 0x05f069a7, + 0x05f14006, + 0x05f149a7, + 0x05f22006, + 0x05f229a7, + 0x05f30006, + 0x05f309a7, + 0x05f3e006, + 0x05f3e9a7, + 0x05f4c006, + 0x05f4c9a7, + 0x05f5a006, + 0x05f5a9a7, + 0x05f68006, + 0x05f689a7, + 0x05f76006, + 0x05f769a7, + 0x05f84006, + 0x05f849a7, + 0x05f92006, + 0x05f929a7, + 0x05fa0006, + 0x05fa09a7, + 0x05fae006, + 0x05fae9a7, + 0x05fbc006, + 0x05fbc9a7, + 0x05fca006, + 0x05fca9a7, + 0x05fd8006, + 0x05fd89a7, + 0x05fe6006, + 0x05fe69a7, + 0x05ff4006, + 0x05ff49a7, + 0x06002006, + 0x060029a7, + 0x06010006, + 0x060109a7, + 0x0601e006, + 0x0601e9a7, + 0x0602c006, + 0x0602c9a7, + 0x0603a006, + 0x0603a9a7, + 0x06048006, + 0x060489a7, + 0x06056006, + 0x060569a7, + 0x06064006, + 0x060649a7, + 0x06072006, + 0x060729a7, + 0x06080006, + 0x060809a7, + 0x0608e006, + 0x0608e9a7, + 0x0609c006, + 0x0609c9a7, + 0x060aa006, + 0x060aa9a7, + 0x060b8006, + 0x060b89a7, + 0x060c6006, + 0x060c69a7, + 0x060d4006, + 0x060d49a7, + 0x060e2006, + 0x060e29a7, + 0x060f0006, + 0x060f09a7, + 0x060fe006, + 0x060fe9a7, + 0x0610c006, + 0x0610c9a7, + 0x0611a006, + 0x0611a9a7, + 0x06128006, + 0x061289a7, + 0x06136006, + 0x061369a7, + 0x06144006, + 0x061449a7, + 0x06152006, + 0x061529a7, + 0x06160006, + 0x061609a7, + 0x0616e006, + 0x0616e9a7, + 0x0617c006, + 0x0617c9a7, + 0x0618a006, + 0x0618a9a7, + 0x06198006, + 0x061989a7, + 0x061a6006, + 0x061a69a7, + 0x061b4006, + 0x061b49a7, + 0x061c2006, + 0x061c29a7, + 0x061d0006, + 0x061d09a7, + 0x061de006, + 0x061de9a7, + 0x061ec006, + 0x061ec9a7, + 0x061fa006, + 0x061fa9a7, + 0x06208006, + 0x062089a7, + 0x06216006, + 0x062169a7, + 0x06224006, + 0x062249a7, + 0x06232006, + 0x062329a7, + 0x06240006, + 0x062409a7, + 0x0624e006, + 0x0624e9a7, + 0x0625c006, + 0x0625c9a7, + 0x0626a006, + 0x0626a9a7, + 0x06278006, + 0x062789a7, + 0x06286006, + 0x062869a7, + 0x06294006, + 0x062949a7, + 0x062a2006, + 0x062a29a7, + 0x062b0006, + 0x062b09a7, + 0x062be006, + 0x062be9a7, + 0x062cc006, + 0x062cc9a7, + 0x062da006, + 0x062da9a7, + 0x062e8006, + 0x062e89a7, + 0x062f6006, + 0x062f69a7, + 0x06304006, + 0x063049a7, + 0x06312006, + 0x063129a7, + 0x06320006, + 0x063209a7, + 0x0632e006, + 0x0632e9a7, + 0x0633c006, + 0x0633c9a7, + 0x0634a006, + 0x0634a9a7, + 0x06358006, + 0x063589a7, + 0x06366006, + 0x063669a7, + 0x06374006, + 0x063749a7, + 0x06382006, + 0x063829a7, + 0x06390006, + 0x063909a7, + 0x0639e006, + 0x0639e9a7, + 0x063ac006, + 0x063ac9a7, + 0x063ba006, + 0x063ba9a7, + 0x063c8006, + 0x063c89a7, + 0x063d6006, + 0x063d69a7, + 0x063e4006, + 0x063e49a7, + 0x063f2006, + 0x063f29a7, + 0x06400006, + 0x064009a7, + 0x0640e006, + 0x0640e9a7, + 0x0641c006, + 0x0641c9a7, + 0x0642a006, + 0x0642a9a7, + 0x06438006, + 0x064389a7, + 0x06446006, + 0x064469a7, + 0x06454006, + 0x064549a7, + 0x06462006, + 0x064629a7, + 0x06470006, + 0x064709a7, + 0x0647e006, + 0x0647e9a7, + 0x0648c006, + 0x0648c9a7, + 0x0649a006, + 0x0649a9a7, + 0x064a8006, + 0x064a89a7, + 0x064b6006, + 0x064b69a7, + 0x064c4006, + 0x064c49a7, + 0x064d2006, + 0x064d29a7, + 0x064e0006, + 0x064e09a7, + 0x064ee006, + 0x064ee9a7, + 0x064fc006, + 0x064fc9a7, + 0x0650a006, + 0x0650a9a7, + 0x06518006, + 0x065189a7, + 0x06526006, + 0x065269a7, + 0x06534006, + 0x065349a7, + 0x06542006, + 0x065429a7, + 0x06550006, + 0x065509a7, + 0x0655e006, + 0x0655e9a7, + 0x0656c006, + 0x0656c9a7, + 0x0657a006, + 0x0657a9a7, + 0x06588006, + 0x065889a7, + 0x06596006, + 0x065969a7, + 0x065a4006, + 0x065a49a7, + 0x065b2006, + 0x065b29a7, + 0x065c0006, + 0x065c09a7, + 0x065ce006, + 0x065ce9a7, + 0x065dc006, + 0x065dc9a7, + 0x065ea006, + 0x065ea9a7, + 0x065f8006, + 0x065f89a7, + 0x06606006, + 0x066069a7, + 0x06614006, + 0x066149a7, + 0x06622006, + 0x066229a7, + 0x06630006, + 0x066309a7, + 0x0663e006, + 0x0663e9a7, + 0x0664c006, + 0x0664c9a7, + 0x0665a006, + 0x0665a9a7, + 0x06668006, + 0x066689a7, + 0x06676006, + 0x066769a7, + 0x06684006, + 0x066849a7, + 0x06692006, + 0x066929a7, + 0x066a0006, + 0x066a09a7, + 0x066ae006, + 0x066ae9a7, + 0x066bc006, + 0x066bc9a7, + 0x066ca006, + 0x066ca9a7, + 0x066d8006, + 0x066d89a7, + 0x066e6006, + 0x066e69a7, + 0x066f4006, + 0x066f49a7, + 0x06702006, + 0x067029a7, + 0x06710006, + 0x067109a7, + 0x0671e006, + 0x0671e9a7, + 0x0672c006, + 0x0672c9a7, + 0x0673a006, + 0x0673a9a7, + 0x06748006, + 0x067489a7, + 0x06756006, + 0x067569a7, + 0x06764006, + 0x067649a7, + 0x06772006, + 0x067729a7, + 0x06780006, + 0x067809a7, + 0x0678e006, + 0x0678e9a7, + 0x0679c006, + 0x0679c9a7, + 0x067aa006, + 0x067aa9a7, + 0x067b8006, + 0x067b89a7, + 0x067c6006, + 0x067c69a7, + 0x067d4006, + 0x067d49a7, + 0x067e2006, + 0x067e29a7, + 0x067f0006, + 0x067f09a7, + 0x067fe006, + 0x067fe9a7, + 0x0680c006, + 0x0680c9a7, + 0x0681a006, + 0x0681a9a7, + 0x06828006, + 0x068289a7, + 0x06836006, + 0x068369a7, + 0x06844006, + 0x068449a7, + 0x06852006, + 0x068529a7, + 0x06860006, + 0x068609a7, + 0x0686e006, + 0x0686e9a7, + 0x0687c006, + 0x0687c9a7, + 0x0688a006, + 0x0688a9a7, + 0x06898006, + 0x068989a7, + 0x068a6006, + 0x068a69a7, + 0x068b4006, + 0x068b49a7, + 0x068c2006, + 0x068c29a7, + 0x068d0006, + 0x068d09a7, + 0x068de006, + 0x068de9a7, + 0x068ec006, + 0x068ec9a7, + 0x068fa006, + 0x068fa9a7, + 0x06908006, + 0x069089a7, + 0x06916006, + 0x069169a7, + 0x06924006, + 0x069249a7, + 0x06932006, + 0x069329a7, + 0x06940006, + 0x069409a7, + 0x0694e006, + 0x0694e9a7, + 0x0695c006, + 0x0695c9a7, + 0x0696a006, + 0x0696a9a7, + 0x06978006, + 0x069789a7, + 0x06986006, + 0x069869a7, + 0x06994006, + 0x069949a7, + 0x069a2006, + 0x069a29a7, + 0x069b0006, + 0x069b09a7, + 0x069be006, + 0x069be9a7, + 0x069cc006, + 0x069cc9a7, + 0x069da006, + 0x069da9a7, + 0x069e8006, + 0x069e89a7, + 0x069f6006, + 0x069f69a7, + 0x06a04006, + 0x06a049a7, + 0x06a12006, + 0x06a129a7, + 0x06a20006, + 0x06a209a7, + 0x06a2e006, + 0x06a2e9a7, + 0x06a3c006, + 0x06a3c9a7, + 0x06a4a006, + 0x06a4a9a7, + 0x06a58006, + 0x06a589a7, + 0x06a66006, + 0x06a669a7, + 0x06a74006, + 0x06a749a7, + 0x06a82006, + 0x06a829a7, + 0x06a90006, + 0x06a909a7, + 0x06a9e006, + 0x06a9e9a7, + 0x06aac006, + 0x06aac9a7, + 0x06aba006, + 0x06aba9a7, + 0x06ac8006, + 0x06ac89a7, + 0x06ad6006, + 0x06ad69a7, + 0x06ae4006, + 0x06ae49a7, + 0x06af2006, + 0x06af29a7, + 0x06b00006, + 0x06b009a7, + 0x06b0e006, + 0x06b0e9a7, + 0x06b1c006, + 0x06b1c9a7, + 0x06b2a006, + 0x06b2a9a7, + 0x06b38006, + 0x06b389a7, + 0x06b46006, + 0x06b469a7, + 0x06b54006, + 0x06b549a7, + 0x06b62006, + 0x06b629a7, + 0x06b70006, + 0x06b709a7, + 0x06b7e006, + 0x06b7e9a7, + 0x06b8c006, + 0x06b8c9a7, + 0x06b9a006, + 0x06b9a9a7, + 0x06ba8006, + 0x06ba89a7, + 0x06bb6006, + 0x06bb69a7, + 0x06bc4006, + 0x06bc49a7, + 0x06bd816c, + 0x06be5b0b, + 0x07d8f002, + 0x07f000f2, + 0x07f100f2, + 0x07f7f801, + 0x07fcf012, + 0x07ff80b1, + 0x080fe802, + 0x08170002, + 0x081bb042, + 0x08500822, + 0x08502812, + 0x08506032, + 0x0851c022, + 0x0851f802, + 0x08572812, + 0x08692032, + 0x08755812, + 0x0877e822, + 0x087a30a2, + 0x087c1032, + 0x0880000a, + 0x08800802, + 0x0880100a, + 0x0881c0e2, + 0x08838002, + 0x08839812, + 0x0883f822, + 0x0884100a, + 0x0885802a, + 0x08859832, + 0x0885b81a, + 0x0885c812, + 0x0885e808, + 0x08861002, + 0x08866808, + 0x08880022, + 0x08893842, + 0x0889600a, + 0x08896872, + 0x088a281a, + 0x088b9802, + 0x088c0012, + 0x088c100a, + 0x088d982a, + 0x088db082, + 0x088df81a, + 0x088e1018, + 0x088e4832, + 0x088e700a, + 0x088e7802, + 0x0891602a, + 0x08917822, + 0x0891901a, + 0x0891a002, + 0x0891a80a, + 0x0891b012, + 0x0891f002, + 0x08920802, + 0x0896f802, + 0x0897002a, + 0x08971872, + 0x08980012, + 0x0898101a, + 0x0899d812, + 0x0899f002, + 0x0899f80a, + 0x089a0002, + 0x089a083a, + 0x089a381a, + 0x089a582a, + 0x089ab802, + 0x089b101a, + 0x089b3062, + 0x089b8042, + 0x08a1a82a, + 0x08a1c072, + 0x08a2001a, + 0x08a21022, + 0x08a2280a, + 0x08a23002, + 0x08a2f002, + 0x08a58002, + 0x08a5881a, + 0x08a59852, + 0x08a5c80a, + 0x08a5d002, + 0x08a5d81a, + 0x08a5e802, + 0x08a5f00a, + 0x08a5f812, + 0x08a6080a, + 0x08a61012, + 0x08ad7802, + 0x08ad801a, + 0x08ad9032, + 0x08adc03a, + 0x08ade012, + 0x08adf00a, + 0x08adf812, + 0x08aee012, + 0x08b1802a, + 0x08b19872, + 0x08b1d81a, + 0x08b1e802, + 0x08b1f00a, + 0x08b1f812, + 0x08b55802, + 0x08b5600a, + 0x08b56802, + 0x08b5701a, + 0x08b58052, + 0x08b5b00a, + 0x08b5b802, + 0x08b8e822, + 0x08b91032, + 0x08b9300a, + 0x08b93842, + 0x08c1602a, + 0x08c17882, + 0x08c1c00a, + 0x08c1c812, + 0x08c98002, + 0x08c9884a, + 0x08c9b81a, + 0x08c9d812, + 0x08c9e80a, + 0x08c9f002, + 0x08c9f808, + 0x08ca000a, + 0x08ca0808, + 0x08ca100a, + 0x08ca1802, + 0x08ce882a, + 0x08cea032, + 0x08ced012, + 0x08cee03a, + 0x08cf0002, + 0x08cf200a, + 0x08d00892, + 0x08d19852, + 0x08d1c80a, + 0x08d1d008, + 0x08d1d832, + 0x08d23802, + 0x08d28852, + 0x08d2b81a, + 0x08d2c822, + 0x08d42058, + 0x08d450c2, + 0x08d4b80a, + 0x08d4c012, + 0x08e1780a, + 0x08e18062, + 0x08e1c052, + 0x08e1f00a, + 0x08e1f802, + 0x08e49152, + 0x08e5480a, + 0x08e55062, + 0x08e5880a, + 0x08e59012, + 0x08e5a00a, + 0x08e5a812, + 0x08e98852, + 0x08e9d002, + 0x08e9e012, + 0x08e9f862, + 0x08ea3008, + 0x08ea3802, + 0x08ec504a, + 0x08ec8012, + 0x08ec981a, + 0x08eca802, + 0x08ecb00a, + 0x08ecb802, + 0x08f79812, + 0x08f7a81a, + 0x08f80012, + 0x08f81008, + 0x08f8180a, + 0x08f9a01a, + 0x08f9b042, + 0x08f9f01a, + 0x08fa0002, + 0x08fa080a, + 0x08fa1002, + 0x09a180f1, + 0x09a20002, + 0x09a238e2, + 0x0b578042, + 0x0b598062, + 0x0b7a7802, + 0x0b7a8b6a, + 0x0b7c7832, + 0x0b7f2002, + 0x0b7f801a, + 0x0de4e812, + 0x0de50031, + 0x0e7802d2, + 0x0e798162, + 0x0e8b2802, + 0x0e8b300a, + 0x0e8b3822, + 0x0e8b680a, + 0x0e8b7042, + 0x0e8b9871, + 0x0e8bd872, + 0x0e8c2862, + 0x0e8d5032, + 0x0e921022, + 0x0ed00362, + 0x0ed1db12, + 0x0ed3a802, + 0x0ed42002, + 0x0ed4d842, + 0x0ed508e2, + 0x0f000062, + 0x0f004102, + 0x0f00d862, + 0x0f011812, + 0x0f013042, + 0x0f047802, + 0x0f098062, + 0x0f157002, + 0x0f176032, + 0x0f276032, + 0x0f468062, + 0x0f4a2062, + 0x0f8007f3, + 0x0f8407f3, + 0x0f886823, + 0x0f897803, + 0x0f8b6053, + 0x0f8bf013, + 0x0f8c7003, + 0x0f8c8893, + 0x0f8d6b83, + 0x0f8f3199, + 0x0f9008e3, + 0x0f90d003, + 0x0f917803, + 0x0f919083, + 0x0f91e033, + 0x0f924ff3, + 0x0f964ff3, + 0x0f9a4ff3, + 0x0f9e4b13, + 0x0f9fd842, + 0x0fa007f3, + 0x0fa407f3, + 0x0fa803d3, + 0x0faa37f3, + 0x0fae37f3, + 0x0fb23093, + 0x0fb407f3, + 0x0fbba0b3, + 0x0fbeaaa3, + 0x0fc06033, + 0x0fc24073, + 0x0fc2d053, + 0x0fc44073, + 0x0fc57513, + 0x0fc862e3, + 0x0fc9e093, + 0x0fca3ff3, + 0x0fce3ff3, + 0x0fd23ff3, + 0x0fd63b83, + 0x0fe007f3, + 0x0fe407f3, + 0x0fe807f3, + 0x0fec07f3, + 0x0ff007f3, + 0x0ff407f3, + 0x0ff807f3, + 0x0ffc07d3, + 0x700001f1, + 0x700105f2, + 0x700407f1, + 0x700807f2, + 0x700c06f2, + 0x700f87f1, + 0x701387f1, + 0x701787f1, + 0x701b87f1, + 0x701f87f1, + 0x702387f1, + 0x702787f1, + 0x702b87f1, + 0x702f87f1, + 0x703387f1, + 0x703787f1, + 0x703b87f1, + 0x703f87f1, + 0x704387f1, + 0x704787f1, + 0x704b87f1, + 0x704f87f1, + 0x705387f1, + 0x705787f1, + 0x705b87f1, + 0x705f87f1, + 0x706387f1, + 0x706787f1, + 0x706b87f1, + 0x706f87f1, + 0x707387f1, + 0x707787f1, + 0x707b87f1, + 0x707f80f1}; + +/// Returns the extended grapheme cluster bondary property of a code point. +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr __property __get_property(const char32_t __code_point) noexcept { + // The algorithm searches for the upper bound of the range and, when found, + // steps back one entry. This algorithm is used since the code point can be + // anywhere in the range. After a lower bound is found the next step is to + // compare whether the code unit is indeed in the range. + // + // Since the entry contains a code unit, size, and property the code point + // being sought needs to be adjusted. Just shifting the code point to the + // proper position doesn't work; suppose an entry has property 0, size 1, + // and lower bound 3. This results in the entry 0x1810. + // When searching for code point 3 it will search for 0x1800, find 0x1810 + // and moves to the previous entry. Thus the lower bound value will never + // be found. + // The simple solution is to set the bits belonging to the property and + // size. Then the upper bound for code point 3 will return the entry after + // 0x1810. After moving to the previous entry the algorithm arrives at the + // correct entry. + ptrdiff_t __i = std::ranges::upper_bound(__entries, (__code_point << 11) | 0x7ffu) - __entries; + if (__i == 0) + return __property::__none; + + --__i; + uint32_t __upper_bound = (__entries[__i] >> 11) + ((__entries[__i] >> 4) & 0x7f); + if (__code_point <= __upper_bound) + return static_cast<__property>(__entries[__i] & 0xf); + + return __property::__none; +} + +} // namespace __extended_grapheme_custer_property_boundary + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_EXTENDED_GRAPHEME_CLUSTER_TABLE_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_arg.h b/app/src/main/cpp/libcxx/include/__format/format_arg.h new file mode 100644 index 0000000..771a03f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_arg.h @@ -0,0 +1,302 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_ARG_H +#define _LIBCPP___FORMAT_FORMAT_ARG_H + +#include <__assert> +#include <__concepts/arithmetic.h> +#include <__config> +#include <__format/format_error.h> +#include <__format/format_fwd.h> +#include <__format/format_parse_context.h> +#include <__functional/invoke.h> +#include <__memory/addressof.h> +#include <__utility/forward.h> +#include <__utility/unreachable.h> +#include <__variant/monostate.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __format { +/// The type stored in @ref basic_format_arg. +/// +/// @note The 128-bit types are unconditionally in the list to avoid the values +/// of the enums to depend on the availability of 128-bit integers. +/// +/// @note The value is stored as a 5-bit value in the __packed_arg_t_bits. This +/// limits the maximum number of elements to 32. +/// When modifying update the test +/// test/libcxx/utilities/format/format.arguments/format.arg/arg_t.compile.pass.cpp +/// It could be packed in 4-bits but that means a new type directly becomes an +/// ABI break. The packed type is 64-bit so this reduces the maximum number of +/// packed elements from 16 to 12. +/// +/// @note Some members of this enum are an extension. These extensions need +/// special behaviour in visit_format_arg. There they need to be wrapped in a +/// handle to satisfy the user observable behaviour. The internal function +/// __visit_format_arg doesn't do this wrapping. So in the format functions +/// this function is used to avoid unneeded overhead. +enum class _LIBCPP_ENUM_VIS __arg_t : uint8_t { + __none, + __boolean, + __char_type, + __int, + __long_long, + __i128, // extension + __unsigned, + __unsigned_long_long, + __u128, // extension + __float, + __double, + __long_double, + __const_char_type_ptr, + __string_view, + __ptr, + __handle +}; + +inline constexpr unsigned __packed_arg_t_bits = 5; +inline constexpr uint8_t __packed_arg_t_mask = 0x1f; + +inline constexpr unsigned __packed_types_storage_bits = 64; +inline constexpr unsigned __packed_types_max = __packed_types_storage_bits / __packed_arg_t_bits; + +_LIBCPP_HIDE_FROM_ABI +constexpr bool __use_packed_format_arg_store(size_t __size) { return __size <= __packed_types_max; } + +_LIBCPP_HIDE_FROM_ABI +constexpr __arg_t __get_packed_type(uint64_t __types, size_t __id) { + _LIBCPP_ASSERT(__id <= __packed_types_max, ""); + + if (__id > 0) + __types >>= __id * __packed_arg_t_bits; + + return static_cast<__format::__arg_t>(__types & __packed_arg_t_mask); +} + +} // namespace __format + +// This function is not user obervable, so it can directly use the non-standard +// types of the "variant". See __arg_t for more details. +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT decltype(auto) +__visit_format_arg(_Visitor&& __vis, basic_format_arg<_Context> __arg) { + switch (__arg.__type_) { + case __format::__arg_t::__none: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__monostate_); + case __format::__arg_t::__boolean: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__boolean_); + case __format::__arg_t::__char_type: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__char_type_); + case __format::__arg_t::__int: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__int_); + case __format::__arg_t::__long_long: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__long_long_); + case __format::__arg_t::__i128: +# ifndef _LIBCPP_HAS_NO_INT128 + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__i128_); +# else + __libcpp_unreachable(); +# endif + case __format::__arg_t::__unsigned: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__unsigned_); + case __format::__arg_t::__unsigned_long_long: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__unsigned_long_long_); + case __format::__arg_t::__u128: +# ifndef _LIBCPP_HAS_NO_INT128 + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__u128_); +# else + __libcpp_unreachable(); +# endif + case __format::__arg_t::__float: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__float_); + case __format::__arg_t::__double: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__double_); + case __format::__arg_t::__long_double: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__long_double_); + case __format::__arg_t::__const_char_type_ptr: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__const_char_type_ptr_); + case __format::__arg_t::__string_view: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__string_view_); + case __format::__arg_t::__ptr: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), __arg.__value_.__ptr_); + case __format::__arg_t::__handle: + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), + typename basic_format_arg<_Context>::handle{__arg.__value_.__handle_}); + } + + __libcpp_unreachable(); +} + +/// Contains the values used in basic_format_arg. +/// +/// This is a separate type so it's possible to store the values and types in +/// separate arrays. +template +class __basic_format_arg_value { + using _CharT = typename _Context::char_type; + +public: + /// Contains the implementation for basic_format_arg::handle. + struct __handle { + template + _LIBCPP_HIDE_FROM_ABI explicit __handle(_Tp&& __v) noexcept + : __ptr_(_VSTD::addressof(__v)), + __format_([](basic_format_parse_context<_CharT>& __parse_ctx, _Context& __ctx, const void* __ptr) { + using _Dp = remove_cvref_t<_Tp>; + using _Formatter = typename _Context::template formatter_type<_Dp>; + constexpr bool __const_formattable = + requires { _Formatter().format(std::declval(), std::declval<_Context&>()); }; + using _Qp = conditional_t<__const_formattable, const _Dp, _Dp>; + + static_assert(__const_formattable || !is_const_v>, "Mandated by [format.arg]/18"); + + _Formatter __f; + __parse_ctx.advance_to(__f.parse(__parse_ctx)); + __ctx.advance_to(__f.format(*const_cast<_Qp*>(static_cast(__ptr)), __ctx)); + }) {} + + const void* __ptr_; + void (*__format_)(basic_format_parse_context<_CharT>&, _Context&, const void*); + }; + + union { + monostate __monostate_; + bool __boolean_; + _CharT __char_type_; + int __int_; + unsigned __unsigned_; + long long __long_long_; + unsigned long long __unsigned_long_long_; +# ifndef _LIBCPP_HAS_NO_INT128 + __int128_t __i128_; + __uint128_t __u128_; +# endif + float __float_; + double __double_; + long double __long_double_; + const _CharT* __const_char_type_ptr_; + basic_string_view<_CharT> __string_view_; + const void* __ptr_; + __handle __handle_; + }; + + // These constructors contain the exact storage type used. If adjustments are + // required, these will be done in __create_format_arg. + + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value() noexcept : __monostate_() {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(bool __value) noexcept : __boolean_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(_CharT __value) noexcept : __char_type_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(int __value) noexcept : __int_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(unsigned __value) noexcept : __unsigned_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(long long __value) noexcept : __long_long_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(unsigned long long __value) noexcept + : __unsigned_long_long_(__value) {} +# ifndef _LIBCPP_HAS_NO_INT128 + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(__int128_t __value) noexcept : __i128_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(__uint128_t __value) noexcept : __u128_(__value) {} +# endif + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(float __value) noexcept : __float_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(double __value) noexcept : __double_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(long double __value) noexcept : __long_double_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(const _CharT* __value) noexcept : __const_char_type_ptr_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(basic_string_view<_CharT> __value) noexcept + : __string_view_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(const void* __value) noexcept : __ptr_(__value) {} + _LIBCPP_HIDE_FROM_ABI __basic_format_arg_value(__handle __value) noexcept + // TODO FMT Investigate why it doesn't work without the forward. + : __handle_(std::forward<__handle>(__value)) {} +}; + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT basic_format_arg { +public: + class _LIBCPP_TEMPLATE_VIS handle; + + _LIBCPP_HIDE_FROM_ABI basic_format_arg() noexcept + : __type_{__format::__arg_t::__none} {} + + _LIBCPP_HIDE_FROM_ABI explicit operator bool() const noexcept { + return __type_ != __format::__arg_t::__none; + } + +private: + using char_type = typename _Context::char_type; + + // TODO FMT Implement constrain [format.arg]/4 + // Constraints: The template specialization + // typename Context::template formatter_type + // meets the Formatter requirements ([formatter.requirements]). The extent + // to which an implementation determines that the specialization meets the + // Formatter requirements is unspecified, except that as a minimum the + // expression + // typename Context::template formatter_type() + // .format(declval(), declval()) + // shall be well-formed when treated as an unevaluated operand. + +public: + __basic_format_arg_value<_Context> __value_; + __format::__arg_t __type_; + + _LIBCPP_HIDE_FROM_ABI explicit basic_format_arg(__format::__arg_t __type, + __basic_format_arg_value<_Context> __value) noexcept + : __value_(__value), __type_(__type) {} +}; + +template +class _LIBCPP_TEMPLATE_VIS basic_format_arg<_Context>::handle { +public: + _LIBCPP_HIDE_FROM_ABI + void format(basic_format_parse_context& __parse_ctx, _Context& __ctx) const { + __handle_.__format_(__parse_ctx, __ctx, __handle_.__ptr_); + } + + _LIBCPP_HIDE_FROM_ABI explicit handle(typename __basic_format_arg_value<_Context>::__handle& __handle) noexcept + : __handle_(__handle) {} + +private: + typename __basic_format_arg_value<_Context>::__handle& __handle_; +}; + +// This function is user facing, so it must wrap the non-standard types of +// the "variant" in a handle to stay conforming. See __arg_t for more details. +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT decltype(auto) +visit_format_arg(_Visitor&& __vis, basic_format_arg<_Context> __arg) { + switch (__arg.__type_) { +# ifndef _LIBCPP_HAS_NO_INT128 + case __format::__arg_t::__i128: { + typename __basic_format_arg_value<_Context>::__handle __h{__arg.__value_.__i128_}; + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), typename basic_format_arg<_Context>::handle{__h}); + } + + case __format::__arg_t::__u128: { + typename __basic_format_arg_value<_Context>::__handle __h{__arg.__value_.__u128_}; + return _VSTD::invoke(_VSTD::forward<_Visitor>(__vis), typename basic_format_arg<_Context>::handle{__h}); + } +# endif + default: + return _VSTD::__visit_format_arg(_VSTD::forward<_Visitor>(__vis), __arg); + } +} + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_ARG_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_arg_store.h b/app/src/main/cpp/libcxx/include/__format/format_arg_store.h new file mode 100644 index 0000000..6f4f4c3 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_arg_store.h @@ -0,0 +1,254 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_ARG_STORE_H +#define _LIBCPP___FORMAT_FORMAT_ARG_STORE_H + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#include <__concepts/arithmetic.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_arg.h> +#include <__utility/forward.h> +#include +#include +#include +#include + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __format { + +/// \returns The @c __arg_t based on the type of the formatting argument. +/// +/// \pre \c __formattable<_Tp, typename _Context::char_type> +template +consteval __arg_t __determine_arg_t(); + +// Boolean +template _Tp> +consteval __arg_t __determine_arg_t() { + return __arg_t::__boolean; +} + +// Char +template _Tp> +consteval __arg_t __determine_arg_t() { + return __arg_t::__char_type; +} +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template + requires(same_as && same_as<_CharT, char>) +consteval __arg_t __determine_arg_t() { + return __arg_t::__char_type; +} +# endif + +// Signed integers +template +consteval __arg_t __determine_arg_t() { + if constexpr (sizeof(_Tp) <= sizeof(int)) + return __arg_t::__int; + else if constexpr (sizeof(_Tp) <= sizeof(long long)) + return __arg_t::__long_long; +# ifndef _LIBCPP_HAS_NO_INT128 + else if constexpr (sizeof(_Tp) == sizeof(__int128_t)) + return __arg_t::__i128; +# endif + else + static_assert(sizeof(_Tp) == 0, "an unsupported signed integer was used"); +} + +// Unsigned integers +template +consteval __arg_t __determine_arg_t() { + if constexpr (sizeof(_Tp) <= sizeof(unsigned)) + return __arg_t::__unsigned; + else if constexpr (sizeof(_Tp) <= sizeof(unsigned long long)) + return __arg_t::__unsigned_long_long; +# ifndef _LIBCPP_HAS_NO_INT128 + else if constexpr (sizeof(_Tp) == sizeof(__uint128_t)) + return __arg_t::__u128; +# endif + else + static_assert(sizeof(_Tp) == 0, "an unsupported unsigned integer was used"); +} + +// Floating-point +template _Tp> +consteval __arg_t __determine_arg_t() { + return __arg_t::__float; +} +template _Tp> +consteval __arg_t __determine_arg_t() { + return __arg_t::__double; +} +template _Tp> +consteval __arg_t __determine_arg_t() { + return __arg_t::__long_double; +} + +// Char pointer +template + requires(same_as || same_as) +consteval __arg_t __determine_arg_t() { + return __arg_t::__const_char_type_ptr; +} + +// Char array +template + requires(is_array_v<_Tp> && same_as<_Tp, typename _Context::char_type[extent_v<_Tp>]>) +consteval __arg_t __determine_arg_t() { + return __arg_t::__string_view; +} + +// String view +template + requires(same_as && + same_as<_Tp, basic_string_view>) +consteval __arg_t __determine_arg_t() { + return __arg_t::__string_view; +} + +// String +template + requires( + same_as && + same_as<_Tp, basic_string>) +consteval __arg_t __determine_arg_t() { + return __arg_t::__string_view; +} + +// Pointers +template + requires(same_as<_Ptr, void*> || same_as<_Ptr, const void*> || same_as<_Ptr, nullptr_t>) +consteval __arg_t __determine_arg_t() { + return __arg_t::__ptr; +} + +// Handle +// +// Note this version can't be constrained avoiding ambiguous overloads. +// That means it can be instantiated by disabled formatters. To solve this, a +// constrained version for not formattable formatters is added. That overload +// is marked as deleted to fail creating a storage type for disabled formatters. +template +consteval __arg_t __determine_arg_t() { + return __arg_t::__handle; +} + +template + requires(!__formattable<_Tp, typename _Context::char_type>) +consteval __arg_t __determine_arg_t() = delete; + +template +_LIBCPP_HIDE_FROM_ABI basic_format_arg<_Context> __create_format_arg(_Tp&& __value) noexcept { + constexpr __arg_t __arg = __determine_arg_t<_Context, remove_cvref_t<_Tp>>(); + static_assert(__arg != __arg_t::__none); + + // Not all types can be used to directly initialize the + // __basic_format_arg_value. First handle all types needing adjustment, the + // final else requires no adjustment. + if constexpr (__arg == __arg_t::__char_type) + // On some platforms initializing a wchar_t from a char is a narrowing + // conversion. + return basic_format_arg<_Context>{__arg, static_cast(__value)}; + else if constexpr (__arg == __arg_t::__int) + return basic_format_arg<_Context>{__arg, static_cast(__value)}; + else if constexpr (__arg == __arg_t::__long_long) + return basic_format_arg<_Context>{__arg, static_cast(__value)}; + else if constexpr (__arg == __arg_t::__unsigned) + return basic_format_arg<_Context>{__arg, static_cast(__value)}; + else if constexpr (__arg == __arg_t::__unsigned_long_long) + return basic_format_arg<_Context>{__arg, static_cast(__value)}; + else if constexpr (__arg == __arg_t::__string_view) + // Using std::size on a character array will add the NUL-terminator to the size. + if constexpr (is_array_v>) + return basic_format_arg<_Context>{ + __arg, basic_string_view{__value, extent_v> - 1}}; + else + // When the _Traits or _Allocator are different an implicit conversion will + // fail. + return basic_format_arg<_Context>{ + __arg, basic_string_view{__value.data(), __value.size()}}; + else if constexpr (__arg == __arg_t::__ptr) + return basic_format_arg<_Context>{__arg, static_cast(__value)}; + else if constexpr (__arg == __arg_t::__handle) + return basic_format_arg<_Context>{ + __arg, typename __basic_format_arg_value<_Context>::__handle{_VSTD::forward<_Tp>(__value)}}; + else + return basic_format_arg<_Context>{__arg, __value}; +} + +template +_LIBCPP_HIDE_FROM_ABI void __create_packed_storage(uint64_t& __types, __basic_format_arg_value<_Context>* __values, + _Args&&... __args) noexcept { + int __shift = 0; + ( + [&] { + basic_format_arg<_Context> __arg = __format::__create_format_arg<_Context>(__args); + if (__shift != 0) + __types |= static_cast(__arg.__type_) << __shift; + else + // Assigns the initial value. + __types = static_cast(__arg.__type_); + __shift += __packed_arg_t_bits; + *__values++ = __arg.__value_; + }(), + ...); +} + +template +_LIBCPP_HIDE_FROM_ABI void __store_basic_format_arg(basic_format_arg<_Context>* __data, _Args&&... __args) noexcept { + ([&] { *__data++ = __format::__create_format_arg<_Context>(__args); }(), ...); +} + +template +struct __packed_format_arg_store { + __basic_format_arg_value<_Context> __values_[N]; + uint64_t __types_; +}; + +template +struct __unpacked_format_arg_store { + basic_format_arg<_Context> __args_[N]; +}; + +} // namespace __format + +template +struct _LIBCPP_TEMPLATE_VIS __format_arg_store { + _LIBCPP_HIDE_FROM_ABI + __format_arg_store(_Args&... __args) noexcept { + if constexpr (sizeof...(_Args) != 0) { + if constexpr (__format::__use_packed_format_arg_store(sizeof...(_Args))) + __format::__create_packed_storage(__storage.__types_, __storage.__values_, __args...); + else + __format::__store_basic_format_arg<_Context>(__storage.__args_, __args...); + } + } + + using _Storage = conditional_t<__format::__use_packed_format_arg_store(sizeof...(_Args)), + __format::__packed_format_arg_store<_Context, sizeof...(_Args)>, + __format::__unpacked_format_arg_store<_Context, sizeof...(_Args)>>; + + _Storage __storage; +}; + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_ARG_STORE_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_args.h b/app/src/main/cpp/libcxx/include/__format/format_args.h new file mode 100644 index 0000000..8b8fbde --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_args.h @@ -0,0 +1,80 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_ARGS_H +#define _LIBCPP___FORMAT_FORMAT_ARGS_H + +#include <__availability> +#include <__config> +#include <__format/format_arg.h> +#include <__format/format_arg_store.h> +#include <__format/format_fwd.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT basic_format_args { +public: + _LIBCPP_HIDE_FROM_ABI basic_format_args() noexcept = default; + + template + _LIBCPP_HIDE_FROM_ABI basic_format_args(const __format_arg_store<_Context, _Args...>& __store) noexcept + : __size_(sizeof...(_Args)) { + if constexpr (sizeof...(_Args) != 0) { + if constexpr (__format::__use_packed_format_arg_store(sizeof...(_Args))) { + __values_ = __store.__storage.__values_; + __types_ = __store.__storage.__types_; + } else + __args_ = __store.__storage.__args_; + } + } + + _LIBCPP_HIDE_FROM_ABI + basic_format_arg<_Context> get(size_t __id) const noexcept { + if (__id >= __size_) + return basic_format_arg<_Context>{}; + + if (__format::__use_packed_format_arg_store(__size_)) + return basic_format_arg<_Context>{__format::__get_packed_type(__types_, __id), __values_[__id]}; + + return __args_[__id]; + } + + _LIBCPP_HIDE_FROM_ABI size_t __size() const noexcept { return __size_; } + +private: + size_t __size_{0}; + // [format.args]/5 + // [Note 1: Implementations are encouraged to optimize the representation of + // basic_format_args for small number of formatting arguments by storing + // indices of type alternatives separately from values and packing the + // former. - end note] + union { + struct { + const __basic_format_arg_value<_Context>* __values_; + uint64_t __types_; + }; + const basic_format_arg<_Context>* __args_; + }; +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(basic_format_args); + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_ARGS_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_context.h b/app/src/main/cpp/libcxx/include/__format/format_context.h new file mode 100644 index 0000000..85e00eb --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_context.h @@ -0,0 +1,223 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_CONTEXT_H +#define _LIBCPP___FORMAT_FORMAT_CONTEXT_H + +#include <__availability> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/buffer.h> +#include <__format/format_arg.h> +#include <__format/format_arg_store.h> +#include <__format/format_args.h> +#include <__format/format_error.h> +#include <__format/format_fwd.h> +#include <__iterator/back_insert_iterator.h> +#include <__iterator/concepts.h> +#include <__memory/addressof.h> +#include <__utility/move.h> +#include <__variant/monostate.h> +#include + +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +#include +#include +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +requires output_iterator<_OutIt, const _CharT&> +class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT basic_format_context; + +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +/** + * Helper to create a basic_format_context. + * + * This is needed since the constructor is private. + */ +template +_LIBCPP_HIDE_FROM_ABI basic_format_context<_OutIt, _CharT> +__format_context_create( + _OutIt __out_it, + basic_format_args> __args, + optional<_VSTD::locale>&& __loc = nullopt) { + return _VSTD::basic_format_context(_VSTD::move(__out_it), __args, _VSTD::move(__loc)); +} +#else +template +_LIBCPP_HIDE_FROM_ABI basic_format_context<_OutIt, _CharT> +__format_context_create( + _OutIt __out_it, + basic_format_args> __args) { + return _VSTD::basic_format_context(_VSTD::move(__out_it), __args); +} +#endif + +using format_context = + basic_format_context>, + char>; +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +using wformat_context = basic_format_context< + back_insert_iterator<__format::__output_buffer>, wchar_t>; +#endif + +template +requires output_iterator<_OutIt, const _CharT&> +class + // clang-format off + _LIBCPP_TEMPLATE_VIS + _LIBCPP_AVAILABILITY_FORMAT + _LIBCPP_PREFERRED_NAME(format_context) + _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wformat_context)) + // clang-format on + basic_format_context { +public: + using iterator = _OutIt; + using char_type = _CharT; + template + using formatter_type = formatter<_Tp, _CharT>; + + _LIBCPP_HIDE_FROM_ABI basic_format_arg + arg(size_t __id) const noexcept { + return __args_.get(__id); + } +#ifndef _LIBCPP_HAS_NO_LOCALIZATION + _LIBCPP_HIDE_FROM_ABI _VSTD::locale locale() { + if (!__loc_) + __loc_ = _VSTD::locale{}; + return *__loc_; + } +#endif + _LIBCPP_HIDE_FROM_ABI iterator out() { return std::move(__out_it_); } + _LIBCPP_HIDE_FROM_ABI void advance_to(iterator __it) { __out_it_ = std::move(__it); } + +private: + iterator __out_it_; + basic_format_args __args_; +#ifndef _LIBCPP_HAS_NO_LOCALIZATION + + // The Standard doesn't specify how the locale is stored. + // [format.context]/6 + // std::locale locale(); + // Returns: The locale passed to the formatting function if the latter + // takes one, and std::locale() otherwise. + // This is done by storing the locale of the constructor in this optional. If + // locale() is called and the optional has no value the value will be created. + // This allows the implementation to lazily create the locale. + // TODO FMT Validate whether lazy creation is the best solution. + optional<_VSTD::locale> __loc_; + + template + friend _LIBCPP_HIDE_FROM_ABI basic_format_context<__OutIt, __CharT> + __format_context_create(__OutIt, basic_format_args>, + optional<_VSTD::locale>&&); + + // Note: the Standard doesn't specify the required constructors. + _LIBCPP_HIDE_FROM_ABI + explicit basic_format_context(_OutIt __out_it, + basic_format_args __args, + optional<_VSTD::locale>&& __loc) + : __out_it_(_VSTD::move(__out_it)), __args_(__args), + __loc_(_VSTD::move(__loc)) {} +#else + template + friend _LIBCPP_HIDE_FROM_ABI basic_format_context<__OutIt, __CharT> + __format_context_create(__OutIt, basic_format_args>); + + _LIBCPP_HIDE_FROM_ABI + explicit basic_format_context(_OutIt __out_it, + basic_format_args __args) + : __out_it_(_VSTD::move(__out_it)), __args_(__args) {} +#endif +}; + +// A specialization for __retarget_buffer +// +// See __retarget_buffer for the motivation for this specialization. +// +// This context holds a reference to the instance of the basic_format_context +// that is retargeted. It converts a formatting argument when it is requested +// during formatting. It is expected that the usage of the arguments is rare so +// the lookups are not expected to be used often. An alternative would be to +// convert all elements during construction. +// +// The elements of the retargets context are only used when an underlying +// formatter uses a locale specific formatting or an formatting argument is +// part for the format spec. For example +// format("{:256:{}}", input, 8); +// Here the width of an element in input is determined dynamically. +// Note when the top-level element has no width the retargeting is not needed. +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT + basic_format_context::__iterator, _CharT> { +public: + using iterator = typename __format::__retarget_buffer<_CharT>::__iterator; + using char_type = _CharT; + template + using formatter_type = formatter<_Tp, _CharT>; + + template + _LIBCPP_HIDE_FROM_ABI explicit basic_format_context(iterator __out_it, _Context& __ctx) + : __out_it_(std::move(__out_it)), +# ifndef _LIBCPP_HAS_NO_LOCALIZATION + __loc_([](void* __c) { return static_cast<_Context*>(__c)->locale(); }), +# endif + __ctx_(std::addressof(__ctx)), + __arg_([](void* __c, size_t __id) { + return std::visit_format_arg( + [&](auto __arg) -> basic_format_arg { + if constexpr (same_as) + return {}; + else if constexpr (same_as::handle>) + // At the moment it's not possible for formatting to use a re-targeted handle. + // TODO FMT add this when support is needed. + std::__throw_format_error("Re-targeting handle not supported"); + else + return basic_format_arg{ + __format::__determine_arg_t(), + __basic_format_arg_value(__arg)}; + }, + static_cast<_Context*>(__c)->arg(__id)); + }) { + } + + _LIBCPP_HIDE_FROM_ABI basic_format_arg arg(size_t __id) const noexcept { + return __arg_(__ctx_, __id); + } +# ifndef _LIBCPP_HAS_NO_LOCALIZATION + _LIBCPP_HIDE_FROM_ABI _VSTD::locale locale() { return __loc_(__ctx_); } +# endif + _LIBCPP_HIDE_FROM_ABI iterator out() { return std::move(__out_it_); } + _LIBCPP_HIDE_FROM_ABI void advance_to(iterator __it) { __out_it_ = std::move(__it); } + +private: + iterator __out_it_; + +# ifndef _LIBCPP_HAS_NO_LOCALIZATION + std::locale (*__loc_)(void* __ctx); +# endif + + void* __ctx_; + basic_format_arg (*__arg_)(void* __ctx, size_t __id); +}; + +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(basic_format_context); +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_CONTEXT_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_error.h b/app/src/main/cpp/libcxx/include/__format/format_error.h new file mode 100644 index 0000000..002d1a4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_error.h @@ -0,0 +1,55 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_ERROR_H +#define _LIBCPP___FORMAT_FORMAT_ERROR_H + +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +class _LIBCPP_EXCEPTION_ABI format_error : public runtime_error { +public: + _LIBCPP_HIDE_FROM_ABI explicit format_error(const string& __s) + : runtime_error(__s) {} + _LIBCPP_HIDE_FROM_ABI explicit format_error(const char* __s) + : runtime_error(__s) {} + // TODO FMT Remove when format is no longer experimental. + // Avoids linker errors when building the Clang-cl Windows DLL which doesn't + // support the experimental library. +# ifndef _LIBCPP_INLINE_FORMAT_ERROR_DTOR + ~format_error() noexcept override; +# else + ~format_error() noexcept override {} +# endif +}; + +_LIBCPP_NORETURN inline _LIBCPP_HIDE_FROM_ABI void +__throw_format_error(const char* __s) { +#ifndef _LIBCPP_NO_EXCEPTIONS + throw format_error(__s); +#else + (void)__s; + _VSTD::abort(); +#endif +} + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_ERROR_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_functions.h b/app/src/main/cpp/libcxx/include/__format/format_functions.h new file mode 100644 index 0000000..185148c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_functions.h @@ -0,0 +1,661 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_FUNCTIONS +#define _LIBCPP___FORMAT_FORMAT_FUNCTIONS + +// TODO FMT This is added to fix Apple back-deployment. +#include +#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) + +#include <__algorithm/clamp.h> +#include <__availability> +#include <__concepts/convertible_to.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__debug> +#include <__format/buffer.h> +#include <__format/format_arg.h> +#include <__format/format_arg_store.h> +#include <__format/format_args.h> +#include <__format/format_context.h> +#include <__format/format_error.h> +#include <__format/format_parse_context.h> +#include <__format/format_string.h> +#include <__format/format_to_n_result.h> +#include <__format/formatter.h> +#include <__format/formatter_bool.h> +#include <__format/formatter_char.h> +#include <__format/formatter_floating_point.h> +#include <__format/formatter_integer.h> +#include <__format/formatter_pointer.h> +#include <__format/formatter_string.h> +#include <__format/parser_std_format_spec.h> +#include <__iterator/back_insert_iterator.h> +#include <__iterator/incrementable_traits.h> +#include <__variant/monostate.h> +#include +#include +#include + +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +#include +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// TODO FMT Evaluate which templates should be external templates. This +// improves the efficiency of the header. However since the header is still +// under heavy development and not all classes are stable it makes no sense +// to do this optimization now. + +using format_args = basic_format_args; +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +using wformat_args = basic_format_args; +#endif + +template +_LIBCPP_HIDE_FROM_ABI __format_arg_store<_Context, _Args...> make_format_args(_Args&&... __args) { + return _VSTD::__format_arg_store<_Context, _Args...>(__args...); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template +_LIBCPP_HIDE_FROM_ABI __format_arg_store make_wformat_args(_Args&&... __args) { + return _VSTD::__format_arg_store(__args...); +} +#endif + +namespace __format { + +/// Helper class parse and handle argument. +/// +/// When parsing a handle which is not enabled the code is ill-formed. +/// This helper uses the parser of the appropriate formatter for the stored type. +template +class _LIBCPP_TEMPLATE_VIS __compile_time_handle { +public: + _LIBCPP_HIDE_FROM_ABI + constexpr void __parse(basic_format_parse_context<_CharT>& __parse_ctx) const { __parse_(__parse_ctx); } + + template + _LIBCPP_HIDE_FROM_ABI constexpr void __enable() { + __parse_ = [](basic_format_parse_context<_CharT>& __parse_ctx) { + formatter<_Tp, _CharT> __f; + __parse_ctx.advance_to(__f.parse(__parse_ctx)); + }; + } + + // Before calling __parse the proper handler needs to be set with __enable. + // The default handler isn't a core constant expression. + _LIBCPP_HIDE_FROM_ABI constexpr __compile_time_handle() + : __parse_([](basic_format_parse_context<_CharT>&) { std::__throw_format_error("Not a handle"); }) {} + +private: + void (*__parse_)(basic_format_parse_context<_CharT>&); +}; + +// Dummy format_context only providing the parts used during constant +// validation of the basic_format_string. +template +struct _LIBCPP_TEMPLATE_VIS __compile_time_basic_format_context { +public: + using char_type = _CharT; + + _LIBCPP_HIDE_FROM_ABI constexpr explicit __compile_time_basic_format_context( + const __arg_t* __args, const __compile_time_handle<_CharT>* __handles, size_t __size) + : __args_(__args), __handles_(__handles), __size_(__size) {} + + // During the compile-time validation nothing needs to be written. + // Therefore all operations of this iterator are a NOP. + struct iterator { + _LIBCPP_HIDE_FROM_ABI constexpr iterator& operator=(_CharT) { return *this; } + _LIBCPP_HIDE_FROM_ABI constexpr iterator& operator*() { return *this; } + _LIBCPP_HIDE_FROM_ABI constexpr iterator operator++(int) { return *this; } + }; + + _LIBCPP_HIDE_FROM_ABI constexpr __arg_t arg(size_t __id) const { + if (__id >= __size_) + std::__throw_format_error("Argument index out of bounds"); + return __args_[__id]; + } + + _LIBCPP_HIDE_FROM_ABI constexpr const __compile_time_handle<_CharT>& __handle(size_t __id) const { + if (__id >= __size_) + std::__throw_format_error("Argument index out of bounds"); + return __handles_[__id]; + } + + _LIBCPP_HIDE_FROM_ABI constexpr iterator out() { return {}; } + _LIBCPP_HIDE_FROM_ABI constexpr void advance_to(iterator) {} + +private: + const __arg_t* __args_; + const __compile_time_handle<_CharT>* __handles_; + size_t __size_; +}; + +_LIBCPP_HIDE_FROM_ABI +constexpr void __compile_time_validate_integral(__arg_t __type) { + switch (__type) { + case __arg_t::__int: + case __arg_t::__long_long: + case __arg_t::__i128: + case __arg_t::__unsigned: + case __arg_t::__unsigned_long_long: + case __arg_t::__u128: + return; + + default: + std::__throw_format_error("Argument isn't an integral type"); + } +} + +// _HasPrecision does the formatter have a precision? +template +_LIBCPP_HIDE_FROM_ABI constexpr void +__compile_time_validate_argument(basic_format_parse_context<_CharT>& __parse_ctx, + __compile_time_basic_format_context<_CharT>& __ctx) { + formatter<_Tp, _CharT> __formatter; + __parse_ctx.advance_to(__formatter.parse(__parse_ctx)); + // [format.string.std]/7 + // ... If the corresponding formatting argument is not of integral type, or + // its value is negative for precision or non-positive for width, an + // exception of type format_error is thrown. + // + // Validate whether the arguments are integrals. + if (__formatter.__parser_.__width_as_arg_) + __format::__compile_time_validate_integral(__ctx.arg(__formatter.__parser_.__width_)); + + if constexpr (_HasPrecision) + if (__formatter.__parser_.__precision_as_arg_) + __format::__compile_time_validate_integral(__ctx.arg(__formatter.__parser_.__precision_)); +} + +// This function is not user facing, so it can directly use the non-standard types of the "variant". +template +_LIBCPP_HIDE_FROM_ABI constexpr void __compile_time_visit_format_arg(basic_format_parse_context<_CharT>& __parse_ctx, + __compile_time_basic_format_context<_CharT>& __ctx, + __arg_t __type) { + switch (__type) { + case __arg_t::__none: + std::__throw_format_error("Invalid argument"); + case __arg_t::__boolean: + return __format::__compile_time_validate_argument<_CharT, bool>(__parse_ctx, __ctx); + case __arg_t::__char_type: + return __format::__compile_time_validate_argument<_CharT, _CharT>(__parse_ctx, __ctx); + case __arg_t::__int: + return __format::__compile_time_validate_argument<_CharT, int>(__parse_ctx, __ctx); + case __arg_t::__long_long: + return __format::__compile_time_validate_argument<_CharT, long long>(__parse_ctx, __ctx); + case __arg_t::__i128: +# ifndef _LIBCPP_HAS_NO_INT128 + return __format::__compile_time_validate_argument<_CharT, __int128_t>(__parse_ctx, __ctx); +# else + std::__throw_format_error("Invalid argument"); +# endif + return; + case __arg_t::__unsigned: + return __format::__compile_time_validate_argument<_CharT, unsigned>(__parse_ctx, __ctx); + case __arg_t::__unsigned_long_long: + return __format::__compile_time_validate_argument<_CharT, unsigned long long>(__parse_ctx, __ctx); + case __arg_t::__u128: +# ifndef _LIBCPP_HAS_NO_INT128 + return __format::__compile_time_validate_argument<_CharT, __uint128_t>(__parse_ctx, __ctx); +# else + std::__throw_format_error("Invalid argument"); +# endif + return; + case __arg_t::__float: + return __format::__compile_time_validate_argument<_CharT, float, true>(__parse_ctx, __ctx); + case __arg_t::__double: + return __format::__compile_time_validate_argument<_CharT, double, true>(__parse_ctx, __ctx); + case __arg_t::__long_double: + return __format::__compile_time_validate_argument<_CharT, long double, true>(__parse_ctx, __ctx); + case __arg_t::__const_char_type_ptr: + return __format::__compile_time_validate_argument<_CharT, const _CharT*, true>(__parse_ctx, __ctx); + case __arg_t::__string_view: + return __format::__compile_time_validate_argument<_CharT, basic_string_view<_CharT>, true>(__parse_ctx, __ctx); + case __arg_t::__ptr: + return __format::__compile_time_validate_argument<_CharT, const void*>(__parse_ctx, __ctx); + case __arg_t::__handle: + std::__throw_format_error("Handle should use __compile_time_validate_handle_argument"); + } + std::__throw_format_error("Invalid argument"); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr const _CharT* +__handle_replacement_field(const _CharT* __begin, const _CharT* __end, + _ParseCtx& __parse_ctx, _Ctx& __ctx) { + __format::__parse_number_result __r = __format::__parse_arg_id(__begin, __end, __parse_ctx); + + bool __parse = *__r.__ptr == _CharT(':'); + switch (*__r.__ptr) { + case _CharT(':'): + // The arg-id has a format-specifier, advance the input to the format-spec. + __parse_ctx.advance_to(__r.__ptr + 1); + break; + case _CharT('}'): + // The arg-id has no format-specifier. + __parse_ctx.advance_to(__r.__ptr); + break; + default: + std::__throw_format_error("The replacement field arg-id should terminate at a ':' or '}'"); + } + + if constexpr (same_as<_Ctx, __compile_time_basic_format_context<_CharT>>) { + __arg_t __type = __ctx.arg(__r.__value); + if (__type == __arg_t::__handle) + __ctx.__handle(__r.__value).__parse(__parse_ctx); + else + __format::__compile_time_visit_format_arg(__parse_ctx, __ctx, __type); + } else + _VSTD::__visit_format_arg( + [&](auto __arg) { + if constexpr (same_as) + std::__throw_format_error("Argument index out of bounds"); + else if constexpr (same_as::handle>) + __arg.format(__parse_ctx, __ctx); + else { + formatter __formatter; + if (__parse) + __parse_ctx.advance_to(__formatter.parse(__parse_ctx)); + __ctx.advance_to(__formatter.format(__arg, __ctx)); + } + }, + __ctx.arg(__r.__value)); + + __begin = __parse_ctx.begin(); + if (__begin == __end || *__begin != _CharT('}')) + std::__throw_format_error("The replacement field misses a terminating '}'"); + + return ++__begin; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr typename _Ctx::iterator +__vformat_to(_ParseCtx&& __parse_ctx, _Ctx&& __ctx) { + using _CharT = typename _ParseCtx::char_type; + static_assert(same_as); + + const _CharT* __begin = __parse_ctx.begin(); + const _CharT* __end = __parse_ctx.end(); + typename _Ctx::iterator __out_it = __ctx.out(); + while (__begin != __end) { + switch (*__begin) { + case _CharT('{'): + ++__begin; + if (__begin == __end) + std::__throw_format_error("The format string terminates at a '{'"); + + if (*__begin != _CharT('{')) [[likely]] { + __ctx.advance_to(_VSTD::move(__out_it)); + __begin = + __format::__handle_replacement_field(__begin, __end, __parse_ctx, __ctx); + __out_it = __ctx.out(); + + // The output is written and __begin points to the next character. So + // start the next iteration. + continue; + } + // The string is an escape character. + break; + + case _CharT('}'): + ++__begin; + if (__begin == __end || *__begin != _CharT('}')) + std::__throw_format_error("The format string contains an invalid escape sequence"); + + break; + } + + // Copy the character to the output verbatim. + *__out_it++ = *__begin++; + } + return __out_it; +} + +} // namespace __format + +template +struct _LIBCPP_TEMPLATE_VIS basic_format_string { + template + requires convertible_to> + consteval basic_format_string(const _Tp& __str) : __str_{__str} { + __format::__vformat_to(basic_format_parse_context<_CharT>{__str_, sizeof...(_Args)}, + _Context{__types_.data(), __handles_.data(), sizeof...(_Args)}); + } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT constexpr basic_string_view<_CharT> get() const noexcept { + return __str_; + } + +private: + basic_string_view<_CharT> __str_; + + using _Context = __format::__compile_time_basic_format_context<_CharT>; + + static constexpr array<__format::__arg_t, sizeof...(_Args)> __types_{ + __format::__determine_arg_t<_Context, remove_cvref_t<_Args>>()...}; + + // TODO FMT remove this work-around when the AIX ICE has been resolved. +# if defined(_AIX) && defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER < 1400 + template + static constexpr __format::__compile_time_handle<_CharT> __get_handle() { + __format::__compile_time_handle<_CharT> __handle; + if (__format::__determine_arg_t<_Context, _Tp>() == __format::__arg_t::__handle) + __handle.template __enable<_Tp>(); + + return __handle; + } + + static constexpr array<__format::__compile_time_handle<_CharT>, sizeof...(_Args)> __handles_{ + __get_handle<_Args>()...}; +# else + static constexpr array<__format::__compile_time_handle<_CharT>, sizeof...(_Args)> __handles_{[] { + using _Tp = remove_cvref_t<_Args>; + __format::__compile_time_handle<_CharT> __handle; + if (__format::__determine_arg_t<_Context, _Tp>() == __format::__arg_t::__handle) + __handle.template __enable<_Tp>(); + + return __handle; + }()...}; +# endif +}; + +template +using format_string = basic_format_string...>; + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template +using wformat_string = basic_format_string...>; +#endif + +template +requires(output_iterator<_OutIt, const _CharT&>) _LIBCPP_HIDE_FROM_ABI _OutIt + __vformat_to( + _OutIt __out_it, basic_string_view<_CharT> __fmt, + basic_format_args> __args) { + if constexpr (same_as<_OutIt, _FormatOutIt>) + return _VSTD::__format::__vformat_to(basic_format_parse_context{__fmt, __args.__size()}, + _VSTD::__format_context_create(_VSTD::move(__out_it), __args)); + else { + __format::__format_buffer<_OutIt, _CharT> __buffer{_VSTD::move(__out_it)}; + _VSTD::__format::__vformat_to(basic_format_parse_context{__fmt, __args.__size()}, + _VSTD::__format_context_create(__buffer.__make_output_iterator(), __args)); + return _VSTD::move(__buffer).__out_it(); + } +} + +// The function is _LIBCPP_ALWAYS_INLINE since the compiler is bad at inlining +// https://reviews.llvm.org/D110499#inline-1180704 +// TODO FMT Evaluate whether we want to file a Clang bug report regarding this. +template _OutIt> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +vformat_to(_OutIt __out_it, string_view __fmt, format_args __args) { + return _VSTD::__vformat_to(_VSTD::move(__out_it), __fmt, __args); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template _OutIt> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +vformat_to(_OutIt __out_it, wstring_view __fmt, wformat_args __args) { + return _VSTD::__vformat_to(_VSTD::move(__out_it), __fmt, __args); +} +#endif + +template _OutIt, class... _Args> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +format_to(_OutIt __out_it, format_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::vformat_to(_VSTD::move(__out_it), __fmt.get(), + _VSTD::make_format_args(__args...)); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template _OutIt, class... _Args> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +format_to(_OutIt __out_it, wformat_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::vformat_to(_VSTD::move(__out_it), __fmt.get(), + _VSTD::make_wformat_args(__args...)); +} +#endif + +_LIBCPP_ALWAYS_INLINE inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string +vformat(string_view __fmt, format_args __args) { + string __res; + _VSTD::vformat_to(_VSTD::back_inserter(__res), __fmt, __args); + return __res; +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +_LIBCPP_ALWAYS_INLINE inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring +vformat(wstring_view __fmt, wformat_args __args) { + wstring __res; + _VSTD::vformat_to(_VSTD::back_inserter(__res), __fmt, __args); + return __res; +} +#endif + +template +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string format(format_string<_Args...> __fmt, + _Args&&... __args) { + return _VSTD::vformat(__fmt.get(), _VSTD::make_format_args(__args...)); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring +format(wformat_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::vformat(__fmt.get(), _VSTD::make_wformat_args(__args...)); +} +#endif + +template +_LIBCPP_HIDE_FROM_ABI format_to_n_result<_OutIt> __vformat_to_n(_OutIt __out_it, iter_difference_t<_OutIt> __n, + basic_string_view<_CharT> __fmt, + basic_format_args<_Context> __args) { + __format::__format_to_n_buffer<_OutIt, _CharT> __buffer{_VSTD::move(__out_it), __n}; + _VSTD::__format::__vformat_to(basic_format_parse_context{__fmt, __args.__size()}, + _VSTD::__format_context_create(__buffer.__make_output_iterator(), __args)); + return _VSTD::move(__buffer).__result(); +} + +template _OutIt, class... _Args> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT format_to_n_result<_OutIt> +format_to_n(_OutIt __out_it, iter_difference_t<_OutIt> __n, format_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::__vformat_to_n(_VSTD::move(__out_it), __n, __fmt.get(), _VSTD::make_format_args(__args...)); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template _OutIt, class... _Args> +_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT format_to_n_result<_OutIt> +format_to_n(_OutIt __out_it, iter_difference_t<_OutIt> __n, wformat_string<_Args...> __fmt, + _Args&&... __args) { + return _VSTD::__vformat_to_n(_VSTD::move(__out_it), __n, __fmt.get(), _VSTD::make_wformat_args(__args...)); +} +#endif + +template +_LIBCPP_HIDE_FROM_ABI size_t __vformatted_size(basic_string_view<_CharT> __fmt, auto __args) { + __format::__formatted_size_buffer<_CharT> __buffer; + _VSTD::__format::__vformat_to(basic_format_parse_context{__fmt, __args.__size()}, + _VSTD::__format_context_create(__buffer.__make_output_iterator(), __args)); + return _VSTD::move(__buffer).__result(); +} + +template +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT size_t +formatted_size(format_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::__vformatted_size(__fmt.get(), basic_format_args{_VSTD::make_format_args(__args...)}); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT size_t +formatted_size(wformat_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::__vformatted_size(__fmt.get(), basic_format_args{_VSTD::make_wformat_args(__args...)}); +} +#endif + +#ifndef _LIBCPP_HAS_NO_LOCALIZATION + +template +requires(output_iterator<_OutIt, const _CharT&>) _LIBCPP_HIDE_FROM_ABI _OutIt + __vformat_to( + _OutIt __out_it, locale __loc, basic_string_view<_CharT> __fmt, + basic_format_args> __args) { + if constexpr (same_as<_OutIt, _FormatOutIt>) + return _VSTD::__format::__vformat_to( + basic_format_parse_context{__fmt, __args.__size()}, + _VSTD::__format_context_create(_VSTD::move(__out_it), __args, _VSTD::move(__loc))); + else { + __format::__format_buffer<_OutIt, _CharT> __buffer{_VSTD::move(__out_it)}; + _VSTD::__format::__vformat_to( + basic_format_parse_context{__fmt, __args.__size()}, + _VSTD::__format_context_create(__buffer.__make_output_iterator(), __args, _VSTD::move(__loc))); + return _VSTD::move(__buffer).__out_it(); + } +} + +template _OutIt> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt vformat_to( + _OutIt __out_it, locale __loc, string_view __fmt, format_args __args) { + return _VSTD::__vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt, + __args); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template _OutIt> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt vformat_to( + _OutIt __out_it, locale __loc, wstring_view __fmt, wformat_args __args) { + return _VSTD::__vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt, + __args); +} +#endif + +template _OutIt, class... _Args> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +format_to(_OutIt __out_it, locale __loc, format_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt.get(), + _VSTD::make_format_args(__args...)); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template _OutIt, class... _Args> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +format_to(_OutIt __out_it, locale __loc, wformat_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt.get(), + _VSTD::make_wformat_args(__args...)); +} +#endif + +_LIBCPP_ALWAYS_INLINE inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string +vformat(locale __loc, string_view __fmt, format_args __args) { + string __res; + _VSTD::vformat_to(_VSTD::back_inserter(__res), _VSTD::move(__loc), __fmt, + __args); + return __res; +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +_LIBCPP_ALWAYS_INLINE inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring +vformat(locale __loc, wstring_view __fmt, wformat_args __args) { + wstring __res; + _VSTD::vformat_to(_VSTD::back_inserter(__res), _VSTD::move(__loc), __fmt, + __args); + return __res; +} +#endif + +template +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string format(locale __loc, + format_string<_Args...> __fmt, + _Args&&... __args) { + return _VSTD::vformat(_VSTD::move(__loc), __fmt.get(), + _VSTD::make_format_args(__args...)); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring +format(locale __loc, wformat_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::vformat(_VSTD::move(__loc), __fmt.get(), + _VSTD::make_wformat_args(__args...)); +} +#endif + +template +_LIBCPP_HIDE_FROM_ABI format_to_n_result<_OutIt> __vformat_to_n(_OutIt __out_it, iter_difference_t<_OutIt> __n, + locale __loc, basic_string_view<_CharT> __fmt, + basic_format_args<_Context> __args) { + __format::__format_to_n_buffer<_OutIt, _CharT> __buffer{_VSTD::move(__out_it), __n}; + _VSTD::__format::__vformat_to( + basic_format_parse_context{__fmt, __args.__size()}, + _VSTD::__format_context_create(__buffer.__make_output_iterator(), __args, _VSTD::move(__loc))); + return _VSTD::move(__buffer).__result(); +} + +template _OutIt, class... _Args> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT format_to_n_result<_OutIt> +format_to_n(_OutIt __out_it, iter_difference_t<_OutIt> __n, locale __loc, format_string<_Args...> __fmt, + _Args&&... __args) { + return _VSTD::__vformat_to_n(_VSTD::move(__out_it), __n, _VSTD::move(__loc), __fmt.get(), + _VSTD::make_format_args(__args...)); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template _OutIt, class... _Args> +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT format_to_n_result<_OutIt> +format_to_n(_OutIt __out_it, iter_difference_t<_OutIt> __n, locale __loc, wformat_string<_Args...> __fmt, + _Args&&... __args) { + return _VSTD::__vformat_to_n(_VSTD::move(__out_it), __n, _VSTD::move(__loc), __fmt.get(), + _VSTD::make_wformat_args(__args...)); +} +#endif + +template +_LIBCPP_HIDE_FROM_ABI size_t __vformatted_size(locale __loc, basic_string_view<_CharT> __fmt, auto __args) { + __format::__formatted_size_buffer<_CharT> __buffer; + _VSTD::__format::__vformat_to( + basic_format_parse_context{__fmt, __args.__size()}, + _VSTD::__format_context_create(__buffer.__make_output_iterator(), __args, _VSTD::move(__loc))); + return _VSTD::move(__buffer).__result(); +} + +template +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT size_t +formatted_size(locale __loc, format_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::__vformatted_size(_VSTD::move(__loc), __fmt.get(), basic_format_args{_VSTD::make_format_args(__args...)}); +} + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT size_t +formatted_size(locale __loc, wformat_string<_Args...> __fmt, _Args&&... __args) { + return _VSTD::__vformatted_size(_VSTD::move(__loc), __fmt.get(), basic_format_args{_VSTD::make_wformat_args(__args...)}); +} +#endif + +#endif // _LIBCPP_HAS_NO_LOCALIZATION + + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) + +#endif // _LIBCPP___FORMAT_FORMAT_FUNCTIONS diff --git a/app/src/main/cpp/libcxx/include/__format/format_fwd.h b/app/src/main/cpp/libcxx/include/__format/format_fwd.h new file mode 100644 index 0000000..f7c72e2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_fwd.h @@ -0,0 +1,39 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_FWD_H +#define _LIBCPP___FORMAT_FORMAT_FWD_H + +#include <__availability> +#include <__config> +#include <__iterator/concepts.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT basic_format_arg; + +template + requires output_iterator<_OutIt, const _CharT&> +class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT basic_format_context; + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter; + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_FWD_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_parse_context.h b/app/src/main/cpp/libcxx/include/__format/format_parse_context.h new file mode 100644 index 0000000..30e3a7d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_parse_context.h @@ -0,0 +1,100 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_PARSE_CONTEXT_H +#define _LIBCPP___FORMAT_FORMAT_PARSE_CONTEXT_H + +#include <__config> +#include <__format/format_error.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT basic_format_parse_context { +public: + using char_type = _CharT; + using const_iterator = typename basic_string_view<_CharT>::const_iterator; + using iterator = const_iterator; + + _LIBCPP_HIDE_FROM_ABI + constexpr explicit basic_format_parse_context(basic_string_view<_CharT> __fmt, + size_t __num_args = 0) noexcept + : __begin_(__fmt.begin()), + __end_(__fmt.end()), + __indexing_(__unknown), + __next_arg_id_(0), + __num_args_(__num_args) {} + + basic_format_parse_context(const basic_format_parse_context&) = delete; + basic_format_parse_context& + operator=(const basic_format_parse_context&) = delete; + + _LIBCPP_HIDE_FROM_ABI constexpr const_iterator begin() const noexcept { + return __begin_; + } + _LIBCPP_HIDE_FROM_ABI constexpr const_iterator end() const noexcept { + return __end_; + } + _LIBCPP_HIDE_FROM_ABI constexpr void advance_to(const_iterator __it) { + __begin_ = __it; + } + + _LIBCPP_HIDE_FROM_ABI constexpr size_t next_arg_id() { + if (__indexing_ == __manual) + std::__throw_format_error("Using automatic argument numbering in manual argument numbering mode"); + + if (__indexing_ == __unknown) + __indexing_ = __automatic; + return __next_arg_id_++; + } + _LIBCPP_HIDE_FROM_ABI constexpr void check_arg_id(size_t __id) { + if (__indexing_ == __automatic) + std::__throw_format_error("Using manual argument numbering in automatic argument numbering mode"); + + if (__indexing_ == __unknown) + __indexing_ = __manual; + + // Throws an exception to make the expression a non core constant + // expression as required by: + // [format.parse.ctx]/11 + // Remarks: Call expressions where id >= num_args_ are not core constant + // expressions ([expr.const]). + // Note: the Throws clause [format.parse.ctx]/10 doesn't specify the + // behavior when id >= num_args_. + if (is_constant_evaluated() && __id >= __num_args_) + std::__throw_format_error("Argument index outside the valid range"); + } + +private: + iterator __begin_; + iterator __end_; + enum _Indexing { __unknown, __manual, __automatic }; + _Indexing __indexing_; + size_t __next_arg_id_; + size_t __num_args_; +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(basic_format_parse_context); + +using format_parse_context = basic_format_parse_context; +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +using wformat_parse_context = basic_format_parse_context; +#endif + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_PARSE_CONTEXT_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_string.h b/app/src/main/cpp/libcxx/include/__format/format_string.h new file mode 100644 index 0000000..d9caf86 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_string.h @@ -0,0 +1,163 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_STRING_H +#define _LIBCPP___FORMAT_FORMAT_STRING_H + +#include <__assert> +#include <__config> +#include <__format/format_error.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __format { + +template +struct _LIBCPP_TEMPLATE_VIS __parse_number_result { + const _CharT* __ptr; + uint32_t __value; +}; + +template +__parse_number_result(const _CharT*, uint32_t) -> __parse_number_result<_CharT>; + +template +_LIBCPP_HIDE_FROM_ABI constexpr __parse_number_result<_CharT> +__parse_number(const _CharT* __begin, const _CharT* __end); + +/** + * The maximum value of a numeric argument. + * + * This is used for: + * * arg-id + * * width as value or arg-id. + * * precision as value or arg-id. + * + * The value is compatible with the maximum formatting width and precision + * using the `%*` syntax on a 32-bit system. + */ +inline constexpr uint32_t __number_max = INT32_MAX; + +namespace __detail { +template +_LIBCPP_HIDE_FROM_ABI constexpr __parse_number_result<_CharT> +__parse_zero(const _CharT* __begin, const _CharT*, auto& __parse_ctx) { + __parse_ctx.check_arg_id(0); + return {++__begin, 0}; // can never be larger than the maximum. +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr __parse_number_result<_CharT> +__parse_automatic(const _CharT* __begin, const _CharT*, auto& __parse_ctx) { + size_t __value = __parse_ctx.next_arg_id(); + _LIBCPP_ASSERT(__value <= __number_max, + "Compilers don't support this number of arguments"); + + return {__begin, uint32_t(__value)}; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr __parse_number_result<_CharT> +__parse_manual(const _CharT* __begin, const _CharT* __end, auto& __parse_ctx) { + __parse_number_result<_CharT> __r = __format::__parse_number(__begin, __end); + __parse_ctx.check_arg_id(__r.__value); + return __r; +} + +} // namespace __detail + +/** + * Parses a number. + * + * The number is used for the 31-bit values @em width and @em precision. This + * allows a maximum value of 2147483647. + */ +template +_LIBCPP_HIDE_FROM_ABI constexpr __parse_number_result<_CharT> +__parse_number(const _CharT* __begin, const _CharT* __end_input) { + static_assert(__format::__number_max == INT32_MAX, + "The algorithm is implemented based on this value."); + /* + * Limit the input to 9 digits, otherwise we need two checks during every + * iteration: + * - Are we at the end of the input? + * - Does the value exceed width of an uint32_t? (Switching to uint64_t would + * have the same issue, but with a higher maximum.) + */ + const _CharT* __end = __end_input - __begin > 9 ? __begin + 9 : __end_input; + uint32_t __value = *__begin - _CharT('0'); + while (++__begin != __end) { + if (*__begin < _CharT('0') || *__begin > _CharT('9')) + return {__begin, __value}; + + __value = __value * 10 + *__begin - _CharT('0'); + } + + if (__begin != __end_input && *__begin >= _CharT('0') && + *__begin <= _CharT('9')) { + + /* + * There are more than 9 digits, do additional validations: + * - Does the 10th digit exceed the maximum allowed value? + * - Are there more than 10 digits? + * (More than 10 digits always overflows the maximum.) + */ + uint64_t __v = uint64_t(__value) * 10 + *__begin++ - _CharT('0'); + if (__v > __number_max || + (__begin != __end_input && *__begin >= _CharT('0') && + *__begin <= _CharT('9'))) + std::__throw_format_error("The numeric value of the format-spec is too large"); + + __value = __v; + } + + return {__begin, __value}; +} + +/** + * Multiplexer for all parse functions. + * + * The parser will return a pointer beyond the last consumed character. This + * should be the closing '}' of the arg-id. + */ +template +_LIBCPP_HIDE_FROM_ABI constexpr __parse_number_result<_CharT> +__parse_arg_id(const _CharT* __begin, const _CharT* __end, auto& __parse_ctx) { + switch (*__begin) { + case _CharT('0'): + return __detail::__parse_zero(__begin, __end, __parse_ctx); + + case _CharT(':'): + // This case is conditionally valid. It's allowed in an arg-id in the + // replacement-field, but not in the std-format-spec. The caller can + // provide a better diagnostic, so accept it here unconditionally. + case _CharT('}'): + return __detail::__parse_automatic(__begin, __end, __parse_ctx); + } + if (*__begin < _CharT('0') || *__begin > _CharT('9')) + std::__throw_format_error("The arg-id of the format-spec starts with an invalid character"); + + return __detail::__parse_manual(__begin, __end, __parse_ctx); +} + +} // namespace __format + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_STRING_H diff --git a/app/src/main/cpp/libcxx/include/__format/format_to_n_result.h b/app/src/main/cpp/libcxx/include/__format/format_to_n_result.h new file mode 100644 index 0000000..f1ed9a0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/format_to_n_result.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMAT_TO_N_RESULT_H +#define _LIBCPP___FORMAT_FORMAT_TO_N_RESULT_H + +#include <__config> +#include <__iterator/incrementable_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +struct _LIBCPP_TEMPLATE_VIS format_to_n_result { + _OutIt out; + iter_difference_t<_OutIt> size; +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(format_to_n_result); + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMAT_TO_N_RESULT_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter.h b/app/src/main/cpp/libcxx/include/__format/formatter.h new file mode 100644 index 0000000..900a09a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter.h @@ -0,0 +1,54 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_H +#define _LIBCPP___FORMAT_FORMATTER_H + +#include <__availability> +#include <__config> +#include <__format/format_fwd.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +/// The default formatter template. +/// +/// [format.formatter.spec]/5 +/// If F is a disabled specialization of formatter, these values are false: +/// - is_default_constructible_v, +/// - is_copy_constructible_v, +/// - is_move_constructible_v, +/// - is_copy_assignable, and +/// - is_move_assignable. +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter { + formatter() = delete; + formatter(const formatter&) = delete; + formatter& operator=(const formatter&) = delete; +}; + +# if _LIBCPP_STD_VER > 20 + +template +_LIBCPP_HIDE_FROM_ABI constexpr void __set_debug_format(_Tp& __formatter) { + if constexpr (requires { __formatter.set_debug_format(); }) + __formatter.set_debug_format(); +} + +# endif // _LIBCPP_STD_VER > 20 +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMATTER_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_bool.h b/app/src/main/cpp/libcxx/include/__format/formatter_bool.h new file mode 100644 index 0000000..0d005a1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_bool.h @@ -0,0 +1,78 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_BOOL_H +#define _LIBCPP___FORMAT_FORMATTER_BOOL_H + +#include <__algorithm/copy.h> +#include <__availability> +#include <__config> +#include <__debug> +#include <__format/concepts.h> +#include <__format/format_error.h> +#include <__format/format_parse_context.h> +#include <__format/formatter.h> +#include <__format/formatter_integral.h> +#include <__format/parser_std_format_spec.h> +#include <__utility/unreachable.h> +#include + +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter { +public: + _LIBCPP_HIDE_FROM_ABI constexpr auto + parse(basic_format_parse_context<_CharT>& __parse_ctx) -> decltype(__parse_ctx.begin()) { + auto __result = __parser_.__parse(__parse_ctx, __format_spec::__fields_integral); + __format_spec::__process_parsed_bool(__parser_); + return __result; + } + + _LIBCPP_HIDE_FROM_ABI auto format(bool __value, auto& __ctx) const -> decltype(__ctx.out()) { + switch (__parser_.__type_) { + case __format_spec::__type::__default: + case __format_spec::__type::__string: + return __formatter::__format_bool(__value, __ctx, __parser_.__get_parsed_std_specifications(__ctx)); + + case __format_spec::__type::__binary_lower_case: + case __format_spec::__type::__binary_upper_case: + case __format_spec::__type::__octal: + case __format_spec::__type::__decimal: + case __format_spec::__type::__hexadecimal_lower_case: + case __format_spec::__type::__hexadecimal_upper_case: + // Promotes bool to an integral type. This reduces the number of + // instantiations of __format_integer reducing code size. + return __formatter::__format_integer( + static_cast(__value), __ctx, __parser_.__get_parsed_std_specifications(__ctx)); + + default: + _LIBCPP_ASSERT(false, "The parse function should have validated the type"); + __libcpp_unreachable(); + } + } + + __format_spec::__parser<_CharT> __parser_; +}; + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMATTER_BOOL_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_char.h b/app/src/main/cpp/libcxx/include/__format/formatter_char.h new file mode 100644 index 0000000..8a92e74 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_char.h @@ -0,0 +1,93 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_CHAR_H +#define _LIBCPP___FORMAT_FORMATTER_CHAR_H + +#include <__availability> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_parse_context.h> +#include <__format/formatter.h> +#include <__format/formatter_integral.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include <__type_traits/conditional.h> +#include <__type_traits/is_signed.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __formatter_char { +public: + _LIBCPP_HIDE_FROM_ABI constexpr auto + parse(basic_format_parse_context<_CharT>& __parse_ctx) -> decltype(__parse_ctx.begin()) { + auto __result = __parser_.__parse(__parse_ctx, __format_spec::__fields_integral); + __format_spec::__process_parsed_char(__parser_); + return __result; + } + + _LIBCPP_HIDE_FROM_ABI auto format(_CharT __value, auto& __ctx) const -> decltype(__ctx.out()) { + if (__parser_.__type_ == __format_spec::__type::__default || __parser_.__type_ == __format_spec::__type::__char) + return __formatter::__format_char(__value, __ctx.out(), __parser_.__get_parsed_std_specifications(__ctx)); + +# if _LIBCPP_STD_VER > 20 + if (__parser_.__type_ == __format_spec::__type::__debug) + return __formatter::__format_escaped_char(__value, __ctx.out(), __parser_.__get_parsed_std_specifications(__ctx)); +# endif + + if constexpr (sizeof(_CharT) <= sizeof(int)) + // Promotes _CharT to an integral type. This reduces the number of + // instantiations of __format_integer reducing code size. + return __formatter::__format_integer( + static_cast, int, unsigned>>(__value), + __ctx, + __parser_.__get_parsed_std_specifications(__ctx)); + else + return __formatter::__format_integer(__value, __ctx, __parser_.__get_parsed_std_specifications(__ctx)); + } + + _LIBCPP_HIDE_FROM_ABI auto format(char __value, auto& __ctx) const -> decltype(__ctx.out()) + requires(same_as<_CharT, wchar_t>) + { + return format(static_cast(__value), __ctx); + } + +# if _LIBCPP_STD_VER > 20 + _LIBCPP_HIDE_FROM_ABI constexpr void set_debug_format() { __parser_.__type_ = __format_spec::__type::__debug; } +# endif + + __format_spec::__parser<_CharT> __parser_; +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter : public __formatter_char {}; + +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template <> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter : public __formatter_char {}; + +template <> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter : public __formatter_char { +}; + +# endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMATTER_CHAR_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_floating_point.h b/app/src/main/cpp/libcxx/include/__format/formatter_floating_point.h new file mode 100644 index 0000000..a544b53 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_floating_point.h @@ -0,0 +1,757 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_FLOATING_POINT_H +#define _LIBCPP___FORMAT_FORMATTER_FLOATING_POINT_H + +#include <__algorithm/copy_n.h> +#include <__algorithm/find.h> +#include <__algorithm/max.h> +#include <__algorithm/min.h> +#include <__algorithm/rotate.h> +#include <__algorithm/transform.h> +#include <__concepts/arithmetic.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_parse_context.h> +#include <__format/formatter.h> +#include <__format/formatter_integral.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include <__memory/allocator.h> +#include <__utility/move.h> +#include <__utility/unreachable.h> +#include + +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __formatter { + +template +_LIBCPP_HIDE_FROM_ABI char* __to_buffer(char* __first, char* __last, _Tp __value) { + to_chars_result __r = _VSTD::to_chars(__first, __last, __value); + _LIBCPP_ASSERT(__r.ec == errc(0), "Internal buffer too small"); + return __r.ptr; +} + +template +_LIBCPP_HIDE_FROM_ABI char* __to_buffer(char* __first, char* __last, _Tp __value, chars_format __fmt) { + to_chars_result __r = _VSTD::to_chars(__first, __last, __value, __fmt); + _LIBCPP_ASSERT(__r.ec == errc(0), "Internal buffer too small"); + return __r.ptr; +} + +template +_LIBCPP_HIDE_FROM_ABI char* __to_buffer(char* __first, char* __last, _Tp __value, chars_format __fmt, int __precision) { + to_chars_result __r = _VSTD::to_chars(__first, __last, __value, __fmt, __precision); + _LIBCPP_ASSERT(__r.ec == errc(0), "Internal buffer too small"); + return __r.ptr; +} + +// https://en.cppreference.com/w/cpp/language/types#cite_note-1 +// float min subnormal: +/-0x1p-149 max: +/- 3.402,823,4 10^38 +// double min subnormal: +/-0x1p-1074 max +/- 1.797,693,134,862,315,7 10^308 +// long double (x86) min subnormal: +/-0x1p-16446 max: +/- 1.189,731,495,357,231,765,021 10^4932 +// +// The maximum number of digits required for the integral part is based on the +// maximum's value power of 10. Every power of 10 requires one additional +// decimal digit. +// The maximum number of digits required for the fractional part is based on +// the minimal subnormal hexadecimal output's power of 10. Every division of a +// fraction's binary 1 by 2, requires one additional decimal digit. +// +// The maximum size of a formatted value depends on the selected output format. +// Ignoring the fact the format string can request a precision larger than the +// values maximum required, these values are: +// +// sign 1 code unit +// __max_integral +// radix point 1 code unit +// __max_fractional +// exponent character 1 code unit +// sign 1 code unit +// __max_fractional_value +// ----------------------------------- +// total 4 code units extra required. +// +// TODO FMT Optimize the storage to avoid storing digits that are known to be zero. +// https://www.exploringbinary.com/maximum-number-of-decimal-digits-in-binary-floating-point-numbers/ + +// TODO FMT Add long double specialization when to_chars has proper long double support. +template +struct __traits; + +template +_LIBCPP_HIDE_FROM_ABI constexpr size_t __float_buffer_size(int __precision) { + using _Traits = __traits<_Fp>; + return 4 + _Traits::__max_integral + __precision + _Traits::__max_fractional_value; +} + +template <> +struct __traits { + static constexpr int __max_integral = 38; + static constexpr int __max_fractional = 149; + static constexpr int __max_fractional_value = 3; + static constexpr size_t __stack_buffer_size = 256; + + static constexpr int __hex_precision_digits = 3; +}; + +template <> +struct __traits { + static constexpr int __max_integral = 308; + static constexpr int __max_fractional = 1074; + static constexpr int __max_fractional_value = 4; + static constexpr size_t __stack_buffer_size = 1024; + + static constexpr int __hex_precision_digits = 4; +}; + +/// Helper class to store the conversion buffer. +/// +/// Depending on the maxium size required for a value, the buffer is allocated +/// on the stack or the heap. +template +class _LIBCPP_TEMPLATE_VIS __float_buffer { + using _Traits = __traits<_Fp>; + +public: + // TODO FMT Improve this constructor to do a better estimate. + // When using a scientific formatting with a precision of 6 a stack buffer + // will always suffice. At the moment that isn't important since floats and + // doubles use a stack buffer, unless the precision used in the format string + // is large. + // When supporting long doubles the __max_integral part becomes 4932 which + // may be too much for some platforms. For these cases a better estimate is + // required. + explicit _LIBCPP_HIDE_FROM_ABI __float_buffer(int __precision) + : __precision_(__precision != -1 ? __precision : _Traits::__max_fractional) { + + // When the precision is larger than _Traits::__max_fractional the digits in + // the range (_Traits::__max_fractional, precision] will contain the value + // zero. There's no need to request to_chars to write these zeros: + // - When the value is large a temporary heap buffer needs to be allocated. + // - When to_chars writes the values they need to be "copied" to the output: + // - char: std::fill on the output iterator is faster than std::copy. + // - wchar_t: same argument as char, but additional std::copy won't work. + // The input is always a char buffer, so every char in the buffer needs + // to be converted from a char to a wchar_t. + if (__precision_ > _Traits::__max_fractional) { + __num_trailing_zeros_ = __precision_ - _Traits::__max_fractional; + __precision_ = _Traits::__max_fractional; + } + + __size_ = __formatter::__float_buffer_size<_Fp>(__precision_); + if (__size_ > _Traits::__stack_buffer_size) + // The allocated buffer's contents don't need initialization. + __begin_ = allocator{}.allocate(__size_); + else + __begin_ = __buffer_; + } + + _LIBCPP_HIDE_FROM_ABI ~__float_buffer() { + if (__size_ > _Traits::__stack_buffer_size) + allocator{}.deallocate(__begin_, __size_); + } + _LIBCPP_HIDE_FROM_ABI __float_buffer(const __float_buffer&) = delete; + _LIBCPP_HIDE_FROM_ABI __float_buffer& operator=(const __float_buffer&) = delete; + + _LIBCPP_HIDE_FROM_ABI char* begin() const { return __begin_; } + _LIBCPP_HIDE_FROM_ABI char* end() const { return __begin_ + __size_; } + + _LIBCPP_HIDE_FROM_ABI int __precision() const { return __precision_; } + _LIBCPP_HIDE_FROM_ABI int __num_trailing_zeros() const { return __num_trailing_zeros_; } + _LIBCPP_HIDE_FROM_ABI void __remove_trailing_zeros() { __num_trailing_zeros_ = 0; } + _LIBCPP_HIDE_FROM_ABI void __add_trailing_zeros(int __zeros) { __num_trailing_zeros_ += __zeros; } + +private: + int __precision_; + int __num_trailing_zeros_{0}; + size_t __size_; + char* __begin_; + char __buffer_[_Traits::__stack_buffer_size]; +}; + +struct __float_result { + /// Points at the beginning of the integral part in the buffer. + /// + /// When there's no sign character this points at the start of the buffer. + char* __integral; + + /// Points at the radix point, when not present it's the same as \ref __last. + char* __radix_point; + + /// Points at the exponent character, when not present it's the same as \ref __last. + char* __exponent; + + /// Points beyond the last written element in the buffer. + char* __last; +}; + +/// Finds the position of the exponent character 'e' at the end of the buffer. +/// +/// Assuming there is an exponent the input will terminate with +/// eSdd and eSdddd (S = sign, d = digit) +/// +/// \returns a pointer to the exponent or __last when not found. +constexpr inline _LIBCPP_HIDE_FROM_ABI char* __find_exponent(char* __first, char* __last) { + ptrdiff_t __size = __last - __first; + if (__size >= 4) { + __first = __last - _VSTD::min(__size, ptrdiff_t(6)); + for (; __first != __last - 3; ++__first) { + if (*__first == 'e') + return __first; + } + } + return __last; +} + +template +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_default(const __float_buffer<_Fp>& __buffer, _Tp __value, + char* __integral) { + __float_result __result; + __result.__integral = __integral; + __result.__last = __formatter::__to_buffer(__integral, __buffer.end(), __value); + + __result.__exponent = __formatter::__find_exponent(__result.__integral, __result.__last); + + // Constrains: + // - There's at least one decimal digit before the radix point. + // - The radix point, when present, is placed before the exponent. + __result.__radix_point = _VSTD::find(__result.__integral + 1, __result.__exponent, '.'); + + // When the radix point isn't found its position is the exponent instead of + // __result.__last. + if (__result.__radix_point == __result.__exponent) + __result.__radix_point = __result.__last; + + // clang-format off + _LIBCPP_ASSERT((__result.__integral != __result.__last) && + (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && + (__result.__exponent == __result.__last || *__result.__exponent == 'e'), + "Post-condition failure."); + // clang-format on + + return __result; +} + +template +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_hexadecimal_lower_case(const __float_buffer<_Fp>& __buffer, + _Tp __value, int __precision, + char* __integral) { + __float_result __result; + __result.__integral = __integral; + if (__precision == -1) + __result.__last = __formatter::__to_buffer(__integral, __buffer.end(), __value, chars_format::hex); + else + __result.__last = __formatter::__to_buffer(__integral, __buffer.end(), __value, chars_format::hex, __precision); + + // H = one or more hex-digits + // S = sign + // D = one or more decimal-digits + // When the fractional part is zero and no precision the output is 0p+0 + // else the output is 0.HpSD + // So testing the second position can differentiate between these two cases. + char* __first = __integral + 1; + if (*__first == '.') { + __result.__radix_point = __first; + // One digit is the minimum + // 0.hpSd + // ^-- last + // ^---- integral = end of search + // ^-------- start of search + // 0123456 + // + // Four digits is the maximum + // 0.hpSdddd + // ^-- last + // ^---- integral = end of search + // ^-------- start of search + // 0123456789 + static_assert(__traits<_Fp>::__hex_precision_digits <= 4, "Guard against possible underflow."); + + char* __last = __result.__last - 2; + __first = __last - __traits<_Fp>::__hex_precision_digits; + __result.__exponent = _VSTD::find(__first, __last, 'p'); + } else { + __result.__radix_point = __result.__last; + __result.__exponent = __first; + } + + // clang-format off + _LIBCPP_ASSERT((__result.__integral != __result.__last) && + (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && + (__result.__exponent != __result.__last && *__result.__exponent == 'p'), + "Post-condition failure."); + // clang-format on + + return __result; +} + +template +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_hexadecimal_upper_case(const __float_buffer<_Fp>& __buffer, + _Tp __value, int __precision, + char* __integral) { + __float_result __result = + __formatter::__format_buffer_hexadecimal_lower_case(__buffer, __value, __precision, __integral); + _VSTD::transform(__result.__integral, __result.__exponent, __result.__integral, __hex_to_upper); + *__result.__exponent = 'P'; + return __result; +} + +template +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_scientific_lower_case(const __float_buffer<_Fp>& __buffer, + _Tp __value, int __precision, + char* __integral) { + __float_result __result; + __result.__integral = __integral; + __result.__last = + __formatter::__to_buffer(__integral, __buffer.end(), __value, chars_format::scientific, __precision); + + char* __first = __integral + 1; + _LIBCPP_ASSERT(__first != __result.__last, "No exponent present"); + if (*__first == '.') { + __result.__radix_point = __first; + __result.__exponent = __formatter::__find_exponent(__first + 1, __result.__last); + } else { + __result.__radix_point = __result.__last; + __result.__exponent = __first; + } + + // clang-format off + _LIBCPP_ASSERT((__result.__integral != __result.__last) && + (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && + (__result.__exponent != __result.__last && *__result.__exponent == 'e'), + "Post-condition failure."); + // clang-format on + return __result; +} + +template +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_scientific_upper_case(const __float_buffer<_Fp>& __buffer, + _Tp __value, int __precision, + char* __integral) { + __float_result __result = + __formatter::__format_buffer_scientific_lower_case(__buffer, __value, __precision, __integral); + *__result.__exponent = 'E'; + return __result; +} + +template +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_fixed(const __float_buffer<_Fp>& __buffer, _Tp __value, + int __precision, char* __integral) { + __float_result __result; + __result.__integral = __integral; + __result.__last = __formatter::__to_buffer(__integral, __buffer.end(), __value, chars_format::fixed, __precision); + + // When there's no precision there's no radix point. + // Else the radix point is placed at __precision + 1 from the end. + // By converting __precision to a bool the subtraction can be done + // unconditionally. + __result.__radix_point = __result.__last - (__precision + bool(__precision)); + __result.__exponent = __result.__last; + + // clang-format off + _LIBCPP_ASSERT((__result.__integral != __result.__last) && + (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && + (__result.__exponent == __result.__last), + "Post-condition failure."); + // clang-format on + return __result; +} + +template +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_general_lower_case(__float_buffer<_Fp>& __buffer, _Tp __value, + int __precision, char* __integral) { + + __buffer.__remove_trailing_zeros(); + + __float_result __result; + __result.__integral = __integral; + __result.__last = __formatter::__to_buffer(__integral, __buffer.end(), __value, chars_format::general, __precision); + + char* __first = __integral + 1; + if (__first == __result.__last) { + __result.__radix_point = __result.__last; + __result.__exponent = __result.__last; + } else { + __result.__exponent = __formatter::__find_exponent(__first, __result.__last); + if (__result.__exponent != __result.__last) + // In scientific mode if there's a radix point it will always be after + // the first digit. (This is the position __first points at). + __result.__radix_point = *__first == '.' ? __first : __result.__last; + else { + // In fixed mode the algorithm truncates trailing spaces and possibly the + // radix point. There's no good guess for the position of the radix point + // therefore scan the output after the first digit. + + __result.__radix_point = _VSTD::find(__first, __result.__last, '.'); + } + } + + // clang-format off + _LIBCPP_ASSERT((__result.__integral != __result.__last) && + (__result.__radix_point == __result.__last || *__result.__radix_point == '.') && + (__result.__exponent == __result.__last || *__result.__exponent == 'e'), + "Post-condition failure."); + // clang-format on + + return __result; +} + +template +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer_general_upper_case(__float_buffer<_Fp>& __buffer, _Tp __value, + int __precision, char* __integral) { + __float_result __result = __formatter::__format_buffer_general_lower_case(__buffer, __value, __precision, __integral); + if (__result.__exponent != __result.__last) + *__result.__exponent = 'E'; + return __result; +} + +/// Fills the buffer with the data based on the requested formatting. +/// +/// This function, when needed, turns the characters to upper case and +/// determines the "interesting" locations which are returned to the caller. +/// +/// This means the caller never has to convert the contents of the buffer to +/// upper case or search for radix points and the location of the exponent. +/// This gives a bit of overhead. The original code didn't do that, but due +/// to the number of possible additional work needed to turn this number to +/// the proper output the code was littered with tests for upper cases and +/// searches for radix points and exponents. +/// - When a precision larger than the type's precision is selected +/// additional zero characters need to be written before the exponent. +/// - alternate form needs to add a radix point when not present. +/// - localization needs to do grouping in the integral part. +template +// TODO FMT _Fp should just be _Tp when to_chars has proper long double support. +_LIBCPP_HIDE_FROM_ABI __float_result __format_buffer( + __float_buffer<_Fp>& __buffer, + _Tp __value, + bool __negative, + bool __has_precision, + __format_spec::__sign __sign, + __format_spec::__type __type) { + char* __first = __formatter::__insert_sign(__buffer.begin(), __negative, __sign); + switch (__type) { + case __format_spec::__type::__default: + if (__has_precision) + return __formatter::__format_buffer_general_lower_case(__buffer, __value, __buffer.__precision(), __first); + else + return __formatter::__format_buffer_default(__buffer, __value, __first); + + case __format_spec::__type::__hexfloat_lower_case: + return __formatter::__format_buffer_hexadecimal_lower_case( + __buffer, __value, __has_precision ? __buffer.__precision() : -1, __first); + + case __format_spec::__type::__hexfloat_upper_case: + return __formatter::__format_buffer_hexadecimal_upper_case( + __buffer, __value, __has_precision ? __buffer.__precision() : -1, __first); + + case __format_spec::__type::__scientific_lower_case: + return __formatter::__format_buffer_scientific_lower_case(__buffer, __value, __buffer.__precision(), __first); + + case __format_spec::__type::__scientific_upper_case: + return __formatter::__format_buffer_scientific_upper_case(__buffer, __value, __buffer.__precision(), __first); + + case __format_spec::__type::__fixed_lower_case: + case __format_spec::__type::__fixed_upper_case: + return __formatter::__format_buffer_fixed(__buffer, __value, __buffer.__precision(), __first); + + case __format_spec::__type::__general_lower_case: + return __formatter::__format_buffer_general_lower_case(__buffer, __value, __buffer.__precision(), __first); + + case __format_spec::__type::__general_upper_case: + return __formatter::__format_buffer_general_upper_case(__buffer, __value, __buffer.__precision(), __first); + + default: + _LIBCPP_ASSERT(false, "The parser should have validated the type"); + __libcpp_unreachable(); + } +} + +# ifndef _LIBCPP_HAS_NO_LOCALIZATION +template +_LIBCPP_HIDE_FROM_ABI _OutIt __format_locale_specific_form( + _OutIt __out_it, + const __float_buffer<_Fp>& __buffer, + const __float_result& __result, + _VSTD::locale __loc, + __format_spec::__parsed_specifications<_CharT> __specs) { + const auto& __np = std::use_facet>(__loc); + string __grouping = __np.grouping(); + char* __first = __result.__integral; + // When no radix point or exponent are present __last will be __result.__last. + char* __last = _VSTD::min(__result.__radix_point, __result.__exponent); + + ptrdiff_t __digits = __last - __first; + if (!__grouping.empty()) { + if (__digits <= __grouping[0]) + __grouping.clear(); + else + __grouping = __formatter::__determine_grouping(__digits, __grouping); + } + + ptrdiff_t __size = + __result.__last - __buffer.begin() + // Formatted string + __buffer.__num_trailing_zeros() + // Not yet rendered zeros + __grouping.size() - // Grouping contains one + !__grouping.empty(); // additional character + + __formatter::__padding_size_result __padding = {0, 0}; + bool __zero_padding = __specs.__alignment_ == __format_spec::__alignment::__zero_padding; + if (__size < __specs.__width_) { + if (__zero_padding) { + __specs.__alignment_ = __format_spec::__alignment::__right; + __specs.__fill_ = _CharT('0'); + } + + __padding = __formatter::__padding_size(__size, __specs.__width_, __specs.__alignment_); + } + + // sign and (zero padding or alignment) + if (__zero_padding && __first != __buffer.begin()) + *__out_it++ = *__buffer.begin(); + __out_it = __formatter::__fill(_VSTD::move(__out_it), __padding.__before_, __specs.__fill_); + if (!__zero_padding && __first != __buffer.begin()) + *__out_it++ = *__buffer.begin(); + + // integral part + if (__grouping.empty()) { + __out_it = __formatter::__copy(__first, __digits, _VSTD::move(__out_it)); + } else { + auto __r = __grouping.rbegin(); + auto __e = __grouping.rend() - 1; + _CharT __sep = __np.thousands_sep(); + // The output is divided in small groups of numbers to write: + // - A group before the first separator. + // - A separator and a group, repeated for the number of separators. + // - A group after the last separator. + // This loop achieves that process by testing the termination condition + // midway in the loop. + while (true) { + __out_it = __formatter::__copy(__first, *__r, _VSTD::move(__out_it)); + __first += *__r; + + if (__r == __e) + break; + + ++__r; + *__out_it++ = __sep; + } + } + + // fractional part + if (__result.__radix_point != __result.__last) { + *__out_it++ = __np.decimal_point(); + __out_it = __formatter::__copy(__result.__radix_point + 1, __result.__exponent, _VSTD::move(__out_it)); + __out_it = __formatter::__fill(_VSTD::move(__out_it), __buffer.__num_trailing_zeros(), _CharT('0')); + } + + // exponent + if (__result.__exponent != __result.__last) + __out_it = __formatter::__copy(__result.__exponent, __result.__last, _VSTD::move(__out_it)); + + // alignment + return __formatter::__fill(_VSTD::move(__out_it), __padding.__after_, __specs.__fill_); +} +# endif // _LIBCPP_HAS_NO_LOCALIZATION + +template +_LIBCPP_HIDE_FROM_ABI _OutIt __format_floating_point_non_finite( + _OutIt __out_it, __format_spec::__parsed_specifications<_CharT> __specs, bool __negative, bool __isnan) { + char __buffer[4]; + char* __last = __formatter::__insert_sign(__buffer, __negative, __specs.__std_.__sign_); + + // to_chars can return inf, infinity, nan, and nan(n-char-sequence). + // The format library requires inf and nan. + // All in one expression to avoid dangling references. + bool __upper_case = + __specs.__std_.__type_ == __format_spec::__type::__hexfloat_upper_case || + __specs.__std_.__type_ == __format_spec::__type::__scientific_upper_case || + __specs.__std_.__type_ == __format_spec::__type::__fixed_upper_case || + __specs.__std_.__type_ == __format_spec::__type::__general_upper_case; + __last = _VSTD::copy_n(&("infnanINFNAN"[6 * __upper_case + 3 * __isnan]), 3, __last); + + // [format.string.std]/13 + // A zero (0) character preceding the width field pads the field with + // leading zeros (following any indication of sign or base) to the field + // width, except when applied to an infinity or NaN. + if (__specs.__alignment_ == __format_spec::__alignment::__zero_padding) + __specs.__alignment_ = __format_spec::__alignment::__right; + + return __formatter::__write(__buffer, __last, _VSTD::move(__out_it), __specs); +} + +template +_LIBCPP_HIDE_FROM_ABI auto +__format_floating_point(_Tp __value, auto& __ctx, __format_spec::__parsed_specifications<_CharT> __specs) + -> decltype(__ctx.out()) { + bool __negative = _VSTD::signbit(__value); + + if (!_VSTD::isfinite(__value)) [[unlikely]] + return __formatter::__format_floating_point_non_finite(__ctx.out(), __specs, __negative, _VSTD::isnan(__value)); + + // Depending on the std-format-spec string the sign and the value + // might not be outputted together: + // - zero-padding may insert additional '0' characters. + // Therefore the value is processed as a non negative value. + // The function @ref __insert_sign will insert a '-' when the value was + // negative. + + if (__negative) + __value = -__value; + + // TODO FMT _Fp should just be _Tp when to_chars has proper long double support. + using _Fp = conditional_t, double, _Tp>; + // Force the type of the precision to avoid -1 to become an unsigned value. + __float_buffer<_Fp> __buffer(__specs.__precision_); + __float_result __result = __formatter::__format_buffer( + __buffer, __value, __negative, (__specs.__has_precision()), __specs.__std_.__sign_, __specs.__std_.__type_); + + if (__specs.__std_.__alternate_form_) { + if (__result.__radix_point == __result.__last) { + *__result.__last++ = '.'; + + // When there is an exponent the point needs to be moved before the + // exponent. When there's no exponent the rotate does nothing. Since + // rotate tests whether the operation is a nop, call it unconditionally. + _VSTD::rotate(__result.__exponent, __result.__last - 1, __result.__last); + __result.__radix_point = __result.__exponent; + + // The radix point is always placed before the exponent. + // - No exponent needs to point to the new last. + // - An exponent needs to move one position to the right. + // So it's safe to increment the value unconditionally. + ++__result.__exponent; + } + + // [format.string.std]/6 + // In addition, for g and G conversions, trailing zeros are not removed + // from the result. + // + // If the type option for a floating-point type is none it may use the + // general formatting, but it's not a g or G conversion. So in that case + // the formatting should not append trailing zeros. + bool __is_general = __specs.__std_.__type_ == __format_spec::__type::__general_lower_case || + __specs.__std_.__type_ == __format_spec::__type::__general_upper_case; + + if (__is_general) { + // https://en.cppreference.com/w/c/io/fprintf + // Let P equal the precision if nonzero, 6 if the precision is not + // specified, or 1 if the precision is 0. Then, if a conversion with + // style E would have an exponent of X: + int __p = _VSTD::max(1, (__specs.__has_precision() ? __specs.__precision_ : 6)); + if (__result.__exponent == __result.__last) + // if P > X >= -4, the conversion is with style f or F and precision P - 1 - X. + // By including the radix point it calculates P - (1 + X) + __p -= __result.__radix_point - __buffer.begin(); + else + // otherwise, the conversion is with style e or E and precision P - 1. + --__p; + + ptrdiff_t __precision = (__result.__exponent - __result.__radix_point) - 1; + if (__precision < __p) + __buffer.__add_trailing_zeros(__p - __precision); + } + } + +# ifndef _LIBCPP_HAS_NO_LOCALIZATION + if (__specs.__std_.__locale_specific_form_) + return __formatter::__format_locale_specific_form(__ctx.out(), __buffer, __result, __ctx.locale(), __specs); +# endif + + ptrdiff_t __size = __result.__last - __buffer.begin(); + int __num_trailing_zeros = __buffer.__num_trailing_zeros(); + if (__size + __num_trailing_zeros >= __specs.__width_) { + if (__num_trailing_zeros && __result.__exponent != __result.__last) + // Insert trailing zeros before exponent character. + return __formatter::__copy( + __result.__exponent, + __result.__last, + __formatter::__fill(__formatter::__copy(__buffer.begin(), __result.__exponent, __ctx.out()), + __num_trailing_zeros, + _CharT('0'))); + + return __formatter::__fill( + __formatter::__copy(__buffer.begin(), __result.__last, __ctx.out()), __num_trailing_zeros, _CharT('0')); + } + + auto __out_it = __ctx.out(); + char* __first = __buffer.begin(); + if (__specs.__alignment_ == __format_spec::__alignment ::__zero_padding) { + // When there is a sign output it before the padding. Note the __size + // doesn't need any adjustment, regardless whether the sign is written + // here or in __formatter::__write. + if (__first != __result.__integral) + *__out_it++ = *__first++; + // After the sign is written, zero padding is the same a right alignment + // with '0'. + __specs.__alignment_ = __format_spec::__alignment::__right; + __specs.__fill_ = _CharT('0'); + } + + if (__num_trailing_zeros) + return __formatter::__write_using_trailing_zeros( + __first, __result.__last, _VSTD::move(__out_it), __specs, __size, __result.__exponent, __num_trailing_zeros); + + return __formatter::__write(__first, __result.__last, _VSTD::move(__out_it), __specs, __size); +} + +} // namespace __formatter + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS __formatter_floating_point { +public: + _LIBCPP_HIDE_FROM_ABI constexpr auto + parse(basic_format_parse_context<_CharT>& __parse_ctx) -> decltype(__parse_ctx.begin()) { + auto __result = __parser_.__parse(__parse_ctx, __format_spec::__fields_floating_point); + __format_spec::__process_parsed_floating_point(__parser_); + return __result; + } + + template + _LIBCPP_HIDE_FROM_ABI auto format(_Tp __value, auto& __ctx) const -> decltype(__ctx.out()) { + return __formatter::__format_floating_point(__value, __ctx, __parser_.__get_parsed_std_specifications(__ctx)); + } + + __format_spec::__parser<_CharT> __parser_; +}; + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_floating_point<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_floating_point<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_floating_point<_CharT> {}; + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___FORMAT_FORMATTER_FLOATING_POINT_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_integer.h b/app/src/main/cpp/libcxx/include/__format/formatter_integer.h new file mode 100644 index 0000000..b4be9f9 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_integer.h @@ -0,0 +1,107 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_INTEGER_H +#define _LIBCPP___FORMAT_FORMATTER_INTEGER_H + +#include <__availability> +#include <__concepts/arithmetic.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_parse_context.h> +#include <__format/formatter.h> +#include <__format/formatter_integral.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include <__type_traits/make_32_64_or_128_bit.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + + _LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + + template <__fmt_char_type _CharT> + struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __formatter_integer { + +public: + _LIBCPP_HIDE_FROM_ABI constexpr auto + parse(basic_format_parse_context<_CharT>& __parse_ctx) -> decltype(__parse_ctx.begin()) { + auto __result = __parser_.__parse(__parse_ctx, __format_spec::__fields_integral); + __format_spec::__process_parsed_integer(__parser_); + return __result; + } + + template + _LIBCPP_HIDE_FROM_ABI auto format(_Tp __value, auto& __ctx) const -> decltype(__ctx.out()) { + __format_spec::__parsed_specifications<_CharT> __specs = __parser_.__get_parsed_std_specifications(__ctx); + + if (__specs.__std_.__type_ == __format_spec::__type::__char) + return __formatter::__format_char(__value, __ctx.out(), __specs); + + using _Type = __make_32_64_or_128_bit_t<_Tp>; + static_assert(!is_same<_Type, void>::value, "unsupported integral type used in __formatter_integer::__format"); + + // Reduce the number of instantiation of the integer formatter + return __formatter::__format_integer(static_cast<_Type>(__value), __ctx, __specs); + } + + __format_spec::__parser<_CharT> __parser_; +}; + +// Signed integral types. +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_integer<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter : public __formatter_integer<_CharT> { +}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter : public __formatter_integer<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter : public __formatter_integer<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_integer<_CharT> {}; +# ifndef _LIBCPP_HAS_NO_INT128 +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<__int128_t, _CharT> + : public __formatter_integer<_CharT> {}; +# endif + +// Unsigned integral types. +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_integer<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_integer<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_integer<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_integer<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_integer<_CharT> {}; +# ifndef _LIBCPP_HAS_NO_INT128 +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<__uint128_t, _CharT> + : public __formatter_integer<_CharT> {}; +# endif + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMATTER_INTEGER_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_integral.h b/app/src/main/cpp/libcxx/include/__format/formatter_integral.h new file mode 100644 index 0000000..fe3a063 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_integral.h @@ -0,0 +1,363 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_INTEGRAL_H +#define _LIBCPP___FORMAT_FORMATTER_INTEGRAL_H + +#include <__concepts/arithmetic.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_error.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include <__utility/unreachable.h> +#include +#include +#include +#include + +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __formatter { + +// +// Generic +// + +_LIBCPP_HIDE_FROM_ABI inline char* __insert_sign(char* __buf, bool __negative, __format_spec::__sign __sign) { + if (__negative) + *__buf++ = '-'; + else + switch (__sign) { + case __format_spec::__sign::__default: + case __format_spec::__sign::__minus: + // No sign added. + break; + case __format_spec::__sign::__plus: + *__buf++ = '+'; + break; + case __format_spec::__sign::__space: + *__buf++ = ' '; + break; + } + + return __buf; +} + +/** + * Determines the required grouping based on the size of the input. + * + * The grouping's last element will be repeated. For simplicity this repeating + * is unwrapped based on the length of the input. (When the input is short some + * groups are not processed.) + * + * @returns The size of the groups to write. This means the number of + * separator characters written is size() - 1. + * + * @note Since zero-sized groups cause issues they are silently ignored. + * + * @note The grouping field of the locale is always a @c std::string, + * regardless whether the @c std::numpunct's type is @c char or @c wchar_t. + */ +_LIBCPP_HIDE_FROM_ABI inline string __determine_grouping(ptrdiff_t __size, const string& __grouping) { + _LIBCPP_ASSERT(!__grouping.empty() && __size > __grouping[0], + "The slow grouping formatting is used while there will be no " + "separators written"); + string __r; + auto __end = __grouping.end() - 1; + auto __ptr = __grouping.begin(); + + while (true) { + __size -= *__ptr; + if (__size > 0) + __r.push_back(*__ptr); + else { + // __size <= 0 so the value pushed will be <= *__ptr. + __r.push_back(*__ptr + __size); + return __r; + } + + // Proceed to the next group. + if (__ptr != __end) { + do { + ++__ptr; + // Skip grouping with a width of 0. + } while (*__ptr == 0 && __ptr != __end); + } + } + + __libcpp_unreachable(); +} + +// +// Char +// + +template <__fmt_char_type _CharT> +_LIBCPP_HIDE_FROM_ABI auto __format_char( + integral auto __value, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_CharT> __specs) -> decltype(__out_it) { + using _Tp = decltype(__value); + if constexpr (!same_as<_CharT, _Tp>) { + // cmp_less and cmp_greater can't be used for character types. + if constexpr (signed_integral<_CharT> == signed_integral<_Tp>) { + if (__value < numeric_limits<_CharT>::min() || __value > numeric_limits<_CharT>::max()) + std::__throw_format_error("Integral value outside the range of the char type"); + } else if constexpr (signed_integral<_CharT>) { + // _CharT is signed _Tp is unsigned + if (__value > static_cast>(numeric_limits<_CharT>::max())) + std::__throw_format_error("Integral value outside the range of the char type"); + } else { + // _CharT is unsigned _Tp is signed + if (__value < 0 || static_cast>(__value) > numeric_limits<_CharT>::max()) + std::__throw_format_error("Integral value outside the range of the char type"); + } + } + + const auto __c = static_cast<_CharT>(__value); + return __formatter::__write(_VSTD::addressof(__c), _VSTD::addressof(__c) + 1, _VSTD::move(__out_it), __specs); +} + +// +// Integer +// + +/** Wrapper around @ref to_chars, returning the output pointer. */ +template +_LIBCPP_HIDE_FROM_ABI char* __to_buffer(char* __first, char* __last, _Tp __value, int __base) { + // TODO FMT Evaluate code overhead due to not calling the internal function + // directly. (Should be zero overhead.) + to_chars_result __r = _VSTD::to_chars(__first, __last, __value, __base); + _LIBCPP_ASSERT(__r.ec == errc(0), "Internal buffer too small"); + return __r.ptr; +} + +/** + * Helper to determine the buffer size to output a integer in Base @em x. + * + * There are several overloads for the supported bases. The function uses the + * base as template argument so it can be used in a constant expression. + */ +template +consteval size_t __buffer_size() noexcept + requires(_Base == 2) +{ + return numeric_limits<_Tp>::digits // The number of binary digits. + + 2 // Reserve space for the '0[Bb]' prefix. + + 1; // Reserve space for the sign. +} + +template +consteval size_t __buffer_size() noexcept + requires(_Base == 8) +{ + return numeric_limits<_Tp>::digits // The number of binary digits. + / 3 // Adjust to octal. + + 1 // Turn floor to ceil. + + 1 // Reserve space for the '0' prefix. + + 1; // Reserve space for the sign. +} + +template +consteval size_t __buffer_size() noexcept + requires(_Base == 10) +{ + return numeric_limits<_Tp>::digits10 // The floored value. + + 1 // Turn floor to ceil. + + 1; // Reserve space for the sign. +} + +template +consteval size_t __buffer_size() noexcept + requires(_Base == 16) +{ + return numeric_limits<_Tp>::digits // The number of binary digits. + / 4 // Adjust to hexadecimal. + + 2 // Reserve space for the '0[Xx]' prefix. + + 1; // Reserve space for the sign. +} + +template +_LIBCPP_HIDE_FROM_ABI auto __format_integer( + _Tp __value, + auto& __ctx, + __format_spec::__parsed_specifications<_CharT> __specs, + bool __negative, + char* __begin, + char* __end, + const char* __prefix, + int __base) -> decltype(__ctx.out()) { + char* __first = __formatter::__insert_sign(__begin, __negative, __specs.__std_.__sign_); + if (__specs.__std_.__alternate_form_ && __prefix) + while (*__prefix) + *__first++ = *__prefix++; + + char* __last = __formatter::__to_buffer(__first, __end, __value, __base); + +# ifndef _LIBCPP_HAS_NO_LOCALIZATION + if (__specs.__std_.__locale_specific_form_) { + const auto& __np = std::use_facet>(__ctx.locale()); + string __grouping = __np.grouping(); + ptrdiff_t __size = __last - __first; + // Writing the grouped form has more overhead than the normal output + // routines. If there will be no separators written the locale-specific + // form is identical to the normal routine. Test whether to grouped form + // is required. + if (!__grouping.empty() && __size > __grouping[0]) + return __formatter::__write_using_decimal_separators( + __ctx.out(), + __begin, + __first, + __last, + __formatter::__determine_grouping(__size, __grouping), + __np.thousands_sep(), + __specs); + } +# endif + auto __out_it = __ctx.out(); + if (__specs.__alignment_ != __format_spec::__alignment::__zero_padding) + __first = __begin; + else { + // __buf contains [sign][prefix]data + // ^ location of __first + // The zero padding is done like: + // - Write [sign][prefix] + // - Write data right aligned with '0' as fill character. + __out_it = __formatter::__copy(__begin, __first, _VSTD::move(__out_it)); + __specs.__alignment_ = __format_spec::__alignment::__right; + __specs.__fill_ = _CharT('0'); + int32_t __size = __first - __begin; + + __specs.__width_ -= _VSTD::min(__size, __specs.__width_); + } + + if (__specs.__std_.__type_ != __format_spec::__type::__hexadecimal_upper_case) [[likely]] + return __formatter::__write(__first, __last, __ctx.out(), __specs); + + return __formatter::__write_transformed(__first, __last, __ctx.out(), __specs, __formatter::__hex_to_upper); +} + +template +_LIBCPP_HIDE_FROM_ABI auto __format_integer( + _Tp __value, auto& __ctx, __format_spec::__parsed_specifications<_CharT> __specs, bool __negative = false) + -> decltype(__ctx.out()) { + switch (__specs.__std_.__type_) { + case __format_spec::__type::__binary_lower_case: { + array()> __array; + return __formatter::__format_integer(__value, __ctx, __specs, __negative, __array.begin(), __array.end(), "0b", 2); + } + case __format_spec::__type::__binary_upper_case: { + array()> __array; + return __formatter::__format_integer(__value, __ctx, __specs, __negative, __array.begin(), __array.end(), "0B", 2); + } + case __format_spec::__type::__octal: { + // Octal is special; if __value == 0 there's no prefix. + array()> __array; + return __formatter::__format_integer( + __value, __ctx, __specs, __negative, __array.begin(), __array.end(), __value != 0 ? "0" : nullptr, 8); + } + case __format_spec::__type::__default: + case __format_spec::__type::__decimal: { + array()> __array; + return __formatter::__format_integer( + __value, __ctx, __specs, __negative, __array.begin(), __array.end(), nullptr, 10); + } + case __format_spec::__type::__hexadecimal_lower_case: { + array()> __array; + return __formatter::__format_integer(__value, __ctx, __specs, __negative, __array.begin(), __array.end(), "0x", 16); + } + case __format_spec::__type::__hexadecimal_upper_case: { + array()> __array; + return __formatter::__format_integer(__value, __ctx, __specs, __negative, __array.begin(), __array.end(), "0X", 16); + } + default: + _LIBCPP_ASSERT(false, "The parse function should have validated the type"); + __libcpp_unreachable(); + } +} + +template +_LIBCPP_HIDE_FROM_ABI auto +__format_integer(_Tp __value, auto& __ctx, __format_spec::__parsed_specifications<_CharT> __specs) + -> decltype(__ctx.out()) { + // Depending on the std-format-spec string the sign and the value + // might not be outputted together: + // - alternate form may insert a prefix string. + // - zero-padding may insert additional '0' characters. + // Therefore the value is processed as a positive unsigned value. + // The function @ref __insert_sign will a '-' when the value was negative. + auto __r = std::__to_unsigned_like(__value); + bool __negative = __value < 0; + if (__negative) + __r = std::__complement(__r); + + return __formatter::__format_integer(__r, __ctx, __specs, __negative); +} + +// +// Formatter arithmetic (bool) +// + +template +struct _LIBCPP_TEMPLATE_VIS __bool_strings; + +template <> +struct _LIBCPP_TEMPLATE_VIS __bool_strings { + static constexpr string_view __true{"true"}; + static constexpr string_view __false{"false"}; +}; + +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template <> +struct _LIBCPP_TEMPLATE_VIS __bool_strings { + static constexpr wstring_view __true{L"true"}; + static constexpr wstring_view __false{L"false"}; +}; +# endif + +template +_LIBCPP_HIDE_FROM_ABI auto +__format_bool(bool __value, auto& __ctx, __format_spec::__parsed_specifications<_CharT> __specs) + -> decltype(__ctx.out()) { +# ifndef _LIBCPP_HAS_NO_LOCALIZATION + if (__specs.__std_.__locale_specific_form_) { + const auto& __np = std::use_facet>(__ctx.locale()); + basic_string<_CharT> __str = __value ? __np.truename() : __np.falsename(); + return __formatter::__write_string_no_precision(basic_string_view<_CharT>{__str}, __ctx.out(), __specs); + } +# endif + basic_string_view<_CharT> __str = + __value ? __formatter::__bool_strings<_CharT>::__true : __formatter::__bool_strings<_CharT>::__false; + return __formatter::__write(__str.begin(), __str.end(), __ctx.out(), __specs); +} + +} // namespace __formatter + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___FORMAT_FORMATTER_INTEGRAL_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_output.h b/app/src/main/cpp/libcxx/include/__format/formatter_output.h new file mode 100644 index 0000000..4676925 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_output.h @@ -0,0 +1,570 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_OUTPUT_H +#define _LIBCPP___FORMAT_FORMATTER_OUTPUT_H + +#include <__algorithm/ranges_copy.h> +#include <__algorithm/ranges_fill_n.h> +#include <__algorithm/ranges_transform.h> +#include <__chrono/statically_widen.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/buffer.h> +#include <__format/concepts.h> +#include <__format/escaped_output_table.h> +#include <__format/formatter.h> +#include <__format/parser_std_format_spec.h> +#include <__format/unicode.h> +#include <__iterator/back_insert_iterator.h> +#include <__type_traits/make_unsigned.h> +#include <__utility/move.h> +#include <__utility/unreachable.h> +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __formatter { + +_LIBCPP_HIDE_FROM_ABI constexpr char __hex_to_upper(char __c) { + switch (__c) { + case 'a': + return 'A'; + case 'b': + return 'B'; + case 'c': + return 'C'; + case 'd': + return 'D'; + case 'e': + return 'E'; + case 'f': + return 'F'; + } + return __c; +} + +struct _LIBCPP_TYPE_VIS __padding_size_result { + size_t __before_; + size_t __after_; +}; + +_LIBCPP_HIDE_FROM_ABI constexpr __padding_size_result +__padding_size(size_t __size, size_t __width, __format_spec::__alignment __align) { + _LIBCPP_ASSERT(__width > __size, "don't call this function when no padding is required"); + _LIBCPP_ASSERT( + __align != __format_spec::__alignment::__zero_padding, "the caller should have handled the zero-padding"); + + size_t __fill = __width - __size; + switch (__align) { + case __format_spec::__alignment::__zero_padding: + __libcpp_unreachable(); + + case __format_spec::__alignment::__left: + return {0, __fill}; + + case __format_spec::__alignment::__center: { + // The extra padding is divided per [format.string.std]/3 + // __before = floor(__fill, 2); + // __after = ceil(__fill, 2); + size_t __before = __fill / 2; + size_t __after = __fill - __before; + return {__before, __after}; + } + case __format_spec::__alignment::__default: + case __format_spec::__alignment::__right: + return {__fill, 0}; + } + __libcpp_unreachable(); +} + +/// Copy wrapper. +/// +/// This uses a "mass output function" of __format::__output_buffer when possible. +template <__fmt_char_type _CharT, __fmt_char_type _OutCharT = _CharT> +_LIBCPP_HIDE_FROM_ABI auto __copy(basic_string_view<_CharT> __str, output_iterator auto __out_it) + -> decltype(__out_it) { + if constexpr (_VSTD::same_as>>) { + __out_it.__get_container()->__copy(__str); + return __out_it; + } else if constexpr (_VSTD::same_as::__iterator>) { + __out_it.__buffer_->__copy(__str); + return __out_it; + } else { + return std::ranges::copy(__str, _VSTD::move(__out_it)).out; + } +} + +template <__fmt_char_type _CharT, __fmt_char_type _OutCharT = _CharT> +_LIBCPP_HIDE_FROM_ABI auto +__copy(const _CharT* __first, const _CharT* __last, output_iterator auto __out_it) + -> decltype(__out_it) { + return __formatter::__copy(basic_string_view{__first, __last}, _VSTD::move(__out_it)); +} + +template <__fmt_char_type _CharT, __fmt_char_type _OutCharT = _CharT> +_LIBCPP_HIDE_FROM_ABI auto __copy(const _CharT* __first, size_t __n, output_iterator auto __out_it) + -> decltype(__out_it) { + return __formatter::__copy(basic_string_view{__first, __n}, _VSTD::move(__out_it)); +} + +/// Transform wrapper. +/// +/// This uses a "mass output function" of __format::__output_buffer when possible. +template <__fmt_char_type _CharT, __fmt_char_type _OutCharT = _CharT, class _UnaryOperation> +_LIBCPP_HIDE_FROM_ABI auto +__transform(const _CharT* __first, + const _CharT* __last, + output_iterator auto __out_it, + _UnaryOperation __operation) -> decltype(__out_it) { + if constexpr (_VSTD::same_as>>) { + __out_it.__get_container()->__transform(__first, __last, _VSTD::move(__operation)); + return __out_it; + } else if constexpr (_VSTD::same_as::__iterator>) { + __out_it.__buffer_->__transform(__first, __last, _VSTD::move(__operation)); + return __out_it; + } else { + return std::ranges::transform(__first, __last, _VSTD::move(__out_it), __operation).out; + } +} + +/// Fill wrapper. +/// +/// This uses a "mass output function" of __format::__output_buffer when possible. +template <__fmt_char_type _CharT, output_iterator _OutIt> +_LIBCPP_HIDE_FROM_ABI _OutIt __fill(_OutIt __out_it, size_t __n, _CharT __value) { + if constexpr (_VSTD::same_as>>) { + __out_it.__get_container()->__fill(__n, __value); + return __out_it; + } else if constexpr (_VSTD::same_as::__iterator>) { + __out_it.__buffer_->__fill(__n, __value); + return __out_it; + } else { + return std::ranges::fill_n(_VSTD::move(__out_it), __n, __value); + } +} + +template +_LIBCPP_HIDE_FROM_ABI _OutIt __write_using_decimal_separators(_OutIt __out_it, const char* __begin, const char* __first, + const char* __last, string&& __grouping, _CharT __sep, + __format_spec::__parsed_specifications<_CharT> __specs) { + int __size = (__first - __begin) + // [sign][prefix] + (__last - __first) + // data + (__grouping.size() - 1); // number of separator characters + + __padding_size_result __padding = {0, 0}; + if (__specs.__alignment_ == __format_spec::__alignment::__zero_padding) { + // Write [sign][prefix]. + __out_it = __formatter::__copy(__begin, __first, _VSTD::move(__out_it)); + + if (__specs.__width_ > __size) { + // Write zero padding. + __padding.__before_ = __specs.__width_ - __size; + __out_it = __formatter::__fill(_VSTD::move(__out_it), __specs.__width_ - __size, _CharT('0')); + } + } else { + if (__specs.__width_ > __size) { + // Determine padding and write padding. + __padding = __formatter::__padding_size(__size, __specs.__width_, __specs.__alignment_); + + __out_it = __formatter::__fill(_VSTD::move(__out_it), __padding.__before_, __specs.__fill_); + } + // Write [sign][prefix]. + __out_it = __formatter::__copy(__begin, __first, _VSTD::move(__out_it)); + } + + auto __r = __grouping.rbegin(); + auto __e = __grouping.rend() - 1; + _LIBCPP_ASSERT(__r != __e, "The slow grouping formatting is used while " + "there will be no separators written."); + // The output is divided in small groups of numbers to write: + // - A group before the first separator. + // - A separator and a group, repeated for the number of separators. + // - A group after the last separator. + // This loop achieves that process by testing the termination condition + // midway in the loop. + // + // TODO FMT This loop evaluates the loop invariant `__parser.__type != + // _Flags::_Type::__hexadecimal_upper_case` for every iteration. (This test + // happens in the __write call.) Benchmark whether making two loops and + // hoisting the invariant is worth the effort. + while (true) { + if (__specs.__std_.__type_ == __format_spec::__type::__hexadecimal_upper_case) { + __last = __first + *__r; + __out_it = __formatter::__transform(__first, __last, _VSTD::move(__out_it), __hex_to_upper); + __first = __last; + } else { + __out_it = __formatter::__copy(__first, *__r, _VSTD::move(__out_it)); + __first += *__r; + } + + if (__r == __e) + break; + + ++__r; + *__out_it++ = __sep; + } + + return __formatter::__fill(_VSTD::move(__out_it), __padding.__after_, __specs.__fill_); +} + +/// Writes the input to the output with the required padding. +/// +/// Since the output column width is specified the function can be used for +/// ASCII and Unicode output. +/// +/// \pre \a __size <= \a __width. Using this function when this pre-condition +/// doesn't hold incurs an unwanted overhead. +/// +/// \param __str The string to write. +/// \param __out_it The output iterator to write to. +/// \param __specs The parsed formatting specifications. +/// \param __size The (estimated) output column width. When the elements +/// to be written are ASCII the following condition holds +/// \a __size == \a __last - \a __first. +/// +/// \returns An iterator pointing beyond the last element written. +/// +/// \note The type of the elements in range [\a __first, \a __last) can differ +/// from the type of \a __specs. Integer output uses \c std::to_chars for its +/// conversion, which means the [\a __first, \a __last) always contains elements +/// of the type \c char. +template +_LIBCPP_HIDE_FROM_ABI auto +__write(basic_string_view<_CharT> __str, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_ParserCharT> __specs, + ptrdiff_t __size) -> decltype(__out_it) { + if (__size >= __specs.__width_) + return __formatter::__copy(__str, _VSTD::move(__out_it)); + + __padding_size_result __padding = __formatter::__padding_size(__size, __specs.__width_, __specs.__std_.__alignment_); + __out_it = __formatter::__fill(_VSTD::move(__out_it), __padding.__before_, __specs.__fill_); + __out_it = __formatter::__copy(__str, _VSTD::move(__out_it)); + return __formatter::__fill(_VSTD::move(__out_it), __padding.__after_, __specs.__fill_); +} + +template +_LIBCPP_HIDE_FROM_ABI auto +__write(const _CharT* __first, + const _CharT* __last, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_ParserCharT> __specs, + ptrdiff_t __size) -> decltype(__out_it) { + _LIBCPP_ASSERT(__first <= __last, "Not a valid range"); + return __formatter::__write(basic_string_view{__first, __last}, _VSTD::move(__out_it), __specs, __size); +} + +/// \overload +/// +/// Calls the function above where \a __size = \a __last - \a __first. +template +_LIBCPP_HIDE_FROM_ABI auto +__write(const _CharT* __first, + const _CharT* __last, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_ParserCharT> __specs) -> decltype(__out_it) { + _LIBCPP_ASSERT(__first <= __last, "Not a valid range"); + return __formatter::__write(__first, __last, _VSTD::move(__out_it), __specs, __last - __first); +} + +template +_LIBCPP_HIDE_FROM_ABI auto __write_transformed(const _CharT* __first, const _CharT* __last, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_ParserCharT> __specs, + _UnaryOperation __op) -> decltype(__out_it) { + _LIBCPP_ASSERT(__first <= __last, "Not a valid range"); + + ptrdiff_t __size = __last - __first; + if (__size >= __specs.__width_) + return __formatter::__transform(__first, __last, _VSTD::move(__out_it), __op); + + __padding_size_result __padding = __formatter::__padding_size(__size, __specs.__width_, __specs.__alignment_); + __out_it = __formatter::__fill(_VSTD::move(__out_it), __padding.__before_, __specs.__fill_); + __out_it = __formatter::__transform(__first, __last, _VSTD::move(__out_it), __op); + return __formatter::__fill(_VSTD::move(__out_it), __padding.__after_, __specs.__fill_); +} + +/// Writes additional zero's for the precision before the exponent. +/// This is used when the precision requested in the format string is larger +/// than the maximum precision of the floating-point type. These precision +/// digits are always 0. +/// +/// \param __exponent The location of the exponent character. +/// \param __num_trailing_zeros The number of 0's to write before the exponent +/// character. +template +_LIBCPP_HIDE_FROM_ABI auto __write_using_trailing_zeros( + const _CharT* __first, + const _CharT* __last, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_ParserCharT> __specs, + size_t __size, + const _CharT* __exponent, + size_t __num_trailing_zeros) -> decltype(__out_it) { + _LIBCPP_ASSERT(__first <= __last, "Not a valid range"); + _LIBCPP_ASSERT(__num_trailing_zeros > 0, "The overload not writing trailing zeros should have been used"); + + __padding_size_result __padding = + __formatter::__padding_size(__size + __num_trailing_zeros, __specs.__width_, __specs.__alignment_); + __out_it = __formatter::__fill(_VSTD::move(__out_it), __padding.__before_, __specs.__fill_); + __out_it = __formatter::__copy(__first, __exponent, _VSTD::move(__out_it)); + __out_it = __formatter::__fill(_VSTD::move(__out_it), __num_trailing_zeros, _CharT('0')); + __out_it = __formatter::__copy(__exponent, __last, _VSTD::move(__out_it)); + return __formatter::__fill(_VSTD::move(__out_it), __padding.__after_, __specs.__fill_); +} + +/// Writes a string using format's width estimation algorithm. +/// +/// \pre !__specs.__has_precision() +/// +/// \note When \c _LIBCPP_HAS_NO_UNICODE is defined the function assumes the +/// input is ASCII. +template +_LIBCPP_HIDE_FROM_ABI auto __write_string_no_precision( + basic_string_view<_CharT> __str, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_CharT> __specs) -> decltype(__out_it) { + _LIBCPP_ASSERT(!__specs.__has_precision(), "use __write_string"); + + // No padding -> copy the string + if (!__specs.__has_width()) + return __formatter::__copy(__str, _VSTD::move(__out_it)); + + // Note when the estimated width is larger than size there's no padding. So + // there's no reason to get the real size when the estimate is larger than or + // equal to the minimum field width. + size_t __size = + __format_spec::__estimate_column_width(__str, __specs.__width_, __format_spec::__column_width_rounding::__up) + .__width_; + return __formatter::__write(__str, _VSTD::move(__out_it), __specs, __size); +} + +template +_LIBCPP_HIDE_FROM_ABI int __truncate(basic_string_view<_CharT>& __str, int __precision) { + __format_spec::__column_width_result<_CharT> __result = + __format_spec::__estimate_column_width(__str, __precision, __format_spec::__column_width_rounding::__down); + __str = basic_string_view<_CharT>{__str.begin(), __result.__last_}; + return __result.__width_; +} + +/// Writes a string using format's width estimation algorithm. +/// +/// \note When \c _LIBCPP_HAS_NO_UNICODE is defined the function assumes the +/// input is ASCII. +template +_LIBCPP_HIDE_FROM_ABI auto __write_string( + basic_string_view<_CharT> __str, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_CharT> __specs) -> decltype(__out_it) { + if (!__specs.__has_precision()) + return __formatter::__write_string_no_precision(__str, _VSTD::move(__out_it), __specs); + + int __size = __formatter::__truncate(__str, __specs.__precision_); + + return __formatter::__write(__str.begin(), __str.end(), _VSTD::move(__out_it), __specs, __size); +} + +# if _LIBCPP_STD_VER > 20 + +struct __nul_terminator {}; + +template +_LIBCPP_HIDE_FROM_ABI bool operator==(const _CharT* __cstr, __nul_terminator) { + return *__cstr == _CharT('\0'); +} + +template +_LIBCPP_HIDE_FROM_ABI void +__write_escaped_code_unit(basic_string<_CharT>& __str, char32_t __value, const _CharT* __prefix) { + back_insert_iterator __out_it{__str}; + std::ranges::copy(__prefix, __nul_terminator{}, __out_it); + + char __buffer[8]; + to_chars_result __r = std::to_chars(std::begin(__buffer), std::end(__buffer), __value, 16); + _LIBCPP_ASSERT(__r.ec == errc(0), "Internal buffer too small"); + std::ranges::copy(std::begin(__buffer), __r.ptr, __out_it); + + __str += _CharT('}'); +} + +// [format.string.escaped]/2.2.1.2 +// ... +// then the sequence \u{hex-digit-sequence} is appended to E, where +// hex-digit-sequence is the shortest hexadecimal representation of C using +// lower-case hexadecimal digits. +template +_LIBCPP_HIDE_FROM_ABI void __write_well_formed_escaped_code_unit(basic_string<_CharT>& __str, char32_t __value) { + __formatter::__write_escaped_code_unit(__str, __value, _LIBCPP_STATICALLY_WIDEN(_CharT, "\\u{")); +} + +// [format.string.escaped]/2.2.3 +// Otherwise (X is a sequence of ill-formed code units), each code unit U is +// appended to E in order as the sequence \x{hex-digit-sequence}, where +// hex-digit-sequence is the shortest hexadecimal representation of U using +// lower-case hexadecimal digits. +template +_LIBCPP_HIDE_FROM_ABI void __write_escape_ill_formed_code_unit(basic_string<_CharT>& __str, char32_t __value) { + __formatter::__write_escaped_code_unit(__str, __value, _LIBCPP_STATICALLY_WIDEN(_CharT, "\\x{")); +} + +template +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool __is_escaped_sequence_written(basic_string<_CharT>& __str, char32_t __value) { +# ifdef _LIBCPP_HAS_NO_UNICODE + // For ASCII assume everything above 127 is printable. + if (__value > 127) + return false; +# endif + + if (!__escaped_output_table::__needs_escape(__value)) + return false; + + __formatter::__write_well_formed_escaped_code_unit(__str, __value); + return true; +} + +template +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr char32_t __to_char32(_CharT __value) { + return static_cast>(__value); +} + +enum class _LIBCPP_ENUM_VIS __escape_quotation_mark { __apostrophe, __double_quote }; + +// [format.string.escaped]/2 +template +[[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool +__is_escaped_sequence_written(basic_string<_CharT>& __str, char32_t __value, __escape_quotation_mark __mark) { + // 2.2.1.1 - Mapped character in [tab:format.escape.sequences] + switch (__value) { + case _CharT('\t'): + __str += _LIBCPP_STATICALLY_WIDEN(_CharT, "\\t"); + return true; + case _CharT('\n'): + __str += _LIBCPP_STATICALLY_WIDEN(_CharT, "\\n"); + return true; + case _CharT('\r'): + __str += _LIBCPP_STATICALLY_WIDEN(_CharT, "\\r"); + return true; + case _CharT('\''): + if (__mark == __escape_quotation_mark::__apostrophe) + __str += _LIBCPP_STATICALLY_WIDEN(_CharT, R"(\')"); + else + __str += __value; + return true; + case _CharT('"'): + if (__mark == __escape_quotation_mark::__double_quote) + __str += _LIBCPP_STATICALLY_WIDEN(_CharT, R"(\")"); + else + __str += __value; + return true; + case _CharT('\\'): + __str += _LIBCPP_STATICALLY_WIDEN(_CharT, R"(\\)"); + return true; + + // 2.2.1.2 - Space + case _CharT(' '): + __str += __value; + return true; + } + + // 2.2.2 + // Otherwise, if X is a shift sequence, the effect on E and further + // decoding of S is unspecified. + // For now shift sequences are ignored and treated as Unicode. Other parts + // of the format library do the same. It's unknown how ostream treats them. + // TODO FMT determine what to do with shift sequences. + + // 2.2.1.2.1 and 2.2.1.2.2 - Escape + return __formatter::__is_escaped_sequence_written(__str, __formatter::__to_char32(__value)); +} + +template +_LIBCPP_HIDE_FROM_ABI void +__escape(basic_string<_CharT>& __str, basic_string_view<_CharT> __values, __escape_quotation_mark __mark) { + __unicode::__code_point_view<_CharT> __view{__values.begin(), __values.end()}; + + while (!__view.__at_end()) { + const _CharT* __first = __view.__position(); + typename __unicode::__consume_p2286_result __result = __view.__consume_p2286(); + if (__result.__ill_formed_size == 0) { + if (!__formatter::__is_escaped_sequence_written(__str, __result.__value, __mark)) + // 2.2.1.3 - Add the character + ranges::copy(__first, __view.__position(), std::back_insert_iterator(__str)); + + } else { + // 2.2.3 sequence of ill-formed code units + // The number of code-units in __result.__value depends on the character type being used. + if constexpr (sizeof(_CharT) == 1) { + _LIBCPP_ASSERT(__result.__ill_formed_size == 1 || __result.__ill_formed_size == 4, + "illegal number of invalid code units."); + if (__result.__ill_formed_size == 1) // ill-formed, one code unit + __formatter::__write_escape_ill_formed_code_unit(__str, __result.__value & 0xff); + else { // out of valid range, four code units + // The code point was properly encoded, decode the value. + __formatter::__write_escape_ill_formed_code_unit(__str, __result.__value >> 18 | 0xf0); + __formatter::__write_escape_ill_formed_code_unit(__str, (__result.__value >> 12 & 0x3f) | 0x80); + __formatter::__write_escape_ill_formed_code_unit(__str, (__result.__value >> 6 & 0x3f) | 0x80); + __formatter::__write_escape_ill_formed_code_unit(__str, (__result.__value & 0x3f) | 0x80); + } + } else if constexpr (sizeof(_CharT) == 2) { + _LIBCPP_ASSERT(__result.__ill_formed_size == 1, "for UTF-16 at most one invalid code unit"); + __formatter::__write_escape_ill_formed_code_unit(__str, __result.__value & 0xffff); + } else { + static_assert(sizeof(_CharT) == 4, "unsupported character width"); + _LIBCPP_ASSERT(__result.__ill_formed_size == 1, "for UTF-32 one code unit is one code point"); + __formatter::__write_escape_ill_formed_code_unit(__str, __result.__value); + } + } + } +} + +template +_LIBCPP_HIDE_FROM_ABI auto +__format_escaped_char(_CharT __value, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_CharT> __specs) -> decltype(__out_it) { + basic_string<_CharT> __str; + __str += _CharT('\''); + __formatter::__escape(__str, basic_string_view{std::addressof(__value), 1}, __escape_quotation_mark::__apostrophe); + __str += _CharT('\''); + return __formatter::__write(__str.data(), __str.data() + __str.size(), _VSTD::move(__out_it), __specs, __str.size()); +} + +template +_LIBCPP_HIDE_FROM_ABI auto +__format_escaped_string(basic_string_view<_CharT> __values, + output_iterator auto __out_it, + __format_spec::__parsed_specifications<_CharT> __specs) -> decltype(__out_it) { + basic_string<_CharT> __str; + __str += _CharT('"'); + __formatter::__escape(__str, __values, __escape_quotation_mark::__double_quote); + __str += _CharT('"'); + return __formatter::__write_string(basic_string_view{__str}, _VSTD::move(__out_it), __specs); +} + +# endif // _LIBCPP_STD_VER > 20 + +} // namespace __formatter + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMATTER_OUTPUT_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_pointer.h b/app/src/main/cpp/libcxx/include/__format/formatter_pointer.h new file mode 100644 index 0000000..31b49e1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_pointer.h @@ -0,0 +1,73 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_POINTER_H +#define _LIBCPP___FORMAT_FORMATTER_POINTER_H + +#include <__availability> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_parse_context.h> +#include <__format/formatter.h> +#include <__format/formatter_integral.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS __formatter_pointer { +public: + constexpr __formatter_pointer() { __parser_.__alignment_ = __format_spec::__alignment::__right; } + + _LIBCPP_HIDE_FROM_ABI constexpr auto + parse(basic_format_parse_context<_CharT>& __parse_ctx) -> decltype(__parse_ctx.begin()) { + auto __result = __parser_.__parse(__parse_ctx, __format_spec::__fields_pointer); + __format_spec::__process_display_type_pointer(__parser_.__type_); + return __result; + } + + _LIBCPP_HIDE_FROM_ABI auto format(const void* __ptr, auto& __ctx) const -> decltype(__ctx.out()) { + __format_spec::__parsed_specifications<_CharT> __specs = __parser_.__get_parsed_std_specifications(__ctx); + __specs.__std_.__alternate_form_ = true; + __specs.__std_.__type_ = __format_spec::__type::__hexadecimal_lower_case; + return __formatter::__format_integer(reinterpret_cast(__ptr), __ctx, __specs); + } + + __format_spec::__parser<_CharT> __parser_; +}; + +// [format.formatter.spec]/2.4 +// For each charT, the pointer type specializations template<> +// - struct formatter; +// - template<> struct formatter; +// - template<> struct formatter; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_pointer<_CharT> {}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter : public __formatter_pointer<_CharT> { +}; +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_pointer<_CharT> {}; + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMATTER_POINTER_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_string.h b/app/src/main/cpp/libcxx/include/__format/formatter_string.h new file mode 100644 index 0000000..606fb79 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_string.h @@ -0,0 +1,159 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_STRING_H +#define _LIBCPP___FORMAT_FORMATTER_STRING_H + +#include <__availability> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_parse_context.h> +#include <__format/formatter.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include <__utility/move.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS __formatter_string { +public: + _LIBCPP_HIDE_FROM_ABI constexpr auto parse(basic_format_parse_context<_CharT>& __parse_ctx) + -> decltype(__parse_ctx.begin()) { + auto __result = __parser_.__parse(__parse_ctx, __format_spec::__fields_string); + __format_spec::__process_display_type_string(__parser_.__type_); + return __result; + } + + _LIBCPP_HIDE_FROM_ABI auto format(basic_string_view<_CharT> __str, auto& __ctx) const -> decltype(__ctx.out()) { +# if _LIBCPP_STD_VER > 20 + if (__parser_.__type_ == __format_spec::__type::__debug) + return __formatter::__format_escaped_string(__str, __ctx.out(), __parser_.__get_parsed_std_specifications(__ctx)); +# endif + + return __formatter::__write_string(__str, __ctx.out(), __parser_.__get_parsed_std_specifications(__ctx)); + } + +# if _LIBCPP_STD_VER > 20 + _LIBCPP_HIDE_FROM_ABI constexpr void set_debug_format() { __parser_.__type_ = __format_spec::__type::__debug; } +# endif + + __format_spec::__parser<_CharT> __parser_{.__alignment_ = __format_spec::__alignment::__left}; +}; + +// Formatter const char*. +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_string<_CharT> { + using _Base = __formatter_string<_CharT>; + + _LIBCPP_HIDE_FROM_ABI auto format(const _CharT* __str, auto& __ctx) const -> decltype(__ctx.out()) { + _LIBCPP_ASSERT(__str, "The basic_format_arg constructor should have " + "prevented an invalid pointer."); + + __format_spec::__parsed_specifications<_CharT> __specs = _Base::__parser_.__get_parsed_std_specifications(__ctx); +# if _LIBCPP_STD_VER > 20 + if (_Base::__parser_.__type_ == __format_spec::__type::__debug) + return __formatter::__format_escaped_string(basic_string_view<_CharT>{__str}, __ctx.out(), __specs); +# endif + + // When using a center or right alignment and the width option the length + // of __str must be known to add the padding upfront. This case is handled + // by the base class by converting the argument to a basic_string_view. + // + // When using left alignment and the width option the padding is added + // after outputting __str so the length can be determined while outputting + // __str. The same holds true for the precision, during outputting __str it + // can be validated whether the precision threshold has been reached. For + // now these optimizations aren't implemented. Instead the base class + // handles these options. + // TODO FMT Implement these improvements. + if (__specs.__has_width() || __specs.__has_precision()) + return __formatter::__write_string(basic_string_view<_CharT>{__str}, __ctx.out(), __specs); + + // No formatting required, copy the string to the output. + auto __out_it = __ctx.out(); + while (*__str) + *__out_it++ = *__str++; + return __out_it; + } +}; + +// Formatter char*. +template <__fmt_char_type _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<_CharT*, _CharT> + : public formatter { + using _Base = formatter; + + _LIBCPP_HIDE_FROM_ABI auto format(_CharT* __str, auto& __ctx) const -> decltype(__ctx.out()) { + return _Base::format(__str, __ctx); + } +}; + +// Formatter char[]. +template <__fmt_char_type _CharT, size_t _Size> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<_CharT[_Size], _CharT> + : public __formatter_string<_CharT> { + using _Base = __formatter_string<_CharT>; + + _LIBCPP_HIDE_FROM_ABI auto format(_CharT __str[_Size], auto& __ctx) const -> decltype(__ctx.out()) { + return _Base::format(basic_string_view<_CharT>(__str, _Size), __ctx); + } +}; + +// Formatter const char[]. +template <__fmt_char_type _CharT, size_t _Size> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter + : public __formatter_string<_CharT> { + using _Base = __formatter_string<_CharT>; + + _LIBCPP_HIDE_FROM_ABI auto format(const _CharT __str[_Size], auto& __ctx) const -> decltype(__ctx.out()) { + return _Base::format(basic_string_view<_CharT>(__str, _Size), __ctx); + } +}; + +// Formatter std::string. +template <__fmt_char_type _CharT, class _Traits, class _Allocator> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter, _CharT> + : public __formatter_string<_CharT> { + using _Base = __formatter_string<_CharT>; + + _LIBCPP_HIDE_FROM_ABI auto format(const basic_string<_CharT, _Traits, _Allocator>& __str, auto& __ctx) const + -> decltype(__ctx.out()) { + // Drop _Traits and _Allocator to have one std::basic_string formatter. + return _Base::format(basic_string_view<_CharT>(__str.data(), __str.size()), __ctx); + } +}; + +// Formatter std::string_view. +template <__fmt_char_type _CharT, class _Traits> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter, _CharT> + : public __formatter_string<_CharT> { + using _Base = __formatter_string<_CharT>; + + _LIBCPP_HIDE_FROM_ABI auto format(basic_string_view<_CharT, _Traits> __str, auto& __ctx) const + -> decltype(__ctx.out()) { + // Drop _Traits to have one std::basic_string_view formatter. + return _Base::format(basic_string_view<_CharT>(__str.data(), __str.size()), __ctx); + } +}; + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMATTER_STRING_H diff --git a/app/src/main/cpp/libcxx/include/__format/formatter_tuple.h b/app/src/main/cpp/libcxx/include/__format/formatter_tuple.h new file mode 100644 index 0000000..82f5ada --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/formatter_tuple.h @@ -0,0 +1,178 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_FORMATTER_TUPLE_H +#define _LIBCPP___FORMAT_FORMATTER_TUPLE_H + +#include <__algorithm/ranges_copy.h> +#include <__availability> +#include <__chrono/statically_widen.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/format_args.h> +#include <__format/format_context.h> +#include <__format/format_error.h> +#include <__format/format_parse_context.h> +#include <__format/formatter.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include <__iterator/back_insert_iterator.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/integer_sequence.h> +#include <__utility/pair.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 20 + +template <__fmt_char_type _CharT, class _Tuple, formattable<_CharT>... _Args> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __formatter_tuple { + _LIBCPP_HIDE_FROM_ABI constexpr void set_separator(basic_string_view<_CharT> __separator) { + __separator_ = __separator; + } + _LIBCPP_HIDE_FROM_ABI constexpr void + set_brackets(basic_string_view<_CharT> __opening_bracket, basic_string_view<_CharT> __closing_bracket) { + __opening_bracket_ = __opening_bracket; + __closing_bracket_ = __closing_bracket; + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __parse_ctx) { + const _CharT* __begin = __parser_.__parse(__parse_ctx, __format_spec::__fields_tuple); + + // [format.tuple]/7 + // ... For each element e in underlying_, if e.set_debug_format() + // is a valid expression, calls e.set_debug_format(). + // TODO FMT this can be removed when P2733 is accepted. + std::__for_each_index_sequence(make_index_sequence(), [&] { + std::__set_debug_format(std::get<_Index>(__underlying_)); + }); + + const _CharT* __end = __parse_ctx.end(); + if (__begin == __end) + return __begin; + + if (*__begin == _CharT('m')) { + if constexpr (sizeof...(_Args) == 2) { + set_separator(_LIBCPP_STATICALLY_WIDEN(_CharT, ": ")); + set_brackets({}, {}); + ++__begin; + } else + std::__throw_format_error("The format specifier m requires a pair or a two-element tuple"); + } else if (*__begin == _CharT('n')) { + set_brackets({}, {}); + ++__begin; + } + + if (__begin != __end && *__begin != _CharT('}')) + std::__throw_format_error("The format-spec should consume the input or end with a '}'"); + + return __begin; + } + + template + typename _FormatContext::iterator _LIBCPP_HIDE_FROM_ABI + format(conditional_t<(formattable && ...), const _Tuple&, _Tuple&> __tuple, + _FormatContext& __ctx) const { + __format_spec::__parsed_specifications<_CharT> __specs = __parser_.__get_parsed_std_specifications(__ctx); + + if (!__specs.__has_width()) + return __format_tuple(__tuple, __ctx); + + basic_string<_CharT> __str; + + // Since the output is written to a different iterator a new context is + // created. Since the underlying formatter uses the default formatting it + // doesn't need a locale or the formatting arguments. So creating a new + // context works. + // + // This solution works for this formatter, but it will not work for the + // range_formatter. In that patch a generic solution is work in progress. + // Once that is finished it can be used here. (The range_formatter will use + // these features so it's easier to add it there and then port it.) + // + // TODO FMT Use formatting wrapping used in the range_formatter. + basic_format_context __c = std::__format_context_create( + back_insert_iterator{__str}, + basic_format_args>, _CharT>>{}); + + __format_tuple(__tuple, __c); + + return __formatter::__write_string_no_precision(basic_string_view{__str}, __ctx.out(), __specs); + } + + template + _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator __format_tuple(auto&& __tuple, _FormatContext& __ctx) const { + __ctx.advance_to(std::ranges::copy(__opening_bracket_, __ctx.out()).out); + + std::__for_each_index_sequence(make_index_sequence(), [&] { + if constexpr (_Index) + __ctx.advance_to(std::ranges::copy(__separator_, __ctx.out()).out); + + // During review Victor suggested to make the exposition only + // __underlying_ member a local variable. Currently the Standard + // requires nested debug-enabled formatter specializations not to + // output escaped output. P2733 fixes that bug, once accepted the + // code below can be used. + // (Note when a paper allows parsing a tuple-underlying-spec the + // exposition only member needs to be a class member. Earlier + // revisions of P2286 proposed that, but this was not pursued, + // due to time constrains and complexity of the matter.) + // TODO FMT This can be updated after P2733 is accepted. +# if 0 + // P2286 uses an exposition only member in the formatter + // tuple, _CharT>...> __underlying_; + // This was used in earlier versions of the paper since + // __underlying_.parse(...) was called. This is no longer the case + // so we can reduce the scope of the formatter. + // + // It does require the underlying's parse effect to be moved here too. + using _Arg = tuple_element<_Index, decltype(__tuple)>; + formatter, _CharT> __underlying; + + // [format.tuple]/7 + // ... For each element e in underlying_, if e.set_debug_format() + // is a valid expression, calls e.set_debug_format(). + std::__set_debug_format(__underlying); +# else + __ctx.advance_to(std::get<_Index>(__underlying_).format(std::get<_Index>(__tuple), __ctx)); +# endif + }); + + return std::ranges::copy(__closing_bracket_, __ctx.out()).out; + } + + __format_spec::__parser<_CharT> __parser_{.__alignment_ = __format_spec::__alignment::__left}; + +private: + tuple, _CharT>...> __underlying_; + basic_string_view<_CharT> __separator_ = _LIBCPP_STATICALLY_WIDEN(_CharT, ", "); + basic_string_view<_CharT> __opening_bracket_ = _LIBCPP_STATICALLY_WIDEN(_CharT, "("); + basic_string_view<_CharT> __closing_bracket_ = _LIBCPP_STATICALLY_WIDEN(_CharT, ")"); +}; + +template <__fmt_char_type _CharT, formattable<_CharT>... _Args> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter, _CharT> + : public __formatter_tuple<_CharT, pair<_Args...>, _Args...> {}; + +template <__fmt_char_type _CharT, formattable<_CharT>... _Args> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter, _CharT> + : public __formatter_tuple<_CharT, tuple<_Args...>, _Args...> {}; + +#endif //_LIBCPP_STD_VER > 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_FORMATTER_TUPLE_H diff --git a/app/src/main/cpp/libcxx/include/__format/parser_std_format_spec.h b/app/src/main/cpp/libcxx/include/__format/parser_std_format_spec.h new file mode 100644 index 0000000..c03cec9 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/parser_std_format_spec.h @@ -0,0 +1,954 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_PARSER_STD_FORMAT_SPEC_H +#define _LIBCPP___FORMAT_PARSER_STD_FORMAT_SPEC_H + +/// \file Contains the std-format-spec parser. +/// +/// Most of the code can be reused in the chrono-format-spec. +/// This header has some support for the chrono-format-spec since it doesn't +/// affect the std-format-spec. + +#include <__algorithm/find_if.h> +#include <__algorithm/min.h> +#include <__assert> +#include <__concepts/arithmetic.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__debug> +#include <__format/format_arg.h> +#include <__format/format_error.h> +#include <__format/format_parse_context.h> +#include <__format/format_string.h> +#include <__format/unicode.h> +#include <__variant/monostate.h> +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __format_spec { + +template +_LIBCPP_HIDE_FROM_ABI constexpr __format::__parse_number_result< _CharT> +__parse_arg_id(const _CharT* __begin, const _CharT* __end, auto& __parse_ctx) { + // This function is a wrapper to call the real parser. But it does the + // validation for the pre-conditions and post-conditions. + if (__begin == __end) + std::__throw_format_error("End of input while parsing format-spec arg-id"); + + __format::__parse_number_result __r = __format::__parse_arg_id(__begin, __end, __parse_ctx); + + if (__r.__ptr == __end || *__r.__ptr != _CharT('}')) + std::__throw_format_error("Invalid arg-id"); + + ++__r.__ptr; + return __r; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr uint32_t +__substitute_arg_id(basic_format_arg<_Context> __format_arg) { + // [format.string.std]/8 + // If the corresponding formatting argument is not of integral type... + // This wording allows char and bool too. LWG-3720 changes the wording to + // If the corresponding formatting argument is not of standard signed or + // unsigned integer type, + // This means the 128-bit will not be valid anymore. + // TODO FMT Verify this resolution is accepted and add a test to verify + // 128-bit integrals fail and switch to visit_format_arg. + return _VSTD::__visit_format_arg( + [](auto __arg) -> uint32_t { + using _Type = decltype(__arg); + if constexpr (integral<_Type>) { + if constexpr (signed_integral<_Type>) { + if (__arg < 0) + std::__throw_format_error("A format-spec arg-id replacement shouldn't have a negative value"); + } + + using _CT = common_type_t<_Type, decltype(__format::__number_max)>; + if (static_cast<_CT>(__arg) > + static_cast<_CT>(__format::__number_max)) + std::__throw_format_error("A format-spec arg-id replacement exceeds the maximum supported value"); + + return __arg; + } else if constexpr (same_as<_Type, monostate>) + std::__throw_format_error("Argument index out of bounds"); + else + std::__throw_format_error("A format-spec arg-id replacement argument isn't an integral type"); + }, + __format_arg); +} + +/// These fields are a filter for which elements to parse. +/// +/// They default to false so when a new field is added it needs to be opted in +/// explicitly. +// TODO FMT Use an ABI tag for this struct. +struct __fields { + uint8_t __sign_ : 1 {false}; + uint8_t __alternate_form_ : 1 {false}; + uint8_t __zero_padding_ : 1 {false}; + uint8_t __precision_ : 1 {false}; + uint8_t __locale_specific_form_ : 1 {false}; + uint8_t __type_ : 1 {false}; + // Determines the valid values for fill. + // + // Originally the fill could be any character except { and }. Range-based + // formatters use the colon to mark the beginning of the + // underlying-format-spec. To avoid parsing ambiguities these formatter + // specializations prohibit the use of the colon as a fill character. + uint8_t __allow_colon_in_fill_ : 1 {false}; +}; + +// By not placing this constant in the formatter class it's not duplicated for +// char and wchar_t. +inline constexpr __fields __fields_integral{ + .__sign_ = true, + .__alternate_form_ = true, + .__zero_padding_ = true, + .__locale_specific_form_ = true, + .__type_ = true}; +inline constexpr __fields __fields_floating_point{ + .__sign_ = true, + .__alternate_form_ = true, + .__zero_padding_ = true, + .__precision_ = true, + .__locale_specific_form_ = true, + .__type_ = true}; +inline constexpr __fields __fields_string{.__precision_ = true, .__type_ = true}; +inline constexpr __fields __fields_pointer{.__type_ = true}; + +# if _LIBCPP_STD_VER > 20 +inline constexpr __fields __fields_tuple{.__type_ = false, .__allow_colon_in_fill_ = true}; +inline constexpr __fields __fields_range{.__type_ = false, .__allow_colon_in_fill_ = true}; +# endif + +enum class _LIBCPP_ENUM_VIS __alignment : uint8_t { + /// No alignment is set in the format string. + __default, + __left, + __center, + __right, + __zero_padding +}; + +enum class _LIBCPP_ENUM_VIS __sign : uint8_t { + /// No sign is set in the format string. + /// + /// The sign isn't allowed for certain format-types. By using this value + /// it's possible to detect whether or not the user explicitly set the sign + /// flag. For formatting purposes it behaves the same as \ref __minus. + __default, + __minus, + __plus, + __space +}; + +enum class _LIBCPP_ENUM_VIS __type : uint8_t { + __default, + __string, + __binary_lower_case, + __binary_upper_case, + __octal, + __decimal, + __hexadecimal_lower_case, + __hexadecimal_upper_case, + __pointer, + __char, + __hexfloat_lower_case, + __hexfloat_upper_case, + __scientific_lower_case, + __scientific_upper_case, + __fixed_lower_case, + __fixed_upper_case, + __general_lower_case, + __general_upper_case, + __debug +}; + +struct __std { + __alignment __alignment_ : 3; + __sign __sign_ : 2; + bool __alternate_form_ : 1; + bool __locale_specific_form_ : 1; + __type __type_; +}; + +struct __chrono { + __alignment __alignment_ : 3; + bool __locale_specific_form_ : 1; + bool __weekday_name_ : 1; + bool __weekday_ : 1; + bool __day_of_year_ : 1; + bool __week_of_year_ : 1; + bool __month_name_ : 1; +}; + +/// Contains the parsed formatting specifications. +/// +/// This contains information for both the std-format-spec and the +/// chrono-format-spec. This results in some unused members for both +/// specifications. However these unused members don't increase the size +/// of the structure. +/// +/// This struct doesn't cross ABI boundaries so its layout doesn't need to be +/// kept stable. +template +struct __parsed_specifications { + union { + // The field __alignment_ is the first element in __std_ and __chrono_. + // This allows the code to always inspect this value regards which member + // of the union is the active member [class.union.general]/2. + // + // This is needed since the generic output routines handle the alignment of + // the output. + __alignment __alignment_ : 3; + __std __std_; + __chrono __chrono_; + }; + + /// The requested width. + /// + /// When the format-spec used an arg-id for this field it has already been + /// replaced with the value of that arg-id. + int32_t __width_; + + /// The requested precision. + /// + /// When the format-spec used an arg-id for this field it has already been + /// replaced with the value of that arg-id. + int32_t __precision_; + + _CharT __fill_; + + _LIBCPP_HIDE_FROM_ABI constexpr bool __has_width() const { return __width_ > 0; } + + _LIBCPP_HIDE_FROM_ABI constexpr bool __has_precision() const { return __precision_ >= 0; } +}; + +// Validate the struct is small and cheap to copy since the struct is passed by +// value in formatting functions. +static_assert(sizeof(__parsed_specifications) == 16); +static_assert(is_trivially_copyable_v<__parsed_specifications>); +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +static_assert(sizeof(__parsed_specifications) == 16); +static_assert(is_trivially_copyable_v<__parsed_specifications>); +# endif + +/// The parser for the std-format-spec. +/// +/// Note this class is a member of std::formatter specializations. It's +/// expected developers will create their own formatter specializations that +/// inherit from the std::formatter specializations. This means this class +/// must be ABI stable. To aid the stability the unused bits in the class are +/// set to zero. That way they can be repurposed if a future revision of the +/// Standards adds new fields to std-format-spec. +template +class _LIBCPP_TEMPLATE_VIS __parser { +public: + _LIBCPP_HIDE_FROM_ABI constexpr auto __parse(basic_format_parse_context<_CharT>& __parse_ctx, __fields __fields) + -> decltype(__parse_ctx.begin()) { + + const _CharT* __begin = __parse_ctx.begin(); + const _CharT* __end = __parse_ctx.end(); + if (__begin == __end) + return __begin; + + if (__parse_fill_align(__begin, __end, __fields.__allow_colon_in_fill_) && __begin == __end) + return __begin; + + if (__fields.__sign_ && __parse_sign(__begin) && __begin == __end) + return __begin; + + if (__fields.__alternate_form_ && __parse_alternate_form(__begin) && __begin == __end) + return __begin; + + if (__fields.__zero_padding_ && __parse_zero_padding(__begin) && __begin == __end) + return __begin; + + if (__parse_width(__begin, __end, __parse_ctx) && __begin == __end) + return __begin; + + if (__fields.__precision_ && __parse_precision(__begin, __end, __parse_ctx) && __begin == __end) + return __begin; + + if (__fields.__locale_specific_form_ && __parse_locale_specific_form(__begin) && __begin == __end) + return __begin; + + if (__fields.__type_) { + __parse_type(__begin); + + // When __type_ is false the calling parser is expected to do additional + // parsing. In that case that parser should do the end of format string + // validation. + if (__begin != __end && *__begin != _CharT('}')) + std::__throw_format_error("The format-spec should consume the input or end with a '}'"); + } + + return __begin; + } + + /// \returns the `__parsed_specifications` with the resolved dynamic sizes.. + _LIBCPP_HIDE_FROM_ABI + __parsed_specifications<_CharT> __get_parsed_std_specifications(auto& __ctx) const { + return __parsed_specifications<_CharT>{ + .__std_ = __std{.__alignment_ = __alignment_, + .__sign_ = __sign_, + .__alternate_form_ = __alternate_form_, + .__locale_specific_form_ = __locale_specific_form_, + .__type_ = __type_}, + .__width_{__get_width(__ctx)}, + .__precision_{__get_precision(__ctx)}, + .__fill_{__fill_}}; + } + + _LIBCPP_HIDE_FROM_ABI __parsed_specifications<_CharT> __get_parsed_chrono_specifications(auto& __ctx) const { + return __parsed_specifications<_CharT>{ + .__chrono_ = + __chrono{.__alignment_ = __alignment_, + .__locale_specific_form_ = __locale_specific_form_, + .__weekday_name_ = __weekday_name_, + .__weekday_ = __weekday_, + .__day_of_year_ = __day_of_year_, + .__week_of_year_ = __week_of_year_, + .__month_name_ = __month_name_}, + .__width_{__get_width(__ctx)}, + .__precision_{__get_precision(__ctx)}, + .__fill_{__fill_}}; + } + + __alignment __alignment_ : 3 {__alignment::__default}; + __sign __sign_ : 2 {__sign::__default}; + bool __alternate_form_ : 1 {false}; + bool __locale_specific_form_ : 1 {false}; + bool __reserved_0_ : 1 {false}; + __type __type_{__type::__default}; + + // These flags are only used for formatting chrono. Since the struct has + // padding space left it's added to this structure. + bool __weekday_name_ : 1 {false}; + bool __weekday_ : 1 {false}; + + bool __day_of_year_ : 1 {false}; + bool __week_of_year_ : 1 {false}; + + bool __month_name_ : 1 {false}; + + uint8_t __reserved_1_ : 3 {0}; + uint8_t __reserved_2_ : 6 {0}; + // These two flags are only used internally and not part of the + // __parsed_specifications. Therefore put them at the end. + bool __width_as_arg_ : 1 {false}; + bool __precision_as_arg_ : 1 {false}; + + /// The requested width, either the value or the arg-id. + int32_t __width_{0}; + + /// The requested precision, either the value or the arg-id. + int32_t __precision_{-1}; + + // LWG 3576 will probably change this to always accept a Unicode code point + // To avoid changing the size with that change align the field so when it + // becomes 32-bit its alignment will remain the same. That also means the + // size will remain the same. (D2572 addresses the solution for LWG 3576.) + _CharT __fill_{_CharT(' ')}; + +private: + _LIBCPP_HIDE_FROM_ABI constexpr bool __parse_alignment(_CharT __c) { + switch (__c) { + case _CharT('<'): + __alignment_ = __alignment::__left; + return true; + + case _CharT('^'): + __alignment_ = __alignment::__center; + return true; + + case _CharT('>'): + __alignment_ = __alignment::__right; + return true; + } + return false; + } + + // range-fill and tuple-fill are identical + _LIBCPP_HIDE_FROM_ABI constexpr bool + __parse_fill_align(const _CharT*& __begin, const _CharT* __end, bool __use_range_fill) { + _LIBCPP_ASSERT(__begin != __end, "when called with an empty input the function will cause " + "undefined behavior by evaluating data not in the input"); + if (__begin + 1 != __end) { + if (__parse_alignment(*(__begin + 1))) { + if (__use_range_fill && (*__begin == _CharT('{') || *__begin == _CharT('}') || *__begin == _CharT(':'))) + std::__throw_format_error("The format-spec range-fill field contains an invalid character"); + else if (*__begin == _CharT('{') || *__begin == _CharT('}')) + std::__throw_format_error("The format-spec fill field contains an invalid character"); + + __fill_ = *__begin; + __begin += 2; + return true; + } + } + + if (!__parse_alignment(*__begin)) + return false; + + ++__begin; + return true; + } + + _LIBCPP_HIDE_FROM_ABI constexpr bool __parse_sign(const _CharT*& __begin) { + switch (*__begin) { + case _CharT('-'): + __sign_ = __sign::__minus; + break; + case _CharT('+'): + __sign_ = __sign::__plus; + break; + case _CharT(' '): + __sign_ = __sign::__space; + break; + default: + return false; + } + ++__begin; + return true; + } + + _LIBCPP_HIDE_FROM_ABI constexpr bool __parse_alternate_form(const _CharT*& __begin) { + if (*__begin != _CharT('#')) + return false; + + __alternate_form_ = true; + ++__begin; + return true; + } + + _LIBCPP_HIDE_FROM_ABI constexpr bool __parse_zero_padding(const _CharT*& __begin) { + if (*__begin != _CharT('0')) + return false; + + if (__alignment_ == __alignment::__default) + __alignment_ = __alignment::__zero_padding; + ++__begin; + return true; + } + + _LIBCPP_HIDE_FROM_ABI constexpr bool __parse_width(const _CharT*& __begin, const _CharT* __end, auto& __parse_ctx) { + if (*__begin == _CharT('0')) + std::__throw_format_error("A format-spec width field shouldn't have a leading zero"); + + if (*__begin == _CharT('{')) { + __format::__parse_number_result __r = __format_spec::__parse_arg_id(++__begin, __end, __parse_ctx); + __width_as_arg_ = true; + __width_ = __r.__value; + __begin = __r.__ptr; + return true; + } + + if (*__begin < _CharT('0') || *__begin > _CharT('9')) + return false; + + __format::__parse_number_result __r = __format::__parse_number(__begin, __end); + __width_ = __r.__value; + _LIBCPP_ASSERT(__width_ != 0, "A zero value isn't allowed and should be impossible, " + "due to validations in this function"); + __begin = __r.__ptr; + return true; + } + + _LIBCPP_HIDE_FROM_ABI constexpr bool __parse_precision(const _CharT*& __begin, const _CharT* __end, + auto& __parse_ctx) { + if (*__begin != _CharT('.')) + return false; + + ++__begin; + if (__begin == __end) + std::__throw_format_error("End of input while parsing format-spec precision"); + + if (*__begin == _CharT('{')) { + __format::__parse_number_result __arg_id = __format_spec::__parse_arg_id(++__begin, __end, __parse_ctx); + __precision_as_arg_ = true; + __precision_ = __arg_id.__value; + __begin = __arg_id.__ptr; + return true; + } + + if (*__begin < _CharT('0') || *__begin > _CharT('9')) + std::__throw_format_error("The format-spec precision field doesn't contain a value or arg-id"); + + __format::__parse_number_result __r = __format::__parse_number(__begin, __end); + __precision_ = __r.__value; + __precision_as_arg_ = false; + __begin = __r.__ptr; + return true; + } + + _LIBCPP_HIDE_FROM_ABI constexpr bool __parse_locale_specific_form(const _CharT*& __begin) { + if (*__begin != _CharT('L')) + return false; + + __locale_specific_form_ = true; + ++__begin; + return true; + } + + _LIBCPP_HIDE_FROM_ABI constexpr void __parse_type(const _CharT*& __begin) { + // Determines the type. It does not validate whether the selected type is + // valid. Most formatters have optional fields that are only allowed for + // certain types. These parsers need to do validation after the type has + // been parsed. So its easier to implement the validation for all types in + // the specific parse function. + switch (*__begin) { + case 'A': + __type_ = __type::__hexfloat_upper_case; + break; + case 'B': + __type_ = __type::__binary_upper_case; + break; + case 'E': + __type_ = __type::__scientific_upper_case; + break; + case 'F': + __type_ = __type::__fixed_upper_case; + break; + case 'G': + __type_ = __type::__general_upper_case; + break; + case 'X': + __type_ = __type::__hexadecimal_upper_case; + break; + case 'a': + __type_ = __type::__hexfloat_lower_case; + break; + case 'b': + __type_ = __type::__binary_lower_case; + break; + case 'c': + __type_ = __type::__char; + break; + case 'd': + __type_ = __type::__decimal; + break; + case 'e': + __type_ = __type::__scientific_lower_case; + break; + case 'f': + __type_ = __type::__fixed_lower_case; + break; + case 'g': + __type_ = __type::__general_lower_case; + break; + case 'o': + __type_ = __type::__octal; + break; + case 'p': + __type_ = __type::__pointer; + break; + case 's': + __type_ = __type::__string; + break; + case 'x': + __type_ = __type::__hexadecimal_lower_case; + break; +# if _LIBCPP_STD_VER > 20 + case '?': + __type_ = __type::__debug; + break; +# endif + default: + return; + } + ++__begin; + } + + _LIBCPP_HIDE_FROM_ABI + int32_t __get_width(auto& __ctx) const { + if (!__width_as_arg_) + return __width_; + + return __format_spec::__substitute_arg_id(__ctx.arg(__width_)); + } + + _LIBCPP_HIDE_FROM_ABI + int32_t __get_precision(auto& __ctx) const { + if (!__precision_as_arg_) + return __precision_; + + return __format_spec::__substitute_arg_id(__ctx.arg(__precision_)); + } +}; + +// Validates whether the reserved bitfields don't change the size. +static_assert(sizeof(__parser) == 16); +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +static_assert(sizeof(__parser) == 16); +# endif + +_LIBCPP_HIDE_FROM_ABI constexpr void __process_display_type_string(__format_spec::__type __type) { + switch (__type) { + case __format_spec::__type::__default: + case __format_spec::__type::__string: + case __format_spec::__type::__debug: + break; + + default: + std::__throw_format_error("The format-spec type has a type not supported for a string argument"); + } +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr void __process_display_type_bool_string(__parser<_CharT>& __parser) { + if (__parser.__sign_ != __sign::__default) + std::__throw_format_error("A sign field isn't allowed in this format-spec"); + + if (__parser.__alternate_form_) + std::__throw_format_error("An alternate form field isn't allowed in this format-spec"); + + if (__parser.__alignment_ == __alignment::__zero_padding) + std::__throw_format_error("A zero-padding field isn't allowed in this format-spec"); + + if (__parser.__alignment_ == __alignment::__default) + __parser.__alignment_ = __alignment::__left; +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr void __process_display_type_char(__parser<_CharT>& __parser) { + __format_spec::__process_display_type_bool_string(__parser); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr void __process_parsed_bool(__parser<_CharT>& __parser) { + switch (__parser.__type_) { + case __format_spec::__type::__default: + case __format_spec::__type::__string: + __format_spec::__process_display_type_bool_string(__parser); + break; + + case __format_spec::__type::__binary_lower_case: + case __format_spec::__type::__binary_upper_case: + case __format_spec::__type::__octal: + case __format_spec::__type::__decimal: + case __format_spec::__type::__hexadecimal_lower_case: + case __format_spec::__type::__hexadecimal_upper_case: + break; + + default: + std::__throw_format_error("The format-spec type has a type not supported for a bool argument"); + } +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr void __process_parsed_char(__parser<_CharT>& __parser) { + switch (__parser.__type_) { + case __format_spec::__type::__default: + case __format_spec::__type::__char: + case __format_spec::__type::__debug: + __format_spec::__process_display_type_char(__parser); + break; + + case __format_spec::__type::__binary_lower_case: + case __format_spec::__type::__binary_upper_case: + case __format_spec::__type::__octal: + case __format_spec::__type::__decimal: + case __format_spec::__type::__hexadecimal_lower_case: + case __format_spec::__type::__hexadecimal_upper_case: + break; + + default: + std::__throw_format_error("The format-spec type has a type not supported for a char argument"); + } +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr void __process_parsed_integer(__parser<_CharT>& __parser) { + switch (__parser.__type_) { + case __format_spec::__type::__default: + case __format_spec::__type::__binary_lower_case: + case __format_spec::__type::__binary_upper_case: + case __format_spec::__type::__octal: + case __format_spec::__type::__decimal: + case __format_spec::__type::__hexadecimal_lower_case: + case __format_spec::__type::__hexadecimal_upper_case: + break; + + case __format_spec::__type::__char: + __format_spec::__process_display_type_char(__parser); + break; + + default: + std::__throw_format_error("The format-spec type has a type not supported for an integer argument"); + } +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr void __process_parsed_floating_point(__parser<_CharT>& __parser) { + switch (__parser.__type_) { + case __format_spec::__type::__default: + case __format_spec::__type::__hexfloat_lower_case: + case __format_spec::__type::__hexfloat_upper_case: + // Precision specific behavior will be handled later. + break; + case __format_spec::__type::__scientific_lower_case: + case __format_spec::__type::__scientific_upper_case: + case __format_spec::__type::__fixed_lower_case: + case __format_spec::__type::__fixed_upper_case: + case __format_spec::__type::__general_lower_case: + case __format_spec::__type::__general_upper_case: + if (!__parser.__precision_as_arg_ && __parser.__precision_ == -1) + // Set the default precision for the call to to_chars. + __parser.__precision_ = 6; + break; + + default: + std::__throw_format_error("The format-spec type has a type not supported for a floating-point argument"); + } +} + +_LIBCPP_HIDE_FROM_ABI constexpr void __process_display_type_pointer(__format_spec::__type __type) { + switch (__type) { + case __format_spec::__type::__default: + case __format_spec::__type::__pointer: + break; + + default: + std::__throw_format_error("The format-spec type has a type not supported for a pointer argument"); + } +} + +template +struct __column_width_result { + /// The number of output columns. + size_t __width_; + /// One beyond the last code unit used in the estimation. + /// + /// This limits the original output to fit in the wanted number of columns. + const _CharT* __last_; +}; + +template +__column_width_result(size_t, const _CharT*) -> __column_width_result<_CharT>; + +/// Since a column width can be two it's possible that the requested column +/// width can't be achieved. Depending on the intended usage the policy can be +/// selected. +/// - When used as precision the maximum width may not be exceeded and the +/// result should be "rounded down" to the previous boundary. +/// - When used as a width we're done once the minimum is reached, but +/// exceeding is not an issue. Rounding down is an issue since that will +/// result in writing fill characters. Therefore the result needs to be +/// "rounded up". +enum class __column_width_rounding { __down, __up }; + +# ifndef _LIBCPP_HAS_NO_UNICODE + +namespace __detail { + +/// Converts a code point to the column width. +/// +/// The estimations are conforming to [format.string.general]/11 +/// +/// This version expects a value less than 0x1'0000, which is a 3-byte UTF-8 +/// character. +_LIBCPP_HIDE_FROM_ABI constexpr int __column_width_3(uint32_t __c) noexcept { + _LIBCPP_ASSERT(__c < 0x10000, "Use __column_width_4 or __column_width for larger values"); + + // clang-format off + return 1 + (__c >= 0x1100 && (__c <= 0x115f || + (__c >= 0x2329 && (__c <= 0x232a || + (__c >= 0x2e80 && (__c <= 0x303e || + (__c >= 0x3040 && (__c <= 0xa4cf || + (__c >= 0xac00 && (__c <= 0xd7a3 || + (__c >= 0xf900 && (__c <= 0xfaff || + (__c >= 0xfe10 && (__c <= 0xfe19 || + (__c >= 0xfe30 && (__c <= 0xfe6f || + (__c >= 0xff00 && (__c <= 0xff60 || + (__c >= 0xffe0 && (__c <= 0xffe6 + )))))))))))))))))))); + // clang-format on +} + +/// @overload +/// +/// This version expects a value greater than or equal to 0x1'0000, which is a +/// 4-byte UTF-8 character. +_LIBCPP_HIDE_FROM_ABI constexpr int __column_width_4(uint32_t __c) noexcept { + _LIBCPP_ASSERT(__c >= 0x10000, "Use __column_width_3 or __column_width for smaller values"); + + // clang-format off + return 1 + (__c >= 0x1'f300 && (__c <= 0x1'f64f || + (__c >= 0x1'f900 && (__c <= 0x1'f9ff || + (__c >= 0x2'0000 && (__c <= 0x2'fffd || + (__c >= 0x3'0000 && (__c <= 0x3'fffd + )))))))); + // clang-format on +} + +/// @overload +/// +/// The general case, accepting all values. +_LIBCPP_HIDE_FROM_ABI constexpr int __column_width(uint32_t __c) noexcept { + if (__c < 0x10000) + return __detail::__column_width_3(__c); + + return __detail::__column_width_4(__c); +} + +template +_LIBCPP_HIDE_FROM_ABI constexpr __column_width_result<_CharT> __estimate_column_width_grapheme_clustering( + const _CharT* __first, const _CharT* __last, size_t __maximum, __column_width_rounding __rounding) noexcept { + __unicode::__extended_grapheme_cluster_view<_CharT> __view{__first, __last}; + + __column_width_result<_CharT> __result{0, __first}; + while (__result.__last_ != __last && __result.__width_ <= __maximum) { + typename __unicode::__extended_grapheme_cluster_view<_CharT>::__cluster __cluster = __view.__consume(); + int __width = __detail::__column_width(__cluster.__code_point_); + + // When the next entry would exceed the maximum width the previous width + // might be returned. For example when a width of 100 is requested the + // returned width might be 99, since the next code point has an estimated + // column width of 2. This depends on the rounding flag. + // When the maximum is exceeded the loop will abort the next iteration. + if (__rounding == __column_width_rounding::__down && __result.__width_ + __width > __maximum) + return __result; + + __result.__width_ += __width; + __result.__last_ = __cluster.__last_; + } + + return __result; +} + +} // namespace __detail + +// Unicode can be stored in several formats: UTF-8, UTF-16, and UTF-32. +// Depending on format the relation between the number of code units stored and +// the number of output columns differs. The first relation is the number of +// code units forming a code point. (The text assumes the code units are +// unsigned.) +// - UTF-8 The number of code units is between one and four. The first 127 +// Unicode code points match the ASCII character set. When the highest bit is +// set it means the code point has more than one code unit. +// - UTF-16: The number of code units is between 1 and 2. When the first +// code unit is in the range [0xd800,0xdfff) it means the code point uses two +// code units. +// - UTF-32: The number of code units is always one. +// +// The code point to the number of columns is specified in +// [format.string.std]/11. This list might change in the future. +// +// Another thing to be taken into account is Grapheme clustering. This means +// that in some cases multiple code points are combined one element in the +// output. For example: +// - an ASCII character with a combined diacritical mark +// - an emoji with a skin tone modifier +// - a group of combined people emoji to create a family +// - a combination of flag emoji +// +// See also: +// - [format.string.general]/11 +// - https://en.wikipedia.org/wiki/UTF-8#Encoding +// - https://en.wikipedia.org/wiki/UTF-16#U+D800_to_U+DFFF + +_LIBCPP_HIDE_FROM_ABI constexpr bool __is_ascii(char32_t __c) { return __c < 0x80; } + +/// Determines the number of output columns needed to render the input. +/// +/// \note When the scanner encounters malformed Unicode it acts as-if every +/// code unit is a one column code point. Typically a terminal uses the same +/// strategy and replaces every malformed code unit with a one column +/// replacement character. +/// +/// \param __first Points to the first element of the input range. +/// \param __last Points beyond the last element of the input range. +/// \param __maximum The maximum number of output columns. The returned number +/// of estimated output columns will not exceed this value. +/// \param __rounding Selects the rounding method. +/// \c __down result.__width_ <= __maximum +/// \c __up result.__width_ <= __maximum + 1 +template +_LIBCPP_HIDE_FROM_ABI constexpr __column_width_result<_CharT> __estimate_column_width( + basic_string_view<_CharT> __str, size_t __maximum, __column_width_rounding __rounding) noexcept { + // The width estimation is done in two steps: + // - Quickly process for the ASCII part. ASCII has the following properties + // - One code unit is one code point + // - Every code point has an estimated width of one + // - When needed it will a Unicode Grapheme clustering algorithm to find + // the proper place for truncation. + + if (__str.empty() || __maximum == 0) + return {0, __str.begin()}; + + // ASCII has one caveat; when an ASCII character is followed by a non-ASCII + // character they might be part of an extended grapheme cluster. For example: + // an ASCII letter and a COMBINING ACUTE ACCENT + // The truncate should happen after the COMBINING ACUTE ACCENT. Therefore we + // need to scan one code unit beyond the requested precision. When this code + // unit is non-ASCII we omit the current code unit and let the Grapheme + // clustering algorithm do its work. + const _CharT* __it = __str.begin(); + if (__format_spec::__is_ascii(*__it)) { + do { + --__maximum; + ++__it; + if (__it == __str.end()) + return {__str.size(), __str.end()}; + + if (__maximum == 0) { + if (__format_spec::__is_ascii(*__it)) + return {static_cast(__it - __str.begin()), __it}; + + break; + } + } while (__format_spec::__is_ascii(*__it)); + --__it; + ++__maximum; + } + + ptrdiff_t __ascii_size = __it - __str.begin(); + __column_width_result __result = + __detail::__estimate_column_width_grapheme_clustering(__it, __str.end(), __maximum, __rounding); + + __result.__width_ += __ascii_size; + return __result; +} +# else // !defined(_LIBCPP_HAS_NO_UNICODE) +template +_LIBCPP_HIDE_FROM_ABI constexpr __column_width_result<_CharT> +__estimate_column_width(basic_string_view<_CharT> __str, size_t __maximum, __column_width_rounding) noexcept { + // When Unicode isn't supported assume ASCII and every code unit is one code + // point. In ASCII the estimated column width is always one. Thus there's no + // need for rounding. + size_t __width_ = _VSTD::min(__str.size(), __maximum); + return {__width_, __str.begin() + __width_}; +} + +# endif // !defined(_LIBCPP_HAS_NO_UNICODE) + +} // namespace __format_spec + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___FORMAT_PARSER_STD_FORMAT_SPEC_H diff --git a/app/src/main/cpp/libcxx/include/__format/range_default_formatter.h b/app/src/main/cpp/libcxx/include/__format/range_default_formatter.h new file mode 100644 index 0000000..774887b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/range_default_formatter.h @@ -0,0 +1,201 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_RANGE_DEFAULT_FORMATTER_H +#define _LIBCPP___FORMAT_RANGE_DEFAULT_FORMATTER_H + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#include <__availability> +#include <__chrono/statically_widen.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/concepts.h> +#include <__format/formatter.h> +#include <__format/range_formatter.h> +#include <__ranges/concepts.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/pair.h> +#include +#include + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 20 + +template +concept __const_formattable_range = + ranges::input_range && formattable, _CharT>; + +template +using __fmt_maybe_const = conditional_t<__const_formattable_range<_Rp, _CharT>, const _Rp, _Rp>; + +_LIBCPP_DIAGNOSTIC_PUSH +_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wshadow") +_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wshadow") +// This shadows map, set, and string. +enum class range_format { disabled, map, set, sequence, string, debug_string }; +_LIBCPP_DIAGNOSTIC_POP + +// There is no definition of this struct, it's purely intended to be used to +// generate diagnostics. +template +struct _LIBCPP_TEMPLATE_VIS __instantiated_the_primary_template_of_format_kind; + +template +constexpr range_format format_kind = [] { + // [format.range.fmtkind]/1 + // A program that instantiates the primary template of format_kind is ill-formed. + static_assert(sizeof(_Rp) != sizeof(_Rp), "create a template specialization of format_kind for your type"); + return range_format::disabled; +}(); + +template + requires same_as<_Rp, remove_cvref_t<_Rp>> +inline constexpr range_format format_kind<_Rp> = [] { + // [format.range.fmtkind]/2 + + // 2.1 If same_as>, R> is true, + // Otherwise format_kind is range_format::disabled. + if constexpr (same_as>, _Rp>) + return range_format::disabled; + // 2.2 Otherwise, if the qualified-id R::key_type is valid and denotes a type: + else if constexpr (requires { typename _Rp::key_type; }) { + // 2.2.1 If the qualified-id R::mapped_type is valid and denotes a type ... + if constexpr (requires { typename _Rp::mapped_type; } && + // 2.2.1 ... If either U is a specialization of pair or U is a specialization + // of tuple and tuple_size_v == 2 + __fmt_pair_like>>) + return range_format::map; + else + // 2.2.2 Otherwise format_kind is range_format::set. + return range_format::set; + } else + // 2.3 Otherwise, format_kind is range_format::sequence. + return range_format::sequence; +}(); + +// This is a non-standard work-around to fix instantiation of +// formatter +// const _CharT[N] satisfies the ranges::input_range concept. +// remove_cvref_t is _CharT[N] so it does not satisfy the +// requirement of the above specialization. Instead it will instantiate the +// primary template, which is ill-formed. +// +// An alternative solution is to remove the offending formatter. +// +// https://godbolt.org/z/bqjhhaexx +// +// The removal is proposed in LWG3833, but use the work-around until the issue +// has been adopted. +// TODO FMT Implement LWG3833. +template +inline constexpr range_format format_kind = range_format::disabled; + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __range_default_formatter; + +// Required specializations + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __range_default_formatter { +private: + using __maybe_const_r = __fmt_maybe_const<_Rp, _CharT>; + range_formatter>, _CharT> __underlying_; + +public: + _LIBCPP_HIDE_FROM_ABI constexpr void set_separator(basic_string_view<_CharT> __separator) { + __underlying_.set_separator(__separator); + } + _LIBCPP_HIDE_FROM_ABI constexpr void + set_brackets(basic_string_view<_CharT> __opening_bracket, basic_string_view<_CharT> __closing_bracket) { + __underlying_.set_brackets(__opening_bracket, __closing_bracket); + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) { + return __underlying_.parse(__ctx); + } + + template + _LIBCPP_HIDE_FROM_ABI typename FormatContext::iterator format(__maybe_const_r& __range, FormatContext& __ctx) const { + return __underlying_.format(__range, __ctx); + } +}; + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __range_default_formatter { +private: + using __maybe_const_map = __fmt_maybe_const<_Rp, _CharT>; + using __element_type = remove_cvref_t>; + range_formatter<__element_type, _CharT> __underlying_; + +public: + _LIBCPP_HIDE_FROM_ABI constexpr __range_default_formatter() + requires(__fmt_pair_like<__element_type>) + { + __underlying_.set_brackets(_LIBCPP_STATICALLY_WIDEN(_CharT, "{"), _LIBCPP_STATICALLY_WIDEN(_CharT, "}")); + __underlying_.underlying().set_brackets({}, {}); + __underlying_.underlying().set_separator(_LIBCPP_STATICALLY_WIDEN(_CharT, ": ")); + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) { + return __underlying_.parse(__ctx); + } + + template + _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator + format(__maybe_const_map& __range, _FormatContext& __ctx) const { + return __underlying_.format(__range, __ctx); + } +}; + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __range_default_formatter { +private: + using __maybe_const_set = __fmt_maybe_const<_Rp, _CharT>; + using __element_type = remove_cvref_t>; + range_formatter<__element_type, _CharT> __underlying_; + +public: + _LIBCPP_HIDE_FROM_ABI constexpr __range_default_formatter() { + __underlying_.set_brackets(_LIBCPP_STATICALLY_WIDEN(_CharT, "{"), _LIBCPP_STATICALLY_WIDEN(_CharT, "}")); + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __ctx) { + return __underlying_.parse(__ctx); + } + + template + _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator + format(__maybe_const_set& __range, _FormatContext& __ctx) const { + return __underlying_.format(__range, __ctx); + } +}; + +template + requires(_Kp == range_format::string || _Kp == range_format::debug_string) +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT __range_default_formatter<_Kp, _Rp, _CharT> { + __range_default_formatter() = delete; // TODO FMT Implement +}; + +template + requires(format_kind<_Rp> != range_format::disabled && formattable, _CharT>) +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<_Rp, _CharT> + : __range_default_formatter, _Rp, _CharT> {}; + +#endif //_LIBCPP_STD_VER > 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_RANGE_DEFAULT_FORMATTER_H diff --git a/app/src/main/cpp/libcxx/include/__format/range_formatter.h b/app/src/main/cpp/libcxx/include/__format/range_formatter.h new file mode 100644 index 0000000..9ea61a7 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/range_formatter.h @@ -0,0 +1,255 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_RANGE_FORMATTER_H +#define _LIBCPP___FORMAT_RANGE_FORMATTER_H + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#include <__algorithm/ranges_copy.h> +#include <__availability> +#include <__chrono/statically_widen.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__format/buffer.h> +#include <__format/concepts.h> +#include <__format/format_args.h> +#include <__format/format_context.h> +#include <__format/format_error.h> +#include <__format/formatter.h> +#include <__format/formatter_output.h> +#include <__format/parser_std_format_spec.h> +#include <__iterator/back_insert_iterator.h> +#include <__ranges/concepts.h> +#include <__ranges/data.h> +#include <__ranges/size.h> +#include <__type_traits/remove_cvref.h> +#include + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 20 + +template + requires same_as, _Tp> && formattable<_Tp, _CharT> +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT range_formatter { + _LIBCPP_HIDE_FROM_ABI constexpr void set_separator(basic_string_view<_CharT> __separator) { + __separator_ = __separator; + } + _LIBCPP_HIDE_FROM_ABI constexpr void + set_brackets(basic_string_view<_CharT> __opening_bracket, basic_string_view<_CharT> __closing_bracket) { + __opening_bracket_ = __opening_bracket; + __closing_bracket_ = __closing_bracket; + } + + _LIBCPP_HIDE_FROM_ABI constexpr formatter<_Tp, _CharT>& underlying() { return __underlying_; } + _LIBCPP_HIDE_FROM_ABI constexpr const formatter<_Tp, _CharT>& underlying() const { return __underlying_; } + + template + _LIBCPP_HIDE_FROM_ABI constexpr typename _ParseContext::iterator parse(_ParseContext& __parse_ctx) { + const _CharT* __begin = __parser_.__parse(__parse_ctx, __format_spec::__fields_range); + const _CharT* __end = __parse_ctx.end(); + if (__begin == __end) + return __begin; + + // The n field overrides a possible m type, therefore delay applying the + // effect of n until the type has been procesed. + bool __clear_brackets = (*__begin == _CharT('n')); + if (__clear_brackets) { + ++__begin; + if (__begin == __end) { + // Since there is no more data, clear the brackets before returning. + set_brackets({}, {}); + return __begin; + } + } + + __parse_type(__begin, __end); + if (__clear_brackets) + set_brackets({}, {}); + if (__begin == __end) + return __begin; + + bool __has_range_underlying_spec = *__begin == _CharT(':'); + if (__parser_.__type_ != __format_spec::__type::__default) { + // [format.range.formatter]/6 + // If the range-type is s or ?s, then there shall be no n option and no + // range-underlying-spec. + if (__clear_brackets) { + if (__parser_.__type_ == __format_spec::__type::__string) + std::__throw_format_error("The n option and type s can't be used together"); + std::__throw_format_error("The n option and type ?s can't be used together"); + } + if (__has_range_underlying_spec) { + if (__parser_.__type_ == __format_spec::__type::__string) + std::__throw_format_error("Type s and an underlying format specification can't be used together"); + std::__throw_format_error("Type ?s and an underlying format specification can't be used together"); + } + } else if (!__has_range_underlying_spec) + std::__set_debug_format(__underlying_); + + if (__has_range_underlying_spec) { + // range-underlying-spec: + // : format-spec + ++__begin; + if (__begin == __end) + return __begin; + + __parse_ctx.advance_to(__begin); + __begin = __underlying_.parse(__parse_ctx); + } + + if (__begin != __end && *__begin != _CharT('}')) + std::__throw_format_error("The format-spec should consume the input or end with a '}'"); + + return __begin; + } + + template + requires formattable, _CharT> && + same_as>, _Tp> + _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(_Rp&& __range, _FormatContext& __ctx) const { + __format_spec::__parsed_specifications<_CharT> __specs = __parser_.__get_parsed_std_specifications(__ctx); + + if (!__specs.__has_width()) + return __format_range(__range, __ctx, __specs); + + // The size of the buffer needed is: + // - open bracket characters + // - close bracket character + // - n elements where every element may have a different size + // - (n -1) separators + // The size of the element is hard to predict, knowing the type helps but + // it depends on the format-spec. As an initial estimate we guess 6 + // characters. + // Typically both brackets are 1 character and the separator is 2 + // characters. Which means there will be + // (n - 1) * 2 + 1 + 1 = n * 2 character + // So estimate 8 times the range size as buffer. + std::size_t __capacity_hint = 0; + if constexpr (std::ranges::sized_range<_Rp>) + __capacity_hint = 8 * ranges::size(__range); + __format::__retarget_buffer<_CharT> __buffer{__capacity_hint}; + basic_format_context::__iterator, _CharT> __c{ + __buffer.__make_output_iterator(), __ctx}; + + __format_range(__range, __c, __specs); + + return __formatter::__write_string_no_precision(__buffer.__view(), __ctx.out(), __specs); + } + + template + typename _FormatContext::iterator _LIBCPP_HIDE_FROM_ABI + __format_range(_Rp&& __range, _FormatContext& __ctx, __format_spec::__parsed_specifications<_CharT> __specs) const { + if constexpr (same_as<_Tp, _CharT>) { + switch (__specs.__std_.__type_) { + case __format_spec::__type::__string: + case __format_spec::__type::__debug: + return __format_as_string(__range, __ctx, __specs.__std_.__type_ == __format_spec::__type::__debug); + default: + return __format_as_sequence(__range, __ctx); + } + } else + return __format_as_sequence(__range, __ctx); + } + + template + _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator + __format_as_string(_Rp&& __range, _FormatContext& __ctx, bool __debug_format) const { + // When the range is contiguous use a basic_string_view instead to avoid a + // copy of the underlying data. The basic_string_view formatter + // specialization is the "basic" string formatter in libc++. + if constexpr (ranges::contiguous_range<_Rp> && std::ranges::sized_range<_Rp>) { + std::formatter, _CharT> __formatter; + if (__debug_format) + __formatter.set_debug_format(); + return __formatter.format( + basic_string_view<_CharT>{ + ranges::data(__range), + ranges::size(__range), + }, + __ctx); + } else { + std::formatter, _CharT> __formatter; + if (__debug_format) + __formatter.set_debug_format(); + // P2106's from_range has not been implemented yet. Instead use a simple + // copy operation. + // TODO FMT use basic_string's "from_range" constructor. + // return std::formatter, _CharT>{}.format(basic_string<_CharT>{from_range, __range}, __ctx); + basic_string<_CharT> __str; + ranges::copy(__range, back_insert_iterator{__str}); + return __formatter.format(__str, __ctx); + } + } + + template + _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator + __format_as_sequence(_Rp&& __range, _FormatContext& __ctx) const { + __ctx.advance_to(ranges::copy(__opening_bracket_, __ctx.out()).out); + bool __use_separator = false; + for (auto&& __e : __range) { + if (__use_separator) + __ctx.advance_to(ranges::copy(__separator_, __ctx.out()).out); + else + __use_separator = true; + + __ctx.advance_to(__underlying_.format(__e, __ctx)); + } + + return ranges::copy(__closing_bracket_, __ctx.out()).out; + } + + __format_spec::__parser<_CharT> __parser_{.__alignment_ = __format_spec::__alignment::__left}; + +private: + _LIBCPP_HIDE_FROM_ABI constexpr void __parse_type(const _CharT*& __begin, const _CharT* __end) { + switch (*__begin) { + case _CharT('m'): + if constexpr (__fmt_pair_like<_Tp>) { + set_brackets(_LIBCPP_STATICALLY_WIDEN(_CharT, "{"), _LIBCPP_STATICALLY_WIDEN(_CharT, "}")); + set_separator(_LIBCPP_STATICALLY_WIDEN(_CharT, ", ")); + ++__begin; + } else + std::__throw_format_error("The range-format-spec type m requires two elements for a pair or tuple"); + break; + + case _CharT('s'): + if constexpr (same_as<_Tp, _CharT>) { + __parser_.__type_ = __format_spec::__type::__string; + ++__begin; + } else + std::__throw_format_error("The range-format-spec type s requires formatting a character type"); + break; + + case _CharT('?'): + ++__begin; + if (__begin == __end || *__begin != _CharT('s')) + std::__throw_format_error("The format-spec should consume the input or end with a '}'"); + if constexpr (same_as<_Tp, _CharT>) { + __parser_.__type_ = __format_spec::__type::__debug; + ++__begin; + } else + std::__throw_format_error("The range-format-spec type ?s requires formatting a character type"); + } + } + + formatter<_Tp, _CharT> __underlying_; + basic_string_view<_CharT> __separator_ = _LIBCPP_STATICALLY_WIDEN(_CharT, ", "); + basic_string_view<_CharT> __opening_bracket_ = _LIBCPP_STATICALLY_WIDEN(_CharT, "["); + basic_string_view<_CharT> __closing_bracket_ = _LIBCPP_STATICALLY_WIDEN(_CharT, "]"); +}; + +#endif //_LIBCPP_STD_VER > 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_RANGE_FORMATTER_H diff --git a/app/src/main/cpp/libcxx/include/__format/unicode.h b/app/src/main/cpp/libcxx/include/__format/unicode.h new file mode 100644 index 0000000..4327258 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__format/unicode.h @@ -0,0 +1,489 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FORMAT_UNICODE_H +#define _LIBCPP___FORMAT_UNICODE_H + +#include <__assert> +#include <__config> +#include <__format/extended_grapheme_cluster_table.h> +#include <__type_traits/make_unsigned.h> +#include <__utility/unreachable.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace __unicode { + +# if _LIBCPP_STD_VER > 20 + +/// The result of consuming a code point using P2286' semantics +/// +/// TODO FMT Combine __consume and __consume_p2286 in one function. +struct __consume_p2286_result { + // A size of 0 means well formed. This to differenciate between + // a valid code point and a code unit that's invalid like 0b11111xxx. + int __ill_formed_size; + + // If well formed the consumed code point. + // Otherwise the ill-formed code units as unsigned 8-bit values. They are + // stored in reverse order, to make it easier to extract the values. + char32_t __value; +}; + +# endif // _LIBCPP_STD_VER > 20 + +# ifndef _LIBCPP_HAS_NO_UNICODE + +/// Implements the grapheme cluster boundary rules +/// +/// These rules are used to implement format's width estimation as stated in +/// [format.string.std]/11 +/// +/// The Standard refers to UAX \#29 for Unicode 12.0.0 +/// https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules +/// +/// The data tables used are +/// https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt +/// https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt +/// https://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakTest.txt (for testing only) + +inline constexpr char32_t __replacement_character = U'\ufffd'; + +_LIBCPP_HIDE_FROM_ABI constexpr bool __is_continuation(const char* __char, int __count) { + do { + if ((*__char & 0b1000'0000) != 0b1000'0000) + return false; + --__count; + ++__char; + } while (__count); + return true; +} + +/// Helper class to extract a code unit from a Unicode character range. +/// +/// The stored range is a view. There are multiple specialization for different +/// character types. +template +class __code_point_view; + +/// UTF-8 specialization. +template <> +class __code_point_view { +public: + _LIBCPP_HIDE_FROM_ABI constexpr explicit __code_point_view(const char* __first, const char* __last) + : __first_(__first), __last_(__last) {} + + _LIBCPP_HIDE_FROM_ABI constexpr bool __at_end() const noexcept { return __first_ == __last_; } + _LIBCPP_HIDE_FROM_ABI constexpr const char* __position() const noexcept { return __first_; } + + _LIBCPP_HIDE_FROM_ABI constexpr char32_t __consume() noexcept { + _LIBCPP_ASSERT(__first_ != __last_, "can't move beyond the end of input"); + + // Based on the number of leading 1 bits the number of code units in the + // code point can be determined. See + // https://en.wikipedia.org/wiki/UTF-8#Encoding + switch (_VSTD::countl_one(static_cast(*__first_))) { + case 0: + return *__first_++; + + case 2: + if (__last_ - __first_ < 2 || !__unicode::__is_continuation(__first_ + 1, 1)) [[unlikely]] + break; + else { + char32_t __value = static_cast(*__first_++) & 0x1f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + return __value; + } + + case 3: + if (__last_ - __first_ < 3 || !__unicode::__is_continuation(__first_ + 1, 2)) [[unlikely]] + break; + else { + char32_t __value = static_cast(*__first_++) & 0x0f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + return __value; + } + + case 4: + if (__last_ - __first_ < 4 || !__unicode::__is_continuation(__first_ + 1, 3)) [[unlikely]] + break; + else { + char32_t __value = static_cast(*__first_++) & 0x07; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + return __value; + } + } + // An invalid number of leading ones can be garbage or a code unit in the + // middle of a code point. By consuming one code unit the parser may get + // "in sync" after a few code units. + ++__first_; + return __replacement_character; + } + +# if _LIBCPP_STD_VER > 20 + _LIBCPP_HIDE_FROM_ABI constexpr __consume_p2286_result __consume_p2286() noexcept { + _LIBCPP_ASSERT(__first_ != __last_, "can't move beyond the end of input"); + + // Based on the number of leading 1 bits the number of code units in the + // code point can be determined. See + // https://en.wikipedia.org/wiki/UTF-8#Encoding + switch (std::countl_one(static_cast(*__first_))) { + case 0: + return {0, static_cast(*__first_++)}; + + case 2: + if (__last_ - __first_ < 2) [[unlikely]] + break; + + if (__unicode::__is_continuation(__first_ + 1, 1)) { + char32_t __value = static_cast(*__first_++) & 0x1f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + return {0, __value}; + } + break; + + case 3: + if (__last_ - __first_ < 3) [[unlikely]] + break; + + if (__unicode::__is_continuation(__first_ + 1, 2)) { + char32_t __value = static_cast(*__first_++) & 0x0f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + return {0, __value}; + } + break; + + case 4: + if (__last_ - __first_ < 4) [[unlikely]] + break; + + if (__unicode::__is_continuation(__first_ + 1, 3)) { + char32_t __value = static_cast(*__first_++) & 0x07; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + __value <<= 6; + __value |= static_cast(*__first_++) & 0x3f; + + if (__value > 0x10FFFF) // Outside the valid Unicode range? + return {4, __value}; + + return {0, __value}; + } + break; + } + // An invalid number of leading ones can be garbage or a code unit in the + // middle of a code point. By consuming one code unit the parser may get + // "in sync" after a few code units. + return {1, static_cast(*__first_++)}; + } +# endif // _LIBCPP_STD_VER > 20 + +private: + const char* __first_; + const char* __last_; +}; + +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +_LIBCPP_HIDE_FROM_ABI constexpr bool __is_surrogate_pair_high(wchar_t __value) { + return __value >= 0xd800 && __value <= 0xdbff; +} + +_LIBCPP_HIDE_FROM_ABI constexpr bool __is_surrogate_pair_low(wchar_t __value) { + return __value >= 0xdc00 && __value <= 0xdfff; +} + +/// This specialization depends on the size of wchar_t +/// - 2 UTF-16 (for example Windows and AIX) +/// - 4 UTF-32 (for example Linux) +template <> +class __code_point_view { +public: + static_assert(sizeof(wchar_t) == 2 || sizeof(wchar_t) == 4, "sizeof(wchar_t) has a not implemented value"); + + _LIBCPP_HIDE_FROM_ABI constexpr explicit __code_point_view(const wchar_t* __first, const wchar_t* __last) + : __first_(__first), __last_(__last) {} + + _LIBCPP_HIDE_FROM_ABI constexpr const wchar_t* __position() const noexcept { return __first_; } + _LIBCPP_HIDE_FROM_ABI constexpr bool __at_end() const noexcept { return __first_ == __last_; } + + _LIBCPP_HIDE_FROM_ABI constexpr char32_t __consume() noexcept { + _LIBCPP_ASSERT(__first_ != __last_, "can't move beyond the end of input"); + + if constexpr (sizeof(wchar_t) == 2) { + char32_t __result = *__first_++; + // Is the code unit part of a surrogate pair? See + // https://en.wikipedia.org/wiki/UTF-16#U+D800_to_U+DFFF + if (__result >= 0xd800 && __result <= 0xDfff) { + // Malformed Unicode. + if (__first_ == __last_) [[unlikely]] + return __replacement_character; + + __result -= 0xd800; + __result <<= 10; + __result += *__first_++ - 0xdc00; + __result += 0x10000; + } + return __result; + + } else if constexpr (sizeof(wchar_t) == 4) { + char32_t __result = *__first_++; + if (__result > 0x10FFFF) [[unlikely]] + return __replacement_character; + return __result; + } else { + __libcpp_unreachable(); + } + } + +# if _LIBCPP_STD_VER > 20 + _LIBCPP_HIDE_FROM_ABI constexpr __consume_p2286_result __consume_p2286() noexcept { + _LIBCPP_ASSERT(__first_ != __last_, "can't move beyond the end of input"); + + char32_t __result = *__first_++; + if constexpr (sizeof(wchar_t) == 2) { + // https://en.wikipedia.org/wiki/UTF-16#U+D800_to_U+DFFF + if (__is_surrogate_pair_high(__result)) { + // Malformed Unicode. + if (__first_ == __last_ || !__is_surrogate_pair_low(*(__first_ + 1))) [[unlikely]] + return {1, __result}; + + __result -= 0xd800; + __result <<= 10; + __result += *__first_++ - 0xdc00; + __result += 0x10000; + } else if (__is_surrogate_pair_low(__result)) + // A code point shouldn't start with the low surrogate pair + return {1, __result}; + } else { + if (__result > 0x10FFFF) [[unlikely]] + return {1, __result}; + } + + return {0, __result}; + } +# endif // _LIBCPP_STD_VER > 20 + +private: + const wchar_t* __first_; + const wchar_t* __last_; +}; +# endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS + +_LIBCPP_HIDE_FROM_ABI constexpr bool __at_extended_grapheme_cluster_break( + bool& __ri_break_allowed, + bool __has_extened_pictographic, + __extended_grapheme_custer_property_boundary::__property __prev, + __extended_grapheme_custer_property_boundary::__property __next) { + using __extended_grapheme_custer_property_boundary::__property; + + __has_extened_pictographic |= __prev == __property::__Extended_Pictographic; + + // https://www.unicode.org/reports/tr29/tr29-39.html#Grapheme_Cluster_Boundary_Rules + + // *** Break at the start and end of text, unless the text is empty. *** + + _LIBCPP_ASSERT(__prev != __property::__sot, "should be handled in the constructor"); // GB1 + _LIBCPP_ASSERT(__prev != __property::__eot, "should be handled by our caller"); // GB2 + + // *** Do not break between a CR and LF. Otherwise, break before and after controls. *** + if (__prev == __property::__CR && __next == __property::__LF) // GB3 + return false; + + if (__prev == __property::__Control || __prev == __property::__CR || __prev == __property::__LF) // GB4 + return true; + + if (__next == __property::__Control || __next == __property::__CR || __next == __property::__LF) // GB5 + return true; + + // *** Do not break Hangul syllable sequences. *** + if (__prev == __property::__L && + (__next == __property::__L || __next == __property::__V || __next == __property::__LV || + __next == __property::__LVT)) // GB6 + return false; + + if ((__prev == __property::__LV || __prev == __property::__V) && + (__next == __property::__V || __next == __property::__T)) // GB7 + return false; + + if ((__prev == __property::__LVT || __prev == __property::__T) && __next == __property::__T) // GB8 + return false; + + // *** Do not break before extending characters or ZWJ. *** + if (__next == __property::__Extend || __next == __property::__ZWJ) + return false; // GB9 + + // *** Do not break before SpacingMarks, or after Prepend characters. *** + if (__next == __property::__SpacingMark) // GB9a + return false; + + if (__prev == __property::__Prepend) // GB9b + return false; + + // *** Do not break within emoji modifier sequences or emoji zwj sequences. *** + + // GB11 \p{Extended_Pictographic} Extend* ZWJ x \p{Extended_Pictographic} + // + // Note that several parts of this rule are matched by GB9: Any x (Extend | ZWJ) + // - \p{Extended_Pictographic} x Extend + // - Extend x Extend + // - \p{Extended_Pictographic} x ZWJ + // - Extend x ZWJ + // + // So the only case left to test is + // - \p{Extended_Pictographic}' x ZWJ x \p{Extended_Pictographic} + // where \p{Extended_Pictographic}' is stored in __has_extened_pictographic + if (__has_extened_pictographic && __prev == __property::__ZWJ && __next == __property::__Extended_Pictographic) + return false; + + // *** Do not break within emoji flag sequences *** + + // That is, do not break between regional indicator (RI) symbols if there + // is an odd number of RI characters before the break point. + + if (__prev == __property::__Regional_Indicator && __next == __property::__Regional_Indicator) { // GB12 + GB13 + __ri_break_allowed = !__ri_break_allowed; + return __ri_break_allowed; + } + + // *** Otherwise, break everywhere. *** + return true; // GB999 +} + +/// Helper class to extract an extended grapheme cluster from a Unicode character range. +/// +/// This function is used to determine the column width of an extended grapheme +/// cluster. In order to do that only the first code point is evaluated. +/// Therefore only this code point is extracted. +template +class __extended_grapheme_cluster_view { +public: + _LIBCPP_HIDE_FROM_ABI constexpr explicit __extended_grapheme_cluster_view(const _CharT* __first, const _CharT* __last) + : __code_point_view_(__first, __last), + __next_code_point_(__code_point_view_.__consume()), + __next_prop_(__extended_grapheme_custer_property_boundary::__get_property(__next_code_point_)) {} + + struct __cluster { + /// The first code point of the extended grapheme cluster. + /// + /// The first code point is used to estimate the width of the extended + /// grapheme cluster. + char32_t __code_point_; + + /// Points one beyond the last code unit in the extended grapheme cluster. + /// + /// It's expected the caller has the start position and thus can determine + /// the code unit range of the extended grapheme cluster. + const _CharT* __last_; + }; + + _LIBCPP_HIDE_FROM_ABI constexpr __cluster __consume() { + _LIBCPP_ASSERT( + __next_prop_ != __extended_grapheme_custer_property_boundary::__property::__eot, + "can't move beyond the end of input"); + char32_t __code_point = __next_code_point_; + if (!__code_point_view_.__at_end()) + return {__code_point, __get_break()}; + + __next_prop_ = __extended_grapheme_custer_property_boundary::__property::__eot; + return {__code_point, __code_point_view_.__position()}; + } + +private: + __code_point_view<_CharT> __code_point_view_; + + char32_t __next_code_point_; + __extended_grapheme_custer_property_boundary::__property __next_prop_; + + _LIBCPP_HIDE_FROM_ABI constexpr const _CharT* __get_break() { + bool __ri_break_allowed = true; + bool __has_extened_pictographic = false; + while (true) { + const _CharT* __result = __code_point_view_.__position(); + __extended_grapheme_custer_property_boundary::__property __prev = __next_prop_; + if (__code_point_view_.__at_end()) { + __next_prop_ = __extended_grapheme_custer_property_boundary::__property::__eot; + return __result; + } + __next_code_point_ = __code_point_view_.__consume(); + __next_prop_ = __extended_grapheme_custer_property_boundary::__get_property(__next_code_point_); + + __has_extened_pictographic |= + __prev == __extended_grapheme_custer_property_boundary::__property::__Extended_Pictographic; + + if (__at_extended_grapheme_cluster_break(__ri_break_allowed, __has_extened_pictographic, __prev, __next_prop_)) + return __result; + } + } +}; + +template +__extended_grapheme_cluster_view(const _CharT*, const _CharT*) -> __extended_grapheme_cluster_view<_CharT>; + +# else // _LIBCPP_HAS_NO_UNICODE + +// For ASCII every character is a "code point". +// This makes it easier to write code agnostic of the _LIBCPP_HAS_NO_UNICODE define. +template +class __code_point_view { +public: + _LIBCPP_HIDE_FROM_ABI constexpr explicit __code_point_view(const _CharT* __first, const _CharT* __last) + : __first_(__first), __last_(__last) {} + + _LIBCPP_HIDE_FROM_ABI constexpr bool __at_end() const noexcept { return __first_ == __last_; } + _LIBCPP_HIDE_FROM_ABI constexpr const _CharT* __position() const noexcept { return __first_; } + + _LIBCPP_HIDE_FROM_ABI constexpr char32_t __consume() noexcept { + _LIBCPP_ASSERT(__first_ != __last_, "can't move beyond the end of input"); + return *__first_++; + } + +# if _LIBCPP_STD_VER > 20 + _LIBCPP_HIDE_FROM_ABI constexpr __consume_p2286_result __consume_p2286() noexcept { + _LIBCPP_ASSERT(__first_ != __last_, "can't move beyond the end of input"); + + return {0, std::make_unsigned_t<_CharT>(*__first_++)}; + } +# endif // _LIBCPP_STD_VER > 20 + +private: + const _CharT* __first_; + const _CharT* __last_; +}; + +# endif // _LIBCPP_HAS_NO_UNICODE + +} // namespace __unicode + +#endif //_LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FORMAT_UNICODE_H diff --git a/app/src/main/cpp/libcxx/include/__functional/binary_function.h b/app/src/main/cpp/libcxx/include/__functional/binary_function.h new file mode 100644 index 0000000..fdedb8b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/binary_function.h @@ -0,0 +1,54 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_BINARY_FUNCTION_H +#define _LIBCPP___FUNCTIONAL_BINARY_FUNCTION_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION) + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binary_function +{ + typedef _Arg1 first_argument_type; + typedef _Arg2 second_argument_type; + typedef _Result result_type; +}; + +#endif // _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION) + +template struct __binary_function_keep_layout_base { +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using first_argument_type _LIBCPP_DEPRECATED_IN_CXX17 = _Arg1; + using second_argument_type _LIBCPP_DEPRECATED_IN_CXX17 = _Arg2; + using result_type _LIBCPP_DEPRECATED_IN_CXX17 = _Result; +#endif +}; + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION) +_LIBCPP_DIAGNOSTIC_PUSH +_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wdeprecated-declarations") +template +using __binary_function = binary_function<_Arg1, _Arg2, _Result>; +_LIBCPP_DIAGNOSTIC_POP +#else +template +using __binary_function = __binary_function_keep_layout_base<_Arg1, _Arg2, _Result>; +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_BINARY_FUNCTION_H diff --git a/app/src/main/cpp/libcxx/include/__functional/binary_negate.h b/app/src/main/cpp/libcxx/include/__functional/binary_negate.h new file mode 100644 index 0000000..73ecea9 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/binary_negate.h @@ -0,0 +1,50 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_BINARY_NEGATE_H +#define _LIBCPP___FUNCTIONAL_BINARY_NEGATE_H + +#include <__config> +#include <__functional/binary_function.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_NEGATORS) + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 binary_negate + : public __binary_function +{ + _Predicate __pred_; +public: + _LIBCPP_INLINE_VISIBILITY explicit _LIBCPP_CONSTEXPR_SINCE_CXX14 + binary_negate(const _Predicate& __pred) : __pred_(__pred) {} + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const typename _Predicate::first_argument_type& __x, + const typename _Predicate::second_argument_type& __y) const + {return !__pred_(__x, __y);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY +binary_negate<_Predicate> +not2(const _Predicate& __pred) {return binary_negate<_Predicate>(__pred);} + +#endif // _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_NEGATORS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_BINARY_NEGATE_H diff --git a/app/src/main/cpp/libcxx/include/__functional/bind.h b/app/src/main/cpp/libcxx/include/__functional/bind.h new file mode 100644 index 0000000..297e4e5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/bind.h @@ -0,0 +1,389 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_BIND_H +#define _LIBCPP___FUNCTIONAL_BIND_H + +#include <__config> +#include <__functional/invoke.h> +#include <__functional/weak_result_type.h> +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct is_bind_expression : _If< + _IsSame<_Tp, __remove_cvref_t<_Tp> >::value, + false_type, + is_bind_expression<__remove_cvref_t<_Tp> > +> {}; + +#if _LIBCPP_STD_VER > 14 +template +inline constexpr size_t is_bind_expression_v = is_bind_expression<_Tp>::value; +#endif + +template +struct is_placeholder : _If< + _IsSame<_Tp, __remove_cvref_t<_Tp> >::value, + integral_constant, + is_placeholder<__remove_cvref_t<_Tp> > +> {}; + +#if _LIBCPP_STD_VER > 14 +template +inline constexpr size_t is_placeholder_v = is_placeholder<_Tp>::value; +#endif + +namespace placeholders +{ + +template struct __ph {}; + +#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY) +_LIBCPP_FUNC_VIS extern const __ph<1> _1; +_LIBCPP_FUNC_VIS extern const __ph<2> _2; +_LIBCPP_FUNC_VIS extern const __ph<3> _3; +_LIBCPP_FUNC_VIS extern const __ph<4> _4; +_LIBCPP_FUNC_VIS extern const __ph<5> _5; +_LIBCPP_FUNC_VIS extern const __ph<6> _6; +_LIBCPP_FUNC_VIS extern const __ph<7> _7; +_LIBCPP_FUNC_VIS extern const __ph<8> _8; +_LIBCPP_FUNC_VIS extern const __ph<9> _9; +_LIBCPP_FUNC_VIS extern const __ph<10> _10; +#else +/* inline */ constexpr __ph<1> _1{}; +/* inline */ constexpr __ph<2> _2{}; +/* inline */ constexpr __ph<3> _3{}; +/* inline */ constexpr __ph<4> _4{}; +/* inline */ constexpr __ph<5> _5{}; +/* inline */ constexpr __ph<6> _6{}; +/* inline */ constexpr __ph<7> _7{}; +/* inline */ constexpr __ph<8> _8{}; +/* inline */ constexpr __ph<9> _9{}; +/* inline */ constexpr __ph<10> _10{}; +#endif // defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY) + +} // namespace placeholders + +template +struct is_placeholder > + : public integral_constant {}; + + +#ifndef _LIBCPP_CXX03_LANG + +template +inline _LIBCPP_INLINE_VISIBILITY +_Tp& +__mu(reference_wrapper<_Tp> __t, _Uj&) +{ + return __t.get(); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +typename __invoke_of<_Ti&, _Uj...>::type +__mu_expand(_Ti& __ti, tuple<_Uj...>& __uj, __tuple_indices<_Indx...>) +{ + return __ti(_VSTD::forward<_Uj>(_VSTD::get<_Indx>(__uj))...); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +typename __enable_if_t +< + is_bind_expression<_Ti>::value, + __invoke_of<_Ti&, _Uj...> +>::type +__mu(_Ti& __ti, tuple<_Uj...>& __uj) +{ + typedef typename __make_tuple_indices::type __indices; + return _VSTD::__mu_expand(__ti, __uj, __indices()); +} + +template +struct __mu_return2 {}; + +template +struct __mu_return2 +{ + typedef typename tuple_element::value - 1, _Uj>::type type; +}; + +template +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + 0 < is_placeholder<_Ti>::value, + typename __mu_return2<0 < is_placeholder<_Ti>::value, _Ti, _Uj>::type +>::type +__mu(_Ti&, _Uj& __uj) +{ + const size_t _Indx = is_placeholder<_Ti>::value - 1; + return _VSTD::forward::type>(_VSTD::get<_Indx>(__uj)); +} + +template +inline _LIBCPP_INLINE_VISIBILITY +typename enable_if +< + !is_bind_expression<_Ti>::value && + is_placeholder<_Ti>::value == 0 && + !__is_reference_wrapper<_Ti>::value, + _Ti& +>::type +__mu(_Ti& __ti, _Uj&) +{ + return __ti; +} + +template +struct __mu_return_impl; + +template +struct __mu_return_invokable // false +{ + typedef __nat type; +}; + +template +struct __mu_return_invokable +{ + typedef typename __invoke_of<_Ti&, _Uj...>::type type; +}; + +template +struct __mu_return_impl<_Ti, false, true, false, tuple<_Uj...> > + : public __mu_return_invokable<__invokable<_Ti&, _Uj...>::value, _Ti, _Uj...> +{ +}; + +template +struct __mu_return_impl<_Ti, false, false, true, _TupleUj> +{ + typedef typename tuple_element::value - 1, + _TupleUj>::type&& type; +}; + +template +struct __mu_return_impl<_Ti, true, false, false, _TupleUj> +{ + typedef typename _Ti::type& type; +}; + +template +struct __mu_return_impl<_Ti, false, false, false, _TupleUj> +{ + typedef _Ti& type; +}; + +template +struct __mu_return + : public __mu_return_impl<_Ti, + __is_reference_wrapper<_Ti>::value, + is_bind_expression<_Ti>::value, + 0 < is_placeholder<_Ti>::value && + is_placeholder<_Ti>::value <= tuple_size<_TupleUj>::value, + _TupleUj> +{ +}; + +template +struct __is_valid_bind_return +{ + static const bool value = false; +}; + +template +struct __is_valid_bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj> +{ + static const bool value = __invokable<_Fp, + typename __mu_return<_BoundArgs, _TupleUj>::type...>::value; +}; + +template +struct __is_valid_bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj> +{ + static const bool value = __invokable<_Fp, + typename __mu_return::type...>::value; +}; + +template ::value> +struct __bind_return; + +template +struct __bind_return<_Fp, tuple<_BoundArgs...>, _TupleUj, true> +{ + typedef typename __invoke_of + < + _Fp&, + typename __mu_return + < + _BoundArgs, + _TupleUj + >::type... + >::type type; +}; + +template +struct __bind_return<_Fp, const tuple<_BoundArgs...>, _TupleUj, true> +{ + typedef typename __invoke_of + < + _Fp&, + typename __mu_return + < + const _BoundArgs, + _TupleUj + >::type... + >::type type; +}; + +template +inline _LIBCPP_INLINE_VISIBILITY +typename __bind_return<_Fp, _BoundArgs, _Args>::type +__apply_functor(_Fp& __f, _BoundArgs& __bound_args, __tuple_indices<_Indx...>, + _Args&& __args) +{ + return _VSTD::__invoke(__f, _VSTD::__mu(_VSTD::get<_Indx>(__bound_args), __args)...); +} + +template +class __bind : public __weak_result_type::type> +{ +protected: + typedef typename decay<_Fp>::type _Fd; + typedef tuple::type...> _Td; +private: + _Fd __f_; + _Td __bound_args_; + + typedef typename __make_tuple_indices::type __indices; +public: + template ::value && + !is_same<__libcpp_remove_reference_t<_Gp>, + __bind>::value + >::type> + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + explicit __bind(_Gp&& __f, _BA&& ...__bound_args) + : __f_(_VSTD::forward<_Gp>(__f)), + __bound_args_(_VSTD::forward<_BA>(__bound_args)...) {} + + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type + operator()(_Args&& ...__args) + { + return _VSTD::__apply_functor(__f_, __bound_args_, __indices(), + tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...)); + } + + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + typename __bind_return >::type + operator()(_Args&& ...__args) const + { + return _VSTD::__apply_functor(__f_, __bound_args_, __indices(), + tuple<_Args&&...>(_VSTD::forward<_Args>(__args)...)); + } +}; + +template +struct is_bind_expression<__bind<_Fp, _BoundArgs...> > : public true_type {}; + +template +class __bind_r + : public __bind<_Fp, _BoundArgs...> +{ + typedef __bind<_Fp, _BoundArgs...> base; + typedef typename base::_Fd _Fd; + typedef typename base::_Td _Td; +public: + typedef _Rp result_type; + + + template ::value && + !is_same<__libcpp_remove_reference_t<_Gp>, + __bind_r>::value + >::type> + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + explicit __bind_r(_Gp&& __f, _BA&& ...__bound_args) + : base(_VSTD::forward<_Gp>(__f), + _VSTD::forward<_BA>(__bound_args)...) {} + + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + typename enable_if + < + is_convertible >::type, + result_type>::value || is_void<_Rp>::value, + result_type + >::type + operator()(_Args&& ...__args) + { + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast(*this), _VSTD::forward<_Args>(__args)...); + } + + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + typename enable_if + < + is_convertible >::type, + result_type>::value || is_void<_Rp>::value, + result_type + >::type + operator()(_Args&& ...__args) const + { + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(static_cast(*this), _VSTD::forward<_Args>(__args)...); + } +}; + +template +struct is_bind_expression<__bind_r<_Rp, _Fp, _BoundArgs...> > : public true_type {}; + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +__bind<_Fp, _BoundArgs...> +bind(_Fp&& __f, _BoundArgs&&... __bound_args) +{ + typedef __bind<_Fp, _BoundArgs...> type; + return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +__bind_r<_Rp, _Fp, _BoundArgs...> +bind(_Fp&& __f, _BoundArgs&&... __bound_args) +{ + typedef __bind_r<_Rp, _Fp, _BoundArgs...> type; + return type(_VSTD::forward<_Fp>(__f), _VSTD::forward<_BoundArgs>(__bound_args)...); +} + +#endif // _LIBCPP_CXX03_LANG + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_BIND_H diff --git a/app/src/main/cpp/libcxx/include/__functional/bind_back.h b/app/src/main/cpp/libcxx/include/__functional/bind_back.h new file mode 100644 index 0000000..f0a6e49 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/bind_back.h @@ -0,0 +1,64 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_BIND_BACK_H +#define _LIBCPP___FUNCTIONAL_BIND_BACK_H + +#include <__config> +#include <__functional/invoke.h> +#include <__functional/perfect_forward.h> +#include <__utility/forward.h> +#include <__utility/integer_sequence.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template > +struct __bind_back_op; + +template +struct __bind_back_op<_NBound, index_sequence<_Ip...>> { + template + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Fn&& __f, _BoundArgs&& __bound_args, _Args&&... __args) const + noexcept(noexcept(_VSTD::invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)..., _VSTD::get<_Ip>(_VSTD::forward<_BoundArgs>(__bound_args))...))) + -> decltype( _VSTD::invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)..., _VSTD::get<_Ip>(_VSTD::forward<_BoundArgs>(__bound_args))...)) + { return _VSTD::invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)..., _VSTD::get<_Ip>(_VSTD::forward<_BoundArgs>(__bound_args))...); } +}; + +template +struct __bind_back_t : __perfect_forward<__bind_back_op>, _Fn, _BoundArgs> { + using __perfect_forward<__bind_back_op>, _Fn, _BoundArgs>::__perfect_forward; +}; + +template , _Fn>, + is_move_constructible>, + is_constructible, _Args>..., + is_move_constructible>... + >::value +>> +_LIBCPP_HIDE_FROM_ABI +constexpr auto __bind_back(_Fn&& __f, _Args&&... __args) + noexcept(noexcept(__bind_back_t, tuple...>>(_VSTD::forward<_Fn>(__f), _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)))) + -> decltype( __bind_back_t, tuple...>>(_VSTD::forward<_Fn>(__f), _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...))) + { return __bind_back_t, tuple...>>(_VSTD::forward<_Fn>(__f), _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); } + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_BIND_BACK_H diff --git a/app/src/main/cpp/libcxx/include/__functional/bind_front.h b/app/src/main/cpp/libcxx/include/__functional/bind_front.h new file mode 100644 index 0000000..22fb3a6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/bind_front.h @@ -0,0 +1,58 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_BIND_FRONT_H +#define _LIBCPP___FUNCTIONAL_BIND_FRONT_H + +#include <__config> +#include <__functional/invoke.h> +#include <__functional/perfect_forward.h> +#include <__utility/forward.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +struct __bind_front_op { + template + _LIBCPP_HIDE_FROM_ABI + constexpr auto operator()(_Args&& ...__args) const + noexcept(noexcept(_VSTD::invoke(_VSTD::forward<_Args>(__args)...))) + -> decltype( _VSTD::invoke(_VSTD::forward<_Args>(__args)...)) + { return _VSTD::invoke(_VSTD::forward<_Args>(__args)...); } +}; + +template +struct __bind_front_t : __perfect_forward<__bind_front_op, _Fn, _BoundArgs...> { + using __perfect_forward<__bind_front_op, _Fn, _BoundArgs...>::__perfect_forward; +}; + +template , _Fn>, + is_move_constructible>, + is_constructible, _Args>..., + is_move_constructible>... + >::value +>> +_LIBCPP_HIDE_FROM_ABI +constexpr auto bind_front(_Fn&& __f, _Args&&... __args) { + return __bind_front_t, decay_t<_Args>...>(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...); +} + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_BIND_FRONT_H diff --git a/app/src/main/cpp/libcxx/include/__functional/binder1st.h b/app/src/main/cpp/libcxx/include/__functional/binder1st.h new file mode 100644 index 0000000..dea22c7 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/binder1st.h @@ -0,0 +1,53 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_BINDER1ST_H +#define _LIBCPP___FUNCTIONAL_BINDER1ST_H + +#include <__config> +#include <__functional/unary_function.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder1st + : public __unary_function +{ +protected: + __Operation op; + typename __Operation::first_argument_type value; +public: + _LIBCPP_INLINE_VISIBILITY binder1st(const __Operation& __x, + const typename __Operation::first_argument_type __y) + : op(__x), value(__y) {} + _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() + (typename __Operation::second_argument_type& __x) const + {return op(value, __x);} + _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() + (const typename __Operation::second_argument_type& __x) const + {return op(value, __x);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +binder1st<__Operation> +bind1st(const __Operation& __op, const _Tp& __x) + {return binder1st<__Operation>(__op, __x);} + +#endif // _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_BINDER1ST_H diff --git a/app/src/main/cpp/libcxx/include/__functional/binder2nd.h b/app/src/main/cpp/libcxx/include/__functional/binder2nd.h new file mode 100644 index 0000000..c98a146 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/binder2nd.h @@ -0,0 +1,53 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_BINDER2ND_H +#define _LIBCPP___FUNCTIONAL_BINDER2ND_H + +#include <__config> +#include <__functional/unary_function.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 binder2nd + : public __unary_function +{ +protected: + __Operation op; + typename __Operation::second_argument_type value; +public: + _LIBCPP_INLINE_VISIBILITY + binder2nd(const __Operation& __x, const typename __Operation::second_argument_type __y) + : op(__x), value(__y) {} + _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() + ( typename __Operation::first_argument_type& __x) const + {return op(__x, value);} + _LIBCPP_INLINE_VISIBILITY typename __Operation::result_type operator() + (const typename __Operation::first_argument_type& __x) const + {return op(__x, value);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +binder2nd<__Operation> +bind2nd(const __Operation& __op, const _Tp& __x) + {return binder2nd<__Operation>(__op, __x);} + +#endif // _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_BINDER2ND_H diff --git a/app/src/main/cpp/libcxx/include/__functional/boyer_moore_searcher.h b/app/src/main/cpp/libcxx/include/__functional/boyer_moore_searcher.h new file mode 100644 index 0000000..a675089 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/boyer_moore_searcher.h @@ -0,0 +1,315 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_BOYER_MOORE_SEARCHER_H +#define _LIBCPP___FUNCTIONAL_BOYER_MOORE_SEARCHER_H + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#include <__algorithm/fill_n.h> +#include <__config> +#include <__functional/hash.h> +#include <__functional/operations.h> +#include <__iterator/distance.h> +#include <__iterator/iterator_traits.h> +#include <__memory/shared_ptr.h> +#include <__utility/pair.h> +#include +#include +#include + +#if _LIBCPP_STD_VER > 14 + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class _BMSkipTable; + +// General case for BM data searching; use a map +template +class _BMSkipTable<_Key, _Value, _Hash, _BinaryPredicate, false> { +private: + using value_type = _Value; + using key_type = _Key; + + const value_type __default_value_; + unordered_map<_Key, _Value, _Hash, _BinaryPredicate> __table_; + +public: + _LIBCPP_HIDE_FROM_ABI + explicit _BMSkipTable(size_t __sz, value_type __default_value, _Hash __hash, _BinaryPredicate __pred) + : __default_value_(__default_value), + __table_(__sz, __hash, __pred) {} + + _LIBCPP_HIDE_FROM_ABI void insert(const key_type& __key, value_type __val) { + __table_[__key] = __val; + } + + _LIBCPP_HIDE_FROM_ABI value_type operator[](const key_type& __key) const { + auto __it = __table_.find(__key); + return __it == __table_.end() ? __default_value_ : __it->second; + } +}; + +// Special case small numeric values; use an array +template +class _BMSkipTable<_Key, _Value, _Hash, _BinaryPredicate, true> { +private: + using value_type = _Value; + using key_type = _Key; + + using unsigned_key_type = make_unsigned_t; + std::array __table_; + static_assert(numeric_limits::max() < 256); + +public: + _LIBCPP_HIDE_FROM_ABI explicit _BMSkipTable(size_t, value_type __default_value, _Hash, _BinaryPredicate) { + std::fill_n(__table_.data(), __table_.size(), __default_value); + } + + _LIBCPP_HIDE_FROM_ABI void insert(key_type __key, value_type __val) { + __table_[static_cast(__key)] = __val; + } + + _LIBCPP_HIDE_FROM_ABI value_type operator[](key_type __key) const { + return __table_[static_cast(__key)]; + } +}; + +template ::value_type>, + class _BinaryPredicate = equal_to<>> +class _LIBCPP_TEMPLATE_VIS boyer_moore_searcher { +private: + using difference_type = typename std::iterator_traits<_RandomAccessIterator1>::difference_type; + using value_type = typename std::iterator_traits<_RandomAccessIterator1>::value_type; + using __skip_table_type = _BMSkipTable + && sizeof(value_type) == 1 + && is_same_v<_Hash, hash> + && is_same_v<_BinaryPredicate, equal_to<>>>; + +public: + boyer_moore_searcher(_RandomAccessIterator1 __first, + _RandomAccessIterator1 __last, + _Hash __hash = _Hash(), + _BinaryPredicate __pred = _BinaryPredicate()) + : __first_(__first), + __last_(__last), + __pred_(__pred), + __pattern_length_(__last - __first), + __skip_table_(std::make_shared<__skip_table_type>(__pattern_length_, -1, __hash, __pred_)), + __suffix_(std::__allocate_shared_unbounded_array( + allocator(), __pattern_length_ + 1)) { + difference_type __i = 0; + while (__first != __last) { + __skip_table_->insert(*__first, __i); + ++__first; + ++__i; + } + __build_suffix_table(__first_, __last_, __pred_); + } + + template + pair<_RandomAccessIterator2, _RandomAccessIterator2> + operator()(_RandomAccessIterator2 __first, _RandomAccessIterator2 __last) const { + static_assert(__is_same_uncvref::value_type, + typename iterator_traits<_RandomAccessIterator2>::value_type>::value, + "Corpus and Pattern iterators must point to the same type"); + if (__first == __last) + return std::make_pair(__last, __last); + if (__first_ == __last_) + return std::make_pair(__first, __first); + + if (__pattern_length_ > (__last - __first)) + return std::make_pair(__last, __last); + return __search(__first, __last); + } + +private: + _RandomAccessIterator1 __first_; + _RandomAccessIterator1 __last_; + _BinaryPredicate __pred_; + difference_type __pattern_length_; + shared_ptr<__skip_table_type> __skip_table_; + shared_ptr __suffix_; + + template + pair<_RandomAccessIterator2, _RandomAccessIterator2> + __search(_RandomAccessIterator2 __f, _RandomAccessIterator2 __l) const { + _RandomAccessIterator2 __current = __f; + const _RandomAccessIterator2 __last = __l - __pattern_length_; + const __skip_table_type& __skip_table = *__skip_table_; + + while (__current <= __last) { + difference_type __j = __pattern_length_; + while (__pred_(__first_[__j - 1], __current[__j - 1])) { + --__j; + if (__j == 0) + return std::make_pair(__current, __current + __pattern_length_); + } + + difference_type __k = __skip_table[__current[__j - 1]]; + difference_type __m = __j - __k - 1; + if (__k < __j && __m > __suffix_[__j]) + __current += __m; + else + __current += __suffix_[__j]; + } + return std::make_pair(__l, __l); + } + + template + void __compute_bm_prefix(_Iterator __first, _Iterator __last, _BinaryPredicate __pred, _Container& __prefix) { + const size_t __count = __last - __first; + + __prefix[0] = 0; + size_t __k = 0; + + for (size_t __i = 1; __i != __count; ++__i) { + while (__k > 0 && !__pred(__first[__k], __first[__i])) + __k = __prefix[__k - 1]; + + if (__pred(__first[__k], __first[__i])) + ++__k; + __prefix[__i] = __k; + } + } + + void __build_suffix_table(_RandomAccessIterator1 __first, _RandomAccessIterator1 __last, _BinaryPredicate __pred) { + const size_t __count = __last - __first; + + if (__count == 0) + return; + + vector __scratch(__count); + + __compute_bm_prefix(__first, __last, __pred, __scratch); + for (size_t __i = 0; __i <= __count; ++__i) + __suffix_[__i] = __count - __scratch[__count - 1]; + + using _ReverseIter = reverse_iterator<_RandomAccessIterator1>; + __compute_bm_prefix(_ReverseIter(__last), _ReverseIter(__first), __pred, __scratch); + + for (size_t __i = 0; __i != __count; ++__i) { + const size_t __j = __count - __scratch[__i]; + const difference_type __k = __i - __scratch[__i] + 1; + + if (__suffix_[__j] > __k) + __suffix_[__j] = __k; + } + } +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(boyer_moore_searcher); + +template ::value_type>, + class _BinaryPredicate = equal_to<>> +class _LIBCPP_TEMPLATE_VIS boyer_moore_horspool_searcher { +private: + using difference_type = typename iterator_traits<_RandomAccessIterator1>::difference_type; + using value_type = typename iterator_traits<_RandomAccessIterator1>::value_type; + using __skip_table_type = _BMSkipTable + && sizeof(value_type) == 1 + && is_same_v<_Hash, hash> + && is_same_v<_BinaryPredicate, equal_to<>>>; +public: + boyer_moore_horspool_searcher(_RandomAccessIterator1 __first, + _RandomAccessIterator1 __last, + _Hash __hash = _Hash(), + _BinaryPredicate __pred = _BinaryPredicate()) + : __first_(__first), + __last_(__last), + __pred_(__pred), + __pattern_length_(__last - __first), + __skip_table_(std::make_shared<__skip_table_type>(__pattern_length_, __pattern_length_, __hash, __pred_)) { + if (__first == __last) + return; + --__last; + difference_type __i = 0; + while (__first != __last) { + __skip_table_->insert(*__first, __pattern_length_ - 1 - __i); + ++__first; + ++__i; + } + } + + template + pair<_RandomAccessIterator2, _RandomAccessIterator2> + operator()(_RandomAccessIterator2 __first, _RandomAccessIterator2 __last) const { + static_assert(__is_same_uncvref::value_type, + typename std::iterator_traits<_RandomAccessIterator2>::value_type>::value, + "Corpus and Pattern iterators must point to the same type"); + if (__first == __last) + return std::make_pair(__last, __last); + if (__first_ == __last_) + return std::make_pair(__first, __first); + + if (__pattern_length_ > __last - __first) + return std::make_pair(__last, __last); + + return __search(__first, __last); + } + +private: + _RandomAccessIterator1 __first_; + _RandomAccessIterator1 __last_; + _BinaryPredicate __pred_; + difference_type __pattern_length_; + shared_ptr<__skip_table_type> __skip_table_; + + template + pair<_RandomAccessIterator2, _RandomAccessIterator2> + __search(_RandomAccessIterator2 __f, _RandomAccessIterator2 __l) const { + _RandomAccessIterator2 __current = __f; + const _RandomAccessIterator2 __last = __l - __pattern_length_; + const __skip_table_type& __skip_table = *__skip_table_; + + while (__current <= __last) { + difference_type __j = __pattern_length_; + while (__pred_(__first_[__j - 1], __current[__j - 1])) { + --__j; + if (__j == 0) + return std::make_pair(__current, __current + __pattern_length_); + } + __current += __skip_table[__current[__pattern_length_ - 1]]; + } + return std::make_pair(__l, __l); + } +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(boyer_moore_horspool_searcher); + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP_STD_VER > 14 + +#endif // _LIBCPP___FUNCTIONAL_BOYER_MOORE_SEARCHER_H diff --git a/app/src/main/cpp/libcxx/include/__functional/compose.h b/app/src/main/cpp/libcxx/include/__functional/compose.h new file mode 100644 index 0000000..25213f2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/compose.h @@ -0,0 +1,52 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_COMPOSE_H +#define _LIBCPP___FUNCTIONAL_COMPOSE_H + +#include <__config> +#include <__functional/invoke.h> +#include <__functional/perfect_forward.h> +#include <__utility/forward.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +struct __compose_op { + template + _LIBCPP_HIDE_FROM_ABI + constexpr auto operator()(_Fn1&& __f1, _Fn2&& __f2, _Args&&... __args) const + noexcept(noexcept(_VSTD::invoke(_VSTD::forward<_Fn1>(__f1), _VSTD::invoke(_VSTD::forward<_Fn2>(__f2), _VSTD::forward<_Args>(__args)...)))) + -> decltype( _VSTD::invoke(_VSTD::forward<_Fn1>(__f1), _VSTD::invoke(_VSTD::forward<_Fn2>(__f2), _VSTD::forward<_Args>(__args)...))) + { return _VSTD::invoke(_VSTD::forward<_Fn1>(__f1), _VSTD::invoke(_VSTD::forward<_Fn2>(__f2), _VSTD::forward<_Args>(__args)...)); } +}; + +template +struct __compose_t : __perfect_forward<__compose_op, _Fn1, _Fn2> { + using __perfect_forward<__compose_op, _Fn1, _Fn2>::__perfect_forward; +}; + +template +_LIBCPP_HIDE_FROM_ABI +constexpr auto __compose(_Fn1&& __f1, _Fn2&& __f2) + noexcept(noexcept(__compose_t, decay_t<_Fn2>>(_VSTD::forward<_Fn1>(__f1), _VSTD::forward<_Fn2>(__f2)))) + -> decltype( __compose_t, decay_t<_Fn2>>(_VSTD::forward<_Fn1>(__f1), _VSTD::forward<_Fn2>(__f2))) + { return __compose_t, decay_t<_Fn2>>(_VSTD::forward<_Fn1>(__f1), _VSTD::forward<_Fn2>(__f2)); } + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_COMPOSE_H diff --git a/app/src/main/cpp/libcxx/include/__functional/default_searcher.h b/app/src/main/cpp/libcxx/include/__functional/default_searcher.h new file mode 100644 index 0000000..e4151e5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/default_searcher.h @@ -0,0 +1,57 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_DEFAULT_SEARCHER_H +#define _LIBCPP___FUNCTIONAL_DEFAULT_SEARCHER_H + +#include <__algorithm/search.h> +#include <__config> +#include <__functional/identity.h> +#include <__functional/operations.h> +#include <__iterator/iterator_traits.h> +#include <__utility/pair.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +// default searcher +template> +class _LIBCPP_TEMPLATE_VIS default_searcher { +public: + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + default_searcher(_ForwardIterator __f, _ForwardIterator __l, + _BinaryPredicate __p = _BinaryPredicate()) + : __first_(__f), __last_(__l), __pred_(__p) {} + + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + pair<_ForwardIterator2, _ForwardIterator2> + operator () (_ForwardIterator2 __f, _ForwardIterator2 __l) const + { + auto __proj = __identity(); + return std::__search_impl(__f, __l, __first_, __last_, __pred_, __proj, __proj); + } + +private: + _ForwardIterator __first_; + _ForwardIterator __last_; + _BinaryPredicate __pred_; +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(default_searcher); + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_DEFAULT_SEARCHER_H diff --git a/app/src/main/cpp/libcxx/include/__functional/function.h b/app/src/main/cpp/libcxx/include/__functional/function.h new file mode 100644 index 0000000..ca79d33 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/function.h @@ -0,0 +1,1216 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_FUNCTION_H +#define _LIBCPP___FUNCTIONAL_FUNCTION_H + +#include <__assert> +#include <__config> +#include <__functional/binary_function.h> +#include <__functional/invoke.h> +#include <__functional/unary_function.h> +#include <__iterator/iterator_traits.h> +#include <__memory/addressof.h> +#include <__memory/allocator.h> +#include <__memory/allocator_destructor.h> +#include <__memory/allocator_traits.h> +#include <__memory/builtin_new_allocator.h> +#include <__memory/compressed_pair.h> +#include <__memory/unique_ptr.h> +#include <__type_traits/strip_signature.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/piecewise_construct.h> +#include <__utility/swap.h> +#include +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#ifndef _LIBCPP_CXX03_LANG + +_LIBCPP_BEGIN_NAMESPACE_STD + +// bad_function_call + +_LIBCPP_DIAGNOSTIC_PUSH +_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wweak-vtables") +class _LIBCPP_EXCEPTION_ABI bad_function_call + : public exception +{ +public: +// Note that when a key function is not used, every translation unit that uses +// bad_function_call will end up containing a weak definition of the vtable and +// typeinfo. +#ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION + ~bad_function_call() _NOEXCEPT override; +#else + ~bad_function_call() _NOEXCEPT override {} +#endif + +#ifdef _LIBCPP_ABI_BAD_FUNCTION_CALL_GOOD_WHAT_MESSAGE + const char* what() const _NOEXCEPT override; +#endif +}; +_LIBCPP_DIAGNOSTIC_POP + +_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY +void __throw_bad_function_call() +{ +#ifndef _LIBCPP_NO_EXCEPTIONS + throw bad_function_call(); +#else + _VSTD::abort(); +#endif +} + +template class _LIBCPP_TEMPLATE_VIS function; // undefined + +namespace __function +{ + +template +struct __maybe_derive_from_unary_function +{ +}; + +template +struct __maybe_derive_from_unary_function<_Rp(_A1)> + : public __unary_function<_A1, _Rp> +{ +}; + +template +struct __maybe_derive_from_binary_function +{ +}; + +template +struct __maybe_derive_from_binary_function<_Rp(_A1, _A2)> + : public __binary_function<_A1, _A2, _Rp> +{ +}; + +template +_LIBCPP_INLINE_VISIBILITY +bool __not_null(_Fp const&) { return true; } + +template +_LIBCPP_INLINE_VISIBILITY +bool __not_null(_Fp* __ptr) { return __ptr; } + +template +_LIBCPP_INLINE_VISIBILITY +bool __not_null(_Ret _Class::*__ptr) { return __ptr; } + +template +_LIBCPP_INLINE_VISIBILITY +bool __not_null(function<_Fp> const& __f) { return !!__f; } + +#ifdef _LIBCPP_HAS_EXTENSION_BLOCKS +template +_LIBCPP_INLINE_VISIBILITY +bool __not_null(_Rp (^__p)(_Args...)) { return __p; } +#endif + +} // namespace __function + +namespace __function { + +// __alloc_func holds a functor and an allocator. + +template class __alloc_func; +template +class __default_alloc_func; + +template +class __alloc_func<_Fp, _Ap, _Rp(_ArgTypes...)> +{ + __compressed_pair<_Fp, _Ap> __f_; + + public: + typedef _LIBCPP_NODEBUG _Fp _Target; + typedef _LIBCPP_NODEBUG _Ap _Alloc; + + _LIBCPP_INLINE_VISIBILITY + const _Target& __target() const { return __f_.first(); } + + // WIN32 APIs may define __allocator, so use __get_allocator instead. + _LIBCPP_INLINE_VISIBILITY + const _Alloc& __get_allocator() const { return __f_.second(); } + + _LIBCPP_INLINE_VISIBILITY + explicit __alloc_func(_Target&& __f) + : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)), + _VSTD::forward_as_tuple()) + { + } + + _LIBCPP_INLINE_VISIBILITY + explicit __alloc_func(const _Target& __f, const _Alloc& __a) + : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f), + _VSTD::forward_as_tuple(__a)) + { + } + + _LIBCPP_INLINE_VISIBILITY + explicit __alloc_func(const _Target& __f, _Alloc&& __a) + : __f_(piecewise_construct, _VSTD::forward_as_tuple(__f), + _VSTD::forward_as_tuple(_VSTD::move(__a))) + { + } + + _LIBCPP_INLINE_VISIBILITY + explicit __alloc_func(_Target&& __f, _Alloc&& __a) + : __f_(piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__f)), + _VSTD::forward_as_tuple(_VSTD::move(__a))) + { + } + + _LIBCPP_INLINE_VISIBILITY + _Rp operator()(_ArgTypes&&... __arg) + { + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(__f_.first(), + _VSTD::forward<_ArgTypes>(__arg)...); + } + + _LIBCPP_INLINE_VISIBILITY + __alloc_func* __clone() const + { + typedef allocator_traits<_Alloc> __alloc_traits; + typedef __rebind_alloc<__alloc_traits, __alloc_func> _AA; + _AA __a(__f_.second()); + typedef __allocator_destructor<_AA> _Dp; + unique_ptr<__alloc_func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new ((void*)__hold.get()) __alloc_func(__f_.first(), _Alloc(__a)); + return __hold.release(); + } + + _LIBCPP_INLINE_VISIBILITY + void destroy() _NOEXCEPT { __f_.~__compressed_pair<_Target, _Alloc>(); } + + static void __destroy_and_delete(__alloc_func* __f) { + typedef allocator_traits<_Alloc> __alloc_traits; + typedef __rebind_alloc<__alloc_traits, __alloc_func> _FunAlloc; + _FunAlloc __a(__f->__get_allocator()); + __f->destroy(); + __a.deallocate(__f, 1); + } +}; + +template +class __default_alloc_func<_Fp, _Rp(_ArgTypes...)> { + _Fp __f_; + +public: + typedef _LIBCPP_NODEBUG _Fp _Target; + + _LIBCPP_INLINE_VISIBILITY + const _Target& __target() const { return __f_; } + + _LIBCPP_INLINE_VISIBILITY + explicit __default_alloc_func(_Target&& __f) : __f_(_VSTD::move(__f)) {} + + _LIBCPP_INLINE_VISIBILITY + explicit __default_alloc_func(const _Target& __f) : __f_(__f) {} + + _LIBCPP_INLINE_VISIBILITY + _Rp operator()(_ArgTypes&&... __arg) { + typedef __invoke_void_return_wrapper<_Rp> _Invoker; + return _Invoker::__call(__f_, _VSTD::forward<_ArgTypes>(__arg)...); + } + + _LIBCPP_INLINE_VISIBILITY + __default_alloc_func* __clone() const { + __builtin_new_allocator::__holder_t __hold = + __builtin_new_allocator::__allocate_type<__default_alloc_func>(1); + __default_alloc_func* __res = + ::new ((void*)__hold.get()) __default_alloc_func(__f_); + (void)__hold.release(); + return __res; + } + + _LIBCPP_INLINE_VISIBILITY + void destroy() _NOEXCEPT { __f_.~_Target(); } + + static void __destroy_and_delete(__default_alloc_func* __f) { + __f->destroy(); + __builtin_new_allocator::__deallocate_type<__default_alloc_func>(__f, 1); + } +}; + +// __base provides an abstract interface for copyable functors. + +template class _LIBCPP_TEMPLATE_VIS __base; + +template +class __base<_Rp(_ArgTypes...)> +{ + __base(const __base&); + __base& operator=(const __base&); +public: + _LIBCPP_INLINE_VISIBILITY __base() {} + _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual ~__base() {} + virtual __base* __clone() const = 0; + virtual void __clone(__base*) const = 0; + virtual void destroy() _NOEXCEPT = 0; + virtual void destroy_deallocate() _NOEXCEPT = 0; + virtual _Rp operator()(_ArgTypes&& ...) = 0; +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const _NOEXCEPT = 0; + virtual const std::type_info& target_type() const _NOEXCEPT = 0; +#endif // _LIBCPP_NO_RTTI +}; + +// __func implements __base for a given functor type. + +template class __func; + +template +class __func<_Fp, _Alloc, _Rp(_ArgTypes...)> + : public __base<_Rp(_ArgTypes...)> +{ + __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> __f_; +public: + _LIBCPP_INLINE_VISIBILITY + explicit __func(_Fp&& __f) + : __f_(_VSTD::move(__f)) {} + + _LIBCPP_INLINE_VISIBILITY + explicit __func(const _Fp& __f, const _Alloc& __a) + : __f_(__f, __a) {} + + _LIBCPP_INLINE_VISIBILITY + explicit __func(const _Fp& __f, _Alloc&& __a) + : __f_(__f, _VSTD::move(__a)) {} + + _LIBCPP_INLINE_VISIBILITY + explicit __func(_Fp&& __f, _Alloc&& __a) + : __f_(_VSTD::move(__f), _VSTD::move(__a)) {} + + virtual __base<_Rp(_ArgTypes...)>* __clone() const; + virtual void __clone(__base<_Rp(_ArgTypes...)>*) const; + virtual void destroy() _NOEXCEPT; + virtual void destroy_deallocate() _NOEXCEPT; + virtual _Rp operator()(_ArgTypes&&... __arg); +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(const type_info&) const _NOEXCEPT; + virtual const std::type_info& target_type() const _NOEXCEPT; +#endif // _LIBCPP_NO_RTTI +}; + +template +__base<_Rp(_ArgTypes...)>* +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone() const +{ + typedef allocator_traits<_Alloc> __alloc_traits; + typedef __rebind_alloc<__alloc_traits, __func> _Ap; + _Ap __a(__f_.__get_allocator()); + typedef __allocator_destructor<_Ap> _Dp; + unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); + ::new ((void*)__hold.get()) __func(__f_.__target(), _Alloc(__a)); + return __hold.release(); +} + +template +void +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__clone(__base<_Rp(_ArgTypes...)>* __p) const +{ + ::new ((void*)__p) __func(__f_.__target(), __f_.__get_allocator()); +} + +template +void +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() _NOEXCEPT +{ + __f_.destroy(); +} + +template +void +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() _NOEXCEPT +{ + typedef allocator_traits<_Alloc> __alloc_traits; + typedef __rebind_alloc<__alloc_traits, __func> _Ap; + _Ap __a(__f_.__get_allocator()); + __f_.destroy(); + __a.deallocate(this, 1); +} + +template +_Rp +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg) +{ + return __f_(_VSTD::forward<_ArgTypes>(__arg)...); +} + +#ifndef _LIBCPP_NO_RTTI + +template +const void* +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target(const type_info& __ti) const _NOEXCEPT +{ + if (__ti == typeid(_Fp)) + return _VSTD::addressof(__f_.__target()); + return nullptr; +} + +template +const std::type_info& +__func<_Fp, _Alloc, _Rp(_ArgTypes...)>::target_type() const _NOEXCEPT +{ + return typeid(_Fp); +} + +#endif // _LIBCPP_NO_RTTI + +// __value_func creates a value-type from a __func. + +template class __value_func; + +template class __value_func<_Rp(_ArgTypes...)> +{ + _LIBCPP_SUPPRESS_DEPRECATED_PUSH + typename aligned_storage<3 * sizeof(void*)>::type __buf_; + _LIBCPP_SUPPRESS_DEPRECATED_POP + + typedef __base<_Rp(_ArgTypes...)> __func; + __func* __f_; + + _LIBCPP_NO_CFI static __func* __as_base(void* __p) + { + return reinterpret_cast<__func*>(__p); + } + + public: + _LIBCPP_INLINE_VISIBILITY + __value_func() _NOEXCEPT : __f_(nullptr) {} + + template + _LIBCPP_INLINE_VISIBILITY __value_func(_Fp&& __f, const _Alloc& __a) + : __f_(nullptr) + { + typedef allocator_traits<_Alloc> __alloc_traits; + typedef __function::__func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun; + typedef __rebind_alloc<__alloc_traits, _Fun> _FunAlloc; + + if (__function::__not_null(__f)) + { + _FunAlloc __af(__a); + if (sizeof(_Fun) <= sizeof(__buf_) && + is_nothrow_copy_constructible<_Fp>::value && + is_nothrow_copy_constructible<_FunAlloc>::value) + { + __f_ = + ::new ((void*)&__buf_) _Fun(_VSTD::move(__f), _Alloc(__af)); + } + else + { + typedef __allocator_destructor<_FunAlloc> _Dp; + unique_ptr<__func, _Dp> __hold(__af.allocate(1), _Dp(__af, 1)); + ::new ((void*)__hold.get()) _Fun(_VSTD::move(__f), _Alloc(__a)); + __f_ = __hold.release(); + } + } + } + + template ::type, __value_func>::value>::type> + _LIBCPP_INLINE_VISIBILITY explicit __value_func(_Fp&& __f) + : __value_func(_VSTD::forward<_Fp>(__f), allocator<_Fp>()) {} + + _LIBCPP_INLINE_VISIBILITY + __value_func(const __value_func& __f) + { + if (__f.__f_ == nullptr) + __f_ = nullptr; + else if ((void*)__f.__f_ == &__f.__buf_) + { + __f_ = __as_base(&__buf_); + __f.__f_->__clone(__f_); + } + else + __f_ = __f.__f_->__clone(); + } + + _LIBCPP_INLINE_VISIBILITY + __value_func(__value_func&& __f) _NOEXCEPT + { + if (__f.__f_ == nullptr) + __f_ = nullptr; + else if ((void*)__f.__f_ == &__f.__buf_) + { + __f_ = __as_base(&__buf_); + __f.__f_->__clone(__f_); + } + else + { + __f_ = __f.__f_; + __f.__f_ = nullptr; + } + } + + _LIBCPP_INLINE_VISIBILITY + ~__value_func() + { + if ((void*)__f_ == &__buf_) + __f_->destroy(); + else if (__f_) + __f_->destroy_deallocate(); + } + + _LIBCPP_INLINE_VISIBILITY + __value_func& operator=(__value_func&& __f) + { + *this = nullptr; + if (__f.__f_ == nullptr) + __f_ = nullptr; + else if ((void*)__f.__f_ == &__f.__buf_) + { + __f_ = __as_base(&__buf_); + __f.__f_->__clone(__f_); + } + else + { + __f_ = __f.__f_; + __f.__f_ = nullptr; + } + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __value_func& operator=(nullptr_t) + { + __func* __f = __f_; + __f_ = nullptr; + if ((void*)__f == &__buf_) + __f->destroy(); + else if (__f) + __f->destroy_deallocate(); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + _Rp operator()(_ArgTypes&&... __args) const + { + if (__f_ == nullptr) + __throw_bad_function_call(); + return (*__f_)(_VSTD::forward<_ArgTypes>(__args)...); + } + + _LIBCPP_INLINE_VISIBILITY + void swap(__value_func& __f) _NOEXCEPT + { + if (&__f == this) + return; + if ((void*)__f_ == &__buf_ && (void*)__f.__f_ == &__f.__buf_) + { + _LIBCPP_SUPPRESS_DEPRECATED_PUSH + typename aligned_storage::type __tempbuf; + _LIBCPP_SUPPRESS_DEPRECATED_POP + __func* __t = __as_base(&__tempbuf); + __f_->__clone(__t); + __f_->destroy(); + __f_ = nullptr; + __f.__f_->__clone(__as_base(&__buf_)); + __f.__f_->destroy(); + __f.__f_ = nullptr; + __f_ = __as_base(&__buf_); + __t->__clone(__as_base(&__f.__buf_)); + __t->destroy(); + __f.__f_ = __as_base(&__f.__buf_); + } + else if ((void*)__f_ == &__buf_) + { + __f_->__clone(__as_base(&__f.__buf_)); + __f_->destroy(); + __f_ = __f.__f_; + __f.__f_ = __as_base(&__f.__buf_); + } + else if ((void*)__f.__f_ == &__f.__buf_) + { + __f.__f_->__clone(__as_base(&__buf_)); + __f.__f_->destroy(); + __f.__f_ = __f_; + __f_ = __as_base(&__buf_); + } + else + _VSTD::swap(__f_, __f.__f_); + } + + _LIBCPP_INLINE_VISIBILITY + explicit operator bool() const _NOEXCEPT { return __f_ != nullptr; } + +#ifndef _LIBCPP_NO_RTTI + _LIBCPP_INLINE_VISIBILITY + const std::type_info& target_type() const _NOEXCEPT + { + if (__f_ == nullptr) + return typeid(void); + return __f_->target_type(); + } + + template + _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT + { + if (__f_ == nullptr) + return nullptr; + return (const _Tp*)__f_->target(typeid(_Tp)); + } +#endif // _LIBCPP_NO_RTTI +}; + +// Storage for a functor object, to be used with __policy to manage copy and +// destruction. +union __policy_storage +{ + mutable char __small[sizeof(void*) * 2]; + void* __large; +}; + +// True if _Fun can safely be held in __policy_storage.__small. +template +struct __use_small_storage + : public integral_constant< + bool, sizeof(_Fun) <= sizeof(__policy_storage) && + _LIBCPP_ALIGNOF(_Fun) <= _LIBCPP_ALIGNOF(__policy_storage) && + is_trivially_copy_constructible<_Fun>::value && + is_trivially_destructible<_Fun>::value> {}; + +// Policy contains information about how to copy, destroy, and move the +// underlying functor. You can think of it as a vtable of sorts. +struct __policy +{ + // Used to copy or destroy __large values. null for trivial objects. + void* (*const __clone)(const void*); + void (*const __destroy)(void*); + + // True if this is the null policy (no value). + const bool __is_null; + + // The target type. May be null if RTTI is disabled. + const std::type_info* const __type_info; + + // Returns a pointer to a static policy object suitable for the functor + // type. + template + _LIBCPP_INLINE_VISIBILITY static const __policy* __create() + { + return __choose_policy<_Fun>(__use_small_storage<_Fun>()); + } + + _LIBCPP_INLINE_VISIBILITY + static const __policy* __create_empty() + { + static const _LIBCPP_CONSTEXPR __policy __policy_ = {nullptr, nullptr, + true, +#ifndef _LIBCPP_NO_RTTI + &typeid(void) +#else + nullptr +#endif + }; + return &__policy_; + } + + private: + template static void* __large_clone(const void* __s) + { + const _Fun* __f = static_cast(__s); + return __f->__clone(); + } + + template + static void __large_destroy(void* __s) { + _Fun::__destroy_and_delete(static_cast<_Fun*>(__s)); + } + + template + _LIBCPP_INLINE_VISIBILITY static const __policy* + __choose_policy(/* is_small = */ false_type) { + static const _LIBCPP_CONSTEXPR __policy __policy_ = { + &__large_clone<_Fun>, &__large_destroy<_Fun>, false, +#ifndef _LIBCPP_NO_RTTI + &typeid(typename _Fun::_Target) +#else + nullptr +#endif + }; + return &__policy_; + } + + template + _LIBCPP_INLINE_VISIBILITY static const __policy* + __choose_policy(/* is_small = */ true_type) + { + static const _LIBCPP_CONSTEXPR __policy __policy_ = { + nullptr, nullptr, false, +#ifndef _LIBCPP_NO_RTTI + &typeid(typename _Fun::_Target) +#else + nullptr +#endif + }; + return &__policy_; + } +}; + +// Used to choose between perfect forwarding or pass-by-value. Pass-by-value is +// faster for types that can be passed in registers. +template +using __fast_forward = __conditional_t::value, _Tp, _Tp&&>; + +// __policy_invoker calls an instance of __alloc_func held in __policy_storage. + +template struct __policy_invoker; + +template +struct __policy_invoker<_Rp(_ArgTypes...)> +{ + typedef _Rp (*__Call)(const __policy_storage*, + __fast_forward<_ArgTypes>...); + + __Call __call_; + + // Creates an invoker that throws bad_function_call. + _LIBCPP_INLINE_VISIBILITY + __policy_invoker() : __call_(&__call_empty) {} + + // Creates an invoker that calls the given instance of __func. + template + _LIBCPP_INLINE_VISIBILITY static __policy_invoker __create() + { + return __policy_invoker(&__call_impl<_Fun>); + } + + private: + _LIBCPP_INLINE_VISIBILITY + explicit __policy_invoker(__Call __c) : __call_(__c) {} + + static _Rp __call_empty(const __policy_storage*, + __fast_forward<_ArgTypes>...) + { + __throw_bad_function_call(); + } + + template + static _Rp __call_impl(const __policy_storage* __buf, + __fast_forward<_ArgTypes>... __args) + { + _Fun* __f = reinterpret_cast<_Fun*>(__use_small_storage<_Fun>::value + ? &__buf->__small + : __buf->__large); + return (*__f)(_VSTD::forward<_ArgTypes>(__args)...); + } +}; + +// __policy_func uses a __policy and __policy_invoker to create a type-erased, +// copyable functor. + +template class __policy_func; + +template class __policy_func<_Rp(_ArgTypes...)> +{ + // Inline storage for small objects. + __policy_storage __buf_; + + // Calls the value stored in __buf_. This could technically be part of + // policy, but storing it here eliminates a level of indirection inside + // operator(). + typedef __function::__policy_invoker<_Rp(_ArgTypes...)> __invoker; + __invoker __invoker_; + + // The policy that describes how to move / copy / destroy __buf_. Never + // null, even if the function is empty. + const __policy* __policy_; + + public: + _LIBCPP_INLINE_VISIBILITY + __policy_func() : __policy_(__policy::__create_empty()) {} + + template + _LIBCPP_INLINE_VISIBILITY __policy_func(_Fp&& __f, const _Alloc& __a) + : __policy_(__policy::__create_empty()) + { + typedef __alloc_func<_Fp, _Alloc, _Rp(_ArgTypes...)> _Fun; + typedef allocator_traits<_Alloc> __alloc_traits; + typedef __rebind_alloc<__alloc_traits, _Fun> _FunAlloc; + + if (__function::__not_null(__f)) + { + __invoker_ = __invoker::template __create<_Fun>(); + __policy_ = __policy::__create<_Fun>(); + + _FunAlloc __af(__a); + if (__use_small_storage<_Fun>()) + { + ::new ((void*)&__buf_.__small) + _Fun(_VSTD::move(__f), _Alloc(__af)); + } + else + { + typedef __allocator_destructor<_FunAlloc> _Dp; + unique_ptr<_Fun, _Dp> __hold(__af.allocate(1), _Dp(__af, 1)); + ::new ((void*)__hold.get()) + _Fun(_VSTD::move(__f), _Alloc(__af)); + __buf_.__large = __hold.release(); + } + } + } + + template ::type, __policy_func>::value>::type> + _LIBCPP_INLINE_VISIBILITY explicit __policy_func(_Fp&& __f) + : __policy_(__policy::__create_empty()) { + typedef __default_alloc_func<_Fp, _Rp(_ArgTypes...)> _Fun; + + if (__function::__not_null(__f)) { + __invoker_ = __invoker::template __create<_Fun>(); + __policy_ = __policy::__create<_Fun>(); + if (__use_small_storage<_Fun>()) { + ::new ((void*)&__buf_.__small) _Fun(_VSTD::move(__f)); + } else { + __builtin_new_allocator::__holder_t __hold = + __builtin_new_allocator::__allocate_type<_Fun>(1); + __buf_.__large = ::new ((void*)__hold.get()) _Fun(_VSTD::move(__f)); + (void)__hold.release(); + } + } + } + + _LIBCPP_INLINE_VISIBILITY + __policy_func(const __policy_func& __f) + : __buf_(__f.__buf_), __invoker_(__f.__invoker_), + __policy_(__f.__policy_) + { + if (__policy_->__clone) + __buf_.__large = __policy_->__clone(__f.__buf_.__large); + } + + _LIBCPP_INLINE_VISIBILITY + __policy_func(__policy_func&& __f) + : __buf_(__f.__buf_), __invoker_(__f.__invoker_), + __policy_(__f.__policy_) + { + if (__policy_->__destroy) + { + __f.__policy_ = __policy::__create_empty(); + __f.__invoker_ = __invoker(); + } + } + + _LIBCPP_INLINE_VISIBILITY + ~__policy_func() + { + if (__policy_->__destroy) + __policy_->__destroy(__buf_.__large); + } + + _LIBCPP_INLINE_VISIBILITY + __policy_func& operator=(__policy_func&& __f) + { + *this = nullptr; + __buf_ = __f.__buf_; + __invoker_ = __f.__invoker_; + __policy_ = __f.__policy_; + __f.__policy_ = __policy::__create_empty(); + __f.__invoker_ = __invoker(); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __policy_func& operator=(nullptr_t) + { + const __policy* __p = __policy_; + __policy_ = __policy::__create_empty(); + __invoker_ = __invoker(); + if (__p->__destroy) + __p->__destroy(__buf_.__large); + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + _Rp operator()(_ArgTypes&&... __args) const + { + return __invoker_.__call_(_VSTD::addressof(__buf_), + _VSTD::forward<_ArgTypes>(__args)...); + } + + _LIBCPP_INLINE_VISIBILITY + void swap(__policy_func& __f) + { + _VSTD::swap(__invoker_, __f.__invoker_); + _VSTD::swap(__policy_, __f.__policy_); + _VSTD::swap(__buf_, __f.__buf_); + } + + _LIBCPP_INLINE_VISIBILITY + explicit operator bool() const _NOEXCEPT + { + return !__policy_->__is_null; + } + +#ifndef _LIBCPP_NO_RTTI + _LIBCPP_INLINE_VISIBILITY + const std::type_info& target_type() const _NOEXCEPT + { + return *__policy_->__type_info; + } + + template + _LIBCPP_INLINE_VISIBILITY const _Tp* target() const _NOEXCEPT + { + if (__policy_->__is_null || typeid(_Tp) != *__policy_->__type_info) + return nullptr; + if (__policy_->__clone) // Out of line storage. + return reinterpret_cast(__buf_.__large); + else + return reinterpret_cast(&__buf_.__small); + } +#endif // _LIBCPP_NO_RTTI +}; + +#if defined(_LIBCPP_HAS_BLOCKS_RUNTIME) + +extern "C" void *_Block_copy(const void *); +extern "C" void _Block_release(const void *); + +template +class __func<_Rp1(^)(_ArgTypes1...), _Alloc, _Rp(_ArgTypes...)> + : public __base<_Rp(_ArgTypes...)> +{ + typedef _Rp1(^__block_type)(_ArgTypes1...); + __block_type __f_; + +public: + _LIBCPP_INLINE_VISIBILITY + explicit __func(__block_type const& __f) +#ifdef _LIBCPP_HAS_OBJC_ARC + : __f_(__f) +#else + : __f_(reinterpret_cast<__block_type>(__f ? _Block_copy(__f) : nullptr)) +#endif + { } + + // [TODO] add && to save on a retain + + _LIBCPP_INLINE_VISIBILITY + explicit __func(__block_type __f, const _Alloc& /* unused */) +#ifdef _LIBCPP_HAS_OBJC_ARC + : __f_(__f) +#else + : __f_(reinterpret_cast<__block_type>(__f ? _Block_copy(__f) : nullptr)) +#endif + { } + + virtual __base<_Rp(_ArgTypes...)>* __clone() const { + _LIBCPP_ASSERT(false, + "Block pointers are just pointers, so they should always fit into " + "std::function's small buffer optimization. This function should " + "never be invoked."); + return nullptr; + } + + virtual void __clone(__base<_Rp(_ArgTypes...)>* __p) const { + ::new ((void*)__p) __func(__f_); + } + + virtual void destroy() _NOEXCEPT { +#ifndef _LIBCPP_HAS_OBJC_ARC + if (__f_) + _Block_release(__f_); +#endif + __f_ = 0; + } + + virtual void destroy_deallocate() _NOEXCEPT { + _LIBCPP_ASSERT(false, + "Block pointers are just pointers, so they should always fit into " + "std::function's small buffer optimization. This function should " + "never be invoked."); + } + + virtual _Rp operator()(_ArgTypes&& ... __arg) { + return _VSTD::__invoke(__f_, _VSTD::forward<_ArgTypes>(__arg)...); + } + +#ifndef _LIBCPP_NO_RTTI + virtual const void* target(type_info const& __ti) const _NOEXCEPT { + if (__ti == typeid(__func::__block_type)) + return &__f_; + return (const void*)nullptr; + } + + virtual const std::type_info& target_type() const _NOEXCEPT { + return typeid(__func::__block_type); + } +#endif // _LIBCPP_NO_RTTI +}; + +#endif // _LIBCPP_HAS_EXTENSION_BLOCKS + +} // namespace __function + +template +class _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)> + : public __function::__maybe_derive_from_unary_function<_Rp(_ArgTypes...)>, + public __function::__maybe_derive_from_binary_function<_Rp(_ArgTypes...)> +{ +#ifndef _LIBCPP_ABI_OPTIMIZED_FUNCTION + typedef __function::__value_func<_Rp(_ArgTypes...)> __func; +#else + typedef __function::__policy_func<_Rp(_ArgTypes...)> __func; +#endif + + __func __f_; + + template , function>, + __invokable<_Fp, _ArgTypes...> + >::value> + struct __callable; + template + struct __callable<_Fp, true> + { + static const bool value = is_void<_Rp>::value || + __is_core_convertible::type, + _Rp>::value; + }; + template + struct __callable<_Fp, false> + { + static const bool value = false; + }; + + template + using _EnableIfLValueCallable = typename enable_if<__callable<_Fp&>::value>::type; +public: + typedef _Rp result_type; + + // construct/copy/destroy: + _LIBCPP_INLINE_VISIBILITY + function() _NOEXCEPT { } + _LIBCPP_INLINE_VISIBILITY + function(nullptr_t) _NOEXCEPT {} + function(const function&); + function(function&&) _NOEXCEPT; + template> + function(_Fp); + +#if _LIBCPP_STD_VER <= 14 + template + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&) _NOEXCEPT {} + template + _LIBCPP_INLINE_VISIBILITY + function(allocator_arg_t, const _Alloc&, nullptr_t) _NOEXCEPT {} + template + function(allocator_arg_t, const _Alloc&, const function&); + template + function(allocator_arg_t, const _Alloc&, function&&); + template> + function(allocator_arg_t, const _Alloc& __a, _Fp __f); +#endif + + function& operator=(const function&); + function& operator=(function&&) _NOEXCEPT; + function& operator=(nullptr_t) _NOEXCEPT; + template::type>> + function& operator=(_Fp&&); + + ~function(); + + // function modifiers: + void swap(function&) _NOEXCEPT; + +#if _LIBCPP_STD_VER <= 14 + template + _LIBCPP_INLINE_VISIBILITY + void assign(_Fp&& __f, const _Alloc& __a) + {function(allocator_arg, __a, _VSTD::forward<_Fp>(__f)).swap(*this);} +#endif + + // function capacity: + _LIBCPP_INLINE_VISIBILITY + explicit operator bool() const _NOEXCEPT { + return static_cast(__f_); + } + + // deleted overloads close possible hole in the type system + template + bool operator==(const function<_R2(_ArgTypes2...)>&) const = delete; + template + bool operator!=(const function<_R2(_ArgTypes2...)>&) const = delete; +public: + // function invocation: + _Rp operator()(_ArgTypes...) const; + +#ifndef _LIBCPP_NO_RTTI + // function target access: + const std::type_info& target_type() const _NOEXCEPT; + template _Tp* target() _NOEXCEPT; + template const _Tp* target() const _NOEXCEPT; +#endif // _LIBCPP_NO_RTTI +}; + +#if _LIBCPP_STD_VER >= 17 +template +function(_Rp(*)(_Ap...)) -> function<_Rp(_Ap...)>; + +template::type> +function(_Fp) -> function<_Stripped>; +#endif // _LIBCPP_STD_VER >= 17 + +template +function<_Rp(_ArgTypes...)>::function(const function& __f) : __f_(__f.__f_) {} + +#if _LIBCPP_STD_VER <= 14 +template +template +function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&, + const function& __f) : __f_(__f.__f_) {} +#endif + +template +function<_Rp(_ArgTypes...)>::function(function&& __f) _NOEXCEPT + : __f_(_VSTD::move(__f.__f_)) {} + +#if _LIBCPP_STD_VER <= 14 +template +template +function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc&, + function&& __f) + : __f_(_VSTD::move(__f.__f_)) {} +#endif + +template +template +function<_Rp(_ArgTypes...)>::function(_Fp __f) : __f_(_VSTD::move(__f)) {} + +#if _LIBCPP_STD_VER <= 14 +template +template +function<_Rp(_ArgTypes...)>::function(allocator_arg_t, const _Alloc& __a, + _Fp __f) + : __f_(_VSTD::move(__f), __a) {} +#endif + +template +function<_Rp(_ArgTypes...)>& +function<_Rp(_ArgTypes...)>::operator=(const function& __f) +{ + function(__f).swap(*this); + return *this; +} + +template +function<_Rp(_ArgTypes...)>& +function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT +{ + __f_ = _VSTD::move(__f.__f_); + return *this; +} + +template +function<_Rp(_ArgTypes...)>& +function<_Rp(_ArgTypes...)>::operator=(nullptr_t) _NOEXCEPT +{ + __f_ = nullptr; + return *this; +} + +template +template +function<_Rp(_ArgTypes...)>& +function<_Rp(_ArgTypes...)>::operator=(_Fp&& __f) +{ + function(_VSTD::forward<_Fp>(__f)).swap(*this); + return *this; +} + +template +function<_Rp(_ArgTypes...)>::~function() {} + +template +void +function<_Rp(_ArgTypes...)>::swap(function& __f) _NOEXCEPT +{ + __f_.swap(__f.__f_); +} + +template +_Rp +function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const +{ + return __f_(_VSTD::forward<_ArgTypes>(__arg)...); +} + +#ifndef _LIBCPP_NO_RTTI + +template +const std::type_info& +function<_Rp(_ArgTypes...)>::target_type() const _NOEXCEPT +{ + return __f_.target_type(); +} + +template +template +_Tp* +function<_Rp(_ArgTypes...)>::target() _NOEXCEPT +{ + return (_Tp*)(__f_.template target<_Tp>()); +} + +template +template +const _Tp* +function<_Rp(_ArgTypes...)>::target() const _NOEXCEPT +{ + return __f_.template target<_Tp>(); +} + +#endif // _LIBCPP_NO_RTTI + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return !__f;} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return !__f;} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const function<_Rp(_ArgTypes...)>& __f, nullptr_t) _NOEXCEPT {return (bool)__f;} + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(nullptr_t, const function<_Rp(_ArgTypes...)>& __f) _NOEXCEPT {return (bool)__f;} + +template +inline _LIBCPP_INLINE_VISIBILITY +void +swap(function<_Rp(_ArgTypes...)>& __x, function<_Rp(_ArgTypes...)>& __y) _NOEXCEPT +{return __x.swap(__y);} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_CXX03_LANG + +#endif // _LIBCPP___FUNCTIONAL_FUNCTION_H diff --git a/app/src/main/cpp/libcxx/include/__functional/hash.h b/app/src/main/cpp/libcxx/include/__functional/hash.h new file mode 100644 index 0000000..dfd8ea2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/hash.h @@ -0,0 +1,693 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_HASH_H +#define _LIBCPP___FUNCTIONAL_HASH_H + +#include <__config> +#include <__functional/invoke.h> +#include <__functional/unary_function.h> +#include <__fwd/hash.h> +#include <__tuple_dir/sfinae_helpers.h> +#include <__type_traits/is_copy_constructible.h> +#include <__type_traits/is_default_constructible.h> +#include <__type_traits/is_enum.h> +#include <__type_traits/is_move_constructible.h> +#include <__type_traits/underlying_type.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include <__utility/swap.h> +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY +_Size +__loadword(const void* __p) +{ + _Size __r; + _VSTD::memcpy(&__r, __p, sizeof(__r)); + return __r; +} + +// We use murmur2 when size_t is 32 bits, and cityhash64 when size_t +// is 64 bits. This is because cityhash64 uses 64bit x 64bit +// multiplication, which can be very slow on 32-bit systems. +template +struct __murmur2_or_cityhash; + +template +struct __murmur2_or_cityhash<_Size, 32> +{ + inline _Size operator()(const void* __key, _Size __len) + _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK; +}; + +// murmur2 +template +_Size +__murmur2_or_cityhash<_Size, 32>::operator()(const void* __key, _Size __len) +{ + const _Size __m = 0x5bd1e995; + const _Size __r = 24; + _Size __h = __len; + const unsigned char* __data = static_cast(__key); + for (; __len >= 4; __data += 4, __len -= 4) + { + _Size __k = std::__loadword<_Size>(__data); + __k *= __m; + __k ^= __k >> __r; + __k *= __m; + __h *= __m; + __h ^= __k; + } + switch (__len) + { + case 3: + __h ^= static_cast<_Size>(__data[2] << 16); + _LIBCPP_FALLTHROUGH(); + case 2: + __h ^= static_cast<_Size>(__data[1] << 8); + _LIBCPP_FALLTHROUGH(); + case 1: + __h ^= __data[0]; + __h *= __m; + } + __h ^= __h >> 13; + __h *= __m; + __h ^= __h >> 15; + return __h; +} + +template +struct __murmur2_or_cityhash<_Size, 64> +{ + inline _Size operator()(const void* __key, _Size __len) _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK; + + private: + // Some primes between 2^63 and 2^64. + static const _Size __k0 = 0xc3a5c85c97cb3127ULL; + static const _Size __k1 = 0xb492b66fbe98f273ULL; + static const _Size __k2 = 0x9ae16a3b2f90404fULL; + static const _Size __k3 = 0xc949d7c7509e6557ULL; + + static _Size __rotate(_Size __val, int __shift) { + return __shift == 0 ? __val : ((__val >> __shift) | (__val << (64 - __shift))); + } + + static _Size __rotate_by_at_least_1(_Size __val, int __shift) { + return (__val >> __shift) | (__val << (64 - __shift)); + } + + static _Size __shift_mix(_Size __val) { + return __val ^ (__val >> 47); + } + + static _Size __hash_len_16(_Size __u, _Size __v) + _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK + { + const _Size __mul = 0x9ddfea08eb382d69ULL; + _Size __a = (__u ^ __v) * __mul; + __a ^= (__a >> 47); + _Size __b = (__v ^ __a) * __mul; + __b ^= (__b >> 47); + __b *= __mul; + return __b; + } + + static _Size __hash_len_0_to_16(const char* __s, _Size __len) + _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK + { + if (__len > 8) { + const _Size __a = std::__loadword<_Size>(__s); + const _Size __b = std::__loadword<_Size>(__s + __len - 8); + return __hash_len_16(__a, __rotate_by_at_least_1(__b + __len, __len)) ^ __b; + } + if (__len >= 4) { + const uint32_t __a = std::__loadword(__s); + const uint32_t __b = std::__loadword(__s + __len - 4); + return __hash_len_16(__len + (static_cast<_Size>(__a) << 3), __b); + } + if (__len > 0) { + const unsigned char __a = static_cast(__s[0]); + const unsigned char __b = static_cast(__s[__len >> 1]); + const unsigned char __c = static_cast(__s[__len - 1]); + const uint32_t __y = static_cast(__a) + + (static_cast(__b) << 8); + const uint32_t __z = __len + (static_cast(__c) << 2); + return __shift_mix(__y * __k2 ^ __z * __k3) * __k2; + } + return __k2; + } + + static _Size __hash_len_17_to_32(const char *__s, _Size __len) + _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK + { + const _Size __a = std::__loadword<_Size>(__s) * __k1; + const _Size __b = std::__loadword<_Size>(__s + 8); + const _Size __c = std::__loadword<_Size>(__s + __len - 8) * __k2; + const _Size __d = std::__loadword<_Size>(__s + __len - 16) * __k0; + return __hash_len_16(__rotate(__a - __b, 43) + __rotate(__c, 30) + __d, + __a + __rotate(__b ^ __k3, 20) - __c + __len); + } + + // Return a 16-byte hash for 48 bytes. Quick and dirty. + // Callers do best to use "random-looking" values for a and b. + static pair<_Size, _Size> __weak_hash_len_32_with_seeds( + _Size __w, _Size __x, _Size __y, _Size __z, _Size __a, _Size __b) + _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK + { + __a += __w; + __b = __rotate(__b + __a + __z, 21); + const _Size __c = __a; + __a += __x; + __a += __y; + __b += __rotate(__a, 44); + return pair<_Size, _Size>(__a + __z, __b + __c); + } + + // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty. + static pair<_Size, _Size> __weak_hash_len_32_with_seeds( + const char* __s, _Size __a, _Size __b) + _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK + { + return __weak_hash_len_32_with_seeds(std::__loadword<_Size>(__s), + std::__loadword<_Size>(__s + 8), + std::__loadword<_Size>(__s + 16), + std::__loadword<_Size>(__s + 24), + __a, + __b); + } + + // Return an 8-byte hash for 33 to 64 bytes. + static _Size __hash_len_33_to_64(const char *__s, size_t __len) + _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK + { + _Size __z = std::__loadword<_Size>(__s + 24); + _Size __a = std::__loadword<_Size>(__s) + + (__len + std::__loadword<_Size>(__s + __len - 16)) * __k0; + _Size __b = __rotate(__a + __z, 52); + _Size __c = __rotate(__a, 37); + __a += std::__loadword<_Size>(__s + 8); + __c += __rotate(__a, 7); + __a += std::__loadword<_Size>(__s + 16); + _Size __vf = __a + __z; + _Size __vs = __b + __rotate(__a, 31) + __c; + __a = std::__loadword<_Size>(__s + 16) + std::__loadword<_Size>(__s + __len - 32); + __z += std::__loadword<_Size>(__s + __len - 8); + __b = __rotate(__a + __z, 52); + __c = __rotate(__a, 37); + __a += std::__loadword<_Size>(__s + __len - 24); + __c += __rotate(__a, 7); + __a += std::__loadword<_Size>(__s + __len - 16); + _Size __wf = __a + __z; + _Size __ws = __b + __rotate(__a, 31) + __c; + _Size __r = __shift_mix((__vf + __ws) * __k2 + (__wf + __vs) * __k0); + return __shift_mix(__r * __k0 + __vs) * __k2; + } +}; + +// cityhash64 +template +_Size +__murmur2_or_cityhash<_Size, 64>::operator()(const void* __key, _Size __len) +{ + const char* __s = static_cast(__key); + if (__len <= 32) { + if (__len <= 16) { + return __hash_len_0_to_16(__s, __len); + } else { + return __hash_len_17_to_32(__s, __len); + } + } else if (__len <= 64) { + return __hash_len_33_to_64(__s, __len); + } + + // For strings over 64 bytes we hash the end first, and then as we + // loop we keep 56 bytes of state: v, w, x, y, and z. + _Size __x = std::__loadword<_Size>(__s + __len - 40); + _Size __y = std::__loadword<_Size>(__s + __len - 16) + + std::__loadword<_Size>(__s + __len - 56); + _Size __z = __hash_len_16(std::__loadword<_Size>(__s + __len - 48) + __len, + std::__loadword<_Size>(__s + __len - 24)); + pair<_Size, _Size> __v = __weak_hash_len_32_with_seeds(__s + __len - 64, __len, __z); + pair<_Size, _Size> __w = __weak_hash_len_32_with_seeds(__s + __len - 32, __y + __k1, __x); + __x = __x * __k1 + std::__loadword<_Size>(__s); + + // Decrease len to the nearest multiple of 64, and operate on 64-byte chunks. + __len = (__len - 1) & ~static_cast<_Size>(63); + do { + __x = __rotate(__x + __y + __v.first + std::__loadword<_Size>(__s + 8), 37) * __k1; + __y = __rotate(__y + __v.second + std::__loadword<_Size>(__s + 48), 42) * __k1; + __x ^= __w.second; + __y += __v.first + std::__loadword<_Size>(__s + 40); + __z = __rotate(__z + __w.first, 33) * __k1; + __v = __weak_hash_len_32_with_seeds(__s, __v.second * __k1, __x + __w.first); + __w = __weak_hash_len_32_with_seeds(__s + 32, __z + __w.second, + __y + std::__loadword<_Size>(__s + 16)); + _VSTD::swap(__z, __x); + __s += 64; + __len -= 64; + } while (__len != 0); + return __hash_len_16( + __hash_len_16(__v.first, __w.first) + __shift_mix(__y) * __k1 + __z, + __hash_len_16(__v.second, __w.second) + __x); +} + +template +struct __scalar_hash; + +template +struct __scalar_hash<_Tp, 0> + : public __unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + size_t __a; + } __u; + __u.__a = 0; + __u.__t = __v; + return __u.__a; + } +}; + +template +struct __scalar_hash<_Tp, 1> + : public __unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + size_t __a; + } __u; + __u.__t = __v; + return __u.__a; + } +}; + +template +struct __scalar_hash<_Tp, 2> + : public __unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + struct + { + size_t __a; + size_t __b; + } __s; + } __u; + __u.__t = __v; + return __murmur2_or_cityhash()(&__u, sizeof(__u)); + } +}; + +template +struct __scalar_hash<_Tp, 3> + : public __unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + struct + { + size_t __a; + size_t __b; + size_t __c; + } __s; + } __u; + __u.__t = __v; + return __murmur2_or_cityhash()(&__u, sizeof(__u)); + } +}; + +template +struct __scalar_hash<_Tp, 4> + : public __unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + union + { + _Tp __t; + struct + { + size_t __a; + size_t __b; + size_t __c; + size_t __d; + } __s; + } __u; + __u.__t = __v; + return __murmur2_or_cityhash()(&__u, sizeof(__u)); + } +}; + +struct _PairT { + size_t first; + size_t second; +}; + +_LIBCPP_INLINE_VISIBILITY +inline size_t __hash_combine(size_t __lhs, size_t __rhs) _NOEXCEPT { + typedef __scalar_hash<_PairT> _HashT; + const _PairT __p = {__lhs, __rhs}; + return _HashT()(__p); +} + +template +struct _LIBCPP_TEMPLATE_VIS hash<_Tp*> + : public __unary_function<_Tp*, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp* __v) const _NOEXCEPT + { + union + { + _Tp* __t; + size_t __a; + } __u; + __u.__t = __v; + return __murmur2_or_cityhash()(&__u, sizeof(__u)); + } +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(bool __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(signed char __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned char __v) const _NOEXCEPT {return static_cast(__v);} +}; + +#ifndef _LIBCPP_HAS_NO_CHAR8_T +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char8_t __v) const _NOEXCEPT {return static_cast(__v);} +}; +#endif // !_LIBCPP_HAS_NO_CHAR8_T + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char16_t __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(char32_t __v) const _NOEXCEPT {return static_cast(__v);} +}; + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(wchar_t __v) const _NOEXCEPT {return static_cast(__v);} +}; +#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(short __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned short __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(int __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned int __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(long __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(unsigned long __v) const _NOEXCEPT {return static_cast(__v);} +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __scalar_hash +{ +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __scalar_hash +{ +}; + +#ifndef _LIBCPP_HAS_NO_INT128 + +template <> +struct _LIBCPP_TEMPLATE_VIS hash<__int128_t> + : public __scalar_hash<__int128_t> +{ +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash<__uint128_t> + : public __scalar_hash<__uint128_t> +{ +}; + +#endif + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __scalar_hash +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(float __v) const _NOEXCEPT + { + // -0.0 and 0.0 should return same hash + if (__v == 0.0f) + return 0; + return __scalar_hash::operator()(__v); + } +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __scalar_hash +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(double __v) const _NOEXCEPT + { + // -0.0 and 0.0 should return same hash + if (__v == 0.0) + return 0; + return __scalar_hash::operator()(__v); + } +}; + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __scalar_hash +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(long double __v) const _NOEXCEPT + { + // -0.0 and 0.0 should return same hash + if (__v == 0.0L) + return 0; +#if defined(__i386__) || (defined(__x86_64__) && defined(__ILP32__)) + // Zero out padding bits + union + { + long double __t; + struct + { + size_t __a; + size_t __b; + size_t __c; + size_t __d; + } __s; + } __u; + __u.__s.__a = 0; + __u.__s.__b = 0; + __u.__s.__c = 0; + __u.__s.__d = 0; + __u.__t = __v; + return __u.__s.__a ^ __u.__s.__b ^ __u.__s.__c ^ __u.__s.__d; +#elif defined(__x86_64__) + // Zero out padding bits + union + { + long double __t; + struct + { + size_t __a; + size_t __b; + } __s; + } __u; + __u.__s.__a = 0; + __u.__s.__b = 0; + __u.__t = __v; + return __u.__s.__a ^ __u.__s.__b; +#else + return __scalar_hash::operator()(__v); +#endif + } +}; + +template ::value> +struct _LIBCPP_TEMPLATE_VIS __enum_hash + : public __unary_function<_Tp, size_t> +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(_Tp __v) const _NOEXCEPT + { + typedef typename underlying_type<_Tp>::type type; + return hash()(static_cast(__v)); + } +}; +template +struct _LIBCPP_TEMPLATE_VIS __enum_hash<_Tp, false> { + __enum_hash() = delete; + __enum_hash(__enum_hash const&) = delete; + __enum_hash& operator=(__enum_hash const&) = delete; +}; + +template +struct _LIBCPP_TEMPLATE_VIS hash : public __enum_hash<_Tp> +{ +}; + +#if _LIBCPP_STD_VER > 14 + +template <> +struct _LIBCPP_TEMPLATE_VIS hash + : public __unary_function +{ + _LIBCPP_INLINE_VISIBILITY + size_t operator()(nullptr_t) const _NOEXCEPT { + return 662607004ull; + } +}; +#endif + +#ifndef _LIBCPP_CXX03_LANG +template +using __check_hash_requirements _LIBCPP_NODEBUG = integral_constant::value && + is_move_constructible<_Hash>::value && + __invokable_r::value +>; + +template > +using __has_enabled_hash _LIBCPP_NODEBUG = integral_constant::value && + is_default_constructible<_Hash>::value +>; + +#if _LIBCPP_STD_VER > 14 +template +using __enable_hash_helper_imp _LIBCPP_NODEBUG = _Type; + +template +using __enable_hash_helper _LIBCPP_NODEBUG = __enable_hash_helper_imp<_Type, + typename enable_if<__all<__has_enabled_hash<_Keys>::value...>::value>::type +>; +#else +template +using __enable_hash_helper _LIBCPP_NODEBUG = _Type; +#endif + +#endif // !_LIBCPP_CXX03_LANG + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_HASH_H diff --git a/app/src/main/cpp/libcxx/include/__functional/identity.h b/app/src/main/cpp/libcxx/include/__functional/identity.h new file mode 100644 index 0000000..2fe3acc --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/identity.h @@ -0,0 +1,46 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_IDENTITY_H +#define _LIBCPP___FUNCTIONAL_IDENTITY_H + +#include <__config> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +struct __identity { + template + _LIBCPP_NODISCARD _LIBCPP_CONSTEXPR _Tp&& operator()(_Tp&& __t) const _NOEXCEPT { + return std::forward<_Tp>(__t); + } + + using is_transparent = void; +}; + +#if _LIBCPP_STD_VER > 17 + +struct identity { + template + _LIBCPP_NODISCARD_EXT constexpr _Tp&& operator()(_Tp&& __t) const noexcept + { + return _VSTD::forward<_Tp>(__t); + } + + using is_transparent = void; +}; +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_IDENTITY_H diff --git a/app/src/main/cpp/libcxx/include/__functional/invoke.h b/app/src/main/cpp/libcxx/include/__functional/invoke.h new file mode 100644 index 0000000..48e6eac --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/invoke.h @@ -0,0 +1,546 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_INVOKE_H +#define _LIBCPP___FUNCTIONAL_INVOKE_H + +#include <__config> +#include <__type_traits/add_lvalue_reference.h> +#include <__type_traits/apply_cv.h> +#include <__type_traits/conditional.h> +#include <__type_traits/decay.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/integral_constant.h> +#include <__type_traits/is_base_of.h> +#include <__type_traits/is_core_convertible.h> +#include <__type_traits/is_member_function_pointer.h> +#include <__type_traits/is_member_object_pointer.h> +#include <__type_traits/is_reference_wrapper.h> +#include <__type_traits/is_same.h> +#include <__type_traits/is_void.h> +#include <__type_traits/nat.h> +#include <__type_traits/remove_cv.h> +#include <__utility/declval.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +// TODO: Disentangle the type traits and std::invoke properly + +_LIBCPP_BEGIN_NAMESPACE_STD + +struct __any +{ + __any(...); +}; + +template +struct __member_pointer_traits_imp +{ +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &, true, false> +{ + typedef _Class& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) &, true, false> +{ + typedef _Class& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, false> +{ + typedef _Class const& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&, true, false> +{ + typedef _Class const& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, false> +{ + typedef _Class volatile& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&, true, false> +{ + typedef _Class volatile& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, true, false> +{ + typedef _Class const volatile& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&, true, false> +{ + typedef _Class const volatile& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &&, true, false> +{ + typedef _Class&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) &&, true, false> +{ + typedef _Class&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, false> +{ + typedef _Class const&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&&, true, false> +{ + typedef _Class const&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, false> +{ + typedef _Class volatile&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&&, true, false> +{ + typedef _Class volatile&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, true, false> +{ + typedef _Class const volatile&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param...); +}; + +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&&, true, false> +{ + typedef _Class const volatile&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + +template +struct __member_pointer_traits_imp<_Rp _Class::*, false, true> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; +}; + +template +struct __member_pointer_traits + : public __member_pointer_traits_imp<__remove_cv_t<_MP>, + is_member_function_pointer<_MP>::value, + is_member_object_pointer<_MP>::value> +{ +// typedef ... _ClassType; +// typedef ... _ReturnType; +// typedef ... _FnType; +}; + +template +struct __member_pointer_class_type {}; + +template +struct __member_pointer_class_type<_Ret _ClassType::*> { + typedef _ClassType type; +}; + +template ::type, + class _DecayA0 = typename decay<_A0>::type, + class _ClassT = typename __member_pointer_class_type<_DecayFp>::type> +using __enable_if_bullet1 = typename enable_if + < + is_member_function_pointer<_DecayFp>::value + && is_base_of<_ClassT, _DecayA0>::value + >::type; + +template ::type, + class _DecayA0 = typename decay<_A0>::type> +using __enable_if_bullet2 = typename enable_if + < + is_member_function_pointer<_DecayFp>::value + && __is_reference_wrapper<_DecayA0>::value + >::type; + +template ::type, + class _DecayA0 = typename decay<_A0>::type, + class _ClassT = typename __member_pointer_class_type<_DecayFp>::type> +using __enable_if_bullet3 = typename enable_if + < + is_member_function_pointer<_DecayFp>::value + && !is_base_of<_ClassT, _DecayA0>::value + && !__is_reference_wrapper<_DecayA0>::value + >::type; + +template ::type, + class _DecayA0 = typename decay<_A0>::type, + class _ClassT = typename __member_pointer_class_type<_DecayFp>::type> +using __enable_if_bullet4 = typename enable_if + < + is_member_object_pointer<_DecayFp>::value + && is_base_of<_ClassT, _DecayA0>::value + >::type; + +template ::type, + class _DecayA0 = typename decay<_A0>::type> +using __enable_if_bullet5 = typename enable_if + < + is_member_object_pointer<_DecayFp>::value + && __is_reference_wrapper<_DecayA0>::value + >::type; + +template ::type, + class _DecayA0 = typename decay<_A0>::type, + class _ClassT = typename __member_pointer_class_type<_DecayFp>::type> +using __enable_if_bullet6 = typename enable_if + < + is_member_object_pointer<_DecayFp>::value + && !is_base_of<_ClassT, _DecayA0>::value + && !__is_reference_wrapper<_DecayA0>::value + >::type; + +// __invoke forward declarations + +// fall back - none of the bullets + +template +__nat __invoke(__any, _Args&& ...__args); + +// bullets 1, 2 and 3 + +template > +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR decltype((std::declval<_A0>().*std::declval<_Fp>())(std::declval<_Args>()...)) +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) + _NOEXCEPT_(noexcept((static_cast<_A0&&>(__a0).*__f)(static_cast<_Args&&>(__args)...))) + { return (static_cast<_A0&&>(__a0).*__f)(static_cast<_Args&&>(__args)...); } + +template > +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR decltype((std::declval<_A0>().get().*std::declval<_Fp>())(std::declval<_Args>()...)) +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) + _NOEXCEPT_(noexcept((__a0.get().*__f)(static_cast<_Args&&>(__args)...))) + { return (__a0.get().*__f)(static_cast<_Args&&>(__args)...); } + +template > +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR decltype(((*std::declval<_A0>()).*std::declval<_Fp>())(std::declval<_Args>()...)) +__invoke(_Fp&& __f, _A0&& __a0, _Args&& ...__args) + _NOEXCEPT_(noexcept(((*static_cast<_A0&&>(__a0)).*__f)(static_cast<_Args&&>(__args)...))) + { return ((*static_cast<_A0&&>(__a0)).*__f)(static_cast<_Args&&>(__args)...); } + +// bullets 4, 5 and 6 + +template > +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR decltype(std::declval<_A0>().*std::declval<_Fp>()) +__invoke(_Fp&& __f, _A0&& __a0) + _NOEXCEPT_(noexcept(static_cast<_A0&&>(__a0).*__f)) + { return static_cast<_A0&&>(__a0).*__f; } + +template > +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR decltype(std::declval<_A0>().get().*std::declval<_Fp>()) +__invoke(_Fp&& __f, _A0&& __a0) + _NOEXCEPT_(noexcept(__a0.get().*__f)) + { return __a0.get().*__f; } + +template > +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR decltype((*std::declval<_A0>()).*std::declval<_Fp>()) +__invoke(_Fp&& __f, _A0&& __a0) + _NOEXCEPT_(noexcept((*static_cast<_A0&&>(__a0)).*__f)) + { return (*static_cast<_A0&&>(__a0)).*__f; } + +// bullet 7 + +template +inline _LIBCPP_INLINE_VISIBILITY +_LIBCPP_CONSTEXPR decltype(std::declval<_Fp>()(std::declval<_Args>()...)) +__invoke(_Fp&& __f, _Args&& ...__args) + _NOEXCEPT_(noexcept(static_cast<_Fp&&>(__f)(static_cast<_Args&&>(__args)...))) + { return static_cast<_Fp&&>(__f)(static_cast<_Args&&>(__args)...); } + +// __invokable +template +struct __invokable_r +{ + template + static decltype(std::__invoke(std::declval<_XFp>(), std::declval<_XArgs>()...)) __try_call(int); + template + static __nat __try_call(...); + + // FIXME: Check that _Ret, _Fp, and _Args... are all complete types, cv void, + // or incomplete array types as required by the standard. + using _Result = decltype(__try_call<_Fp, _Args...>(0)); + + using type = __conditional_t< + _IsNotSame<_Result, __nat>::value, + __conditional_t::value, true_type, __is_core_convertible<_Result, _Ret> >, + false_type>; + static const bool value = type::value; +}; +template +using __invokable = __invokable_r; + +template +struct __nothrow_invokable_r_imp { + static const bool value = false; +}; + +template +struct __nothrow_invokable_r_imp +{ + typedef __nothrow_invokable_r_imp _ThisT; + + template + static void __test_noexcept(_Tp) _NOEXCEPT; + +#ifdef _LIBCPP_CXX03_LANG + static const bool value = false; +#else + static const bool value = noexcept(_ThisT::__test_noexcept<_Ret>( + _VSTD::__invoke(std::declval<_Fp>(), std::declval<_Args>()...))); +#endif +}; + +template +struct __nothrow_invokable_r_imp +{ +#ifdef _LIBCPP_CXX03_LANG + static const bool value = false; +#else + static const bool value = noexcept( + _VSTD::__invoke(std::declval<_Fp>(), std::declval<_Args>()...)); +#endif +}; + +template +using __nothrow_invokable_r = + __nothrow_invokable_r_imp< + __invokable_r<_Ret, _Fp, _Args...>::value, + is_void<_Ret>::value, + _Ret, _Fp, _Args... + >; + +template +using __nothrow_invokable = + __nothrow_invokable_r_imp< + __invokable<_Fp, _Args...>::value, + true, void, _Fp, _Args... + >; + +template +struct __invoke_of + : public enable_if< + __invokable<_Fp, _Args...>::value, + typename __invokable_r::_Result> +{ +}; + +template ::value> +struct __invoke_void_return_wrapper +{ + template + static _Ret __call(_Args&&... __args) { + return std::__invoke(std::forward<_Args>(__args)...); + } +}; + +template +struct __invoke_void_return_wrapper<_Ret, true> +{ + template + static void __call(_Args&&... __args) { + std::__invoke(std::forward<_Args>(__args)...); + } +}; + +#if _LIBCPP_STD_VER > 14 + +// is_invocable + +template +struct _LIBCPP_TEMPLATE_VIS is_invocable + : integral_constant::value> {}; + +template +struct _LIBCPP_TEMPLATE_VIS is_invocable_r + : integral_constant::value> {}; + +template +inline constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value; + +template +inline constexpr bool is_invocable_r_v = is_invocable_r<_Ret, _Fn, _Args...>::value; + +// is_nothrow_invocable + +template +struct _LIBCPP_TEMPLATE_VIS is_nothrow_invocable + : integral_constant::value> {}; + +template +struct _LIBCPP_TEMPLATE_VIS is_nothrow_invocable_r + : integral_constant::value> {}; + +template +inline constexpr bool is_nothrow_invocable_v = is_nothrow_invocable<_Fn, _Args...>::value; + +template +inline constexpr bool is_nothrow_invocable_r_v = is_nothrow_invocable_r<_Ret, _Fn, _Args...>::value; + +template +struct _LIBCPP_TEMPLATE_VIS invoke_result + : __invoke_of<_Fn, _Args...> +{ +}; + +template +using invoke_result_t = typename invoke_result<_Fn, _Args...>::type; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 invoke_result_t<_Fn, _Args...> +invoke(_Fn&& __f, _Args&&... __args) + noexcept(is_nothrow_invocable_v<_Fn, _Args...>) +{ + return _VSTD::__invoke(_VSTD::forward<_Fn>(__f), _VSTD::forward<_Args>(__args)...); +} + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_INVOKE_H diff --git a/app/src/main/cpp/libcxx/include/__functional/is_transparent.h b/app/src/main/cpp/libcxx/include/__functional/is_transparent.h new file mode 100644 index 0000000..c7a0ee9 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/is_transparent.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_IS_TRANSPARENT +#define _LIBCPP___FUNCTIONAL_IS_TRANSPARENT + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 11 + +template +struct __is_transparent : false_type {}; + +template +struct __is_transparent<_Tp, _Up, __void_t > + : true_type {}; + +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_IS_TRANSPARENT diff --git a/app/src/main/cpp/libcxx/include/__functional/mem_fn.h b/app/src/main/cpp/libcxx/include/__functional/mem_fn.h new file mode 100644 index 0000000..8b51627 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/mem_fn.h @@ -0,0 +1,59 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_MEM_FN_H +#define _LIBCPP___FUNCTIONAL_MEM_FN_H + +#include <__config> +#include <__functional/binary_function.h> +#include <__functional/invoke.h> +#include <__functional/weak_result_type.h> +#include <__utility/forward.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class __mem_fn : public __weak_result_type<_Tp> +{ +public: + // types + typedef _Tp type; +private: + type __f_; + +public: + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + __mem_fn(type __f) _NOEXCEPT : __f_(__f) {} + + // invoke + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + + typename __invoke_return::type + operator() (_ArgTypes&&... __args) const { + return std::__invoke(__f_, std::forward<_ArgTypes>(__args)...); + } +}; + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +__mem_fn<_Rp _Tp::*> +mem_fn(_Rp _Tp::* __pm) _NOEXCEPT +{ + return __mem_fn<_Rp _Tp::*>(__pm); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_MEM_FN_H diff --git a/app/src/main/cpp/libcxx/include/__functional/mem_fun_ref.h b/app/src/main/cpp/libcxx/include/__functional/mem_fun_ref.h new file mode 100644 index 0000000..65aab06 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/mem_fun_ref.h @@ -0,0 +1,173 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_MEM_FUN_REF_H +#define _LIBCPP___FUNCTIONAL_MEM_FUN_REF_H + +#include <__config> +#include <__functional/binary_function.h> +#include <__functional/unary_function.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_t + : public __unary_function<_Tp*, _Sp> +{ + _Sp (_Tp::*__p_)(); +public: + _LIBCPP_INLINE_VISIBILITY explicit mem_fun_t(_Sp (_Tp::*__p)()) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p) const + {return (__p->*__p_)();} +}; + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_t + : public __binary_function<_Tp*, _Ap, _Sp> +{ + _Sp (_Tp::*__p_)(_Ap); +public: + _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_t(_Sp (_Tp::*__p)(_Ap)) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp* __p, _Ap __x) const + {return (__p->*__p_)(__x);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +mem_fun_t<_Sp,_Tp> +mem_fun(_Sp (_Tp::*__f)()) + {return mem_fun_t<_Sp,_Tp>(__f);} + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +mem_fun1_t<_Sp,_Tp,_Ap> +mem_fun(_Sp (_Tp::*__f)(_Ap)) + {return mem_fun1_t<_Sp,_Tp,_Ap>(__f);} + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun_ref_t + : public __unary_function<_Tp, _Sp> +{ + _Sp (_Tp::*__p_)(); +public: + _LIBCPP_INLINE_VISIBILITY explicit mem_fun_ref_t(_Sp (_Tp::*__p)()) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p) const + {return (__p.*__p_)();} +}; + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 mem_fun1_ref_t + : public __binary_function<_Tp, _Ap, _Sp> +{ + _Sp (_Tp::*__p_)(_Ap); +public: + _LIBCPP_INLINE_VISIBILITY explicit mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap)) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(_Tp& __p, _Ap __x) const + {return (__p.*__p_)(__x);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +mem_fun_ref_t<_Sp,_Tp> +mem_fun_ref(_Sp (_Tp::*__f)()) + {return mem_fun_ref_t<_Sp,_Tp>(__f);} + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +mem_fun1_ref_t<_Sp,_Tp,_Ap> +mem_fun_ref(_Sp (_Tp::*__f)(_Ap)) + {return mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);} + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_t + : public __unary_function +{ + _Sp (_Tp::*__p_)() const; +public: + _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_t(_Sp (_Tp::*__p)() const) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p) const + {return (__p->*__p_)();} +}; + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_t + : public __binary_function +{ + _Sp (_Tp::*__p_)(_Ap) const; +public: + _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_t(_Sp (_Tp::*__p)(_Ap) const) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp* __p, _Ap __x) const + {return (__p->*__p_)(__x);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +const_mem_fun_t<_Sp,_Tp> +mem_fun(_Sp (_Tp::*__f)() const) + {return const_mem_fun_t<_Sp,_Tp>(__f);} + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +const_mem_fun1_t<_Sp,_Tp,_Ap> +mem_fun(_Sp (_Tp::*__f)(_Ap) const) + {return const_mem_fun1_t<_Sp,_Tp,_Ap>(__f);} + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun_ref_t + : public __unary_function<_Tp, _Sp> +{ + _Sp (_Tp::*__p_)() const; +public: + _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun_ref_t(_Sp (_Tp::*__p)() const) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p) const + {return (__p.*__p_)();} +}; + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 const_mem_fun1_ref_t + : public __binary_function<_Tp, _Ap, _Sp> +{ + _Sp (_Tp::*__p_)(_Ap) const; +public: + _LIBCPP_INLINE_VISIBILITY explicit const_mem_fun1_ref_t(_Sp (_Tp::*__p)(_Ap) const) + : __p_(__p) {} + _LIBCPP_INLINE_VISIBILITY _Sp operator()(const _Tp& __p, _Ap __x) const + {return (__p.*__p_)(__x);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +const_mem_fun_ref_t<_Sp,_Tp> +mem_fun_ref(_Sp (_Tp::*__f)() const) + {return const_mem_fun_ref_t<_Sp,_Tp>(__f);} + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +const_mem_fun1_ref_t<_Sp,_Tp,_Ap> +mem_fun_ref(_Sp (_Tp::*__f)(_Ap) const) + {return const_mem_fun1_ref_t<_Sp,_Tp,_Ap>(__f);} + +#endif // _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_MEM_FUN_REF_H diff --git a/app/src/main/cpp/libcxx/include/__functional/not_fn.h b/app/src/main/cpp/libcxx/include/__functional/not_fn.h new file mode 100644 index 0000000..79d9a87 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/not_fn.h @@ -0,0 +1,54 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_NOT_FN_H +#define _LIBCPP___FUNCTIONAL_NOT_FN_H + +#include <__config> +#include <__functional/invoke.h> +#include <__functional/perfect_forward.h> +#include <__utility/forward.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +struct __not_fn_op { + template + _LIBCPP_HIDE_FROM_ABI + _LIBCPP_CONSTEXPR_SINCE_CXX20 auto operator()(_Args&&... __args) const + noexcept(noexcept(!_VSTD::invoke(_VSTD::forward<_Args>(__args)...))) + -> decltype( !_VSTD::invoke(_VSTD::forward<_Args>(__args)...)) + { return !_VSTD::invoke(_VSTD::forward<_Args>(__args)...); } +}; + +template +struct __not_fn_t : __perfect_forward<__not_fn_op, _Fn> { + using __perfect_forward<__not_fn_op, _Fn>::__perfect_forward; +}; + +template , _Fn> && + is_move_constructible_v> +>> +_LIBCPP_HIDE_FROM_ABI +_LIBCPP_CONSTEXPR_SINCE_CXX20 auto not_fn(_Fn&& __f) { + return __not_fn_t>(_VSTD::forward<_Fn>(__f)); +} + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_NOT_FN_H diff --git a/app/src/main/cpp/libcxx/include/__functional/operations.h b/app/src/main/cpp/libcxx/include/__functional/operations.h new file mode 100644 index 0000000..8a781ef --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/operations.h @@ -0,0 +1,580 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_OPERATIONS_H +#define _LIBCPP___FUNCTIONAL_OPERATIONS_H + +#include <__config> +#include <__functional/binary_function.h> +#include <__functional/unary_function.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Arithmetic operations + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS plus + : __binary_function<_Tp, _Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x + __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(plus); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS plus +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS minus + : __binary_function<_Tp, _Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x - __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(minus); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS minus +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) - _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS multiplies + : __binary_function<_Tp, _Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x * __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(multiplies); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS multiplies +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) * _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS divides + : __binary_function<_Tp, _Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x / __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(divides); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS divides +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) / _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS modulus + : __binary_function<_Tp, _Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x % __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(modulus); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS modulus +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) % _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS negate + : __unary_function<_Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return -__x;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(negate); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS negate +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_Tp&& __x) const + noexcept(noexcept(- _VSTD::forward<_Tp>(__x))) + -> decltype( - _VSTD::forward<_Tp>(__x)) + { return - _VSTD::forward<_Tp>(__x); } + typedef void is_transparent; +}; +#endif + +// Bitwise operations + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS bit_and + : __binary_function<_Tp, _Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x & __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(bit_and); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS bit_and +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) & _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +struct _LIBCPP_TEMPLATE_VIS bit_not + : __unary_function<_Tp, _Tp> +{ + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x) const + {return ~__x;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(bit_not); + +template <> +struct _LIBCPP_TEMPLATE_VIS bit_not +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_Tp&& __x) const + noexcept(noexcept(~_VSTD::forward<_Tp>(__x))) + -> decltype( ~_VSTD::forward<_Tp>(__x)) + { return ~_VSTD::forward<_Tp>(__x); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS bit_or + : __binary_function<_Tp, _Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x | __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(bit_or); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS bit_or +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) | _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS bit_xor + : __binary_function<_Tp, _Tp, _Tp> +{ + typedef _Tp __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + _Tp operator()(const _Tp& __x, const _Tp& __y) const + {return __x ^ __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(bit_xor); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS bit_xor +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) ^ _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +// Comparison operations + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS equal_to + : __binary_function<_Tp, _Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x == __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(equal_to); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS equal_to +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) == _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS not_equal_to + : __binary_function<_Tp, _Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x != __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(not_equal_to); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS not_equal_to +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) != _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS less + : __binary_function<_Tp, _Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x < __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(less); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS less +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS less_equal + : __binary_function<_Tp, _Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x <= __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(less_equal); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS less_equal +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) <= _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS greater_equal + : __binary_function<_Tp, _Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x >= __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(greater_equal); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS greater_equal +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) >= _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS greater + : __binary_function<_Tp, _Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x > __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(greater); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS greater +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) > _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +// Logical operations + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS logical_and + : __binary_function<_Tp, _Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x && __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(logical_and); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS logical_and +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) && _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS logical_not + : __unary_function<_Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x) const + {return !__x;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(logical_not); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS logical_not +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_Tp&& __x) const + noexcept(noexcept(!_VSTD::forward<_Tp>(__x))) + -> decltype( !_VSTD::forward<_Tp>(__x)) + { return !_VSTD::forward<_Tp>(__x); } + typedef void is_transparent; +}; +#endif + +#if _LIBCPP_STD_VER > 11 +template +#else +template +#endif +struct _LIBCPP_TEMPLATE_VIS logical_or + : __binary_function<_Tp, _Tp, bool> +{ + typedef bool __result_type; // used by valarray + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const _Tp& __x, const _Tp& __y) const + {return __x || __y;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(logical_or); + +#if _LIBCPP_STD_VER > 11 +template <> +struct _LIBCPP_TEMPLATE_VIS logical_or +{ + template + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + auto operator()(_T1&& __t, _T2&& __u) const + noexcept(noexcept(_VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u))) + -> decltype( _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u)) + { return _VSTD::forward<_T1>(__t) || _VSTD::forward<_T2>(__u); } + typedef void is_transparent; +}; +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_OPERATIONS_H diff --git a/app/src/main/cpp/libcxx/include/__functional/perfect_forward.h b/app/src/main/cpp/libcxx/include/__functional/perfect_forward.h new file mode 100644 index 0000000..9ffea1a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/perfect_forward.h @@ -0,0 +1,94 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_PERFECT_FORWARD_H +#define _LIBCPP___FUNCTIONAL_PERFECT_FORWARD_H + +#include <__config> +#include <__utility/declval.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template +struct __perfect_forward_impl; + +template +struct __perfect_forward_impl<_Op, index_sequence<_Idx...>, _BoundArgs...> { +private: + tuple<_BoundArgs...> __bound_args_; + +public: + template , _Args&&...> + >> + explicit constexpr __perfect_forward_impl(_Args&&... __bound_args) + : __bound_args_(_VSTD::forward<_Args>(__bound_args)...) {} + + __perfect_forward_impl(__perfect_forward_impl const&) = default; + __perfect_forward_impl(__perfect_forward_impl&&) = default; + + __perfect_forward_impl& operator=(__perfect_forward_impl const&) = default; + __perfect_forward_impl& operator=(__perfect_forward_impl&&) = default; + + template >> + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Args&&... __args) & + noexcept(noexcept(_Op()(_VSTD::get<_Idx>(__bound_args_)..., _VSTD::forward<_Args>(__args)...))) + -> decltype( _Op()(_VSTD::get<_Idx>(__bound_args_)..., _VSTD::forward<_Args>(__args)...)) + { return _Op()(_VSTD::get<_Idx>(__bound_args_)..., _VSTD::forward<_Args>(__args)...); } + + template >> + auto operator()(_Args&&...) & = delete; + + template >> + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Args&&... __args) const& + noexcept(noexcept(_Op()(_VSTD::get<_Idx>(__bound_args_)..., _VSTD::forward<_Args>(__args)...))) + -> decltype( _Op()(_VSTD::get<_Idx>(__bound_args_)..., _VSTD::forward<_Args>(__args)...)) + { return _Op()(_VSTD::get<_Idx>(__bound_args_)..., _VSTD::forward<_Args>(__args)...); } + + template >> + auto operator()(_Args&&...) const& = delete; + + template >> + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Args&&... __args) && + noexcept(noexcept(_Op()(_VSTD::get<_Idx>(_VSTD::move(__bound_args_))..., _VSTD::forward<_Args>(__args)...))) + -> decltype( _Op()(_VSTD::get<_Idx>(_VSTD::move(__bound_args_))..., _VSTD::forward<_Args>(__args)...)) + { return _Op()(_VSTD::get<_Idx>(_VSTD::move(__bound_args_))..., _VSTD::forward<_Args>(__args)...); } + + template >> + auto operator()(_Args&&...) && = delete; + + template >> + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Args&&... __args) const&& + noexcept(noexcept(_Op()(_VSTD::get<_Idx>(_VSTD::move(__bound_args_))..., _VSTD::forward<_Args>(__args)...))) + -> decltype( _Op()(_VSTD::get<_Idx>(_VSTD::move(__bound_args_))..., _VSTD::forward<_Args>(__args)...)) + { return _Op()(_VSTD::get<_Idx>(_VSTD::move(__bound_args_))..., _VSTD::forward<_Args>(__args)...); } + + template >> + auto operator()(_Args&&...) const&& = delete; +}; + +// __perfect_forward implements a perfect-forwarding call wrapper as explained in [func.require]. +template +using __perfect_forward = __perfect_forward_impl<_Op, index_sequence_for<_Args...>, _Args...>; + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_PERFECT_FORWARD_H diff --git a/app/src/main/cpp/libcxx/include/__functional/pointer_to_binary_function.h b/app/src/main/cpp/libcxx/include/__functional/pointer_to_binary_function.h new file mode 100644 index 0000000..b2676c5 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/pointer_to_binary_function.h @@ -0,0 +1,46 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_POINTER_TO_BINARY_FUNCTION_H +#define _LIBCPP___FUNCTIONAL_POINTER_TO_BINARY_FUNCTION_H + +#include <__config> +#include <__functional/binary_function.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_binary_function + : public __binary_function<_Arg1, _Arg2, _Result> +{ + _Result (*__f_)(_Arg1, _Arg2); +public: + _LIBCPP_INLINE_VISIBILITY explicit pointer_to_binary_function(_Result (*__f)(_Arg1, _Arg2)) + : __f_(__f) {} + _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg1 __x, _Arg2 __y) const + {return __f_(__x, __y);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +pointer_to_binary_function<_Arg1,_Arg2,_Result> +ptr_fun(_Result (*__f)(_Arg1,_Arg2)) + {return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f);} + +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_POINTER_TO_BINARY_FUNCTION_H diff --git a/app/src/main/cpp/libcxx/include/__functional/pointer_to_unary_function.h b/app/src/main/cpp/libcxx/include/__functional/pointer_to_unary_function.h new file mode 100644 index 0000000..77d07ad --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/pointer_to_unary_function.h @@ -0,0 +1,46 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_POINTER_TO_UNARY_FUNCTION_H +#define _LIBCPP___FUNCTIONAL_POINTER_TO_UNARY_FUNCTION_H + +#include <__config> +#include <__functional/unary_function.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 pointer_to_unary_function + : public __unary_function<_Arg, _Result> +{ + _Result (*__f_)(_Arg); +public: + _LIBCPP_INLINE_VISIBILITY explicit pointer_to_unary_function(_Result (*__f)(_Arg)) + : __f_(__f) {} + _LIBCPP_INLINE_VISIBILITY _Result operator()(_Arg __x) const + {return __f_(__x);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX11 inline _LIBCPP_INLINE_VISIBILITY +pointer_to_unary_function<_Arg,_Result> +ptr_fun(_Result (*__f)(_Arg)) + {return pointer_to_unary_function<_Arg,_Result>(__f);} + +#endif // _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_POINTER_TO_UNARY_FUNCTION_H diff --git a/app/src/main/cpp/libcxx/include/__functional/ranges_operations.h b/app/src/main/cpp/libcxx/include/__functional/ranges_operations.h new file mode 100644 index 0000000..87081dd --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/ranges_operations.h @@ -0,0 +1,100 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_RANGES_OPERATIONS_H +#define _LIBCPP___FUNCTIONAL_RANGES_OPERATIONS_H + +#include <__concepts/equality_comparable.h> +#include <__concepts/totally_ordered.h> +#include <__config> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +namespace ranges { + +struct equal_to { + template + requires equality_comparable_with<_Tp, _Up> + [[nodiscard]] constexpr bool operator()(_Tp &&__t, _Up &&__u) const + noexcept(noexcept(bool(_VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u)))) { + return _VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u); + } + + using is_transparent = void; +}; + +struct not_equal_to { + template + requires equality_comparable_with<_Tp, _Up> + [[nodiscard]] constexpr bool operator()(_Tp &&__t, _Up &&__u) const + noexcept(noexcept(bool(!(_VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u))))) { + return !(_VSTD::forward<_Tp>(__t) == _VSTD::forward<_Up>(__u)); + } + + using is_transparent = void; +}; + +struct less { + template + requires totally_ordered_with<_Tp, _Up> + [[nodiscard]] constexpr bool operator()(_Tp &&__t, _Up &&__u) const + noexcept(noexcept(bool(_VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u)))) { + return _VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u); + } + + using is_transparent = void; +}; + +struct less_equal { + template + requires totally_ordered_with<_Tp, _Up> + [[nodiscard]] constexpr bool operator()(_Tp &&__t, _Up &&__u) const + noexcept(noexcept(bool(!(_VSTD::forward<_Up>(__u) < _VSTD::forward<_Tp>(__t))))) { + return !(_VSTD::forward<_Up>(__u) < _VSTD::forward<_Tp>(__t)); + } + + using is_transparent = void; +}; + +struct greater { + template + requires totally_ordered_with<_Tp, _Up> + [[nodiscard]] constexpr bool operator()(_Tp &&__t, _Up &&__u) const + noexcept(noexcept(bool(_VSTD::forward<_Up>(__u) < _VSTD::forward<_Tp>(__t)))) { + return _VSTD::forward<_Up>(__u) < _VSTD::forward<_Tp>(__t); + } + + using is_transparent = void; +}; + +struct greater_equal { + template + requires totally_ordered_with<_Tp, _Up> + [[nodiscard]] constexpr bool operator()(_Tp &&__t, _Up &&__u) const + noexcept(noexcept(bool(!(_VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u))))) { + return !(_VSTD::forward<_Tp>(__t) < _VSTD::forward<_Up>(__u)); + } + + using is_transparent = void; +}; + +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_RANGES_OPERATIONS_H diff --git a/app/src/main/cpp/libcxx/include/__functional/reference_wrapper.h b/app/src/main/cpp/libcxx/include/__functional/reference_wrapper.h new file mode 100644 index 0000000..c377b64 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/reference_wrapper.h @@ -0,0 +1,105 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_REFERENCE_WRAPPER_H +#define _LIBCPP___FUNCTIONAL_REFERENCE_WRAPPER_H + +#include <__config> +#include <__functional/invoke.h> +#include <__functional/weak_result_type.h> +#include <__memory/addressof.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/declval.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class _LIBCPP_TEMPLATE_VIS reference_wrapper : public __weak_result_type<_Tp> +{ +public: + // types + typedef _Tp type; +private: + type* __f_; + + static void __fun(_Tp&) _NOEXCEPT; + static void __fun(_Tp&&) = delete; + +public: + template ::value, decltype(__fun(std::declval<_Up>())) > > + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + reference_wrapper(_Up&& __u) _NOEXCEPT_(noexcept(__fun(std::declval<_Up>()))) { + type& __f = static_cast<_Up&&>(__u); + __f_ = _VSTD::addressof(__f); + } + + // access + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + operator type&() const _NOEXCEPT {return *__f_;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + type& get() const _NOEXCEPT {return *__f_;} + + // invoke + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 + typename __invoke_of::type + operator() (_ArgTypes&&... __args) const { + return std::__invoke(get(), std::forward<_ArgTypes>(__args)...); + } +}; + +#if _LIBCPP_STD_VER > 14 +template +reference_wrapper(_Tp&) -> reference_wrapper<_Tp>; +#endif + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +reference_wrapper<_Tp> +ref(_Tp& __t) _NOEXCEPT +{ + return reference_wrapper<_Tp>(__t); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +reference_wrapper<_Tp> +ref(reference_wrapper<_Tp> __t) _NOEXCEPT +{ + return __t; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +reference_wrapper +cref(const _Tp& __t) _NOEXCEPT +{ + return reference_wrapper(__t); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +reference_wrapper +cref(reference_wrapper<_Tp> __t) _NOEXCEPT +{ + return __t; +} + +template void ref(const _Tp&&) = delete; +template void cref(const _Tp&&) = delete; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_REFERENCE_WRAPPER_H diff --git a/app/src/main/cpp/libcxx/include/__functional/unary_function.h b/app/src/main/cpp/libcxx/include/__functional/unary_function.h new file mode 100644 index 0000000..f07cac1 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/unary_function.h @@ -0,0 +1,51 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_UNARY_FUNCTION_H +#define _LIBCPP___FUNCTIONAL_UNARY_FUNCTION_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION) + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX11 unary_function +{ + typedef _Arg argument_type; + typedef _Result result_type; +}; + +#endif // _LIBCPP_STD_VER <= 14 + +template struct __unary_function_keep_layout_base { +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using argument_type _LIBCPP_DEPRECATED_IN_CXX17 = _Arg; + using result_type _LIBCPP_DEPRECATED_IN_CXX17 = _Result; +#endif +}; + +#if _LIBCPP_STD_VER <= 14 || defined(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION) +_LIBCPP_DIAGNOSTIC_PUSH +_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wdeprecated-declarations") +template +using __unary_function = unary_function<_Arg, _Result>; +_LIBCPP_DIAGNOSTIC_POP +#else +template +using __unary_function = __unary_function_keep_layout_base<_Arg, _Result>; +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_UNARY_FUNCTION_H diff --git a/app/src/main/cpp/libcxx/include/__functional/unary_negate.h b/app/src/main/cpp/libcxx/include/__functional/unary_negate.h new file mode 100644 index 0000000..ab87e86 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/unary_negate.h @@ -0,0 +1,47 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_UNARY_NEGATE_H +#define _LIBCPP___FUNCTIONAL_UNARY_NEGATE_H + +#include <__config> +#include <__functional/unary_function.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_NEGATORS) + +template +class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 unary_negate + : public __unary_function +{ + _Predicate __pred_; +public: + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + explicit unary_negate(const _Predicate& __pred) + : __pred_(__pred) {} + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY + bool operator()(const typename _Predicate::argument_type& __x) const + {return !__pred_(__x);} +}; + +template +_LIBCPP_DEPRECATED_IN_CXX17 inline _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_INLINE_VISIBILITY +unary_negate<_Predicate> +not1(const _Predicate& __pred) {return unary_negate<_Predicate>(__pred);} + +#endif // _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_NEGATORS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_UNARY_NEGATE_H diff --git a/app/src/main/cpp/libcxx/include/__functional/unwrap_ref.h b/app/src/main/cpp/libcxx/include/__functional/unwrap_ref.h new file mode 100644 index 0000000..da000d8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/unwrap_ref.h @@ -0,0 +1,58 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_UNWRAP_REF_H +#define _LIBCPP___FUNCTIONAL_UNWRAP_REF_H + +#include <__config> +#include <__type_traits/decay.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct __unwrap_reference { typedef _LIBCPP_NODEBUG _Tp type; }; + +template +class reference_wrapper; + +template +struct __unwrap_reference > { typedef _LIBCPP_NODEBUG _Tp& type; }; + +template +struct decay; + +#if _LIBCPP_STD_VER > 17 +template +struct unwrap_reference : __unwrap_reference<_Tp> { }; + +template +using unwrap_reference_t = typename unwrap_reference<_Tp>::type; + +template +struct unwrap_ref_decay : unwrap_reference::type> { }; + +template +using unwrap_ref_decay_t = typename unwrap_ref_decay<_Tp>::type; +#endif // > C++17 + +template +struct __unwrap_ref_decay +#if _LIBCPP_STD_VER > 17 + : unwrap_ref_decay<_Tp> +#else + : __unwrap_reference::type> +#endif +{ }; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_UNWRAP_REF_H diff --git a/app/src/main/cpp/libcxx/include/__functional/weak_result_type.h b/app/src/main/cpp/libcxx/include/__functional/weak_result_type.h new file mode 100644 index 0000000..18d1bf7 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__functional/weak_result_type.h @@ -0,0 +1,294 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FUNCTIONAL_WEAK_RESULT_TYPE_H +#define _LIBCPP___FUNCTIONAL_WEAK_RESULT_TYPE_H + +#include <__config> +#include <__functional/binary_function.h> +#include <__functional/invoke.h> +#include <__functional/unary_function.h> +#include <__type_traits/integral_constant.h> +#include <__type_traits/is_same.h> +#include <__utility/declval.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct __has_result_type +{ +private: + template static false_type __test(...); + template static true_type __test(typename _Up::result_type* = 0); +public: + static const bool value = decltype(__test<_Tp>(0))::value; +}; + +// __weak_result_type + +template +struct __derives_from_unary_function +{ +private: + struct __two {char __lx; char __lxx;}; + static __two __test(...); + template + static __unary_function<_Ap, _Rp> + __test(const volatile __unary_function<_Ap, _Rp>*); + +public: + static const bool value = !is_same::value; + typedef decltype(__test((_Tp*)0)) type; +}; + +template +struct __derives_from_binary_function +{ +private: + struct __two {char __lx; char __lxx;}; + static __two __test(...); + template + static __binary_function<_A1, _A2, _Rp> + __test(const volatile __binary_function<_A1, _A2, _Rp>*); + +public: + static const bool value = !is_same::value; + typedef decltype(__test((_Tp*)0)) type; +}; + +template ::value> +struct __maybe_derive_from_unary_function // bool is true + : public __derives_from_unary_function<_Tp>::type +{ +}; + +template +struct __maybe_derive_from_unary_function<_Tp, false> +{ +}; + +template ::value> +struct __maybe_derive_from_binary_function // bool is true + : public __derives_from_binary_function<_Tp>::type +{ +}; + +template +struct __maybe_derive_from_binary_function<_Tp, false> +{ +}; + +template ::value> +struct __weak_result_type_imp // bool is true + : public __maybe_derive_from_unary_function<_Tp>, + public __maybe_derive_from_binary_function<_Tp> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = typename _Tp::result_type; +#endif +}; + +template +struct __weak_result_type_imp<_Tp, false> + : public __maybe_derive_from_unary_function<_Tp>, + public __maybe_derive_from_binary_function<_Tp> +{ +}; + +template +struct __weak_result_type + : public __weak_result_type_imp<_Tp> +{ +}; + +// 0 argument case + +template +struct __weak_result_type<_Rp ()> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __weak_result_type<_Rp (&)()> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __weak_result_type<_Rp (*)()> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +// 1 argument case + +template +struct __weak_result_type<_Rp (_A1)> + : public __unary_function<_A1, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (&)(_A1)> + : public __unary_function<_A1, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (*)(_A1)> + : public __unary_function<_A1, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)()> + : public __unary_function<_Cp*, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)() const> + : public __unary_function +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)() volatile> + : public __unary_function +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)() const volatile> + : public __unary_function +{ +}; + +// 2 argument case + +template +struct __weak_result_type<_Rp (_A1, _A2)> + : public __binary_function<_A1, _A2, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (*)(_A1, _A2)> + : public __binary_function<_A1, _A2, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (&)(_A1, _A2)> + : public __binary_function<_A1, _A2, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1)> + : public __binary_function<_Cp*, _A1, _Rp> +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1) const> + : public __binary_function +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile> + : public __binary_function +{ +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile> + : public __binary_function +{ +}; + +// 3 or more arguments + +template +struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile> +{ +#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) + using result_type _LIBCPP_NODEBUG _LIBCPP_DEPRECATED_IN_CXX17 = _Rp; +#endif +}; + +template +struct __invoke_return +{ + typedef decltype(_VSTD::__invoke(std::declval<_Tp>(), std::declval<_Args>()...)) type; +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FUNCTIONAL_WEAK_RESULT_TYPE_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/array.h b/app/src/main/cpp/libcxx/include/__fwd/array.h new file mode 100644 index 0000000..9a79eff --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/array.h @@ -0,0 +1,26 @@ +//===---------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_ARRAY_H +#define _LIBCPP___FWD_ARRAY_H + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct _LIBCPP_TEMPLATE_VIS array; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FWD_ARRAY_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/get.h b/app/src/main/cpp/libcxx/include/__fwd/get.h new file mode 100644 index 0000000..ec1fab4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/get.h @@ -0,0 +1,115 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_GET_H +#define _LIBCPP___FWD_GET_H + +#include <__concepts/copyable.h> +#include <__config> +#include <__fwd/array.h> +#include <__fwd/pair.h> +#include <__fwd/subrange.h> +#include <__fwd/tuple.h> +#include <__tuple_dir/tuple_element.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#ifndef _LIBCPP_CXX03_LANG + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +typename tuple_element<_Ip, tuple<_Tp...> >::type& +get(tuple<_Tp...>&) _NOEXCEPT; + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const typename tuple_element<_Ip, tuple<_Tp...> >::type& +get(const tuple<_Tp...>&) _NOEXCEPT; + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +typename tuple_element<_Ip, tuple<_Tp...> >::type&& +get(tuple<_Tp...>&&) _NOEXCEPT; + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const typename tuple_element<_Ip, tuple<_Tp...> >::type&& +get(const tuple<_Tp...>&&) _NOEXCEPT; + +#endif //_LIBCPP_CXX03_LANG + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +typename tuple_element<_Ip, pair<_T1, _T2> >::type& +get(pair<_T1, _T2>&) _NOEXCEPT; + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const typename tuple_element<_Ip, pair<_T1, _T2> >::type& +get(const pair<_T1, _T2>&) _NOEXCEPT; + +#ifndef _LIBCPP_CXX03_LANG +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +typename tuple_element<_Ip, pair<_T1, _T2> >::type&& +get(pair<_T1, _T2>&&) _NOEXCEPT; + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const typename tuple_element<_Ip, pair<_T1, _T2> >::type&& +get(const pair<_T1, _T2>&&) _NOEXCEPT; +#endif + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp& +get(array<_Tp, _Size>&) _NOEXCEPT; + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const _Tp& +get(const array<_Tp, _Size>&) _NOEXCEPT; + +#ifndef _LIBCPP_CXX03_LANG +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp&& +get(array<_Tp, _Size>&&) _NOEXCEPT; + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +const _Tp&& +get(const array<_Tp, _Size>&&) _NOEXCEPT; +#endif + +#if _LIBCPP_STD_VER >= 20 + +namespace ranges { + +template + requires((_Index == 0 && copyable<_Iter>) || _Index == 1) +_LIBCPP_HIDE_FROM_ABI constexpr auto get(const subrange<_Iter, _Sent, _Kind>& __subrange); + +template + requires(_Index < 2) +_LIBCPP_HIDE_FROM_ABI constexpr auto get(subrange<_Iter, _Sent, _Kind>&& __subrange); + +} // namespace ranges + +using ranges::get; + +#endif // _LIBCPP_STD_VER >= 20 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FWD_GET_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/hash.h b/app/src/main/cpp/libcxx/include/__fwd/hash.h new file mode 100644 index 0000000..af9eca8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/hash.h @@ -0,0 +1,25 @@ +//===---------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_HASH_H +#define _LIBCPP___FWD_HASH_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct _LIBCPP_TEMPLATE_VIS hash; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FWD_HASH_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/memory_resource.h b/app/src/main/cpp/libcxx/include/__fwd/memory_resource.h new file mode 100644 index 0000000..718a907 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/memory_resource.h @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_MEMORY_RESOURCE_H +#define _LIBCPP___FWD_MEMORY_RESOURCE_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace pmr { +template +class _LIBCPP_TEMPLATE_VIS polymorphic_allocator; +} // namespace pmr + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FWD_MEMORY_RESOURCE_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/pair.h b/app/src/main/cpp/libcxx/include/__fwd/pair.h new file mode 100644 index 0000000..3844014 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/pair.h @@ -0,0 +1,25 @@ +//===---------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_PAIR_H +#define _LIBCPP___FWD_PAIR_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct _LIBCPP_TEMPLATE_VIS pair; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FWD_PAIR_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/span.h b/app/src/main/cpp/libcxx/include/__fwd/span.h new file mode 100644 index 0000000..943cb13 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/span.h @@ -0,0 +1,37 @@ +// -*- C++ -*- +//===---------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_SPAN_H +#define _LIBCPP___FWD_SPAN_H + +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +inline constexpr size_t dynamic_extent = numeric_limits::max(); +template class span; + +#endif + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___FWD_SPAN_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/string.h b/app/src/main/cpp/libcxx/include/__fwd/string.h new file mode 100644 index 0000000..7ab5561 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/string.h @@ -0,0 +1,110 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_STRING_H +#define _LIBCPP___FWD_STRING_H + +#include <__config> +#include <__fwd/memory_resource.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct _LIBCPP_TEMPLATE_VIS char_traits; +template <> +struct char_traits; + +#ifndef _LIBCPP_HAS_NO_CHAR8_T +template <> +struct char_traits; +#endif + +template <> +struct char_traits; +template <> +struct char_traits; + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +template <> +struct char_traits; +#endif + +template +class _LIBCPP_TEMPLATE_VIS allocator; + +template , class _Allocator = allocator<_CharT> > +class _LIBCPP_TEMPLATE_VIS basic_string; + +using string = basic_string; + +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +using wstring = basic_string; +#endif + +#ifndef _LIBCPP_HAS_NO_CHAR8_T +using u8string = basic_string; +#endif + +using u16string = basic_string; +using u32string = basic_string; + +#if _LIBCPP_STD_VER >= 17 + +namespace pmr { +template > +using basic_string = std::basic_string<_CharT, _Traits, polymorphic_allocator<_CharT>>; + +using string = basic_string; + +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +using wstring = basic_string; +# endif + +# ifndef _LIBCPP_HAS_NO_CHAR8_T +using u8string = basic_string; +# endif + +using u16string = basic_string; +using u32string = basic_string; + +} // namespace pmr + +#endif // _LIBCPP_STD_VER >= 17 + +// clang-format off +template +class _LIBCPP_PREFERRED_NAME(string) +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS + _LIBCPP_PREFERRED_NAME(wstring) +#endif +#ifndef _LIBCPP_HAS_NO_CHAR8_T + _LIBCPP_PREFERRED_NAME(u8string) +#endif + _LIBCPP_PREFERRED_NAME(u16string) + _LIBCPP_PREFERRED_NAME(u32string) +#if _LIBCPP_STD_VER >= 17 + _LIBCPP_PREFERRED_NAME(pmr::string) +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS + _LIBCPP_PREFERRED_NAME(pmr::wstring) +# endif +# ifndef _LIBCPP_HAS_NO_CHAR8_T + _LIBCPP_PREFERRED_NAME(pmr::u8string) +# endif + _LIBCPP_PREFERRED_NAME(pmr::u16string) + _LIBCPP_PREFERRED_NAME(pmr::u32string) +#endif + basic_string; +// clang-format on + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FWD_STRING_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/string_view.h b/app/src/main/cpp/libcxx/include/__fwd/string_view.h new file mode 100644 index 0000000..4818990 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/string_view.h @@ -0,0 +1,50 @@ +// -*- C++ -*- +//===---------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_STRING_VIEW_H +#define _LIBCPP___FWD_STRING_VIEW_H + +#include <__config> +#include // char_traits + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template > +class _LIBCPP_TEMPLATE_VIS basic_string_view; + +typedef basic_string_view string_view; +#ifndef _LIBCPP_HAS_NO_CHAR8_T +typedef basic_string_view u8string_view; +#endif +typedef basic_string_view u16string_view; +typedef basic_string_view u32string_view; +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +typedef basic_string_view wstring_view; +#endif + +// clang-format off +template +class _LIBCPP_PREFERRED_NAME(string_view) +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS + _LIBCPP_PREFERRED_NAME(wstring_view) +#endif +#ifndef _LIBCPP_HAS_NO_CHAR8_T + _LIBCPP_PREFERRED_NAME(u8string_view) +#endif + _LIBCPP_PREFERRED_NAME(u16string_view) + _LIBCPP_PREFERRED_NAME(u32string_view) + basic_string_view; +// clang-format on +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FWD_STRING_VIEW_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/subrange.h b/app/src/main/cpp/libcxx/include/__fwd/subrange.h new file mode 100644 index 0000000..8f72392 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/subrange.h @@ -0,0 +1,38 @@ +//===---------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_SUBRANGE_H +#define _LIBCPP___FWD_SUBRANGE_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 20 + +#include <__iterator/concepts.h> + +_LIBCPP_BEGIN_NAMESPACE_STD + +namespace ranges { + +enum class _LIBCPP_ENUM_VIS subrange_kind : bool { unsized, sized }; + +template _Sent, subrange_kind _Kind> + requires(_Kind == subrange_kind::sized || !sized_sentinel_for<_Sent, _Iter>) +class _LIBCPP_TEMPLATE_VIS subrange; + +} // namespace ranges + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 20 + +#endif // _LIBCPP___FWD_SUBRANGE_H diff --git a/app/src/main/cpp/libcxx/include/__fwd/tuple.h b/app/src/main/cpp/libcxx/include/__fwd/tuple.h new file mode 100644 index 0000000..16b3fab --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__fwd/tuple.h @@ -0,0 +1,29 @@ +//===---------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#ifndef _LIBCPP___FWD_TUPLE_H +#define _LIBCPP___FWD_TUPLE_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#ifndef _LIBCPP_CXX03_LANG + +template +class _LIBCPP_TEMPLATE_VIS tuple; + +#endif // _LIBCPP_CXX03_LANG + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___FWD_TUPLE_H diff --git a/app/src/main/cpp/libcxx/include/__hash_table b/app/src/main/cpp/libcxx/include/__hash_table new file mode 100644 index 0000000..f8896c8 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__hash_table @@ -0,0 +1,2715 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___HASH_TABLE +#define _LIBCPP___HASH_TABLE + +#include <__algorithm/max.h> +#include <__algorithm/min.h> +#include <__assert> +#include <__bit/countl.h> +#include <__config> +#include <__debug> +#include <__functional/hash.h> +#include <__iterator/iterator_traits.h> +#include <__memory/addressof.h> +#include <__memory/allocator_traits.h> +#include <__memory/compressed_pair.h> +#include <__memory/pointer_traits.h> +#include <__memory/swap_allocator.h> +#include <__memory/unique_ptr.h> +#include <__type_traits/can_extract_key.h> +#include <__utility/forward.h> +#include <__utility/move.h> +#include <__utility/pair.h> +#include <__utility/swap.h> +#include +#include +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct __hash_value_type; + +template +struct __is_hash_value_type_imp : false_type {}; + +template +struct __is_hash_value_type_imp<__hash_value_type<_Key, _Value> > : true_type {}; + +template +struct __is_hash_value_type : false_type {}; + +template +struct __is_hash_value_type<_One> : __is_hash_value_type_imp<__remove_cvref_t<_One> > {}; + +_LIBCPP_FUNC_VIS +size_t __next_prime(size_t __n); + +template +struct __hash_node_base +{ + typedef typename pointer_traits<_NodePtr>::element_type __node_type; + typedef __hash_node_base __first_node; + typedef __rebind_pointer_t<_NodePtr, __first_node> __node_base_pointer; + typedef _NodePtr __node_pointer; + +#if defined(_LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB) + typedef __node_base_pointer __next_pointer; +#else + typedef __conditional_t::value, __node_base_pointer, __node_pointer> __next_pointer; +#endif + + __next_pointer __next_; + + _LIBCPP_INLINE_VISIBILITY + __next_pointer __ptr() _NOEXCEPT { + return static_cast<__next_pointer>( + pointer_traits<__node_base_pointer>::pointer_to(*this)); + } + + _LIBCPP_INLINE_VISIBILITY + __node_pointer __upcast() _NOEXCEPT { + return static_cast<__node_pointer>( + pointer_traits<__node_base_pointer>::pointer_to(*this)); + } + + _LIBCPP_INLINE_VISIBILITY + size_t __hash() const _NOEXCEPT { + return static_cast<__node_type const&>(*this).__hash_; + } + + _LIBCPP_INLINE_VISIBILITY __hash_node_base() _NOEXCEPT : __next_(nullptr) {} +}; + +template +struct _LIBCPP_STANDALONE_DEBUG __hash_node + : public __hash_node_base + < + __rebind_pointer_t<_VoidPtr, __hash_node<_Tp, _VoidPtr> > + > +{ + typedef _Tp __node_value_type; + + size_t __hash_; + __node_value_type __value_; +}; + +inline _LIBCPP_INLINE_VISIBILITY +bool +__is_hash_power2(size_t __bc) +{ + return __bc > 2 && !(__bc & (__bc - 1)); +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t +__constrain_hash(size_t __h, size_t __bc) +{ + return !(__bc & (__bc - 1)) ? __h & (__bc - 1) : + (__h < __bc ? __h : __h % __bc); +} + +inline _LIBCPP_INLINE_VISIBILITY +size_t +__next_hash_pow2(size_t __n) +{ + return __n < 2 ? __n : (size_t(1) << (numeric_limits::digits - __libcpp_clz(__n-1))); +} + + +template class __hash_table; + +template class _LIBCPP_TEMPLATE_VIS __hash_iterator; +template class _LIBCPP_TEMPLATE_VIS __hash_const_iterator; +template class _LIBCPP_TEMPLATE_VIS __hash_local_iterator; +template class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator; +template class _LIBCPP_TEMPLATE_VIS __hash_map_iterator; +template class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator; + +template +struct __hash_key_value_types { + static_assert(!is_reference<_Tp>::value && !is_const<_Tp>::value, ""); + typedef _Tp key_type; + typedef _Tp __node_value_type; + typedef _Tp __container_value_type; + static const bool __is_map = false; + + _LIBCPP_INLINE_VISIBILITY + static key_type const& __get_key(_Tp const& __v) { + return __v; + } + _LIBCPP_INLINE_VISIBILITY + static __container_value_type const& __get_value(__node_value_type const& __v) { + return __v; + } + _LIBCPP_INLINE_VISIBILITY + static __container_value_type* __get_ptr(__node_value_type& __n) { + return _VSTD::addressof(__n); + } + _LIBCPP_INLINE_VISIBILITY + static __container_value_type&& __move(__node_value_type& __v) { + return _VSTD::move(__v); + } +}; + +template +struct __hash_key_value_types<__hash_value_type<_Key, _Tp> > { + typedef _Key key_type; + typedef _Tp mapped_type; + typedef __hash_value_type<_Key, _Tp> __node_value_type; + typedef pair __container_value_type; + typedef __container_value_type __map_value_type; + static const bool __is_map = true; + + _LIBCPP_INLINE_VISIBILITY + static key_type const& __get_key(__container_value_type const& __v) { + return __v.first; + } + + template + _LIBCPP_INLINE_VISIBILITY + static __enable_if_t<__is_same_uncvref<_Up, __node_value_type>::value, __container_value_type const&> + __get_value(_Up& __t) { + return __t.__get_value(); + } + + template + _LIBCPP_INLINE_VISIBILITY + static __enable_if_t<__is_same_uncvref<_Up, __container_value_type>::value, __container_value_type const&> + __get_value(_Up& __t) { + return __t; + } + + _LIBCPP_INLINE_VISIBILITY + static __container_value_type* __get_ptr(__node_value_type& __n) { + return _VSTD::addressof(__n.__get_value()); + } + _LIBCPP_INLINE_VISIBILITY + static pair __move(__node_value_type& __v) { + return __v.__move(); + } +}; + +template , + bool = _KVTypes::__is_map> +struct __hash_map_pointer_types {}; + +template +struct __hash_map_pointer_types<_Tp, _AllocPtr, _KVTypes, true> { + typedef typename _KVTypes::__map_value_type _Mv; + typedef __rebind_pointer_t<_AllocPtr, _Mv> + __map_value_type_pointer; + typedef __rebind_pointer_t<_AllocPtr, const _Mv> + __const_map_value_type_pointer; +}; + +template ::element_type> +struct __hash_node_types; + +template +struct __hash_node_types<_NodePtr, __hash_node<_Tp, _VoidPtr> > + : public __hash_key_value_types<_Tp>, __hash_map_pointer_types<_Tp, _VoidPtr> + +{ + typedef __hash_key_value_types<_Tp> __base; + +public: + typedef ptrdiff_t difference_type; + typedef size_t size_type; + + typedef __rebind_pointer_t<_NodePtr, void> __void_pointer; + + typedef typename pointer_traits<_NodePtr>::element_type __node_type; + typedef _NodePtr __node_pointer; + + typedef __hash_node_base<__node_pointer> __node_base_type; + typedef __rebind_pointer_t<_NodePtr, __node_base_type> + __node_base_pointer; + + typedef typename __node_base_type::__next_pointer __next_pointer; + + typedef _Tp __node_value_type; + typedef __rebind_pointer_t<_VoidPtr, __node_value_type> + __node_value_type_pointer; + typedef __rebind_pointer_t<_VoidPtr, const __node_value_type> + __const_node_value_type_pointer; + +private: + static_assert(!is_const<__node_type>::value, + "_NodePtr should never be a pointer to const"); + static_assert((is_same::element_type, void>::value), + "_VoidPtr does not point to unqualified void type"); + static_assert((is_same<__rebind_pointer_t<_VoidPtr, __node_type>, + _NodePtr>::value), "_VoidPtr does not rebind to _NodePtr."); +}; + +template +struct __hash_node_types_from_iterator; +template +struct __hash_node_types_from_iterator<__hash_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {}; +template +struct __hash_node_types_from_iterator<__hash_const_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {}; +template +struct __hash_node_types_from_iterator<__hash_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {}; +template +struct __hash_node_types_from_iterator<__hash_const_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {}; + + +template +struct __make_hash_node_types { + typedef __hash_node<_NodeValueTp, _VoidPtr> _NodeTp; + typedef __rebind_pointer_t<_VoidPtr, _NodeTp> _NodePtr; + typedef __hash_node_types<_NodePtr> type; +}; + +template +class _LIBCPP_TEMPLATE_VIS __hash_iterator +{ + typedef __hash_node_types<_NodePtr> _NodeTypes; + typedef _NodePtr __node_pointer; + typedef typename _NodeTypes::__next_pointer __next_pointer; + + __next_pointer __node_; + +public: + typedef forward_iterator_tag iterator_category; + typedef typename _NodeTypes::__node_value_type value_type; + typedef typename _NodeTypes::difference_type difference_type; + typedef value_type& reference; + typedef typename _NodeTypes::__node_value_type_pointer pointer; + + _LIBCPP_INLINE_VISIBILITY __hash_iterator() _NOEXCEPT : __node_(nullptr) { + _VSTD::__debug_db_insert_i(this); + } + +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + _LIBCPP_INLINE_VISIBILITY + __hash_iterator(const __hash_iterator& __i) + : __node_(__i.__node_) + { + __get_db()->__iterator_copy(this, _VSTD::addressof(__i)); + } + + _LIBCPP_INLINE_VISIBILITY + ~__hash_iterator() + { + __get_db()->__erase_i(this); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_iterator& operator=(const __hash_iterator& __i) + { + if (this != _VSTD::addressof(__i)) + { + __get_db()->__iterator_copy(this, _VSTD::addressof(__i)); + __node_ = __i.__node_; + } + return *this; + } +#endif // _LIBCPP_ENABLE_DEBUG_MODE + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable unordered container iterator"); + return __node_->__upcast()->__value_; + } + + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable unordered container iterator"); + return pointer_traits::pointer_to(__node_->__upcast()->__value_); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_iterator& operator++() { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to increment a non-incrementable unordered container iterator"); + __node_ = __node_->__next_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __hash_iterator operator++(int) + { + __hash_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_iterator& __x, const __hash_iterator& __y) + { + return __x.__node_ == __y.__node_; + } + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_iterator& __x, const __hash_iterator& __y) + {return !(__x == __y);} + +private: + _LIBCPP_INLINE_VISIBILITY + explicit __hash_iterator(__next_pointer __node, const void* __c) _NOEXCEPT + : __node_(__node) + { + (void)__c; +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + __get_db()->__insert_ic(this, __c); +#endif + } + template friend class __hash_table; + template friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator; + template friend class _LIBCPP_TEMPLATE_VIS __hash_map_iterator; + template friend class _LIBCPP_TEMPLATE_VIS unordered_map; + template friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; +}; + +template +class _LIBCPP_TEMPLATE_VIS __hash_const_iterator +{ + static_assert(!is_const::element_type>::value, ""); + typedef __hash_node_types<_NodePtr> _NodeTypes; + typedef _NodePtr __node_pointer; + typedef typename _NodeTypes::__next_pointer __next_pointer; + + __next_pointer __node_; + +public: + typedef __hash_iterator<_NodePtr> __non_const_iterator; + + typedef forward_iterator_tag iterator_category; + typedef typename _NodeTypes::__node_value_type value_type; + typedef typename _NodeTypes::difference_type difference_type; + typedef const value_type& reference; + typedef typename _NodeTypes::__const_node_value_type_pointer pointer; + + + _LIBCPP_INLINE_VISIBILITY __hash_const_iterator() _NOEXCEPT : __node_(nullptr) { + _VSTD::__debug_db_insert_i(this); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator(const __non_const_iterator& __x) _NOEXCEPT + : __node_(__x.__node_) + { +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + __get_db()->__iterator_copy(this, _VSTD::addressof(__x)); +#endif + } + +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator(const __hash_const_iterator& __i) + : __node_(__i.__node_) + { + __get_db()->__iterator_copy(this, _VSTD::addressof(__i)); + } + + _LIBCPP_INLINE_VISIBILITY + ~__hash_const_iterator() + { + __get_db()->__erase_i(this); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator& operator=(const __hash_const_iterator& __i) + { + if (this != _VSTD::addressof(__i)) + { + __get_db()->__iterator_copy(this, _VSTD::addressof(__i)); + __node_ = __i.__node_; + } + return *this; + } +#endif // _LIBCPP_ENABLE_DEBUG_MODE + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable unordered container const_iterator"); + return __node_->__upcast()->__value_; + } + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable unordered container const_iterator"); + return pointer_traits::pointer_to(__node_->__upcast()->__value_); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator& operator++() { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to increment a non-incrementable unordered container const_iterator"); + __node_ = __node_->__next_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_iterator operator++(int) + { + __hash_const_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_const_iterator& __x, const __hash_const_iterator& __y) + { + return __x.__node_ == __y.__node_; + } + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_const_iterator& __x, const __hash_const_iterator& __y) + {return !(__x == __y);} + +private: + _LIBCPP_INLINE_VISIBILITY + explicit __hash_const_iterator(__next_pointer __node, const void* __c) _NOEXCEPT + : __node_(__node) + { + (void)__c; +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + __get_db()->__insert_ic(this, __c); +#endif + } + template friend class __hash_table; + template friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator; + template friend class _LIBCPP_TEMPLATE_VIS unordered_map; + template friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; +}; + +template +class _LIBCPP_TEMPLATE_VIS __hash_local_iterator +{ + typedef __hash_node_types<_NodePtr> _NodeTypes; + typedef _NodePtr __node_pointer; + typedef typename _NodeTypes::__next_pointer __next_pointer; + + __next_pointer __node_; + size_t __bucket_; + size_t __bucket_count_; + +public: + typedef forward_iterator_tag iterator_category; + typedef typename _NodeTypes::__node_value_type value_type; + typedef typename _NodeTypes::difference_type difference_type; + typedef value_type& reference; + typedef typename _NodeTypes::__node_value_type_pointer pointer; + + _LIBCPP_INLINE_VISIBILITY __hash_local_iterator() _NOEXCEPT : __node_(nullptr) { + _VSTD::__debug_db_insert_i(this); + } + +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + _LIBCPP_INLINE_VISIBILITY + __hash_local_iterator(const __hash_local_iterator& __i) + : __node_(__i.__node_), + __bucket_(__i.__bucket_), + __bucket_count_(__i.__bucket_count_) + { + __get_db()->__iterator_copy(this, _VSTD::addressof(__i)); + } + + _LIBCPP_INLINE_VISIBILITY + ~__hash_local_iterator() + { + __get_db()->__erase_i(this); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_local_iterator& operator=(const __hash_local_iterator& __i) + { + if (this != _VSTD::addressof(__i)) + { + __get_db()->__iterator_copy(this, _VSTD::addressof(__i)); + __node_ = __i.__node_; + __bucket_ = __i.__bucket_; + __bucket_count_ = __i.__bucket_count_; + } + return *this; + } +#endif // _LIBCPP_ENABLE_DEBUG_MODE + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable unordered container local_iterator"); + return __node_->__upcast()->__value_; + } + + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable unordered container local_iterator"); + return pointer_traits::pointer_to(__node_->__upcast()->__value_); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_local_iterator& operator++() { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to increment a non-incrementable unordered container local_iterator"); + __node_ = __node_->__next_; + if (__node_ != nullptr && std::__constrain_hash(__node_->__hash(), __bucket_count_) != __bucket_) + __node_ = nullptr; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __hash_local_iterator operator++(int) + { + __hash_local_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_local_iterator& __x, const __hash_local_iterator& __y) + { + return __x.__node_ == __y.__node_; + } + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_local_iterator& __x, const __hash_local_iterator& __y) + {return !(__x == __y);} + +private: + _LIBCPP_INLINE_VISIBILITY + explicit __hash_local_iterator(__next_pointer __node, size_t __bucket, + size_t __bucket_count, const void* __c) _NOEXCEPT + : __node_(__node), + __bucket_(__bucket), + __bucket_count_(__bucket_count) + { + (void)__c; +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + __get_db()->__insert_ic(this, __c); +#endif + if (__node_ != nullptr) + __node_ = __node_->__next_; + } + template friend class __hash_table; + template friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator; + template friend class _LIBCPP_TEMPLATE_VIS __hash_map_iterator; +}; + +template +class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator +{ + typedef __hash_node_types<_ConstNodePtr> _NodeTypes; + typedef _ConstNodePtr __node_pointer; + typedef typename _NodeTypes::__next_pointer __next_pointer; + + __next_pointer __node_; + size_t __bucket_; + size_t __bucket_count_; + + typedef pointer_traits<__node_pointer> __pointer_traits; + typedef typename __pointer_traits::element_type __node; + typedef __remove_const_t<__node> __non_const_node; + typedef __rebind_pointer_t<__node_pointer, __non_const_node> + __non_const_node_pointer; +public: + typedef __hash_local_iterator<__non_const_node_pointer> + __non_const_iterator; + + typedef forward_iterator_tag iterator_category; + typedef typename _NodeTypes::__node_value_type value_type; + typedef typename _NodeTypes::difference_type difference_type; + typedef const value_type& reference; + typedef typename _NodeTypes::__const_node_value_type_pointer pointer; + + + _LIBCPP_INLINE_VISIBILITY __hash_const_local_iterator() _NOEXCEPT : __node_(nullptr) { + _VSTD::__debug_db_insert_i(this); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator(const __non_const_iterator& __x) _NOEXCEPT + : __node_(__x.__node_), + __bucket_(__x.__bucket_), + __bucket_count_(__x.__bucket_count_) + { +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + __get_db()->__iterator_copy(this, _VSTD::addressof(__x)); +#endif + } + +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator(const __hash_const_local_iterator& __i) + : __node_(__i.__node_), + __bucket_(__i.__bucket_), + __bucket_count_(__i.__bucket_count_) + { + __get_db()->__iterator_copy(this, _VSTD::addressof(__i)); + } + + _LIBCPP_INLINE_VISIBILITY + ~__hash_const_local_iterator() + { + __get_db()->__erase_i(this); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator& operator=(const __hash_const_local_iterator& __i) + { + if (this != _VSTD::addressof(__i)) + { + __get_db()->__iterator_copy(this, _VSTD::addressof(__i)); + __node_ = __i.__node_; + __bucket_ = __i.__bucket_; + __bucket_count_ = __i.__bucket_count_; + } + return *this; + } +#endif // _LIBCPP_ENABLE_DEBUG_MODE + + _LIBCPP_INLINE_VISIBILITY + reference operator*() const { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable unordered container const_local_iterator"); + return __node_->__upcast()->__value_; + } + + _LIBCPP_INLINE_VISIBILITY + pointer operator->() const { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to dereference a non-dereferenceable unordered container const_local_iterator"); + return pointer_traits::pointer_to(__node_->__upcast()->__value_); + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator& operator++() { + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), + "Attempted to increment a non-incrementable unordered container const_local_iterator"); + __node_ = __node_->__next_; + if (__node_ != nullptr && std::__constrain_hash(__node_->__hash(), __bucket_count_) != __bucket_) + __node_ = nullptr; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY + __hash_const_local_iterator operator++(int) + { + __hash_const_local_iterator __t(*this); + ++(*this); + return __t; + } + + friend _LIBCPP_INLINE_VISIBILITY + bool operator==(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y) + { + return __x.__node_ == __y.__node_; + } + friend _LIBCPP_INLINE_VISIBILITY + bool operator!=(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y) + {return !(__x == __y);} + +private: + _LIBCPP_INLINE_VISIBILITY + explicit __hash_const_local_iterator(__next_pointer __node_ptr, size_t __bucket, + size_t __bucket_count, const void* __c) _NOEXCEPT + : __node_(__node_ptr), + __bucket_(__bucket), + __bucket_count_(__bucket_count) + { + (void)__c; +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + __get_db()->__insert_ic(this, __c); +#endif + if (__node_ != nullptr) + __node_ = __node_->__next_; + } + template friend class __hash_table; + template friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator; +}; + +template +class __bucket_list_deallocator +{ + typedef _Alloc allocator_type; + typedef allocator_traits __alloc_traits; + typedef typename __alloc_traits::size_type size_type; + + __compressed_pair __data_; +public: + typedef typename __alloc_traits::pointer pointer; + + _LIBCPP_INLINE_VISIBILITY + __bucket_list_deallocator() + _NOEXCEPT_(is_nothrow_default_constructible::value) + : __data_(0, __default_init_tag()) {} + + _LIBCPP_INLINE_VISIBILITY + __bucket_list_deallocator(const allocator_type& __a, size_type __size) + _NOEXCEPT_(is_nothrow_copy_constructible::value) + : __data_(__size, __a) {} + + _LIBCPP_INLINE_VISIBILITY + __bucket_list_deallocator(__bucket_list_deallocator&& __x) + _NOEXCEPT_(is_nothrow_move_constructible::value) + : __data_(_VSTD::move(__x.__data_)) + { + __x.size() = 0; + } + + _LIBCPP_INLINE_VISIBILITY + size_type& size() _NOEXCEPT {return __data_.first();} + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __data_.first();} + + _LIBCPP_INLINE_VISIBILITY + allocator_type& __alloc() _NOEXCEPT {return __data_.second();} + _LIBCPP_INLINE_VISIBILITY + const allocator_type& __alloc() const _NOEXCEPT {return __data_.second();} + + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) _NOEXCEPT + { + __alloc_traits::deallocate(__alloc(), __p, size()); + } +}; + +template class __hash_map_node_destructor; + +template +class __hash_node_destructor +{ + typedef _Alloc allocator_type; + typedef allocator_traits __alloc_traits; + +public: + typedef typename __alloc_traits::pointer pointer; +private: + typedef __hash_node_types _NodeTypes; + + allocator_type& __na_; + +public: + bool __value_constructed; + + __hash_node_destructor(__hash_node_destructor const&) = default; + __hash_node_destructor& operator=(const __hash_node_destructor&) = delete; + + + _LIBCPP_INLINE_VISIBILITY + explicit __hash_node_destructor(allocator_type& __na, + bool __constructed = false) _NOEXCEPT + : __na_(__na), + __value_constructed(__constructed) + {} + + _LIBCPP_INLINE_VISIBILITY + void operator()(pointer __p) _NOEXCEPT + { + if (__value_constructed) + __alloc_traits::destroy(__na_, _NodeTypes::__get_ptr(__p->__value_)); + if (__p) + __alloc_traits::deallocate(__na_, __p, 1); + } + + template friend class __hash_map_node_destructor; +}; + +#if _LIBCPP_STD_VER > 14 +template +struct __generic_container_node_destructor; + +template +struct __generic_container_node_destructor<__hash_node<_Tp, _VoidPtr>, _Alloc> + : __hash_node_destructor<_Alloc> +{ + using __hash_node_destructor<_Alloc>::__hash_node_destructor; +}; +#endif + +template +struct __enforce_unordered_container_requirements { +#ifndef _LIBCPP_CXX03_LANG + static_assert(__check_hash_requirements<_Key, _Hash>::value, + "the specified hash does not meet the Hash requirements"); + static_assert(is_copy_constructible<_Equal>::value, + "the specified comparator is required to be copy constructible"); +#endif + typedef int type; +}; + +template +#ifndef _LIBCPP_CXX03_LANG + _LIBCPP_DIAGNOSE_WARNING(!__invokable<_Equal const&, _Key const&, _Key const&>::value, + "the specified comparator type does not provide a viable const call operator") + _LIBCPP_DIAGNOSE_WARNING(!__invokable<_Hash const&, _Key const&>::value, + "the specified hash functor does not provide a viable const call operator") +#endif +typename __enforce_unordered_container_requirements<_Key, _Hash, _Equal>::type +__diagnose_unordered_container_requirements(int); + +// This dummy overload is used so that the compiler won't emit a spurious +// "no matching function for call to __diagnose_unordered_xxx" diagnostic +// when the overload above causes a hard error. +template +int __diagnose_unordered_container_requirements(void*); + +template +class __hash_table +{ +public: + typedef _Tp value_type; + typedef _Hash hasher; + typedef _Equal key_equal; + typedef _Alloc allocator_type; + +private: + typedef allocator_traits __alloc_traits; + typedef typename + __make_hash_node_types::type + _NodeTypes; +public: + + typedef typename _NodeTypes::__node_value_type __node_value_type; + typedef typename _NodeTypes::__container_value_type __container_value_type; + typedef typename _NodeTypes::key_type key_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef typename __alloc_traits::pointer pointer; + typedef typename __alloc_traits::const_pointer const_pointer; +#ifndef _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE + typedef typename __alloc_traits::size_type size_type; +#else + typedef typename _NodeTypes::size_type size_type; +#endif + typedef typename _NodeTypes::difference_type difference_type; +public: + // Create __node + + typedef typename _NodeTypes::__node_type __node; + typedef __rebind_alloc<__alloc_traits, __node> __node_allocator; + typedef allocator_traits<__node_allocator> __node_traits; + typedef typename _NodeTypes::__void_pointer __void_pointer; + typedef typename _NodeTypes::__node_pointer __node_pointer; + typedef typename _NodeTypes::__node_pointer __node_const_pointer; + typedef typename _NodeTypes::__node_base_type __first_node; + typedef typename _NodeTypes::__node_base_pointer __node_base_pointer; + typedef typename _NodeTypes::__next_pointer __next_pointer; + +private: + // check for sane allocator pointer rebinding semantics. Rebinding the + // allocator for a new pointer type should be exactly the same as rebinding + // the pointer using 'pointer_traits'. + static_assert((is_same<__node_pointer, typename __node_traits::pointer>::value), + "Allocator does not rebind pointers in a sane manner."); + typedef __rebind_alloc<__node_traits, __first_node> __node_base_allocator; + typedef allocator_traits<__node_base_allocator> __node_base_traits; + static_assert((is_same<__node_base_pointer, typename __node_base_traits::pointer>::value), + "Allocator does not rebind pointers in a sane manner."); + +private: + + typedef __rebind_alloc<__node_traits, __next_pointer> __pointer_allocator; + typedef __bucket_list_deallocator<__pointer_allocator> __bucket_list_deleter; + typedef unique_ptr<__next_pointer[], __bucket_list_deleter> __bucket_list; + typedef allocator_traits<__pointer_allocator> __pointer_alloc_traits; + typedef typename __bucket_list_deleter::pointer __node_pointer_pointer; + + // --- Member data begin --- + __bucket_list __bucket_list_; + __compressed_pair<__first_node, __node_allocator> __p1_; + __compressed_pair __p2_; + __compressed_pair __p3_; + // --- Member data end --- + + _LIBCPP_INLINE_VISIBILITY + size_type& size() _NOEXCEPT {return __p2_.first();} +public: + _LIBCPP_INLINE_VISIBILITY + size_type size() const _NOEXCEPT {return __p2_.first();} + + _LIBCPP_INLINE_VISIBILITY + hasher& hash_function() _NOEXCEPT {return __p2_.second();} + _LIBCPP_INLINE_VISIBILITY + const hasher& hash_function() const _NOEXCEPT {return __p2_.second();} + + _LIBCPP_INLINE_VISIBILITY + float& max_load_factor() _NOEXCEPT {return __p3_.first();} + _LIBCPP_INLINE_VISIBILITY + float max_load_factor() const _NOEXCEPT {return __p3_.first();} + + _LIBCPP_INLINE_VISIBILITY + key_equal& key_eq() _NOEXCEPT {return __p3_.second();} + _LIBCPP_INLINE_VISIBILITY + const key_equal& key_eq() const _NOEXCEPT {return __p3_.second();} + + _LIBCPP_INLINE_VISIBILITY + __node_allocator& __node_alloc() _NOEXCEPT {return __p1_.second();} + _LIBCPP_INLINE_VISIBILITY + const __node_allocator& __node_alloc() const _NOEXCEPT + {return __p1_.second();} + +public: + typedef __hash_iterator<__node_pointer> iterator; + typedef __hash_const_iterator<__node_pointer> const_iterator; + typedef __hash_local_iterator<__node_pointer> local_iterator; + typedef __hash_const_local_iterator<__node_pointer> const_local_iterator; + + _LIBCPP_INLINE_VISIBILITY + __hash_table() + _NOEXCEPT_( + is_nothrow_default_constructible<__bucket_list>::value && + is_nothrow_default_constructible<__first_node>::value && + is_nothrow_default_constructible<__node_allocator>::value && + is_nothrow_default_constructible::value && + is_nothrow_default_constructible::value); + _LIBCPP_INLINE_VISIBILITY + __hash_table(const hasher& __hf, const key_equal& __eql); + __hash_table(const hasher& __hf, const key_equal& __eql, + const allocator_type& __a); + explicit __hash_table(const allocator_type& __a); + __hash_table(const __hash_table& __u); + __hash_table(const __hash_table& __u, const allocator_type& __a); + __hash_table(__hash_table&& __u) + _NOEXCEPT_( + is_nothrow_move_constructible<__bucket_list>::value && + is_nothrow_move_constructible<__first_node>::value && + is_nothrow_move_constructible<__node_allocator>::value && + is_nothrow_move_constructible::value && + is_nothrow_move_constructible::value); + __hash_table(__hash_table&& __u, const allocator_type& __a); + ~__hash_table(); + + __hash_table& operator=(const __hash_table& __u); + _LIBCPP_INLINE_VISIBILITY + __hash_table& operator=(__hash_table&& __u) + _NOEXCEPT_( + __node_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<__node_allocator>::value && + is_nothrow_move_assignable::value && + is_nothrow_move_assignable::value); + template + void __assign_unique(_InputIterator __first, _InputIterator __last); + template + void __assign_multi(_InputIterator __first, _InputIterator __last); + + _LIBCPP_INLINE_VISIBILITY + size_type max_size() const _NOEXCEPT + { + return _VSTD::min( + __node_traits::max_size(__node_alloc()), + numeric_limits::max() + ); + } + +private: + _LIBCPP_INLINE_VISIBILITY + __next_pointer __node_insert_multi_prepare(size_t __cp_hash, + value_type& __cp_val); + _LIBCPP_INLINE_VISIBILITY + void __node_insert_multi_perform(__node_pointer __cp, + __next_pointer __pn) _NOEXCEPT; + + _LIBCPP_INLINE_VISIBILITY + __next_pointer __node_insert_unique_prepare(size_t __nd_hash, + value_type& __nd_val); + _LIBCPP_INLINE_VISIBILITY + void __node_insert_unique_perform(__node_pointer __ptr) _NOEXCEPT; + +public: + _LIBCPP_INLINE_VISIBILITY + pair __node_insert_unique(__node_pointer __nd); + _LIBCPP_INLINE_VISIBILITY + iterator __node_insert_multi(__node_pointer __nd); + _LIBCPP_INLINE_VISIBILITY + iterator __node_insert_multi(const_iterator __p, + __node_pointer __nd); + + template + _LIBCPP_INLINE_VISIBILITY + pair __emplace_unique_key_args(_Key const& __k, _Args&&... __args); + + template + _LIBCPP_INLINE_VISIBILITY + pair __emplace_unique_impl(_Args&&... __args); + + template + _LIBCPP_INLINE_VISIBILITY + pair __emplace_unique(_Pp&& __x) { + return __emplace_unique_extract_key(_VSTD::forward<_Pp>(__x), + __can_extract_key<_Pp, key_type>()); + } + + template + _LIBCPP_INLINE_VISIBILITY + __enable_if_t<__can_extract_map_key<_First, key_type, __container_value_type>::value, pair > + __emplace_unique(_First&& __f, _Second&& __s) { + return __emplace_unique_key_args(__f, _VSTD::forward<_First>(__f), + _VSTD::forward<_Second>(__s)); + } + + template + _LIBCPP_INLINE_VISIBILITY + pair __emplace_unique(_Args&&... __args) { + return __emplace_unique_impl(_VSTD::forward<_Args>(__args)...); + } + + template + _LIBCPP_INLINE_VISIBILITY + pair + __emplace_unique_extract_key(_Pp&& __x, __extract_key_fail_tag) { + return __emplace_unique_impl(_VSTD::forward<_Pp>(__x)); + } + template + _LIBCPP_INLINE_VISIBILITY + pair + __emplace_unique_extract_key(_Pp&& __x, __extract_key_self_tag) { + return __emplace_unique_key_args(__x, _VSTD::forward<_Pp>(__x)); + } + template + _LIBCPP_INLINE_VISIBILITY + pair + __emplace_unique_extract_key(_Pp&& __x, __extract_key_first_tag) { + return __emplace_unique_key_args(__x.first, _VSTD::forward<_Pp>(__x)); + } + + template + _LIBCPP_INLINE_VISIBILITY + iterator __emplace_multi(_Args&&... __args); + template + _LIBCPP_INLINE_VISIBILITY + iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args); + + + _LIBCPP_INLINE_VISIBILITY + pair + __insert_unique(__container_value_type&& __x) { + return __emplace_unique_key_args(_NodeTypes::__get_key(__x), _VSTD::move(__x)); + } + + template ::value> > + _LIBCPP_INLINE_VISIBILITY + pair __insert_unique(_Pp&& __x) { + return __emplace_unique(_VSTD::forward<_Pp>(__x)); + } + + template + _LIBCPP_INLINE_VISIBILITY + iterator __insert_multi(_Pp&& __x) { + return __emplace_multi(_VSTD::forward<_Pp>(__x)); + } + + template + _LIBCPP_INLINE_VISIBILITY + iterator __insert_multi(const_iterator __p, _Pp&& __x) { + return __emplace_hint_multi(__p, _VSTD::forward<_Pp>(__x)); + } + + _LIBCPP_INLINE_VISIBILITY + pair __insert_unique(const __container_value_type& __x) { + return __emplace_unique_key_args(_NodeTypes::__get_key(__x), __x); + } + +#if _LIBCPP_STD_VER > 14 + template + _LIBCPP_INLINE_VISIBILITY + _InsertReturnType __node_handle_insert_unique(_NodeHandle&& __nh); + template + _LIBCPP_INLINE_VISIBILITY + iterator __node_handle_insert_unique(const_iterator __hint, + _NodeHandle&& __nh); + template + _LIBCPP_INLINE_VISIBILITY + void __node_handle_merge_unique(_Table& __source); + + template + _LIBCPP_INLINE_VISIBILITY + iterator __node_handle_insert_multi(_NodeHandle&& __nh); + template + _LIBCPP_INLINE_VISIBILITY + iterator __node_handle_insert_multi(const_iterator __hint, _NodeHandle&& __nh); + template + _LIBCPP_INLINE_VISIBILITY + void __node_handle_merge_multi(_Table& __source); + + template + _LIBCPP_INLINE_VISIBILITY + _NodeHandle __node_handle_extract(key_type const& __key); + template + _LIBCPP_INLINE_VISIBILITY + _NodeHandle __node_handle_extract(const_iterator __it); +#endif + + void clear() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY void __rehash_unique(size_type __n) { __rehash(__n); } + _LIBCPP_INLINE_VISIBILITY void __rehash_multi(size_type __n) { __rehash(__n); } + _LIBCPP_INLINE_VISIBILITY void __reserve_unique(size_type __n) + { + __rehash_unique(static_cast(std::ceil(__n / max_load_factor()))); + } + _LIBCPP_INLINE_VISIBILITY void __reserve_multi(size_type __n) + { + __rehash_multi(static_cast(std::ceil(__n / max_load_factor()))); + } + + _LIBCPP_INLINE_VISIBILITY + size_type bucket_count() const _NOEXCEPT + { + return __bucket_list_.get_deleter().size(); + } + + _LIBCPP_INLINE_VISIBILITY + iterator begin() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + iterator end() _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + const_iterator begin() const _NOEXCEPT; + _LIBCPP_INLINE_VISIBILITY + const_iterator end() const _NOEXCEPT; + + template + _LIBCPP_INLINE_VISIBILITY + size_type bucket(const _Key& __k) const + { + _LIBCPP_ASSERT(bucket_count() > 0, + "unordered container::bucket(key) called when bucket_count() == 0"); + return std::__constrain_hash(hash_function()(__k), bucket_count()); + } + + template + iterator find(const _Key& __x); + template + const_iterator find(const _Key& __x) const; + + typedef __hash_node_destructor<__node_allocator> _Dp; + typedef unique_ptr<__node, _Dp> __node_holder; + + iterator erase(const_iterator __p); + iterator erase(const_iterator __first, const_iterator __last); + template + size_type __erase_unique(const _Key& __k); + template + size_type __erase_multi(const _Key& __k); + __node_holder remove(const_iterator __p) _NOEXCEPT; + + template + _LIBCPP_INLINE_VISIBILITY + size_type __count_unique(const _Key& __k) const; + template + size_type __count_multi(const _Key& __k) const; + + template + pair + __equal_range_unique(const _Key& __k); + template + pair + __equal_range_unique(const _Key& __k) const; + + template + pair + __equal_range_multi(const _Key& __k); + template + pair + __equal_range_multi(const _Key& __k) const; + + void swap(__hash_table& __u) +#if _LIBCPP_STD_VER <= 11 + _NOEXCEPT_( + __is_nothrow_swappable::value && __is_nothrow_swappable::value + && (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value + || __is_nothrow_swappable<__pointer_allocator>::value) + && (!__node_traits::propagate_on_container_swap::value + || __is_nothrow_swappable<__node_allocator>::value) + ); +#else + _NOEXCEPT_(__is_nothrow_swappable::value && __is_nothrow_swappable::value); +#endif + + _LIBCPP_INLINE_VISIBILITY + size_type max_bucket_count() const _NOEXCEPT + {return max_size(); } + size_type bucket_size(size_type __n) const; + _LIBCPP_INLINE_VISIBILITY float load_factor() const _NOEXCEPT + { + size_type __bc = bucket_count(); + return __bc != 0 ? (float)size() / __bc : 0.f; + } + _LIBCPP_INLINE_VISIBILITY void max_load_factor(float __mlf) _NOEXCEPT + { + _LIBCPP_ASSERT(__mlf > 0, + "unordered container::max_load_factor(lf) called with lf <= 0"); + max_load_factor() = _VSTD::max(__mlf, load_factor()); + } + + _LIBCPP_INLINE_VISIBILITY + local_iterator + begin(size_type __n) + { + _LIBCPP_ASSERT(__n < bucket_count(), + "unordered container::begin(n) called with n >= bucket_count()"); + return local_iterator(__bucket_list_[__n], __n, bucket_count(), this); + } + + _LIBCPP_INLINE_VISIBILITY + local_iterator + end(size_type __n) + { + _LIBCPP_ASSERT(__n < bucket_count(), + "unordered container::end(n) called with n >= bucket_count()"); + return local_iterator(nullptr, __n, bucket_count(), this); + } + + _LIBCPP_INLINE_VISIBILITY + const_local_iterator + cbegin(size_type __n) const + { + _LIBCPP_ASSERT(__n < bucket_count(), + "unordered container::cbegin(n) called with n >= bucket_count()"); + return const_local_iterator(__bucket_list_[__n], __n, bucket_count(), this); + } + + _LIBCPP_INLINE_VISIBILITY + const_local_iterator + cend(size_type __n) const + { + _LIBCPP_ASSERT(__n < bucket_count(), + "unordered container::cend(n) called with n >= bucket_count()"); + return const_local_iterator(nullptr, __n, bucket_count(), this); + } + +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + + bool __dereferenceable(const const_iterator* __i) const; + bool __decrementable(const const_iterator* __i) const; + bool __addable(const const_iterator* __i, ptrdiff_t __n) const; + bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const; + +#endif // _LIBCPP_ENABLE_DEBUG_MODE + +private: + template void __rehash(size_type __n); + template void __do_rehash(size_type __n); + + template + __node_holder __construct_node(_Args&& ...__args); + + template + __node_holder __construct_node_hash(size_t __hash, _First&& __f, _Rest&&... __rest); + + + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __hash_table& __u) + {__copy_assign_alloc(__u, integral_constant());} + void __copy_assign_alloc(const __hash_table& __u, true_type); + _LIBCPP_INLINE_VISIBILITY + void __copy_assign_alloc(const __hash_table&, false_type) {} + + void __move_assign(__hash_table& __u, false_type); + void __move_assign(__hash_table& __u, true_type) + _NOEXCEPT_( + is_nothrow_move_assignable<__node_allocator>::value && + is_nothrow_move_assignable::value && + is_nothrow_move_assignable::value); + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__hash_table& __u) + _NOEXCEPT_( + !__node_traits::propagate_on_container_move_assignment::value || + (is_nothrow_move_assignable<__pointer_allocator>::value && + is_nothrow_move_assignable<__node_allocator>::value)) + {__move_assign_alloc(__u, integral_constant());} + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__hash_table& __u, true_type) + _NOEXCEPT_( + is_nothrow_move_assignable<__pointer_allocator>::value && + is_nothrow_move_assignable<__node_allocator>::value) + { + __bucket_list_.get_deleter().__alloc() = + _VSTD::move(__u.__bucket_list_.get_deleter().__alloc()); + __node_alloc() = _VSTD::move(__u.__node_alloc()); + } + _LIBCPP_INLINE_VISIBILITY + void __move_assign_alloc(__hash_table&, false_type) _NOEXCEPT {} + + void __deallocate_node(__next_pointer __np) _NOEXCEPT; + __next_pointer __detach() _NOEXCEPT; + + template friend class _LIBCPP_TEMPLATE_VIS unordered_map; + template friend class _LIBCPP_TEMPLATE_VIS unordered_multimap; +}; + +template +inline +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table() + _NOEXCEPT_( + is_nothrow_default_constructible<__bucket_list>::value && + is_nothrow_default_constructible<__first_node>::value && + is_nothrow_default_constructible<__node_allocator>::value && + is_nothrow_default_constructible::value && + is_nothrow_default_constructible::value) + : __p2_(0, __default_init_tag()), + __p3_(1.0f, __default_init_tag()) +{ +} + +template +inline +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf, + const key_equal& __eql) + : __bucket_list_(nullptr, __bucket_list_deleter()), + __p1_(), + __p2_(0, __hf), + __p3_(1.0f, __eql) +{ +} + +template +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf, + const key_equal& __eql, + const allocator_type& __a) + : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)), + __p1_(__default_init_tag(), __node_allocator(__a)), + __p2_(0, __hf), + __p3_(1.0f, __eql) +{ +} + +template +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const allocator_type& __a) + : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)), + __p1_(__default_init_tag(), __node_allocator(__a)), + __p2_(0, __default_init_tag()), + __p3_(1.0f, __default_init_tag()) +{ +} + +template +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u) + : __bucket_list_(nullptr, + __bucket_list_deleter(allocator_traits<__pointer_allocator>:: + select_on_container_copy_construction( + __u.__bucket_list_.get_deleter().__alloc()), 0)), + __p1_(__default_init_tag(), allocator_traits<__node_allocator>:: + select_on_container_copy_construction(__u.__node_alloc())), + __p2_(0, __u.hash_function()), + __p3_(__u.__p3_) +{ +} + +template +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u, + const allocator_type& __a) + : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)), + __p1_(__default_init_tag(), __node_allocator(__a)), + __p2_(0, __u.hash_function()), + __p3_(__u.__p3_) +{ +} + +template +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u) + _NOEXCEPT_( + is_nothrow_move_constructible<__bucket_list>::value && + is_nothrow_move_constructible<__first_node>::value && + is_nothrow_move_constructible<__node_allocator>::value && + is_nothrow_move_constructible::value && + is_nothrow_move_constructible::value) + : __bucket_list_(_VSTD::move(__u.__bucket_list_)), + __p1_(_VSTD::move(__u.__p1_)), + __p2_(_VSTD::move(__u.__p2_)), + __p3_(_VSTD::move(__u.__p3_)) +{ + if (size() > 0) + { + __bucket_list_[std::__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] = + __p1_.first().__ptr(); + __u.__p1_.first().__next_ = nullptr; + __u.size() = 0; + } +} + +template +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u, + const allocator_type& __a) + : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)), + __p1_(__default_init_tag(), __node_allocator(__a)), + __p2_(0, _VSTD::move(__u.hash_function())), + __p3_(_VSTD::move(__u.__p3_)) +{ + if (__a == allocator_type(__u.__node_alloc())) + { + __bucket_list_.reset(__u.__bucket_list_.release()); + __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size(); + __u.__bucket_list_.get_deleter().size() = 0; + if (__u.size() > 0) + { + __p1_.first().__next_ = __u.__p1_.first().__next_; + __u.__p1_.first().__next_ = nullptr; + __bucket_list_[std::__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] = + __p1_.first().__ptr(); + size() = __u.size(); + __u.size() = 0; + } + } +} + +template +__hash_table<_Tp, _Hash, _Equal, _Alloc>::~__hash_table() +{ +#if defined(_LIBCPP_CXX03_LANG) + static_assert((is_copy_constructible::value), + "Predicate must be copy-constructible."); + static_assert((is_copy_constructible::value), + "Hasher must be copy-constructible."); +#endif + + __deallocate_node(__p1_.first().__next_); + std::__debug_db_erase_c(this); +} + +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__copy_assign_alloc( + const __hash_table& __u, true_type) +{ + if (__node_alloc() != __u.__node_alloc()) + { + clear(); + __bucket_list_.reset(); + __bucket_list_.get_deleter().size() = 0; + } + __bucket_list_.get_deleter().__alloc() = __u.__bucket_list_.get_deleter().__alloc(); + __node_alloc() = __u.__node_alloc(); +} + +template +__hash_table<_Tp, _Hash, _Equal, _Alloc>& +__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(const __hash_table& __u) +{ + if (this != _VSTD::addressof(__u)) + { + __copy_assign_alloc(__u); + hash_function() = __u.hash_function(); + key_eq() = __u.key_eq(); + max_load_factor() = __u.max_load_factor(); + __assign_multi(__u.begin(), __u.end()); + } + return *this; +} + +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__deallocate_node(__next_pointer __np) + _NOEXCEPT +{ + __node_allocator& __na = __node_alloc(); + while (__np != nullptr) + { + __next_pointer __next = __np->__next_; +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + __c_node* __c = __get_db()->__find_c_and_lock(this); + for (__i_node** __p = __c->end_; __p != __c->beg_; ) + { + --__p; + iterator* __i = static_cast((*__p)->__i_); + if (__i->__node_ == __np) + { + (*__p)->__c_ = nullptr; + if (--__c->end_ != __p) + _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); + } + } + __get_db()->unlock(); +#endif + __node_pointer __real_np = __np->__upcast(); + __node_traits::destroy(__na, _NodeTypes::__get_ptr(__real_np->__value_)); + __node_traits::deallocate(__na, __real_np, 1); + __np = __next; + } +} + +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__detach() _NOEXCEPT +{ + size_type __bc = bucket_count(); + for (size_type __i = 0; __i < __bc; ++__i) + __bucket_list_[__i] = nullptr; + size() = 0; + __next_pointer __cache = __p1_.first().__next_; + __p1_.first().__next_ = nullptr; + return __cache; +} + +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign( + __hash_table& __u, true_type) + _NOEXCEPT_( + is_nothrow_move_assignable<__node_allocator>::value && + is_nothrow_move_assignable::value && + is_nothrow_move_assignable::value) +{ + clear(); + __bucket_list_.reset(__u.__bucket_list_.release()); + __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size(); + __u.__bucket_list_.get_deleter().size() = 0; + __move_assign_alloc(__u); + size() = __u.size(); + hash_function() = _VSTD::move(__u.hash_function()); + max_load_factor() = __u.max_load_factor(); + key_eq() = _VSTD::move(__u.key_eq()); + __p1_.first().__next_ = __u.__p1_.first().__next_; + if (size() > 0) + { + __bucket_list_[std::__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] = + __p1_.first().__ptr(); + __u.__p1_.first().__next_ = nullptr; + __u.size() = 0; + } + std::__debug_db_swap(this, std::addressof(__u)); +} + +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign( + __hash_table& __u, false_type) +{ + if (__node_alloc() == __u.__node_alloc()) + __move_assign(__u, true_type()); + else + { + hash_function() = _VSTD::move(__u.hash_function()); + key_eq() = _VSTD::move(__u.key_eq()); + max_load_factor() = __u.max_load_factor(); + if (bucket_count() != 0) + { + __next_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + const_iterator __i = __u.begin(); + while (__cache != nullptr && __u.size() != 0) + { + __cache->__upcast()->__value_ = + _VSTD::move(__u.remove(__i++)->__value_); + __next_pointer __next = __cache->__next_; + __node_insert_multi(__cache->__upcast()); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __deallocate_node(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __deallocate_node(__cache); + } + const_iterator __i = __u.begin(); + while (__u.size() != 0) + { + __node_holder __h = __construct_node(_NodeTypes::__move(__u.remove(__i++)->__value_)); + __node_insert_multi(__h.get()); + __h.release(); + } + } +} + +template +inline +__hash_table<_Tp, _Hash, _Equal, _Alloc>& +__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(__hash_table&& __u) + _NOEXCEPT_( + __node_traits::propagate_on_container_move_assignment::value && + is_nothrow_move_assignable<__node_allocator>::value && + is_nothrow_move_assignable::value && + is_nothrow_move_assignable::value) +{ + __move_assign(__u, integral_constant()); + return *this; +} + +template +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_unique(_InputIterator __first, + _InputIterator __last) +{ + typedef iterator_traits<_InputIterator> _ITraits; + typedef typename _ITraits::value_type _ItValueType; + static_assert((is_same<_ItValueType, __container_value_type>::value), + "__assign_unique may only be called with the containers value type"); + + if (bucket_count() != 0) + { + __next_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __cache != nullptr && __first != __last; ++__first) + { + __cache->__upcast()->__value_ = *__first; + __next_pointer __next = __cache->__next_; + __node_insert_unique(__cache->__upcast()); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __deallocate_node(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __deallocate_node(__cache); + } + for (; __first != __last; ++__first) + __insert_unique(*__first); +} + +template +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_multi(_InputIterator __first, + _InputIterator __last) +{ + typedef iterator_traits<_InputIterator> _ITraits; + typedef typename _ITraits::value_type _ItValueType; + static_assert((is_same<_ItValueType, __container_value_type>::value || + is_same<_ItValueType, __node_value_type>::value), + "__assign_multi may only be called with the containers value type" + " or the nodes value type"); + if (bucket_count() != 0) + { + __next_pointer __cache = __detach(); +#ifndef _LIBCPP_NO_EXCEPTIONS + try + { +#endif // _LIBCPP_NO_EXCEPTIONS + for (; __cache != nullptr && __first != __last; ++__first) + { + __cache->__upcast()->__value_ = *__first; + __next_pointer __next = __cache->__next_; + __node_insert_multi(__cache->__upcast()); + __cache = __next; + } +#ifndef _LIBCPP_NO_EXCEPTIONS + } + catch (...) + { + __deallocate_node(__cache); + throw; + } +#endif // _LIBCPP_NO_EXCEPTIONS + __deallocate_node(__cache); + } + for (; __first != __last; ++__first) + __insert_multi(_NodeTypes::__get_value(*__first)); +} + +template +inline +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() _NOEXCEPT +{ + return iterator(__p1_.first().__next_, this); +} + +template +inline +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() _NOEXCEPT +{ + return iterator(nullptr, this); +} + +template +inline +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() const _NOEXCEPT +{ + return const_iterator(__p1_.first().__next_, this); +} + +template +inline +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() const _NOEXCEPT +{ + return const_iterator(nullptr, this); +} + +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::clear() _NOEXCEPT +{ + if (size() > 0) + { + __deallocate_node(__p1_.first().__next_); + __p1_.first().__next_ = nullptr; + size_type __bc = bucket_count(); + for (size_type __i = 0; __i < __bc; ++__i) + __bucket_list_[__i] = nullptr; + size() = 0; + } +} + + +// Prepare the container for an insertion of the value __value with the hash +// __hash. This does a lookup into the container to see if __value is already +// present, and performs a rehash if necessary. Returns a pointer to the +// existing element if it exists, otherwise nullptr. +// +// Note that this function does forward exceptions if key_eq() throws, and never +// mutates __value or actually inserts into the map. +template +_LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique_prepare( + size_t __hash, value_type& __value) +{ + size_type __bc = bucket_count(); + + if (__bc != 0) + { + size_t __chash = std::__constrain_hash(__hash, __bc); + __next_pointer __ndptr = __bucket_list_[__chash]; + if (__ndptr != nullptr) + { + for (__ndptr = __ndptr->__next_; __ndptr != nullptr && + std::__constrain_hash(__ndptr->__hash(), __bc) == __chash; + __ndptr = __ndptr->__next_) + { + if (key_eq()(__ndptr->__upcast()->__value_, __value)) + return __ndptr; + } + } + } + if (size()+1 > __bc * max_load_factor() || __bc == 0) + { + __rehash_unique(_VSTD::max(2 * __bc + !std::__is_hash_power2(__bc), + size_type(std::ceil(float(size() + 1) / max_load_factor())))); + } + return nullptr; +} + +// Insert the node __nd into the container by pushing it into the right bucket, +// and updating size(). Assumes that __nd->__hash is up-to-date, and that +// rehashing has already occurred and that no element with the same key exists +// in the map. +template +_LIBCPP_INLINE_VISIBILITY +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique_perform( + __node_pointer __nd) _NOEXCEPT +{ + size_type __bc = bucket_count(); + size_t __chash = std::__constrain_hash(__nd->__hash(), __bc); + // insert_after __bucket_list_[__chash], or __first_node if bucket is null + __next_pointer __pn = __bucket_list_[__chash]; + if (__pn == nullptr) + { + __pn =__p1_.first().__ptr(); + __nd->__next_ = __pn->__next_; + __pn->__next_ = __nd->__ptr(); + // fix up __bucket_list_ + __bucket_list_[__chash] = __pn; + if (__nd->__next_ != nullptr) + __bucket_list_[std::__constrain_hash(__nd->__next_->__hash(), __bc)] = __nd->__ptr(); + } + else + { + __nd->__next_ = __pn->__next_; + __pn->__next_ = __nd->__ptr(); + } + ++size(); +} + +template +pair::iterator, bool> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique(__node_pointer __nd) +{ + __nd->__hash_ = hash_function()(__nd->__value_); + __next_pointer __existing_node = + __node_insert_unique_prepare(__nd->__hash(), __nd->__value_); + + // Insert the node, unless it already exists in the container. + bool __inserted = false; + if (__existing_node == nullptr) + { + __node_insert_unique_perform(__nd); + __existing_node = __nd->__ptr(); + __inserted = true; + } + return pair(iterator(__existing_node, this), __inserted); +} + +// Prepare the container for an insertion of the value __cp_val with the hash +// __cp_hash. This does a lookup into the container to see if __cp_value is +// already present, and performs a rehash if necessary. Returns a pointer to the +// last occurrence of __cp_val in the map. +// +// Note that this function does forward exceptions if key_eq() throws, and never +// mutates __value or actually inserts into the map. +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi_prepare( + size_t __cp_hash, value_type& __cp_val) +{ + size_type __bc = bucket_count(); + if (size()+1 > __bc * max_load_factor() || __bc == 0) + { + __rehash_multi(_VSTD::max(2 * __bc + !std::__is_hash_power2(__bc), + size_type(std::ceil(float(size() + 1) / max_load_factor())))); + __bc = bucket_count(); + } + size_t __chash = std::__constrain_hash(__cp_hash, __bc); + __next_pointer __pn = __bucket_list_[__chash]; + if (__pn != nullptr) + { + for (bool __found = false; __pn->__next_ != nullptr && + std::__constrain_hash(__pn->__next_->__hash(), __bc) == __chash; + __pn = __pn->__next_) + { + // __found key_eq() action + // false false loop + // true true loop + // false true set __found to true + // true false break + if (__found != (__pn->__next_->__hash() == __cp_hash && + key_eq()(__pn->__next_->__upcast()->__value_, __cp_val))) + { + if (!__found) + __found = true; + else + break; + } + } + } + return __pn; +} + +// Insert the node __cp into the container after __pn (which is the last node in +// the bucket that compares equal to __cp). Rehashing, and checking for +// uniqueness has already been performed (in __node_insert_multi_prepare), so +// all we need to do is update the bucket and size(). Assumes that __cp->__hash +// is up-to-date. +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi_perform( + __node_pointer __cp, __next_pointer __pn) _NOEXCEPT +{ + size_type __bc = bucket_count(); + size_t __chash = std::__constrain_hash(__cp->__hash_, __bc); + if (__pn == nullptr) + { + __pn =__p1_.first().__ptr(); + __cp->__next_ = __pn->__next_; + __pn->__next_ = __cp->__ptr(); + // fix up __bucket_list_ + __bucket_list_[__chash] = __pn; + if (__cp->__next_ != nullptr) + __bucket_list_[std::__constrain_hash(__cp->__next_->__hash(), __bc)] + = __cp->__ptr(); + } + else + { + __cp->__next_ = __pn->__next_; + __pn->__next_ = __cp->__ptr(); + if (__cp->__next_ != nullptr) + { + size_t __nhash = std::__constrain_hash(__cp->__next_->__hash(), __bc); + if (__nhash != __chash) + __bucket_list_[__nhash] = __cp->__ptr(); + } + } + ++size(); +} + + +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(__node_pointer __cp) +{ + __cp->__hash_ = hash_function()(__cp->__value_); + __next_pointer __pn = __node_insert_multi_prepare(__cp->__hash(), __cp->__value_); + __node_insert_multi_perform(__cp, __pn); + + return iterator(__cp->__ptr(), this); +} + +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi( + const_iterator __p, __node_pointer __cp) +{ + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, + "unordered container::emplace_hint(const_iterator, args...) called with an iterator not" + " referring to this unordered container"); + if (__p != end() && key_eq()(*__p, __cp->__value_)) + { + __next_pointer __np = __p.__node_; + __cp->__hash_ = __np->__hash(); + size_type __bc = bucket_count(); + if (size()+1 > __bc * max_load_factor() || __bc == 0) + { + __rehash_multi(_VSTD::max(2 * __bc + !std::__is_hash_power2(__bc), + size_type(std::ceil(float(size() + 1) / max_load_factor())))); + __bc = bucket_count(); + } + size_t __chash = std::__constrain_hash(__cp->__hash_, __bc); + __next_pointer __pp = __bucket_list_[__chash]; + while (__pp->__next_ != __np) + __pp = __pp->__next_; + __cp->__next_ = __np; + __pp->__next_ = static_cast<__next_pointer>(__cp); + ++size(); + return iterator(static_cast<__next_pointer>(__cp), this); + } + return __node_insert_multi(__cp); +} + + + +template +template +pair::iterator, bool> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const& __k, _Args&&... __args) +{ + + size_t __hash = hash_function()(__k); + size_type __bc = bucket_count(); + bool __inserted = false; + __next_pointer __nd; + size_t __chash; + if (__bc != 0) + { + __chash = std::__constrain_hash(__hash, __bc); + __nd = __bucket_list_[__chash]; + if (__nd != nullptr) + { + for (__nd = __nd->__next_; __nd != nullptr && + (__nd->__hash() == __hash || std::__constrain_hash(__nd->__hash(), __bc) == __chash); + __nd = __nd->__next_) + { + if (key_eq()(__nd->__upcast()->__value_, __k)) + goto __done; + } + } + } + { + __node_holder __h = __construct_node_hash(__hash, _VSTD::forward<_Args>(__args)...); + if (size()+1 > __bc * max_load_factor() || __bc == 0) + { + __rehash_unique(_VSTD::max(2 * __bc + !std::__is_hash_power2(__bc), + size_type(std::ceil(float(size() + 1) / max_load_factor())))); + __bc = bucket_count(); + __chash = std::__constrain_hash(__hash, __bc); + } + // insert_after __bucket_list_[__chash], or __first_node if bucket is null + __next_pointer __pn = __bucket_list_[__chash]; + if (__pn == nullptr) + { + __pn = __p1_.first().__ptr(); + __h->__next_ = __pn->__next_; + __pn->__next_ = __h.get()->__ptr(); + // fix up __bucket_list_ + __bucket_list_[__chash] = __pn; + if (__h->__next_ != nullptr) + __bucket_list_[std::__constrain_hash(__h->__next_->__hash(), __bc)] + = __h.get()->__ptr(); + } + else + { + __h->__next_ = __pn->__next_; + __pn->__next_ = static_cast<__next_pointer>(__h.get()); + } + __nd = static_cast<__next_pointer>(__h.release()); + // increment size + ++size(); + __inserted = true; + } +__done: + return pair(iterator(__nd, this), __inserted); +} + +template +template +pair::iterator, bool> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_impl(_Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + pair __r = __node_insert_unique(__h.get()); + if (__r.second) + __h.release(); + return __r; +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_multi(_Args&&... __args) +{ + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + iterator __r = __node_insert_multi(__h.get()); + __h.release(); + return __r; +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_hint_multi( + const_iterator __p, _Args&&... __args) +{ + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, + "unordered container::emplace_hint(const_iterator, args...) called with an iterator not" + " referring to this unordered container"); + __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); + iterator __r = __node_insert_multi(__p, __h.get()); + __h.release(); + return __r; +} + +#if _LIBCPP_STD_VER > 14 +template +template +_LIBCPP_INLINE_VISIBILITY +_InsertReturnType +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_unique( + _NodeHandle&& __nh) +{ + if (__nh.empty()) + return _InsertReturnType{end(), false, _NodeHandle()}; + pair __result = __node_insert_unique(__nh.__ptr_); + if (__result.second) + __nh.__release_ptr(); + return _InsertReturnType{__result.first, __result.second, _VSTD::move(__nh)}; +} + +template +template +_LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_unique( + const_iterator, _NodeHandle&& __nh) +{ + if (__nh.empty()) + return end(); + pair __result = __node_insert_unique(__nh.__ptr_); + if (__result.second) + __nh.__release_ptr(); + return __result.first; +} + +template +template +_LIBCPP_INLINE_VISIBILITY +_NodeHandle +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_extract( + key_type const& __key) +{ + iterator __i = find(__key); + if (__i == end()) + return _NodeHandle(); + return __node_handle_extract<_NodeHandle>(__i); +} + +template +template +_LIBCPP_INLINE_VISIBILITY +_NodeHandle +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_extract( + const_iterator __p) +{ + allocator_type __alloc(__node_alloc()); + return _NodeHandle(remove(__p).release(), __alloc); +} + +template +template +_LIBCPP_INLINE_VISIBILITY +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_merge_unique( + _Table& __source) +{ + static_assert(is_same<__node, typename _Table::__node>::value, ""); + + for (typename _Table::iterator __it = __source.begin(); + __it != __source.end();) + { + __node_pointer __src_ptr = __it.__node_->__upcast(); + size_t __hash = hash_function()(__src_ptr->__value_); + __next_pointer __existing_node = + __node_insert_unique_prepare(__hash, __src_ptr->__value_); + auto __prev_iter = __it++; + if (__existing_node == nullptr) + { + (void)__source.remove(__prev_iter).release(); + __src_ptr->__hash_ = __hash; + __node_insert_unique_perform(__src_ptr); + } + } +} + +template +template +_LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_multi( + _NodeHandle&& __nh) +{ + if (__nh.empty()) + return end(); + iterator __result = __node_insert_multi(__nh.__ptr_); + __nh.__release_ptr(); + return __result; +} + +template +template +_LIBCPP_INLINE_VISIBILITY +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_multi( + const_iterator __hint, _NodeHandle&& __nh) +{ + if (__nh.empty()) + return end(); + iterator __result = __node_insert_multi(__hint, __nh.__ptr_); + __nh.__release_ptr(); + return __result; +} + +template +template +_LIBCPP_INLINE_VISIBILITY +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_merge_multi( + _Table& __source) +{ + static_assert(is_same::value, ""); + + for (typename _Table::iterator __it = __source.begin(); + __it != __source.end();) + { + __node_pointer __src_ptr = __it.__node_->__upcast(); + size_t __src_hash = hash_function()(__src_ptr->__value_); + __next_pointer __pn = + __node_insert_multi_prepare(__src_hash, __src_ptr->__value_); + (void)__source.remove(__it++).release(); + __src_ptr->__hash_ = __src_hash; + __node_insert_multi_perform(__src_ptr, __pn); + } +} +#endif // _LIBCPP_STD_VER > 14 + +template +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__rehash(size_type __n) +_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK +{ + if (__n == 1) + __n = 2; + else if (__n & (__n - 1)) + __n = std::__next_prime(__n); + size_type __bc = bucket_count(); + if (__n > __bc) + __do_rehash<_UniqueKeys>(__n); + else if (__n < __bc) + { + __n = _VSTD::max + ( + __n, + std::__is_hash_power2(__bc) ? std::__next_hash_pow2(size_t(std::ceil(float(size()) / max_load_factor()))) : + std::__next_prime(size_t(std::ceil(float(size()) / max_load_factor()))) + ); + if (__n < __bc) + __do_rehash<_UniqueKeys>(__n); + } +} + +template +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__do_rehash(size_type __nbc) +{ + std::__debug_db_invalidate_all(this); + __pointer_allocator& __npa = __bucket_list_.get_deleter().__alloc(); + __bucket_list_.reset(__nbc > 0 ? + __pointer_alloc_traits::allocate(__npa, __nbc) : nullptr); + __bucket_list_.get_deleter().size() = __nbc; + if (__nbc > 0) + { + for (size_type __i = 0; __i < __nbc; ++__i) + __bucket_list_[__i] = nullptr; + __next_pointer __pp = __p1_.first().__ptr(); + __next_pointer __cp = __pp->__next_; + if (__cp != nullptr) + { + size_type __chash = std::__constrain_hash(__cp->__hash(), __nbc); + __bucket_list_[__chash] = __pp; + size_type __phash = __chash; + for (__pp = __cp, void(), __cp = __cp->__next_; __cp != nullptr; + __cp = __pp->__next_) + { + __chash = std::__constrain_hash(__cp->__hash(), __nbc); + if (__chash == __phash) + __pp = __cp; + else + { + if (__bucket_list_[__chash] == nullptr) + { + __bucket_list_[__chash] = __pp; + __pp = __cp; + __phash = __chash; + } + else + { + __next_pointer __np = __cp; + if _LIBCPP_CONSTEXPR_SINCE_CXX17 (!_UniqueKeys) + { + for (; __np->__next_ != nullptr && + key_eq()(__cp->__upcast()->__value_, + __np->__next_->__upcast()->__value_); + __np = __np->__next_) + ; + } + __pp->__next_ = __np->__next_; + __np->__next_ = __bucket_list_[__chash]->__next_; + __bucket_list_[__chash]->__next_ = __cp; + + } + } + } + } + } +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k) +{ + size_t __hash = hash_function()(__k); + size_type __bc = bucket_count(); + if (__bc != 0) + { + size_t __chash = std::__constrain_hash(__hash, __bc); + __next_pointer __nd = __bucket_list_[__chash]; + if (__nd != nullptr) + { + for (__nd = __nd->__next_; __nd != nullptr && + (__nd->__hash() == __hash + || std::__constrain_hash(__nd->__hash(), __bc) == __chash); + __nd = __nd->__next_) + { + if ((__nd->__hash() == __hash) + && key_eq()(__nd->__upcast()->__value_, __k)) + return iterator(__nd, this); + } + } + } + return end(); +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k) const +{ + size_t __hash = hash_function()(__k); + size_type __bc = bucket_count(); + if (__bc != 0) + { + size_t __chash = std::__constrain_hash(__hash, __bc); + __next_pointer __nd = __bucket_list_[__chash]; + if (__nd != nullptr) + { + for (__nd = __nd->__next_; __nd != nullptr && + (__hash == __nd->__hash() + || std::__constrain_hash(__nd->__hash(), __bc) == __chash); + __nd = __nd->__next_) + { + if ((__nd->__hash() == __hash) + && key_eq()(__nd->__upcast()->__value_, __k)) + return const_iterator(__nd, this); + } + } + + } + return end(); +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(_Args&& ...__args) +{ + static_assert(!__is_hash_value_type<_Args...>::value, + "Construct cannot be called with a hash value type"); + __node_allocator& __na = __node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), _VSTD::forward<_Args>(__args)...); + __h.get_deleter().__value_constructed = true; + __h->__hash_ = hash_function()(__h->__value_); + __h->__next_ = nullptr; + return __h; +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node_hash( + size_t __hash, _First&& __f, _Rest&& ...__rest) +{ + static_assert(!__is_hash_value_type<_First, _Rest...>::value, + "Construct cannot be called with a hash value type"); + __node_allocator& __na = __node_alloc(); + __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); + __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), + _VSTD::forward<_First>(__f), + _VSTD::forward<_Rest>(__rest)...); + __h.get_deleter().__value_constructed = true; + __h->__hash_ = __hash; + __h->__next_ = nullptr; + return __h; +} + +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __p) +{ + __next_pointer __np = __p.__node_; + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, + "unordered container erase(iterator) called with an iterator not" + " referring to this container"); + _LIBCPP_ASSERT(__p != end(), + "unordered container erase(iterator) called with a non-dereferenceable iterator"); + iterator __r(__np, this); + ++__r; + remove(__p); + return __r; +} + +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator +__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __first, + const_iterator __last) +{ + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__first)) == this, + "unordered container::erase(iterator, iterator) called with an iterator not" + " referring to this container"); + _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__last)) == this, + "unordered container::erase(iterator, iterator) called with an iterator not" + " referring to this container"); + for (const_iterator __p = __first; __first != __last; __p = __first) + { + ++__first; + erase(__p); + } + __next_pointer __np = __last.__node_; + return iterator (__np, this); +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_unique(const _Key& __k) +{ + iterator __i = find(__k); + if (__i == end()) + return 0; + erase(__i); + return 1; +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_multi(const _Key& __k) +{ + size_type __r = 0; + iterator __i = find(__k); + if (__i != end()) + { + iterator __e = end(); + do + { + erase(__i++); + ++__r; + } while (__i != __e && key_eq()(*__i, __k)); + } + return __r; +} + +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder +__hash_table<_Tp, _Hash, _Equal, _Alloc>::remove(const_iterator __p) _NOEXCEPT +{ + // current node + __next_pointer __cn = __p.__node_; + size_type __bc = bucket_count(); + size_t __chash = std::__constrain_hash(__cn->__hash(), __bc); + // find previous node + __next_pointer __pn = __bucket_list_[__chash]; + for (; __pn->__next_ != __cn; __pn = __pn->__next_) + ; + // Fix up __bucket_list_ + // if __pn is not in same bucket (before begin is not in same bucket) && + // if __cn->__next_ is not in same bucket (nullptr is not in same bucket) + if (__pn == __p1_.first().__ptr() + || std::__constrain_hash(__pn->__hash(), __bc) != __chash) + { + if (__cn->__next_ == nullptr + || std::__constrain_hash(__cn->__next_->__hash(), __bc) != __chash) + __bucket_list_[__chash] = nullptr; + } + // if __cn->__next_ is not in same bucket (nullptr is in same bucket) + if (__cn->__next_ != nullptr) + { + size_t __nhash = std::__constrain_hash(__cn->__next_->__hash(), __bc); + if (__nhash != __chash) + __bucket_list_[__nhash] = __pn; + } + // remove __cn + __pn->__next_ = __cn->__next_; + __cn->__next_ = nullptr; + --size(); +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + __c_node* __c = __get_db()->__find_c_and_lock(this); + for (__i_node** __dp = __c->end_; __dp != __c->beg_; ) + { + --__dp; + iterator* __i = static_cast((*__dp)->__i_); + if (__i->__node_ == __cn) + { + (*__dp)->__c_ = nullptr; + if (--__c->end_ != __dp) + _VSTD::memmove(__dp, __dp+1, (__c->end_ - __dp)*sizeof(__i_node*)); + } + } + __get_db()->unlock(); +#endif + return __node_holder(__cn->__upcast(), _Dp(__node_alloc(), true)); +} + +template +template +inline +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__count_unique(const _Key& __k) const +{ + return static_cast(find(__k) != end()); +} + +template +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__count_multi(const _Key& __k) const +{ + size_type __r = 0; + const_iterator __i = find(__k); + if (__i != end()) + { + const_iterator __e = end(); + do + { + ++__i; + ++__r; + } while (__i != __e && key_eq()(*__i, __k)); + } + return __r; +} + +template +template +pair::iterator, + typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_unique( + const _Key& __k) +{ + iterator __i = find(__k); + iterator __j = __i; + if (__i != end()) + ++__j; + return pair(__i, __j); +} + +template +template +pair::const_iterator, + typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_unique( + const _Key& __k) const +{ + const_iterator __i = find(__k); + const_iterator __j = __i; + if (__i != end()) + ++__j; + return pair(__i, __j); +} + +template +template +pair::iterator, + typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_multi( + const _Key& __k) +{ + iterator __i = find(__k); + iterator __j = __i; + if (__i != end()) + { + iterator __e = end(); + do + { + ++__j; + } while (__j != __e && key_eq()(*__j, __k)); + } + return pair(__i, __j); +} + +template +template +pair::const_iterator, + typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator> +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__equal_range_multi( + const _Key& __k) const +{ + const_iterator __i = find(__k); + const_iterator __j = __i; + if (__i != end()) + { + const_iterator __e = end(); + do + { + ++__j; + } while (__j != __e && key_eq()(*__j, __k)); + } + return pair(__i, __j); +} + +template +void +__hash_table<_Tp, _Hash, _Equal, _Alloc>::swap(__hash_table& __u) +#if _LIBCPP_STD_VER <= 11 + _NOEXCEPT_( + __is_nothrow_swappable::value && __is_nothrow_swappable::value + && (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value + || __is_nothrow_swappable<__pointer_allocator>::value) + && (!__node_traits::propagate_on_container_swap::value + || __is_nothrow_swappable<__node_allocator>::value) + ) +#else + _NOEXCEPT_(__is_nothrow_swappable::value && __is_nothrow_swappable::value) +#endif +{ + _LIBCPP_ASSERT(__node_traits::propagate_on_container_swap::value || + this->__node_alloc() == __u.__node_alloc(), + "list::swap: Either propagate_on_container_swap must be true" + " or the allocators must compare equal"); + { + __node_pointer_pointer __npp = __bucket_list_.release(); + __bucket_list_.reset(__u.__bucket_list_.release()); + __u.__bucket_list_.reset(__npp); + } + _VSTD::swap(__bucket_list_.get_deleter().size(), __u.__bucket_list_.get_deleter().size()); + _VSTD::__swap_allocator(__bucket_list_.get_deleter().__alloc(), + __u.__bucket_list_.get_deleter().__alloc()); + _VSTD::__swap_allocator(__node_alloc(), __u.__node_alloc()); + _VSTD::swap(__p1_.first().__next_, __u.__p1_.first().__next_); + __p2_.swap(__u.__p2_); + __p3_.swap(__u.__p3_); + if (size() > 0) + __bucket_list_[std::__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] = + __p1_.first().__ptr(); + if (__u.size() > 0) + __u.__bucket_list_[std::__constrain_hash(__u.__p1_.first().__next_->__hash(), __u.bucket_count())] = + __u.__p1_.first().__ptr(); + std::__debug_db_swap(this, std::addressof(__u)); +} + +template +typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type +__hash_table<_Tp, _Hash, _Equal, _Alloc>::bucket_size(size_type __n) const +{ + _LIBCPP_ASSERT(__n < bucket_count(), + "unordered container::bucket_size(n) called with n >= bucket_count()"); + __next_pointer __np = __bucket_list_[__n]; + size_type __bc = bucket_count(); + size_type __r = 0; + if (__np != nullptr) + { + for (__np = __np->__next_; __np != nullptr && + std::__constrain_hash(__np->__hash(), __bc) == __n; + __np = __np->__next_, (void) ++__r) + ; + } + return __r; +} + +template +inline _LIBCPP_INLINE_VISIBILITY +void +swap(__hash_table<_Tp, _Hash, _Equal, _Alloc>& __x, + __hash_table<_Tp, _Hash, _Equal, _Alloc>& __y) + _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) +{ + __x.swap(__y); +} + +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + +template +bool +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__dereferenceable(const const_iterator* __i) const +{ + return __i->__node_ != nullptr; +} + +template +bool +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__decrementable(const const_iterator*) const +{ + return false; +} + +template +bool +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__addable(const const_iterator*, ptrdiff_t) const +{ + return false; +} + +template +bool +__hash_table<_Tp, _Hash, _Equal, _Alloc>::__subscriptable(const const_iterator*, ptrdiff_t) const +{ + return false; +} + +#endif // _LIBCPP_ENABLE_DEBUG_MODE + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___HASH_TABLE diff --git a/app/src/main/cpp/libcxx/include/__ios/fpos.h b/app/src/main/cpp/libcxx/include/__ios/fpos.h new file mode 100644 index 0000000..87f0135 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__ios/fpos.h @@ -0,0 +1,79 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___IOS_FPOS_H +#define _LIBCPP___IOS_FPOS_H + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class _LIBCPP_TEMPLATE_VIS fpos { +private: + _StateT __st_; + streamoff __off_; + +public: + _LIBCPP_HIDE_FROM_ABI fpos(streamoff __off = streamoff()) : __st_(), __off_(__off) {} + + _LIBCPP_HIDE_FROM_ABI operator streamoff() const { return __off_; } + + _LIBCPP_HIDE_FROM_ABI _StateT state() const { return __st_; } + _LIBCPP_HIDE_FROM_ABI void state(_StateT __st) { __st_ = __st; } + + _LIBCPP_HIDE_FROM_ABI fpos& operator+=(streamoff __off) { + __off_ += __off; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI fpos operator+(streamoff __off) const { + fpos __t(*this); + __t += __off; + return __t; + } + + _LIBCPP_HIDE_FROM_ABI fpos& operator-=(streamoff __off) { + __off_ -= __off; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI fpos operator-(streamoff __off) const { + fpos __t(*this); + __t -= __off; + return __t; + } +}; + +template +inline _LIBCPP_HIDE_FROM_ABI +streamoff operator-(const fpos<_StateT>& __x, const fpos<_StateT>& __y) { + return streamoff(__x) - streamoff(__y); +} + +template +inline _LIBCPP_HIDE_FROM_ABI +bool operator==(const fpos<_StateT>& __x, const fpos<_StateT>& __y) { + return streamoff(__x) == streamoff(__y); +} + +template +inline _LIBCPP_HIDE_FROM_ABI +bool operator!=(const fpos<_StateT>& __x, const fpos<_StateT>& __y) { + return streamoff(__x) != streamoff(__y); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___IOS_FPOS_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/access.h b/app/src/main/cpp/libcxx/include/__iterator/access.h new file mode 100644 index 0000000..0b8d523 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/access.h @@ -0,0 +1,129 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ACCESS_H +#define _LIBCPP___ITERATOR_ACCESS_H + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp* +begin(_Tp (&__array)[_Np]) +{ + return __array; +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +_Tp* +end(_Tp (&__array)[_Np]) +{ + return __array + _Np; +} + +#if !defined(_LIBCPP_CXX03_LANG) + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto +begin(_Cp& __c) -> decltype(__c.begin()) +{ + return __c.begin(); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto +begin(const _Cp& __c) -> decltype(__c.begin()) +{ + return __c.begin(); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto +end(_Cp& __c) -> decltype(__c.end()) +{ + return __c.end(); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto +end(const _Cp& __c) -> decltype(__c.end()) +{ + return __c.end(); +} + +#if _LIBCPP_STD_VER > 11 + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +auto cbegin(const _Cp& __c) -> decltype(_VSTD::begin(__c)) +{ + return _VSTD::begin(__c); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14 +auto cend(const _Cp& __c) -> decltype(_VSTD::end(__c)) +{ + return _VSTD::end(__c); +} + +#endif + + +#else // defined(_LIBCPP_CXX03_LANG) + +template +_LIBCPP_INLINE_VISIBILITY +typename _Cp::iterator +begin(_Cp& __c) +{ + return __c.begin(); +} + +template +_LIBCPP_INLINE_VISIBILITY +typename _Cp::const_iterator +begin(const _Cp& __c) +{ + return __c.begin(); +} + +template +_LIBCPP_INLINE_VISIBILITY +typename _Cp::iterator +end(_Cp& __c) +{ + return __c.end(); +} + +template +_LIBCPP_INLINE_VISIBILITY +typename _Cp::const_iterator +end(const _Cp& __c) +{ + return __c.end(); +} + +#endif // !defined(_LIBCPP_CXX03_LANG) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ACCESS_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/advance.h b/app/src/main/cpp/libcxx/include/__iterator/advance.h new file mode 100644 index 0000000..154c273 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/advance.h @@ -0,0 +1,203 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ADVANCE_H +#define _LIBCPP___ITERATOR_ADVANCE_H + +#include <__assert> +#include <__concepts/assignable.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_integral.h> +#include <__utility/convert_to_integral.h> +#include <__utility/declval.h> +#include <__utility/move.h> +#include <__utility/unreachable.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +void __advance(_InputIter& __i, typename iterator_traits<_InputIter>::difference_type __n, input_iterator_tag) { + for (; __n > 0; --__n) + ++__i; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +void __advance(_BiDirIter& __i, typename iterator_traits<_BiDirIter>::difference_type __n, bidirectional_iterator_tag) { + if (__n >= 0) + for (; __n > 0; --__n) + ++__i; + else + for (; __n < 0; ++__n) + --__i; +} + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +void __advance(_RandIter& __i, typename iterator_traits<_RandIter>::difference_type __n, random_access_iterator_tag) { + __i += __n; +} + +template < + class _InputIter, class _Distance, + class _IntegralDistance = decltype(_VSTD::__convert_to_integral(std::declval<_Distance>())), + class = __enable_if_t::value> > +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +void advance(_InputIter& __i, _Distance __orig_n) { + typedef typename iterator_traits<_InputIter>::difference_type _Difference; + _Difference __n = static_cast<_Difference>(_VSTD::__convert_to_integral(__orig_n)); + _LIBCPP_ASSERT(__n >= 0 || __is_cpp17_bidirectional_iterator<_InputIter>::value, + "Attempt to advance(it, n) with negative n on a non-bidirectional iterator"); + _VSTD::__advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category()); +} + +#if _LIBCPP_STD_VER > 17 + +// [range.iter.op.advance] + +namespace ranges { +namespace __advance { + +struct __fn { +private: + template + _LIBCPP_HIDE_FROM_ABI + static constexpr void __advance_forward(_Ip& __i, iter_difference_t<_Ip> __n) { + while (__n > 0) { + --__n; + ++__i; + } + } + + template + _LIBCPP_HIDE_FROM_ABI + static constexpr void __advance_backward(_Ip& __i, iter_difference_t<_Ip> __n) { + while (__n < 0) { + ++__n; + --__i; + } + } + +public: + // Preconditions: If `I` does not model `bidirectional_iterator`, `n` is not negative. + template + _LIBCPP_HIDE_FROM_ABI + constexpr void operator()(_Ip& __i, iter_difference_t<_Ip> __n) const { + _LIBCPP_ASSERT(__n >= 0 || bidirectional_iterator<_Ip>, + "If `n < 0`, then `bidirectional_iterator` must be true."); + + // If `I` models `random_access_iterator`, equivalent to `i += n`. + if constexpr (random_access_iterator<_Ip>) { + __i += __n; + return; + } else if constexpr (bidirectional_iterator<_Ip>) { + // Otherwise, if `n` is non-negative, increments `i` by `n`. + __advance_forward(__i, __n); + // Otherwise, decrements `i` by `-n`. + __advance_backward(__i, __n); + return; + } else { + // Otherwise, if `n` is non-negative, increments `i` by `n`. + __advance_forward(__i, __n); + return; + } + } + + // Preconditions: Either `assignable_from || sized_sentinel_for` is modeled, or [i, bound_sentinel) denotes a range. + template _Sp> + _LIBCPP_HIDE_FROM_ABI constexpr void operator()(_Ip& __i, _Sp __bound_sentinel) const { + // If `I` and `S` model `assignable_from`, equivalent to `i = std::move(bound_sentinel)`. + if constexpr (assignable_from<_Ip&, _Sp>) { + __i = _VSTD::move(__bound_sentinel); + } + // Otherwise, if `S` and `I` model `sized_sentinel_for`, equivalent to `ranges::advance(i, bound_sentinel - i)`. + else if constexpr (sized_sentinel_for<_Sp, _Ip>) { + (*this)(__i, __bound_sentinel - __i); + } + // Otherwise, while `bool(i != bound_sentinel)` is true, increments `i`. + else { + while (__i != __bound_sentinel) { + ++__i; + } + } + } + + // Preconditions: + // * If `n > 0`, [i, bound_sentinel) denotes a range. + // * If `n == 0`, [i, bound_sentinel) or [bound_sentinel, i) denotes a range. + // * If `n < 0`, [bound_sentinel, i) denotes a range, `I` models `bidirectional_iterator`, and `I` and `S` model `same_as`. + // Returns: `n - M`, where `M` is the difference between the ending and starting position. + template _Sp> + _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip& __i, iter_difference_t<_Ip> __n, + _Sp __bound_sentinel) const { + _LIBCPP_ASSERT((__n >= 0) || (bidirectional_iterator<_Ip> && same_as<_Ip, _Sp>), + "If `n < 0`, then `bidirectional_iterator && same_as` must be true."); + // If `S` and `I` model `sized_sentinel_for`: + if constexpr (sized_sentinel_for<_Sp, _Ip>) { + // If |n| >= |bound_sentinel - i|, equivalent to `ranges::advance(i, bound_sentinel)`. + // __magnitude_geq(a, b) returns |a| >= |b|, assuming they have the same sign. + auto __magnitude_geq = [](auto __a, auto __b) { + return __a == 0 ? __b == 0 : + __a > 0 ? __a >= __b : + __a <= __b; + }; + if (const auto __M = __bound_sentinel - __i; __magnitude_geq(__n, __M)) { + (*this)(__i, __bound_sentinel); + return __n - __M; + } + + // Otherwise, equivalent to `ranges::advance(i, n)`. + (*this)(__i, __n); + return 0; + } else { + // Otherwise, if `n` is non-negative, while `bool(i != bound_sentinel)` is true, increments `i` but at + // most `n` times. + while (__i != __bound_sentinel && __n > 0) { + ++__i; + --__n; + } + + // Otherwise, while `bool(i != bound_sentinel)` is true, decrements `i` but at most `-n` times. + if constexpr (bidirectional_iterator<_Ip> && same_as<_Ip, _Sp>) { + while (__i != __bound_sentinel && __n < 0) { + --__i; + ++__n; + } + } + return __n; + } + + __libcpp_unreachable(); + } +}; + +} // namespace __advance + +inline namespace __cpo { + inline constexpr auto advance = __advance::__fn{}; +} // namespace __cpo +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ADVANCE_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/back_insert_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/back_insert_iterator.h new file mode 100644 index 0000000..4c00a7e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/back_insert_iterator.h @@ -0,0 +1,73 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_BACK_INSERT_ITERATOR_H +#define _LIBCPP___ITERATOR_BACK_INSERT_ITERATOR_H + +#include <__config> +#include <__iterator/iterator.h> +#include <__iterator/iterator_traits.h> +#include <__memory/addressof.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template +class _LIBCPP_TEMPLATE_VIS back_insert_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif +{ +_LIBCPP_SUPPRESS_DEPRECATED_POP +protected: + _Container* container; +public: + typedef output_iterator_tag iterator_category; + typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else + typedef void difference_type; +#endif + typedef void pointer; + typedef void reference; + typedef _Container container_type; + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit back_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator& operator=(const typename _Container::value_type& __value) + {container->push_back(__value); return *this;} +#ifndef _LIBCPP_CXX03_LANG + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator& operator=(typename _Container::value_type&& __value) + {container->push_back(_VSTD::move(__value)); return *this;} +#endif // _LIBCPP_CXX03_LANG + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator& operator*() {return *this;} + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator& operator++() {return *this;} + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 back_insert_iterator operator++(int) {return *this;} + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Container* __get_container() const { return container; } +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(back_insert_iterator); + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 +back_insert_iterator<_Container> +back_inserter(_Container& __x) +{ + return back_insert_iterator<_Container>(__x); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_BACK_INSERT_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/bounded_iter.h b/app/src/main/cpp/libcxx/include/__iterator/bounded_iter.h new file mode 100644 index 0000000..2682f2a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/bounded_iter.h @@ -0,0 +1,231 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_BOUNDED_ITER_H +#define _LIBCPP___ITERATOR_BOUNDED_ITER_H + +#include <__assert> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__memory/pointer_traits.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/integral_constant.h> +#include <__type_traits/is_convertible.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +// Iterator wrapper that carries the valid range it is allowed to access. +// +// This is a simple iterator wrapper for contiguous iterators that points +// within a [begin, end) range and carries these bounds with it. The iterator +// ensures that it is pointing within that [begin, end) range when it is +// dereferenced. +// +// Arithmetic operations are allowed and the bounds of the resulting iterator +// are not checked. Hence, it is possible to create an iterator pointing outside +// its range, but it is not possible to dereference it. +template ::value > > +struct __bounded_iter { + using value_type = typename iterator_traits<_Iterator>::value_type; + using difference_type = typename iterator_traits<_Iterator>::difference_type; + using pointer = typename iterator_traits<_Iterator>::pointer; + using reference = typename iterator_traits<_Iterator>::reference; + using iterator_category = typename iterator_traits<_Iterator>::iterator_category; +#if _LIBCPP_STD_VER > 17 + using iterator_concept = contiguous_iterator_tag; +#endif + + // Create a singular iterator. + // + // Such an iterator does not point to any object and is conceptually out of bounds, so it is + // not dereferenceable. Observing operations like comparison and assignment are valid. + _LIBCPP_HIDE_FROM_ABI __bounded_iter() = default; + + _LIBCPP_HIDE_FROM_ABI __bounded_iter(__bounded_iter const&) = default; + _LIBCPP_HIDE_FROM_ABI __bounded_iter(__bounded_iter&&) = default; + + template ::value > > + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __bounded_iter(__bounded_iter<_OtherIterator> const& __other) _NOEXCEPT + : __current_(__other.__current_), + __begin_(__other.__begin_), + __end_(__other.__end_) {} + + // Assign a bounded iterator to another one, rebinding the bounds of the iterator as well. + _LIBCPP_HIDE_FROM_ABI __bounded_iter& operator=(__bounded_iter const&) = default; + _LIBCPP_HIDE_FROM_ABI __bounded_iter& operator=(__bounded_iter&&) = default; + +private: + // Create an iterator wrapping the given iterator, and whose bounds are described + // by the provided [begin, end) range. + // + // This constructor does not check whether the resulting iterator is within its bounds. + // However, it does check that the provided [begin, end) range is a valid range (that + // is, begin <= end). + // + // Since it is non-standard for iterators to have this constructor, __bounded_iter must + // be created via `std::__make_bounded_iter`. + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit __bounded_iter( + _Iterator __current, _Iterator __begin, _Iterator __end) + : __current_(__current), __begin_(__begin), __end_(__end) { + _LIBCPP_ASSERT(__begin <= __end, "__bounded_iter(current, begin, end): [begin, end) is not a valid range"); + } + + template + friend _LIBCPP_CONSTEXPR __bounded_iter<_It> __make_bounded_iter(_It, _It, _It); + +public: + // Dereference and indexing operations. + // + // These operations check that the iterator is dereferenceable, that is within [begin, end). + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference operator*() const _NOEXCEPT { + _LIBCPP_ASSERT( + __in_bounds(__current_), "__bounded_iter::operator*: Attempt to dereference an out-of-range iterator"); + return *__current_; + } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pointer operator->() const _NOEXCEPT { + _LIBCPP_ASSERT( + __in_bounds(__current_), "__bounded_iter::operator->: Attempt to dereference an out-of-range iterator"); + return std::__to_address(__current_); + } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 reference operator[](difference_type __n) const _NOEXCEPT { + _LIBCPP_ASSERT( + __in_bounds(__current_ + __n), "__bounded_iter::operator[]: Attempt to index an iterator out-of-range"); + return __current_[__n]; + } + + // Arithmetic operations. + // + // These operations do not check that the resulting iterator is within the bounds, since that + // would make it impossible to create a past-the-end iterator. + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __bounded_iter& operator++() _NOEXCEPT { + ++__current_; + return *this; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __bounded_iter operator++(int) _NOEXCEPT { + __bounded_iter __tmp(*this); + ++*this; + return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __bounded_iter& operator--() _NOEXCEPT { + --__current_; + return *this; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __bounded_iter operator--(int) _NOEXCEPT { + __bounded_iter __tmp(*this); + --*this; + return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __bounded_iter& operator+=(difference_type __n) _NOEXCEPT { + __current_ += __n; + return *this; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __bounded_iter + operator+(__bounded_iter const& __self, difference_type __n) _NOEXCEPT { + __bounded_iter __tmp(__self); + __tmp += __n; + return __tmp; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __bounded_iter + operator+(difference_type __n, __bounded_iter const& __self) _NOEXCEPT { + __bounded_iter __tmp(__self); + __tmp += __n; + return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 __bounded_iter& operator-=(difference_type __n) _NOEXCEPT { + __current_ -= __n; + return *this; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend __bounded_iter + operator-(__bounded_iter const& __self, difference_type __n) _NOEXCEPT { + __bounded_iter __tmp(__self); + __tmp -= __n; + return __tmp; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 friend difference_type + operator-(__bounded_iter const& __x, __bounded_iter const& __y) _NOEXCEPT { + return __x.__current_ - __y.__current_; + } + + // Comparison operations. + // + // These operations do not check whether the iterators are within their bounds. + // The valid range for each iterator is also not considered as part of the comparison, + // i.e. two iterators pointing to the same location will be considered equal even + // if they have different validity ranges. + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR friend bool + operator==(__bounded_iter const& __x, __bounded_iter const& __y) _NOEXCEPT { + return __x.__current_ == __y.__current_; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR friend bool + operator!=(__bounded_iter const& __x, __bounded_iter const& __y) _NOEXCEPT { + return __x.__current_ != __y.__current_; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR friend bool + operator<(__bounded_iter const& __x, __bounded_iter const& __y) _NOEXCEPT { + return __x.__current_ < __y.__current_; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR friend bool + operator>(__bounded_iter const& __x, __bounded_iter const& __y) _NOEXCEPT { + return __x.__current_ > __y.__current_; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR friend bool + operator<=(__bounded_iter const& __x, __bounded_iter const& __y) _NOEXCEPT { + return __x.__current_ <= __y.__current_; + } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR friend bool + operator>=(__bounded_iter const& __x, __bounded_iter const& __y) _NOEXCEPT { + return __x.__current_ >= __y.__current_; + } + +private: + // Return whether the given iterator is in the bounds of this __bounded_iter. + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool __in_bounds(_Iterator const& __iter) const { + return __iter >= __begin_ && __iter < __end_; + } + + template + friend struct pointer_traits; + _Iterator __current_; // current iterator + _Iterator __begin_, __end_; // valid range represented as [begin, end) +}; + +template +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __bounded_iter<_It> __make_bounded_iter(_It __it, _It __begin, _It __end) { + return __bounded_iter<_It>(std::move(__it), std::move(__begin), std::move(__end)); +} + +#if _LIBCPP_STD_VER <= 17 +template +struct __is_cpp17_contiguous_iterator<__bounded_iter<_Iterator> > : true_type {}; +#endif + +template +struct pointer_traits<__bounded_iter<_Iterator> > { + using pointer = __bounded_iter<_Iterator>; + using element_type = typename pointer_traits<_Iterator>::element_type; + using difference_type = typename pointer_traits<_Iterator>::difference_type; + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR static element_type* to_address(pointer __it) _NOEXCEPT { + return std::__to_address(__it.__current_); + } +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_BOUNDED_ITER_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/common_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/common_iterator.h new file mode 100644 index 0000000..f7883e2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/common_iterator.h @@ -0,0 +1,281 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_COMMON_ITERATOR_H +#define _LIBCPP___ITERATOR_COMMON_ITERATOR_H + +#include <__assert> +#include <__concepts/assignable.h> +#include <__concepts/constructible.h> +#include <__concepts/convertible_to.h> +#include <__concepts/copyable.h> +#include <__concepts/derived_from.h> +#include <__concepts/equality_comparable.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iter_move.h> +#include <__iterator/iter_swap.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/readable_traits.h> +#include <__type_traits/is_pointer.h> +#include <__utility/declval.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +concept __can_use_postfix_proxy = + constructible_from, iter_reference_t<_Iter>> && + move_constructible>; + +template _Sent> + requires (!same_as<_Iter, _Sent> && copyable<_Iter>) +class common_iterator { + struct __proxy { + constexpr const iter_value_t<_Iter>* operator->() const noexcept { + return _VSTD::addressof(__value_); + } + iter_value_t<_Iter> __value_; + }; + + struct __postfix_proxy { + constexpr const iter_value_t<_Iter>& operator*() const noexcept { + return __value_; + } + iter_value_t<_Iter> __value_; + }; + +public: + variant<_Iter, _Sent> __hold_; + + common_iterator() requires default_initializable<_Iter> = default; + + constexpr common_iterator(_Iter __i) : __hold_(in_place_type<_Iter>, _VSTD::move(__i)) {} + constexpr common_iterator(_Sent __s) : __hold_(in_place_type<_Sent>, _VSTD::move(__s)) {} + + template + requires convertible_to && convertible_to + constexpr common_iterator(const common_iterator<_I2, _S2>& __other) + : __hold_([&]() -> variant<_Iter, _Sent> { + _LIBCPP_ASSERT(!__other.__hold_.valueless_by_exception(), "Attempted to construct from a valueless common_iterator"); + if (__other.__hold_.index() == 0) + return variant<_Iter, _Sent>{in_place_index<0>, _VSTD::__unchecked_get<0>(__other.__hold_)}; + return variant<_Iter, _Sent>{in_place_index<1>, _VSTD::__unchecked_get<1>(__other.__hold_)}; + }()) {} + + template + requires convertible_to && convertible_to && + assignable_from<_Iter&, const _I2&> && assignable_from<_Sent&, const _S2&> + common_iterator& operator=(const common_iterator<_I2, _S2>& __other) { + _LIBCPP_ASSERT(!__other.__hold_.valueless_by_exception(), "Attempted to assign from a valueless common_iterator"); + + auto __idx = __hold_.index(); + auto __other_idx = __other.__hold_.index(); + + // If they're the same index, just assign. + if (__idx == 0 && __other_idx == 0) + _VSTD::__unchecked_get<0>(__hold_) = _VSTD::__unchecked_get<0>(__other.__hold_); + else if (__idx == 1 && __other_idx == 1) + _VSTD::__unchecked_get<1>(__hold_) = _VSTD::__unchecked_get<1>(__other.__hold_); + + // Otherwise replace with the oposite element. + else if (__other_idx == 1) + __hold_.template emplace<1>(_VSTD::__unchecked_get<1>(__other.__hold_)); + else if (__other_idx == 0) + __hold_.template emplace<0>(_VSTD::__unchecked_get<0>(__other.__hold_)); + + return *this; + } + + constexpr decltype(auto) operator*() + { + _LIBCPP_ASSERT(std::holds_alternative<_Iter>(__hold_), "Attempted to dereference a non-dereferenceable common_iterator"); + return *_VSTD::__unchecked_get<_Iter>(__hold_); + } + + constexpr decltype(auto) operator*() const + requires __dereferenceable + { + _LIBCPP_ASSERT(std::holds_alternative<_Iter>(__hold_), "Attempted to dereference a non-dereferenceable common_iterator"); + return *_VSTD::__unchecked_get<_Iter>(__hold_); + } + + template + decltype(auto) operator->() const + requires indirectly_readable && + (requires(const _I2& __i) { __i.operator->(); } || + is_reference_v> || + constructible_from, iter_reference_t<_I2>>) + { + _LIBCPP_ASSERT(std::holds_alternative<_Iter>(__hold_), "Attempted to dereference a non-dereferenceable common_iterator"); + if constexpr (is_pointer_v<_Iter> || requires(const _Iter& __i) { __i.operator->(); }) { + return _VSTD::__unchecked_get<_Iter>(__hold_); + } else if constexpr (is_reference_v>) { + auto&& __tmp = *_VSTD::__unchecked_get<_Iter>(__hold_); + return _VSTD::addressof(__tmp); + } else { + return __proxy{*_VSTD::__unchecked_get<_Iter>(__hold_)}; + } + } + + common_iterator& operator++() { + _LIBCPP_ASSERT(std::holds_alternative<_Iter>(__hold_), "Attempted to increment a non-dereferenceable common_iterator"); + ++_VSTD::__unchecked_get<_Iter>(__hold_); return *this; + } + + decltype(auto) operator++(int) { + _LIBCPP_ASSERT(std::holds_alternative<_Iter>(__hold_), "Attempted to increment a non-dereferenceable common_iterator"); + if constexpr (forward_iterator<_Iter>) { + auto __tmp = *this; + ++*this; + return __tmp; + } else if constexpr (requires (_Iter& __i) { { *__i++ } -> __can_reference; } || + !__can_use_postfix_proxy<_Iter>) { + return _VSTD::__unchecked_get<_Iter>(__hold_)++; + } else { + auto __p = __postfix_proxy{**this}; + ++*this; + return __p; + } + } + + template _S2> + requires sentinel_for<_Sent, _I2> + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==(const common_iterator& __x, const common_iterator<_I2, _S2>& __y) { + _LIBCPP_ASSERT(!__x.__hold_.valueless_by_exception(), "Attempted to compare a valueless common_iterator"); + _LIBCPP_ASSERT(!__y.__hold_.valueless_by_exception(), "Attempted to compare a valueless common_iterator"); + + auto __x_index = __x.__hold_.index(); + auto __y_index = __y.__hold_.index(); + + if (__x_index == __y_index) + return true; + + if (__x_index == 0) + return _VSTD::__unchecked_get<_Iter>(__x.__hold_) == _VSTD::__unchecked_get<_S2>(__y.__hold_); + + return _VSTD::__unchecked_get<_Sent>(__x.__hold_) == _VSTD::__unchecked_get<_I2>(__y.__hold_); + } + + template _S2> + requires sentinel_for<_Sent, _I2> && equality_comparable_with<_Iter, _I2> + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==(const common_iterator& __x, const common_iterator<_I2, _S2>& __y) { + _LIBCPP_ASSERT(!__x.__hold_.valueless_by_exception(), "Attempted to compare a valueless common_iterator"); + _LIBCPP_ASSERT(!__y.__hold_.valueless_by_exception(), "Attempted to compare a valueless common_iterator"); + + auto __x_index = __x.__hold_.index(); + auto __y_index = __y.__hold_.index(); + + if (__x_index == 1 && __y_index == 1) + return true; + + if (__x_index == 0 && __y_index == 0) + return _VSTD::__unchecked_get<_Iter>(__x.__hold_) == _VSTD::__unchecked_get<_I2>(__y.__hold_); + + if (__x_index == 0) + return _VSTD::__unchecked_get<_Iter>(__x.__hold_) == _VSTD::__unchecked_get<_S2>(__y.__hold_); + + return _VSTD::__unchecked_get<_Sent>(__x.__hold_) == _VSTD::__unchecked_get<_I2>(__y.__hold_); + } + + template _I2, sized_sentinel_for<_Iter> _S2> + requires sized_sentinel_for<_Sent, _I2> + _LIBCPP_HIDE_FROM_ABI + friend constexpr iter_difference_t<_I2> operator-(const common_iterator& __x, const common_iterator<_I2, _S2>& __y) { + _LIBCPP_ASSERT(!__x.__hold_.valueless_by_exception(), "Attempted to subtract from a valueless common_iterator"); + _LIBCPP_ASSERT(!__y.__hold_.valueless_by_exception(), "Attempted to subtract a valueless common_iterator"); + + auto __x_index = __x.__hold_.index(); + auto __y_index = __y.__hold_.index(); + + if (__x_index == 1 && __y_index == 1) + return 0; + + if (__x_index == 0 && __y_index == 0) + return _VSTD::__unchecked_get<_Iter>(__x.__hold_) - _VSTD::__unchecked_get<_I2>(__y.__hold_); + + if (__x_index == 0) + return _VSTD::__unchecked_get<_Iter>(__x.__hold_) - _VSTD::__unchecked_get<_S2>(__y.__hold_); + + return _VSTD::__unchecked_get<_Sent>(__x.__hold_) - _VSTD::__unchecked_get<_I2>(__y.__hold_); + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr iter_rvalue_reference_t<_Iter> iter_move(const common_iterator& __i) + noexcept(noexcept(ranges::iter_move(std::declval()))) + requires input_iterator<_Iter> + { + _LIBCPP_ASSERT(std::holds_alternative<_Iter>(__i.__hold_), "Attempted to iter_move a non-dereferenceable common_iterator"); + return ranges::iter_move( _VSTD::__unchecked_get<_Iter>(__i.__hold_)); + } + + template _I2, class _S2> + _LIBCPP_HIDE_FROM_ABI friend constexpr void iter_swap(const common_iterator& __x, const common_iterator<_I2, _S2>& __y) + noexcept(noexcept(ranges::iter_swap(std::declval(), std::declval()))) + { + _LIBCPP_ASSERT(std::holds_alternative<_Iter>(__x.__hold_), "Attempted to iter_swap a non-dereferenceable common_iterator"); + _LIBCPP_ASSERT(std::holds_alternative<_I2>(__y.__hold_), "Attempted to iter_swap a non-dereferenceable common_iterator"); + return ranges::iter_swap(_VSTD::__unchecked_get<_Iter>(__x.__hold_), _VSTD::__unchecked_get<_I2>(__y.__hold_)); + } +}; + +template +struct incrementable_traits> { + using difference_type = iter_difference_t<_Iter>; +}; + +template +concept __denotes_forward_iter = + requires { typename iterator_traits<_Iter>::iterator_category; } && + derived_from::iterator_category, forward_iterator_tag>; + +template +concept __common_iter_has_ptr_op = requires(const common_iterator<_Iter, _Sent>& __a) { + __a.operator->(); +}; + +template +struct __arrow_type_or_void { + using type = void; +}; + +template + requires __common_iter_has_ptr_op<_Iter, _Sent> +struct __arrow_type_or_void<_Iter, _Sent> { + using type = decltype(std::declval&>().operator->()); +}; + +template +struct iterator_traits> { + using iterator_concept = _If, + forward_iterator_tag, + input_iterator_tag>; + using iterator_category = _If<__denotes_forward_iter<_Iter>, + forward_iterator_tag, + input_iterator_tag>; + using pointer = typename __arrow_type_or_void<_Iter, _Sent>::type; + using value_type = iter_value_t<_Iter>; + using difference_type = iter_difference_t<_Iter>; + using reference = iter_reference_t<_Iter>; +}; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_COMMON_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/concepts.h b/app/src/main/cpp/libcxx/include/__iterator/concepts.h new file mode 100644 index 0000000..d9d40a4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/concepts.h @@ -0,0 +1,300 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_CONCEPTS_H +#define _LIBCPP___ITERATOR_CONCEPTS_H + +#include <__concepts/arithmetic.h> +#include <__concepts/assignable.h> +#include <__concepts/common_reference_with.h> +#include <__concepts/constructible.h> +#include <__concepts/copyable.h> +#include <__concepts/derived_from.h> +#include <__concepts/equality_comparable.h> +#include <__concepts/invocable.h> +#include <__concepts/movable.h> +#include <__concepts/predicate.h> +#include <__concepts/regular.h> +#include <__concepts/relation.h> +#include <__concepts/same_as.h> +#include <__concepts/semiregular.h> +#include <__concepts/totally_ordered.h> +#include <__config> +#include <__functional/invoke.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iter_move.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/readable_traits.h> +#include <__memory/pointer_traits.h> +#include <__type_traits/add_pointer.h> +#include <__type_traits/common_reference.h> +#include <__type_traits/is_pointer.h> +#include <__type_traits/is_reference.h> +#include <__type_traits/remove_cv.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/forward.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [iterator.concept.readable] +template +concept __indirectly_readable_impl = + requires(const _In __i) { + typename iter_value_t<_In>; + typename iter_reference_t<_In>; + typename iter_rvalue_reference_t<_In>; + { *__i } -> same_as>; + { ranges::iter_move(__i) } -> same_as>; + } && + common_reference_with&&, iter_value_t<_In>&> && + common_reference_with&&, iter_rvalue_reference_t<_In>&&> && + common_reference_with&&, const iter_value_t<_In>&>; + +template +concept indirectly_readable = __indirectly_readable_impl>; + +template +using iter_common_reference_t = common_reference_t, iter_value_t<_Tp>&>; + +// [iterator.concept.writable] +template +concept indirectly_writable = + requires(_Out&& __o, _Tp&& __t) { + *__o = _VSTD::forward<_Tp>(__t); // not required to be equality-preserving + *_VSTD::forward<_Out>(__o) = _VSTD::forward<_Tp>(__t); // not required to be equality-preserving + const_cast&&>(*__o) = _VSTD::forward<_Tp>(__t); // not required to be equality-preserving + const_cast&&>(*_VSTD::forward<_Out>(__o)) = _VSTD::forward<_Tp>(__t); // not required to be equality-preserving + }; + +// [iterator.concept.winc] +template +concept __integer_like = integral<_Tp> && !same_as<_Tp, bool>; + +template +concept __signed_integer_like = signed_integral<_Tp>; + +template +concept weakly_incrementable = + // TODO: remove this once the clang bug is fixed (bugs.llvm.org/PR48173). + !same_as<_Ip, bool> && // Currently, clang does not handle bool correctly. + movable<_Ip> && + requires(_Ip __i) { + typename iter_difference_t<_Ip>; + requires __signed_integer_like>; + { ++__i } -> same_as<_Ip&>; // not required to be equality-preserving + __i++; // not required to be equality-preserving + }; + +// [iterator.concept.inc] +template +concept incrementable = + regular<_Ip> && + weakly_incrementable<_Ip> && + requires(_Ip __i) { + { __i++ } -> same_as<_Ip>; + }; + +// [iterator.concept.iterator] +template +concept input_or_output_iterator = + requires(_Ip __i) { + { *__i } -> __can_reference; + } && + weakly_incrementable<_Ip>; + +// [iterator.concept.sentinel] +template +concept sentinel_for = + semiregular<_Sp> && + input_or_output_iterator<_Ip> && + __weakly_equality_comparable_with<_Sp, _Ip>; + +template +inline constexpr bool disable_sized_sentinel_for = false; + +template +concept sized_sentinel_for = + sentinel_for<_Sp, _Ip> && + !disable_sized_sentinel_for, remove_cv_t<_Ip>> && + requires(const _Ip& __i, const _Sp& __s) { + { __s - __i } -> same_as>; + { __i - __s } -> same_as>; + }; + +// [iterator.concept.input] +template +concept input_iterator = + input_or_output_iterator<_Ip> && + indirectly_readable<_Ip> && + requires { typename _ITER_CONCEPT<_Ip>; } && + derived_from<_ITER_CONCEPT<_Ip>, input_iterator_tag>; + +// [iterator.concept.output] +template +concept output_iterator = + input_or_output_iterator<_Ip> && + indirectly_writable<_Ip, _Tp> && + requires (_Ip __it, _Tp&& __t) { + *__it++ = _VSTD::forward<_Tp>(__t); // not required to be equality-preserving + }; + +// [iterator.concept.forward] +template +concept forward_iterator = + input_iterator<_Ip> && + derived_from<_ITER_CONCEPT<_Ip>, forward_iterator_tag> && + incrementable<_Ip> && + sentinel_for<_Ip, _Ip>; + +// [iterator.concept.bidir] +template +concept bidirectional_iterator = + forward_iterator<_Ip> && + derived_from<_ITER_CONCEPT<_Ip>, bidirectional_iterator_tag> && + requires(_Ip __i) { + { --__i } -> same_as<_Ip&>; + { __i-- } -> same_as<_Ip>; + }; + +template +concept random_access_iterator = + bidirectional_iterator<_Ip> && + derived_from<_ITER_CONCEPT<_Ip>, random_access_iterator_tag> && + totally_ordered<_Ip> && + sized_sentinel_for<_Ip, _Ip> && + requires(_Ip __i, const _Ip __j, const iter_difference_t<_Ip> __n) { + { __i += __n } -> same_as<_Ip&>; + { __j + __n } -> same_as<_Ip>; + { __n + __j } -> same_as<_Ip>; + { __i -= __n } -> same_as<_Ip&>; + { __j - __n } -> same_as<_Ip>; + { __j[__n] } -> same_as>; + }; + +template +concept contiguous_iterator = + random_access_iterator<_Ip> && + derived_from<_ITER_CONCEPT<_Ip>, contiguous_iterator_tag> && + is_lvalue_reference_v> && + same_as, remove_cvref_t>> && + requires(const _Ip& __i) { + { _VSTD::to_address(__i) } -> same_as>>; + }; + +template +concept __has_arrow = input_iterator<_Ip> && (is_pointer_v<_Ip> || requires(_Ip __i) { __i.operator->(); }); + +// [indirectcallable.indirectinvocable] +template +concept indirectly_unary_invocable = + indirectly_readable<_It> && + copy_constructible<_Fp> && + invocable<_Fp&, iter_value_t<_It>&> && + invocable<_Fp&, iter_reference_t<_It>> && + invocable<_Fp&, iter_common_reference_t<_It>> && + common_reference_with< + invoke_result_t<_Fp&, iter_value_t<_It>&>, + invoke_result_t<_Fp&, iter_reference_t<_It>>>; + +template +concept indirectly_regular_unary_invocable = + indirectly_readable<_It> && + copy_constructible<_Fp> && + regular_invocable<_Fp&, iter_value_t<_It>&> && + regular_invocable<_Fp&, iter_reference_t<_It>> && + regular_invocable<_Fp&, iter_common_reference_t<_It>> && + common_reference_with< + invoke_result_t<_Fp&, iter_value_t<_It>&>, + invoke_result_t<_Fp&, iter_reference_t<_It>>>; + +template +concept indirect_unary_predicate = + indirectly_readable<_It> && + copy_constructible<_Fp> && + predicate<_Fp&, iter_value_t<_It>&> && + predicate<_Fp&, iter_reference_t<_It>> && + predicate<_Fp&, iter_common_reference_t<_It>>; + +template +concept indirect_binary_predicate = + indirectly_readable<_It1> && indirectly_readable<_It2> && + copy_constructible<_Fp> && + predicate<_Fp&, iter_value_t<_It1>&, iter_value_t<_It2>&> && + predicate<_Fp&, iter_value_t<_It1>&, iter_reference_t<_It2>> && + predicate<_Fp&, iter_reference_t<_It1>, iter_value_t<_It2>&> && + predicate<_Fp&, iter_reference_t<_It1>, iter_reference_t<_It2>> && + predicate<_Fp&, iter_common_reference_t<_It1>, iter_common_reference_t<_It2>>; + +template +concept indirect_equivalence_relation = + indirectly_readable<_It1> && indirectly_readable<_It2> && + copy_constructible<_Fp> && + equivalence_relation<_Fp&, iter_value_t<_It1>&, iter_value_t<_It2>&> && + equivalence_relation<_Fp&, iter_value_t<_It1>&, iter_reference_t<_It2>> && + equivalence_relation<_Fp&, iter_reference_t<_It1>, iter_value_t<_It2>&> && + equivalence_relation<_Fp&, iter_reference_t<_It1>, iter_reference_t<_It2>> && + equivalence_relation<_Fp&, iter_common_reference_t<_It1>, iter_common_reference_t<_It2>>; + +template +concept indirect_strict_weak_order = + indirectly_readable<_It1> && indirectly_readable<_It2> && + copy_constructible<_Fp> && + strict_weak_order<_Fp&, iter_value_t<_It1>&, iter_value_t<_It2>&> && + strict_weak_order<_Fp&, iter_value_t<_It1>&, iter_reference_t<_It2>> && + strict_weak_order<_Fp&, iter_reference_t<_It1>, iter_value_t<_It2>&> && + strict_weak_order<_Fp&, iter_reference_t<_It1>, iter_reference_t<_It2>> && + strict_weak_order<_Fp&, iter_common_reference_t<_It1>, iter_common_reference_t<_It2>>; + +template + requires (indirectly_readable<_Its> && ...) && invocable<_Fp, iter_reference_t<_Its>...> +using indirect_result_t = invoke_result_t<_Fp, iter_reference_t<_Its>...>; + +template +concept indirectly_movable = + indirectly_readable<_In> && + indirectly_writable<_Out, iter_rvalue_reference_t<_In>>; + +template +concept indirectly_movable_storable = + indirectly_movable<_In, _Out> && + indirectly_writable<_Out, iter_value_t<_In>> && + movable> && + constructible_from, iter_rvalue_reference_t<_In>> && + assignable_from&, iter_rvalue_reference_t<_In>>; + +template +concept indirectly_copyable = + indirectly_readable<_In> && + indirectly_writable<_Out, iter_reference_t<_In>>; + +template +concept indirectly_copyable_storable = + indirectly_copyable<_In, _Out> && + indirectly_writable<_Out, iter_value_t<_In>&> && + indirectly_writable<_Out, const iter_value_t<_In>&> && + indirectly_writable<_Out, iter_value_t<_In>&&> && + indirectly_writable<_Out, const iter_value_t<_In>&&> && + copyable> && + constructible_from, iter_reference_t<_In>> && + assignable_from&, iter_reference_t<_In>>; + +// Note: indirectly_swappable is located in iter_swap.h to prevent a dependency cycle +// (both iter_swap and indirectly_swappable require indirectly_readable). + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_CONCEPTS_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/counted_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/counted_iterator.h new file mode 100644 index 0000000..5fdbff4 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/counted_iterator.h @@ -0,0 +1,310 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_COUNTED_ITERATOR_H +#define _LIBCPP___ITERATOR_COUNTED_ITERATOR_H + +#include <__assert> +#include <__concepts/assignable.h> +#include <__concepts/common_with.h> +#include <__concepts/constructible.h> +#include <__concepts/convertible_to.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/default_sentinel.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iter_move.h> +#include <__iterator/iter_swap.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/readable_traits.h> +#include <__memory/pointer_traits.h> +#include <__type_traits/add_pointer.h> +#include <__type_traits/conditional.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +struct __counted_iterator_concept {}; + +template + requires requires { typename _Iter::iterator_concept; } +struct __counted_iterator_concept<_Iter> { + using iterator_concept = typename _Iter::iterator_concept; +}; + +template +struct __counted_iterator_category {}; + +template + requires requires { typename _Iter::iterator_category; } +struct __counted_iterator_category<_Iter> { + using iterator_category = typename _Iter::iterator_category; +}; + +template +struct __counted_iterator_value_type {}; + +template +struct __counted_iterator_value_type<_Iter> { + using value_type = iter_value_t<_Iter>; +}; + +template +class counted_iterator + : public __counted_iterator_concept<_Iter> + , public __counted_iterator_category<_Iter> + , public __counted_iterator_value_type<_Iter> +{ +public: + _LIBCPP_NO_UNIQUE_ADDRESS _Iter __current_ = _Iter(); + iter_difference_t<_Iter> __count_ = 0; + + using iterator_type = _Iter; + using difference_type = iter_difference_t<_Iter>; + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator() requires default_initializable<_Iter> = default; + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator(_Iter __iter, iter_difference_t<_Iter> __n) + : __current_(_VSTD::move(__iter)), __count_(__n) { + _LIBCPP_ASSERT(__n >= 0, "__n must not be negative."); + } + + template + requires convertible_to + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator(const counted_iterator<_I2>& __other) + : __current_(__other.__current_), __count_(__other.__count_) {} + + template + requires assignable_from<_Iter&, const _I2&> + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator& operator=(const counted_iterator<_I2>& __other) { + __current_ = __other.__current_; + __count_ = __other.__count_; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr const _Iter& base() const& noexcept { return __current_; } + + _LIBCPP_HIDE_FROM_ABI + constexpr _Iter base() && { return _VSTD::move(__current_); } + + _LIBCPP_HIDE_FROM_ABI + constexpr iter_difference_t<_Iter> count() const noexcept { return __count_; } + + _LIBCPP_HIDE_FROM_ABI + constexpr decltype(auto) operator*() { + _LIBCPP_ASSERT(__count_ > 0, "Iterator is equal to or past end."); + return *__current_; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr decltype(auto) operator*() const + requires __dereferenceable + { + _LIBCPP_ASSERT(__count_ > 0, "Iterator is equal to or past end."); + return *__current_; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr auto operator->() const noexcept + requires contiguous_iterator<_Iter> + { + return _VSTD::to_address(__current_); + } + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator& operator++() { + _LIBCPP_ASSERT(__count_ > 0, "Iterator already at or past end."); + ++__current_; + --__count_; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + decltype(auto) operator++(int) { + _LIBCPP_ASSERT(__count_ > 0, "Iterator already at or past end."); + --__count_; +#ifndef _LIBCPP_NO_EXCEPTIONS + try { return __current_++; } + catch(...) { ++__count_; throw; } +#else + return __current_++; +#endif // _LIBCPP_NO_EXCEPTIONS + } + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator operator++(int) + requires forward_iterator<_Iter> + { + _LIBCPP_ASSERT(__count_ > 0, "Iterator already at or past end."); + counted_iterator __tmp = *this; + ++*this; + return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator& operator--() + requires bidirectional_iterator<_Iter> + { + --__current_; + ++__count_; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator operator--(int) + requires bidirectional_iterator<_Iter> + { + counted_iterator __tmp = *this; + --*this; + return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator operator+(iter_difference_t<_Iter> __n) const + requires random_access_iterator<_Iter> + { + return counted_iterator(__current_ + __n, __count_ - __n); + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr counted_iterator operator+( + iter_difference_t<_Iter> __n, const counted_iterator& __x) + requires random_access_iterator<_Iter> + { + return __x + __n; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator& operator+=(iter_difference_t<_Iter> __n) + requires random_access_iterator<_Iter> + { + _LIBCPP_ASSERT(__n <= __count_, "Cannot advance iterator past end."); + __current_ += __n; + __count_ -= __n; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator operator-(iter_difference_t<_Iter> __n) const + requires random_access_iterator<_Iter> + { + return counted_iterator(__current_ - __n, __count_ + __n); + } + + template _I2> + _LIBCPP_HIDE_FROM_ABI + friend constexpr iter_difference_t<_I2> operator-( + const counted_iterator& __lhs, const counted_iterator<_I2>& __rhs) + { + return __rhs.__count_ - __lhs.__count_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr iter_difference_t<_Iter> operator-( + const counted_iterator& __lhs, default_sentinel_t) + { + return -__lhs.__count_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr iter_difference_t<_Iter> operator-( + default_sentinel_t, const counted_iterator& __rhs) + { + return __rhs.__count_; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr counted_iterator& operator-=(iter_difference_t<_Iter> __n) + requires random_access_iterator<_Iter> + { + _LIBCPP_ASSERT(-__n <= __count_, "Attempt to subtract too large of a size: " + "counted_iterator would be decremented before the " + "first element of its range."); + __current_ -= __n; + __count_ += __n; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI + constexpr decltype(auto) operator[](iter_difference_t<_Iter> __n) const + requires random_access_iterator<_Iter> + { + _LIBCPP_ASSERT(__n < __count_, "Subscript argument must be less than size."); + return __current_[__n]; + } + + template _I2> + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==( + const counted_iterator& __lhs, const counted_iterator<_I2>& __rhs) + { + return __lhs.__count_ == __rhs.__count_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr bool operator==( + const counted_iterator& __lhs, default_sentinel_t) + { + return __lhs.__count_ == 0; + } + + template _I2> + _LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering operator<=>( + const counted_iterator& __lhs, const counted_iterator<_I2>& __rhs) + { + return __rhs.__count_ <=> __lhs.__count_; + } + + _LIBCPP_HIDE_FROM_ABI + friend constexpr iter_rvalue_reference_t<_Iter> iter_move(const counted_iterator& __i) + noexcept(noexcept(ranges::iter_move(__i.__current_))) + requires input_iterator<_Iter> + { + _LIBCPP_ASSERT(__i.__count_ > 0, "Iterator must not be past end of range."); + return ranges::iter_move(__i.__current_); + } + + template _I2> + _LIBCPP_HIDE_FROM_ABI + friend constexpr void iter_swap(const counted_iterator& __x, const counted_iterator<_I2>& __y) + noexcept(noexcept(ranges::iter_swap(__x.__current_, __y.__current_))) + { + _LIBCPP_ASSERT(__x.__count_ > 0 && __y.__count_ > 0, + "Iterators must not be past end of range."); + return ranges::iter_swap(__x.__current_, __y.__current_); + } +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(counted_iterator); + +template + requires same_as<_ITER_TRAITS<_Iter>, iterator_traits<_Iter>> +struct iterator_traits> : iterator_traits<_Iter> { + using pointer = conditional_t, + add_pointer_t>, void>; +}; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_COUNTED_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/data.h b/app/src/main/cpp/libcxx/include/__iterator/data.h new file mode 100644 index 0000000..88eb752 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/data.h @@ -0,0 +1,51 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_DATA_H +#define _LIBCPP___ITERATOR_DATA_H + +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template constexpr +_LIBCPP_INLINE_VISIBILITY +auto data(_Cont& __c) +_NOEXCEPT_(noexcept(__c.data())) +-> decltype (__c.data()) +{ return __c.data(); } + +template constexpr +_LIBCPP_INLINE_VISIBILITY +auto data(const _Cont& __c) +_NOEXCEPT_(noexcept(__c.data())) +-> decltype (__c.data()) +{ return __c.data(); } + +template +_LIBCPP_INLINE_VISIBILITY +constexpr _Tp* data(_Tp (&__array)[_Sz]) noexcept { return __array; } + +template +_LIBCPP_INLINE_VISIBILITY +constexpr const _Ep* data(initializer_list<_Ep> __il) noexcept { return __il.begin(); } + +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_DATA_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/default_sentinel.h b/app/src/main/cpp/libcxx/include/__iterator/default_sentinel.h new file mode 100644 index 0000000..669032a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/default_sentinel.h @@ -0,0 +1,30 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_DEFAULT_SENTINEL_H +#define _LIBCPP___ITERATOR_DEFAULT_SENTINEL_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +struct default_sentinel_t { }; +inline constexpr default_sentinel_t default_sentinel{}; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_DEFAULT_SENTINEL_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/distance.h b/app/src/main/cpp/libcxx/include/__iterator/distance.h new file mode 100644 index 0000000..681e20d --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/distance.h @@ -0,0 +1,108 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_DISTANCE_H +#define _LIBCPP___ITERATOR_DISTANCE_H + +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/size.h> +#include <__type_traits/decay.h> +#include <__type_traits/remove_cvref.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +typename iterator_traits<_InputIter>::difference_type +__distance(_InputIter __first, _InputIter __last, input_iterator_tag) +{ + typename iterator_traits<_InputIter>::difference_type __r(0); + for (; __first != __last; ++__first) + ++__r; + return __r; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +typename iterator_traits<_RandIter>::difference_type +__distance(_RandIter __first, _RandIter __last, random_access_iterator_tag) +{ + return __last - __first; +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +typename iterator_traits<_InputIter>::difference_type +distance(_InputIter __first, _InputIter __last) +{ + return _VSTD::__distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category()); +} + +#if _LIBCPP_STD_VER > 17 + +// [range.iter.op.distance] + +namespace ranges { +namespace __distance { + +struct __fn { + template _Sp> + requires (!sized_sentinel_for<_Sp, _Ip>) + _LIBCPP_HIDE_FROM_ABI + constexpr iter_difference_t<_Ip> operator()(_Ip __first, _Sp __last) const { + iter_difference_t<_Ip> __n = 0; + while (__first != __last) { + ++__first; + ++__n; + } + return __n; + } + + template> _Sp> + _LIBCPP_HIDE_FROM_ABI + constexpr iter_difference_t<_Ip> operator()(_Ip&& __first, _Sp __last) const { + if constexpr (sized_sentinel_for<_Sp, __remove_cvref_t<_Ip>>) { + return __last - __first; + } else { + return __last - decay_t<_Ip>(__first); + } + } + + template + _LIBCPP_HIDE_FROM_ABI + constexpr range_difference_t<_Rp> operator()(_Rp&& __r) const { + if constexpr (sized_range<_Rp>) { + return static_cast>(ranges::size(__r)); + } else { + return operator()(ranges::begin(__r), ranges::end(__r)); + } + } +}; + +} // namespace __distance + +inline namespace __cpo { + inline constexpr auto distance = __distance::__fn{}; +} // namespace __cpo +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_DISTANCE_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/empty.h b/app/src/main/cpp/libcxx/include/__iterator/empty.h new file mode 100644 index 0000000..748ca9e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/empty.h @@ -0,0 +1,44 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_EMPTY_H +#define _LIBCPP___ITERATOR_EMPTY_H + +#include <__config> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template +_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY +constexpr auto empty(const _Cont& __c) +_NOEXCEPT_(noexcept(__c.empty())) +-> decltype (__c.empty()) +{ return __c.empty(); } + +template +_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY +constexpr bool empty(const _Tp (&)[_Sz]) noexcept { return false; } + +template +_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY +constexpr bool empty(initializer_list<_Ep> __il) noexcept { return __il.size() == 0; } + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_EMPTY_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/erase_if_container.h b/app/src/main/cpp/libcxx/include/__iterator/erase_if_container.h new file mode 100644 index 0000000..d7c71a9 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/erase_if_container.h @@ -0,0 +1,40 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ERASE_IF_CONTAINER_H +#define _LIBCPP___ITERATOR_ERASE_IF_CONTAINER_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +_LIBCPP_HIDE_FROM_ABI +typename _Container::size_type +__libcpp_erase_if_container(_Container& __c, _Predicate& __pred) { + typename _Container::size_type __old_size = __c.size(); + + const typename _Container::iterator __last = __c.end(); + for (typename _Container::iterator __iter = __c.begin(); __iter != __last;) { + if (__pred(*__iter)) + __iter = __c.erase(__iter); + else + ++__iter; + } + + return __old_size - __c.size(); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ERASE_IF_CONTAINER_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/front_insert_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/front_insert_iterator.h new file mode 100644 index 0000000..e278359 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/front_insert_iterator.h @@ -0,0 +1,71 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_FRONT_INSERT_ITERATOR_H +#define _LIBCPP___ITERATOR_FRONT_INSERT_ITERATOR_H + +#include <__config> +#include <__iterator/iterator.h> +#include <__iterator/iterator_traits.h> +#include <__memory/addressof.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template +class _LIBCPP_TEMPLATE_VIS front_insert_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif +{ +_LIBCPP_SUPPRESS_DEPRECATED_POP +protected: + _Container* container; +public: + typedef output_iterator_tag iterator_category; + typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else + typedef void difference_type; +#endif + typedef void pointer; + typedef void reference; + typedef _Container container_type; + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit front_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator=(const typename _Container::value_type& __value) + {container->push_front(__value); return *this;} +#ifndef _LIBCPP_CXX03_LANG + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator=(typename _Container::value_type&& __value) + {container->push_front(_VSTD::move(__value)); return *this;} +#endif // _LIBCPP_CXX03_LANG + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 front_insert_iterator operator++(int) {return *this;} +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(front_insert_iterator); + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +front_insert_iterator<_Container> +front_inserter(_Container& __x) +{ + return front_insert_iterator<_Container>(__x); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_FRONT_INSERT_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/incrementable_traits.h b/app/src/main/cpp/libcxx/include/__iterator/incrementable_traits.h new file mode 100644 index 0000000..3d06dc0 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/incrementable_traits.h @@ -0,0 +1,78 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_INCREMENTABLE_TRAITS_H +#define _LIBCPP___ITERATOR_INCREMENTABLE_TRAITS_H + +#include <__concepts/arithmetic.h> +#include <__config> +#include <__type_traits/conditional.h> +#include <__type_traits/is_object.h> +#include <__type_traits/is_primary_template.h> +#include <__type_traits/make_signed.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/declval.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [incrementable.traits] +template struct incrementable_traits {}; + +template +requires is_object_v<_Tp> +struct incrementable_traits<_Tp*> { + using difference_type = ptrdiff_t; +}; + +template +struct incrementable_traits : incrementable_traits<_Ip> {}; + +template +concept __has_member_difference_type = requires { typename _Tp::difference_type; }; + +template<__has_member_difference_type _Tp> +struct incrementable_traits<_Tp> { + using difference_type = typename _Tp::difference_type; +}; + +template +concept __has_integral_minus = + requires(const _Tp& __x, const _Tp& __y) { + { __x - __y } -> integral; + }; + +template<__has_integral_minus _Tp> +requires (!__has_member_difference_type<_Tp>) +struct incrementable_traits<_Tp> { + using difference_type = make_signed_t() - std::declval<_Tp>())>; +}; + +template +struct iterator_traits; + +// Let `RI` be `remove_cvref_t`. The type `iter_difference_t` denotes +// `incrementable_traits::difference_type` if `iterator_traits` names a specialization +// generated from the primary template, and `iterator_traits::difference_type` otherwise. +template +using iter_difference_t = typename conditional_t<__is_primary_template > >::value, + incrementable_traits >, + iterator_traits > >::difference_type; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_INCREMENTABLE_TRAITS_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/indirectly_comparable.h b/app/src/main/cpp/libcxx/include/__iterator/indirectly_comparable.h new file mode 100644 index 0000000..868190f --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/indirectly_comparable.h @@ -0,0 +1,34 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_INDIRECTLY_COMPARABLE_H +#define _LIBCPP___ITERATOR_INDIRECTLY_COMPARABLE_H + +#include <__config> +#include <__functional/identity.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +concept indirectly_comparable = + indirect_binary_predicate<_Rp, projected<_I1, _P1>, projected<_I2, _P2>>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_INDIRECTLY_COMPARABLE_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/insert_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/insert_iterator.h new file mode 100644 index 0000000..ecaea61 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/insert_iterator.h @@ -0,0 +1,81 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_INSERT_ITERATOR_H +#define _LIBCPP___ITERATOR_INSERT_ITERATOR_H + +#include <__config> +#include <__iterator/iterator.h> +#include <__iterator/iterator_traits.h> +#include <__memory/addressof.h> +#include <__ranges/access.h> +#include <__utility/move.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 +template +using __insert_iterator_iter_t = ranges::iterator_t<_Container>; +#else +template +using __insert_iterator_iter_t = typename _Container::iterator; +#endif + +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template +class _LIBCPP_TEMPLATE_VIS insert_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif +{ +_LIBCPP_SUPPRESS_DEPRECATED_POP +protected: + _Container* container; + __insert_iterator_iter_t<_Container> iter; +public: + typedef output_iterator_tag iterator_category; + typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else + typedef void difference_type; +#endif + typedef void pointer; + typedef void reference; + typedef _Container container_type; + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator(_Container& __x, __insert_iterator_iter_t<_Container> __i) + : container(_VSTD::addressof(__x)), iter(__i) {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator=(const typename _Container::value_type& __value) + {iter = container->insert(iter, __value); ++iter; return *this;} +#ifndef _LIBCPP_CXX03_LANG + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator=(typename _Container::value_type&& __value) + {iter = container->insert(iter, _VSTD::move(__value)); ++iter; return *this;} +#endif // _LIBCPP_CXX03_LANG + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 insert_iterator& operator++(int) {return *this;} +}; + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX20 +insert_iterator<_Container> +inserter(_Container& __x, __insert_iterator_iter_t<_Container> __i) +{ + return insert_iterator<_Container>(__x, __i); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_INSERT_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/istream_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/istream_iterator.h new file mode 100644 index 0000000..a056961 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/istream_iterator.h @@ -0,0 +1,105 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H +#define _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H + +#include <__config> +#include <__iterator/default_sentinel.h> +#include <__iterator/iterator.h> +#include <__iterator/iterator_traits.h> +#include <__memory/addressof.h> +#include +#include // for forward declarations of char_traits and basic_istream + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template , class _Distance = ptrdiff_t> +class _LIBCPP_TEMPLATE_VIS istream_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif +{ +_LIBCPP_SUPPRESS_DEPRECATED_POP +public: + typedef input_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef const _Tp* pointer; + typedef const _Tp& reference; + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_istream<_CharT,_Traits> istream_type; +private: + istream_type* __in_stream_; + _Tp __value_; +public: + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istream_iterator() : __in_stream_(nullptr), __value_() {} +#if _LIBCPP_STD_VER > 17 + _LIBCPP_HIDE_FROM_ABI constexpr istream_iterator(default_sentinel_t) : istream_iterator() {} +#endif // _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(_VSTD::addressof(__s)) + { + if (!(*__in_stream_ >> __value_)) + __in_stream_ = nullptr; + } + + _LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;} + _LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const {return _VSTD::addressof((operator*()));} + _LIBCPP_INLINE_VISIBILITY istream_iterator& operator++() + { + if (!(*__in_stream_ >> __value_)) + __in_stream_ = nullptr; + return *this; + } + _LIBCPP_INLINE_VISIBILITY istream_iterator operator++(int) + {istream_iterator __t(*this); ++(*this); return __t;} + + template + friend _LIBCPP_INLINE_VISIBILITY + bool + operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x, + const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y); + +#if _LIBCPP_STD_VER > 17 + friend _LIBCPP_HIDE_FROM_ABI bool operator==(const istream_iterator& __i, default_sentinel_t) { + return __i.__in_stream_ == nullptr; + } +#endif // _LIBCPP_STD_VER > 17 +}; + +template +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x, + const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y) +{ + return __x.__in_stream_ == __y.__in_stream_; +} + +#if _LIBCPP_STD_VER <= 17 +template +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x, + const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y) +{ + return !(__x == __y); +} +#endif // _LIBCPP_STD_VER <= 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ISTREAM_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/istreambuf_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/istreambuf_iterator.h new file mode 100644 index 0000000..bc53a6a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/istreambuf_iterator.h @@ -0,0 +1,119 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ISTREAMBUF_ITERATOR_H +#define _LIBCPP___ITERATOR_ISTREAMBUF_ITERATOR_H + +#include <__config> +#include <__iterator/default_sentinel.h> +#include <__iterator/iterator.h> +#include <__iterator/iterator_traits.h> +#include // for forward declaration of basic_streambuf + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template +class _LIBCPP_TEMPLATE_VIS istreambuf_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif +{ +_LIBCPP_SUPPRESS_DEPRECATED_POP +public: + typedef input_iterator_tag iterator_category; + typedef _CharT value_type; + typedef typename _Traits::off_type difference_type; + typedef _CharT* pointer; + typedef _CharT reference; + typedef _CharT char_type; + typedef _Traits traits_type; + typedef typename _Traits::int_type int_type; + typedef basic_streambuf<_CharT,_Traits> streambuf_type; + typedef basic_istream<_CharT,_Traits> istream_type; +private: + mutable streambuf_type* __sbuf_; + + class __proxy + { + char_type __keep_; + streambuf_type* __sbuf_; + _LIBCPP_INLINE_VISIBILITY + explicit __proxy(char_type __c, streambuf_type* __s) + : __keep_(__c), __sbuf_(__s) {} + friend class istreambuf_iterator; + public: + _LIBCPP_INLINE_VISIBILITY char_type operator*() const {return __keep_;} + }; + + _LIBCPP_INLINE_VISIBILITY + bool __test_for_eof() const + { + if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof())) + __sbuf_ = nullptr; + return __sbuf_ == nullptr; + } +public: + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istreambuf_iterator() _NOEXCEPT : __sbuf_(nullptr) {} +#if _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY constexpr istreambuf_iterator(default_sentinel_t) noexcept + : istreambuf_iterator() {} +#endif // _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) _NOEXCEPT + : __sbuf_(__s.rdbuf()) {} + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) _NOEXCEPT + : __sbuf_(__s) {} + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(const __proxy& __p) _NOEXCEPT + : __sbuf_(__p.__sbuf_) {} + + _LIBCPP_INLINE_VISIBILITY char_type operator*() const + {return static_cast(__sbuf_->sgetc());} + _LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++() + { + __sbuf_->sbumpc(); + return *this; + } + _LIBCPP_INLINE_VISIBILITY __proxy operator++(int) + { + return __proxy(__sbuf_->sbumpc(), __sbuf_); + } + + _LIBCPP_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const + {return __test_for_eof() == __b.__test_for_eof();} + +#if _LIBCPP_STD_VER > 17 + friend _LIBCPP_HIDE_FROM_ABI bool operator==(const istreambuf_iterator& __i, default_sentinel_t) { + return __i.__test_for_eof(); + } +#endif // _LIBCPP_STD_VER > 17 +}; + +template +inline _LIBCPP_INLINE_VISIBILITY +bool operator==(const istreambuf_iterator<_CharT,_Traits>& __a, + const istreambuf_iterator<_CharT,_Traits>& __b) + {return __a.equal(__b);} + +#if _LIBCPP_STD_VER <= 17 +template +inline _LIBCPP_INLINE_VISIBILITY +bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a, + const istreambuf_iterator<_CharT,_Traits>& __b) + {return !__a.equal(__b);} +#endif // _LIBCPP_STD_VER <= 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ISTREAMBUF_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/iter_move.h b/app/src/main/cpp/libcxx/include/__iterator/iter_move.h new file mode 100644 index 0000000..a7d9413 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/iter_move.h @@ -0,0 +1,104 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ITER_MOVE_H +#define _LIBCPP___ITERATOR_ITER_MOVE_H + +#include <__concepts/class_or_enum.h> +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__type_traits/is_reference.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/declval.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [iterator.cust.move] + +namespace ranges { +namespace __iter_move { + +void iter_move(); + +template +concept __unqualified_iter_move = + __class_or_enum> && + requires (_Tp&& __t) { + // NOLINTNEXTLINE(libcpp-robust-against-adl) iter_swap ADL calls should only be made through ranges::iter_swap + iter_move(std::forward<_Tp>(__t)); + }; + +template +concept __move_deref = + !__unqualified_iter_move<_Tp> && + requires (_Tp&& __t) { + *__t; + requires is_lvalue_reference_v; + }; + +template +concept __just_deref = + !__unqualified_iter_move<_Tp> && + !__move_deref<_Tp> && + requires (_Tp&& __t) { + *__t; + requires (!is_lvalue_reference_v); + }; + +// [iterator.cust.move] + +struct __fn { + // NOLINTBEGIN(libcpp-robust-against-adl) iter_move ADL calls should only be made through ranges::iter_move + template + requires __unqualified_iter_move<_Ip> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr decltype(auto) operator()(_Ip&& __i) const + noexcept(noexcept(iter_move(std::forward<_Ip>(__i)))) + { + return iter_move(std::forward<_Ip>(__i)); + } + // NOLINTEND(libcpp-robust-against-adl) + + template + requires __move_deref<_Ip> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Ip&& __i) const + noexcept(noexcept(std::move(*std::forward<_Ip>(__i)))) + -> decltype( std::move(*std::forward<_Ip>(__i))) + { return std::move(*std::forward<_Ip>(__i)); } + + template + requires __just_deref<_Ip> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Ip&& __i) const + noexcept(noexcept(*std::forward<_Ip>(__i))) + -> decltype( *std::forward<_Ip>(__i)) + { return *std::forward<_Ip>(__i); } +}; +} // namespace __iter_move + +inline namespace __cpo { + inline constexpr auto iter_move = __iter_move::__fn{}; +} // namespace __cpo +} // namespace ranges + +template<__dereferenceable _Tp> + requires requires(_Tp& __t) { { ranges::iter_move(__t) } -> __can_reference; } +using iter_rvalue_reference_t = decltype(ranges::iter_move(std::declval<_Tp&>())); + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ITER_MOVE_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/iter_swap.h b/app/src/main/cpp/libcxx/include/__iterator/iter_swap.h new file mode 100644 index 0000000..d4c0dca --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/iter_swap.h @@ -0,0 +1,113 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ITER_SWAP_H +#define _LIBCPP___ITERATOR_ITER_SWAP_H + +#include <__concepts/class_or_enum.h> +#include <__concepts/swappable.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/iter_move.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/readable_traits.h> +#include <__type_traits/remove_cvref.h> +#include <__utility/declval.h> +#include <__utility/forward.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [iter.cust.swap] + +namespace ranges { +namespace __iter_swap { + template + void iter_swap(_I1, _I2) = delete; + + template + concept __unqualified_iter_swap = + (__class_or_enum> || __class_or_enum>) && + requires (_T1&& __x, _T2&& __y) { + // NOLINTNEXTLINE(libcpp-robust-against-adl) iter_swap ADL calls should only be made through ranges::iter_swap + iter_swap(_VSTD::forward<_T1>(__x), _VSTD::forward<_T2>(__y)); + }; + + template + concept __readable_swappable = + indirectly_readable<_T1> && indirectly_readable<_T2> && + swappable_with, iter_reference_t<_T2>>; + + + struct __fn { + // NOLINTBEGIN(libcpp-robust-against-adl) iter_swap ADL calls should only be made through ranges::iter_swap + template + requires __unqualified_iter_swap<_T1, _T2> + _LIBCPP_HIDE_FROM_ABI + constexpr void operator()(_T1&& __x, _T2&& __y) const + noexcept(noexcept(iter_swap(_VSTD::forward<_T1>(__x), _VSTD::forward<_T2>(__y)))) + { + (void)iter_swap(_VSTD::forward<_T1>(__x), _VSTD::forward<_T2>(__y)); + } + // NOLINTEND(libcpp-robust-against-adl) + + template + requires (!__unqualified_iter_swap<_T1, _T2>) && + __readable_swappable<_T1, _T2> + _LIBCPP_HIDE_FROM_ABI + constexpr void operator()(_T1&& __x, _T2&& __y) const + noexcept(noexcept(ranges::swap(*_VSTD::forward<_T1>(__x), *_VSTD::forward<_T2>(__y)))) + { + ranges::swap(*_VSTD::forward<_T1>(__x), *_VSTD::forward<_T2>(__y)); + } + + template + requires (!__unqualified_iter_swap<_T1, _T2> && + !__readable_swappable<_T1, _T2>) && + indirectly_movable_storable<_T1, _T2> && + indirectly_movable_storable<_T2, _T1> + _LIBCPP_HIDE_FROM_ABI + constexpr void operator()(_T1&& __x, _T2&& __y) const + noexcept(noexcept(iter_value_t<_T2>(ranges::iter_move(__y))) && + noexcept(*__y = ranges::iter_move(__x)) && + noexcept(*_VSTD::forward<_T1>(__x) = std::declval>())) + { + iter_value_t<_T2> __old(ranges::iter_move(__y)); + *__y = ranges::iter_move(__x); + *_VSTD::forward<_T1>(__x) = _VSTD::move(__old); + } + }; +} // namespace __iter_swap + +inline namespace __cpo { + inline constexpr auto iter_swap = __iter_swap::__fn{}; +} // namespace __cpo +} // namespace ranges + +template +concept indirectly_swappable = + indirectly_readable<_I1> && indirectly_readable<_I2> && + requires(const _I1 __i1, const _I2 __i2) { + ranges::iter_swap(__i1, __i1); + ranges::iter_swap(__i2, __i2); + ranges::iter_swap(__i1, __i2); + ranges::iter_swap(__i2, __i1); + }; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ITER_SWAP_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/iterator.h b/app/src/main/cpp/libcxx/include/__iterator/iterator.h new file mode 100644 index 0000000..b417eea --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/iterator.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ITERATOR_H +#define _LIBCPP___ITERATOR_ITERATOR_H + +#include <__config> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 iterator +{ + typedef _Tp value_type; + typedef _Distance difference_type; + typedef _Pointer pointer; + typedef _Reference reference; + typedef _Category iterator_category; +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/iterator_traits.h b/app/src/main/cpp/libcxx/include/__iterator/iterator_traits.h new file mode 100644 index 0000000..c9d8944 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/iterator_traits.h @@ -0,0 +1,539 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ITERATOR_TRAITS_H +#define _LIBCPP___ITERATOR_ITERATOR_TRAITS_H + +#include <__concepts/arithmetic.h> +#include <__concepts/constructible.h> +#include <__concepts/convertible_to.h> +#include <__concepts/copyable.h> +#include <__concepts/equality_comparable.h> +#include <__concepts/same_as.h> +#include <__concepts/totally_ordered.h> +#include <__config> +#include <__fwd/pair.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/readable_traits.h> +#include <__type_traits/add_const.h> +#include <__type_traits/common_reference.h> +#include <__type_traits/conditional.h> +#include <__type_traits/disjunction.h> +#include <__type_traits/is_convertible.h> +#include <__type_traits/is_object.h> +#include <__type_traits/is_primary_template.h> +#include <__type_traits/is_reference.h> +#include <__type_traits/is_valid_expansion.h> +#include <__type_traits/remove_const.h> +#include <__type_traits/remove_cv.h> +#include <__type_traits/remove_cvref.h> +#include <__type_traits/void_t.h> +#include <__utility/declval.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +using __with_reference = _Tp&; + +template +concept __can_reference = requires { + typename __with_reference<_Tp>; +}; + +template +concept __dereferenceable = requires(_Tp& __t) { + { *__t } -> __can_reference; // not required to be equality-preserving +}; + +// [iterator.traits] +template<__dereferenceable _Tp> +using iter_reference_t = decltype(*std::declval<_Tp&>()); + +#endif // _LIBCPP_STD_VER > 17 + +template +struct _LIBCPP_TEMPLATE_VIS iterator_traits; + +struct _LIBCPP_TEMPLATE_VIS input_iterator_tag {}; +struct _LIBCPP_TEMPLATE_VIS output_iterator_tag {}; +struct _LIBCPP_TEMPLATE_VIS forward_iterator_tag : public input_iterator_tag {}; +struct _LIBCPP_TEMPLATE_VIS bidirectional_iterator_tag : public forward_iterator_tag {}; +struct _LIBCPP_TEMPLATE_VIS random_access_iterator_tag : public bidirectional_iterator_tag {}; +#if _LIBCPP_STD_VER > 17 +struct _LIBCPP_TEMPLATE_VIS contiguous_iterator_tag : public random_access_iterator_tag {}; +#endif + +template +struct __iter_traits_cache { + using type = _If< + __is_primary_template >::value, + _Iter, + iterator_traits<_Iter> + >; +}; +template +using _ITER_TRAITS = typename __iter_traits_cache<_Iter>::type; + +struct __iter_concept_concept_test { + template + using _Apply = typename _ITER_TRAITS<_Iter>::iterator_concept; +}; +struct __iter_concept_category_test { + template + using _Apply = typename _ITER_TRAITS<_Iter>::iterator_category; +}; +struct __iter_concept_random_fallback { + template + using _Apply = __enable_if_t< + __is_primary_template >::value, + random_access_iterator_tag + >; +}; + +template struct __test_iter_concept + : _IsValidExpansion<_Tester::template _Apply, _Iter>, + _Tester +{ +}; + +template +struct __iter_concept_cache { + using type = _Or< + __test_iter_concept<_Iter, __iter_concept_concept_test>, + __test_iter_concept<_Iter, __iter_concept_category_test>, + __test_iter_concept<_Iter, __iter_concept_random_fallback> + >; +}; + +template +using _ITER_CONCEPT = typename __iter_concept_cache<_Iter>::type::template _Apply<_Iter>; + + +template +struct __has_iterator_typedefs +{ +private: + template static false_type __test(...); + template static true_type __test(__void_t* = nullptr, + __void_t* = nullptr, + __void_t* = nullptr, + __void_t* = nullptr, + __void_t* = nullptr); +public: + static const bool value = decltype(__test<_Tp>(0,0,0,0,0))::value; +}; + + +template +struct __has_iterator_category +{ +private: + template static false_type __test(...); + template static true_type __test(typename _Up::iterator_category* = nullptr); +public: + static const bool value = decltype(__test<_Tp>(nullptr))::value; +}; + +template +struct __has_iterator_concept +{ +private: + template static false_type __test(...); + template static true_type __test(typename _Up::iterator_concept* = nullptr); +public: + static const bool value = decltype(__test<_Tp>(nullptr))::value; +}; + +#if _LIBCPP_STD_VER > 17 + +// The `cpp17-*-iterator` exposition-only concepts have very similar names to the `Cpp17*Iterator` named requirements +// from `[iterator.cpp17]`. To avoid confusion between the two, the exposition-only concepts have been banished to +// a "detail" namespace indicating they have a niche use-case. +namespace __iterator_traits_detail { +template +concept __cpp17_iterator = + requires(_Ip __i) { + { *__i } -> __can_reference; + { ++__i } -> same_as<_Ip&>; + { *__i++ } -> __can_reference; + } && + copyable<_Ip>; + +template +concept __cpp17_input_iterator = + __cpp17_iterator<_Ip> && + equality_comparable<_Ip> && + requires(_Ip __i) { + typename incrementable_traits<_Ip>::difference_type; + typename indirectly_readable_traits<_Ip>::value_type; + typename common_reference_t&&, + typename indirectly_readable_traits<_Ip>::value_type&>; + typename common_reference_t::value_type&>; + requires signed_integral::difference_type>; + }; + +template +concept __cpp17_forward_iterator = + __cpp17_input_iterator<_Ip> && + constructible_from<_Ip> && + is_lvalue_reference_v> && + same_as>, + typename indirectly_readable_traits<_Ip>::value_type> && + requires(_Ip __i) { + { __i++ } -> convertible_to<_Ip const&>; + { *__i++ } -> same_as>; + }; + +template +concept __cpp17_bidirectional_iterator = + __cpp17_forward_iterator<_Ip> && + requires(_Ip __i) { + { --__i } -> same_as<_Ip&>; + { __i-- } -> convertible_to<_Ip const&>; + { *__i-- } -> same_as>; + }; + +template +concept __cpp17_random_access_iterator = + __cpp17_bidirectional_iterator<_Ip> && + totally_ordered<_Ip> && + requires(_Ip __i, typename incrementable_traits<_Ip>::difference_type __n) { + { __i += __n } -> same_as<_Ip&>; + { __i -= __n } -> same_as<_Ip&>; + { __i + __n } -> same_as<_Ip>; + { __n + __i } -> same_as<_Ip>; + { __i - __n } -> same_as<_Ip>; + { __i - __i } -> same_as; // NOLINT(misc-redundant-expression) ; This is llvm.org/PR54114 + { __i[__n] } -> convertible_to>; + }; +} // namespace __iterator_traits_detail + +template +concept __has_member_reference = requires { typename _Ip::reference; }; + +template +concept __has_member_pointer = requires { typename _Ip::pointer; }; + +template +concept __has_member_iterator_category = requires { typename _Ip::iterator_category; }; + +template +concept __specifies_members = requires { + typename _Ip::value_type; + typename _Ip::difference_type; + requires __has_member_reference<_Ip>; + requires __has_member_iterator_category<_Ip>; + }; + +template +struct __iterator_traits_member_pointer_or_void { + using type = void; +}; + +template<__has_member_pointer _Tp> +struct __iterator_traits_member_pointer_or_void<_Tp> { + using type = typename _Tp::pointer; +}; + +template +concept __cpp17_iterator_missing_members = + !__specifies_members<_Tp> && + __iterator_traits_detail::__cpp17_iterator<_Tp>; + +template +concept __cpp17_input_iterator_missing_members = + __cpp17_iterator_missing_members<_Tp> && + __iterator_traits_detail::__cpp17_input_iterator<_Tp>; + +// Otherwise, `pointer` names `void`. +template +struct __iterator_traits_member_pointer_or_arrow_or_void { using type = void; }; + +// [iterator.traits]/3.2.1 +// If the qualified-id `I::pointer` is valid and denotes a type, `pointer` names that type. +template<__has_member_pointer _Ip> +struct __iterator_traits_member_pointer_or_arrow_or_void<_Ip> { using type = typename _Ip::pointer; }; + +// Otherwise, if `decltype(declval().operator->())` is well-formed, then `pointer` names that +// type. +template + requires requires(_Ip& __i) { __i.operator->(); } && (!__has_member_pointer<_Ip>) +struct __iterator_traits_member_pointer_or_arrow_or_void<_Ip> { + using type = decltype(std::declval<_Ip&>().operator->()); +}; + +// Otherwise, `reference` names `iter-reference-t`. +template +struct __iterator_traits_member_reference { using type = iter_reference_t<_Ip>; }; + +// [iterator.traits]/3.2.2 +// If the qualified-id `I::reference` is valid and denotes a type, `reference` names that type. +template<__has_member_reference _Ip> +struct __iterator_traits_member_reference<_Ip> { using type = typename _Ip::reference; }; + +// [iterator.traits]/3.2.3.4 +// input_iterator_tag +template +struct __deduce_iterator_category { + using type = input_iterator_tag; +}; + +// [iterator.traits]/3.2.3.1 +// `random_access_iterator_tag` if `I` satisfies `cpp17-random-access-iterator`, or otherwise +template<__iterator_traits_detail::__cpp17_random_access_iterator _Ip> +struct __deduce_iterator_category<_Ip> { + using type = random_access_iterator_tag; +}; + +// [iterator.traits]/3.2.3.2 +// `bidirectional_iterator_tag` if `I` satisfies `cpp17-bidirectional-iterator`, or otherwise +template<__iterator_traits_detail::__cpp17_bidirectional_iterator _Ip> +struct __deduce_iterator_category<_Ip> { + using type = bidirectional_iterator_tag; +}; + +// [iterator.traits]/3.2.3.3 +// `forward_iterator_tag` if `I` satisfies `cpp17-forward-iterator`, or otherwise +template<__iterator_traits_detail::__cpp17_forward_iterator _Ip> +struct __deduce_iterator_category<_Ip> { + using type = forward_iterator_tag; +}; + +template +struct __iterator_traits_iterator_category : __deduce_iterator_category<_Ip> {}; + +// [iterator.traits]/3.2.3 +// If the qualified-id `I::iterator-category` is valid and denotes a type, `iterator-category` names +// that type. +template<__has_member_iterator_category _Ip> +struct __iterator_traits_iterator_category<_Ip> { + using type = typename _Ip::iterator_category; +}; + +// otherwise, it names void. +template +struct __iterator_traits_difference_type { using type = void; }; + +// If the qualified-id `incrementable_traits::difference_type` is valid and denotes a type, then +// `difference_type` names that type; +template +requires requires { typename incrementable_traits<_Ip>::difference_type; } +struct __iterator_traits_difference_type<_Ip> { + using type = typename incrementable_traits<_Ip>::difference_type; +}; + +// [iterator.traits]/3.4 +// Otherwise, `iterator_traits` has no members by any of the above names. +template +struct __iterator_traits {}; + +// [iterator.traits]/3.1 +// If `I` has valid ([temp.deduct]) member types `difference-type`, `value-type`, `reference`, and +// `iterator-category`, then `iterator-traits` has the following publicly accessible members: +template<__specifies_members _Ip> +struct __iterator_traits<_Ip> { + using iterator_category = typename _Ip::iterator_category; + using value_type = typename _Ip::value_type; + using difference_type = typename _Ip::difference_type; + using pointer = typename __iterator_traits_member_pointer_or_void<_Ip>::type; + using reference = typename _Ip::reference; +}; + +// [iterator.traits]/3.2 +// Otherwise, if `I` satisfies the exposition-only concept `cpp17-input-iterator`, +// `iterator-traits` has the following publicly accessible members: +template<__cpp17_input_iterator_missing_members _Ip> +struct __iterator_traits<_Ip> { + using iterator_category = typename __iterator_traits_iterator_category<_Ip>::type; + using value_type = typename indirectly_readable_traits<_Ip>::value_type; + using difference_type = typename incrementable_traits<_Ip>::difference_type; + using pointer = typename __iterator_traits_member_pointer_or_arrow_or_void<_Ip>::type; + using reference = typename __iterator_traits_member_reference<_Ip>::type; +}; + +// Otherwise, if `I` satisfies the exposition-only concept `cpp17-iterator`, then +// `iterator_traits` has the following publicly accessible members: +template<__cpp17_iterator_missing_members _Ip> +struct __iterator_traits<_Ip> { + using iterator_category = output_iterator_tag; + using value_type = void; + using difference_type = typename __iterator_traits_difference_type<_Ip>::type; + using pointer = void; + using reference = void; +}; + +template +struct iterator_traits : __iterator_traits<_Ip> { + using __primary_template = iterator_traits; +}; + +#else // _LIBCPP_STD_VER > 17 + +template struct __iterator_traits {}; + +template struct __iterator_traits_impl {}; + +template +struct __iterator_traits_impl<_Iter, true> +{ + typedef typename _Iter::difference_type difference_type; + typedef typename _Iter::value_type value_type; + typedef typename _Iter::pointer pointer; + typedef typename _Iter::reference reference; + typedef typename _Iter::iterator_category iterator_category; +}; + +template +struct __iterator_traits<_Iter, true> + : __iterator_traits_impl + < + _Iter, + is_convertible::value || + is_convertible::value + > +{}; + +// iterator_traits will only have the nested types if Iterator::iterator_category +// exists. Else iterator_traits will be an empty class. This is a +// conforming extension which allows some programs to compile and behave as +// the client expects instead of failing at compile time. + +template +struct _LIBCPP_TEMPLATE_VIS iterator_traits + : __iterator_traits<_Iter, __has_iterator_typedefs<_Iter>::value> { + + using __primary_template = iterator_traits; +}; +#endif // _LIBCPP_STD_VER > 17 + +template +#if _LIBCPP_STD_VER > 17 +requires is_object_v<_Tp> +#endif +struct _LIBCPP_TEMPLATE_VIS iterator_traits<_Tp*> +{ + typedef ptrdiff_t difference_type; + typedef __remove_cv_t<_Tp> value_type; + typedef _Tp* pointer; + typedef _Tp& reference; + typedef random_access_iterator_tag iterator_category; +#if _LIBCPP_STD_VER > 17 + typedef contiguous_iterator_tag iterator_concept; +#endif +}; + +template >::value> +struct __has_iterator_category_convertible_to + : is_convertible::iterator_category, _Up> +{}; + +template +struct __has_iterator_category_convertible_to<_Tp, _Up, false> : false_type {}; + +template ::value> +struct __has_iterator_concept_convertible_to + : is_convertible +{}; + +template +struct __has_iterator_concept_convertible_to<_Tp, _Up, false> : false_type {}; + +template +struct __is_cpp17_input_iterator : public __has_iterator_category_convertible_to<_Tp, input_iterator_tag> {}; + +template +struct __is_cpp17_forward_iterator : public __has_iterator_category_convertible_to<_Tp, forward_iterator_tag> {}; + +template +struct __is_cpp17_bidirectional_iterator : public __has_iterator_category_convertible_to<_Tp, bidirectional_iterator_tag> {}; + +template +struct __is_cpp17_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {}; + +// __is_cpp17_contiguous_iterator determines if an iterator is known by +// libc++ to be contiguous, either because it advertises itself as such +// (in C++20) or because it is a pointer type or a known trivial wrapper +// around a (possibly fancy) pointer type, such as __wrap_iter. +// Such iterators receive special "contiguous" optimizations in +// std::copy and std::sort. +// +#if _LIBCPP_STD_VER > 17 +template +struct __is_cpp17_contiguous_iterator : _Or< + __has_iterator_category_convertible_to<_Tp, contiguous_iterator_tag>, + __has_iterator_concept_convertible_to<_Tp, contiguous_iterator_tag> +> {}; +#else +template +struct __is_cpp17_contiguous_iterator : false_type {}; +#endif + +// Any native pointer which is an iterator is also a contiguous iterator. +template +struct __is_cpp17_contiguous_iterator<_Up*> : true_type {}; + + +template +class __wrap_iter; + +template +struct __is_exactly_cpp17_input_iterator + : public integral_constant::value && + !__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {}; + +template +struct __is_exactly_cpp17_forward_iterator + : public integral_constant::value && + !__has_iterator_category_convertible_to<_Tp, bidirectional_iterator_tag>::value> {}; + +template +struct __is_exactly_cpp17_bidirectional_iterator + : public integral_constant::value && + !__has_iterator_category_convertible_to<_Tp, random_access_iterator_tag>::value> {}; + +template +using __iter_value_type = typename iterator_traits<_InputIterator>::value_type; + +template +using __iter_key_type = __remove_const_t::value_type::first_type>; + +template +using __iter_mapped_type = typename iterator_traits<_InputIterator>::value_type::second_type; + +template +using __iter_to_alloc_type = pair< + typename add_const::value_type::first_type>::type, + typename iterator_traits<_InputIterator>::value_type::second_type>; + +template +using __iterator_category_type = typename iterator_traits<_Iter>::iterator_category; + +template +using __iterator_pointer_type = typename iterator_traits<_Iter>::pointer; + +template +using __iter_diff_t = typename iterator_traits<_Iter>::difference_type; + +template +using __iter_value_type = typename iterator_traits<_InputIterator>::value_type; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_ITERATOR_TRAITS_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/iterator_with_data.h b/app/src/main/cpp/libcxx/include/__iterator/iterator_with_data.h new file mode 100644 index 0000000..06c2fa6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/iterator_with_data.h @@ -0,0 +1,100 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_ITERATOR_WITH_DATA_H +#define _LIBCPP___ITERATOR_ITERATOR_WITH_DATA_H + +#include <__compare/compare_three_way_result.h> +#include <__compare/three_way_comparable.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iter_move.h> +#include <__iterator/iter_swap.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/readable_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +#if _LIBCPP_STD_VER >= 20 + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +class __iterator_with_data { + _Iterator __iter_{}; + _Data __data_{}; + +public: + using value_type = iter_value_t<_Iterator>; + using difference_type = iter_difference_t<_Iterator>; + + _LIBCPP_HIDE_FROM_ABI __iterator_with_data() = default; + + constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data(_Iterator __iter, _Data __data) + : __iter_(std::move(__iter)), __data_(std::move(__data)) {} + + constexpr _LIBCPP_HIDE_FROM_ABI _Iterator __get_iter() const { return __iter_; } + + constexpr _LIBCPP_HIDE_FROM_ABI _Data __get_data() && { return std::move(__data_); } + + friend constexpr _LIBCPP_HIDE_FROM_ABI bool + operator==(const __iterator_with_data& __lhs, const __iterator_with_data& __rhs) { + return __lhs.__iter_ == __rhs.__iter_; + } + + constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data& operator++() { + ++__iter_; + return *this; + } + + constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data operator++(int) { + auto __tmp = *this; + __iter_++; + return __tmp; + } + + constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data& operator--() + requires bidirectional_iterator<_Iterator> + { + --__iter_; + return *this; + } + + constexpr _LIBCPP_HIDE_FROM_ABI __iterator_with_data operator--(int) + requires bidirectional_iterator<_Iterator> + { + auto __tmp = *this; + --__iter_; + return __tmp; + } + + constexpr _LIBCPP_HIDE_FROM_ABI iter_reference_t<_Iterator> operator*() const { return *__iter_; } + + _LIBCPP_HIDE_FROM_ABI friend constexpr iter_rvalue_reference_t<_Iterator> + iter_move(const __iterator_with_data& __iter) noexcept(noexcept(ranges::iter_move(__iter.__iter_))) { + return ranges::iter_move(__iter.__iter_); + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr void + iter_swap(const __iterator_with_data& __lhs, + const __iterator_with_data& __rhs) noexcept(noexcept(ranges::iter_swap(__lhs.__iter_, __rhs.__iter_))) + requires indirectly_swappable<_Iterator> + { + return ranges::iter_swap(__lhs.__data_, __rhs.__iter_); + } +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 20 + +#endif // _LIBCPP___ITERATOR_ITERATOR_WITH_DATA_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/mergeable.h b/app/src/main/cpp/libcxx/include/__iterator/mergeable.h new file mode 100644 index 0000000..b9f2d08 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/mergeable.h @@ -0,0 +1,41 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_MERGEABLE_H +#define _LIBCPP___ITERATOR_MERGEABLE_H + +#include <__config> +#include <__functional/identity.h> +#include <__functional/ranges_operations.h> +#include <__iterator/concepts.h> +#include <__iterator/projected.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +concept mergeable = + input_iterator<_Input1> && + input_iterator<_Input2> && + weakly_incrementable<_Output> && + indirectly_copyable<_Input1, _Output> && + indirectly_copyable<_Input2, _Output> && + indirect_strict_weak_order<_Comp, projected<_Input1, _Proj1>, projected<_Input2, _Proj2>>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_MERGEABLE_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/move_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/move_iterator.h new file mode 100644 index 0000000..fa806db --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/move_iterator.h @@ -0,0 +1,335 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_MOVE_ITERATOR_H +#define _LIBCPP___ITERATOR_MOVE_ITERATOR_H + +#include <__compare/compare_three_way_result.h> +#include <__compare/three_way_comparable.h> +#include <__concepts/assignable.h> +#include <__concepts/convertible_to.h> +#include <__concepts/derived_from.h> +#include <__concepts/same_as.h> +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iter_move.h> +#include <__iterator/iter_swap.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/move_sentinel.h> +#include <__iterator/readable_traits.h> +#include <__type_traits/conditional.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_assignable.h> +#include <__type_traits/is_constructible.h> +#include <__type_traits/is_convertible.h> +#include <__type_traits/is_reference.h> +#include <__type_traits/is_same.h> +#include <__type_traits/remove_reference.h> +#include <__utility/declval.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 +template +struct __move_iter_category_base {}; + +template + requires requires { typename iterator_traits<_Iter>::iterator_category; } +struct __move_iter_category_base<_Iter> { + using iterator_category = _If< + derived_from::iterator_category, random_access_iterator_tag>, + random_access_iterator_tag, + typename iterator_traits<_Iter>::iterator_category + >; +}; + +template +concept __move_iter_comparable = requires { + { std::declval() == std::declval<_Sent>() } -> convertible_to; +}; +#endif // _LIBCPP_STD_VER > 17 + +template +class _LIBCPP_TEMPLATE_VIS move_iterator +#if _LIBCPP_STD_VER > 17 + : public __move_iter_category_base<_Iter> +#endif +{ +public: +#if _LIBCPP_STD_VER > 17 + using iterator_type = _Iter; + using iterator_concept = input_iterator_tag; + // iterator_category is inherited and not always present + using value_type = iter_value_t<_Iter>; + using difference_type = iter_difference_t<_Iter>; + using pointer = _Iter; + using reference = iter_rvalue_reference_t<_Iter>; +#else + typedef _Iter iterator_type; + typedef _If< + __is_cpp17_random_access_iterator<_Iter>::value, + random_access_iterator_tag, + typename iterator_traits<_Iter>::iterator_category + > iterator_category; + typedef typename iterator_traits::value_type value_type; + typedef typename iterator_traits::difference_type difference_type; + typedef iterator_type pointer; + + typedef typename iterator_traits::reference __reference; + typedef typename conditional< + is_reference<__reference>::value, + __libcpp_remove_reference_t<__reference>&&, + __reference + >::type reference; +#endif // _LIBCPP_STD_VER > 17 + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + explicit move_iterator(_Iter __i) : __current_(std::move(__i)) {} + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator& operator++() { ++__current_; return *this; } + + _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + pointer operator->() const { return __current_; } + +#if _LIBCPP_STD_VER > 17 + _LIBCPP_HIDE_FROM_ABI constexpr + move_iterator() requires is_constructible_v<_Iter> : __current_() {} + + template + requires (!_IsSame<_Up, _Iter>::value) && convertible_to + _LIBCPP_HIDE_FROM_ABI constexpr + move_iterator(const move_iterator<_Up>& __u) : __current_(__u.base()) {} + + template + requires (!_IsSame<_Up, _Iter>::value) && + convertible_to && + assignable_from<_Iter&, const _Up&> + _LIBCPP_HIDE_FROM_ABI constexpr + move_iterator& operator=(const move_iterator<_Up>& __u) { + __current_ = __u.base(); + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr const _Iter& base() const & noexcept { return __current_; } + _LIBCPP_HIDE_FROM_ABI constexpr _Iter base() && { return std::move(__current_); } + + _LIBCPP_HIDE_FROM_ABI constexpr + reference operator*() const { return ranges::iter_move(__current_); } + _LIBCPP_HIDE_FROM_ABI constexpr + reference operator[](difference_type __n) const { return ranges::iter_move(__current_ + __n); } + + _LIBCPP_HIDE_FROM_ABI constexpr + auto operator++(int) + requires forward_iterator<_Iter> + { + move_iterator __tmp(*this); ++__current_; return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI constexpr + void operator++(int) { ++__current_; } +#else + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator() : __current_() {} + + template ::value && is_convertible::value + > > + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator(const move_iterator<_Up>& __u) : __current_(__u.base()) {} + + template ::value && + is_convertible::value && + is_assignable<_Iter&, const _Up&>::value + > > + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator& operator=(const move_iterator<_Up>& __u) { + __current_ = __u.base(); + return *this; + } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + _Iter base() const { return __current_; } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + reference operator*() const { return static_cast(*__current_); } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + reference operator[](difference_type __n) const { return static_cast(__current_[__n]); } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator operator++(int) { move_iterator __tmp(*this); ++__current_; return __tmp; } +#endif // _LIBCPP_STD_VER > 17 + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator& operator--() { --__current_; return *this; } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator operator--(int) { move_iterator __tmp(*this); --__current_; return __tmp; } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator operator+(difference_type __n) const { return move_iterator(__current_ + __n); } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator& operator+=(difference_type __n) { __current_ += __n; return *this; } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator operator-(difference_type __n) const { return move_iterator(__current_ - __n); } + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 + move_iterator& operator-=(difference_type __n) { __current_ -= __n; return *this; } + +#if _LIBCPP_STD_VER > 17 + template _Sent> + friend _LIBCPP_HIDE_FROM_ABI constexpr + bool operator==(const move_iterator& __x, const move_sentinel<_Sent>& __y) + requires __move_iter_comparable<_Iter, _Sent> + { + return __x.base() == __y.base(); + } + + template _Sent> + friend _LIBCPP_HIDE_FROM_ABI constexpr + iter_difference_t<_Iter> operator-(const move_sentinel<_Sent>& __x, const move_iterator& __y) + { + return __x.base() - __y.base(); + } + + template _Sent> + friend _LIBCPP_HIDE_FROM_ABI constexpr + iter_difference_t<_Iter> operator-(const move_iterator& __x, const move_sentinel<_Sent>& __y) + { + return __x.base() - __y.base(); + } + + friend _LIBCPP_HIDE_FROM_ABI constexpr + iter_rvalue_reference_t<_Iter> iter_move(const move_iterator& __i) + noexcept(noexcept(ranges::iter_move(__i.__current_))) + { + return ranges::iter_move(__i.__current_); + } + + template _It2> + friend _LIBCPP_HIDE_FROM_ABI constexpr + void iter_swap(const move_iterator& __x, const move_iterator<_It2>& __y) + noexcept(noexcept(ranges::iter_swap(__x.__current_, __y.__current_))) + { + return ranges::iter_swap(__x.__current_, __y.__current_); + } +#endif // _LIBCPP_STD_VER > 17 + +private: + template friend class move_iterator; + + _Iter __current_; +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(move_iterator); + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() == __y.base(); +} + +#if _LIBCPP_STD_VER <= 17 +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() != __y.base(); +} +#endif // _LIBCPP_STD_VER <= 17 + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() < __y.base(); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() > __y.base(); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() <= __y.base(); +} + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() >= __y.base(); +} + +#if _LIBCPP_STD_VER > 17 +template _Iter2> +inline _LIBCPP_HIDE_FROM_ABI constexpr +auto operator<=>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) + -> compare_three_way_result_t<_Iter1, _Iter2> +{ + return __x.base() <=> __y.base(); +} +#endif // _LIBCPP_STD_VER > 17 + +#ifndef _LIBCPP_CXX03_LANG +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) + -> decltype(__x.base() - __y.base()) +{ + return __x.base() - __y.base(); +} +#else +template +inline _LIBCPP_HIDE_FROM_ABI +typename move_iterator<_Iter1>::difference_type +operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) +{ + return __x.base() - __y.base(); +} +#endif // !_LIBCPP_CXX03_LANG + +#if _LIBCPP_STD_VER > 17 +template +inline _LIBCPP_HIDE_FROM_ABI constexpr +move_iterator<_Iter> operator+(iter_difference_t<_Iter> __n, const move_iterator<_Iter>& __x) + requires requires { { __x.base() + __n } -> same_as<_Iter>; } +{ + return __x + __n; +} +#else +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +move_iterator<_Iter> +operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x) +{ + return move_iterator<_Iter>(__x.base() + __n); +} +#endif // _LIBCPP_STD_VER > 17 + +template +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 +move_iterator<_Iter> +make_move_iterator(_Iter __i) +{ + return move_iterator<_Iter>(std::move(__i)); +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_MOVE_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/move_sentinel.h b/app/src/main/cpp/libcxx/include/__iterator/move_sentinel.h new file mode 100644 index 0000000..0d7336a --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/move_sentinel.h @@ -0,0 +1,59 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_MOVE_SENTINEL_H +#define _LIBCPP___ITERATOR_MOVE_SENTINEL_H + +#include <__concepts/assignable.h> +#include <__concepts/convertible_to.h> +#include <__concepts/semiregular.h> +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +class _LIBCPP_TEMPLATE_VIS move_sentinel +{ +public: + _LIBCPP_HIDE_FROM_ABI + move_sentinel() = default; + + _LIBCPP_HIDE_FROM_ABI constexpr + explicit move_sentinel(_Sent __s) : __last_(std::move(__s)) {} + + template + requires convertible_to + _LIBCPP_HIDE_FROM_ABI constexpr + move_sentinel(const move_sentinel<_S2>& __s) : __last_(__s.base()) {} + + template + requires assignable_from<_Sent&, const _S2&> + _LIBCPP_HIDE_FROM_ABI constexpr + move_sentinel& operator=(const move_sentinel<_S2>& __s) + { __last_ = __s.base(); return *this; } + + constexpr _Sent base() const { return __last_; } + +private: + _Sent __last_ = _Sent(); +}; + +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(move_sentinel); + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_MOVE_SENTINEL_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/next.h b/app/src/main/cpp/libcxx/include/__iterator/next.h new file mode 100644 index 0000000..49970ae --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/next.h @@ -0,0 +1,84 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_NEXT_H +#define _LIBCPP___ITERATOR_NEXT_H + +#include <__assert> +#include <__config> +#include <__iterator/advance.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/enable_if.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + typename enable_if<__is_cpp17_input_iterator<_InputIter>::value, _InputIter>::type + next(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n = 1) { + _LIBCPP_ASSERT(__n >= 0 || __is_cpp17_bidirectional_iterator<_InputIter>::value, + "Attempt to next(it, n) with negative n on a non-bidirectional iterator"); + + _VSTD::advance(__x, __n); + return __x; +} + +#if _LIBCPP_STD_VER > 17 + +// [range.iter.op.next] + +namespace ranges { +namespace __next { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI + constexpr _Ip operator()(_Ip __x) const { + ++__x; + return __x; + } + + template + _LIBCPP_HIDE_FROM_ABI + constexpr _Ip operator()(_Ip __x, iter_difference_t<_Ip> __n) const { + ranges::advance(__x, __n); + return __x; + } + + template _Sp> + _LIBCPP_HIDE_FROM_ABI constexpr _Ip operator()(_Ip __x, _Sp __bound_sentinel) const { + ranges::advance(__x, __bound_sentinel); + return __x; + } + + template _Sp> + _LIBCPP_HIDE_FROM_ABI constexpr _Ip operator()(_Ip __x, iter_difference_t<_Ip> __n, _Sp __bound_sentinel) const { + ranges::advance(__x, __n, __bound_sentinel); + return __x; + } +}; + +} // namespace __next + +inline namespace __cpo { + inline constexpr auto next = __next::__fn{}; +} // namespace __cpo +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_NEXT_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/ostream_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/ostream_iterator.h new file mode 100644 index 0000000..d16f5a2 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/ostream_iterator.h @@ -0,0 +1,71 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_OSTREAM_ITERATOR_H +#define _LIBCPP___ITERATOR_OSTREAM_ITERATOR_H + +#include <__config> +#include <__iterator/iterator.h> +#include <__iterator/iterator_traits.h> +#include <__memory/addressof.h> +#include +#include // for forward declarations of char_traits and basic_ostream + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template > +class _LIBCPP_TEMPLATE_VIS ostream_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif +{ +_LIBCPP_SUPPRESS_DEPRECATED_POP +public: + typedef output_iterator_tag iterator_category; + typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else + typedef void difference_type; +#endif + typedef void pointer; + typedef void reference; + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_ostream<_CharT, _Traits> ostream_type; + +private: + ostream_type* __out_stream_; + const char_type* __delim_; +public: + _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) _NOEXCEPT + : __out_stream_(_VSTD::addressof(__s)), __delim_(nullptr) {} + _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter) _NOEXCEPT + : __out_stream_(_VSTD::addressof(__s)), __delim_(__delimiter) {} + _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value) + { + *__out_stream_ << __value; + if (__delim_) + *__out_stream_ << __delim_; + return *this; + } + + _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++(int) {return *this;} +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_OSTREAM_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/ostreambuf_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/ostreambuf_iterator.h new file mode 100644 index 0000000..b75f7b6 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/ostreambuf_iterator.h @@ -0,0 +1,77 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_OSTREAMBUF_ITERATOR_H +#define _LIBCPP___ITERATOR_OSTREAMBUF_ITERATOR_H + +#include <__config> +#include <__iterator/iterator.h> +#include <__iterator/iterator_traits.h> +#include +#include // for forward declaration of basic_streambuf + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template +class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif +{ +_LIBCPP_SUPPRESS_DEPRECATED_POP +public: + typedef output_iterator_tag iterator_category; + typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else + typedef void difference_type; +#endif + typedef void pointer; + typedef void reference; + typedef _CharT char_type; + typedef _Traits traits_type; + typedef basic_streambuf<_CharT, _Traits> streambuf_type; + typedef basic_ostream<_CharT, _Traits> ostream_type; + +private: + streambuf_type* __sbuf_; +public: + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(ostream_type& __s) _NOEXCEPT + : __sbuf_(__s.rdbuf()) {} + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(streambuf_type* __s) _NOEXCEPT + : __sbuf_(__s) {} + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator=(_CharT __c) + { + if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sputc(__c), traits_type::eof())) + __sbuf_ = nullptr; + return *this; + } + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator*() {return *this;} + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++() {return *this;} + _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++(int) {return *this;} + _LIBCPP_INLINE_VISIBILITY bool failed() const _NOEXCEPT {return __sbuf_ == nullptr;} + + template + friend + _LIBCPP_HIDE_FROM_ABI + ostreambuf_iterator<_Ch, _Tr> + __pad_and_output(ostreambuf_iterator<_Ch, _Tr> __s, + const _Ch* __ob, const _Ch* __op, const _Ch* __oe, + ios_base& __iob, _Ch __fl); +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_OSTREAMBUF_ITERATOR_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/permutable.h b/app/src/main/cpp/libcxx/include/__iterator/permutable.h new file mode 100644 index 0000000..28d193e --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/permutable.h @@ -0,0 +1,35 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_PERMUTABLE_H +#define _LIBCPP___ITERATOR_PERMUTABLE_H + +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/iter_swap.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template +concept permutable = + forward_iterator<_Iterator> && + indirectly_movable_storable<_Iterator, _Iterator> && + indirectly_swappable<_Iterator, _Iterator>; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_PERMUTABLE_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/prev.h b/app/src/main/cpp/libcxx/include/__iterator/prev.h new file mode 100644 index 0000000..af1e1ba --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/prev.h @@ -0,0 +1,77 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_PREV_H +#define _LIBCPP___ITERATOR_PREV_H + +#include <__assert> +#include <__config> +#include <__iterator/advance.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iterator_traits.h> +#include <__type_traits/enable_if.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + typename enable_if<__is_cpp17_input_iterator<_InputIter>::value, _InputIter>::type + prev(_InputIter __x, typename iterator_traits<_InputIter>::difference_type __n = 1) { + _LIBCPP_ASSERT(__n <= 0 || __is_cpp17_bidirectional_iterator<_InputIter>::value, + "Attempt to prev(it, n) with a positive n on a non-bidirectional iterator"); + _VSTD::advance(__x, -__n); + return __x; +} + +#if _LIBCPP_STD_VER > 17 + +// [range.iter.op.prev] + +namespace ranges { +namespace __prev { + +struct __fn { + template + _LIBCPP_HIDE_FROM_ABI + constexpr _Ip operator()(_Ip __x) const { + --__x; + return __x; + } + + template + _LIBCPP_HIDE_FROM_ABI + constexpr _Ip operator()(_Ip __x, iter_difference_t<_Ip> __n) const { + ranges::advance(__x, -__n); + return __x; + } + + template + _LIBCPP_HIDE_FROM_ABI constexpr _Ip operator()(_Ip __x, iter_difference_t<_Ip> __n, _Ip __bound_iter) const { + ranges::advance(__x, -__n, __bound_iter); + return __x; + } +}; + +} // namespace __prev + +inline namespace __cpo { + inline constexpr auto prev = __prev::__fn{}; +} // namespace __cpo +} // namespace ranges + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_PREV_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/projected.h b/app/src/main/cpp/libcxx/include/__iterator/projected.h new file mode 100644 index 0000000..19c076b --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/projected.h @@ -0,0 +1,41 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_PROJECTED_H +#define _LIBCPP___ITERATOR_PROJECTED_H + +#include <__config> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__type_traits/remove_cvref.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +template _Proj> +struct projected { + using value_type = remove_cvref_t>; + indirect_result_t<_Proj&, _It> operator*() const; // not defined +}; + +template +struct incrementable_traits> { + using difference_type = iter_difference_t<_It>; +}; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_PROJECTED_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/readable_traits.h b/app/src/main/cpp/libcxx/include/__iterator/readable_traits.h new file mode 100644 index 0000000..8f17757 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/readable_traits.h @@ -0,0 +1,92 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_READABLE_TRAITS_H +#define _LIBCPP___ITERATOR_READABLE_TRAITS_H + +#include <__concepts/same_as.h> +#include <__config> +#include <__type_traits/conditional.h> +#include <__type_traits/is_array.h> +#include <__type_traits/is_object.h> +#include <__type_traits/is_primary_template.h> +#include <__type_traits/remove_cv.h> +#include <__type_traits/remove_cvref.h> +#include <__type_traits/remove_extent.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 + +// [readable.traits] +template struct __cond_value_type {}; + +template +requires is_object_v<_Tp> +struct __cond_value_type<_Tp> { using value_type = remove_cv_t<_Tp>; }; + +template +concept __has_member_value_type = requires { typename _Tp::value_type; }; + +template +concept __has_member_element_type = requires { typename _Tp::element_type; }; + +template struct indirectly_readable_traits {}; + +template +requires is_array_v<_Ip> +struct indirectly_readable_traits<_Ip> { + using value_type = remove_cv_t>; +}; + +template +struct indirectly_readable_traits : indirectly_readable_traits<_Ip> {}; + +template +struct indirectly_readable_traits<_Tp*> : __cond_value_type<_Tp> {}; + +template<__has_member_value_type _Tp> +struct indirectly_readable_traits<_Tp> + : __cond_value_type {}; + +template<__has_member_element_type _Tp> +struct indirectly_readable_traits<_Tp> + : __cond_value_type {}; + +template<__has_member_value_type _Tp> + requires __has_member_element_type<_Tp> +struct indirectly_readable_traits<_Tp> {}; + +template<__has_member_value_type _Tp> + requires __has_member_element_type<_Tp> && + same_as, + remove_cv_t> +struct indirectly_readable_traits<_Tp> + : __cond_value_type {}; + +template +struct iterator_traits; + +// Let `RI` be `remove_cvref_t`. The type `iter_value_t` denotes +// `indirectly_readable_traits::value_type` if `iterator_traits` names a specialization +// generated from the primary template, and `iterator_traits::value_type` otherwise. +template +using iter_value_t = typename conditional_t<__is_primary_template > >::value, + indirectly_readable_traits >, + iterator_traits > >::value_type; + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_READABLE_TRAITS_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/reverse_access.h b/app/src/main/cpp/libcxx/include/__iterator/reverse_access.h new file mode 100644 index 0000000..79b599c --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/reverse_access.h @@ -0,0 +1,100 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_REVERSE_ACCESS_H +#define _LIBCPP___ITERATOR_REVERSE_ACCESS_H + +#include <__config> +#include <__iterator/reverse_iterator.h> +#include +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 11 + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np]) +{ + return reverse_iterator<_Tp*>(__array + _Np); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np]) +{ + return reverse_iterator<_Tp*>(__array); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +reverse_iterator rbegin(initializer_list<_Ep> __il) +{ + return reverse_iterator(__il.end()); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +reverse_iterator rend(initializer_list<_Ep> __il) +{ + return reverse_iterator(__il.begin()); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto rbegin(_Cp& __c) -> decltype(__c.rbegin()) +{ + return __c.rbegin(); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto rbegin(const _Cp& __c) -> decltype(__c.rbegin()) +{ + return __c.rbegin(); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto rend(_Cp& __c) -> decltype(__c.rend()) +{ + return __c.rend(); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto rend(const _Cp& __c) -> decltype(__c.rend()) +{ + return __c.rend(); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto crbegin(const _Cp& __c) -> decltype(_VSTD::rbegin(__c)) +{ + return _VSTD::rbegin(__c); +} + +template +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c)) +{ + return _VSTD::rend(__c); +} + +#endif // _LIBCPP_STD_VER > 11 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___ITERATOR_REVERSE_ACCESS_H diff --git a/app/src/main/cpp/libcxx/include/__iterator/reverse_iterator.h b/app/src/main/cpp/libcxx/include/__iterator/reverse_iterator.h new file mode 100644 index 0000000..f272e03 --- /dev/null +++ b/app/src/main/cpp/libcxx/include/__iterator/reverse_iterator.h @@ -0,0 +1,533 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___ITERATOR_REVERSE_ITERATOR_H +#define _LIBCPP___ITERATOR_REVERSE_ITERATOR_H + +#include <__algorithm/unwrap_iter.h> +#include <__compare/compare_three_way_result.h> +#include <__compare/three_way_comparable.h> +#include <__concepts/convertible_to.h> +#include <__config> +#include <__iterator/advance.h> +#include <__iterator/concepts.h> +#include <__iterator/incrementable_traits.h> +#include <__iterator/iter_move.h> +#include <__iterator/iter_swap.h> +#include <__iterator/iterator.h> +#include <__iterator/iterator_traits.h> +#include <__iterator/next.h> +#include <__iterator/prev.h> +#include <__iterator/readable_traits.h> +#include <__iterator/segmented_iterator.h> +#include <__memory/addressof.h> +#include <__ranges/access.h> +#include <__ranges/concepts.h> +#include <__ranges/subrange.h> +#include <__type_traits/conditional.h> +#include <__type_traits/enable_if.h> +#include <__type_traits/is_assignable.h> +#include <__type_traits/is_convertible.h> +#include <__type_traits/is_nothrow_copy_constructible.h> +#include <__type_traits/is_pointer.h> +#include <__type_traits/is_same.h> +#include <__utility/declval.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +_LIBCPP_SUPPRESS_DEPRECATED_PUSH +template +class _LIBCPP_TEMPLATE_VIS reverse_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator::iterator_category, + typename iterator_traits<_Iter>::value_type, + typename iterator_traits<_Iter>::difference_type, + typename iterator_traits<_Iter>::pointer, + typename iterator_traits<_Iter>::reference> +#endif +{ +_LIBCPP_SUPPRESS_DEPRECATED_POP +private: +#ifndef _LIBCPP_ABI_NO_ITERATOR_BASES + _Iter __t_; // no longer used as of LWG #2360, not removed due to ABI break +#endif + +#if _LIBCPP_STD_VER > 17 + static_assert(__is_cpp17_bidirectional_iterator<_Iter>::value || bidirectional_iterator<_Iter>, + "reverse_iterator requires It to be a bidirectional iterator."); +#endif // _LIBCPP_STD_VER > 17 + +protected: + _Iter current; +public: + using iterator_type = _Iter; + + using iterator_category = _If<__is_cpp17_random_access_iterator<_Iter>::value, + random_access_iterator_tag, + typename iterator_traits<_Iter>::iterator_category>; + using pointer = typename iterator_traits<_Iter>::pointer; +#if _LIBCPP_STD_VER > 17 + using iterator_concept = _If, random_access_iterator_tag, bidirectional_iterator_tag>; + using value_type = iter_value_t<_Iter>; + using difference_type = iter_difference_t<_Iter>; + using reference = iter_reference_t<_Iter>; +#else + using value_type = typename iterator_traits<_Iter>::value_type; + using difference_type = typename iterator_traits<_Iter>::difference_type; + using reference = typename iterator_traits<_Iter>::reference; +#endif + +#ifndef _LIBCPP_ABI_NO_ITERATOR_BASES + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator() : __t_(), current() {} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + explicit reverse_iterator(_Iter __x) : __t_(__x), current(__x) {} + + template ::value && is_convertible<_Up const&, _Iter>::value + > > + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator(const reverse_iterator<_Up>& __u) + : __t_(__u.base()), current(__u.base()) + { } + + template ::value && + is_convertible<_Up const&, _Iter>::value && + is_assignable<_Iter&, _Up const&>::value + > > + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator& operator=(const reverse_iterator<_Up>& __u) { + __t_ = current = __u.base(); + return *this; + } +#else + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator() : current() {} + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + explicit reverse_iterator(_Iter __x) : current(__x) {} + + template ::value && is_convertible<_Up const&, _Iter>::value + > > + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator(const reverse_iterator<_Up>& __u) + : current(__u.base()) + { } + + template ::value && + is_convertible<_Up const&, _Iter>::value && + is_assignable<_Iter&, _Up const&>::value + > > + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator& operator=(const reverse_iterator<_Up>& __u) { + current = __u.base(); + return *this; + } +#endif + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + _Iter base() const {return current;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reference operator*() const {_Iter __tmp = current; return *--__tmp;} + +#if _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY + constexpr pointer operator->() const + requires is_pointer_v<_Iter> || requires(const _Iter __i) { __i.operator->(); } + { + if constexpr (is_pointer_v<_Iter>) { + return std::prev(current); + } else { + return std::prev(current).operator->(); + } + } +#else + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + pointer operator->() const { + return std::addressof(operator*()); + } +#endif // _LIBCPP_STD_VER > 17 + + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator& operator++() {--current; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator operator++(int) {reverse_iterator __tmp(*this); --current; return __tmp;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator& operator--() {++current; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator operator--(int) {reverse_iterator __tmp(*this); ++current; return __tmp;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator operator+(difference_type __n) const {return reverse_iterator(current - __n);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator& operator+=(difference_type __n) {current -= __n; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator operator-(difference_type __n) const {return reverse_iterator(current + __n);} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reverse_iterator& operator-=(difference_type __n) {current += __n; return *this;} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 + reference operator[](difference_type __n) const {return *(*this + __n);} + +#if _LIBCPP_STD_VER > 17 + _LIBCPP_HIDE_FROM_ABI friend constexpr + iter_rvalue_reference_t<_Iter> iter_move(const reverse_iterator& __i) + noexcept(is_nothrow_copy_constructible_v<_Iter> && + noexcept(ranges::iter_move(--std::declval<_Iter&>()))) { + auto __tmp = __i.base(); + return ranges::iter_move(--__tmp); + } + + template _Iter2> + _LIBCPP_HIDE_FROM_ABI friend constexpr + void iter_swap(const reverse_iterator& __x, const reverse_iterator<_Iter2>& __y) + noexcept(is_nothrow_copy_constructible_v<_Iter> && + is_nothrow_copy_constructible_v<_Iter2> && + noexcept(ranges::iter_swap(--std::declval<_Iter&>(), --std::declval<_Iter2&>()))) { + auto __xtmp = __x.base(); + auto __ytmp = __y.base(); + ranges::iter_swap(--__xtmp, --__ytmp); + } +#endif // _LIBCPP_STD_VER > 17 +}; + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool +operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +#if _LIBCPP_STD_VER > 17 + requires requires { + { __x.base() == __y.base() } -> convertible_to; + } +#endif // _LIBCPP_STD_VER > 17 +{ + return __x.base() == __y.base(); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool +operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +#if _LIBCPP_STD_VER > 17 + requires requires { + { __x.base() > __y.base() } -> convertible_to; + } +#endif // _LIBCPP_STD_VER > 17 +{ + return __x.base() > __y.base(); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool +operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +#if _LIBCPP_STD_VER > 17 + requires requires { + { __x.base() != __y.base() } -> convertible_to; + } +#endif // _LIBCPP_STD_VER > 17 +{ + return __x.base() != __y.base(); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool +operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +#if _LIBCPP_STD_VER > 17 + requires requires { + { __x.base() < __y.base() } -> convertible_to; + } +#endif // _LIBCPP_STD_VER > 17 +{ + return __x.base() < __y.base(); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool +operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +#if _LIBCPP_STD_VER > 17 + requires requires { + { __x.base() <= __y.base() } -> convertible_to; + } +#endif // _LIBCPP_STD_VER > 17 +{ + return __x.base() <= __y.base(); +} + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +bool +operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +#if _LIBCPP_STD_VER > 17 + requires requires { + { __x.base() >= __y.base() } -> convertible_to; + } +#endif // _LIBCPP_STD_VER > 17 +{ + return __x.base() >= __y.base(); +} + +#if _LIBCPP_STD_VER > 17 +template _Iter2> +_LIBCPP_HIDE_FROM_ABI constexpr +compare_three_way_result_t<_Iter1, _Iter2> +operator<=>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __y.base() <=> __x.base(); +} +#endif // _LIBCPP_STD_VER > 17 + +#ifndef _LIBCPP_CXX03_LANG +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +auto +operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +-> decltype(__y.base() - __x.base()) +{ + return __y.base() - __x.base(); +} +#else +template +inline _LIBCPP_INLINE_VISIBILITY +typename reverse_iterator<_Iter1>::difference_type +operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ + return __y.base() - __x.base(); +} +#endif + +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +reverse_iterator<_Iter> +operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x) +{ + return reverse_iterator<_Iter>(__x.base() - __n); +} + +#if _LIBCPP_STD_VER > 17 +template + requires (!sized_sentinel_for<_Iter1, _Iter2>) +inline constexpr bool disable_sized_sentinel_for, reverse_iterator<_Iter2>> = true; +#endif // _LIBCPP_STD_VER > 17 + +#if _LIBCPP_STD_VER > 11 +template +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17 +reverse_iterator<_Iter> make_reverse_iterator(_Iter __i) +{ + return reverse_iterator<_Iter>(__i); +} +#endif + +#if _LIBCPP_STD_VER <= 17 +template +using __unconstrained_reverse_iterator = reverse_iterator<_Iter>; +#else + +// __unconstrained_reverse_iterator allows us to use reverse iterators in the implementation of algorithms by working +// around a language issue in C++20. +// In C++20, when a reverse iterator wraps certain C++20-hostile iterators, calling comparison operators on it will +// result in a compilation error. However, calling comparison operators on the pristine hostile iterator is not +// an error. Thus, we cannot use reverse_iterators in the implementation of an algorithm that accepts a +// C++20-hostile iterator. This class is an internal workaround -- it is a copy of reverse_iterator with +// tweaks to make it support hostile iterators. +// +// A C++20-hostile iterator is one that defines a comparison operator where one of the arguments is an exact match +// and the other requires an implicit conversion, for example: +// friend bool operator==(const BaseIter&, const DerivedIter&); +// +// C++20 rules for rewriting equality operators create another overload of this function with parameters reversed: +// friend bool operator==(const DerivedIter&, const BaseIter&); +// +// This creates an ambiguity in overload resolution. +// +// Clang treats this ambiguity differently in different contexts. When operator== is actually called in the function +// body, the code is accepted with a warning. When a concept requires operator== to be a valid expression, however, +// it evaluates to false. Thus, the implementation of reverse_iterator::operator== can actually call operator== on its +// base iterators, but the constraints on reverse_iterator::operator== prevent it from being considered during overload +// resolution. This class simply removes the problematic constraints from comparison functions. +template +class __unconstrained_reverse_iterator { + _Iter __iter_; + +public: + static_assert(__is_cpp17_bidirectional_iterator<_Iter>::value || bidirectional_iterator<_Iter>); + + using iterator_type = _Iter; + using iterator_category = + _If<__is_cpp17_random_access_iterator<_Iter>::value, random_access_iterator_tag, __iterator_category_type<_Iter>>; + using pointer = __iterator_pointer_type<_Iter>; + using value_type = iter_value_t<_Iter>; + using difference_type = iter_difference_t<_Iter>; + using reference = iter_reference_t<_Iter>; + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator() = default; + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator(const __unconstrained_reverse_iterator&) = default; + _LIBCPP_HIDE_FROM_ABI constexpr explicit __unconstrained_reverse_iterator(_Iter __iter) : __iter_(__iter) {} + + _LIBCPP_HIDE_FROM_ABI constexpr _Iter base() const { return __iter_; } + _LIBCPP_HIDE_FROM_ABI constexpr reference operator*() const { + auto __tmp = __iter_; + return *--__tmp; + } + + _LIBCPP_HIDE_FROM_ABI constexpr pointer operator->() const { + if constexpr (is_pointer_v<_Iter>) { + return std::prev(__iter_); + } else { + return std::prev(__iter_).operator->(); + } + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr + iter_rvalue_reference_t<_Iter> iter_move(const __unconstrained_reverse_iterator& __i) + noexcept(is_nothrow_copy_constructible_v<_Iter> && + noexcept(ranges::iter_move(--std::declval<_Iter&>()))) { + auto __tmp = __i.base(); + return ranges::iter_move(--__tmp); + } + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator& operator++() { + --__iter_; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator operator++(int) { + auto __tmp = *this; + --__iter_; + return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator& operator--() { + ++__iter_; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator operator--(int) { + auto __tmp = *this; + ++__iter_; + return __tmp; + } + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator& operator+=(difference_type __n) { + __iter_ -= __n; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator& operator-=(difference_type __n) { + __iter_ += __n; + return *this; + } + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator operator+(difference_type __n) const { + return __unconstrained_reverse_iterator(__iter_ - __n); + } + + _LIBCPP_HIDE_FROM_ABI constexpr __unconstrained_reverse_iterator operator-(difference_type __n) const { + return __unconstrained_reverse_iterator(__iter_ + __n); + } + + _LIBCPP_HIDE_FROM_ABI constexpr difference_type operator-(const __unconstrained_reverse_iterator& __other) const { + return __other.__iter_ - __iter_; + } + + _LIBCPP_HIDE_FROM_ABI constexpr auto operator[](difference_type __n) const { return *(*this + __n); } + + // Deliberately unconstrained unlike the comparison functions in `reverse_iterator` -- see the class comment for the + // rationale. + _LIBCPP_HIDE_FROM_ABI friend constexpr bool + operator==(const __unconstrained_reverse_iterator& __lhs, const __unconstrained_reverse_iterator& __rhs) { + return __lhs.base() == __rhs.base(); + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr bool + operator!=(const __unconstrained_reverse_iterator& __lhs, const __unconstrained_reverse_iterator& __rhs) { + return __lhs.base() != __rhs.base(); + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr bool + operator<(const __unconstrained_reverse_iterator& __lhs, const __unconstrained_reverse_iterator& __rhs) { + return __lhs.base() > __rhs.base(); + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr bool + operator>(const __unconstrained_reverse_iterator& __lhs, const __unconstrained_reverse_iterator& __rhs) { + return __lhs.base() < __rhs.base(); + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr bool + operator<=(const __unconstrained_reverse_iterator& __lhs, const __unconstrained_reverse_iterator& __rhs) { + return __lhs.base() >= __rhs.base(); + } + + _LIBCPP_HIDE_FROM_ABI friend constexpr bool + operator>=(const __unconstrained_reverse_iterator& __lhs, const __unconstrained_reverse_iterator& __rhs) { + return __lhs.base() <= __rhs.base(); + } +}; + +#endif // _LIBCPP_STD_VER <= 17 + +template