/**
 * 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.multibindings;

import java.lang.annotation.Annotation;

/**
 * @author jessewilson@google.com (Jesse Wilson)
 */
class RealElement implements Element {
  private final String setName;
  private final String role;
  private final int uniqueId;

  RealElement(String setName, String role, int uniqueId) {
    this.setName = setName;
    this.role = role;
    this.uniqueId = uniqueId;
  }

  public String setName() {
    return setName;
  }

  public String role() {
    return role;
  }

  public int uniqueId() {
    return uniqueId;
  }

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

  @Override public String toString() {
    return "@" + Element.class.getName() + "(setName=" + setName
        + ",role=" + role + ",uniqueId=" + uniqueId + ")";
  }

  @Override public boolean equals(Object o) {
    return o instanceof Element
        && ((Element) o).setName().equals(setName())
        && ((Element) o).role().equals(role())
        && ((Element) o).uniqueId() == uniqueId();
  }

  @Override public int hashCode() {
    return 127 * ("setName".hashCode() ^ setName.hashCode())
        + 127 * ("role".hashCode() ^ role.hashCode())
        + 127 * ("uniqueId".hashCode() ^ uniqueId);
  }
}
