#pragma once #include #include #include #include #include using std::experimental::optional; using std::experimental::nullopt; struct Project { struct Entry { std::string filename; std::vector args; std::string import_file; optional last_modification_time; }; std::vector entries; spp::sparse_hash_map absolute_path_to_entry_index_; std::mutex entries_modification_mutex_; // Loads a project for the given |directory|. // // If |directory| contains a compile_commands.json file, that will be used to // discover all files and args. Otherwise, a recursive directory listing of // all *.cpp, *.cc, *.h, and *.hpp files will be used. clang arguments can be // specified in a clang_args file located inside of |directory|. void Load(const std::string& directory); // Lookup the CompilationEntry for |filename|. optional FindCompilationEntryForFile(const std::string& filename); // Update the modification time for the given filename. This is thread-safe. void UpdateFileState(const std::string& filename, const std::string& import_file, uint64_t modification_time); };