#include <string>
#include <iostream>
extern const char SQL_SELECT[] = "SELECT ";
extern const char SQL_FROM[] = "FROM ";
extern const char SQL_WHERE[] = "WHERE ";
extern const char SQL_ORDER_BY[] = "ORDER_BY ";
class Fields
{
public:
Fields &operator ,(const std::string &s)
{
SQL.append(s).append(1, ',');
return *this;
}
Fields &operator ,(const Fields &f)
{
std::string Result = f;
SQL.append(Result);
return *this;
}
virtual operator std::string() const = 0;
protected:
std::string SQL;
};
template <const char *INSTRUCTION> struct Instruction : public Fields
{
operator std::string() const
{
std::string Result(INSTRUCTION);
return Result.append(SQL);
}
};
enum ORDER
{
ASC,
DESC,
};
template <> struct Instruction<SQL_ORDER_BY> : public Fields
{
using Fields::operator std::string;
using Fields::operator,;
Instruction() : order(ASC) {}
Fields &operator ,(const ORDER o)
{
order = o;
return *this;
}
operator std::string() const
{
std::string Result(SQL_ORDER_BY);
Result.append(SQL);
Result.append(order == ASC? "ASC": "DESC");
return Result;
}
private:
ORDER order;
};
typedef Instruction<SQL_SELECT> SELECT;
typedef Instruction<SQL_FROM> FROM;
typedef Instruction<SQL_WHERE> WHERE;
typedef Instruction<SQL_ORDER_BY> ORDER_BY;
int main(int argc, char **argv)
{
std::string Query = ((SELECT(), "a", "b", "c"),
(FROM(), "A", "B"),
(WHERE(), "a = b AND c <> b"),
(ORDER_BY(), "a", "c", DESC));
std::cout << Query << '\n';
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKZXh0ZXJuIGNvbnN0IGNoYXIgU1FMX1NFTEVDVFtdID0gIlNFTEVDVCAiOwpleHRlcm4gY29uc3QgY2hhciBTUUxfRlJPTVtdID0gIkZST00gIjsKZXh0ZXJuIGNvbnN0IGNoYXIgU1FMX1dIRVJFW10gPSAiV0hFUkUgIjsKZXh0ZXJuIGNvbnN0IGNoYXIgU1FMX09SREVSX0JZW10gPSAiT1JERVJfQlkgIjsKCmNsYXNzIEZpZWxkcwp7CnB1YmxpYzoKICAgIEZpZWxkcyAmb3BlcmF0b3IgLChjb25zdCBzdGQ6OnN0cmluZyAmcykKCXsKCQlTUUwuYXBwZW5kKHMpLmFwcGVuZCgxLCAnLCcpOwoJCXJldHVybiAqdGhpczsKCX0KCglGaWVsZHMgJm9wZXJhdG9yICwoY29uc3QgRmllbGRzICZmKQoJewoJCXN0ZDo6c3RyaW5nIFJlc3VsdCA9IGY7CgkJU1FMLmFwcGVuZChSZXN1bHQpOwoJCXJldHVybiAqdGhpczsKCX0KCgl2aXJ0dWFsIG9wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgY29uc3QgPSAwOwpwcm90ZWN0ZWQ6CglzdGQ6OnN0cmluZyBTUUw7Cn07Cgp0ZW1wbGF0ZSA8Y29uc3QgY2hhciAqSU5TVFJVQ1RJT04+IHN0cnVjdCBJbnN0cnVjdGlvbiA6IHB1YmxpYyBGaWVsZHMKewogICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKSBjb25zdAoJewoJCXN0ZDo6c3RyaW5nIFJlc3VsdChJTlNUUlVDVElPTik7CgkJcmV0dXJuIFJlc3VsdC5hcHBlbmQoU1FMKTsKCX0KfTsKCmVudW0gT1JERVIKewoJQVNDLAoJREVTQywKfTsKCnRlbXBsYXRlIDw+IHN0cnVjdCBJbnN0cnVjdGlvbjxTUUxfT1JERVJfQlk+IDogcHVibGljIEZpZWxkcwp7CiAgICB1c2luZyBGaWVsZHM6Om9wZXJhdG9yIHN0ZDo6c3RyaW5nOwoJdXNpbmcgRmllbGRzOjpvcGVyYXRvciw7CgoJSW5zdHJ1Y3Rpb24oKSA6IG9yZGVyKEFTQykge30KCglGaWVsZHMgJm9wZXJhdG9yICwoY29uc3QgT1JERVIgbykKCXsKCQlvcmRlciA9IG87CgkJcmV0dXJuICp0aGlzOwoJfQoKCW9wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgY29uc3QKCXsKCQlzdGQ6OnN0cmluZyBSZXN1bHQoU1FMX09SREVSX0JZKTsKCQlSZXN1bHQuYXBwZW5kKFNRTCk7CgkJUmVzdWx0LmFwcGVuZChvcmRlciA9PSBBU0M/ICJBU0MiOiAiREVTQyIpOwoJCXJldHVybiBSZXN1bHQ7Cgl9Cgpwcml2YXRlOgoJT1JERVIgb3JkZXI7Cn07Cgp0eXBlZGVmIEluc3RydWN0aW9uPFNRTF9TRUxFQ1Q+IFNFTEVDVDsKdHlwZWRlZiBJbnN0cnVjdGlvbjxTUUxfRlJPTT4gRlJPTTsKdHlwZWRlZiBJbnN0cnVjdGlvbjxTUUxfV0hFUkU+IFdIRVJFOwp0eXBlZGVmIEluc3RydWN0aW9uPFNRTF9PUkRFUl9CWT4gT1JERVJfQlk7CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIHN0ZDo6c3RyaW5nIFF1ZXJ5ID0gKChTRUxFQ1QoKSwgImEiLCAiYiIsICJjIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAoRlJPTSgpLCAiQSIsICJCIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAoV0hFUkUoKSwgImEgPSBiIEFORCBjIDw+IGIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChPUkRFUl9CWSgpLCAiYSIsICJjIiwgREVTQykpOwoKCXN0ZDo6Y291dCA8PCBRdWVyeSA8PCAnXG4nOwogICAgCiAgICByZXR1cm4gMDsKfQo=