From 01434b8097bdd5032397e8ca61b8868776c1c09b Mon Sep 17 00:00:00 2001 From: Sofia Date: Sun, 12 Apr 2026 00:46:12 +0300 Subject: [PATCH] Eliminate repetition --- src/types.cpp | 55 +++++++++++++++++---------------------------------- src/types.h | 20 +++++-------------- 2 files changed, 23 insertions(+), 52 deletions(-) diff --git a/src/types.cpp b/src/types.cpp index 715d532..c1c1fda 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -53,7 +53,24 @@ namespace types { } } - std::optional> FundamentalType::return_type() { + + llvm::Value* Type::add(codegen::Builder&, llvm::Value*, llvm::Value*) { + throw std::runtime_error("Invalid operation for this type"); + } + + llvm::Value* Type::sub(codegen::Builder&, llvm::Value*, llvm::Value*) { + throw std::runtime_error("Invalid operation for this type"); + } + + llvm::Value* Type::lt(codegen::Builder&, llvm::Value*, llvm::Value*) { + throw std::runtime_error("Invalid operation for this type"); + } + + llvm::Value* Type::gt(codegen::Builder&, llvm::Value*, llvm::Value*) { + throw std::runtime_error("Invalid operation for this type"); + } + + std::optional> Type::return_type() { return {}; } @@ -128,52 +145,16 @@ namespace types { return std::pair(ptr, self); } - llvm::Value* FunctionType::add(codegen::Builder&, llvm::Value*, llvm::Value*) { - throw std::runtime_error("Invalid operation for functions"); - } - - llvm::Value* FunctionType::sub(codegen::Builder&, llvm::Value*, llvm::Value*) { - throw std::runtime_error("Invalid operation for functions"); - } - - llvm::Value* FunctionType::lt(codegen::Builder&, llvm::Value*, llvm::Value*) { - throw std::runtime_error("Invalid operation for functions"); - } - - llvm::Value* FunctionType::gt(codegen::Builder&, llvm::Value*, llvm::Value*) { - throw std::runtime_error("Invalid operation for functions"); - } - std::string PointerType::formatted() { std::stringstream out{ "" }; out << this->m_inner->formatted() << "*"; return out.str(); } - std::optional> PointerType::return_type() { - return {}; - } - std::pair> PointerType::load(codegen::Builder& builder, llvm::Value* ptr) { return std::pair( builder.builder->CreateLoad(this->m_inner->codegen(builder), ptr), this->m_inner ); } - - llvm::Value* PointerType::add(codegen::Builder&, llvm::Value*, llvm::Value*) { - throw std::runtime_error("Invalid operation for pointers"); - } - - llvm::Value* PointerType::sub(codegen::Builder&, llvm::Value*, llvm::Value*) { - throw std::runtime_error("Invalid operation for pointers"); - } - - llvm::Value* PointerType::lt(codegen::Builder&, llvm::Value*, llvm::Value*) { - throw std::runtime_error("Invalid operation for pointers"); - } - - llvm::Value* PointerType::gt(codegen::Builder&, llvm::Value*, llvm::Value*) { - throw std::runtime_error("Invalid operation for pointers"); - } } \ No newline at end of file diff --git a/src/types.h b/src/types.h index ff39f29..640f057 100644 --- a/src/types.h +++ b/src/types.h @@ -31,11 +31,11 @@ namespace types { virtual std::string formatted() = 0; virtual llvm::Type* codegen(codegen::Builder& builder) = 0; virtual std::pair> load(codegen::Builder& builder, llvm::Value* ptr) = 0; - virtual std::optional> return_type() = 0; - virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) = 0; - virtual llvm::Value* sub(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) = 0; - virtual llvm::Value* lt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) = 0; - virtual llvm::Value* gt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) = 0; + virtual std::optional> return_type(); + virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs); + virtual llvm::Value* sub(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs); + virtual llvm::Value* lt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs); + virtual llvm::Value* gt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs); }; class FundamentalType : public Type { @@ -47,7 +47,6 @@ namespace types { virtual std::string formatted() override; virtual llvm::Type* codegen(codegen::Builder& builder) override; virtual std::pair> load(codegen::Builder& builder, llvm::Value* ptr) override; - virtual std::optional> return_type() override; virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; virtual llvm::Value* sub(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; virtual llvm::Value* lt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; @@ -69,10 +68,6 @@ namespace types { virtual llvm::Type* codegen(codegen::Builder& builder) override; virtual std::pair> load(codegen::Builder& builder, llvm::Value* ptr) override; virtual std::optional> return_type() override; - virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; - virtual llvm::Value* sub(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; - virtual llvm::Value* lt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; - virtual llvm::Value* gt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; }; @@ -88,11 +83,6 @@ namespace types { virtual std::string formatted() override; virtual llvm::Type* codegen(codegen::Builder& builder) override; virtual std::pair> load(codegen::Builder& builder, llvm::Value* ptr) override; - virtual std::optional> return_type() override; - virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; - virtual llvm::Value* sub(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; - virtual llvm::Value* lt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; - virtual llvm::Value* gt(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; }; }