Where Online Learning is simpler!
The C and C++ Include Header Files
cat -n /usr/include/c++/15/tr2/bool_set.tcc
1 // TR2 <bool_set> support files -*- C++ -*- 2 3 // Copyright (C) 2009-2025 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /** @file tr2/bool_set.tcc 26 * This is a TR2 C++ Library header. 27 */ 28 29 #ifndef _GLIBCXX_TR2_BOOL_SET_TCC 30 #define _GLIBCXX_TR2_BOOL_SET_TCC 1 31 32 #ifdef _GLIBCXX_SYSHDR 33 #pragma GCC system_header 34 #endif 35 36 namespace std _GLIBCXX_VISIBILITY(default) 37 { 38 _GLIBCXX_BEGIN_NAMESPACE_VERSION 39 40 namespace tr2 41 { 42 bool_set::_Bool_set_val 43 bool_set::_S_not[4] = 44 { _S_true_, _S_false, _S_indet, _S_empty }; 45 46 bool_set::_Bool_set_val 47 bool_set::_S_xor[4][4] = 48 { { _S_false, _S_true_, _S_indet, _S_empty }, 49 { _S_true_, _S_false, _S_indet, _S_empty }, 50 { _S_indet, _S_indet, _S_indet, _S_empty }, 51 { _S_empty, _S_empty, _S_empty, _S_empty } }; 52 53 bool_set::_Bool_set_val 54 bool_set::_S_or[4][4] = 55 { { _S_false, _S_true_, _S_indet, _S_empty }, 56 { _S_true_, _S_true_, _S_true_, _S_empty }, 57 { _S_indet, _S_true_, _S_indet, _S_empty }, 58 { _S_empty, _S_empty, _S_empty, _S_empty } }; 59 60 bool_set::_Bool_set_val 61 bool_set::_S_and[4][4] = 62 { { _S_false, _S_false, _S_false, _S_empty }, 63 { _S_false, _S_true_, _S_indet, _S_empty }, 64 { _S_false, _S_indet, _S_indet, _S_empty }, 65 { _S_empty, _S_empty, _S_empty, _S_empty } }; 66 67 bool_set::_Bool_set_val 68 bool_set::_S_eq[4][4] = 69 { { _S_true_, _S_false, _S_indet, _S_empty }, 70 { _S_false, _S_true_, _S_indet, _S_empty }, 71 { _S_indet, _S_indet, _S_indet, _S_empty }, 72 { _S_empty, _S_empty, _S_empty, _S_empty } }; 73 } 74 75 _GLIBCXX_END_NAMESPACE_VERSION 76 } 77 78 // I object to these things. 79 // The stuff in locale facets are for basic types. 80 // I think we could hack operator<< and operator>>. 81 82 /** 83 * @brief Numeric parsing. 84 * 85 * Parses the input stream into the bool @a v. It does so by calling 86 * num_get::do_get(). 87 * 88 * If ios_base::boolalpha is set, attempts to read 89 * ctype<CharT>::truename() or ctype<CharT>::falsename(). Sets 90 * @a v to true or false if successful. Sets err to 91 * ios_base::failbit if reading the string fails. Sets err to 92 * ios_base::eofbit if the stream is emptied. 93 * 94 * If ios_base::boolalpha is not set, proceeds as with reading a long, 95 * except if the value is 1, sets @a v to true, if the value is 0, sets 96 * @a v to false, and otherwise set err to ios_base::failbit. 97 * 98 * @param in Start of input stream. 99 * @param end End of input stream. 100 * @param io Source of locale and flags. 101 * @param err Error flags to set. 102 * @param v Value to format and insert. 103 * @return Iterator after reading. 104 iter_type 105 get(iter_type __in, iter_type __end, ios_base& __io, 106 ios_base::iostate& __err, bool& __v) const 107 { return this->do_get(__in, __end, __io, __err, __v); } 108 */ 109 /* 110 template<typename _CharT, typename _InIter> 111 _InIter 112 num_get<_CharT, _InIter>:: 113 do_get(iter_type __beg, iter_type __end, ios_base& __io, 114 ios_base::iostate& __err, bool_set& __v) const 115 { 116 if (!(__io.flags() & ios_base::boolalpha)) 117 { 118 // Parse bool values as long. 119 // NB: We can't just call do_get(long) here, as it might 120 // refer to a derived class. 121 long __l = -1; 122 __beg = _M_extract_int(__beg, __end, __io, __err, __l); 123 if (__c >= _S_false && __c < _S_empty) 124 __b._M_b = static_cast<_Bool_set_val>(__c); 125 else 126 { 127 // What should we do here? 128 __v = true; 129 __err = ios_base::failbit; 130 if (__beg == __end) 131 __err |= ios_base::eofbit; 132 } 133 } 134 else 135 { 136 // Parse bool values as alphanumeric. 137 typedef __numpunct_cache<_CharT> __cache_type; 138 __use_cache<__cache_type> __uc; 139 const locale& __loc = __io._M_getloc(); 140 const __cache_type* __lc = __uc(__loc); 141 142 bool __testf = true; 143 bool __testt = true; 144 bool __donef = __lc->_M_falsename_size == 0; 145 bool __donet = __lc->_M_truename_size == 0; 146 bool __testeof = false; 147 size_t __n = 0; 148 while (!__donef || !__donet) 149 { 150 if (__beg == __end) 151 { 152 __testeof = true; 153 break; 154 } 155 156 const char_type __c = *__beg; 157 158 if (!__donef) 159 __testf = __c == __lc->_M_falsename[__n]; 160 161 if (!__testf && __donet) 162 break; 163 164 if (!__donet) 165 __testt = __c == __lc->_M_truename[__n]; 166 167 if (!__testt && __donef) 168 break; 169 170 if (!__testt && !__testf) 171 break; 172 173 ++__n; 174 ++__beg; 175 176 __donef = !__testf || __n >= __lc->_M_falsename_size; 177 __donet = !__testt || __n >= __lc->_M_truename_size; 178 } 179 if (__testf && __n == __lc->_M_falsename_size && __n) 180 { 181 __v = false; 182 if (__testt && __n == __lc->_M_truename_size) 183 __err = ios_base::failbit; 184 else 185 __err = __testeof ? ios_base::eofbit : ios_base::goodbit; 186 } 187 else if (__testt && __n == __lc->_M_truename_size && __n) 188 { 189 __v = true; 190 __err = __testeof ? ios_base::eofbit : ios_base::goodbit; 191 } 192 else 193 { 194 // _GLIBCXX_RESOLVE_LIB_DEFECTS 195 // 23. Num_get overflow result. 196 __v = false; 197 __err = ios_base::failbit; 198 if (__testeof) 199 __err |= ios_base::eofbit; 200 } 201 } 202 return __beg; 203 } 204 */ 205 206 /** 207 * @brief Numeric formatting. 208 * 209 * Formats the boolean @a v and inserts it into a stream. It does so 210 * by calling num_put::do_put(). 211 * 212 * If ios_base::boolalpha is set, writes ctype<CharT>::truename() or 213 * ctype<CharT>::falsename(). Otherwise formats @a v as an int. 214 * 215 * @param s Stream to write to. 216 * @param io Source of locale and flags. 217 * @param fill Char_type to use for filling. 218 * @param v Value to format and insert. 219 * @return Iterator after writing. 220 iter_type 221 put(iter_type __s, ios_base& __f, char_type __fill, bool __v) const 222 { return this->do_put(__s, __f, __fill, __v); } 223 */ 224 225 /* 226 template<typename _CharT, typename _OutIter> 227 _OutIter 228 num_put<_CharT, _OutIter>:: 229 do_put(iter_type __s, ios_base& __io, char_type __fill, bool_set __v) const 230 { 231 const ios_base::fmtflags __flags = __io.flags(); 232 if ((__flags & ios_base::boolalpha) == 0) 233 { 234 const long __l = __v; 235 __s = _M_insert_int(__s, __io, __fill, __l); 236 } 237 else 238 { 239 typedef __numpunct_cache<_CharT> __cache_type; 240 __use_cache<__cache_type> __uc; 241 const locale& __loc = __io._M_getloc(); 242 const __cache_type* __lc = __uc(__loc); 243 244 const _CharT* __name = __v ? __lc->_M_truename 245 : __lc->_M_falsename; 246 int __len = __v ? __lc->_M_truename_size 247 : __lc->_M_falsename_size; 248 249 const streamsize __w = __io.width(); 250 if (__w > static_cast<streamsize>(__len)) 251 { 252 const streamsize __plen = __w - __len; 253 _CharT* __ps 254 = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) 255 * __plen)); 256 257 char_traits<_CharT>::assign(__ps, __plen, __fill); 258 __io.width(0); 259 260 if ((__flags & ios_base::adjustfield) == ios_base::left) 261 { 262 __s = std::__write(__s, __name, __len); 263 __s = std::__write(__s, __ps, __plen); 264 } 265 else 266 { 267 __s = std::__write(__s, __ps, __plen); 268 __s = std::__write(__s, __name, __len); 269 } 270 return __s; 271 } 272 __io.width(0); 273 __s = std::__write(__s, __name, __len); 274 } 275 return __s; 276 } 277 */ 278 279 #endif // _GLIBCXX_TR2_BOOL_SET_TCC