utilities.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #pragma once
  2. #include <string>
  3. #include <type_traits>
  4. #include <vector>
  5. namespace program {
  6. inline std::string join(std::string const & tok,
  7. std::vector<std::string> const & data) {
  8. std::string accum = data.empty() ? "" : data.front();
  9. for (size_t i = 1; i < data.size(); ++i) {
  10. accum += tok;
  11. accum += data[i];
  12. }
  13. return accum;
  14. }
  15. template <typename T, typename = void> struct conversion_helper;
  16. template <typename T, typename D> T convert(D const & data) {
  17. return conversion_helper<T>{}(data);
  18. }
  19. template <typename T>
  20. struct conversion_helper<
  21. T, std::enable_if_t<std::is_convertible_v<std::string, T>>> {
  22. T operator()(std::string const & str) const { return T(str); }
  23. T operator()(std::vector<std::string> const & data) const {
  24. return operator()(data.front());
  25. }
  26. };
  27. template <> struct conversion_helper<int> {
  28. int operator()(std::string const & str) const { return std::stoi(str); }
  29. int operator()(std::vector<std::string> const & data) const {
  30. return operator()(data.front());
  31. }
  32. };
  33. template <typename T>
  34. struct conversion_helper<std::vector<T>> : conversion_helper<T> {
  35. std::vector<T> operator()(std::vector<std::string> const & data) const {
  36. std::vector<T> rval;
  37. for (auto & str : data) {
  38. rval.emplace_back((*this)(str));
  39. }
  40. return rval;
  41. }
  42. };
  43. }