aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/cc/types.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbuild2/cc/types.hxx')
-rw-r--r--libbuild2/cc/types.hxx77
1 files changed, 77 insertions, 0 deletions
diff --git a/libbuild2/cc/types.hxx b/libbuild2/cc/types.hxx
index 20b67c2..70a6340 100644
--- a/libbuild2/cc/types.hxx
+++ b/libbuild2/cc/types.hxx
@@ -4,6 +4,9 @@
#ifndef LIBBUILD2_CC_TYPES_HXX
#define LIBBUILD2_CC_TYPES_HXX
+#include <map>
+#include <unordered_map>
+
#include <libbuild2/types.hxx>
#include <libbuild2/utility.hxx>
@@ -81,6 +84,80 @@ namespace build2
build2::cc::module_info module_info;
};
+ // Ad hoc (as opposed to marked with x.importable) importable headers.
+ //
+ // Note that these are only searched for in the system header search
+ // directories (sys_inc_dirs).
+ //
+ struct importable_headers
+ {
+ mutable shared_mutex mutex;
+
+ using groups = small_vector<string, 3>;
+
+ // Map of groups (e.g., std, <vector>, <boost/*.hpp>) that have already
+ // been inserted.
+ //
+ // For angle-bracket file groups (e.g., <vector>), the value is a
+ // pointer to the corresponding header_map element. For angle-bracket
+ // file pattern groups (e.g., <boost/**.hpp>), the value is the number
+ // of files in the group.
+ //
+ // Note that while the case-sensitivity of header names in #include
+ // directives is implementation-defined, our group names are case-
+ // sensitive (playing loose with the case will lead to portability
+ // issues sooner or later so we don't bother with any more elborate
+ // solutions).
+ //
+ std::unordered_map<string, uintptr_t> group_map;
+
+ // Map of absolute and normalized header paths to groups (e.g., std,
+ // <vector>, <boost/**.hpp>) to which they belong. The groups are
+ // ordered from the most to least specific (e.g., <vector> then std).
+ //
+ std::unordered_map<path, groups> header_map;
+
+ // Note that all these functions assume the instance is unique-locked.
+ //
+
+ // Search for and insert an angle-bracket file, for example <vector>,
+ // making it belong to the angle-bracket file group itself. Return the
+ // pointer to the corresponding header_map element if the file has been
+ // found and NULL otherwise (so can be used as bool).
+ //
+ pair<const path, groups>*
+ insert_angle (const dir_paths& sys_inc_dirs, const string& file);
+
+ // As above but for a manually-searched absolute and normalized path.
+ //
+ pair<const path, groups>&
+ insert_angle (path, const string& file);
+
+ // Search for and insert an angle-bracket file pattern, for example
+ // <boost/**.hpp>, making each header belong to the angle-bracket file
+ // group (e.g., <boost/any.hpp>) and the angle-bracket file pattern
+ // group itself. Return the number of files found that match the
+ // pattern.
+ //
+ size_t
+ insert_angle_pattern (const dir_paths& sys_inc_dirs, const string& pat);
+ };
+
+ // Headers and header groups whose inclusion should or should not be
+ // translated to the corresponding header unit imports.
+ //
+ // The key is either an absolute and normalized header path or a reference
+ // to an importable_headers group (e.g., <vector>, std).
+ //
+ using translatable_headers = std::map<string, optional<bool>>;
+
+ // Special translatable header groups.
+ //
+ extern const string header_group_all;
+ extern const string header_group_all_importable;
+ extern const string header_group_std;
+ extern const string header_group_std_importable;
+
// Compiler language.
//
enum class lang {c, cxx};