userdata is better than marker file
[idea/community.git] / platform / util / src / com / intellij / openapi / util / Key.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.util;
17
18 import org.jetbrains.annotations.NonNls;
19 import org.jetbrains.annotations.NotNull;
20 import org.jetbrains.annotations.Nullable;
21
22 import java.util.Map;
23 import java.util.concurrent.atomic.AtomicInteger;
24
25 /**
26  * Provides type-safe access to data.
27  *
28  * @author max
29  * @author Konstantin Bulenkov
30  */
31 @SuppressWarnings({"EqualsWhichDoesntCheckParameterClass"})
32 public class Key<T> {
33   private static final AtomicInteger ourKeysCounter = new AtomicInteger();
34   private final int myIndex = ourKeysCounter.getAndIncrement();
35   private final String myName; // for debug purposes only
36
37   public Key(@NotNull @NonNls String name) {
38     myName = name;
39   }
40
41   public int hashCode() {
42     return myIndex;
43   }
44
45   @Override
46   public boolean equals(Object obj) {
47     return obj == this;
48   }
49
50   public String toString() {
51     return myName;
52   }
53
54   public static <T> Key<T> create(@NotNull @NonNls String name) {
55     return new Key<T>(name);
56   }
57
58   @Nullable
59   public T get(@Nullable UserDataHolder holder) {
60     return holder == null ? null : holder.getUserData(this);
61   }
62
63   @Nullable
64   public T get(@Nullable Map<Key, Object> holder) {
65     return holder == null ? null : (T)holder.get(this);
66   }
67
68   public T get(@Nullable UserDataHolder holder, T defaultValue) {
69     final T t = get(holder);
70     return t == null ? defaultValue : t;
71   }
72
73   /**
74    * Returns <code>true</code> if and only if the <code>holder</code> has
75    * not null value by the key.
76    *
77    * @param holder user data holder object
78    * @return <code>true</code> if holder.getUserData(this) != null
79    * <code>false</code> otherwise.
80    */
81   public boolean isIn(@Nullable UserDataHolder holder) {
82     return get(holder) != null;
83   }
84
85   public void set(@Nullable UserDataHolder holder, @Nullable T value) {
86     if (holder != null) {
87       holder.putUserData(this, value);
88     }
89   }
90
91   public void set(@Nullable Map<Key, Object> holder, T value) {
92     if (holder != null) {
93       holder.put(this, value);
94     }
95   }
96 }