Files
OpenRA/OpenRA.Mods.Cnc/FileFormats/XccGlobalDatabase.cs
RoosterDragon 7c8dc5d5f4 XccGlobalDatabase allocation improvements
- Use the count to size the capacity of the list.
- Use a char array as a buffer, so will can build each string directly rather than needing a ToArray call first.
2020-10-20 22:53:32 +02:00

61 lines
1.3 KiB
C#

#region Copyright & License Information
/*
* Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.IO;
namespace OpenRA.Mods.Cnc.FileFormats
{
public sealed class XccGlobalDatabase : IDisposable
{
public readonly string[] Entries;
readonly Stream s;
public XccGlobalDatabase(Stream stream)
{
s = stream;
var entries = new List<string>();
var chars = new char[32];
while (s.Peek() > -1)
{
var count = s.ReadInt32();
entries.Capacity += count;
for (var i = 0; i < count; i++)
{
// Read filename
byte c;
var charsIndex = 0;
while ((c = s.ReadUInt8()) != 0)
{
if (charsIndex >= chars.Length)
Array.Resize(ref chars, chars.Length * 2);
chars[charsIndex++] = (char)c;
}
entries.Add(new string(chars, 0, charsIndex));
// Skip comment
while (s.ReadUInt8() != 0) { }
}
}
Entries = entries.ToArray();
}
public void Dispose()
{
s.Dispose();
}
}
}