|  | // Copyright (c) 2013 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_LOCATION_H_ | 
|  | #define TOOLS_GN_LOCATION_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | class InputFile; | 
|  |  | 
|  | // Represents a place in a source file. Used for error reporting. | 
|  | class Location { | 
|  | public: | 
|  | Location(); | 
|  | Location(const InputFile* file, int line_number, int column_number, int byte); | 
|  |  | 
|  | const InputFile* file() const { return file_; } | 
|  | int line_number() const { return line_number_; } | 
|  | int column_number() const { return column_number_; } | 
|  | int byte() const { return byte_; } | 
|  | bool is_null() const { return *this == Location(); } | 
|  |  | 
|  | bool operator==(const Location& other) const; | 
|  | bool operator!=(const Location& other) const; | 
|  | bool operator<(const Location& other) const; | 
|  |  | 
|  | // Returns a string with the file, line, and (optionally) the character | 
|  | // offset for this location. If this location is null, returns an empty | 
|  | // string. | 
|  | std::string Describe(bool include_column_number) const; | 
|  |  | 
|  | private: | 
|  | const InputFile* file_;  // Null when unset. | 
|  | int line_number_;        // -1 when unset. 1-based. | 
|  | int column_number_;      // -1 when unset. 1-based. | 
|  | int byte_;               // Index into the buffer, 0-based. | 
|  | }; | 
|  |  | 
|  | // Represents a range in a source file. Used for error reporting. | 
|  | // The end is exclusive i.e. [begin, end) | 
|  | class LocationRange { | 
|  | public: | 
|  | LocationRange(); | 
|  | LocationRange(const Location& begin, const Location& end); | 
|  |  | 
|  | const Location& begin() const { return begin_; } | 
|  | const Location& end() const { return end_; } | 
|  | bool is_null() const { | 
|  | return begin_.is_null();  // No need to check both for the null case. | 
|  | } | 
|  |  | 
|  | LocationRange Union(const LocationRange& other) const; | 
|  |  | 
|  | private: | 
|  | Location begin_; | 
|  | Location end_; | 
|  | }; | 
|  |  | 
|  | #endif  // TOOLS_GN_LOCATION_H_ |