#pragma once #include "Value.h" namespace actions { namespace expression { using FunctionImplementation = std::function& parameters)>; struct FunctionDefinition { SCP_string name; SCP_vector parameterTypes; ValueType returnType; FunctionImplementation implementation; }; class FunctionManager { public: // This type is supposed to be global so it may not be copied FunctionManager(const FunctionManager&) = delete; FunctionManager& operator=(const FunctionManager&) = delete; FunctionManager(FunctionManager&&) noexcept = default; FunctionManager& operator=(FunctionManager&&) noexcept = default; void addOperator(const SCP_string& name, std::initializer_list parameterTypes, ValueType returnType, FunctionImplementation implementation); const FunctionDefinition* findOperator(const SCP_string& name, const SCP_vector& parameterTypes) const; static const FunctionManager& instance(); private: FunctionManager(); SCP_unordered_map> m_operators; }; } // namespace expression } // namespace actions