xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/tr2/bool_set.tcc (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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