public class UpdateMask { public void Clear() { m_updateValues = new SortedDictionary(); m_updateMask = new uint[m_blocks]; } public void SetCount(int valuesCount) { m_updateValues = new SortedDictionary(); m_count = valuesCount; m_blocks = (valuesCount + 31)/32; Console.WriteLine("blocks: {0}",m_blocks); m_updateMask = new uint[m_blocks]; } public void Write(RealmPacketOut packet) { packet.WriteByte((byte)m_blocks); Console.WriteLine("BitMask len: {0}",m_count); for (int i = 0; i < m_blocks; i++) { packet.Write(m_updateMask[i]); } foreach (uint value in m_updateValues.Values) { packet.WriteBE(value); } } public void SetBit(int index) { m_updateMask[index/32] |= (uint)(1 << index%32); } public void SetBit(int index, uint value) { SetBit(index); m_updateValues.Add(index,value); } public void SetBit(int index, ulong value) { SetBit(index); SetBit(index+1); m_updateValues.Add(index, BitConverter.ToUInt32(BitConverter.GetBytes(value), 0)); m_updateValues.Add(index + 1, BitConverter.ToUInt32(BitConverter.GetBytes(value), 4)); } public bool GetBit(int index) { return (m_updateMask[index/32] & (1 << index%32)) == 0; } private int m_count; private int m_blocks; private uint[] m_updateMask; private SortedDictionary m_updateValues; }