diff --git a/.travis.yml b/.travis.yml index a49bc1f..b00ee99 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,9 @@ addons: before_install: - sudo apt-get update -qq +install: + - sudo apt-get install doxygen graphviz -y + script: - bash scripts/deploy.sh @@ -18,7 +21,7 @@ before_deploy: - sed -i "s/__VERSION__/$TRAVIS_BUILD_NUMBER/g" bintray-spec.json deploy: - - provider: pages + - provider: pages skip_cleanup: true github_token: $GITHUB_TOKEN keep-history: true diff --git a/CMakeLists.txt b/CMakeLists.txt index b91b16e..773b056 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,9 +20,9 @@ option(ENABLE_DOXYGEN "Build documentation" OFF) # ================ Project ======================== # Project name and a few useful settings -project(struct +project(bulk VERSION 0.0.$ENV{TRAVIS_BUILD_NUMBER} - DESCRIPTION "OTUS c++ homeworks: struct" + DESCRIPTION "OTUS c++ homeworks: bulk" LANGUAGES CXX ) diff --git a/apps/Bulk/CMakeLists.txt b/apps/Bulk/CMakeLists.txt new file mode 100644 index 0000000..9c97604 --- /dev/null +++ b/apps/Bulk/CMakeLists.txt @@ -0,0 +1,4 @@ +add_and_install_project_app(bulk + DEPEND + lib_Bulk +) \ No newline at end of file diff --git a/apps/Bulk/src/main_Bulk.cpp b/apps/Bulk/src/main_Bulk.cpp new file mode 100644 index 0000000..3906610 --- /dev/null +++ b/apps/Bulk/src/main_Bulk.cpp @@ -0,0 +1,22 @@ +/** + * \brief Main application + */ +#include +#include +#include + + +int main(int arg, char**args) { + if (arg !=2) { + std::cerr << "Wrong number of params. It should be exactly 1, but " << arg - 1 << " provided\n"; + return -1; + } + + auto bulk = std::make_shared(std::atoi(args[1])); + bulk::PrintReportDefault a(bulk); + bulk::PrintReportToFile b(bulk); + + std::cin >> bulk; + + return 0; +} diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 21a8617..cebb37c 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -1 +1 @@ -add_subdirectory(Struct) \ No newline at end of file +add_subdirectory(Bulk) \ No newline at end of file diff --git a/apps/Struct/CMakeLists.txt b/apps/Struct/CMakeLists.txt deleted file mode 100644 index 0e04147..0000000 --- a/apps/Struct/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -add_and_install_project_app(matrix - DEPEND - lib_Struct -) \ No newline at end of file diff --git a/apps/Struct/src/main_Struct.cpp b/apps/Struct/src/main_Struct.cpp deleted file mode 100644 index 7b393bc..0000000 --- a/apps/Struct/src/main_Struct.cpp +++ /dev/null @@ -1,8 +0,0 @@ -/** - * \brief Main application - */ -#include - -int main() { - return 0; -} diff --git a/library/Struct/CMakeLists.txt b/library/Bulk/CMakeLists.txt similarity index 100% rename from library/Struct/CMakeLists.txt rename to library/Bulk/CMakeLists.txt diff --git a/library/Bulk/README.MD b/library/Bulk/README.MD new file mode 100644 index 0000000..5826479 --- /dev/null +++ b/library/Bulk/README.MD @@ -0,0 +1,68 @@ +# OTUS course: "C++ Developer. Professional" + +## Домашнее Задание 5 + +Разработать программу для пакетной обработки команд. + +Команды считываются построчно из стандартного ввода и обрабатываются блоками по N команд. Одна команда - одна строка, конкретное значение роли не играет. Если данные закончились - блок завершается принудительно. Параметр N передается как единственный параметр командной строки в виде целого числа. +Логика работы для статических блоков (в примере N == 3): + +```bash +./bulk 3 +``` + +| Ввод | Вывод | Комментарий | +|------|--------------------|-------------------------------------------| +| cmd1 | +| cmd2 | +| cmd3 | +| |bulk: cmd1, cmd2, cmd3| Блок завершён – выводим блок. | +| cmd4 | +| cmd5 | +| EOF | +| |bulk: cmd4, cmd5 |Конец ввода – принудительно завершаем блок.| + +Размер блока можно изменить динамически, если перед началом блока и сразу после дать команды `{` и `}` соответственно. Предыдущий пакет при этом принудительно завершается. Такие блоки могут быть включены друг в друга при этом вложенные команды `{` и `}` игнорируются (но не сами блоки). Если данные закончились внутри динамического блока, весь динамический блок игнорируется. + +Логика работы для динамического размера блоков (в примере N == 3): + +```bash +./bulk 3 +``` + +| Ввод | Вывод | Комментарий | +|------|--------------------|-------------------------------------------| +| cmd1 | +| cmd2 | +| { | +| | bulk: cmd1, cmd2 | Начало динамического блока – выводим предыдущий статический досрочно. | +| cmd3 | +| cmd4 | +| } | +| |bulk: cmd3, cmd4 |Конец динамического блока – выводим.| +| { | +| cmd5 | +| cmd6 | +| { | | Игнорируем вложенные команды. | +| cmd7 | +| cmd8 | +| } | | Игнорируем вложенные команды. | +| cmd9 | +| } | +| |bulk: cmd5, cmd6, cmd7, cmd8, cmd9| Конец динамического блока – выводим. | +| { | +| cmd10| +| cmd11| +| EOF | +|||Конец ввода – динамический блок игнорируется, не выводим.| + + +Вместе с выводом в консоль блоки должны сохранятся в отдельные файлы с именами +`bulk1517223860.log` , где 1517223860 - это время получения первой команды из блока. По одному файлу на блок. + +## Требования к реализации +Бинарный файл должен называться bulk. + +## Проверка +Задание считается выполненным успешно, если после установки пакета и запуска с тестовыми данными вывод соответствует описанию. Данные подаются на стандартный вход построчно с паузой в 1 секунду для визуального контроля. +Будет отмечена низкая связанность обработки данных, накопления пачек команд, вывода в консоль и сохранения в файлы. \ No newline at end of file diff --git a/library/Bulk/include/Bulk/Bulk.h b/library/Bulk/include/Bulk/Bulk.h new file mode 100644 index 0000000..96554de --- /dev/null +++ b/library/Bulk/include/Bulk/Bulk.h @@ -0,0 +1,60 @@ +/** + * \brief Class Bulk Declaration + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + + +namespace bulk { + +//------------------------------------ +#pragma mark Forward Declaration +//------------------------------------ + +class PrintReport; + + +//------------------------------------ +#pragma mark Main Bulk class declaration +//------------------------------------ + +/// \brief Main class to work with input commands +class Bulk { +public: + Bulk(); + explicit Bulk (const size_t chunk); + + friend std::istream& operator>>(std::istream& input, std::shared_ptr bulk); + + void AddReporter(std::shared_ptr); + + void Process(std::string cmd); + void ChopInput(std::string cmd); + void AgregateInput(std::string cmd); + + std::time_t GetTimestamp() const; + + void DoReport(); + +private: + enum class BehaviourStatus { + Separate, + AllinOne + }; + + BehaviourStatus status_ = BehaviourStatus::Separate; + const size_t chunk_size_ = 1; + std::vector command_package_; + std::queue braces_balancer_; + std::vector> reporters_; + std::time_t timestamp_; +}; + +} // namespace bulk \ No newline at end of file diff --git a/library/Bulk/include/Bulk/FormatUtil.h b/library/Bulk/include/Bulk/FormatUtil.h new file mode 100644 index 0000000..81f9944 --- /dev/null +++ b/library/Bulk/include/Bulk/FormatUtil.h @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + +namespace bulk::FormatUtil { + +auto Format(const std::vector&, const std::string& delimiter) -> std::string; +auto StripString(std::string&) -> void; + +} // namespace bulk::FormatUtil diff --git a/library/Bulk/include/Bulk/Reporter.h b/library/Bulk/include/Bulk/Reporter.h new file mode 100644 index 0000000..165a591 --- /dev/null +++ b/library/Bulk/include/Bulk/Reporter.h @@ -0,0 +1,58 @@ +#pragma once + +#include + +#include +#include +#include + +namespace bulk { + +//------------------------------------ +#pragma mark Forward declararions +//------------------------------------ + +// class Bulk; + +//------------------------------------ +#pragma mark Reporters declaration +//------------------------------------ + +/// \brief Interface for reporters +class PrintReport { +public: + PrintReport() = default; + + explicit PrintReport(const std::string& delimiter); + virtual void Print(const std::vector&) const = 0; + virtual ~PrintReport() = default; +protected: + std::string delimiter_; +}; + +/// \brief Report to std::cout +class PrintReportDefault : public PrintReport { +public: + PrintReportDefault() = default; + + PrintReportDefault(std::shared_ptr bulk, std::ostream& source = std::cout); + ~PrintReportDefault() = default; + void Print(const std::vector&) const override; +private: + std::ostream& source_ = std::cout; +}; + + +/// \brief Report to file +class PrintReportToFile : public PrintReport { +public: + PrintReportToFile() = default; + + PrintReportToFile(std::shared_ptr bulk); + ~PrintReportToFile() = default; + void Print(const std::vector&) const override; +private: + std::shared_ptr bulk_ = nullptr; +}; + +} // namespace bulk diff --git a/library/Bulk/src/Bulk.cpp b/library/Bulk/src/Bulk.cpp new file mode 100644 index 0000000..07e1e31 --- /dev/null +++ b/library/Bulk/src/Bulk.cpp @@ -0,0 +1,100 @@ +/** + * \brief main library + * + */ + +#include +#include +#include + +#include +#include +#include + +namespace bulk { + +//--------------------------------- +#pragma mark Bulk Implementation +//--------------------------------- + +Bulk::Bulk() = default; + +Bulk::Bulk(const size_t chunk_size): + chunk_size_(chunk_size) { +} + +void Bulk::Process(std::string cmd) { + FormatUtil::StripString(cmd); + if (cmd == "{") { + if (braces_balancer_.empty()){ + DoReport(); + } + braces_balancer_.push('{'); + status_ = BehaviourStatus::AllinOne; + } + else if (cmd == "}"){ + if (!braces_balancer_.empty()) + braces_balancer_.pop(); + + if (braces_balancer_.empty()) { + DoReport(); + status_ = BehaviourStatus::Separate; + } + } + else { + if (command_package_.empty()) { + timestamp_ = std::time(0); + } + switch (status_) { + case BehaviourStatus::Separate: + ChopInput(std::move(cmd)); + break; + case BehaviourStatus::AllinOne: + AgregateInput(std::move(cmd)); + break; + } + } +} + +void Bulk::ChopInput(std::string cmd) { + if (chunk_size_ == command_package_.size()) { + DoReport(); + timestamp_ = std::time(0); + } + command_package_.push_back(cmd); +} + +void Bulk::AgregateInput(std::string cmd) { + command_package_.push_back(cmd); +} + +void Bulk::DoReport() { + if (braces_balancer_.empty()) { + for (const auto& reporter: reporters_) + reporter->Print(command_package_); + } + command_package_.clear(); +} + +std::time_t Bulk::GetTimestamp() const { + return timestamp_; +} + +void Bulk::AddReporter(std::shared_ptr new_reporter) { + if (new_reporter) { + reporters_.push_back(new_reporter); + } +} + +std::istream& operator>>(std::istream& input, std::shared_ptr bulk) { + std::string cmd; + while (std::getline(input, cmd)) { + FormatUtil::StripString(cmd); + bulk->Process(cmd); + } + // for the last input + bulk->DoReport(); + return input; +} + +} // namespace bulk \ No newline at end of file diff --git a/library/Bulk/src/FormatUtil.cpp b/library/Bulk/src/FormatUtil.cpp new file mode 100644 index 0000000..5dbcba3 --- /dev/null +++ b/library/Bulk/src/FormatUtil.cpp @@ -0,0 +1,37 @@ + +#include + +#include +#include +#include +#include + +namespace bulk::FormatUtil { + +void StripString(std::string& s){ + s.erase(s.begin(), std::find_if(s.begin(), s.end(), + [](char ch){ return !std::isspace(ch); + })); + s.erase(std::find_if(s.rbegin(), s.rend(), + [](char ch){ return !std::isspace(ch); + }).base(), s.end()); +} + +auto Format(const std::vector& value, const std::string& delimiter) -> std::string { + std::string result; + if (!value.empty()) { + const size_t result_size = std::accumulate(value.begin(), value.end(), 0, + [](size_t init, const std::string& s) { return init + s.size() + 2;} + ); + result.reserve(result_size-2); + // append first element + result += value.front(); + for (auto it = std::next(value.begin()); it != value.end(); ++it) { + result+= delimiter + *it; + } + } + + return result; +} + +} //namespace bulk::FormatUtil diff --git a/library/Bulk/src/Reporter.cpp b/library/Bulk/src/Reporter.cpp new file mode 100644 index 0000000..f9c03bf --- /dev/null +++ b/library/Bulk/src/Reporter.cpp @@ -0,0 +1,62 @@ +#include +#include +#include + +#include +#include +#include + +namespace bulk{ + +//------------------------------------------ +#pragma mark Interface for Reporter Implementation +//------------------------------------------ + +PrintReport::PrintReport(const std::string& delim): + delimiter_(delim) {} + +//------------------------------------------ +#pragma mark Default Reporter Implementation +//------------------------------------------ + + // PrintReportDefault(std::shared_ptr bulk, std::ostream& source_); +PrintReportDefault::PrintReportDefault(std::shared_ptr bulk, std::ostream& source): + PrintReport(", ") + , source_(source) { + if (bulk) { + bulk->AddReporter(std::make_shared(*this)); + } +} + +void PrintReportDefault::Print(const std::vector& value) const { + if (!value.empty()) { + std::string result = "bulk: "; + result += FormatUtil::Format(value, delimiter_); + source_ << result << std::endl; + } +} + +//------------------------------------------ +#pragma mark Report to file Implementation +//------------------------------------------ + +PrintReportToFile::PrintReportToFile(std::shared_ptr bulk): + PrintReport("\n") + , bulk_(bulk) { + if (bulk) { + bulk_->AddReporter(std::make_shared(*this)); + } +} + +void PrintReportToFile::Print(const std::vector& value) const { + if (!value.empty()) { + std::ofstream file; + file.open("bulk" + std::to_string(bulk_->GetTimestamp()) + ".log"); + if (file.is_open()){ + file << FormatUtil::Format(value, delimiter_); + } + file.close(); + } +} + +} //namespace bulk diff --git a/library/Struct/test/CMakeLists.txt b/library/Bulk/test/CMakeLists.txt similarity index 100% rename from library/Struct/test/CMakeLists.txt rename to library/Bulk/test/CMakeLists.txt diff --git a/library/Bulk/test/src/test_Bulk.cpp b/library/Bulk/test/src/test_Bulk.cpp new file mode 100644 index 0000000..e5ab54c --- /dev/null +++ b/library/Bulk/test/src/test_Bulk.cpp @@ -0,0 +1,155 @@ +#include +#include +#include + +#include + +using namespace bulk; + +TEST(Bulk, GeneralSequence) { + std::stringstream cmds; + + cmds << "0\n1\n{\n2\n3\n4\n5\n6\n7\n8\n}\n9"; + constexpr size_t chunk = 3; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 0, 1\nbulk: 2, 3, 4, 5, 6, 7, 8\nbulk: 9\n"; + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, MultipleCurvedBraces) { + std::stringstream cmds; + cmds << "0\n1\n{\n2\n3\n{\n4\n5\n6\n}\n7\n8\n}\n9"; + constexpr size_t chunk = 3; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + + cmds >> bulk; + std::string expected = "bulk: 0, 1\nbulk: 2, 3, 4, 5, 6, 7, 8\nbulk: 9\n"; + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, OpenCurvedBraces1) { + std::stringstream cmds; + cmds << "0\n1\n{\n2\n3\n{\n4\n5\n6\n7\n8\n9"; + constexpr size_t chunk = 3; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 0, 1\n"; + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, OpenCurvedBraces2) { + std::stringstream cmds; + cmds << "0\n1\n2\n3\n{\n4\n5\n6\n7\n8\n9"; + constexpr size_t chunk = 3; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 0, 1, 2\nbulk: 3\n"; + + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, OpenCurvedBraces3) { + std::stringstream cmds; + cmds << "0\n1\n2\n3\n{\n4\n5\n{6\n7\n8}\n9"; + constexpr size_t chunk = 3; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 0, 1, 2\nbulk: 3\n"; + + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, IncorrectInput) { + std::stringstream cmds; + cmds << "0\n1\n2\n3\n}\n4\n5\n6\n7\n8\n9"; + constexpr size_t chunk = 4; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 0, 1, 2, 3\nbulk: 4, 5, 6, 7\nbulk: 8, 9\n"; + + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, CrashTest1) { + std::stringstream cmds; + cmds << "{\n1\n}\n1"; + constexpr size_t chunk = 4; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 1\nbulk: 1\n"; + + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, CrashTest2) { + std::stringstream cmds; + cmds << "1\n{\n1\n}"; + constexpr size_t chunk = 4; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 1\nbulk: 1\n"; + + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, CmdWithParams) { + std::stringstream cmds; + cmds << "0 0\n{\n1 1\n}"; + constexpr size_t chunk = 4; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 0 0\nbulk: 1 1\n"; + + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, CmdWithParams2) { + std::stringstream cmds; + cmds << "0 0\n1 1\n2 2\n 3 3 \n { \n 1 1\n 2 2\n}\n 4 4"; + constexpr size_t chunk = 3; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 0 0, 1 1, 2 2\nbulk: 3 3\nbulk: 1 1, 2 2\nbulk: 4 4\n"; + + EXPECT_EQ(expected, received.str()); +} + +TEST(Bulk, CmdWithParams3) { + std::stringstream cmds; + cmds << "0 0\n1 1\n2 2\n 3 3 \n { \n 1 1\n 2 2\n 4 4"; + constexpr size_t chunk = 3; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + cmds >> bulk; + std::string expected = "bulk: 0 0, 1 1, 2 2\nbulk: 3 3\n"; + + EXPECT_EQ(expected, received.str()); +} + + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/library/Bulk/test/src/test_FormatUtil.cpp b/library/Bulk/test/src/test_FormatUtil.cpp new file mode 100644 index 0000000..64eff07 --- /dev/null +++ b/library/Bulk/test/src/test_FormatUtil.cpp @@ -0,0 +1,22 @@ +#include + +#include + +using namespace bulk::FormatUtil; + +TEST(BulkFormatUtil, Format) { + EXPECT_EQ("", Format({}, "")); + + std::vector v{"cmd1", "cmd2"}; + EXPECT_EQ("cmd1, cmd2", Format(v, ", ")); +} + +TEST(BulkFormatUtil, StripStringTest) { + std::string s = " 1123 "; + StripString(s); + EXPECT_EQ("1123", s); + + s = " 11{ 2 3 "; + StripString(s); + EXPECT_EQ("11{ 2 3", s); +} diff --git a/library/Bulk/test/src/test_Reporter.cpp b/library/Bulk/test/src/test_Reporter.cpp new file mode 100644 index 0000000..d825fab --- /dev/null +++ b/library/Bulk/test/src/test_Reporter.cpp @@ -0,0 +1,35 @@ +#include +#include + +#include +#include +#include + +using namespace bulk; + +TEST(BulkReporter, PrintReporter) { + { + std::ostringstream received; + PrintReportDefault a(nullptr, received); + + a.Print({}); + EXPECT_EQ("", received.str()); + a.Print({"1", "2"}); + EXPECT_EQ("bulk: 1, 2\n", received.str()); + } + + { + constexpr size_t chunk = 3; + auto bulk = std::make_shared(chunk); + std::ostringstream received; + PrintReportDefault a(bulk, received); + + a.Print({"0", "1"}); + EXPECT_EQ("bulk: 0, 1\n", received.str()); + received.str(""); + + a.Print({"0", "1", "2", "3"}); + EXPECT_EQ("bulk: 0, 1, 2, 3\n", received.str()); + } +} + diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 21a8617..cebb37c 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -1 +1 @@ -add_subdirectory(Struct) \ No newline at end of file +add_subdirectory(Bulk) \ No newline at end of file diff --git a/library/Struct/README.MD b/library/Struct/README.MD deleted file mode 100644 index 91ea7dd..0000000 --- a/library/Struct/README.MD +++ /dev/null @@ -1,52 +0,0 @@ -# OTUS course: "C++ Developer. Professional" - -## Домашнее Задание 5 - -В это самостоятельной работе создаём проект бесконечной разряженной матрицы с использованием паттернов проектирования, не забываем про принципы и документацию. -Спроектировать 2-мерную разреженную бесконечную матрицу, заполненную значениями по умолчанию. Матрица должна хранить только занятые элементы - значения которых хотя бы раз присваивались. Присвоение в ячейку значения по умолчанию освобождает ячейку. -Необходимо уметь отвечать на вопрос - сколько ячеек реально занято? -Необходимо уметь проходить по всем занятым ячейкам. Порядок не имеет значения. Возвращается позиция ячейки и ее значение. -При чтении элемента из свободной ячейки возвращать значение по умолчанию. - -## Пример - -```c++ -// бесконечная матрица int заполнена значениями -1 -Matrix matrix; assert(matrix.size() == -auto a = matrix[0][0]; -assert(a == -1); -assert(matrix.size() == 0); // все ячейки свободны -matrix[100][100] = 314; -assert(matrix[100][100] == 314); -assert(matrix.size() == 1); - -// выведется одна строка -// 100100314 -for(auto c: matrix) { - int x; - int y; - int v; - std::tie(x, y, v) = c; - std::cout << x << y << v << std::endl; -} -``` - -При запуске программы необходимо создать матрицу с пустым значением 0, заполнить главную диагональ матрицы (от [0,0] до [9,9]) значениями от 0 до 9. - -Второстепенную диагональ (от [0,9] до [9,0]) значениями от 9 до 0. - -Необходимо вывести фрагмент матрицы от [1,1] до [8,8]. Между столбцами пробел. Каждая строка матрицы на новой строке консоли. -Вывести количество занятых ячеек. - -Вывести все занятые ячейки вместе со своими позициями. Опционально реализовать N-мерную матрицу. - -Опционально реализовать каноническую форму оператора `=`, допускающую выражения `((matrix[100][100] = 314) = 0) = 217` - -## Самоконтроль -- индексация оператором `[]` -- количество занятых ячеек должно быть 18 -- пакет `matrix` с бинарным файлом `matrix` опубликован на bintray - -## Проверка - -Задание считается выполненным успешно, если после анализа кода, установки пакета и запуска приложения появился фрагмент матрицы, количество ячеек и список всех значений с позициями. \ No newline at end of file diff --git a/library/Struct/include/Struct/Struct.h b/library/Struct/include/Struct/Struct.h deleted file mode 100644 index a87ed57..0000000 --- a/library/Struct/include/Struct/Struct.h +++ /dev/null @@ -1,2 +0,0 @@ -// empty struct for future projects -#pragma once \ No newline at end of file diff --git a/library/Struct/src/Struct.cpp b/library/Struct/src/Struct.cpp deleted file mode 100644 index eabc7f4..0000000 --- a/library/Struct/src/Struct.cpp +++ /dev/null @@ -1 +0,0 @@ -#include \ No newline at end of file diff --git a/library/Struct/test/src/test_Struct.cpp b/library/Struct/test/src/test_Struct.cpp deleted file mode 100644 index e8e8c20..0000000 --- a/library/Struct/test/src/test_Struct.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include - -#include - -TEST(Struct, DummyTest) -{ - ASSERT_TRUE(true); -} - -int main(int argc, char** argv) { - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} \ No newline at end of file diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 5e89cac..b6787b6 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,5 +1,5 @@ -project=Struct -binary_name=struct +project=Bulk +binary_name=bulk cmake . -DENABLE_GTEST=ON -DENABLE_DOXYGEN=ON # build lib cmake --build . --target lib_$project