Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

suggestion: optimize enums when marked as static #88

Open
mandar1jn opened this issue Apr 2, 2024 · 0 comments
Open

suggestion: optimize enums when marked as static #88

mandar1jn opened this issue Apr 2, 2024 · 0 comments

Comments

@mandar1jn
Copy link
Contributor

Given the following code:

fn hash(str input)
{
    str lowercase = std::string::to_lower(input);
    u32 length = std::string::length(lowercase);
    u8 bytes[length];
    
    for(u8 i = 0, i < length, i = i + 1)
    {
        bytes[i] = std::string::at(lowercase, i);
    }
    
    u32 hash = std::hash::crc32(bytes, 0xFFFFFFFF, 0x04C11DB7, 0xFFFFFFFF, true, true);
    return hash;
};

enum ObjectType : u32
{
    // r::*
    ResourceMetadata = hash("r::ResourceMetadata"),
    FileInfoMetadata = hash("r::FileInfoMetadata"),
    BinaryBlobMetadata = hash("r::BinaryBlobMetadata"),
    BoundBox = hash("r::BoundBox"),
    // rend::*
    TextureMetadata = hash("rend::TextureMetadata"),
    TextureDesc = hash("rend::TextureDesc"),
    MeshMetadata = hash("rend::MeshMetadata"),
    MeshFormat = hash("rend::MeshFormat"),
    ParticleSystemMetadata = hash("rend::ParticleSystemMetadata"),
    // snd::*
    ExternalSourceMetadata = hash("snd::ExternalSourceMetadata"),
    SoundBankMetadata = hash("snd::SoundBankMetadata"),
    // physics::*
    DMMAnimationMetadata = hash("physics::DMMAnimationMetadata"),
    HavokClothMetadata = hash("physics::HavokClothMetadata"),
    MorphemePackMetadata = hash("physics::MorphemePackMetadata"),
    RBFMetadata = hash("physics::RBFMetadata"),
    MorphemeMetadata = hash("physics::MorphemeMetadata"),
    CollisionPackageMetadata = hash("physics::CollisionPackageMetadata"),
    SkeletonMetadata = hash("physics::SkeletonMetadata"),
    // physics::CollisionPackageMetadata::*
    RigidBodyInfo = hash("physics::CollisionPackageMetadata::RigidBodyInfo"),
    ShapeInfo = hash("physics::CollisionPackageMetadata::ShapeInfo"),
    //unknown, seems to contain rid
    RIDObject = 0x1BFC72D5,
    RIDListEntry = 0x35AE54C1,
    // name assigned by me until real name found
    RIDList = 0xE974FDFF
};

and the match case

match(objectType)
    {
        (ObjectType::ResourceMetadata): ResourceMetadata data [[inline]];
        (ObjectType::TextureMetadata): TextureMetadata data [[inline]];
        (ObjectType::TextureDesc): TextureDesc data [[inline]];
        (ObjectType::DMMAnimationMetadata): DMMAnimationMetadata data [[inline]];
        (ObjectType::RIDObject): UnknownObject data [[inline]];
        (ObjectType::FileInfoMetadata): FileInfoMetadata data [[inline]];
        (ObjectType::RIDList): RIDList data [[inline]];
        (ObjectType::RIDListEntry): UnknownObject data [[inline]];
        (ObjectType::BinaryBlobMetadata): BinaryBlobMetadata data [[inline]];
        (ObjectType::MeshMetadata): MeshMetadata data [[inline]];
        (ObjectType::MeshFormat): MeshFormat data [[inline]];
        (ObjectType::BoundBox): BoundBox data [[inline]];
        (ObjectType::ParticleSystemMetadata): ParticleSystemMetadata data [[inline]];
        (ObjectType::MorphemePackMetadata): MorphemePackMetadata data [[inline]];
        (ObjectType::HavokClothMetadata): HavokClothMetadata data [[inline]];
        (ObjectType::RBFMetadata): RBFMetadata data [[inline]];
        (ObjectType::MorphemeMetadata): MorphemeMetadata data [[inline]];
        (ObjectType::SoundBankMetadata): SoundBankMetadata data [[inline]];
        (ObjectType::CollisionPackageMetadata): CollisionPackageMetadata data [[inline]];
        (ObjectType::RigidBodyInfo): RigidBodyInfo data [[inline]];
        (ObjectType::ShapeInfo): ShapeInfo data [[inline]];
        (ObjectType::SkeletonMetadata): SkeletonMetadata data;
        (ObjectType::ExternalSourceMetadata): ExternalSourceMetadata data [[inline]];
        (_): std::error(std::format("Unknown object type at {}", $));
    }

my pattern slows to a crawl. My assumption is that this is because the hash is recalculated every time. I have switched back to hardcoded hashes, but it would be great if this was a viable approach

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant