/// <summary> /// Gets the request data as the byte array /// </summary> /// <returns>Request data</returns> public byte[] GetRequestData() { switch (this.operation) { case SetDataOperationCode.InterlockedAddIfVersion: { byte[] data = this.prevData.Data; if (data.Length != sizeof(long)) { throw new InvalidOperationException("data in the node should be able to hold a long"); } IoSession ios = new IoSession() { Buffer = data, MaxBytes = data.Length }; IoSession res_ios = new IoSession() { Buffer = new byte[data.Length], MaxBytes = data.Length }; long prevlong; DataEncodingHelper.Read(ios, out prevlong); prevlong += this.number; ios.Pos = 0; DataEncodingHelper.Write(prevlong, res_ios); return(res_ios.Buffer); } case SetDataOperationCode.InterlockedXORIfVersion: { byte[] data = this.prevData.Data; if (data.Length != sizeof(long)) { throw new InvalidOperationException("data in the node should be able to hold a long"); } IoSession ios = new IoSession() { Buffer = data, MaxBytes = data.Length }; IoSession res_ios = new IoSession() { Buffer = new byte[data.Length], MaxBytes = data.Length }; long prevlong; DataEncodingHelper.Read(ios, out prevlong); prevlong ^= this.number; ios.Pos = 0; DataEncodingHelper.Write(prevlong, res_ios); return(res_ios.Buffer); } default: throw new NotImplementedException("I don't understand operation " + this.operation); } }
/// <summary> /// creates a byte[] for SetData representing a "InterlockedSet(value)" operation /// </summary> /// <param name="value">value to set</param> /// <returns>the byte[] with the encoded operation.</returns> public ISetDataOperation InterlockedSet(long value) { IoSession ios = new IoSession() { Buffer = new byte[sizeof(long)], MaxBytes = Length }; DataEncodingHelper.Write(value, ios); return(new SetDataOperation(ios.Buffer)); }
/// <summary> /// creates a byte[] for SetData representing a "InterlockedXOR(value)" operation /// </summary> /// <param name="value">value to compute the XOR with</param> /// <returns>the byte[] with the encoded operation.</returns> public ISetDataOperation InterlockedXOR(long value) { SetDataOperationCode op = SetDataOperationCode.InterlockedXORIfVersion; IoSession ios = new IoSession() { Buffer = new byte[Length], MaxBytes = Length }; DataEncodingHelper.Write(Magic, ios); DataEncodingHelper.Write((ushort)op, ios); DataEncodingHelper.Write(value, ios); return(new SetDataOperation(ios.Buffer)); }