// This Header is auto generated by BDSLiteLoader Toolchain
#pragma once
#define AUTO_GENERATED
#include "../Global.h"
#include "Json.hpp"
#include "Bedrock.hpp"

#define BEFORE_EXTRA

#undef BEFORE_EXTRA

class ExpressionNode {

#define AFTER_EXTRA

#undef AFTER_EXTRA
public:
#ifdef ENABLE_VIRTUAL_FAKESYMBOL_EXPRESSIONNODE
#endif
    MCAPI ExpressionNode(class ExpressionNode const &);
    MCAPI ExpressionNode(class ExpressionNode &&);
    MCAPI ExpressionNode();
    MCAPI ExpressionNode(char const *, class std::function<class std::function<float (class RenderParams &, std::vector<float> const &)> const * (std::string const &, bool)>, class std::function<class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> const * (std::string const &, bool)>);
    MCAPI ExpressionNode(std::string const &, class std::function<class std::function<float (class RenderParams &, std::vector<float> const &)> const * (std::string const &, bool)>, class std::function<class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> const * (std::string const &, bool)>);
    MCAPI ExpressionNode(class Json::Value const &, class std::function<class std::function<float (class RenderParams &, std::vector<float> const &)> const * (std::string const &, bool)>, class std::function<class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> const * (std::string const &, bool)>);
    MCAPI void clear();
    MCAPI float evalAsFloat(class RenderParams &) const;
    MCAPI struct MolangScriptArg evalGeneric(class RenderParams &) const;
    MCAPI class ExpressionNode & operator=(class ExpressionNode const &);
    MCAPI class ExpressionNode & operator=(float);
    MCAPI class ExpressionNode & operator=(class ExpressionNode &&);
    MCAPI bool optimize();
    MCAPI bool parse(std::string const &, class std::function<class std::function<float (class RenderParams &, std::vector<float> const &)> const * (std::string const &, bool)>, class std::function<class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> const * (std::string const &, bool)>);
    MCAPI ~ExpressionNode();
    MCAPI static void addErrorMessage(std::string const &);
    MCAPI static void buildExpressionOpTable();
    MCAPI static float fast_atof_positiveOnly(char const *&);
    MCAPI static class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> const * genericQueryFunctionAccessorFromString(std::string const &, bool);
    MCAPI static class std::recursive_mutex & getQueryFunctionMutex();
    MCAPI static bool initializeMolang();
    MCAPI static std::vector<std::string> mExpressionOpTokens;
    MCAPI static class std::function<float (class RenderParams &, std::vector<float> const &)> const * queryFunctionAccessorFromString(std::string const &, bool);
    MCAPI static void registerGenericQueryFunction(std::string const &, class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)>, std::string const &, unsigned __int64, unsigned __int64);
    MCAPI static void registerQueryFunction(std::string const &, class std::function<float (class RenderParams &, std::vector<float> const &)>, std::string const &, unsigned __int64, unsigned __int64);

//private:
    MCAPI bool _checkIsValidAndPopulateUsedTokenFlags(unsigned __int64);
    MCAPI float _evalAsFloat(class RenderParams &) const;
    MCAPI bool _getToken(char const *&, class std::function<class std::function<float (class RenderParams &, std::vector<float> const &)> const * (std::string const &, bool)>, class std::function<class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> const * (std::string const &, bool)>, unsigned __int64 &);
    MCAPI float _internalEvalAsFloat(class RenderParams &) const;
    MCAPI bool buildTree(unsigned __int64, class std::function<class std::function<float (class RenderParams &, std::vector<float> const &)> const * (std::string const &, bool)>, class std::function<class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> const * (std::string const &, bool)>);
    MCAPI bool findClosingOp(unsigned __int64 &, enum ExpressionOp) const;
    MCAPI void optimizeFunctionCallParams();
    MCAPI bool processArrays();
    MCAPI bool processBinaryExpression(enum ExpressionOp);
    MCAPI bool processMathFuncs();
    MCAPI bool processNegatives();
    MCAPI bool processParamsAndVariables();
    MCAPI bool processSections();
    MCAPI bool processSemicolons();
    MCAPI bool processUnaryExpression(enum ExpressionOp);
    MCAPI bool tokenize(char const *, unsigned __int64 &, class std::function<class std::function<float (class RenderParams &, std::vector<float> const &)> const * (std::string const &, bool)>, class std::function<class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> const * (std::string const &, bool)>);

private:
    MCAPI static class std::function<struct MolangScriptArg (class RenderParams &, std::vector<struct MolangScriptArg> const &)> _defaultUnknownGenericQueryFunction;
    MCAPI static class std::function<float (class RenderParams &, std::vector<float> const &)> _defaultUnknownQueryFunction;
    MCAPI static class std::unordered_map<class HashedString, struct MolangGenericQueryFunction, struct std::hash<class HashedString>, struct std::equal_to<class HashedString>, class std::allocator<struct std::pair<class HashedString const, struct MolangGenericQueryFunction>>> mGenericQueryFunctionAccessors;
    MCAPI static bool mMolangInitialized;
    MCAPI static class std::unordered_map<class HashedString, struct MolangQueryFunction, struct std::hash<class HashedString>, struct std::equal_to<class HashedString>, class std::allocator<struct std::pair<class HashedString const, struct MolangQueryFunction>>> mQueryFunctionAccessors;
    MCAPI static class Bedrock::Threading::ThreadLocalObject<struct EvalParams, class std::allocator<struct EvalParams>> mTemporaryMolangEvalParams;

};