#ifndef TYPES_H #define TYPES_H #include "builder.h" #include #include namespace types { enum FundamentalTypeKind { Int, }; class Type { public: virtual ~Type() = default; virtual std::string formatted() = 0; virtual llvm::Type* codegen(codegen::Builder& builder) = 0; virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) = 0; }; class FundamentalType : public Type { private: FundamentalTypeKind m_ty; public: FundamentalType(FundamentalTypeKind kind) : m_ty{ kind } {} virtual ~FundamentalType() override = default; virtual std::string formatted() override; virtual llvm::Type* codegen(codegen::Builder& builder) override; virtual llvm::Value* add(codegen::Builder& builder, llvm::Value* lhs, llvm::Value* rhs) override; }; } #endif