Android中的AAtomizer实现了一个容器的功能,此容器用来存放AString, 具体类定义如下:
struct AAtomizer {
static const char *Atomize(const char *name);
private:
static AAtomizer gAtomizer;
Mutex mLock;
Vector<List<AString> > mAtoms;
AAtomizer();
const char *atomize(const char *name);
static uint32_t Hash(const char *s);
DISALLOW_EVIL_CONSTRUCTORS(AAtomizer);
};
其中,类定义中mAtoms就是容器,他定义一个以List<AString>为元素的Vector容器。
gAtomizer是一个静态变量,在系统开始时就调用AAtomizer构造函数(初始化Vector,创建了AAtomizer变量)
主要可调用的方法Atomize是填充字符到容器中,在INDEX上使用了较为简单的hash数
const char *AAtomizer::atomize(const char *name) {
Mutex::Autolock autoLock(mLock);
const size_t n = mAtoms.size();
size_t index = AAtomizer::Hash(name) % n;
List<AString> &entry = mAtoms.editItemAt(index);
List<AString>::iterator it = entry.begin();
while (it != entry.end()) {
if ((*it) == name) {
return (*it).c_str();
}
++it;
}
entry.push_back(AString(name));
return (*--entry.end()).c_str();
}
uint32_t AAtomizer::Hash(const char *s) {
uint32_t sum = 0;
while (*s != '\0') {
sum = (sum * 31) + *s;
++s;
}
return sum;
}