1be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia/*
2ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia * Copyright (C) 2010 The Libphonenumber Authors
3be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia *
4be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * Licensed under the Apache License, Version 2.0 (the "License");
5be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * you may not use this file except in compliance with the License.
6be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * You may obtain a copy of the License at
7be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia *
8be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * http://www.apache.org/licenses/LICENSE-2.0
9be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia *
10be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * Unless required by applicable law or agreed to in writing, software
11be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * distributed under the License is distributed on an "AS IS" BASIS,
12be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * See the License for the specific language governing permissions and
14be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * limitations under the License.
15be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia */
16be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
1793f6965c2c041ac707bf1b3bcf5a3f60e452f421Shaopeng Jiapackage com.android.i18n.phonenumbers;
18be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
19be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jiaimport java.util.LinkedHashMap;
20be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jiaimport java.util.Map;
21be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jiaimport java.util.regex.Pattern;
22be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
23be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia/**
24be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * LRU Cache for compiled regular expressions used by the libphonenumbers libary.
25be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia *
26be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia * @author Shaopeng Jia
27be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia */
28be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jiapublic class RegexCache {
29be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  private LRUCache<String, Pattern> cache;
30be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
31be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  public RegexCache(int size) {
32be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    cache = new LRUCache<String, Pattern>(size);
33be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  }
34be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
35be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  public Pattern getPatternForRegex(String regex) {
36be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    Pattern pattern = cache.get(regex);
37be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    if (pattern == null) {
38be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia      pattern = Pattern.compile(regex);
39be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia      cache.put(regex, pattern);
40be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    }
41be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    return pattern;
42be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  }
43be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
44be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  // This method is used for testing.
45be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  boolean containsRegex(String regex) {
46be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    return cache.containsKey(regex);
47be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  }
48be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
49f7e0224b862054893f28d2736b3f6804d9935886Shaopeng Jia  private static class LRUCache<K, V> {
50be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    // LinkedHashMap offers a straightforward implementation of LRU cache.
51be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    private LinkedHashMap<K, V> map;
52be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    private int size;
53be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
54f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    @SuppressWarnings("serial")
55be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    public LRUCache(int size) {
56be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia      this.size = size;
57f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia      map = new LinkedHashMap<K, V>(size * 4 / 3 + 1, 0.75f, true) {
58f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia        @Override
59be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
60be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia          return size() > LRUCache.this.size;
61be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia        }
62be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia      };
63be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    }
64be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
65be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    public synchronized V get(K key) {
66be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia      return map.get(key);
67be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    }
68be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
69be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    public synchronized void put(K key, V value) {
70be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia      map.put(key, value);
71be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    }
72be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia
73be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    public synchronized boolean containsKey(K key) {
74be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia      return map.containsKey(key);
75be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia    }
76be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia  }
77be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia}
78f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia
79