You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: layout.rs
    path of file: ./repos/vulkano/vulkano/src/image
    
    the code of the file until where you have to start completion: use super::ImageAspect;
use crate::macros::vulkan_enum;

vulkan_enum! {
    #[non_exhaustive]

    /// In-memory layout of the pixel data of an image.
    ///
    /// The pixel data of a Vulkan image is arranged in a particular way, which is called its
    /// *layout*. Each image subresource (mipmap level and array layer) in an image can have a
    /// different layout, but usually the whole image has its data in the same layout. Layouts are
    /// abstract in the sense that the user does not know the specific details of each layout; the
    /// device driver is free to implement each layout in the way it sees fit.
    ///
    /// The layout of a newly created image is either `Undefined` or `Preinitialized`. Every
    /// operation that can be performed on an image is only possible with specific layouts, so
    /// before the operation is performed, the user must perform a *layout transition* on the
    /// image. This rearranges the pixel data from one layout into another. Layout transitions are
    /// performed as part of pipeline barriers in a command buffer.
    ///
    /// The `General` layout is compatible with any operation, so layout transitions are never
    /// needed. However, the other layouts, while more restricted, are usually better optimised for
    /// a particular type of operation than `General`, so they are usually preferred.
    ///
    /// Vulkan does not keep track of layouts itself, so it is the responsibility of the user to
    /// keep track of this information. When performing a layout transition, the previous layout
    /// must be specified as well. Some operations allow for different layouts, but require the
    /// user to specify which one. Vulkano helps with this by providing sensible defaults,
    /// automatically tracking the layout of each image when creating a command buffer, and adding
    /// layout transitions where needed.
    ImageLayout = ImageLayout(i32);

    /// The layout of the data is unknown, and the image is treated as containing no valid data.
    
    
    pub fn is_writable(self, aspect: ImageAspect) -> bool {
        match aspect {
            ImageAspect::Color
            | ImageAspect::Plane0
            | ImageAspect::Plane1
            | ImageAspect::Plane2 => match self {
                ImageLayout::General
                | ImageLayout::ColorAttachmentOptimal
                | ImageLayout::TransferDstOptimal => true,
                ImageLayout::Undefined
                | ImageLayout::DepthStencilAttachmentOptimal
                | ImageLayout::DepthStencilReadOnlyOptimal
                | ImageLayout::ShaderReadOnlyOptimal
                | ImageLayout::TransferSrcOptimal
                | ImageLayout::Preinitialized
                | ImageLayout::DepthReadOnlyStencilAttachmentOptimal
                | ImageLayout::DepthAttachmentStencilReadOnlyOptimal
                | ImageLayout::DepthAttachmentOptimal
                | ImageLayout::DepthReadOnlyOptimal
                | ImageLayout::StencilAttachmentOptimal
                | ImageLayout::StencilReadOnlyOptimal
                | ImageLayout::PresentSrc => false,
            },
            ImageAspect::Depth => match self {
                ImageLayout::General
                | ImageLayout::DepthStencilAttachmentOptimal
                | ImageLayout::TransferDstOptimal
                | ImageLayout::DepthAttachmentStencilReadOnlyOptimal
                | ImageLayout::DepthAttachmentOptimal => true,

                ImageLayout::Undefined
                | ImageLayout::ColorAttachmentOptimal
                | ImageLayout::DepthStencilReadOnlyOptimal
                | ImageLayout::ShaderReadOnlyOptimal
                | ImageLayout::TransferSrcOptimal
                | ImageLayout::Preinitialized
                | ImageLayout::DepthReadOnlyStencilAttachmentOptimal
                | ImageLayout::DepthReadOnlyOptimal
                | ImageLayout::StencilAttachmentOptimal
                | ImageLayout::StencilReadOnlyOptimal
                | ImageLayout::PresentSrc => false,
            },
            ImageAspect::Stencil => match self {
                ImageLayout::General
                | ImageLayout::DepthStencilAttachmentOptimal
                | ImageLayout::TransferDstOptimal
                | ImageLayout::DepthReadOnlyStencilAttachmentOptimal
                | ImageLayout::StencilAttachmentOptimal => true,

                ImageLayout::Undefined
                | ImageLayout::ColorAttachmentOptimal
                | ImageLayout::DepthStencilReadOnlyOptimal
                | ImageLayout::ShaderReadOnlyOptimal
                | ImageLayout::TransferSrcOptimal
                | ImageLayout::Preinitialized
                | ImageLayout::DepthAttachmentStencilReadOnlyOptimal
                | ImageLayout::DepthAttachmentOptimal
                | ImageLayout::DepthReadOnlyOptimal
                | ImageLayout::StencilReadOnlyOptimal
                | ImageLayout::PresentSrc => false,
            },
            ImageAspect::Metadata
            | ImageAspect::MemoryPlane0
            | ImageAspect::MemoryPlane1
            | ImageAspect::MemoryPlane2
            | ImageAspect::MemoryPlane3 => false,
        }
    }