1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file.
4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#ifndef TOOLS_GN_LOCATION_H_
6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#define TOOLS_GN_LOCATION_H_
7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include <algorithm>
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/logging.h"
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass InputFile;
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Represents a place in a source file. Used for error reporting.
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass Location {
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public:
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Location()
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      : file_(NULL),
19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        line_number_(-1),
20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        char_offset_(-1) {
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Location(const InputFile* file, int line_number, int char_offset)
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      : file_(file),
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        line_number_(line_number),
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        char_offset_(char_offset) {
26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const InputFile* file() const { return file_; }
29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  int line_number() const { return line_number_; }
30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  int char_offset() const { return char_offset_; }
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator==(const Location& other) const {
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return other.file_ == file_ &&
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch           other.line_number_ == line_number_ &&
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch           other.char_offset_ == char_offset_;
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator<(const Location& other) const {
39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DCHECK(file_ == other.file_);
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (line_number_ != other.line_number_)
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return line_number_ < other.line_number_;
42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return char_offset_ < other.char_offset_;
43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private:
46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const InputFile* file_;  // Null when unset.
47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  int line_number_;  // -1 when unset.
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  int char_offset_;  // -1 when unset.
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Represents a range in a source file. Used for error reporting.
52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// The end is exclusive i.e. [begin, end)
53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass LocationRange {
54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public:
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  LocationRange() {}
56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  LocationRange(const Location& begin, const Location& end)
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      : begin_(begin),
58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        end_(end) {
59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DCHECK(begin_.file() == end_.file());
60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const Location& begin() const { return begin_; }
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const Location& end() const { return end_; }
64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  LocationRange Union(const LocationRange& other) const {
66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    DCHECK(begin_.file() == other.begin_.file());
67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return LocationRange(
68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        begin_ < other.begin_ ? begin_ : other.begin_,
69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        end_ < other.end_ ? other.end_ : end_);
70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private:
73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Location begin_;
74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  Location end_;
75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif  // TOOLS_GN_LOCATION_H_
78