mirror of https://github.com/exaloop/codon.git
82 lines
2.2 KiB
C++
82 lines
2.2 KiB
C++
#pragma once
|
|
|
|
#include "module.h"
|
|
#include "value.h"
|
|
|
|
namespace codon {
|
|
namespace ir {
|
|
|
|
/// SIR constant base. Once created, constants are immutable.
|
|
class Const : public AcceptorExtend<Const, Value> {
|
|
private:
|
|
/// the type
|
|
types::Type *type;
|
|
|
|
public:
|
|
static const char NodeId;
|
|
|
|
/// Constructs a constant.
|
|
/// @param type the type
|
|
/// @param name the name
|
|
explicit Const(types::Type *type, std::string name = "")
|
|
: AcceptorExtend(std::move(name)), type(type) {}
|
|
|
|
private:
|
|
types::Type *doGetType() const override { return type; }
|
|
|
|
std::vector<types::Type *> doGetUsedTypes() const override { return {type}; }
|
|
int doReplaceUsedType(const std::string &name, types::Type *newType) override;
|
|
};
|
|
|
|
template <typename ValueType>
|
|
class TemplatedConst : public AcceptorExtend<TemplatedConst<ValueType>, Const> {
|
|
private:
|
|
ValueType val;
|
|
|
|
public:
|
|
static const char NodeId;
|
|
|
|
using AcceptorExtend<TemplatedConst<ValueType>, Const>::getModule;
|
|
using AcceptorExtend<TemplatedConst<ValueType>, Const>::getSrcInfo;
|
|
using AcceptorExtend<TemplatedConst<ValueType>, Const>::getType;
|
|
|
|
TemplatedConst(ValueType v, types::Type *type, std::string name = "")
|
|
: AcceptorExtend<TemplatedConst<ValueType>, Const>(type, std::move(name)),
|
|
val(v) {}
|
|
|
|
/// @return the internal value.
|
|
ValueType getVal() const { return val; }
|
|
/// Sets the value.
|
|
/// @param v the value
|
|
void setVal(ValueType v) { val = v; }
|
|
};
|
|
|
|
using IntConst = TemplatedConst<int64_t>;
|
|
using FloatConst = TemplatedConst<double>;
|
|
using BoolConst = TemplatedConst<bool>;
|
|
using StringConst = TemplatedConst<std::string>;
|
|
|
|
template <typename T> const char TemplatedConst<T>::NodeId = 0;
|
|
|
|
template <>
|
|
class TemplatedConst<std::string>
|
|
: public AcceptorExtend<TemplatedConst<std::string>, Const> {
|
|
private:
|
|
std::string val;
|
|
|
|
public:
|
|
static const char NodeId;
|
|
|
|
TemplatedConst(std::string v, types::Type *type, std::string name = "")
|
|
: AcceptorExtend(type, std::move(name)), val(std::move(v)) {}
|
|
|
|
/// @return the internal value.
|
|
std::string getVal() const { return val; }
|
|
/// Sets the value.
|
|
/// @param v the value
|
|
void setVal(std::string v) { val = std::move(v); }
|
|
};
|
|
|
|
} // namespace ir
|
|
} // namespace codon
|