#include <iostream>
#include <sstream>
#include <vector>
#include <memory>
class Task
{
std::string content;
public:
Task(const std::string& title) : content(title) {}
virtual ~Task() = default;
virtual bool check(std::istream& is) const = 0;
};
class TaskNumber : public Task
{
int value;
public:
TaskNumber(const std::string& title, int value) : Task{title}, value(value) {}
bool check(std::istream& is) const override
{
int i;
is >> i;
return i == value;
}
};
class TaskString : public Task
{
std::string value;
public:
TaskString(const std::string& title, const std::string& s) : Task{title}, value(s) {}
bool check(std::istream& is) const override
{
std::string s;
is >> s;
return s == value;
}
};
class TaskCollection
{
public:
void addTask(std::unique_ptr<Task> task) { tasks.push_back(std::move(task)); }
void run(std::istream& is) {
for (auto& task : tasks) {
std::cout << (task->check(is) ? "Success\n" : "Failed\n");
}
}
private:
std::vector<std::unique_ptr<Task>> tasks;
};
int main()
{
TaskCollection tasks;
tasks.addTask(std::make_unique<TaskString>("t1", "Hello"));
tasks.addTask(std::make_unique<TaskString>("t2", "world"));
tasks.addTask(std::make_unique<TaskNumber>("t3", 42));
std::string s{"Hi world 42"};
std::stringstream ss{s};
tasks.run(ss);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1lbW9yeT4KCmNsYXNzIFRhc2sKewogICAgc3RkOjpzdHJpbmcgY29udGVudDsKcHVibGljOgogICAgVGFzayhjb25zdCBzdGQ6OnN0cmluZyYgdGl0bGUpIDogY29udGVudCh0aXRsZSkge30KICAgIHZpcnR1YWwgflRhc2soKSA9IGRlZmF1bHQ7CgogICAgdmlydHVhbCBib29sIGNoZWNrKHN0ZDo6aXN0cmVhbSYgaXMpIGNvbnN0ID0gMDsKCn07CgpjbGFzcyBUYXNrTnVtYmVyIDogcHVibGljIFRhc2sKewogICAgaW50IHZhbHVlOwpwdWJsaWM6CiAgICBUYXNrTnVtYmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0aXRsZSwgaW50IHZhbHVlKSA6IFRhc2t7dGl0bGV9LCB2YWx1ZSh2YWx1ZSkge30KCiAgICBib29sIGNoZWNrKHN0ZDo6aXN0cmVhbSYgaXMpIGNvbnN0IG92ZXJyaWRlCiAgICB7CiAgICAgICAgaW50IGk7CiAgICAgICAgaXMgPj4gaTsKICAgICAgICByZXR1cm4gaSA9PSB2YWx1ZTsKICAgIH0KCn07CgpjbGFzcyBUYXNrU3RyaW5nIDogcHVibGljIFRhc2sKewogICAgc3RkOjpzdHJpbmcgdmFsdWU7CnB1YmxpYzoKICAgIFRhc2tTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHRpdGxlLCBjb25zdCBzdGQ6OnN0cmluZyYgcykgOiBUYXNre3RpdGxlfSwgdmFsdWUocykge30KCiAgICBib29sIGNoZWNrKHN0ZDo6aXN0cmVhbSYgaXMpIGNvbnN0IG92ZXJyaWRlCiAgICB7CiAgICAgICAgc3RkOjpzdHJpbmcgczsKICAgICAgICBpcyA+PiBzOwogICAgICAgIHJldHVybiBzID09IHZhbHVlOwogICAgfQp9OwoKY2xhc3MgVGFza0NvbGxlY3Rpb24KewpwdWJsaWM6CiAgICB2b2lkIGFkZFRhc2soc3RkOjp1bmlxdWVfcHRyPFRhc2s+IHRhc2spIHsgdGFza3MucHVzaF9iYWNrKHN0ZDo6bW92ZSh0YXNrKSk7IH0KICAgIAogICAgdm9pZCBydW4oc3RkOjppc3RyZWFtJiBpcykgewogICAgICAgIGZvciAoYXV0byYgdGFzayA6IHRhc2tzKSB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAodGFzay0+Y2hlY2soaXMpID8gIlN1Y2Nlc3NcbiIgOiAiRmFpbGVkXG4iKTsKICAgICAgICB9CiAgICB9CiAgICAKcHJpdmF0ZToKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUYXNrPj4gdGFza3M7Cn07CgppbnQgbWFpbigpCnsKICAgIFRhc2tDb2xsZWN0aW9uIHRhc2tzOwogICAgCiAgICB0YXNrcy5hZGRUYXNrKHN0ZDo6bWFrZV91bmlxdWU8VGFza1N0cmluZz4oInQxIiwgIkhlbGxvIikpOwogICAgdGFza3MuYWRkVGFzayhzdGQ6Om1ha2VfdW5pcXVlPFRhc2tTdHJpbmc+KCJ0MiIsICJ3b3JsZCIpKTsKICAgIHRhc2tzLmFkZFRhc2soc3RkOjptYWtlX3VuaXF1ZTxUYXNrTnVtYmVyPigidDMiLCA0MikpOwogICAgCiAgICBzdGQ6OnN0cmluZyBzeyJIaSB3b3JsZCA0MiJ9OwogICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N7c307CiAgICB0YXNrcy5ydW4oc3MpOwp9Cg==