aboutsummaryrefslogtreecommitdiffhomepage
path: root/csharp
diff options
context:
space:
mode:
authorGravatar Jon Skeet <skeet@pobox.com>2008-08-14 20:37:11 +0100
committerGravatar Jon Skeet <skeet@pobox.com>2008-08-14 20:37:11 +0100
commit3b3150881a677e3c8e1ceda5be25bb1ac9a725ea (patch)
tree396bea118f605ef8cc30d67533a4231e8b4d558d /csharp
parent0677933d9efbd322c0b310068b03d871eea3a49d (diff)
Optimisations of IsInitialized and removal of unnecessary references.
Diffstat (limited to 'csharp')
-rw-r--r--csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj2
-rw-r--r--csharp/ProtocolBuffers/ExtendableMessage.cs8
-rw-r--r--csharp/ProtocolBuffers/GeneratedMessage.cs34
-rw-r--r--csharp/ProtocolBuffers/ProtocolBuffers.csproj2
4 files changed, 41 insertions, 5 deletions
diff --git a/csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj b/csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
index 015451fc..5b3a6f14 100644
--- a/csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
+++ b/csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj
@@ -42,8 +42,6 @@
<HintPath>lib\Rhino.Mocks.dll</HintPath>
</Reference>
<Reference Include="System" />
- <Reference Include="System.Data" />
- <Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AbstractMessageTest.cs" />
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" />