Change ByteVector::npos from a variable to a function.

We can't export a static member function. It may lead to a likage error.
This commit is contained in:
Tsuda Kageyu 2015-11-19 13:13:15 +09:00
parent 722f317f97
commit 176e133f32
13 changed files with 61 additions and 60 deletions

View File

@ -159,13 +159,13 @@ void ASF::Picture::parse(const ByteVector& bytes)
const ByteVector nullStringTerminator(2, 0);
size_t endPos = bytes.find(nullStringTerminator, pos, 2);
if(endPos == ByteVector::npos)
if(endPos == ByteVector::npos())
return;
d->data->mimeType = String(bytes.mid(pos, endPos - pos), String::UTF16LE);
pos = endPos+2;
endPos = bytes.find(nullStringTerminator, pos, 2);
if(endPos == ByteVector::npos)
if(endPos == ByteVector::npos())
return;
d->data->description = String(bytes.mid(pos, endPos - pos), String::UTF16LE);
pos = endPos+2;

View File

@ -225,7 +225,7 @@ void IT::File::read(bool)
ByteVector messageBytes = readBlock(messageLength);
READ_ASSERT(messageBytes.size() == messageLength);
const size_t index = messageBytes.find((char) 0);
if(index != ByteVector::npos)
if(index != ByteVector::npos())
messageBytes.resize(index, 0);
messageBytes.replace('\r', '\n');
message = messageBytes;

View File

@ -45,8 +45,7 @@ bool Mod::FileBase::readString(String &s, uint size)
ByteVector data(readBlock(size));
if(data.size() < size) return false;
const size_t index = data.find((char) 0);
if(index != ByteVector::npos)
{
if(index != ByteVector::npos()) {
data.resize(index);
}
data.replace((char) 0xff, ' ');

View File

@ -191,7 +191,7 @@ void UserUrlLinkFrame::parseFields(const ByteVector &data)
if(d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8) {
const size_t offset = data.find(textDelimiter(d->textEncoding), pos);
if(offset == ByteVector::npos || offset < pos)
if(offset == ByteVector::npos() || offset < pos)
return;
d->description = String(data.mid(pos, offset - pos), d->textEncoding);
@ -199,7 +199,7 @@ void UserUrlLinkFrame::parseFields(const ByteVector &data)
}
else {
const size_t len = data.mid(pos).find(textDelimiter(d->textEncoding), 0, 2);
if(len == ByteVector::npos)
if(len == ByteVector::npos())
return;
d->description = String(data.mid(pos, len), d->textEncoding);

View File

@ -310,7 +310,7 @@ String Frame::readStringField(const ByteVector &data, String::Type encoding, siz
ByteVector delimiter = textDelimiter(encoding);
const size_t end = data.find(delimiter, position, delimiter.size());
if(end == ByteVector::npos || end < position)
if(end == ByteVector::npos() || end < position)
return String::null;
String str;

View File

@ -525,7 +525,7 @@ offset_t MPEG::File::findID3v2(offset_t offset)
// These variables are used to keep track of a partial match that happens at
// the end of a buffer.
size_t previousPartialMatch = ByteVector::npos;
size_t previousPartialMatch = ByteVector::npos();
bool previousPartialSynchMatch = false;
// Save the location of the current read pointer. We will restore the
@ -560,7 +560,7 @@ offset_t MPEG::File::findID3v2(offset_t offset)
if(previousPartialSynchMatch && secondSynchByte(buffer[0]))
return -1;
if(previousPartialMatch != ByteVector::npos && bufferSize() > previousPartialMatch) {
if(previousPartialMatch != ByteVector::npos() && bufferSize() > previousPartialMatch) {
const size_t patternOffset = (bufferSize() - previousPartialMatch);
if(buffer.containsAt(ID3v2::Header::fileIdentifier(), 0, patternOffset)) {
seek(originalPosition);
@ -571,7 +571,7 @@ offset_t MPEG::File::findID3v2(offset_t offset)
// (2) pattern contained in current buffer
const size_t location = buffer.find(ID3v2::Header::fileIdentifier());
if(location != ByteVector::npos) {
if(location != ByteVector::npos()) {
seek(originalPosition);
return offset + bufferOffset + location;
}
@ -582,7 +582,7 @@ offset_t MPEG::File::findID3v2(offset_t offset)
// (11111111) byte, and we want to check all such instances until we find
// a full match (11111111 111) or hit the end of the buffer.
while(firstSynchByte != ByteVector::npos) {
while(firstSynchByte != ByteVector::npos()) {
// if this *is not* at the end of the buffer

View File

@ -90,10 +90,10 @@ void MPEG::XingHeader::parse(const ByteVector &data)
// Look for a Xing header.
size_t offset = data.find("Xing");
if(offset == ByteVector::npos)
if(offset == ByteVector::npos())
offset = data.find("Info");
if(offset != ByteVector::npos) {
if(offset != ByteVector::npos()) {
// Xing header found.
@ -117,7 +117,7 @@ void MPEG::XingHeader::parse(const ByteVector &data)
offset = data.find("VBRI");
if(offset != ByteVector::npos) {
if(offset != ByteVector::npos()) {
// VBRI header found.

View File

@ -106,19 +106,19 @@ size_t findChar(
{
const size_t dataSize = dataEnd - dataBegin;
if(offset + 1 > dataSize)
return ByteVector::npos;
return ByteVector::npos();
// n % 0 is invalid
if(byteAlign == 0)
return ByteVector::npos;
return ByteVector::npos();
for(TIterator it = dataBegin + offset; it < dataEnd; it += byteAlign) {
if(*it == c)
return (it - dataBegin);
}
return ByteVector::npos;
return ByteVector::npos();
}
template <class TIterator>
@ -130,7 +130,7 @@ size_t findVector(
const size_t dataSize = dataEnd - dataBegin;
const size_t patternSize = patternEnd - patternBegin;
if(patternSize == 0 || offset + patternSize > dataSize)
return ByteVector::npos;
return ByteVector::npos();
// Special case that pattern contains just single char.
@ -161,7 +161,7 @@ size_t findVector(
}
}
return ByteVector::npos;
return ByteVector::npos();
}
template <typename T, size_t LENGTH, ByteOrder ENDIAN>
@ -327,11 +327,14 @@ public:
// static members
////////////////////////////////////////////////////////////////////////////////
const size_t ByteVector::npos = static_cast<size_t>(-1);
size_t ByteVector::npos()
{
return static_cast<size_t>(-1);
}
ByteVector ByteVector::fromCString(const char *s, size_t length)
{
if(length == npos)
if(length == npos())
return ByteVector(s);
else
return ByteVector(s, length);
@ -489,8 +492,8 @@ size_t ByteVector::rfind(const ByteVector &pattern, size_t offset, size_t byteAl
const size_t pos = findVector<ConstReverseIterator>(
rbegin(), rend(), pattern.rbegin(), pattern.rend(), offset, byteAlign);
if(pos == npos)
return npos;
if(pos == npos())
return npos();
else
return size() - pos - pattern.size();
}
@ -532,7 +535,7 @@ ByteVector &ByteVector::replace(const ByteVector &pattern, const ByteVector &wit
while (true)
{
offset = find(pattern, offset);
if(offset == npos)
if(offset == npos())
break;
detach();
@ -565,7 +568,7 @@ ByteVector &ByteVector::replace(const ByteVector &pattern, const ByteVector &wit
size_t ByteVector::endsWithPartialMatch(const ByteVector &pattern) const
{
if(pattern.size() > size())
return npos;
return npos();
const size_t startIndex = size() - pattern.size();
@ -577,7 +580,7 @@ size_t ByteVector::endsWithPartialMatch(const ByteVector &pattern) const
return startIndex + i;
}
return npos;
return npos();
}
ByteVector &ByteVector::append(const ByteVector &v)

View File

@ -126,7 +126,7 @@ namespace TagLib {
* for \a length bytes. If \a length is not specified it will return the bytes
* from \a index to the end of the vector.
*/
ByteVector mid(size_t index, size_t length = npos) const;
ByteVector mid(size_t index, size_t length = npos()) const;
/*!
* This essentially performs the same as operator[](), but instead of causing
@ -136,7 +136,7 @@ namespace TagLib {
/*!
* Searches the ByteVector for \a pattern starting at \a offset and returns
* the offset. Returns \a npos if the pattern was not found. If \a byteAlign is
* the offset. Returns npos() if the pattern was not found. If \a byteAlign is
* specified the pattern will only be matched if it starts on a byte divisible
* by \a byteAlign (starting from \a offset).
*/
@ -152,7 +152,7 @@ namespace TagLib {
/*!
* Searches the ByteVector for \a pattern starting from either the end of the
* vector or \a offset and returns the offset. Returns \ npos if the pattern was
* vector or \a offset and returns the offset. Returns npos() if the pattern was
* not found. If \a byteAlign is specified the pattern will only be matched
* if it starts on a byte divisible by \a byteAlign (starting from \a offset).
*/
@ -166,7 +166,7 @@ namespace TagLib {
* the \a patternLength argument.
*/
bool containsAt(
const ByteVector &pattern, size_t offset, size_t patternOffset = 0, size_t patternLength = npos) const;
const ByteVector &pattern, size_t offset, size_t patternOffset = 0, size_t patternLength = npos()) const;
/*!
* Returns true if the vector starts with \a pattern.
@ -186,7 +186,7 @@ namespace TagLib {
/*!
* Checks for a partial match of \a pattern at the end of the vector. It
* returns the offset of the partial match within the vector, or \a npos if the
* returns the offset of the partial match within the vector, or npos() if the
* pattern is not found. This method is particularly useful when searching for
* patterns that start in one vector and end in another. When combined with
* startsWith() it can be used to find a pattern that overlaps two buffers.
@ -267,7 +267,6 @@ namespace TagLib {
* Returns true if the ByteVector is empty.
*
* \see size()
* \see isNull()
*/
bool isEmpty() const;
@ -482,7 +481,7 @@ namespace TagLib {
/*!
* Returns a ByteVector based on the CString \a s.
*/
static ByteVector fromCString(const char *s, size_t length = npos);
static ByteVector fromCString(const char *s, size_t length = npos());
/*!
* Returns a const reference to the byte at \a index.
@ -556,11 +555,11 @@ namespace TagLib {
void swap(ByteVector &v);
/*!
* When used as the value for a \a length or \a patternLength parameter
* in ByteVector's member functions, means "until the end of the data".
* As a return value, it is usually used to indicate no matches.
*/
static const size_t npos;
* Returns a special value used for \a length or \a patternLength parameters
* of ByteVector's member functions, means "until the end of the data".
* As a return value, it is usually used to indicate no matches.
*/
static size_t npos();
/*!
* Returns a hex-encoded copy of the byte vector.

View File

@ -38,7 +38,7 @@ ByteVectorList ByteVectorList::split(
size_t previousOffset = 0;
for(size_t offset = v.find(pattern, 0, byteAlign);
offset != ByteVector::npos && (max == 0 || max > l.size() + 1);
offset != ByteVector::npos() && (max == 0 || max > l.size() + 1);
offset = v.find(pattern, offset + pattern.size(), byteAlign))
{
if(offset - previousOffset >= 1)

View File

@ -131,8 +131,8 @@ offset_t File::find(const ByteVector &pattern, offset_t fromOffset, const ByteVe
// These variables are used to keep track of a partial match that happens at
// the end of a buffer.
size_t previousPartialMatch = ByteVector::npos;
size_t beforePreviousPartialMatch = ByteVector::npos;
size_t previousPartialMatch = ByteVector::npos();
size_t beforePreviousPartialMatch = ByteVector::npos();
// Save the location of the current read pointer. We will restore the
// position using seek() before all returns.
@ -169,7 +169,7 @@ offset_t File::find(const ByteVector &pattern, offset_t fromOffset, const ByteVe
// (1) previous partial match
if(previousPartialMatch != ByteVector::npos
if(previousPartialMatch != ByteVector::npos()
&& bufferSize() > previousPartialMatch)
{
const size_t patternOffset = (bufferSize() - previousPartialMatch);
@ -180,7 +180,7 @@ offset_t File::find(const ByteVector &pattern, offset_t fromOffset, const ByteVe
}
if(!before.isEmpty()
&& beforePreviousPartialMatch != ByteVector::npos
&& beforePreviousPartialMatch != ByteVector::npos()
&& bufferSize() > beforePreviousPartialMatch)
{
const size_t beforeOffset = (bufferSize() - beforePreviousPartialMatch);
@ -193,12 +193,12 @@ offset_t File::find(const ByteVector &pattern, offset_t fromOffset, const ByteVe
// (2) pattern contained in current buffer
size_t location = buffer.find(pattern);
if(location != ByteVector::npos) {
if(location != ByteVector::npos()) {
seek(originalPosition);
return bufferOffset + location;
}
if(!before.isEmpty() && buffer.find(before) != ByteVector::npos) {
if(!before.isEmpty() && buffer.find(before) != ByteVector::npos()) {
seek(originalPosition);
return -1;
}
@ -263,12 +263,12 @@ offset_t File::rfind(const ByteVector &pattern, offset_t fromOffset, const ByteV
// (2) pattern contained in current buffer
const size_t location = buffer.rfind(pattern);
if(location != ByteVector::npos) {
if(location != ByteVector::npos()) {
seek(originalPosition);
return bufferOffset + location;
}
if(!before.isEmpty() && buffer.find(before) != ByteVector::npos) {
if(!before.isEmpty() && buffer.find(before) != ByteVector::npos()) {
seek(originalPosition);
return -1;
}

View File

@ -132,7 +132,7 @@ namespace
ByteVector data = file.readBlock(std::min(m_size, limit));
size_t count = data.size();
const size_t index = data.find((char) 0);
if(index != ByteVector::npos) {
if(index != ByteVector::npos()) {
data.resize(index);
}
data.replace((char) 0xff, ' ');

View File

@ -95,24 +95,24 @@ public:
CPPUNIT_ASSERT_EQUAL((size_t)4, ByteVector("....SggO."). find("SggO", 2));
CPPUNIT_ASSERT_EQUAL((size_t)4, ByteVector("....SggO."). find("SggO", 3));
CPPUNIT_ASSERT_EQUAL((size_t)4, ByteVector("....SggO."). find("SggO", 4));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, ByteVector("....SggO."). find("SggO", 5));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, ByteVector("....SggO."). find("SggO", 6));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, ByteVector("....SggO."). find("SggO", 7));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, ByteVector("....SggO."). find("SggO", 8));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), ByteVector("....SggO."). find("SggO", 5));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), ByteVector("....SggO."). find("SggO", 6));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), ByteVector("....SggO."). find("SggO", 7));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), ByteVector("....SggO."). find("SggO", 8));
// Intentional out-of-bounds access.
ByteVector v("0123456789x");
v.resize(10);
v.data()[10] = 'x';
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, v.find("789x", 7));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), v.find("789x", 7));
}
void testFind2()
{
CPPUNIT_ASSERT_EQUAL((size_t)0, ByteVector("\x01", 1).find("\x01"));
CPPUNIT_ASSERT_EQUAL((size_t)0, ByteVector("\x01\x02", 2).find("\x01\x02"));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, ByteVector("\x01", 1).find("\x02"));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, ByteVector("\x01\x02", 2).find("\x01\x03"));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), ByteVector("\x01", 1).find("\x02"));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), ByteVector("\x01\x02", 2).find("\x01\x03"));
}
void testRfind1()
@ -137,8 +137,8 @@ public:
ByteVector r3("OggS******OggS");
ByteVector r4("OggS*OggS*OggS");
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, r0.find("OggS"));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, r0.rfind("OggS"));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), r0.find("OggS"));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), r0.rfind("OggS"));
CPPUNIT_ASSERT_EQUAL((size_t)0, r1.find("OggS"));
CPPUNIT_ASSERT_EQUAL((size_t)0, r1.rfind("OggS"));
CPPUNIT_ASSERT_EQUAL((size_t)10, r2.find("OggS"));
@ -343,7 +343,7 @@ public:
CPPUNIT_ASSERT_EQUAL('B', b[9]);
b.resize(3, 'C');
CPPUNIT_ASSERT_EQUAL(size_t(3), b.size());
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, b.find('C'));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), b.find('C'));
b.resize(3);
CPPUNIT_ASSERT_EQUAL(size_t(3), b.size());
@ -368,7 +368,7 @@ public:
CPPUNIT_ASSERT_EQUAL('B', c[9]);
c.resize(3, 'C');
CPPUNIT_ASSERT_EQUAL(size_t(3), c.size());
CPPUNIT_ASSERT_EQUAL(ByteVector::npos, c.find('C'));
CPPUNIT_ASSERT_EQUAL(ByteVector::npos(), c.find('C'));
}
void testAppend()