GridComputing
Job Management in Grid Computing
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
consolereader.h
Go to the documentation of this file.
1 #ifndef CONSOLEREADER_H_
2 #define CONSOLEREADER_H_
3 
4 #include <iostream>
5 #include <string>
6 #include <stdexcept>
7 #include <sstream>
8 #include <functional>
9 
11 class InvalidValue : public std::runtime_error
12 {
13 public:
14  InvalidValue(const char* val) : std::runtime_error(val) { }
15 };
16 
19 {
20 public:
22 };
23 
31 template <typename T>
32 T ReadValue(const std::string& prompt, std::function<bool(T)> validator)
33 {
34  bool success = false;
35  T val = T();
36 
37  while (!success)
38  {
39  std::cout << prompt;
40 
41  std::string input;
42  std::getline(std::cin, input);
43 
44  if (std::cin.fail())
45  {
46  if (std::cin.eof())
47  {
48  std::cin.clear();
49  throw EOFCharacterValue();
50  }
51  else
52  {
53  std::cin.clear();
54  std::cout << "Invalid value. Please try again." << std::endl;
55  continue;
56  }
57  }
58 
59  // convert string to T
60  std::stringstream ss(input);
61 
62  if (!(ss >> val) || ss.rdbuf()->in_avail() != 0)
63  std::cout << "Invalid value. Please try again." << std::endl;
64  else
65  {
66  if (validator(val))
67  success = true;
68  }
69  }
70 
71  return val;
72 }
73 
75 template <typename T>
76 T ReadValue(const std::string& prompt)
77 {
78  return ReadValue<T>(prompt, [](T) { return true; });
79 }
80 
81 template<>
82 inline std::string ReadValue<std::string>(const std::string& prompt, std::function<bool(std::string)> validator)
83 {
84  std::string input;
85  bool success = false;
86 
87  while (!success)
88  {
89  std::cout << prompt;
90 
91  std::getline(std::cin, input);
92 
93  if (std::cin.fail())
94  {
95  if (std::cin.eof())
96  {
97  std::cin.clear();
98  throw EOFCharacterValue();
99  }
100  else
101  {
102  std::cin.clear();
103  std::cout << "Invalid value. Please try again." << std::endl;
104  continue;
105  }
106  }
107 
108  if (validator(input))
109  success = true;
110  }
111 
112  return input;
113 }
114 
115 #endif // CONSOLEREADER_H_