Program Listing for File traits.hpp

Return to documentation for file (/home/runner/work/Legion-Engine/Legion-Engine/legion/engine/core/filesystem/detail/traits.hpp)

#pragma once

namespace legion::core::filesystem {
    struct file_traits {
        bool is_file {};
        bool is_directory {};
        bool is_valid{};

        bool can_be_written{};
        bool can_be_read{};
        bool can_be_created{};

        bool exists{};
    };

    constexpr static  file_traits invalid_file_t{false,false,false,false,false,false,false};

    inline bool operator == (const file_traits& rhs, const file_traits& lhs) noexcept
    {
        if(&rhs == &lhs) return true;

        return rhs.is_file == lhs.is_file &&
               rhs.is_directory == lhs.is_directory &&
               rhs.is_valid == lhs.is_valid &&
               rhs.can_be_written == lhs.can_be_written &&
               rhs.can_be_read == lhs.can_be_read &&
               rhs.can_be_created == lhs.can_be_created &&
               rhs.exists == lhs.exists;
    }

    inline bool operator != (const file_traits& rhs, const file_traits& lhs) noexcept
    {
        return !(rhs == lhs);
    }


    struct filesystem_traits {
        bool is_readonly {};
        bool is_valid {};
    };

    inline void inherit_traits(const filesystem_traits& fstraits, file_traits& ftraits) noexcept
    {
        if(!fstraits.is_valid)
        {
            ftraits = invalid_file_t;
            return;
        }
        if(fstraits.is_readonly)
        {
            ftraits.can_be_written = false;
            ftraits.can_be_created = false;
        }
    }

    inline void inherit_traits(const filesystem_traits& outer, filesystem_traits& inner) noexcept
    {
        if(!outer.is_valid) inner.is_valid = false;
        if(outer.is_readonly) inner.is_readonly = true;
    }


    constexpr static filesystem_traits invalid_filesystem_t{false,false};

    inline void sanitize_traits(file_traits& traits) noexcept
    {

        if(traits.is_file) traits.is_directory = false;
        if(traits.is_directory)
        {
            traits.can_be_written = false;
            traits.can_be_read = false;
        }
        if(traits.exists)
        {
            traits.can_be_created = false;
            traits.is_valid = true;
            if(traits.is_file)
            {
                traits.can_be_read = true;
            }
        }
    }
}