#include <iostream>
#include <string>
struct TheMainClass
{
struct AssignmentProxy
{
std::string name;
TheMainClass* main;
AssignmentProxy(std::string const& n, TheMainClass* m)
: name(n), main(m)
{}
TheMainClass& operator=(std::string const& s)
{
main->addString(name, s);
return *main;
}
TheMainClass& operator=(int i)
{
main->addInteger(name, i);
return *main;
}
};
AssignmentProxy operator[](std::string const& name)
{
return AssignmentProxy(name, this);
}
void addString(std::string const& name, std::string const& str)
{
std::cout << "Adding string " << name << " with value \"" << str << "\"\n";
}
void addInteger(std::string const& name, int i)
{
std::cout << "Adding integer " << name << " with value " << i << "\n";
}
};
int main(int argc __attribute__((unused)), char *argv[] __attribute__((unused)))
{
TheMainClass builder;
builder[ "string_value" ] = "Hello";
builder[ "int_value" ] = 5;
builder[ "another_string" ] = "Thank you";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKc3RydWN0IFRoZU1haW5DbGFzcwp7CiAgICBzdHJ1Y3QgQXNzaWdubWVudFByb3h5CiAgICB7CiAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICBUaGVNYWluQ2xhc3MqIG1haW47CgogICAgICAgIEFzc2lnbm1lbnRQcm94eShzdGQ6OnN0cmluZyBjb25zdCYgbiwgVGhlTWFpbkNsYXNzKiBtKQogICAgICAgICAgICA6IG5hbWUobiksIG1haW4obSkKICAgICAgICB7fQoKICAgICAgICBUaGVNYWluQ2xhc3MmIG9wZXJhdG9yPShzdGQ6OnN0cmluZyBjb25zdCYgcykKICAgICAgICB7CiAgICAgICAgICAgIG1haW4tPmFkZFN0cmluZyhuYW1lLCBzKTsKICAgICAgICAgICAgcmV0dXJuICptYWluOwogICAgICAgIH0KCiAgICAgICAgVGhlTWFpbkNsYXNzJiBvcGVyYXRvcj0oaW50IGkpCiAgICAgICAgewogICAgICAgICAgICBtYWluLT5hZGRJbnRlZ2VyKG5hbWUsIGkpOwogICAgICAgICAgICByZXR1cm4gKm1haW47CiAgICAgICAgfQogICAgfTsKCiAgICBBc3NpZ25tZW50UHJveHkgb3BlcmF0b3JbXShzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gQXNzaWdubWVudFByb3h5KG5hbWUsIHRoaXMpOwogICAgfQoKICAgIHZvaWQgYWRkU3RyaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQWRkaW5nIHN0cmluZyAiIDw8IG5hbWUgPDwgIiB3aXRoIHZhbHVlIFwiIiA8PCBzdHIgPDwgIlwiXG4iOwogICAgfQoKICAgIHZvaWQgYWRkSW50ZWdlcihzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgaW50IGkpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJBZGRpbmcgaW50ZWdlciAiIDw8IG5hbWUgPDwgIiB3aXRoIHZhbHVlICIgPDwgaSA8PCAiXG4iOwogICAgfQp9OwoKaW50IG1haW4oaW50IGFyZ2MgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIGNoYXIgKmFyZ3ZbXSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKewogICAgVGhlTWFpbkNsYXNzIGJ1aWxkZXI7CiAgICBidWlsZGVyWyAic3RyaW5nX3ZhbHVlIiBdID0gIkhlbGxvIjsKICAgIGJ1aWxkZXJbICJpbnRfdmFsdWUiIF0gPSA1OwogICAgYnVpbGRlclsgImFub3RoZXJfc3RyaW5nIiBdID0gIlRoYW5rIHlvdSI7Cn0K