Skip to content

Commit 4c17d83

Browse files
Use ReadOnlySpan<> in arguments (#408)
* Use `ReadOnlySpan<>` in arguments * Refactor logging methods * Refactor logging methods * Refactor logging methods * GetIndex() * DebugRegion * CreatePrimaryKey * AssociateMappedFields * Update Orm/Xtensive.Orm/InternalLogs.cs Co-authored-by: Sergey Naumenko <152863015+snaumenko-st@users.noreply.github.com> --------- Co-authored-by: Sergey Naumenko <152863015+snaumenko-st@users.noreply.github.com>
1 parent c17c922 commit 4c17d83

File tree

13 files changed

+118
-120
lines changed

13 files changed

+118
-120
lines changed

Orm/Xtensive.Orm.Tests.Core/Diagnostics/LogMessageTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public void PerformanceTest()
5757
}
5858
catch (Exception e)
5959
{
60-
TestLog.Warning(e, "Message for {0} log parameters.", param2);
60+
TestLog.Warning(e, "Message for {0} log parameters.", [param2]);
6161
}
6262

6363
TestLog.InfoRegion("Fatal error logs");
@@ -73,4 +73,4 @@ public void PerformanceTest()
7373

7474
}
7575
}
76-
}
76+
}

Orm/Xtensive.Orm.Tests.Framework/Dynamic.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2226,12 +2226,12 @@ private void ValidateToken(TokenId t)
22262226
if (token.id != t) throw ParseError(Res.SyntaxError);
22272227
}
22282228

2229-
private Exception ParseError(string format, params object[] args)
2229+
private Exception ParseError(string format, params ReadOnlySpan<object> args)
22302230
{
22312231
return ParseError(token.pos, format, args);
22322232
}
22332233

2234-
private Exception ParseError(int pos, string format, params object[] args)
2234+
private Exception ParseError(int pos, string format, params ReadOnlySpan<object> args)
22352235
{
22362236
return new ParseException(string.Format(CultureInfo.CurrentCulture, format, args), pos);
22372237
}

Orm/Xtensive.Orm/InternalLogs.cs

Lines changed: 72 additions & 72 deletions
Large diffs are not rendered by default.

Orm/Xtensive.Orm/InternalLogs.tt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@ namespace Xtensive
2020
return instance.IsLogged(type);
2121
}
2222

23-
public static IndentManager.IndentScope DebugRegion(string messageId, params object[] args)
23+
public static IndentManager.IndentScope DebugRegion(string messageId, params ReadOnlySpan<object> args)
2424
{
2525
return instance.DebugRegion(format, args);
2626
}
2727

28-
public static IndentManager.IndentScope InfoRegion(string messageId, params object[] args)
28+
public static IndentManager.IndentScope InfoRegion(string messageId, params ReadOnlySpan<object> args)
2929
{
3030
return instance.InfoRegion(format, args);
3131
}
3232

3333
<# foreach (var level in logLevels) { #>
34-
public static void <#= level #>(string messageId, params object[] args)
34+
public static void <#= level #>(string messageId, params ReadOnlySpan<object> args)
3535
{
3636
instance.<#= level #>(format, args);
3737
}
3838

39-
public static Exception <#= level #>(Exception exception, string messageId, params object[] args)
39+
public static Exception <#= level #>(Exception exception, string messageId, params ReadOnlySpan<object> args)
4040
{
4141
instance.<#= level #>(format, args, exception);
4242
return exception;
@@ -68,4 +68,4 @@ namespace Xtensive
6868
new Tuple<string, string>("SqlLog", "Xtensive.Orm.Sql"),
6969
new Tuple<string, string>("CoreLog", "Xtensive.Orm.Core"),
7070
new Tuple<string, string>("TestLog", "Xtensive.Orm.Tests")};
71-
#>
71+
#>

Orm/Xtensive.Orm/Orm/Logging/BaseLog.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,15 @@ public abstract class BaseLog
3535
/// </param>
3636
/// <param name="parameters">Values of parameters in <paramref name="messageId"/> (resource string or message itself).</param>
3737
/// <returns><see cref="IDisposable"/> object. Region will closed by disposing of this object.</returns>
38-
public IndentManager.IndentScope DebugRegion(string messageId, params object[] parameters)
38+
public IndentManager.IndentScope DebugRegion(string messageId, params ReadOnlySpan<object> parameters)
3939
{
4040
ArgumentNullException.ThrowIfNull(messageId, "message");
4141
if (!IsLogged(LogLevel.Debug))
4242
return IndentManager.IncreaseIndent();
4343
var message = Strings.ResourceManager.GetString(messageId, Strings.Culture) ?? messageId;
44-
var title = parameters!=null ? string.Format(message, parameters) : message;
45-
var titleParams = new object[] { title };
46-
Debug(nameof(Strings.LogRegionBegin), titleParams);
47-
return IndentManager.IncreaseIndent(() => Debug(nameof(Strings.LogRegionEnd), titleParams));
44+
var title = parameters.Length > 0 ? string.Format(message, parameters) : message;
45+
Debug(nameof(Strings.LogRegionBegin), [title]);
46+
return IndentManager.IncreaseIndent(() => Debug(nameof(Strings.LogRegionEnd), [title]));
4847
}
4948

5049
/// <summary>
@@ -58,13 +57,13 @@ public IndentManager.IndentScope DebugRegion(string messageId, params object[] p
5857
/// Values of parameters in <paramref name="messageId"/> (resource string or message itself).
5958
/// </param>
6059
/// <returns><see cref="IDisposable"/> object. Region will closed by disposing of this object.</returns>
61-
public IndentManager.IndentScope InfoRegion(string messageId, params object[] parameters)
60+
public IndentManager.IndentScope InfoRegion(string messageId, params ReadOnlySpan<object> parameters)
6261
{
6362
ArgumentNullException.ThrowIfNull(messageId, "message");
6463
if (!IsLogged(LogLevel.Info))
6564
return IndentManager.IncreaseIndent();
6665
var message = Strings.ResourceManager.GetString(messageId, Strings.Culture) ?? messageId;
67-
var title = parameters!=null ? string.Format(message, parameters) : message;
66+
var title = parameters.Length > 0 ? string.Format(message, parameters) : message;
6867
Info(string.Format(Strings.LogRegionBegin, title));
6968
return IndentManager.IncreaseIndent(() => Info(string.Format(Strings.LogRegionEnd, title)));
7069
}
@@ -79,7 +78,7 @@ public IndentManager.IndentScope InfoRegion(string messageId, params object[] pa
7978
/// Values of parameters in <paramref name="messageId"/> (resource string or message itself).
8079
/// </param>
8180
/// <param name="exception">Exception, which must be written.</param>
82-
public virtual void Debug(string messageId, object[] parameters = null, Exception exception = null) =>
81+
public virtual void Debug(string messageId, ReadOnlySpan<object> parameters = default, Exception exception = null) =>
8382
Write(LogLevel.Debug, messageId, parameters, exception);
8483

8584
/// <summary>
@@ -91,7 +90,7 @@ public virtual void Debug(string messageId, object[] parameters = null, Exceptio
9190
/// Values of parameters in <paramref name="messageId"/> (resource string or message itself).
9291
/// </param>
9392
/// <param name="exception">Exception, which must be written.</param>
94-
public virtual void Info(string messageId, object[] parameters = null, Exception exception = null) =>
93+
public virtual void Info(string messageId, ReadOnlySpan<object> parameters = default, Exception exception = null) =>
9594
Write(LogLevel.Info, messageId, parameters, exception);
9695

9796
/// <summary>
@@ -104,7 +103,7 @@ public virtual void Info(string messageId, object[] parameters = null, Exception
104103
/// Values of parameters in <paramref name="messageId"/> (resource string or message itself).
105104
/// </param>
106105
/// <param name="exception">Exception, which must be written.</param>
107-
public virtual void Warning(string messageId, object[] parameters = null, Exception exception = null) =>
106+
public virtual void Warning(string messageId, ReadOnlySpan<object> parameters = default, Exception exception = null) =>
108107
Write(LogLevel.Warning, messageId, parameters, exception);
109108

110109
/// <summary>
@@ -117,7 +116,7 @@ public virtual void Warning(string messageId, object[] parameters = null, Except
117116
/// Values of parameters in <paramref name="messageId"/> (resource string or message itself).
118117
/// </param>
119118
/// <param name="exception">Exception, which must be written.</param>
120-
public virtual void Error(string messageId, object[] parameters = null, Exception exception = null) =>
119+
public virtual void Error(string messageId, ReadOnlySpan<object> parameters = default, Exception exception = null) =>
121120
Write(LogLevel.Error, messageId, parameters, exception);
122121

123122
/// <summary>
@@ -130,10 +129,10 @@ public virtual void Error(string messageId, object[] parameters = null, Exceptio
130129
/// Values of parameters in <paramref name="messageId"/> (resource string or message itself).
131130
/// </param>
132131
/// <param name="exception">Exception, which must be written.</param>
133-
public virtual void FatalError(string messageId, object[] parameters = null, Exception exception = null) =>
132+
public virtual void FatalError(string messageId, ReadOnlySpan<object> parameters = default, Exception exception = null) =>
134133
Write(LogLevel.FatalError, messageId, parameters, exception);
135134

136-
private void Write(LogLevel logLevel, string messageId, object[] parameters, Exception exception)
135+
private void Write(LogLevel logLevel, string messageId, ReadOnlySpan<object> parameters, Exception exception)
137136
{
138137
var message = string.IsNullOrEmpty(messageId)
139138
? null

Orm/Xtensive.Orm/Orm/Logging/Internals/NullLog.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,23 @@ public override bool IsLogged(LogLevel eventTypes)
1515
return false;
1616
}
1717

18-
public override void Debug(string message, object[] parameters = null, Exception exception = null)
18+
public override void Debug(string message, ReadOnlySpan<object> parameters = default, Exception exception = null)
1919
{
2020
}
2121

22-
public override void Info(string message, object[] parameters = null, Exception exception = null)
22+
public override void Info(string message, ReadOnlySpan<object> parameters = default, Exception exception = null)
2323
{
2424
}
2525

26-
public override void Warning(string message, object[] parameters = null, Exception exception = null)
26+
public override void Warning(string message, ReadOnlySpan<object> parameters = default, Exception exception = null)
2727
{
2828
}
2929

30-
public override void Error(string message, object[] parameters = null, Exception exception = null)
30+
public override void Error(string message, ReadOnlySpan<object> parameters = default, Exception exception = null)
3131
{
3232
}
3333

34-
public override void FatalError(string message, object[] parameters = null, Exception exception = null)
34+
public override void FatalError(string message, ReadOnlySpan<object> parameters = default, Exception exception = null)
3535
{
3636
}
3737

@@ -44,4 +44,4 @@ public NullLog(string name)
4444
{
4545
}
4646
}
47-
}
47+
}

Orm/Xtensive.Orm/Orm/Logging/LogEventInfo.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ public override string ToString()
5252
return builder.ToString();
5353
}
5454

55-
private static string FormatMessage(string message, object[] parameters)
55+
private static string FormatMessage(string message, ReadOnlySpan<object> parameters)
5656
{
5757
if (string.IsNullOrEmpty(message))
5858
return null;
59-
if (parameters==null || parameters.Length==0) {
59+
if (parameters.Length == 0) {
6060
return message;
6161
}
6262
try {
@@ -83,7 +83,7 @@ private static string AppendIndent(string message)
8383
/// <param name="message">Log message.</param>
8484
/// <param name="parameters">Format parameters for log message.</param>
8585
/// <param name="exception">Exception.</param>
86-
public LogEventInfo(string source, LogLevel level, string message = null, object[] parameters = null, Exception exception = null)
86+
public LogEventInfo(string source, LogLevel level, string message = null, ReadOnlySpan<object> parameters = default, Exception exception = null)
8787
{
8888
Source = source;
8989
Level = level;

Orm/Xtensive.Orm/Orm/Model/TypeIndexInfoCollection.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,15 @@ public IndexInfo FindFirst(IndexAttributes indexAttributes) =>
4848
Find(indexAttributes).FirstOrDefault();
4949

5050
[DebuggerStepThrough]
51-
public IndexInfo GetIndex(string fieldName, params string[] fieldNames)
51+
public IndexInfo GetIndex(string fieldName, params ReadOnlySpan<string> fieldNames)
5252
{
53-
var names = (fieldNames ?? Array.Empty<string>()).Prepend(fieldName);
54-
5553
var fields = new List<FieldInfo>();
5654
var reflectedTypeFields = primaryIndex.ReflectedType.Fields;
57-
foreach (var name in names) {
58-
if (reflectedTypeFields.TryGetValue(name, out var field)) {
55+
if (reflectedTypeFields.TryGetValue(fieldName, out var field)) {
56+
fields.Add(field);
57+
}
58+
foreach (var name in fieldNames) {
59+
if (reflectedTypeFields.TryGetValue(name, out field)) {
5960
fields.Add(field);
6061
}
6162
}

Orm/Xtensive.Orm/Orm/QueryEndpoint.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -954,12 +954,10 @@ public IQueryable<TElement> Items<TElement>(Expression<Func<EntitySet<TElement>>
954954
#region Private / internal methods
955955

956956
/// <exception cref="ArgumentException"><paramref name="keyValues"/> array is empty.</exception>
957-
private Key GetKeyByValues<T>(object[] keyValues)
957+
private Key GetKeyByValues<T>(ReadOnlySpan<object> keyValues)
958958
where T : class, IEntity
959959
{
960-
ArgumentNullException.ThrowIfNull(keyValues);
961-
if (keyValues.Length == 0)
962-
throw new ArgumentException(Strings.ExKeyValuesArrayIsEmpty, "keyValues");
960+
ArgumentOutOfRangeException.ThrowIfZero(keyValues.Length);
963961
if (keyValues.Length == 1) {
964962
switch (keyValues[0]) {
965963
case Key key:
@@ -969,7 +967,7 @@ private Key GetKeyByValues<T>(object[] keyValues)
969967
}
970968
}
971969
var session = Session;
972-
return Key.Create(session.Domain, session.StorageNodeId, typeof(T), TypeReferenceAccuracy.BaseType, keyValues);
970+
return Key.Create(session.Domain, session.StorageNodeId, session.Domain.Model.Types[typeof(T)], TypeReferenceAccuracy.BaseType, keyValues);
973971
}
974972

975973
private Expression BuildRootExpression(Type elementType)

Orm/Xtensive.Orm/Orm/Upgrade/Internals/HintGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,7 @@ private static (string, string)[] AssociateMappedKeyFields(
949949
: null;
950950
}
951951

952-
private static (string, string)[] AssociateMappedFields(params (StoredFieldInfo, StoredFieldInfo)[] fieldsToProcess)
952+
private static (string, string)[] AssociateMappedFields(params ReadOnlySpan<(StoredFieldInfo, StoredFieldInfo)> fieldsToProcess)
953953
{
954954
var result = new ChainedBuffer<(StoredFieldInfo, StoredFieldInfo)>();
955955
var tasks = new Queue<(StoredFieldInfo, StoredFieldInfo)>();

0 commit comments

Comments
 (0)