diff options
author | Jan Tattermusch <jtattermusch@users.noreply.github.com> | 2015-06-19 12:59:07 -0700 |
---|---|---|
committer | Jan Tattermusch <jtattermusch@users.noreply.github.com> | 2015-06-19 12:59:07 -0700 |
commit | 45b70328f218dc2b3e20191c2cfa92872ef10d04 (patch) | |
tree | 8c4441b6abee41b5e960e7013e5aeb6761616a22 /csharp/src/ProtocolBuffers/MessageParser.cs | |
parent | 5b3a8e76356ef2dcb4a87c3fa7323bdec01cf7ce (diff) | |
parent | 50a3a809e849fad5a53be5ccbaefaa02a106b535 (diff) | |
download | protobuf-45b70328f218dc2b3e20191c2cfa92872ef10d04.tar.gz protobuf-45b70328f218dc2b3e20191c2cfa92872ef10d04.tar.bz2 protobuf-45b70328f218dc2b3e20191c2cfa92872ef10d04.zip |
Merge pull request #515 from jskeet/proto3-only
Proto3 experimental C# fork
Diffstat (limited to 'csharp/src/ProtocolBuffers/MessageParser.cs')
-rw-r--r-- | csharp/src/ProtocolBuffers/MessageParser.cs | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/csharp/src/ProtocolBuffers/MessageParser.cs b/csharp/src/ProtocolBuffers/MessageParser.cs new file mode 100644 index 00000000..18cda2dc --- /dev/null +++ b/csharp/src/ProtocolBuffers/MessageParser.cs @@ -0,0 +1,90 @@ +using System; +using System.IO; + +namespace Google.Protobuf +{ + /// <summary> + /// A parser for a specific message type. + /// </summary> + /// <remarks> + /// <p> + /// This delegates most behavior to the + /// <see cref="IMessage.MergeFrom"/> implementation within the original type, but + /// provides convenient overloads to parse from a variety of sources. + /// </p> + /// <p> + /// Most applications will never need to create their own instances of this type; + /// instead, use the static <c>Parser</c> property of a generated message type to obtain a + /// parser for that type. + /// </p> + /// </remarks> + /// <typeparam name="T">The type of message to be parsed.</typeparam> + public sealed class MessageParser<T> where T : IMessage<T> + { + private readonly Func<T> factory; + + /// <summary> + /// Creates a new parser. + /// </summary> + /// <remarks> + /// The factory method is effectively an optimization over using a generic constraint + /// to require a parameterless constructor: delegates are significantly faster to execute. + /// </remarks> + /// <param name="factory">Function to invoke when a new, empty message is required.</param> + public MessageParser(Func<T> factory) + { + this.factory = factory; + } + + /// <summary> + /// Creates a template instance ready for population. + /// </summary> + /// <returns>An empty message.</returns> + internal T CreateTemplate() + { + return factory(); + } + + /// <summary> + /// Parses a message from a byte array. + /// </summary> + /// <param name="data">The byte array containing the message. Must not be null.</param> + /// <returns>The newly parsed message.</returns> + public T ParseFrom(byte[] data) + { + ThrowHelper.ThrowIfNull(data, "data"); + T message = factory(); + message.MergeFrom(data); + return message; + } + + public T ParseFrom(ByteString data) + { + ThrowHelper.ThrowIfNull(data, "data"); + T message = factory(); + message.MergeFrom(data); + return message; + } + + public T ParseFrom(Stream input) + { + T message = factory(); + message.MergeFrom(input); + return message; + } + + public T ParseDelimitedFrom(Stream input) + { + T message = factory(); + message.MergeDelimitedFrom(input); + return message; + } + + public T ParseFrom(CodedInputStream input) + { + T message = factory(); + message.MergeFrom(input); + return message; + } + } +} |