// private members
////////////////////////////////////////////////////////////////////////////////
-void FrameFactory::convertFrame(const ByteVector &from, const ByteVector &to,
+void FrameFactory::convertFrame(const char *from, const char *to,
Frame::Header *header) const
{
if(header->frameID() != from)
* \a to. If the frame matches the \a from pattern and converts the frame
* ID in the \a header or simply does nothing if the frame ID does not match.
*/
- void convertFrame(const ByteVector &from, const ByteVector &to,
+ void convertFrame(const char *from, const char *to,
Frame::Header *header) const;
static FrameFactory *factory;
#include "tbytevector.h"
+// This is a bit ugly to keep writing over and over again.
+
+#define DATA(x) (&(x->data[0]))
+
namespace TagLib {
static const uint crcTable[256] = {
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
detach();
resize(length);
- ::memcpy(&(d->data[0]), data, length);
+ ::memcpy(DATA(d), data, length);
}
void ByteVector::setData(const char *data)
// http://www.informit.com/isapi/product_id~{9C84DAB4-FE6E-49C5-BB0A-FB50331233EA}/content/index.asp
detach();
- return &(d->data[0]);
+ return DATA(d);
}
const char *ByteVector::data() const
{
- return &(d->data[0]);
+ return DATA(d);
}
ByteVector ByteVector::mid(uint index, uint length) const
uint originalSize = d->size;
resize(d->size + v.d->size);
- ::memcpy(&(d->data[0]) + originalSize, v.data(), v.size());
+ ::memcpy(DATA(d) + originalSize, DATA(v.d), v.size());
}
void ByteVector::clear()
ByteVector &ByteVector::resize(uint size, char padding)
{
- d->size = size;
-
- if(d->data.size() < size) {
+ if(d->size < size) {
d->data.reserve(size);
- d->data.insert(d->data.end(), size - d->data.size(), padding);
+ ::memset(DATA(d), padding, size - d->size);
}
else
d->data.erase(d->data.begin() + size, d->data.end());
+ d->size = size;
+
return *this;
}
bool ByteVector::operator==(const ByteVector &v) const
{
- if(size() != v.size())
+ if(d->size != v.d->size)
return false;
- for(uint i = 0; i < size(); i++) {
- if(at(i) != v.at(i))
- return false;
- }
-
- return true;
+ return ::memcmp(data(), v.data(), size()) == 0;
}
bool ByteVector::operator!=(const ByteVector &v) const
bool ByteVector::operator==(const char *s) const
{
- return operator==(fromCString(s));
+ if(d->size != ::strlen(s))
+ return false;
+
+ return ::memcmp(data(), s, d->size) == 0;
}
bool ByteVector::operator!=(const char *s) const
return;
}
- for(std::string::const_iterator it = s.begin(); it != s.end(); it++)
- d->data += uchar(*it);
+ int length = s.length();
+ d->data.resize(length);
+ wstring::iterator targetIt = d->data.begin();
+
+ for(std::string::const_iterator it = s.begin(); it != s.end(); it++) {
+ *targetIt = uchar(*it);
+ ++targetIt;
+ }
prepare(t);
}
return;
}
- for(int i = 0; s[i] != 0; i++)
- d->data += uchar(s[i]);
+ int length = ::strlen(s);
+ d->data.resize(length);
+
+ wstring::iterator targetIt = d->data.begin();
+
+ for(int i = 0; i < length; i++) {
+ *targetIt = uchar(s[i]);
+ ++targetIt;
+ }
prepare(t);
}
d = new StringPrivate;
if(t == Latin1 || t == UTF8) {
- for(uint i = 0; i < v.size() && v[i]; i++)
- d->data += uchar(v[i]);
+
+ d->data.resize(v.size());
+ wstring::iterator targetIt = d->data.begin();
+ for(ByteVector::ConstIterator it = v.begin(); it != v.end() && (*it); ++it) {
+ *targetIt = uchar(*it);
+ ++targetIt;
+ }
}
else {
- for(uint i = 0; i + 1 < v.size() && combine(v[i], v[i + 1]); i += 2)
- d->data += combine(v[i], v[i + 1]);
+ d->data.resize(v.size() / 2);
+ wstring::iterator targetIt = d->data.begin();
+
+ for(ByteVector::ConstIterator it = v.begin();
+ it + 1 != v.end() && combine(*it, *(it + 1));
+ it += 2)
+ {
+ *targetIt = combine(*it, *(it + 1));
+ ++targetIt;
+ }
}
prepare(t);
}
d = new StringPrivate;
- for(int i = 0; s[i] != 0; i++)
- d->data += uchar(s[i]);
+ int length = ::strlen(s);
+ d->data.resize(length);
+
+ wstring::iterator targetIt = d->data.begin();
+ for(int i = 0; i < length; i++) {
+ *targetIt = uchar(s[i]);
+ ++targetIt;
+ }
return *this;
}
wstring::iterator targetIt = d->data.begin();
uint i = 0;
- for(; i < v.size() && v[i]; i++) {
- *targetIt = uchar(v[i]);
+
+ for(ByteVector::ConstIterator it = v.begin(); it != v.end() && (*it); ++it) {
+ *targetIt = uchar(*it);
++targetIt;
+ ++i;
}
// If we hit a null in the ByteVector, shrink the string again.