/// <summary>Flush the cache to <see cref="BaseStream"/> with <see cref="kWordByteCount"/> or fewer bytes bytes</summary> void FlushCache() { #if !CONTRACTS_FULL_SHIM // can't do this with our shim! ValueAtReturn sets out param to default ON ENTRY Contract.Ensures(Contract.ValueAtReturn(out mCache) == 0); Contract.Ensures(Contract.ValueAtReturn(out mCacheBitIndex) == 0); #endif if (mCacheBitIndex == 0) // no bits to flush! { Contract.Assert(mCache == 0, "Why is there data in the cache?"); return; } mCacheBitsStreamedCount = 0; int byte_count = (mCacheBitIndex - 1) >> Bits.kByteBitShift; // number of bytes to try and write int shift = kWordBitCount - Bits.kByteBitCount; // start shifting from the MSB while ( /*!IsEndOfStream &&*/ byte_count >= 0) { mIoBuffer[0] = (byte)(mCache >> shift); BaseStream.Write(mIoBuffer, 0, sizeof(byte)); --byte_count; shift -= Bits.kByteBitCount; mCacheBitsStreamedCount += Bits.kByteBitCount; } if (byte_count != -1 && ThrowOnOverflow.CanWrite()) { throw new System.IO.EndOfStreamException("Tried to write more bits than the stream has/can see"); } mCache = 0; mCacheBitIndex = 0; }
/// <summary>Restore the cursor to what it was before the corresponding call to a <see cref="WriteElementBegin(string, XmlElement&)"/></summary> public void WriteElementEnd(ref TCursor oldCursor) { #if !CONTRACTS_FULL_SHIM // can't do this with our shim! ValueAtReturn sets out param to default ON ENTRY Contract.Ensures(Contract.ValueAtReturn(out oldCursor) == null); #endif RestoreCursor(ref oldCursor); }
/// <summary>Get the procedure for building a mask of a section of bits in a vector, relative to the vector's element size (<see cref="System.Int64"/>)</summary> /// <param name="proc"></param> /// <param name="byteOrder">Order in which bits are enumerated (first to last)</param> public static void GetVectorElementSectionBitMaskInT(out VectorElementBitMask <ulong> proc, Shell.EndianFormat byteOrder = kVectorWordFormat) { Contract.Ensures(Contract.ValueAtReturn(out proc) != null); proc = byteOrder == Shell.EndianFormat.Big ? (VectorElementBitMask <ulong>)VectorElementSectionBitMaskInInt64BE : (VectorElementBitMask <ulong>)VectorElementSectionBitMaskInInt64LE; }
/// <summary>Returns the cursor to a previously saved cursor value</summary> /// <param name="oldCursor">Previously saved cursor. Set to null before the method returns</param> public void RestoreCursor(ref TCursor oldCursor) { #if !CONTRACTS_FULL_SHIM // can't do this with our shim! ValueAtReturn sets out param to default ON ENTRY Contract.Ensures(Contract.ValueAtReturn(out oldCursor) == null); #endif Contract.Assert(oldCursor != null, "Can't restore a cursor that wasn't saved!"); Cursor = oldCursor; oldCursor = null; }
/// <summary>Generate an 32-bit bit count to bitmask table</summary> /// <param name="wordBitSize">Number of bits to generate a table for</param> /// <param name="lut">Bitmask look up table</param> /// <remarks>Treat <paramref name="lut"/> as <b>read-only</b></remarks> public static void BitmaskLookUpTableGenerate(int wordBitSize, out uint[] lut) { Contract.Requires/*<ArgumentOutOfRangeException>*/ (wordBitSize > 0 && wordBitSize <= kUInt32BitCount); Contract.Ensures(Contract.ValueAtReturn(out lut) != null); if (wordBitSize == kUInt32BitCount && kBitmaskLookup32 != null) { lut = kBitmaskLookup32; } else { lut = new uint[BitmaskLookUpTableGetLength(wordBitSize)]; for (int x = 1, shift = lut.Length - 2; x < lut.Length; x++, shift--) { lut[x] = (uint)(uint.MaxValue >> shift); } } }
public override void ReadElementEnd(ref TCursor oldCursor) { Contract.Ensures(Contract.ValueAtReturn(out oldCursor) == null); throw new NotImplementedException(); }
public static void GetVectorElementFromBufferInT(out VectorElementFromBuffer <ulong> proc) { Contract.Ensures(Contract.ValueAtReturn(out proc) != null); proc = VectorElementFromBufferInT; }