/*
 * Copyright 2014 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package java.util;

import javaemul.internal.InternalPreconditions;
import javaemul.internal.JsUtils;

/**
 * A helper to detect concurrent modifications to collections. This is implemented as a helper
 * utility so that we could remove the checks easily by a flag.
 */
class ConcurrentModificationDetector {

  private static final boolean API_CHECK = InternalPreconditions.isApiChecked();

  private static final String MOD_COUNT_PROPERTY = "_gwt_modCount";

  public static void structureChanged(Object map) {
    if (!API_CHECK) {
      return;
    }
    // Ensure that modCount is initialized if it is not already.
    int modCount = JsUtils.getIntProperty(map, MOD_COUNT_PROPERTY) | 0;
    JsUtils.setIntProperty(map, MOD_COUNT_PROPERTY, modCount + 1);
  }

  public static void recordLastKnownStructure(Object host, Iterator<?> iterator) {
    if (!API_CHECK) {
      return;
    }
    int modCount = JsUtils.getIntProperty(host, MOD_COUNT_PROPERTY);
    JsUtils.setIntProperty(iterator, MOD_COUNT_PROPERTY, modCount);
  }

  public static void checkStructuralChange(Object host, Iterator<?> iterator) {
    if (!API_CHECK) {
      return;
    }
    if (JsUtils.getIntProperty(iterator, MOD_COUNT_PROPERTY)
        != JsUtils.getIntProperty(host, MOD_COUNT_PROPERTY)) {
      throw new ConcurrentModificationException();
    }
  }
}
