Squashed 'third_party/protobuf/' content from commit e35e248

Change-Id: I6cbe123d09fe50fdcad0e51466665daeee7433c7
git-subtree-dir: third_party/protobuf
git-subtree-split: e35e24800fb8d694bdeea5fd63dc7d1b14d68723
diff --git a/csharp/src/Google.Protobuf/WireFormat.cs b/csharp/src/Google.Protobuf/WireFormat.cs
new file mode 100644
index 0000000..faf1e71
--- /dev/null
+++ b/csharp/src/Google.Protobuf/WireFormat.cs
@@ -0,0 +1,104 @@
+#region Copyright notice and license

+// Protocol Buffers - Google's data interchange format

+// Copyright 2008 Google Inc.  All rights reserved.

+// https://developers.google.com/protocol-buffers/

+//

+// Redistribution and use in source and binary forms, with or without

+// modification, are permitted provided that the following conditions are

+// met:

+//

+//     * Redistributions of source code must retain the above copyright

+// notice, this list of conditions and the following disclaimer.

+//     * Redistributions in binary form must reproduce the above

+// copyright notice, this list of conditions and the following disclaimer

+// in the documentation and/or other materials provided with the

+// distribution.

+//     * Neither the name of Google Inc. nor the names of its

+// contributors may be used to endorse or promote products derived from

+// this software without specific prior written permission.

+//

+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT

+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY

+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT

+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+#endregion

+

+namespace Google.Protobuf

+{

+    /// <summary>

+    /// This class is used internally by the Protocol Buffer Library and generated

+    /// message implementations. It is public only for the sake of those generated

+    /// messages. Others should not use this class directly.

+    /// <para>

+    /// This class contains constants and helper functions useful for dealing with

+    /// the Protocol Buffer wire format.

+    /// </para>

+    /// </summary>

+    public static class WireFormat

+    {

+        /// <summary>

+        /// Wire types within protobuf encoding.

+        /// </summary>

+        public enum WireType : uint

+        {

+            /// <summary>

+            /// Variable-length integer.

+            /// </summary>

+            Varint = 0,

+            /// <summary>

+            /// A fixed-length 64-bit value.

+            /// </summary>

+            Fixed64 = 1,

+            /// <summary>

+            /// A length-delimited value, i.e. a length followed by that many bytes of data.

+            /// </summary>

+            LengthDelimited = 2,

+            /// <summary>

+            /// A "start group" value - not supported by this implementation.

+            /// </summary>

+            StartGroup = 3,

+            /// <summary>

+            /// An "end group" value - not supported by this implementation.

+            /// </summary>

+            EndGroup = 4,

+            /// <summary>

+            /// A fixed-length 32-bit value.

+            /// </summary>

+            Fixed32 = 5

+        }

+        

+        private const int TagTypeBits = 3;

+        private const uint TagTypeMask = (1 << TagTypeBits) - 1;

+

+        /// <summary>

+        /// Given a tag value, determines the wire type (lower 3 bits).

+        /// </summary>

+        public static WireType GetTagWireType(uint tag)

+        {

+            return (WireType) (tag & TagTypeMask);

+        }

+

+        /// <summary>

+        /// Given a tag value, determines the field number (the upper 29 bits).

+        /// </summary>

+        public static int GetTagFieldNumber(uint tag)

+        {

+            return (int) tag >> TagTypeBits;

+        }

+

+        /// <summary>

+        /// Makes a tag value given a field number and wire type.

+        /// </summary>

+        public static uint MakeTag(int fieldNumber, WireType wireType)

+        {

+            return (uint) (fieldNumber << TagTypeBits) | (uint) wireType;

+        }        

+    }

+}
\ No newline at end of file