Minor refactoring.

This commit is contained in:
Yury Melnichek 2012-07-29 14:34:36 +02:00 committed by Alex Zolotarev
parent 6dd8a1af0b
commit 8a6c4f394e
5 changed files with 39 additions and 28 deletions

View file

@ -6,14 +6,14 @@
UNIT_TEST(DDVector)
{
vector<unsigned char> data;
vector<uint16_t> data;
// Push size. Big endian is used.
data.push_back(1);
data.push_back(2);
data.push_back(3);
typedef DDVector<unsigned char, MemReader> Vector;
typedef DDVector<uint16_t, MemReader> Vector;
MemReader reader(reinterpret_cast<char const *>(&data[0]), data.size() * sizeof(data[0]));
Vector v(reader, reader.Size()); // since sizeof(unsigned char) == 1
Vector v(reader);
TEST_EQUAL(3, v.size(), ());
TEST_EQUAL(1, v[0], ());
TEST_EQUAL(2, v[1], ());

View file

@ -128,8 +128,8 @@ UNIT_TEST(DiffSimpleReplace)
char const dst[] = "abcyydef";
MemReader srcReader(src, ARRAY_SIZE(src) - 1);
MemReader dstReader(dst, ARRAY_SIZE(dst) - 1);
DDVector<char, MemReader> srcV(srcReader, srcReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader, dstReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> srcV(srcReader); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader); // since sizeof(char) == 1
diff::SimpleReplaceDiffer differ;
@ -150,8 +150,8 @@ UNIT_TEST(DiffSimpleReplaceEmptyBegin)
char const dst[] = "yydef";
MemReader srcReader(src, ARRAY_SIZE(src) - 1);
MemReader dstReader(dst, ARRAY_SIZE(dst) - 1);
DDVector<char, MemReader> srcV(srcReader, srcReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader, dstReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> srcV(srcReader); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader); // since sizeof(char) == 1
diff::SimpleReplaceDiffer differ;
@ -172,8 +172,8 @@ UNIT_TEST(DiffSimpleReplaceEmptyEnd)
char const dst[] = "abcyy";
MemReader srcReader(src, ARRAY_SIZE(src) - 1);
MemReader dstReader(dst, ARRAY_SIZE(dst) - 1);
DDVector<char, MemReader> srcV(srcReader, srcReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader, dstReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> srcV(srcReader); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader); // since sizeof(char) == 1
diff::SimpleReplaceDiffer differ;
@ -194,8 +194,8 @@ UNIT_TEST(DiffSimpleReplaceAllEqual)
char const dst[] = "abcdef";
MemReader srcReader(src, ARRAY_SIZE(src) - 1);
MemReader dstReader(dst, ARRAY_SIZE(dst) - 1);
DDVector<char, MemReader> srcV(srcReader, srcReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader, dstReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> srcV(srcReader); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader); // since sizeof(char) == 1
diff::SimpleReplaceDiffer differ;
@ -216,8 +216,8 @@ UNIT_TEST(DiffWithRollingHashEqualStrings)
char const dst[] = "abcdefklmno";
MemReader srcReader(src, ARRAY_SIZE(src) - 1);
MemReader dstReader(dst, ARRAY_SIZE(dst) - 1);
DDVector<char, MemReader> srcV(srcReader, srcReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader, dstReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> srcV(srcReader); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader); // since sizeof(char) == 1
diff::RollingHashDiffer<diff::SimpleReplaceDiffer, RollingHasher64> differ(3);
@ -232,8 +232,8 @@ UNIT_TEST(DiffWithRollingHashCompletelyDifferentStrings)
char const dst[] = "abcdefgh";
MemReader srcReader(src, ARRAY_SIZE(src) - 1);
MemReader dstReader(dst, ARRAY_SIZE(dst) - 1);
DDVector<char, MemReader> srcV(srcReader, srcReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader, dstReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> srcV(srcReader); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader); // since sizeof(char) == 1
diff::RollingHashDiffer<diff::SimpleReplaceDiffer, RollingHasher64> differ(3);
@ -248,8 +248,8 @@ UNIT_TEST(DiffWithRollingHash1)
char const dst[] = "abcdfeghikkklmnop";
MemReader srcReader(src, ARRAY_SIZE(src) - 1);
MemReader dstReader(dst, ARRAY_SIZE(dst) - 1);
DDVector<char, MemReader> srcV(srcReader, srcReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader, dstReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> srcV(srcReader); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader); // since sizeof(char) == 1
diff::RollingHashDiffer<diff::SimpleReplaceDiffer, RollingHasher64> differ(3);
@ -264,8 +264,8 @@ UNIT_TEST(DiffWithRollingHash2)
char const dst[] = "abxdeflmnop";
MemReader srcReader(src, ARRAY_SIZE(src) - 1);
MemReader dstReader(dst, ARRAY_SIZE(dst) - 1);
DDVector<char, MemReader> srcV(srcReader, srcReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader, dstReader.Size()); // since sizeof(char) == 1
DDVector<char, MemReader> srcV(srcReader); // since sizeof(char) == 1
DDVector<char, MemReader> dstV(dstReader); // since sizeof(char) == 1
diff::RollingHashDiffer<diff::SimpleReplaceDiffer, RollingHasher64> differ(3);

View file

@ -25,8 +25,15 @@ public:
DDVector() : m_Size(0) {}
DDVector(TReader const & reader, size_type size) : m_reader(reader), m_Size(size)
explicit DDVector(TReader const & reader) : m_reader(reader)
{
InitSize();
}
void Init(TReader const & reader)
{
m_reader = reader;
InitSize();
}
size_type size() const
@ -36,10 +43,7 @@ public:
T const operator [] (size_type i) const
{
ASSERT_LESS(i, m_Size, ());
T result;
this->Read(i, result);
return result;
return ReadPrimitiveFromPos<T>(m_reader, static_cast<uint64_t>(i) * sizeof(T));
}
class const_iterator : public iterator_facade<
@ -69,7 +73,7 @@ public:
ASSERT_LESS(m_I, m_Size, (m_bValueRead));
if (!m_bValueRead)
{
ReadFromPos(*m_pReader, m_I * sizeof(T), &m_Value, sizeof(T));
m_Value = ReadPrimitiveFromPos<T>(*m_pReader, static_cast<uint64_t>(m_I) * sizeof(T));
m_bValueRead = true;
}
return m_Value;
@ -157,6 +161,13 @@ public:
}
private:
void InitSize()
{
// TODO: Check that reader.Size() % sizeof(T) == 0
m_Size = m_reader.Size() / sizeof(T);
}
// TODO: Refactor me to use Reader by pointer.
ReaderType m_reader;
size_type m_Size;
};

View file

@ -5,7 +5,8 @@
class PolymorphReader
{
public:
explicit PolymorphReader(Reader const * pReader) : m_pReader(pReader)
// Takes ownership of pReader
explicit PolymorphReader(Reader const * pReader = 0) : m_pReader(pReader)
{
}

View file

@ -19,8 +19,7 @@ sl::SortedIndex::SortedIndex(Dictionary const & dictionary,
Reader const * pIndexReader,
StrFn const & strFn)
: m_Dictionary(dictionary), m_StrFn(strFn),
m_SortedVector( PolymorphReader(pIndexReader),
static_cast<DDVectorType::size_type>(pIndexReader->Size() / sizeof(DicId)))
m_SortedVector(PolymorphReader(pIndexReader))
{
STATIC_ASSERT(sizeof(sl::SortedIndex::DicId) == 3);
}