1 /* A class for referring to events within a diagnostic_path.
2    Copyright (C) 2019-2020 Free Software Foundation, Inc.
3    Contributed by David Malcolm <dmalcolm@redhat.com>
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #ifndef GCC_DIAGNOSTIC_EVENT_ID_H
22 #define GCC_DIAGNOSTIC_EVENT_ID_H
23 
24 /* A class for referring to events within a diagnostic_path.
25 
26    They are stored as 0-based offsets into the events, but
27    printed (e.g. via %@) as 1-based numbers.
28 
29    For example, a 3-event path has event offsets 0, 1, and 2,
30    which would be shown to the user as "(1)", "(2)" and "(3)".
31 
32    This has its own header so that pretty-print.c can use this
33    to implement "%@" without bringing in all of diagnostic_path
34    (which e.g. refers to "tree").  */
35 
36 class diagnostic_event_id_t
37 {
38  public:
diagnostic_event_id_t()39   diagnostic_event_id_t () : m_index (UNKNOWN_EVENT_IDX) {}
diagnostic_event_id_t(int zero_based_idx)40   diagnostic_event_id_t (int zero_based_idx) : m_index (zero_based_idx) {}
41 
known_p()42   bool known_p () const { return m_index != UNKNOWN_EVENT_IDX; }
43 
one_based()44   int one_based () const
45   {
46     gcc_assert (known_p ());
47     return m_index + 1;
48   }
49 
50  private:
51   static const int UNKNOWN_EVENT_IDX = -1;
52   int m_index; // zero-based
53 };
54 
55 /* A pointer to a diagnostic_event_id_t, for use with the "%@" format
56    code, which will print a 1-based representation for it, with suitable
57    colorization, e.g. "(1)".
58    The %@ format code requires that known_p be true for the event ID. */
59 typedef diagnostic_event_id_t *diagnostic_event_id_ptr;
60 
61 #endif /* ! GCC_DIAGNOSTIC_EVENT_ID_H */
62