/// <summary> /// Set current with <paramref name="s"/>. /// </summary> /// <param name="s">String to convert into UTF-8.</param> public void SetString(string s) { if (s != null) { // This code is not optimized. One could actually read the string and copy the content // directly in _handle without hitting any allocation. This would require us to include // the logic of converting .NET strings into UTF8 ourselves, something we do not want // to do for the time being. For now we only avoid the allocation of an extra byte array // for small strings (see the implementation of GetUtf8Bytes). int nb; byte[] bytes = GetUtf8Bytes(s, out nb); if (nb >= _capacity) { // By default increase size by the max of 50% or new capacity nb. int newSize = Math.Max(_capacity + _capacity / 2, nb + 1); IntPtr lPtr = SDL.SDL_realloc(_handle, (IntPtr)newSize); if (lPtr == IntPtr.Zero) { Dispose(); throw new OutOfMemoryException("Cannot reallocate Utf8String"); } _handle = lPtr; _capacity = newSize; } _count = nb; Marshal.Copy(bytes, 0, _handle, nb); ((byte *)_handle)[nb] = 0; } else { Dispose(); } Contract.Ensures(String().Equals(s), "string_set"); }