/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/cache_utf8.py

  • Committer: Aaron Bentley
  • Date: 2007-03-03 17:17:53 UTC
  • mfrom: (2309 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2316.
  • Revision ID: aaron.bentley@utoronto.ca-20070303171753-o0s1yrxx5sn12p2k
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 
20
20
"""Some functions to enable caching the conversion between unicode to utf8"""
21
21
 
 
22
import codecs
 
23
 
 
24
 
 
25
_utf8_encode = codecs.getencoder("utf-8")
 
26
_utf8_decode = codecs.getdecoder("utf-8")
22
27
 
23
28
# Map revisions from and to utf8 encoding
24
29
# Whenever we do an encode/decode operation, we save the result, so that
29
34
 
30
35
def encode(unicode_str,
31
36
           _uni_to_utf8=_unicode_to_utf8_map,
32
 
           _utf8_to_uni=_utf8_to_unicode_map):
 
37
           _utf8_to_uni=_utf8_to_unicode_map,
 
38
           _utf8_encode=_utf8_encode):
33
39
    """Take this unicode revision id, and get a unicode version"""
34
40
    # If the key is in the cache try/KeyError is 50% faster than
35
41
    # val = dict.get(key), if val is None:
42
48
    try:
43
49
        return _uni_to_utf8[unicode_str]
44
50
    except KeyError:
45
 
        _uni_to_utf8[unicode_str] = utf8_str = unicode_str.encode('utf-8')
 
51
        _uni_to_utf8[unicode_str] = utf8_str = _utf8_encode(unicode_str)[0]
46
52
        _utf8_to_uni[utf8_str] = unicode_str
47
53
        return utf8_str
48
54
 
49
55
 
50
56
def decode(utf8_str,
51
57
           _uni_to_utf8=_unicode_to_utf8_map,
52
 
           _utf8_to_uni=_utf8_to_unicode_map):
 
58
           _utf8_to_uni=_utf8_to_unicode_map,
 
59
           _utf8_decode=_utf8_decode):
53
60
    """Take a utf8 revision id, and decode it, but cache the result"""
54
61
    try:
55
62
        return _utf8_to_uni[utf8_str]
56
63
    except KeyError:
57
 
        _utf8_to_uni[utf8_str] = unicode_str = utf8_str.decode('utf-8')
 
64
        unicode_str = _utf8_decode(utf8_str)[0]
 
65
        _utf8_to_uni[utf8_str] = unicode_str
58
66
        _uni_to_utf8[unicode_str] = utf8_str
59
67
        return unicode_str
60
68
 
71
79
    return decode(encode(unicode_str))
72
80
 
73
81
 
 
82
def get_cached_utf8(utf8_str):
 
83
    """Return a cached version of the utf-8 string.
 
84
 
 
85
    Get a cached version of this string (similar to intern()).
 
86
    At present, this will be decoded to ensure it is a utf-8 string. In the
 
87
    future this might change to simply caching the string.
 
88
    """
 
89
    return encode(decode(utf8_str))
 
90
 
 
91
 
 
92
def get_cached_ascii(ascii_str,
 
93
                     _uni_to_utf8=_unicode_to_utf8_map,
 
94
                     _utf8_to_uni=_utf8_to_unicode_map):
 
95
    """This is a string which is identical in utf-8 and unicode."""
 
96
    # We don't need to do any encoding, but we want _utf8_to_uni to return a
 
97
    # real Unicode string. Unicode and plain strings of this type will have the
 
98
    # same hash, so we can just use it as the key in _uni_to_utf8, but we need
 
99
    # the return value to be different in _utf8_to_uni
 
100
    ascii_str = _uni_to_utf8.setdefault(ascii_str, ascii_str)
 
101
    _utf8_to_uni.setdefault(ascii_str, unicode(ascii_str))
 
102
    return ascii_str
 
103
 
 
104
 
74
105
def clear_encoding_cache():
75
106
    """Clear the encoding and decoding caches"""
76
 
    global _unicode_to_utf8_map, _utf8_to_unicode_map
77
107
    _unicode_to_utf8_map.clear()
78
108
    _utf8_to_unicode_map.clear()
79