in unittest/gunit/strings_strnxfrm-t.cc [767:1387]
static void BM_MixedUTF8MB4_AS_CS(size_t num_iterations) {
StopBenchmarkTiming();
CHARSET_INFO *cs = init_collation("utf8mb4_0900_as_cs");
// Some English text, then some Norwegian text, then some Japanese,
// and then a few emoji (the last with skin tone modifiers).
const char *content =
"Premature optimization is the root of all evil. "
"Våre norske tegn bør æres. 日本語が少しわかります。 "
"✌️🐶👩🏽";
const int len = strlen(content);
// Just recorded from a trial run on the string above.
static constexpr uchar expected[] = {
// Primary weights.
0x1e,
0x0c,
0x1e,
0x33,
0x1c,
0xaa,
0x1d,
0xaa,
0x1c,
0x47,
0x1e,
0x95,
0x1e,
0xb5,
0x1e,
0x33,
0x1c,
0xaa,
0x02,
0x09,
0x1d,
0xdd,
0x1e,
0x0c,
0x1e,
0x95,
0x1d,
0x32,
0x1d,
0xaa,
0x1d,
0x32,
0x1f,
0x21,
0x1c,
0x47,
0x1e,
0x95,
0x1d,
0x32,
0x1d,
0xdd,
0x1d,
0xb9,
0x02,
0x09,
0x1d,
0x32,
0x1e,
0x71,
0x02,
0x09,
0x1e,
0x95,
0x1d,
0x18,
0x1c,
0xaa,
0x02,
0x09,
0x1e,
0x33,
0x1d,
0xdd,
0x1d,
0xdd,
0x1e,
0x95,
0x02,
0x09,
0x1d,
0xdd,
0x1c,
0xe5,
0x02,
0x09,
0x1c,
0x47,
0x1d,
0x77,
0x1d,
0x77,
0x02,
0x09,
0x1c,
0xaa,
0x1e,
0xe3,
0x1d,
0x32,
0x1d,
0x77,
0x02,
0x77,
0x02,
0x09,
0x1e,
0xe3,
0x1c,
0x47,
0x1e,
0x33,
0x1c,
0xaa,
0x02,
0x09,
0x1d,
0xb9,
0x1d,
0xdd,
0x1e,
0x33,
0x1e,
0x71,
0x1d,
0x65,
0x1c,
0xaa,
0x02,
0x09,
0x1e,
0x95,
0x1c,
0xaa,
0x1c,
0xf4,
0x1d,
0xb9,
0x02,
0x09,
0x1c,
0x60,
0x1d,
0xdd,
0x1e,
0x33,
0x02,
0x09,
0x1c,
0x47,
0x1c,
0xaa,
0x1e,
0x33,
0x1c,
0xaa,
0x1e,
0x71,
0x02,
0x77,
0x02,
0x09,
0xfb,
0x40,
0xe5,
0xe5,
0xfb,
0x40,
0xe7,
0x2c,
0xfb,
0x41,
0x8a,
0x9e,
0x3d,
0x60,
0xfb,
0x40,
0xdc,
0x11,
0x3d,
0x66,
0x3d,
0x87,
0x3d,
0x60,
0x3d,
0x83,
0x3d,
0x79,
0x3d,
0x67,
0x02,
0x8a,
0x02,
0x09,
0x0a,
0x2d,
0x13,
0xdf,
0x14,
0x12,
0x13,
0xa6,
// Level separator.
0x00,
0x00,
// Secondary weights.
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x29,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x2f,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x01,
0x10,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x37,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
0x00,
0x20,
// Level separator.
0x00,
0x00,
// Tertiary weights.
0x00,
0x08,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x08,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x04,
0x00,
0x04,
0x00,
0x04,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x0e,
0x00,
0x02,
0x00,
0x02,
0x00,
0x0e,
0x00,
0x0e,
0x00,
0x0e,
0x00,
0x0e,
0x00,
0x0e,
0x00,
0x0e,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
0x00,
0x02,
};
uchar dest[sizeof(expected)];
size_t ret = 0;
StartBenchmarkTiming();
for (size_t i = 0; i < num_iterations; ++i) {
ret = my_strnxfrm(cs, dest, sizeof(dest),
pointer_cast<const uchar *>(content), len);
}
StopBenchmarkTiming();
EXPECT_EQ(sizeof(expected), ret);
expect_arrays_equal(expected, dest, ret);
SetBytesProcessed(num_iterations * strlen(content));
}