From 2cf972fcbeaeb36d926224cab85c2bec412f01ac Mon Sep 17 00:00:00 2001 From: vng Date: Fri, 31 Dec 2010 16:35:49 +0200 Subject: [PATCH] Correct container of files. --- coding/coding_tests/coding_tests.pro | 3 +- coding/coding_tests/file_container_test.cpp | 43 +++++++++++++++++++++ coding/file_container.cpp | 16 ++++---- coding/file_writer.hpp | 2 + 4 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 coding/coding_tests/file_container_test.cpp diff --git a/coding/coding_tests/coding_tests.pro b/coding/coding_tests/coding_tests.pro index 7e1a6dcdf4..c6dad8d4f4 100644 --- a/coding/coding_tests/coding_tests.pro +++ b/coding/coding_tests/coding_tests.pro @@ -25,7 +25,8 @@ SOURCES += ../../testing/testingmain.cpp \ writer_test.cpp \ var_record_reader_test.cpp \ file_sort_test.cpp \ - reader_cache_test.cpp + reader_cache_test.cpp \ + file_container_test.cpp \ HEADERS += \ reader_test.hpp diff --git a/coding/coding_tests/file_container_test.cpp b/coding/coding_tests/file_container_test.cpp new file mode 100644 index 0000000000..4e2a4d9907 --- /dev/null +++ b/coding/coding_tests/file_container_test.cpp @@ -0,0 +1,43 @@ +#include "../../testing/testing.hpp" + +#include "../file_container.hpp" +#include "../varint.hpp" + +#include "../../base/string_utils.hpp" + + +UNIT_TEST(FileContainer_Smoke) +{ + string const fName = "file_container.tmp"; + size_t const count = 10; + + { + FilesContainerW writer(fName); + + for (size_t i = 0; i < count; ++i) + { + FileWriter w = writer.GetWriter(utils::to_string(i)); + + for (uint32_t j = 0; j < i; ++j) + WriteVarUint(w, j); + } + + writer.Finish(); + } + + { + FilesContainerR reader(fName); + + for (size_t i = 0; i < count; ++i) + { + FileReader r = reader.GetReader(utils::to_string(i)); + ReaderSource src(r); + + for (uint32_t j = 0; j < i; ++j) + { + uint32_t const test = ReadVarUint(src); + CHECK_EQUAL(j, test, ()); + } + } + } +} diff --git a/coding/file_container.cpp b/coding/file_container.cpp index 0d9aab407a..9aeb9ce3af 100644 --- a/coding/file_container.cpp +++ b/coding/file_container.cpp @@ -2,14 +2,15 @@ #include "file_container.hpp" #include "varint.hpp" +#include "write_to_sink.hpp" FilesContainerR::FilesContainerR(string const & fName) : m_source(fName) { - ReaderSource src(m_source); + uint64_t offset = ReadPrimitiveFromPos(m_source, 0); - uint64_t const offset = ReadVarUint(src); + ReaderSource src(m_source); src.Skip(offset); uint32_t const count = ReadVarUint(src); @@ -64,18 +65,17 @@ FileWriter FilesContainerW::GetWriter(Tag const & tag) void FilesContainerW::Finish() { - uint64_t const curr = SaveCurrentSize(); - { + uint64_t const curr = SaveCurrentSize(); FileWriter writer(m_name, FileWriter::OP_WRITE_EXISTING); - writer.Write(&curr, sizeof(curr)); + writer.Seek(0); + WriteToSink(writer, curr); } - FileWriter writer(m_name, FileWriter::OP_APPEND); - writer.Write(&curr, sizeof(curr)); - sort(m_info.begin(), m_info.end(), less_info()); + FileWriter writer(m_name, FileWriter::OP_APPEND); + uint32_t const count = m_info.size(); WriteVarUint(writer, count); diff --git a/coding/file_writer.hpp b/coding/file_writer.hpp index fd246ffa3d..f862111e14 100644 --- a/coding/file_writer.hpp +++ b/coding/file_writer.hpp @@ -23,6 +23,8 @@ public: OP_APPEND = 3 }; + /// Works like "move semantics". + /// Added for use in FilesContainerW interface. FileWriter(FileWriter const & rhs); explicit FileWriter(string const & fileName, Op operation = OP_WRITE_TRUNCATE);