#ifndef PORYGONLANG_EVALVALUEHELPER_HPP
#define PORYGONLANG_EVALVALUEHELPER_HPP

#include "EvalValue.hpp"
#include "NumericEvalValue.hpp"
#include "StringEvalValue.hpp"

namespace Porygon::Evaluation{
    class EvalValueHelper{
    public:
        inline static EvalValue* Create(unsigned char i){
            return new IntegerEvalValue((long)i);
        }
        inline static EvalValue* Create(signed char i){
            return new IntegerEvalValue((long)i);
        }
        inline static EvalValue* Create(short int i){
            return new IntegerEvalValue(i);
        }
        inline static EvalValue* Create(unsigned short int i){
            return new IntegerEvalValue(i);
        }
        inline static EvalValue* Create(signed int i){
            return new IntegerEvalValue(i);
        }
        inline static EvalValue* Create(unsigned int i){
            return new IntegerEvalValue(i);
        }
        inline static EvalValue* Create(signed long l){
            return new IntegerEvalValue(l);
        }
        inline static EvalValue* Create(unsigned long l){
            return new IntegerEvalValue(l);
        }

        inline static EvalValue* Create(float f){
            return new FloatEvalValue(f);
        }
        inline static EvalValue* Create(double f){
            return new FloatEvalValue(f);
        }
        inline static EvalValue* Create(long double f){
            return new FloatEvalValue(f);
        }

        inline static EvalValue* Create(bool b){
            return new BooleanEvalValue(b);
        }
        inline static EvalValue* Create(const string& s){
            return new StringEvalValue(Utilities::StringUtils::ToUTF8(s));
        }
        inline static EvalValue* Create(u16string s){
            return new StringEvalValue(std::move(s));
        }
    };
}

#endif //PORYGONLANG_EVALVALUEHELPER_HPP
