#pragma once
#include "common.hpp"
#include "ent.hpp"
#include <vector>
#include <stack>


bool matches(const char**, const char*);


class DirEntries {
    private:
        std::vector<Ent*> entries;

    public:
        static bool before(const Ent*, const Ent*);
        static bool after(const Ent* a, const Ent* b) { return !before(a, b); }

        static DirEntries* getInst(int);
        ~DirEntries();

        Ent* pop();
        void unpop(Ent*);
};


class Dir {
    private:
        Dir(int, DirEntries*, Attr*);

    public:
        const int fd;
        Attr* const attr;
        DirEntries* const entries;

        static Dir* getInst(const char*, Dir* parent=NULL);
        ~Dir();
};


class DirStack {
    private:
        std::stack<Dir*> st;

    public:
        DirStack(const char*);
        ~DirStack();

        Dir* push(const char*);
        Dir* get();
        void pop();
};