diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2015-07-07 09:18:22 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2015-07-07 09:18:22 +0200 |
commit | 49d5628e35593a5300d39596286c768d7aa435b6 (patch) | |
tree | 43f20983a381c54aac7536e78e4f9543d8761aac /build/target-type | |
parent | 16c19b739a58845af7f807c3dee8021a1c421006 (diff) |
Rework module architecture
Now the target type and rule maps are in scopes (builtins -- in global
scope). We also now have the map of loaded modules in the root scope of
each project.
Diffstat (limited to 'build/target-type')
-rw-r--r-- | build/target-type | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/build/target-type b/build/target-type new file mode 100644 index 0000000..d5e7971 --- /dev/null +++ b/build/target-type @@ -0,0 +1,70 @@ +// file : build/target-type -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD_TARGET_TYPE +#define BUILD_TARGET_TYPE + +#include <map> +#include <string> +#include <ostream> +#include <typeindex> +#include <functional> // reference_wrapper + +#include <butl/utility> // compare_c_string + +#include <build/types> + +namespace build +{ + class scope; + class target; + class target_key; + class prerequisite_key; + + // Target type. + // + struct target_type + { + std::type_index id; + const char* name; + const target_type* base; + target* (*const factory) (dir_path, std::string, const std::string*); + const std::string& (*const extension) (const target_key&, scope&); + target* (*const search) (const prerequisite_key&); + bool see_through; // A group with the default "see through" semantics. + + bool + is_a (const std::type_index&) const; // Defined in target.cxx + + template <typename T> + bool + is_a () const {return is_a (typeid (T));} + }; + + inline std::ostream& + operator<< (std::ostream& os, const target_type& tt) + { + return os << tt.name; + } + + // Target type map. + // + using target_type_map_base = std::map< + const char*, + std::reference_wrapper<const target_type>, + butl::compare_c_string>; + + class target_type_map: public target_type_map_base + { + public: + void + insert (const target_type& tt) {emplace (tt.name, tt);} + + template <typename T> + void + insert () {insert (T::static_type);} + }; +} + +#endif // BUILD_TARGET_TYPE |