aboutsummaryrefslogtreecommitdiff
path: root/src/ProtocolBuffers
diff options
context:
space:
mode:
authorcsharptest <roger@csharptest.net>2011-06-02 12:04:06 -0500
committerrogerk <devnull@localhost>2011-06-02 12:04:06 -0500
commit27bfcc5e1a7a3aacd828475c1996e114e34055d2 (patch)
tree8a4d0adf6cab44a934c21a7656fc8226b81556fc /src/ProtocolBuffers
parent45a93fad4d7123887d14135ee15ee3e9b0d4ca58 (diff)
downloadprotobuf-27bfcc5e1a7a3aacd828475c1996e114e34055d2.tar.gz
protobuf-27bfcc5e1a7a3aacd828475c1996e114e34055d2.tar.bz2
protobuf-27bfcc5e1a7a3aacd828475c1996e114e34055d2.zip
Slight refactoring of Extensions to support lookup by name, added compatibility tests for text and binary formats.
Diffstat (limited to 'src/ProtocolBuffers')
-rw-r--r--src/ProtocolBuffers/ByteString.cs7
-rw-r--r--src/ProtocolBuffers/ExtensionInfo.cs2
-rw-r--r--src/ProtocolBuffers/ExtensionRegistry.cs57
-rw-r--r--src/ProtocolBuffers/ExtensionRegistryLite.cs57
-rw-r--r--src/ProtocolBuffers/FieldSet.cs1
-rw-r--r--src/ProtocolBuffers/GeneratedExtensionLite.cs12
-rw-r--r--src/ProtocolBuffers/TextFormat.cs14
-rw-r--r--src/ProtocolBuffers/WireFormat.cs6
8 files changed, 89 insertions, 67 deletions
diff --git a/src/ProtocolBuffers/ByteString.cs b/src/ProtocolBuffers/ByteString.cs
index 83d4a2df..e645a9f2 100644
--- a/src/ProtocolBuffers/ByteString.cs
+++ b/src/ProtocolBuffers/ByteString.cs
@@ -91,7 +91,12 @@ namespace Google.ProtocolBuffers
public byte[] ToByteArray()
{
- return (byte[]) bytes.Clone();
+ return (byte[])bytes.Clone();
+ }
+
+ public string ToBase64()
+ {
+ return Convert.ToBase64String(bytes);
}
/// <summary>
diff --git a/src/ProtocolBuffers/ExtensionInfo.cs b/src/ProtocolBuffers/ExtensionInfo.cs
index 8ea1f9eb..4f11d3bb 100644
--- a/src/ProtocolBuffers/ExtensionInfo.cs
+++ b/src/ProtocolBuffers/ExtensionInfo.cs
@@ -75,7 +75,7 @@ namespace Google.ProtocolBuffers
object IGeneratedExtensionLite.ContainingType
{
- get { return Descriptor; }
+ get { return Descriptor.ContainingType; }
}
IMessageLite IGeneratedExtensionLite.MessageDefaultInstance
diff --git a/src/ProtocolBuffers/ExtensionRegistry.cs b/src/ProtocolBuffers/ExtensionRegistry.cs
index 60f2633b..98f2fb4d 100644
--- a/src/ProtocolBuffers/ExtensionRegistry.cs
+++ b/src/ProtocolBuffers/ExtensionRegistry.cs
@@ -93,53 +93,27 @@ namespace Google.ProtocolBuffers
/// </remarks>
public sealed partial class ExtensionRegistry
{
-#if !LITE
- private static readonly ExtensionRegistry empty = new ExtensionRegistry(
- new Dictionary<string, ExtensionInfo>(),
- new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(),
- true);
-
- private readonly IDictionary<string, ExtensionInfo> extensionsByName;
-
- private ExtensionRegistry(IDictionary<String, ExtensionInfo> extensionsByName,
- IDictionary<ExtensionIntPair, IGeneratedExtensionLite> extensionsByNumber,
- bool readOnly)
- : this(extensionsByNumber, readOnly)
- {
- this.extensionsByName = extensionsByName;
- }
-
- /// <summary>
- /// Construct a new, empty instance.
- /// </summary>
- public static ExtensionRegistry CreateInstance()
- {
- return new ExtensionRegistry(new Dictionary<string, ExtensionInfo>(),
- new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(), false);
- }
-
- public ExtensionRegistry AsReadOnly()
- {
- return new ExtensionRegistry(extensionsByName, extensionsByNumber, true);
- }
-#endif
-
/// <summary>
/// Finds an extension by fully-qualified field name, in the
/// proto namespace, i.e. result.Descriptor.FullName will match
/// <paramref name="fullName"/> if a match is found. A null
/// reference is returned if the extension can't be found.
/// </summary>
+ [Obsolete("Please use the FindByName method instead.", true)]
public ExtensionInfo this[string fullName]
{
get
{
- ExtensionInfo ret;
- extensionsByName.TryGetValue(fullName, out ret);
- return ret;
+ foreach (IGeneratedExtensionLite ext in extensionsByNumber.Values)
+ {
+ if (StringComparer.Ordinal.Equals(ext.Descriptor.FullName, fullName))
+ return ext as ExtensionInfo;
+ }
+ return null;
}
}
+#if !LITE
/// <summary>
/// Finds an extension by containing type and field number.
/// A null reference is returned if the extension can't be found.
@@ -154,6 +128,12 @@ namespace Google.ProtocolBuffers
}
}
+ public ExtensionInfo FindByName(MessageDescriptor containingType, string fieldName)
+ {
+ return FindExtensionByName(containingType, fieldName) as ExtensionInfo;
+ }
+#endif
+
/// <summary>
/// Add an extension from a generated file to the registry.
/// </summary>
@@ -210,9 +190,8 @@ namespace Google.ProtocolBuffers
+ "regular (non-extension) field.");
}
- extensionsByName[extension.Descriptor.FullName] = extension;
- extensionsByNumber[new ExtensionIntPair(extension.Descriptor.ContainingType,
- extension.Descriptor.FieldNumber)] = extension;
+ IGeneratedExtensionLite liteExtension = extension;
+ Add(liteExtension);
FieldDescriptor field = extension.Descriptor;
if (field.ContainingType.Options.MessageSetWireFormat
@@ -223,7 +202,9 @@ namespace Google.ProtocolBuffers
// This is an extension of a MessageSet type defined within the extension
// type's own scope. For backwards-compatibility, allow it to be looked
// up by type name.
- extensionsByName[field.MessageType.FullName] = extension;
+ Dictionary<string, IGeneratedExtensionLite> map;
+ if (extensionsByName.TryGetValue(liteExtension.ContainingType, out map))
+ map[field.MessageType.FullName] = extension;
}
}
}
diff --git a/src/ProtocolBuffers/ExtensionRegistryLite.cs b/src/ProtocolBuffers/ExtensionRegistryLite.cs
index fc662f68..91a0ce29 100644
--- a/src/ProtocolBuffers/ExtensionRegistryLite.cs
+++ b/src/ProtocolBuffers/ExtensionRegistryLite.cs
@@ -36,6 +36,7 @@
using System.Collections.Generic;
using System;
+using Google.ProtocolBuffers.Descriptors;
namespace Google.ProtocolBuffers
{
@@ -92,37 +93,39 @@ namespace Google.ProtocolBuffers
/// </remarks>
public sealed partial class ExtensionRegistry
{
- private readonly IDictionary<ExtensionIntPair, IGeneratedExtensionLite> extensionsByNumber;
+ class ExtensionByNameMap : Dictionary<object, Dictionary<string, IGeneratedExtensionLite>> { }
+ class ExtensionByIdMap : Dictionary<ExtensionIntPair, IGeneratedExtensionLite> { }
+
+ private static readonly ExtensionRegistry empty = new ExtensionRegistry(
+ new ExtensionByNameMap(),
+ new ExtensionByIdMap(),
+ true);
+
+ private readonly ExtensionByNameMap extensionsByName;
+ private readonly ExtensionByIdMap extensionsByNumber;
+
private readonly bool readOnly;
- private ExtensionRegistry(IDictionary<ExtensionIntPair, IGeneratedExtensionLite> extensionsByNumber,
- bool readOnly)
+ private ExtensionRegistry(ExtensionByNameMap byName, ExtensionByIdMap byNumber, bool readOnly)
{
- this.extensionsByNumber = extensionsByNumber;
+ this.extensionsByName = byName;
+ this.extensionsByNumber = byNumber;
this.readOnly = readOnly;
}
-#if LITE
- private static readonly ExtensionRegistry empty = new ExtensionRegistry(
- new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(),
- true);
-
/// <summary>
/// Construct a new, empty instance.
/// </summary>
public static ExtensionRegistry CreateInstance()
{
- return new ExtensionRegistry(
- new Dictionary<ExtensionIntPair, IGeneratedExtensionLite>(), false);
+ return new ExtensionRegistry(new ExtensionByNameMap(), new ExtensionByIdMap(), false);
}
public ExtensionRegistry AsReadOnly()
{
- return new ExtensionRegistry(extensionsByNumber, true);
+ return new ExtensionRegistry(extensionsByName, extensionsByNumber, true);
}
-#endif
-
/// <summary>
/// Get the unmodifiable singleton empty instance.
/// </summary>
@@ -145,6 +148,18 @@ namespace Google.ProtocolBuffers
}
}
+ public IGeneratedExtensionLite FindByName(IMessageLite defaultInstanceOfType, string fieldName)
+ { return FindExtensionByName(defaultInstanceOfType, fieldName); }
+
+ IGeneratedExtensionLite FindExtensionByName(object forwhat, string fieldName)
+ {
+ IGeneratedExtensionLite extension = null;
+ Dictionary<string, IGeneratedExtensionLite> map;
+ if (extensionsByName.TryGetValue(forwhat, out map) && map.TryGetValue(fieldName, out extension))
+ return extension;
+ return null;
+ }
+
/// <summary>
/// Add an extension from a generated file to the registry.
/// </summary>
@@ -154,9 +169,13 @@ namespace Google.ProtocolBuffers
{
throw new InvalidOperationException("Cannot add entries to a read-only extension registry");
}
- extensionsByNumber.Add(
- new ExtensionIntPair(extension.ContainingType, extension.Number),
- extension);
+ extensionsByNumber.Add(new ExtensionIntPair(extension.ContainingType, extension.Number), extension);
+
+ Dictionary<string, IGeneratedExtensionLite> map;
+ if (!extensionsByName.TryGetValue(extension.ContainingType, out map))
+ extensionsByName.Add(extension.ContainingType, map = new Dictionary<string, IGeneratedExtensionLite>());
+ map[extension.Descriptor.Name] = extension;
+ map[extension.Descriptor.FullName] = extension;
}
/// <summary>
@@ -176,7 +195,7 @@ namespace Google.ProtocolBuffers
public override int GetHashCode()
{
- return msgType.GetHashCode()*((1 << 16) - 1) + number;
+ return msgType.GetHashCode() * ((1 << 16) - 1) + number;
}
public override bool Equals(object obj)
@@ -185,7 +204,7 @@ namespace Google.ProtocolBuffers
{
return false;
}
- return Equals((ExtensionIntPair) obj);
+ return Equals((ExtensionIntPair)obj);
}
public bool Equals(ExtensionIntPair other)
diff --git a/src/ProtocolBuffers/FieldSet.cs b/src/ProtocolBuffers/FieldSet.cs
index 5704d63e..46d7ac17 100644
--- a/src/ProtocolBuffers/FieldSet.cs
+++ b/src/ProtocolBuffers/FieldSet.cs
@@ -50,6 +50,7 @@ namespace Google.ProtocolBuffers
bool IsExtension { get; }
bool MessageSetWireFormat { get; } //field.ContainingType.Options.MessageSetWireFormat
int FieldNumber { get; }
+ string Name { get; }
string FullName { get; }
IEnumLiteMap EnumType { get; }
FieldType FieldType { get; }
diff --git a/src/ProtocolBuffers/GeneratedExtensionLite.cs b/src/ProtocolBuffers/GeneratedExtensionLite.cs
index faca1b09..393b6d43 100644
--- a/src/ProtocolBuffers/GeneratedExtensionLite.cs
+++ b/src/ProtocolBuffers/GeneratedExtensionLite.cs
@@ -74,6 +74,18 @@ namespace Google.ProtocolBuffers
this.defaultValue = defaultValue;
}
+ public string Name
+ {
+ get
+ {
+ string name = fullName;
+ int offset = name.LastIndexOf('.');
+ if (offset >= 0)
+ name = name.Substring(offset);
+ return name;
+ }
+ }
+
public string FullName
{
get { return fullName; }
diff --git a/src/ProtocolBuffers/TextFormat.cs b/src/ProtocolBuffers/TextFormat.cs
index 5f6f547c..77aaa8fa 100644
--- a/src/ProtocolBuffers/TextFormat.cs
+++ b/src/ProtocolBuffers/TextFormat.cs
@@ -166,14 +166,22 @@ namespace Google.ProtocolBuffers
{
switch (field.FieldType)
{
+ // The Float and Double types must specify the "r" format to preserve their precision, otherwise,
+ // the double to/from string will trim the precision to 6 places. As with other numeric formats
+ // below, always use the invariant culture so it's predictable.
+ case FieldType.Float:
+ generator.Print(((float)value).ToString("r", CultureInfo.InvariantCulture));
+ break;
+ case FieldType.Double:
+ generator.Print(((double)value).ToString("r", CultureInfo.InvariantCulture));
+ break;
+
case FieldType.Int32:
case FieldType.Int64:
case FieldType.SInt32:
case FieldType.SInt64:
case FieldType.SFixed32:
case FieldType.SFixed64:
- case FieldType.Float:
- case FieldType.Double:
case FieldType.UInt32:
case FieldType.UInt64:
case FieldType.Fixed32:
@@ -670,7 +678,7 @@ namespace Google.ProtocolBuffers
name.Append(tokenizer.ConsumeIdentifier());
}
- extension = extensionRegistry[name.ToString()];
+ extension = extensionRegistry.FindByName(type, name.ToString());
if (extension == null)
{
diff --git a/src/ProtocolBuffers/WireFormat.cs b/src/ProtocolBuffers/WireFormat.cs
index 53a5c826..328d7bc0 100644
--- a/src/ProtocolBuffers/WireFormat.cs
+++ b/src/ProtocolBuffers/WireFormat.cs
@@ -35,12 +35,8 @@
#endregion
using System;
-
-#if !LITE
using Google.ProtocolBuffers.Descriptors;
-#endif
-
namespace Google.ProtocolBuffers
{
/// <summary>
@@ -146,6 +142,7 @@ namespace Google.ProtocolBuffers
return descriptor.IsPacked ? WireType.LengthDelimited : GetWireType(descriptor.FieldType);
}
+#endif
/// <summary>
/// Converts a field type to its wire type. Done with a switch for the sake
/// of speed - this is significantly faster than a dictionary lookup.
@@ -190,6 +187,5 @@ namespace Google.ProtocolBuffers
throw new ArgumentOutOfRangeException("No such field type");
}
}
-#endif
}
} \ No newline at end of file