Use memcmp() and memcpy() where appropriate rather than slower loop based

methods.  Here this improves tag reading speed by about 50%.


git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@293774 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
This commit is contained in:
Scott Wheeler 2004-03-05 15:59:00 +00:00
parent 8cd5093faa
commit d6aeb26c98

View File

@ -187,11 +187,15 @@ using namespace TagLib;
class ByteVector::ByteVectorPrivate : public RefCounter
{
public:
ByteVectorPrivate() : RefCounter() {}
ByteVectorPrivate(const std::vector<char> &v) : RefCounter(), data(v) {}
ByteVectorPrivate(TagLib::uint size, char value) : RefCounter(), data(size, value) {}
ByteVectorPrivate() : RefCounter(), size(0) {}
ByteVectorPrivate(const std::vector<char> &v) : RefCounter(), data(v), size(v.size()) {}
ByteVectorPrivate(TagLib::uint len, char value) : RefCounter(), data(len, value), size(len) {}
std::vector<char> data;
// std::vector<T>::size() is very slow, so we'll cache the value
uint size;
};
////////////////////////////////////////////////////////////////////////////////
@ -255,6 +259,7 @@ ByteVector::ByteVector(char c)
{
d = new ByteVectorPrivate;
d->data.push_back(c);
d->size = 1;
}
ByteVector::ByteVector(const char *data, uint length)
@ -279,16 +284,13 @@ void ByteVector::setData(const char *data, uint length)
{
detach();
for(uint i = 0; i < length; i++)
d->data.push_back(data[i]);
resize(length);
::memcpy(&(d->data[0]), data, length);
}
void ByteVector::setData(const char *data)
{
detach();
for(uint i = 0; data[i] != 0; i++)
d->data.push_back(data[i]);
setData(data, ::strlen(data));
}
char *ByteVector::data()
@ -319,6 +321,7 @@ ByteVector ByteVector::mid(uint index, uint length) const
endIt = d->data.end();
v.d->data.insert(v.d->data.begin(), ConstIterator(d->data.begin() + index), endIt);
v.d->size = v.d->data.size();
return v;
}
@ -397,8 +400,9 @@ void ByteVector::append(const ByteVector &v)
{
detach();
for(uint i = 0; i < v.size(); i++)
d->data.push_back(v[i]);
uint originalSize = d->size;
resize(d->size + v.d->size);
::memcpy(&(d->data[0]) + originalSize, v.data(), v.size());
}
void ByteVector::clear()
@ -409,11 +413,13 @@ void ByteVector::clear()
TagLib::uint ByteVector::size() const
{
return d->data.size();
return d->size;
}
ByteVector &ByteVector::resize(uint size, char padding)
{
d->size = size;
if(d->data.size() < size) {
d->data.reserve(size);
d->data.insert(d->data.end(), size - d->data.size(), padding);
@ -529,14 +535,12 @@ bool ByteVector::operator!=(const char *s) const
bool ByteVector::operator<(const ByteVector &v) const
{
for(uint i = 0; i < size() && i < v.size(); i++) {
if(at(i) < v.at(i))
return true;
else if(at(i) > v.at(i))
return false;
}
int result = ::memcmp(data(), v.data(), d->size < v.d->size ? d->size : v.d->size);
return size() < v.size();
if(result != 0)
return result < 0;
else
return size() < v.size();
}
bool ByteVector::operator>(const ByteVector &v) const