78c519caf08c8a94e762c9940ba12a138371ac95
[idea/community.git] / platform / util / src / com / intellij / util / text / UniqueNameGenerator.java
1 /*
2  * Copyright 2000-2014 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.util.text;
17
18 import com.intellij.openapi.util.Condition;
19 import com.intellij.util.Function;
20 import com.intellij.util.containers.HashSet;
21 import org.jetbrains.annotations.NotNull;
22 import org.jetbrains.annotations.Nullable;
23
24 import java.util.Collection;
25 import java.util.Set;
26
27 /**
28  * @author peter
29  */
30 public class UniqueNameGenerator implements Condition<String> {
31   private final Set<String> myExistingNames = new HashSet<String>();
32
33   public <T> UniqueNameGenerator(@NotNull Collection<T> elements, @Nullable Function<T, String> namer) {
34     for (final T t : elements) {
35       addExistingName(namer != null ? namer.fun(t) : t.toString());
36     }
37   }
38
39   public UniqueNameGenerator() {
40   }
41
42   @Override
43   public final boolean value(final String candidate) {
44     return !myExistingNames.contains(candidate);
45   }
46
47   public final boolean isUnique(final String name, String prefix, String suffix) {
48     return value(prefix + name + suffix);
49   }
50
51   @NotNull
52   public static String generateUniqueName(final String defaultName, final Collection<String> existingNames) {
53     return generateUniqueName(defaultName, "", "", existingNames);
54   }
55
56   @NotNull
57   public static String generateUniqueName(final String defaultName, final String prefix, final String suffix, final Collection<String> existingNames) {
58     return generateUniqueName(defaultName, prefix, suffix, new Condition<String>() {
59       @Override
60       public boolean value(final String s) {
61         return !existingNames.contains(s); 
62       }
63     });
64   }
65
66   @NotNull
67   public static String generateUniqueName(final String defaultName, final Condition<String> validator) {
68     return generateUniqueName(defaultName, "", "", validator);
69   }
70
71   @NotNull
72   public static String generateUniqueName(final String defaultName, final String prefix, final String suffix, final Condition<String> validator) {
73     return generateUniqueName(defaultName, prefix, suffix, "", "", validator);
74   }
75
76   @NotNull
77   public static String generateUniqueName(final String defaultName, final String prefix, final String suffix,
78                                           final String beforeNumber, final String afterNumber, final Condition<String> validator) {
79     final String defaultFullName = prefix + defaultName + suffix;
80     if (validator.value(defaultFullName)) {
81       return defaultFullName;
82     }
83
84     for (int i = 2; ; i++) {
85       final String fullName = prefix + defaultName + beforeNumber + i + afterNumber + suffix;
86       if (validator.value(fullName)) {
87         return fullName;
88       }
89     }
90   }
91
92   @NotNull
93   public String generateUniqueName(final String defaultName, final String prefix, final String suffix) {
94     return generateUniqueName(defaultName, prefix, suffix, "", "");
95   }
96
97   @NotNull
98   public String generateUniqueName(final String defaultName, final String prefix, final String suffix, final String beforeNumber, final String afterNumber) {
99     final String result = generateUniqueName(defaultName, prefix, suffix, beforeNumber, afterNumber, this);
100     addExistingName(result);
101     return result;
102   }
103
104   public void addExistingName(String result) {
105     myExistingNames.add(result);
106   }
107
108   public String generateUniqueName(final String defaultName) {
109     return generateUniqueName(defaultName, "", "");
110   }
111 }