#pragma once #include #include #include #include #include #include #include #include #include namespace ore { struct ResDic; struct ResMetaData; } // namespace ore namespace evfl { class FlowchartContext; class FlowchartObj; struct ResEntryPoint; class MetaDataPack { public: ORE_ENUM(DataType, kInt, kBool, kFloat, kString, kWString) struct Entry { union Value { bool b; int i; float f; const char* str; const wchar_t* wstr; }; bool IsKey(const ore::StringView& other) const { return ore::StringView(key) == other; } const char* key; Value value; DataType::Type type; }; class Builder { public: void CalcMemSize(); bool Build(MetaDataPack* pack, ore::Buffer buffer); void SetNumEntries(int num) { m_num_entries = num; } int GetRequiredSize() const { return m_required_size; } private: int m_num_entries = 16; int m_required_size = 0; int m_alignment_real = 16; int m_entries_byte_size = 0; int m_alignment = 16; int _14 = 0; int m_buffer_offset = -1; }; void AddInt(const char* key, int value); void AddBool(const char* key, bool value); void AddFloat(const char* key, float value); void AddStringPtr(const char* key, const char* value); void AddWStringPtr(const char* key, const wchar_t* value); bool FindInt(int* value, const ore::StringView& key) const; bool FindBool(bool* value, const ore::StringView& key) const; bool FindFloat(float* value, const ore::StringView& key) const; bool FindString(ore::StringView* value, const ore::StringView& key) const; bool FindWString(ore::WStringView* value, const ore::StringView& key) const; ore::ResMetaData::DataType::Type GetType(const ore::StringView& key) const; private: Entry* Find(const ore::StringView& key) const; Entry& AddEntry() { return m_entries[m_entries_num++]; } ore::Array GetEntries() const { return {m_entries, m_entries_num}; } ore::Buffer m_buffer{}; Entry* m_entries{}; int m_entries_num{}; int m_entries_capacity{}; }; class VariablePack { public: using VariableType = ore::ResMetaData::DataType::Type; struct Entry { union Value { void* dummy; int i; float f; ore::DynArrayList* int_array; ore::DynArrayList* float_array; }; Value value; VariableType type; }; VariablePack(); ~VariablePack(); VariablePack(const VariablePack&) = delete; auto operator=(const VariablePack&) = delete; void Init(AllocateArg arg, const ResEntryPoint* entry_point); Entry* GetVariableEntry(const ore::StringView& name); const Entry* GetVariableEntry(const ore::StringView& name) const; VariableType GetVariableType(const ore::StringView& name) const; ore::StringView GetVariableName(int idx) const; int GetVariableCount() const; bool Contains(const ore::StringView& name) const; bool FindInt(int* value, const ore::StringView& name) const; bool FindBool(bool* value, const ore::StringView& name) const; bool FindFloat(float* value, const ore::StringView& name) const; bool FindIntList(ore::DynArrayList** value, const ore::StringView& name) const; bool FindFloatList(ore::DynArrayList** value, const ore::StringView& name) const; int GetInt(const ore::StringView& name) const; bool GetBool(const ore::StringView& name) const; float GetFloat(const ore::StringView& name) const; ore::DynArrayList* GetIntList(const ore::StringView& name) const; ore::DynArrayList* GetFloatList(const ore::StringView& name) const; void SetInt(const ore::StringView& name, int value); void SetFloat(const ore::StringView& name, float value); void SetBool(const ore::StringView& name, bool value); private: void Dispose(); ore::Allocator* GetAllocator() { return &m_allocator; } const ore::ResDic* m_names = nullptr; ore::Array m_variables; EvflAllocator m_allocator; }; class ParamAccessor { public: using Type = ore::ResMetaData::DataType::Type; using IntRange = ore::IterRange; using FloatRange = ore::IterRange; using StringRange = ore::IterRange*>; using WStringRange = ore::IterRange*>; explicit ParamAccessor(const ore::ResMetaData* metadata); explicit ParamAccessor(const FlowchartContext* context, int node_idx); const ore::ResMetaData* GetFrontResMetaData() const; int GetParamCount() const; ore::StringView GetParamName(int idx) const; Type GetParamType(int idx) const; /// @param out_metadata Must be nonnull. /// @param out_metadata_pack Must be nonnull. /// @param out_variable_pack Must be nonnull. /// @param out_obj May be null. /// @param argument Name of the argument to search for. ore::StringView TrackBackArgument(const ore::ResMetaData** out_metadata, const MetaDataPack** out_metadata_pack, const VariablePack** out_variable_pack, FlowchartObj** out_obj, const ore::StringView& argument) const; int GetInt(int idx) const; bool FindInt(int* value, const ore::StringView& name) const; bool GetBool(int idx) const; bool FindBool(bool* value, const ore::StringView& name) const; float GetFloat(int idx) const; bool FindFloat(float* value, const ore::StringView& name) const; ore::StringView GetString(int idx) const; bool FindString(ore::StringView* value, const ore::StringView& name) const; ore::WStringView GetWString(int idx) const; bool FindWString(ore::WStringView* value, const ore::StringView& name) const; IntRange GetIntArray(int idx) const; bool FindIntArray(IntRange* value, const ore::StringView& name) const; FloatRange GetFloatArray(int idx) const; bool FindFloatArray(FloatRange* value, const ore::StringView& name) const; StringRange GetStringArray(int idx) const; bool FindStringArray(StringRange* value, const ore::StringView& name) const; WStringRange GetWStringArray(int idx) const; bool FindWStringArray(WStringRange* value, const ore::StringView& name) const; bool FindActorIdentifier(ore::StringView* actor_name, ore::StringView* actor_sub_name, const ore::StringView& name) const; private: const ore::ResMetaData* m_metadata = nullptr; const FlowchartContext* m_context = nullptr; int m_node_idx = -1; u32 m_node_counter = -1; }; } // namespace evfl