| // 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_ |