// file : build2/target-key -*- C++ -*- // copyright : Copyright (c) 2014-2016 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef BUILD2_TARGET_KEY #define BUILD2_TARGET_KEY #include #include #include #include // reference_wrapper #include // compare_c_string #include #include #include namespace build2 { // Light-weight (by being shallow-pointing) target key. // class target_key { public: const target_type* const type; const dir_path* const dir; const std::string* const name; const std::string* const& ext; friend bool operator< (const target_key& x, const target_key& y) { const target_type* xt (x.type); const target_type* yt (y.type); //@@ TODO: use compare() to compare once. // Unspecified and specified extension are assumed equal. The // extension strings are from the pool, so we can just compare // pointers. // return (xt < yt) || (xt == yt && *x.name < *y.name) || (xt == yt && *x.name == *y.name && *x.dir < *y.dir) || (xt == yt && *x.name == *y.name && *x.dir == *y.dir && x.ext != nullptr && y.ext != nullptr && *x.ext < *y.ext); } }; // If the target type has a custom print function, call that. Otherwise, // call to_stream() with the current stream verbosity as a third argument. // Both are defined in target.cxx. // ostream& operator<< (ostream&, const target_key&); ostream& to_stream (ostream&, const target_key&, uint16_t ext_verb); } #endif // BUILD2_TARGET_KEY