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