1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2024-12-28 18:18:52 +00:00
OpenMW/components/files/multidircollection.hpp

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

72 lines
2.1 KiB
C++
Raw Normal View History

2011-05-05 17:00:00 +00:00
#ifndef COMPONENTS_FILES_MULTIDIRSOLLECTION_HPP
#define COMPONENTS_FILES_MULTIDIRSOLLECTION_HPP
#include <cctype>
#include <filesystem>
2011-05-05 17:00:00 +00:00
#include <map>
#include <string>
#include <vector>
#include <components/misc/strings/algorithm.hpp>
2011-05-05 17:00:00 +00:00
namespace Files
{
typedef std::vector<std::filesystem::path> PathContainer;
2011-05-05 17:00:00 +00:00
struct NameLess
{
bool mStrict;
NameLess(bool strict)
: mStrict(strict)
{
}
bool operator()(const std::string& left, const std::string& right) const
{
if (mStrict)
return left < right;
return Misc::StringUtils::ciLess(left, right);
2011-05-05 17:00:00 +00:00
}
};
/// \brief File collection across several directories
///
/// This class lists all files with one specific extensions within one or more
/// directories. If the same file appears more than once, the file in the directory
/// with the higher priority is used.
class MultiDirCollection
{
public:
typedef std::map<std::string, std::filesystem::path, NameLess> TContainer;
2011-05-05 17:00:00 +00:00
typedef TContainer::const_iterator TIter;
2022-09-22 18:26:05 +00:00
2011-05-05 17:00:00 +00:00
private:
TContainer mFiles;
2022-09-22 18:26:05 +00:00
2011-05-05 17:00:00 +00:00
public:
MultiDirCollection(const Files::PathContainer& directories, const std::string& extension, bool foldCase);
2011-05-05 17:00:00 +00:00
///< Directories are listed with increasing priority.
/// \param extension The extension that should be listed in this collection. Must
/// contain the leading dot.
/// \param foldCase Ignore filename case
2022-09-22 18:26:05 +00:00
std::filesystem::path getPath(const std::string& file) const;
///< Return full path (including filename) of \a file.
2011-05-05 17:00:00 +00:00
///
/// If the file does not exist, an exception is thrown. \a file must include
/// the extension.
2022-09-22 18:26:05 +00:00
2012-12-26 16:15:53 +00:00
bool doesExist(const std::string& file) const;
///< \return Does a file with the given name exist?
2022-09-22 18:26:05 +00:00
2011-05-05 17:00:00 +00:00
TIter begin() const;
///< Return iterator pointing to the first file.
2022-09-22 18:26:05 +00:00
2011-05-05 17:00:00 +00:00
TIter end() const;
///< Return iterator pointing past the last file.
};
}
#endif