Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions doc/validate.md
Original file line number Diff line number Diff line change
Expand Up @@ -366,15 +366,15 @@ This is not supposed to be used for validators.
If an constraint is provided it will be updated with the value of the parsed integer.
This is supposed to be used for validators only.

**`std::vector<std::string> strings([args], Integer count)`**
**`std::vector<std::string> strings([args], Integer count, char separator)`**
**`std::vector<Integer> integers([args], Integer count)`**
**`std::vector<Integer> integers([args], Integer count, char separator)`**
**`std::vector<Real> reals([args], Integer count)`**
**`std::vector<Real> reals([args], Integer count, char separator)`**
**`std::vector<Real> realsStrict([args], Integer count)`**
**`std::vector<Real> realsStrict([args], Integer count, char separator)`**
Will extract the next `count` tokens by calling `string([args])`, `integer([args])` or `real([args])`.
**`std::vector<std::string> strings(Integer count, [args])`**
**`std::vector<std::string> strings(Integer count, [args], char separator)`**
**`std::vector<Integer> integers(Integer count, [args])`**
**`std::vector<Integer> integers(Integer count, [args], char separator)`**
**`std::vector<Real> reals(Integer count, [args])`**
**`std::vector<Real> reals(Integer count, [args], char separator)`**
**`std::vector<Real> realsStrict(Integer count, [args])`**
**`std::vector<Real> realsStrict(Integer count, [args], char separator)`**
Will extract the next `count` tokens by calling `string([args])`, `integer([args])`, `real([args])`, or `realStrict([args])`.
The tokens are expected to be separated by the char `separator` which must be `space` or `newline`.
If this parameter is not provided a `space` is expected.

Expand Down
2 changes: 1 addition & 1 deletion example/answerValidator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ int main(int argc, char **argv) {

Integer t = testIn.integer(); // read the number of testcases

ans.integers(0, 100, t, NEWLINE); // for each testcase there should be one answer separated by newline
ans.integers(t, 0, 100, NEWLINE); // for each testcase there should be one answer separated by newline
ans.newline(); // should also end with newline
ans.eof(); // there should be nothing else
juryOut << "OK possible" << AC;
Expand Down
79 changes: 41 additions & 38 deletions src/validate.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
// reproducable fashion. (The randomness is consistent across compilers and //
// machines) //
//============================================================================//
// version 2.6.5 //
// version 3.0.1 //
// https://github.com/mzuenni/icpc-header //
//============================================================================//

Expand Down Expand Up @@ -1973,6 +1973,7 @@ class ParameterBase {

public:
std::string asString() const {
judgeAssert<std::invalid_argument>(token.has_value(), "asString(): missing arg");
return std::string(token.value());
}

Expand All @@ -1981,6 +1982,7 @@ class ParameterBase {
}

Integer asInteger() const {
judgeAssert<std::invalid_argument>(token.has_value(), "asInteger(): missing arg");
return parse<Integer>(token.value());
}

Expand All @@ -1989,6 +1991,7 @@ class ParameterBase {
}

Real asReal() const {
judgeAssert<std::invalid_argument>(token.has_value(), "asReal(): missing arg");
return parse<Real>(token.value());
}

Expand Down Expand Up @@ -2482,7 +2485,7 @@ class InputStream final {
}

template<typename... Args>
std::vector<std::string> strings(Args... args, Integer count, char separator) {
std::vector<std::string> strings(Integer count, Args... args, char separator) {
auto sepCall = checkSeparator(separator);
std::vector<std::string> res(count);
for (std::size_t i = 0; i < res.size(); i++) {
Expand All @@ -2496,29 +2499,29 @@ class InputStream final {
return strings<>(count, separator);
}

std::vector<std::string> strings(Integer lower, Integer upper,
Integer count, char separator = DEFAULT_SEPARATOR) {
return strings<Integer, Integer>(lower, upper, count, separator);
std::vector<std::string> strings(Integer count, Integer lower, Integer upper,
char separator = DEFAULT_SEPARATOR) {
return strings<Integer, Integer>(count, lower, upper, separator);
}

std::vector<std::string> strings(Integer lower, Integer upper, Constraint& constraint,
Integer count, char separator = DEFAULT_SEPARATOR) {
return strings<Integer, Integer, Constraint&>(lower, upper, constraint, count, separator);
std::vector<std::string> strings(Integer count, Integer lower, Integer upper,
Constraint& constraint, char separator = DEFAULT_SEPARATOR) {
return strings<Integer, Integer, Constraint&>(count, lower, upper, constraint, separator);
}

std::vector<std::string> strings(const std::regex& pattern,
Integer count, char separator = DEFAULT_SEPARATOR) {
return strings<const std::regex&>(pattern, count, separator);
std::vector<std::string> strings(Integer count, const std::regex& pattern,
char separator = DEFAULT_SEPARATOR) {
return strings<const std::regex&>(count, pattern, separator);
}

std::vector<std::string> strings(const std::regex& pattern, Integer lower, Integer upper,
Integer count, char separator = DEFAULT_SEPARATOR) {
return strings<const std::regex&, Integer, Integer>(pattern, lower, upper, count, separator);
std::vector<std::string> strings(Integer count, const std::regex& pattern, Integer lower, Integer upper,
char separator = DEFAULT_SEPARATOR) {
return strings<const std::regex&, Integer, Integer>(count, pattern, lower, upper, separator);
}

std::vector<std::string> strings(const std::regex& pattern, Integer lower, Integer upper, Constraint& constraint,
Integer count, char separator = DEFAULT_SEPARATOR) {
return strings<const std::regex&, Integer, Integer, Constraint&>(pattern, lower, upper, constraint, count, separator);
std::vector<std::string> strings(Integer count, const std::regex& pattern, Integer lower, Integer upper,
Constraint& constraint, char separator = DEFAULT_SEPARATOR) {
return strings<const std::regex&, Integer, Integer, Constraint&>(count, pattern, lower, upper, constraint, separator);
}

Integer integer() {
Expand All @@ -2541,7 +2544,7 @@ class InputStream final {
}

template<typename... Args>
std::vector<Integer> integers(Args... args, Integer count, char separator) {
std::vector<Integer> integers(Integer count, Args... args, char separator) {
auto sepCall = checkSeparator(separator);
std::vector<Integer> res(count);
for (std::size_t i = 0; i < res.size(); i++) {
Expand All @@ -2555,14 +2558,14 @@ class InputStream final {
return integers<>(count, separator);
}

std::vector<Integer> integers(Integer lower, Integer upper,
Integer count, char separator = DEFAULT_SEPARATOR) {
return integers<Integer, Integer>(lower, upper, count, separator);
std::vector<Integer> integers(Integer count, Integer lower, Integer upper,
char separator = DEFAULT_SEPARATOR) {
return integers<Integer, Integer>(count, lower, upper, separator);
}

std::vector<Integer> integers(Integer lower, Integer upper, Constraint& constraint,
Integer count, char separator = DEFAULT_SEPARATOR) {
return integers<Integer, Integer, Constraint&>(lower, upper, constraint, count, separator);
std::vector<Integer> integers(Integer count, Integer lower, Integer upper,
Constraint& constraint, char separator = DEFAULT_SEPARATOR) {
return integers<Integer, Integer, Constraint&>(count, lower, upper, constraint, separator);
}

// this does not allow NaN or Inf!
Expand All @@ -2589,7 +2592,7 @@ class InputStream final {
}

template<typename... Args>
std::vector<Real> reals(Args... args, Integer count, char separator) {
std::vector<Real> reals(Integer count, Args... args, char separator) {
auto sepCall = checkSeparator(separator);
std::vector<Real> res(count);
for (std::size_t i = 0; i < res.size(); i++) {
Expand All @@ -2603,14 +2606,14 @@ class InputStream final {
return reals<>(count, separator);
}

std::vector<Real> reals(Real lower, Real upper,
Integer count, char separator = DEFAULT_SEPARATOR) {
return reals<Real, Real>(lower, upper, count, separator);
std::vector<Real> reals(Integer count, Real lower, Real upper,
char separator = DEFAULT_SEPARATOR) {
return reals<Real, Real>(count, lower, upper, separator);
}

std::vector<Real> reals(Real lower, Real upper, Constraint& constraint,
Integer count, char separator = DEFAULT_SEPARATOR) {
return reals<Real, Real, Constraint&>(lower, upper, constraint, count, separator);
std::vector<Real> reals(Integer count, Real lower, Real upper,
Constraint& constraint, char separator = DEFAULT_SEPARATOR) {
return reals<Real, Real, Constraint&>(count, lower, upper, constraint, separator);
}

Real realStrict(Real lower, Real upper, Integer minDecimals, Integer maxDecimals) {// does not use eps
Expand Down Expand Up @@ -2643,7 +2646,7 @@ class InputStream final {
}

template<typename... Args>
std::vector<Real> realsStrict(Args... args, Integer count, char separator) {
std::vector<Real> realsStrict(Integer count, Args... args, char separator) {
auto sepCall = checkSeparator(separator);
std::vector<Real> res(count);
for (std::size_t i = 0; i < res.size(); i++) {
Expand All @@ -2653,14 +2656,14 @@ class InputStream final {
return res;
}

std::vector<Real> realsStrict(Real lower, Real upper, Integer minDecimals, Integer maxDecimals,
Integer count, char separator = DEFAULT_SEPARATOR) {
return realsStrict<Real, Real, Integer, Integer>(lower, upper, minDecimals, maxDecimals, count, separator);
std::vector<Real> realsStrict(Integer count, Real lower, Real upper, Integer minDecimals, Integer maxDecimals,
char separator = DEFAULT_SEPARATOR) {
return realsStrict<Real, Real, Integer, Integer>(count, lower, upper, minDecimals, maxDecimals, separator);
}

std::vector<Real> realsStrict(Real lower, Real upper, Integer minDecimals, Integer maxDecimals, Constraint& constraint,
Integer count, char separator = DEFAULT_SEPARATOR) {
return realsStrict<Real, Real, Integer, Integer, Constraint&>(lower, upper, minDecimals, maxDecimals, constraint, count, separator);
std::vector<Real> realsStrict(Integer count, Real lower, Real upper, Integer minDecimals, Integer maxDecimals,
Constraint& constraint, char separator = DEFAULT_SEPARATOR) {
return realsStrict<Real, Real, Integer, Integer, Constraint&>(count, lower, upper, minDecimals, maxDecimals, constraint, separator);
}

void expectString(std::string_view expected) {
Expand Down
11 changes: 11 additions & 0 deletions test/validate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,17 @@ void checkInputStream() {
InputStream in(rawIn, true, true, ValidateBase::juryOut, Verdicts::Verdict(23));
in.realStrict(-10, 10, 0, 3);
}, 23);
assertNoException([](){
std::istringstream rawIn("Das ist 1\n2 3 test 3.1 4.1 5.9 ende\n");
InputStream in(rawIn, false, false, ValidateBase::juryOut, Verdicts::FAIL);

in.strings(2, 3, 4);
in.integers(3, 1, 4);
in.expectString("test");
in.reals(3, 3.0, 6.0);
in.expectString("ende");
in.eof();
});
}

void checkJoin() {
Expand Down