vcs: Refactored "AreaMap" - removed unused methods, code simplified
[idea/community.git] / platform / vcs-api / src / com / intellij / openapi / vcs / AreaMap.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.vcs;
17
18 import com.intellij.util.PairProcessor;
19
20 import java.util.List;
21 import java.util.ListIterator;
22 import java.util.Map;
23
24 import static com.intellij.util.containers.ContainerUtil.newHashMap;
25 import static com.intellij.util.containers.ContainerUtil.newLinkedList;
26 import static java.util.Collections.binarySearch;
27
28 public class AreaMap<Key extends Comparable<Key>, Val> {
29   private final List<Key> myKeys = newLinkedList();
30   private final Map<Key, Val> myMap = newHashMap();
31
32   public void put(final Key key, final Val val) {
33     myMap.put(key, val);
34
35     if (myKeys.isEmpty()) {
36       myKeys.add(key);
37     }
38     else {
39       int idx = binarySearch(myKeys, key);
40       if (idx < 0) {
41         int insertionIdx = -idx - 1;
42         myKeys.add(insertionIdx, key);
43       }
44     }
45   }
46
47   public void getSimiliar(Key key, PairProcessor<Key, Key> keysResemblance, PairProcessor<Key, Val> consumer) {
48     int idx = binarySearch(myKeys, key);
49     if (idx < 0) {
50       int insertionIdx = -idx - 1;
51       if (insertionIdx - 1 >= 0) {
52         for (ListIterator<Key> iterator = myKeys.listIterator(insertionIdx); iterator.hasPrevious(); ) {
53           Key candidate = iterator.previous();
54           if (!keysResemblance.process(candidate, key)) continue;
55           if (consumer.process(candidate, myMap.get(candidate))) break;     // if need only a part of keys
56         }
57       }
58     } else {
59       consumer.process(key, myMap.get(key));
60     }
61   }
62 }