From f8bfc78cad3569577c1371cd2fe42509eedb6713 Mon Sep 17 00:00:00 2001 From: erius Date: Mon, 28 Oct 2024 05:23:42 +0300 Subject: [PATCH] Updated README.md to include additional info about this project Implemented reading settings from config file ftsort now outputs total runtime in ms and peak virtual memory usage Added some error handling Added documenation to tape_config.h Changed catch2 cmake dependency to be resolved using FetchContent Added generate_input test binary to generate big input tape data sets Header inclusion path changed to _include_ directory, so that tapelib has to be explicitly specified in include directrives --- CMakeLists.txt | 1 - README.md | 35 +++++++++++++++++++++++ bin/ftsort/ftsort.cpp | 47 +++++++++++++++++++++++++++++-- bin/ftsort/tape_config.cpp | 52 +++++++++++++++++++++++++++++++++++ bin/ftsort/tape_config.h | 22 +++++++++++++-- include/tapelib/filetape.h | 2 ++ src/CMakeLists.txt | 2 +- src/filetape.cpp | 4 +-- src/tape_util.cpp | 2 +- tests/CMakeLists.txt | 14 +++++++++- tests/filetape_sort_tests.cpp | 2 +- tests/filetape_tests.cpp | 2 +- tests/generate_input.cpp | 35 +++++++++++++++++++++++ 13 files changed, 207 insertions(+), 13 deletions(-) create mode 100644 tests/generate_input.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c99a36..1ae64bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,6 @@ project(yadro-task VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -set(CMAKE_BUILD_TYPE Debug) # clang-tidy find_program(CLANG_TIDY_EXE NAMES clang-tidy REQUIRED) diff --git a/README.md b/README.md index 681d3de..e5a6960 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,38 @@ - Написать класс, реализующий алгоритм сортировки данных с входной ленты на выходную. - Консольное приложение должно принимать на вход имя входного и выходного файлов и производить сортировку. - Желательно написать юнит-тесты. + +# Описание + +Проект использует CMake для сборки. Некоторый функционал проекта несовместим с _Windows_ и _MacOS_ (получение используемой памяти, создание временных файлов и т. п.) Проект успешно собирался на _Linux_ _x86_64_ и _aarch64_. Документация реализована посредством этого __README__ файла, а также подробными комментариями в коде + +Структура проекта: +- ```bin``` - Исходный код исполняемых файлов + - ```ftsort``` - Исходный код основной программы проекта +- ```include``` - Директория для заголовков + - ```tapelib``` - Директория для заголовков библиотеки ```tapelib``` +- ```src``` - Исходный код библиотек +- ```tests``` - Исходный код unit-тестов + +# Сборка + +## Linux +1. Склонируйте данный репозиторий и перейдите в него +``` +git clone https://git.obamna.ru/erius/yadro-task.git +cd yadro-task +``` +2. Сгенерируйте файлы сборки CMake +``` +cmake -S . -B build +``` +3. Соберите проект с помощью CMake +``` +cmake --build build +``` +4. Запустите unit-тесты +``` +ctest --test-dir build -V +``` + +Сборка и работоспособность проекта не проверялись на _Windows_ и _MacOS_ diff --git a/bin/ftsort/ftsort.cpp b/bin/ftsort/ftsort.cpp index d6c8b94..5143542 100644 --- a/bin/ftsort/ftsort.cpp +++ b/bin/ftsort/ftsort.cpp @@ -1,6 +1,26 @@ #include "tape_config.h" -#include "tape_util.h" +#include "tapelib/tape_util.h" +#include +#include +#include #include +#include + +size_t get_mem_peak() { + const static std::string mem_info_file = "/proc/self/status"; + const static std::string mem_field = "VmPeak:"; + std::ifstream status(mem_info_file); + size_t mem = 0; + std::string line; + while (std::getline(status, line)) { + if (line.find(mem_field) != std::string::npos) { + std::stringstream mem_line(line.substr(mem_field.size())); + mem_line >> mem; + return mem; + } + } + return mem; +} int main(int argc, char *argv[]) { AppSettings settings = parse_command_line(argc, argv); @@ -12,15 +32,38 @@ int main(int argc, char *argv[]) { std::cerr << HELP_MSG << std::endl; return 0; } + if (!settings.config_file_path.empty() && + !read_settings_from_file(settings)) { + return -1; + } tape::FileTape input(settings.input_file_name, settings.ft_settings); + if (!input.is_open()) { + std::cerr << "Failed to create INPUT tape - file not found or " + "insufficient permissions" + << std::endl; + return -1; + } tape::FileTape output(input, settings.output_file_name, settings.ft_settings); - // tmp tape factory that captures cmd.settings from local scope + if (!output.is_open()) { + std::cerr << "Failed to create OUTPUT tape - insufficient permissions" + << std::endl; + return -1; + } + // tmp tape factory that captures settings.ft_settings from local scope tape::TempTapeFactory factory = [&](size_t cells) -> std::unique_ptr { return std::make_unique( tape::FileTape(cells, settings.ft_settings)); }; + auto start = std::chrono::high_resolution_clock::now(); tape::external_sort(input, output, factory, settings.memory_limit); + auto end = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + std::cout << "Successfully sorted " << settings.input_file_name << " into " + << settings.output_file_name << std::endl; + std::cout << "The operation took " << duration.count() + << " ms to complete and peaked at " << get_mem_peak() + << " KiB of virtual memory usage" << std::endl; return 0; } diff --git a/bin/ftsort/tape_config.cpp b/bin/ftsort/tape_config.cpp index d8870d2..c3659fa 100644 --- a/bin/ftsort/tape_config.cpp +++ b/bin/ftsort/tape_config.cpp @@ -1,6 +1,10 @@ #include "tape_config.h" #include +#include #include +#include +#include +#include const static struct std::vector