//! A crate with utility types for use by other crates that implement specifics.
//!
//! Unless specified differently, all operations need an index file (e.g. `.git/index`) as driver.
//!
//! ## Feature Flags
#![cfg_attr(
    all(doc, feature = "document-features"),
    doc = ::document_features::document_features!()
)]
#![cfg_attr(all(doc, feature = "document-features"), feature(doc_cfg, doc_auto_cfg))]
#![deny(missing_docs, rust_2018_idioms, unsafe_code)]
use bstr::BString;
/// Provides types needed for using [`stack::Platform::matching_attributes()`].
#[cfg(feature = "attributes")]
pub use gix_attributes as attributes;
/// A way to access the [`Case`](glob::pattern::Case) enum which used throughout this API.
pub use gix_glob as glob;
/// Provides types needed for using [`stack::Platform::excluded_kind()`].
pub use gix_ignore as ignore;
/// Provides types needed for using [`Stack::at_path()`] and [`Stack::at_entry()`].
pub use gix_object as object;

/// A cache for efficiently executing operations on directories and files which are encountered in sorted order.
/// That way, these operations can be re-used for subsequent invocations in the same directory.
///
/// This cache can be configured to create directories efficiently, read git-ignore files and git-attribute files,
/// in any combination.
///
/// A cache for directory creation to reduce the amount of stat calls when creating
/// directories safely, that is without following symlinks that might be on the way.
///
/// As a special case, it offers a 'prefix' which (by itself) is assumed to exist and may contain symlinks.
/// Everything past that prefix boundary must not contain a symlink. We do this by allowing any input path.
///
/// Another added benefit is its ability to store the path of full path of the entry to which leading directories
/// are to be created to avoid allocating memory.
///
/// For this to work, it remembers the last 'good' path to a directory and assumes that all components of it
/// are still valid, too.
/// As directories are created, the cache will be adjusted to reflect the latest seen directory.
///
/// The caching is only useful if consecutive calls to create a directory are using a sorted list of entries.
#[derive(Clone)]
pub struct Stack {
    stack: gix_fs::Stack,
    /// tells us what to do as we change paths.
    state: stack::State,
    /// A buffer used when reading attribute or ignore files or their respective objects from the object database.
    buf: Vec<u8>,
    /// If case folding should happen when looking up attributes or exclusions.
    case: gix_glob::pattern::Case,
    /// A lookup table for object ids to read from in some situations when looking up attributes or exclusions.
    id_mappings: Vec<PathIdMapping>,
    statistics: stack::Statistics,
}

pub(crate) type PathIdMapping = (BString, gix_hash::ObjectId);

///
#[allow(clippy::empty_docs)]
pub mod stack;
