#pragma once #include #include #include #include #include namespace ore { struct ResDic; struct ResEndian; struct ResMetaData { struct ActorIdentifier { BinTPtr name; BinTPtr sub_name; }; union Value { BinTPtr container; // Also used for booleans. Anything that is != 0 is treated as true. int i; float f; BinTPtr str; BinTPtr wstr; ActorIdentifier actor; }; ORE_ENUM(DataType, kArgument, kContainer, kInt, kBool, kFloat, kString, kWString, kIntArray, kBoolArray, kFloatArray, kStringArray, kWStringArray, kActorIdentifier) /// @warning Only usable if type == kContainer. const ResMetaData* Get(const StringView& key, DataType::Type expected_type) const { const int idx = dictionary.Get()->FindIndex(key); if (idx == -1) return nullptr; const auto* meta = (&value.container + idx)->Get(); if (meta->type != expected_type) return nullptr; return meta; } SizedEnum type; u16 num_items; BinTPtr dictionary; Value value; }; // XXX: is this unused? struct ResUserData { ORE_ENUM(DataType, kInt, kFloat, kString, kWString, kStream) }; void SwapEndian(ResEndian* endian, ResMetaData* res); } // namespace ore