Skip to content

Commit

Permalink
create an io factory
Browse files Browse the repository at this point in the history
  • Loading branch information
vovatrykoz committed Dec 24, 2024
1 parent 7adbdfe commit f430139
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 53 deletions.
54 changes: 54 additions & 0 deletions include/setup/Factory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#ifndef _FACTORY_H_
#define _FACTORY_H_

#include <io/logger/ILogger.h>
#include <io/reader/ITaskInstanceReader.h>
#include <io/reader/ITaskReader.h>

#include <memory>
#include <optional>

namespace e2e {
namespace setup {
namespace factory {

using namespace e2e::io;

template <typename LoggerType, typename... Args>
std::unique_ptr<ILogger> makeLogger(Args... args)
requires std::is_base_of_v<ILogger, LoggerType>;

template <typename TaskInstanceReaderType, typename... Args>
std::unique_ptr<ITaskInstanceReader> makeTaskInstanceReader(Args... args)
requires std::is_base_of_v<ITaskInstanceReader, TaskInstanceReaderType>;

template <typename TaskReaderType, typename... Args>
std::unique_ptr<ITaskReader> makeTaskReader(Args... args)
requires std::is_base_of_v<ITaskReader, TaskReaderType>;

template <typename LoggerType, typename... Args>
inline std::unique_ptr<ILogger> makeLogger(Args... args)
requires std::is_base_of_v<ILogger, LoggerType>
{
return std::make_unique<LoggerType>(args...);
}

template <typename TaskInstanceReaderType, typename... Args>
inline std::unique_ptr<ITaskInstanceReader> makeTaskInstanceReader(Args... args)
requires std::is_base_of_v<ITaskInstanceReader, TaskInstanceReaderType>
{
return std::make_unique<TaskInstanceReaderType>(args...);
}

template <typename TaskReaderType, typename... Args>
inline std::unique_ptr<ITaskReader> makeTaskReader(Args... args)
requires std::is_base_of_v<ITaskReader, TaskReaderType>
{
return std::make_unique<TaskReaderType>(args...);
}

} // namespace factory
} // namespace setup
} // namespace e2e

#endif
41 changes: 0 additions & 41 deletions include/setup/Setup.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,53 +13,12 @@ namespace setup {

using namespace e2e::io;

// Get objects from supported types----------------------------------

template <typename LoggerType, typename... Args>
std::unique_ptr<ILogger> makeLogger(Args... args)
requires std::is_base_of_v<ILogger, LoggerType>;

template <typename TaskInstanceReaderType, typename... Args>
std::unique_ptr<ITaskInstanceReader> makeTaskInstanceReader(Args... args)
requires std::is_base_of_v<ITaskInstanceReader, TaskInstanceReaderType>;

template <typename TaskReaderType, typename... Args>
std::unique_ptr<ITaskReader> makeTaskReader(Args... args)
requires std::is_base_of_v<ITaskReader, TaskReaderType>;

// Get objects from supported types----------------------------------

// Get objects from strings types------------------------------------

std::unique_ptr<ILogger> logger(const std::string& loggerStr);
std::unique_ptr<ILogger> simpleLogger(const std::string& loggerStr);
std::unique_ptr<ITaskInstanceReader> taskInstanceReader(
const std::string& readerStr);
std::unique_ptr<ITaskReader> taskReader(const std::string& readerStr);

// Get objects from strings types------------------------------------

template <typename LoggerType, typename... Args>
inline std::unique_ptr<ILogger> makeLogger(Args... args)
requires std::is_base_of_v<ILogger, LoggerType>
{
return std::make_unique<LoggerType>(args...);
}

template <typename TaskInstanceReaderType, typename... Args>
inline std::unique_ptr<ITaskInstanceReader> makeTaskInstanceReader(Args... args)
requires std::is_base_of_v<ITaskInstanceReader, TaskInstanceReaderType>
{
return std::make_unique<TaskInstanceReaderType>(args...);
}

template <typename TaskReaderType, typename... Args>
inline std::unique_ptr<ITaskReader> makeTaskReader(Args... args)
requires std::is_base_of_v<ITaskReader, TaskReaderType>
{
return std::make_unique<TaskReaderType>(args...);
}

} // namespace setup
} // namespace e2e

Expand Down
10 changes: 6 additions & 4 deletions source/setup/Preset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <io/logger/SimplifiedConsoleLogger.h>
#include <io/reader/PlainTextTaskInstanceReader.h>
#include <io/reader/PlainTextTaskReader.h>
#include <setup/Factory.h>
#include <setup/Preset.h>

#include <iostream>
Expand All @@ -14,21 +15,22 @@ e2e::setup::preset::makeDefaultTaskInstanceReader() {
std::cout << "Reader type: text" << std::endl;
std::cout << "Enter path to input file: ";
std::cin >> inputPath;
return makeTaskInstanceReader<PlainTextTaskInstanceReader>(inputPath);
return factory::makeTaskInstanceReader<PlainTextTaskInstanceReader>(
inputPath);
}

std::unique_ptr<ITaskReader> e2e::setup::preset::makeDefaultTaskReader() {
std::string inputPath;
std::cout << "Reader type: text" << std::endl;
std::cout << "Enter path to input file: ";
std::cin >> inputPath;
return makeTaskReader<PlainTextTaskReader>(inputPath);
return factory::makeTaskReader<PlainTextTaskReader>(inputPath);
}

std::unique_ptr<ILogger> e2e::setup::preset::makeDefaultLogger() {
return makeLogger<ConsoleLogger>();
return factory::makeLogger<ConsoleLogger>();
}

std::unique_ptr<ILogger> e2e::setup::preset::makeDefaultSimplifiedLogger() {
return makeLogger<SimplifiedConsoleLogger>();
return factory::makeLogger<SimplifiedConsoleLogger>();
}
21 changes: 13 additions & 8 deletions source/setup/Setup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <io/reader/ConsoleTaskReader.h>
#include <io/reader/PlainTextTaskInstanceReader.h>
#include <io/reader/PlainTextTaskReader.h>
#include <setup/Factory.h>
#include <setup/Setup.h>

#include <algorithm>
Expand All @@ -22,15 +23,15 @@ std::unique_ptr<ILogger> setup::logger(const std::string& loggerStr) {

if (lowercaseLoggerStr == "console") {
std::cout << "Logger type: console" << std::endl;
return makeLogger<ConsoleLogger>();
return factory::makeLogger<ConsoleLogger>();
}

if (lowercaseLoggerStr == "text") {
std::string outputPath;
std::cout << "Logger type: text" << std::endl;
std::cout << "Enter output path: ";
std::cin >> outputPath;
return makeLogger<PlainTextLogger>(outputPath);
return factory::makeLogger<PlainTextLogger>(outputPath);
}

return nullptr;
Expand All @@ -44,17 +45,18 @@ std::unique_ptr<ILogger> setup::simpleLogger(const std::string& loggerStr) {

if (lowercaseLoggerStr == "console") {
std::cout << "Logger type: console" << std::endl;
return makeLogger<SimplifiedConsoleLogger>();
return factory::makeLogger<SimplifiedConsoleLogger>();
}

if (lowercaseLoggerStr == "text") {
std::string outputPath;
std::cout << "Logger type: text" << std::endl;
std::cout << "Enter output path: ";
std::cin >> outputPath;
return makeLogger<SimplifiedPlainTextLogger>(outputPath);
return factory::makeLogger<SimplifiedPlainTextLogger>(outputPath);
}

std::cout << "Entered logger is not supported" << std::endl;
return nullptr;
}

Expand All @@ -67,17 +69,19 @@ std::unique_ptr<ITaskInstanceReader> setup::taskInstanceReader(

if (lowercaseReaderStr == "console") {
std::cout << "Reader type: console" << std::endl;
return makeTaskInstanceReader<ConsoleTaskInstanceReader>();
return factory::makeTaskInstanceReader<ConsoleTaskInstanceReader>();
}

if (lowercaseReaderStr == "text") {
std::string inputPath;
std::cout << "Reader type: text" << std::endl;
std::cout << "Enter path to input file: ";
std::cin >> inputPath;
return makeTaskInstanceReader<PlainTextTaskInstanceReader>(inputPath);
return factory::makeTaskInstanceReader<PlainTextTaskInstanceReader>(
inputPath);
}

std::cout << "Entered task instance reader is not supported" << std::endl;
return nullptr;
}

Expand All @@ -90,16 +94,17 @@ std::unique_ptr<ITaskReader> e2e::setup::taskReader(

if (lowercaseReaderStr == "console") {
std::cout << "Reader type: console" << std::endl;
return makeTaskReader<ConsoleTaskReader>();
return factory::makeTaskReader<ConsoleTaskReader>();
}

if (lowercaseReaderStr == "text") {
std::string inputPath;
std::cout << "Reader type: text" << std::endl;
std::cout << "Enter path to input file: ";
std::cin >> inputPath;
return makeTaskReader<PlainTextTaskReader>(inputPath);
return factory::makeTaskReader<PlainTextTaskReader>(inputPath);
}

std::cout << "Entered task reader is not supported" << std::endl;
return nullptr;
}

0 comments on commit f430139

Please sign in to comment.