~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/cache_utf8.py

  • Committer: Aaron Bentley
  • Date: 2007-02-06 14:52:16 UTC
  • mfrom: (2266 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2268.
  • Revision ID: abentley@panoramicfeedback.com-20070206145216-fcpi8o3ufvuzwbp9
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Canonical
 
1
# Copyright (C) 2006 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
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
        _utf8_to_uni[utf8_str] = unicode_str = _utf8_decode(utf8_str)[0]
58
65
        _uni_to_utf8[unicode_str] = utf8_str
59
66
        return unicode_str
60
67
 
73
80
 
74
81
def clear_encoding_cache():
75
82
    """Clear the encoding and decoding caches"""
76
 
    global _unicode_to_utf8_map, _utf8_to_unicode_map
77
83
    _unicode_to_utf8_map.clear()
78
84
    _utf8_to_unicode_map.clear()
79