|  | // Copyright 2015 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef TOOLS_GN_LIB_FILE_H_ | 
|  | #define TOOLS_GN_LIB_FILE_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  |  | 
|  | #include <algorithm> | 
|  | #include <string> | 
|  | #include <string_view> | 
|  |  | 
|  | #include "tools/gn/source_file.h" | 
|  |  | 
|  | // Represents an entry in "libs" list. Can be either a path (a SourceFile) or | 
|  | // a library name (a string). | 
|  | class LibFile { | 
|  | public: | 
|  | LibFile() = default; | 
|  |  | 
|  | explicit LibFile(const std::string_view& lib_name); | 
|  | explicit LibFile(const SourceFile& source_file); | 
|  |  | 
|  | bool is_source_file() const { return name_.empty(); } | 
|  |  | 
|  | // Returns name, or source_file().value() (whichever is set). | 
|  | const std::string& value() const; | 
|  | const SourceFile& source_file() const; | 
|  |  | 
|  | bool operator==(const LibFile& other) const { | 
|  | return value() == other.value(); | 
|  | } | 
|  | bool operator!=(const LibFile& other) const { return !operator==(other); } | 
|  | bool operator<(const LibFile& other) const { return value() < other.value(); } | 
|  |  | 
|  | private: | 
|  | std::string name_; | 
|  | SourceFile source_file_; | 
|  | }; | 
|  |  | 
|  | namespace std { | 
|  |  | 
|  | template <> | 
|  | struct hash<LibFile> { | 
|  | std::size_t operator()(const LibFile& v) const { | 
|  | hash<std::string> h; | 
|  | return h(v.value()); | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace std | 
|  |  | 
|  | #endif  // TOOLS_GN_LIB_FILE_H_ |