/* * Copyright (c) 2024, Nico Weber * * SPDX-License-Identifier: BSD-2-Clause */ #include #include constexpr size_t N = 10'000; static auto make_string() { return MUST(String::repeated("hello "_string, N)); } auto long_string = make_string(); BENCHMARK_CASE(for_each_boundary) { Vector boundaries; auto segmenter = Locale::Segmenter::create(Locale::SegmenterGranularity::Word); segmenter->for_each_boundary(long_string, [&](auto boundary) { boundaries.append(boundary); return IterationDecision::Continue; }); EXPECT_EQ(boundaries.size(), 2 * N + 1); } BENCHMARK_CASE(forward) { Vector boundaries; auto segmenter = Locale::Segmenter::create(Locale::SegmenterGranularity::Word); segmenter->set_segmented_text(long_string); size_t boundary = 0; boundaries.append(boundary); while (true) { auto next_boundary = segmenter->next_boundary(boundary); if (!next_boundary.has_value()) break; boundary = next_boundary.value(); boundaries.append(boundary); } EXPECT_EQ(boundaries.size(), 2 * N + 1); } BENCHMARK_CASE(backward) { Vector boundaries; auto segmenter = Locale::Segmenter::create(Locale::SegmenterGranularity::Word); segmenter->set_segmented_text(long_string); size_t boundary = long_string.bytes_as_string_view().length(); boundaries.append(boundary); while (true) { auto next_boundary = segmenter->previous_boundary(boundary); if (!next_boundary.has_value()) break; boundary = next_boundary.value(); boundaries.append(boundary); } EXPECT_EQ(boundaries.size(), 2 * N + 1); }