// 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 // 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; // Can be relative if part of prerequisite_key. const dir_path* const out; // Can be relative if part of prerequisite_key. const string* const name; const 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); int t, n, d, o; // Unspecified and specified extension are assumed equal. The // extension strings are from the pool, so we can just compare // pointers. // return ((t = xt < yt ? -1 : xt > yt ? 1 : 0) < 0) || (t == 0 && (n = x.name->compare (*y.name)) < 0) || (t == 0 && n == 0 && (d = x.dir->compare (*y.dir)) < 0) || (t == 0 && n == 0 && d == 0 && (o = x.out->compare (*y.out)) < 0) || (t == 0 && n == 0 && d == 0 && o == 0 && 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