Branch data Line data Source code
1 : : /* "True" vs "False" vs "Unknown".
2 : : Copyright (C) 2019-2025 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
8 : : under the terms of the GNU General Public License as published by
9 : : the Free Software Foundation; either version 3, or (at your option)
10 : : any later version.
11 : :
12 : : GCC is distributed in the hope that it will be useful, but
13 : : WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 : : General Public License 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_TRISTATE_H
22 : : #define GCC_TRISTATE_H
23 : :
24 : : /* "True" vs "False" vs "Unknown". */
25 : :
26 : : class tristate {
27 : : public:
28 : : enum value {
29 : : TS_UNKNOWN,
30 : : TS_TRUE,
31 : : TS_FALSE
32 : : };
33 : :
34 : 2165370 : tristate (enum value val) : m_value (val) {}
35 : 5142696 : tristate (bool val) : m_value (val ? TS_TRUE : TS_FALSE) {}
36 : 45882 : static tristate unknown () { return tristate (TS_UNKNOWN); }
37 : :
38 : : const char *as_string () const;
39 : :
40 : 743876 : bool is_known () const { return m_value != TS_UNKNOWN; }
41 : 23679 : bool is_unknown () const { return m_value == TS_UNKNOWN; }
42 : 532501 : bool is_true () const { return m_value == TS_TRUE; }
43 : 2233222 : bool is_false () const { return m_value == TS_FALSE; }
44 : :
45 : : tristate not_ () const;
46 : : tristate or_ (tristate other) const;
47 : : tristate and_ (tristate other) const;
48 : :
49 : 3320 : bool operator== (const tristate &other) const
50 : : {
51 : 3320 : return m_value == other.m_value;
52 : : }
53 : :
54 : 12 : bool operator!= (const tristate &other) const
55 : : {
56 : 12 : return m_value != other.m_value;
57 : : }
58 : :
59 : 567721 : enum value get_value () const { return m_value; }
60 : :
61 : : private:
62 : : enum value m_value;
63 : : };
64 : :
65 : : /* Overloaded boolean operators on tristates. */
66 : :
67 : : inline tristate
68 : 12 : operator ! (tristate t)
69 : : {
70 : 12 : return t.not_ ();
71 : : }
72 : :
73 : : inline tristate
74 : 36 : operator || (tristate a, tristate b)
75 : : {
76 : 36 : return a.or_ (b);
77 : : }
78 : :
79 : : inline tristate
80 : 3154 : operator && (tristate a, tristate b)
81 : : {
82 : 3154 : return a.and_ (b);
83 : : }
84 : :
85 : : #endif /* GCC_TRISTATE_H */
|