@ -58,6 +58,8 @@ namespace Google.Protobuf
/// </remarks>
/// </remarks>
public sealed partial class CodedOutputStream : ICodedOutputStream
public sealed partial class CodedOutputStream : ICodedOutputStream
{
{
private static readonly Encoding UTF8 = Encoding . UTF8 ;
/// <summary>
/// <summary>
/// The buffer size used by CreateInstance(Stream).
/// The buffer size used by CreateInstance(Stream).
/// </summary>
/// </summary>
@ -294,16 +296,26 @@ namespace Google.Protobuf
WriteTag ( fieldNumber , WireFormat . WireType . LengthDelimited ) ;
WriteTag ( fieldNumber , WireFormat . WireType . LengthDelimited ) ;
// Optimise the case where we have enough space to write
// Optimise the case where we have enough space to write
// the string directly to the buffer, which should be common.
// the string directly to the buffer, which should be common.
int length = Encoding . UTF8 . GetByteCount ( value ) ;
int length = UTF8 . GetByteCount ( value ) ;
WriteRawVarint32 ( ( uint ) length ) ;
WriteRawVarint32 ( ( uint ) length ) ;
if ( limit - position > = length )
if ( limit - position > = length )
{
{
Encoding . UTF8 . GetBytes ( value , 0 , value . Length , buffer , position ) ;
if ( length = = value . Length ) // Must be all ASCII...
{
for ( int i = 0 ; i < length ; i + + )
{
buffer [ position + i ] = ( byte ) value [ i ] ;
}
}
else
{
UTF8 . GetBytes ( value , 0 , value . Length , buffer , position ) ;
}
position + = length ;
position + = length ;
}
}
else
else
{
{
byte [ ] bytes = Encoding . UTF8 . GetBytes ( value ) ;
byte [ ] bytes = UTF8 . GetBytes ( value ) ;
WriteRawBytes ( bytes ) ;
WriteRawBytes ( bytes ) ;
}
}
}
}