/**
 * Copyright (C) 2008 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 com.google.inject.internal;

import com.google.inject.BindingAnnotation;

import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author jessewilson@google.com (Jesse Wilson)
 */
public class UniqueAnnotations {
  private UniqueAnnotations() {}
  private static final AtomicInteger nextUniqueValue = new AtomicInteger(1);

  /**
   * Returns an annotation instance that is not equal to any other annotation
   * instances, for use in creating distinct {@link com.google.inject.Key}s.
   */
  public static Annotation create() {
    return create(nextUniqueValue.getAndIncrement());
  }

  static Annotation create(final int value) {
    return new Internal() {
      public int value() {
        return value;
      }

      public Class<? extends Annotation> annotationType() {
        return Internal.class;
      }

      @Override public String toString() {
        return "@" + Internal.class.getName() + "(value=" + value + ")";
      }

      @Override public boolean equals(Object o) {
        return o instanceof Internal
            && ((Internal) o).value() == value();
      }

      @Override public int hashCode() {
        return (127 * "value".hashCode()) ^ value;
      }
    };
  }

  @Retention(RUNTIME) @BindingAnnotation
  @interface Internal {
    int value();
  }
}
