/*=============================================================================
    Copyright (c) 2013 Daniel James

    Use, modification and distribution is subject to the Boost Software
    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/

#if !defined(QUICKBOOK_DEPENDENCY_TRACKER_HPP)
#define QUICKBOOK_DEPENDENCY_TRACKER_HPP

#include <map>
#include <set>
#include <iosfwd>
#include <boost/filesystem/path.hpp>

namespace quickbook
{
    namespace fs = boost::filesystem;

    struct dependency_tracker {
    private:

        typedef std::map<fs::path, bool> dependency_list;
        typedef std::map<fs::path, std::set<fs::path> > glob_list;

        dependency_list dependencies;
        glob_list glob_dependencies;
        glob_list::iterator last_glob;

    public:

        enum flags {
            default_ = 0,
            checked = 1,
            escaped = 2
        };

        dependency_tracker();

        // Call this before loading any file so that it will be included in the
        // list of dependencies. Returns true if file exists.
        bool add_dependency(fs::path const&);

        void add_glob(fs::path const&);
        void add_glob_match(fs::path const&);

        void write_dependencies(fs::path const&, flags = default_);
        void write_dependencies(std::ostream&, flags = default_);
    };
}

#endif
