diff options
author | Jon Skeet <skeet@pobox.com> | 2008-08-14 20:37:11 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2008-08-14 20:37:11 +0100 |
commit | 3b3150881a677e3c8e1ceda5be25bb1ac9a725ea (patch) | |
tree | 396bea118f605ef8cc30d67533a4231e8b4d558d /csharp/ProtocolBuffers | |
parent | 0677933d9efbd322c0b310068b03d871eea3a49d (diff) | |
download | protobuf-3b3150881a677e3c8e1ceda5be25bb1ac9a725ea.tar.gz protobuf-3b3150881a677e3c8e1ceda5be25bb1ac9a725ea.tar.bz2 protobuf-3b3150881a677e3c8e1ceda5be25bb1ac9a725ea.zip |
Optimisations of IsInitialized and removal of unnecessary references.
Diffstat (limited to 'csharp/ProtocolBuffers')
-rw-r--r-- | csharp/ProtocolBuffers/ExtendableMessage.cs | 8 | ||||
-rw-r--r-- | csharp/ProtocolBuffers/GeneratedMessage.cs | 34 | ||||
-rw-r--r-- | csharp/ProtocolBuffers/ProtocolBuffers.csproj | 2 |
3 files changed, 41 insertions, 3 deletions
diff --git a/csharp/ProtocolBuffers/ExtendableMessage.cs b/csharp/ProtocolBuffers/ExtendableMessage.cs index c3b37dd5..a4a6e17e 100644 --- a/csharp/ProtocolBuffers/ExtendableMessage.cs +++ b/csharp/ProtocolBuffers/ExtendableMessage.cs @@ -67,12 +67,18 @@ namespace Google.ProtocolBuffers { } /// <summary> - /// Called by subclasses to check if all extensions are initialized. + /// Called to check if all extensions are initialized. /// </summary> protected bool ExtensionsAreInitialized { get { return extensions.IsInitialized; } } + public override bool IsInitialized { + get { + return base.IsInitialized && ExtensionsAreInitialized; + } + } + #region Reflection public override IDictionary<FieldDescriptor, object> AllFields { get { diff --git a/csharp/ProtocolBuffers/GeneratedMessage.cs b/csharp/ProtocolBuffers/GeneratedMessage.cs index e1de84e1..479986f6 100644 --- a/csharp/ProtocolBuffers/GeneratedMessage.cs +++ b/csharp/ProtocolBuffers/GeneratedMessage.cs @@ -18,6 +18,7 @@ using System.Collections.Generic; using Google.ProtocolBuffers.Collections; using Google.ProtocolBuffers.Descriptors; using Google.ProtocolBuffers.FieldAccess; +using System.Collections; namespace Google.ProtocolBuffers { @@ -60,6 +61,39 @@ namespace Google.ProtocolBuffers { return ret; } + public override bool IsInitialized { + get { + // Check that all required fields are present. + foreach (FieldDescriptor field in DescriptorForType.Fields) { + if (field.IsRequired && !HasField(field)) { + return false; + } + } + + // Check that embedded messages are initialized. + // This code is similar to that in AbstractMessage, but we don't + // fetch all the field values - just the ones we need to. + foreach (FieldDescriptor field in DescriptorForType.Fields) { + if (field.MappedType == MappedType.Message) { + if (field.IsRepeated) { + // We know it's an IList<T>, but not the exact type - so + // IEnumerable is the best we can do. (C# generics aren't covariant yet.) + foreach (IMessage element in (IEnumerable) this[field]) { + if (!element.IsInitialized) { + return false; + } + } + } else { + if (!((IMessage) this[field]).IsInitialized) { + return false; + } + } + } + } + return true; + } + } + public override IDictionary<FieldDescriptor, object> AllFields { get { return Dictionaries.AsReadOnly(GetMutableFieldMap()); } } diff --git a/csharp/ProtocolBuffers/ProtocolBuffers.csproj b/csharp/ProtocolBuffers/ProtocolBuffers.csproj index adae31b4..e74d94db 100644 --- a/csharp/ProtocolBuffers/ProtocolBuffers.csproj +++ b/csharp/ProtocolBuffers/ProtocolBuffers.csproj @@ -34,8 +34,6 @@ </PropertyGroup> <ItemGroup> <Reference Include="System" /> - <Reference Include="System.Data" /> - <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Compile Include="AbstractBuilder.cs" /> |