// Utilities for writing.

        /// <summary>
        /// Initialize the header and writer for writing. The value of fpMin and header
        /// should be passed to the other utility methods here.
        /// </summary>
        public static void BeginWrite(BinaryWriter writer, out long fpMin, out ModelHeader header)
        {
            Contracts.Assert(Marshal.SizeOf(typeof(ModelHeader)) == Size);
            Contracts.CheckValue(writer, nameof(writer));

            fpMin              = writer.FpCur();
            header             = default(ModelHeader);
            header.Signature   = SignatureValue;
            header.VerWritten  = VerWrittenCur;
            header.VerReadable = VerReadableCur;
            header.FpModel     = ModelHeader.Size;

            // Write a blank header - the correct information is written by WriteHeaderAndTail.
            byte[] headerBytes = new byte[ModelHeader.Size];
            writer.Write(headerBytes);
            Contracts.CheckIO(writer.FpCur() == fpMin + ModelHeader.Size);
        }