X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Farchitecture.h;h=4642080c59307ab897fabb76d22c81d26ea70aed;hb=d1f9551e05c9d341149eb490e05b1465d3d6b711;hp=6828ad88337d3cd2b7c17a5b565e922b8e25fd55;hpb=76ede1d44e68182a2380260c22ec7be68c9817af;p=builder.git diff --git a/source/architecture.h b/source/architecture.h index 6828ad8..4642080 100644 --- a/source/architecture.h +++ b/source/architecture.h @@ -1,6 +1,7 @@ #ifndef ARCHITECTURE_H_ #define ARCHITECTURE_H_ +#include #include #include "buildinfo.h" #include "pattern.h" @@ -20,23 +21,18 @@ public: Loader(Architecture &); }; - typedef std::list PatternList; - private: Builder &builder; std::string type; std::string cpu; std::string fpu; std::string system; - unsigned bits; + unsigned bits = 0; std::string toolchain; std::string name; - bool native; + bool native = false; std::string cross_prefix; - PatternList object_patterns; - PatternList sharedlib_patterns; - PatternList staticlib_patterns; - PatternList executable_patterns; + std::map> filename_patterns; public: Architecture(Builder &b, const std::string &spec); @@ -48,21 +44,44 @@ public: const std::string &get_cpu() const { return cpu; } const std::string &get_fpu() const { return fpu; } const std::string &get_toolchain() const { return toolchain; } - bool match_name(const std::string &) const; - std::string best_match(const std::list &) const; + bool match_name(const std::string &, unsigned * = 0) const; + std::string best_match(const std::vector &) const; bool is_native() const { return native; } bool is_cross() const { return !cross_prefix.empty(); } const std::string &get_cross_prefix() const { return cross_prefix; } - const PatternList &get_object_patterns() const { return object_patterns; } - const PatternList &get_shared_library_patterns() const { return sharedlib_patterns; } - const PatternList &get_static_library_patterns() const { return staticlib_patterns; } - const PatternList &get_executable_patterns() const { return executable_patterns; } + template + const std::vector &get_patterns() const; + + template + std::string create_filename(const std::string &) const; + +private: + template + void add_pattern(const std::string &); private: static void resolve_aliases(std::vector &); void parse_specification(const std::string &); }; +template +inline const std::vector &Architecture::get_patterns() const +{ + auto i = filename_patterns.find(typeid(T).name()); + if(i!=filename_patterns.end()) + return i->second; + + static std::vector empty; + return empty; +} + +template +inline std::string Architecture::create_filename(const std::string &base) const +{ + const std::vector &patterns = get_patterns(); + return patterns.empty() ? base : patterns.front().apply(base); +} + #endif