1 #ifndef __OptionsChrono_H__
2 #define __OptionsChrono_H__
5 #error When using OptionsChrono.h do not include Options.h, at least not before!
10 #include <type_traits>
18 std::chrono::duration<double>
parseNumberAndUnit(std::stringstream& aStream,
int* aMonths =
nullptr,
int* aYears =
nullptr);
22 template <
class Rep,
class Period>
void parseDurationString(std::chrono::duration<Rep, Period> &aDuration,
const std::string& aString,
int* aMonths =
nullptr,
int* aYears =
nullptr) {
23 auto between = aString.find(
"between");
24 if (between != std::string::npos) {
25 auto andpos = aString.find(
"and");
26 if (andpos != std::string::npos) {
29 aDuration = std::chrono::duration_cast<
typename std::remove_reference<decltype(aDuration)>::type>(t1 - t0);
31 throw std::runtime_error(
"duration with 'between' without and");
34 std::stringstream sbuf(aString);
35 aDuration = aDuration.zero();
37 aDuration += std::chrono::duration_cast<
typename std::remove_reference<decltype(aDuration)>::type>(
parseNumberAndUnit(sbuf, aMonths, aYears));
43 std::ostream&
operator<<(std::ostream& aStream,
const std::chrono::system_clock::time_point& aTime);
44 std::istream&
operator>>(std::istream& aStream, std::chrono::system_clock::time_point& aTime);
46 template <
class Rep,
class Period> std::ostream&
operator<<(std::ostream& aStream,
const std::chrono::duration<Rep, Period>& aDuration) {
47 auto flags(aStream.flags());
48 aStream << std::fixed;
49 aStream << aDuration.count();
53 template <
class Rep,
class Period> std::istream&
operator>>(std::istream& aStream, std::chrono::duration<Rep, Period>& aDuration) {
56 if (!aStream.fail()) {
68 template <>
class single<std::chrono::system_clock::time_point> :
69 public std::chrono::system_clock::time_point,
72 public valuePrinter<std::chrono::system_clock::time_point> {
79 static void fDefaultValuePrinter(std::ostream& aStream,
const valueType& aValue);
81 single(
char aShortName,
const std::string& aLongName,
const std::string& aExplanation,
valueType aDefault = valueType::clock::now(),
const std::vector<valueType>& aRange = {}, valuePrinterType aValuePrinter = fDefaultValuePrinter);
82 single(
char aShortName,
const std::string& aLongName,
const std::string& aExplanation,
const std::string& aDefault,
const std::vector<std::string>& aRange = {}, valuePrinterType aValuePrinter = fDefaultValuePrinter);
86 void fWriteRange(std::ostream& aStream)
const override;
87 void fWriteValue(std::ostream& aStream)
const override;
88 void fSetMe(std::istream& aStream,
const internal::sourceItem& aSource)
override;
100 template <
class Rep,
class Period>
class single<std::chrono::duration<Rep, Period>> :
101 public std::chrono::duration<Rep, Period>,
103 public valuePrinter<std::chrono::duration<Rep, Period>>,
112 using escapedIO::operator<<;
121 if (!aRange.empty()) {
126 std::getline(aStream, lOriginalString);
129 }
catch (
const std::runtime_error& e) {
134 this->lValuePrinter(aStream, *
this);
137 using escapedIO::operator>>;
138 aStream >> lOriginalString;
141 }
catch (
const std::runtime_error& e) {