package com.google.inject.internal;

import com.google.inject.Key;

/**
 * Interface for types that can rehash their {@link Key} instances.
 *
 * @author chrispurcell@google.com (Chris Purcell)
 */
public interface RehashableKeys {
  void rehashKeys();

  /** Utility methods for key rehashing. */
  public static class Keys {

    /**
     * Returns true if the cached hashcode and toString for the given key is out-of-date. This will
     * only occur if the key contains a mutable annotation.
     */
    public static boolean needsRehashing(Key<?> key) {
      if (!key.hasAttributes()) {
        return false;
      }
      int newHashCode = key.getTypeLiteral().hashCode() * 31 + key.getAnnotation().hashCode();
      return (key.hashCode() != newHashCode);
    }

    /** Returns a copy of the given key with an up-to-date hashcode and toString. */
    public static <T> Key<T> rehash(Key<T> key) {
      if (key.hasAttributes()) {
        // This will recompute the hashcode for us.
        return Key.get(key.getTypeLiteral(), key.getAnnotation());
      } else {
        return key;
      }
    }

    private Keys() { }
  }
}
