From de81c2545aec06a1b269218b7d00656e97d8b66c Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Mon, 4 Apr 2022 09:58:53 +0300 Subject: Related: tdf#144245 Optimize case-insensitive handling 1. Make BasicCollection::implGetIndexForName take OUString again, after commit f7de7de1189ae4e63f73468076da47b37fe61ede made it take std::u16string_view. All call sites pass OUStrings, and commit ef32c3b4f9b80918d6018e14297fa41245afd381 made it create OUString from the argument. 2. Have SbxVariable cache a case-insensitive variant of the name. It is currently only used in the Collection implementation, but may be used in other places; Tthe names are case-insensitive in Basic, and VBA allows non-ASCII characters in names, so this caching might be useful elsewhere. 3. Skip non-ASCII characters when calculating name hash, to allow non-ASCII-containing strings still have some hash variance, when at least some of the first 6 characters are ASCII. Change-Id: If90ccea2c4b44c34967e6b764b6fab45b2976c40 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132493 Tested-by: Jenkins Reviewed-by: Mike Kaganski --- basic/source/sbx/sbxvar.cxx | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'basic/source/sbx/sbxvar.cxx') diff --git a/basic/source/sbx/sbxvar.cxx b/basic/source/sbx/sbxvar.cxx index 8fb11bf9f2a2..a08122961b66 100644 --- a/basic/source/sbx/sbxvar.cxx +++ b/basic/source/sbx/sbxvar.cxx @@ -30,6 +30,8 @@ #include #include #include +#include +#include #include using namespace com::sun::star::uno; @@ -183,6 +185,7 @@ void SbxVariable::SetName( const OUString& rName ) { maName = rName; nHash = MakeHashCode( rName ); + maNameCI.clear(); } const OUString& SbxVariable::GetName( SbxNameType t ) const @@ -192,6 +195,12 @@ const OUString& SbxVariable::GetName( SbxNameType t ) const { return maName; } + if (t == SbxNameType::CaseInsensitive) + { + if (maNameCI.isEmpty() && !maName.isEmpty()) + maNameCI = SbGlobal::GetTransliteration().transliterate(maName, 0, maName.getLength()); + return maNameCI; + } // Request parameter-information (not for objects) const_cast(this)->GetInfo(); // Append nothing, if it is a simple property (no empty brackets) -- cgit