This commit is contained in:
Timofey 2022-08-10 12:02:25 +03:00
parent b9d951ec9a
commit c2d0033f78
4 changed files with 87 additions and 12 deletions

14
src/utils/parametres.cpp Normal file
View file

@ -0,0 +1,14 @@
#include <utils/parametres.hpp>
namespace utils::parametres {
std::vector<std::string> ParseInputParameters(int argc, char* argv[]) {
std::vector<std::string> result;
result.reserve(argc);
for (size_t i = 0; i < argc; ++i) {
result.emplace_back(argv[i]);
}
return result;
}
} // namespace utils

66
src/utils/parametres.hpp Normal file
View file

@ -0,0 +1,66 @@
#pragma once
#include <vector>
#include <string>
#include <stdexcept>
namespace utils::parametres {
enum class Parameter { Skip, Nothing, Anything };
namespace detail {
template <size_t index, typename... Args>
bool CheckPatternParametresImpl(const std::vector<std::string>& args,
Parameter t) {
if (t == Parameter::Nothing) {
return index == args.size();
} else if (t == Parameter::Anything) {
return true;
}
return false;
}
template <size_t index, typename T, typename... Args,
std::enable_if_t<!std::is_same_v<T, Parameter>, bool>>
bool CheckPatternParametresImpl(const std::vector<std::string>& args, T&& head,
Args&&... pattern);
template <size_t index, typename T, typename... Args,
std::enable_if_t<std::is_same_v<T, Parameter>, bool> = true>
bool CheckPatternParametresImpl(const std::vector<std::string>& args, T&& p,
Args&&... pattern) {
if (index >= args.size()) {
return false;
}
if (p != Parameter::Skip) {
throw std::logic_error("Unsupported parameter");
}
return CheckPatternParametresImpl<index + 1, Args...>(
args, std::forward<Args>(pattern)...);
}
template <size_t index, typename T, typename... Args,
std::enable_if_t<!std::is_same_v<T, Parameter>, bool> = true>
bool CheckPatternParametresImpl(const std::vector<std::string>& args, T&& head,
Args&&... pattern) {
if (index >= args.size()) {
return false;
}
if (args[index] != head) {
return false;
}
return CheckPatternParametresImpl<index + 1, Args...>(
args, std::forward<Args>(pattern)...);
}
} // namespace detail
std::vector<std::string> ParseInputParameters(int argc, char* argv[]);
template <typename... Args>
bool CheckPatternParametres(const std::vector<std::string>& args,
Args&&... pattern) {
return detail::CheckPatternParametresImpl<0, Args...>(
args, std::forward<Args>(pattern)...);
}
} // namespace utils