You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2020/07/29 17:11:13 UTC
[lucenenet] 08/14:
Lucene.Net.Support.IO.FileSupport::CreateTempFile(): Optimized the check
for invalid characters to shave off a few ns
This is an automated email from the ASF dual-hosted git repository.
nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git
commit 75f4e0b0ed6980a9f8c025ce85bc74dfc93dd531
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Fri Jul 24 08:53:47 2020 +0700
Lucene.Net.Support.IO.FileSupport::CreateTempFile(): Optimized the check for invalid characters to shave off a few ns
---
src/Lucene.Net/Support/IO/FileSupport.cs | 15 +++----
src/Lucene.Net/Support/Text/StringExtensions.cs | 52 +++++++++++++++++++++++++
2 files changed, 60 insertions(+), 7 deletions(-)
diff --git a/src/Lucene.Net/Support/IO/FileSupport.cs b/src/Lucene.Net/Support/IO/FileSupport.cs
index 2fdaf9d..a4b903c 100644
--- a/src/Lucene.Net/Support/IO/FileSupport.cs
+++ b/src/Lucene.Net/Support/IO/FileSupport.cs
@@ -1,8 +1,9 @@
+using Lucene.Net.Support.Text;
using Lucene.Net.Util;
using System;
using System.Collections.Concurrent;
+using System.Collections.Generic;
using System.IO;
-using System.Linq;
using System.Text;
namespace Lucene.Net.Support.IO
@@ -29,6 +30,8 @@ namespace Lucene.Net.Support.IO
/// </summary>
internal static class FileSupport
{
+ private static readonly char[] INVALID_FILENAME_CHARS = Path.GetInvalidFileNameChars();
+
// LUCNENENET NOTE: Lookup the HResult value we are interested in for the current OS
// by provoking the exception during initialization and caching its HResult value for later.
// We optimize for Windows because those HResult values are known and documented, but for
@@ -157,12 +160,10 @@ namespace Lucene.Net.Support.IO
throw new ArgumentException("Prefix string too short");
// Ensure the strings passed don't contain invalid characters
- char[] invalid = Path.GetInvalidFileNameChars();
-
- if (prefix.ToCharArray().Intersect(invalid).Any())
- throw new ArgumentException(string.Format("Prefix contains invalid characters. You may not use any of '{0}'", string.Join(", ", invalid)));
- if (suffix != null && suffix.ToCharArray().Intersect(invalid).Any())
- throw new ArgumentException(string.Format("Suffix contains invalid characters. You may not use any of '{0}'", string.Join(", ", invalid)));
+ if (prefix.ContainsAny(INVALID_FILENAME_CHARS))
+ throw new ArgumentException(string.Format("Prefix contains invalid characters. You may not use any of '{0}'", string.Join(", ", INVALID_FILENAME_CHARS)));
+ if (suffix != null && suffix.ContainsAny(INVALID_FILENAME_CHARS))
+ throw new ArgumentException(string.Format("Suffix contains invalid characters. You may not use any of '{0}'", string.Join(", ", INVALID_FILENAME_CHARS)));
// If no directory supplied, create one.
if (directory == null)
diff --git a/src/Lucene.Net/Support/Text/StringExtensions.cs b/src/Lucene.Net/Support/Text/StringExtensions.cs
new file mode 100644
index 0000000..3886a0e
--- /dev/null
+++ b/src/Lucene.Net/Support/Text/StringExtensions.cs
@@ -0,0 +1,52 @@
+using J2N.Text;
+using System;
+using System.Runtime.CompilerServices;
+
+namespace Lucene.Net.Support.Text
+{
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ /// <summary>
+ /// Extensions to <see cref="string"/>.
+ /// </summary>
+ internal static class StringExtensions
+ {
+ /// <summary>
+ /// Returns <c>true</c> if <paramref name="input"/> contains any character from <paramref name="charsToCompare"/>.
+ /// </summary>
+ /// <param name="input">The string in which to seek characters from <paramref name="charsToCompare"/>.</param>
+ /// <param name="charsToCompare">An array of characters to check.</param>
+ /// <returns><c>true</c> if any <paramref name="charsToCompare"/> are found, otherwise; <c>false</c>.</returns>
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static bool ContainsAny(this string input, char[] charsToCompare)
+ {
+ if (input == null)
+ throw new ArgumentNullException(nameof(input));
+ if (charsToCompare == null)
+ throw new ArgumentNullException(nameof(charsToCompare));
+
+ // Ensure the strings passed don't contain invalid characters
+ for (int i = 0; i < charsToCompare.Length; i++)
+ {
+ if (input.Contains(charsToCompare[i]))
+ return true;
+ }
+ return false;
+ }
+ }
+}