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