ExtendableBuilder.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Google.ProtocolBuffers.Descriptors;
  5. namespace Google.ProtocolBuffers {
  6. public abstract class ExtendableBuilder<TMessage, TBuilder> : GeneratedBuilder<TMessage, TBuilder>
  7. where TMessage : ExtendableMessage<TMessage, TBuilder>
  8. where TBuilder : GeneratedBuilder<TMessage, TBuilder> {
  9. protected ExtendableBuilder() {}
  10. /// <summary>
  11. /// Checks if a singular extension is present
  12. /// </summary>
  13. public bool HasExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) {
  14. return MessageBeingBuilt.HasExtension(extension);
  15. }
  16. /// <summary>
  17. /// Returns the number of elements in a repeated extension.
  18. /// </summary>
  19. public int GetExtensionCount<TExtension>(GeneratedExtensionBase<TMessage, IList<TExtension>> extension) {
  20. return MessageBeingBuilt.GetExtensionCount(extension);
  21. }
  22. /// <summary>
  23. /// Returns the value of an extension.
  24. /// </summary>
  25. public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) {
  26. return MessageBeingBuilt.GetExtension(extension);
  27. }
  28. /// <summary>
  29. /// Returns one element of a repeated extension.
  30. /// </summary>
  31. public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TMessage, IList<TExtension>> extension, int index) {
  32. return MessageBeingBuilt.GetExtension(extension, index);
  33. }
  34. /// <summary>
  35. /// Sets the value of an extension.
  36. /// </summary>
  37. public ExtendableBuilder<TMessage, TBuilder> SetExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension, TExtension value) {
  38. ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
  39. message.VerifyExtensionContainingType(extension);
  40. message.Extensions[extension.Descriptor] = extension.ToReflectionType(value);
  41. return this;
  42. }
  43. /// <summary>
  44. /// Sets the value of one element of a repeated extension.
  45. /// </summary>
  46. public ExtendableBuilder<TMessage, TBuilder> SetExtension<TExtension>(
  47. GeneratedExtensionBase<TMessage, IList<TExtension>> extension, int index, TExtension value) {
  48. ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
  49. message.VerifyExtensionContainingType(extension);
  50. message.Extensions[extension.Descriptor, index] = extension.SingularToReflectionType(value);
  51. return this;
  52. }
  53. /// <summary>
  54. /// Appends a value to a repeated extension.
  55. /// </summary>
  56. public ExtendableBuilder<TMessage, TBuilder> AddExtension<TExtension>(
  57. GeneratedExtensionBase<TMessage, IList<TExtension>> extension, TExtension value) {
  58. ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
  59. message.VerifyExtensionContainingType(extension);
  60. message.Extensions.AddRepeatedField(extension.Descriptor, extension.SingularToReflectionType(value));
  61. return this;
  62. }
  63. /// <summary>
  64. /// Clears an extension.
  65. /// </summary>
  66. public ExtendableBuilder<TMessage, TBuilder> ClearExtension<TExtension>(
  67. GeneratedExtensionBase<TMessage, TExtension> extension) {
  68. ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
  69. message.VerifyExtensionContainingType(extension);
  70. message.Extensions.ClearField(extension.Descriptor);
  71. return this;
  72. }
  73. /// <summary>
  74. /// Called by subclasses to parse an unknown field or an extension.
  75. /// </summary>
  76. /// <returns>true unless the tag is an end-group tag</returns>
  77. protected override bool ParseUnknownField(CodedInputStream input, UnknownFieldSet.Builder unknownFields,
  78. ExtensionRegistry extensionRegistry, uint tag) {
  79. return FieldSet.MergeFieldFrom(input, unknownFields, extensionRegistry, this, tag);
  80. }
  81. // ---------------------------------------------------------------
  82. // Reflection
  83. public override object this[FieldDescriptor field, int index] {
  84. set {
  85. if (field.IsExtension) {
  86. ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
  87. // TODO(jonskeet): Figure out how to call this!
  88. // message.VerifyExtensionContainingType(field);
  89. message.Extensions[field, index] = value;
  90. } else {
  91. base[field, index] = value;
  92. }
  93. }
  94. }
  95. public override object this[FieldDescriptor field] {
  96. set {
  97. if (field.IsExtension) {
  98. ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
  99. // TODO(jonskeet): Figure out how to call this!
  100. // message.VerifyExtensionContainingType(field);
  101. message.Extensions[field] = value;
  102. } else {
  103. base[field] = value;
  104. }
  105. }
  106. }
  107. public override IBuilder<TMessage> ClearField(FieldDescriptor field) {
  108. if (field.IsExtension) {
  109. ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
  110. message.VerifyContainingType(field);
  111. message.Extensions.ClearField(field);
  112. return this;
  113. } else {
  114. return base.ClearField(field);
  115. }
  116. }
  117. public override IBuilder<TMessage> AddRepeatedField(FieldDescriptor field, object value) {
  118. if (field.IsExtension) {
  119. ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
  120. message.VerifyContainingType(field);
  121. message.Extensions.AddRepeatedField(field, value);
  122. return this;
  123. } else {
  124. return base.AddRepeatedField(field, value);
  125. }
  126. }
  127. }
  128. }