fork download
  1. #include <functional>
  2. #include <cassert>
  3.  
  4. namespace Wide {
  5. namespace Codegen {
  6. class Statement { public: virtual ~Statement() {} };
  7. class Expression : public Statement {};
  8. class IfStatement : public Statement {};
  9. class Generator {
  10. public:
  11. virtual IfStatement* CreateIfStatement(Expression* expr, Statement* t, Statement* f) = 0;
  12. virtual IfStatement* CreateIfStatement(std::function<Expression*()>, Statement*, Statement*) = 0;
  13. };
  14. }
  15. namespace LLVMCodegen {
  16. class Statement { public: virtual ~Statement() {} };
  17. struct Expression : Statement {};
  18.  
  19. class IfStatement : public Statement, public Codegen::IfStatement {
  20. public:
  21. IfStatement(std::function<LLVMCodegen::Expression*()> cond, LLVMCodegen::Statement* tbr, LLVMCodegen::Statement* fbr) {}
  22. };
  23. Expression* AssertExpression(Wide::Codegen::Expression* e) {
  24. return dynamic_cast<Wide::LLVMCodegen::Expression*>(e);
  25. }
  26. Statement* AssertStatement(Wide::Codegen::Statement* e) {
  27. return dynamic_cast<Wide::LLVMCodegen::Statement*>(e);
  28. }
  29. class Generator : public Codegen::Generator {
  30. public:
  31. IfStatement* CreateIfStatement(Codegen::Expression* expr, Codegen::Statement* t, Codegen::Statement* f) {
  32. return CreateIfStatement([=] { return expr; }, t, f);
  33. }
  34. IfStatement* CreateIfStatement(std::function<Codegen::Expression*()> cond, Codegen::Statement* tr, Codegen::Statement* fls) {
  35. return new IfStatement([=] { return AssertExpression(cond()); }, AssertStatement(tr), fls ? AssertStatement(fls) : nullptr);
  36. }
  37. };
  38. }
  39. }
  40.  
  41. int main() {
  42. Wide::LLVMCodegen::Generator g;
  43. }
Success #stdin #stdout 0s 3336KB
stdin
Standard input is empty
stdout
Standard output is empty