internal void Delete(long index)
            {
                AssertState();

                _index = index;
                _state = CompareExchangeValueState.Deleted;
            }
            internal void UpdateState(long index)
            {
                _index = index;
                _state = CompareExchangeValueState.None;

                if (_originalValue != null)
                {
                    _originalValue.Index = index;
                }

                if (_value != null)
                {
                    _value.Index = index;
                }
            }
            internal CompareExchangeValue <T> Create <T>(T item)
            {
                AssertState();

                if (_value != null)
                {
                    throw new InvalidOperationException($"The compare exchange value with key '{_key}' is already tracked.");
                }

                _index = 0;
                var value = new CompareExchangeValue <T>(_key, _index, item);

                _value = value;
                _state = CompareExchangeValueState.Created;
                return(value);
            }
            internal void UpdateValue(CompareExchangeValue <BlittableJsonReaderObject> value, InMemoryDocumentSessionOperations session)
            {
                _index = value.Index;
                _state = value.Index >= 0 ? CompareExchangeValueState.None : CompareExchangeValueState.Missing;

                _originalValue = value;

                if (_value != null)
                {
                    _value.Index = _index;

                    if (_value.Value != null)
                    {
                        session.JsonConverter.PopulateEntity(_value.Value, value.Value, session.JsonSerializer);
                    }
                }
            }
 public CompareExchangeSessionValue(string key, long index, CompareExchangeValueState state)
 {
     _key   = key ?? throw new ArgumentNullException(nameof(key));
     _index = index;
     _state = state;
 }