Home | History | Annotate | Download | only in facet.num.get.members
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // PR11871
     11 // XFAIL: with_system_cxx_lib=macosx10.7
     12 
     13 // <locale>
     14 
     15 // class num_get<charT, InputIterator>
     16 
     17 // iter_type get(iter_type in, iter_type end, ios_base&,
     18 //               ios_base::iostate& err, float& v) const;
     19 
     20 #include <locale>
     21 #include <ios>
     22 #include <cassert>
     23 #include <streambuf>
     24 #include <cmath>
     25 #include "test_iterators.h"
     26 #include "hexfloat.h"
     27 
     28 typedef std::num_get<char, input_iterator<const char*> > F;
     29 
     30 class my_facet
     31     : public F
     32 {
     33 public:
     34     explicit my_facet(std::size_t refs = 0)
     35         : F(refs) {}
     36 };
     37 
     38 
     39 int main()
     40 {
     41     const my_facet f(1);
     42     std::ios ios(0);
     43     float v = -1;
     44     {
     45         const char str[] = "123";
     46         assert((ios.flags() & ios.basefield) == ios.dec);
     47         assert(ios.getloc().name() == "C");
     48         std::ios_base::iostate err = ios.goodbit;
     49         input_iterator<const char*> iter =
     50             f.get(input_iterator<const char*>(str),
     51                   input_iterator<const char*>(str+sizeof(str)),
     52                   ios, err, v);
     53         assert(iter.base() == str+sizeof(str)-1);
     54         assert(err == ios.goodbit);
     55         assert(v == 123);
     56     }
     57     {
     58         const char str[] = "-123";
     59         std::ios_base::iostate err = ios.goodbit;
     60         input_iterator<const char*> iter =
     61             f.get(input_iterator<const char*>(str),
     62                   input_iterator<const char*>(str+sizeof(str)),
     63                   ios, err, v);
     64         assert(iter.base() == str+sizeof(str)-1);
     65         assert(err == ios.goodbit);
     66         assert(v == -123);
     67     }
     68     {
     69         const char str[] = "123.5";
     70         std::ios_base::iostate err = ios.goodbit;
     71         input_iterator<const char*> iter =
     72             f.get(input_iterator<const char*>(str),
     73                   input_iterator<const char*>(str+sizeof(str)),
     74                   ios, err, v);
     75         assert(iter.base() == str+sizeof(str)-1);
     76         assert(err == ios.goodbit);
     77         assert(v == 123.5);
     78     }
     79     {
     80         const char str[] = "125e-1";
     81         hex(ios);
     82         std::ios_base::iostate err = ios.goodbit;
     83         input_iterator<const char*> iter =
     84             f.get(input_iterator<const char*>(str),
     85                   input_iterator<const char*>(str+sizeof(str)),
     86                   ios, err, v);
     87         assert(iter.base() == str+sizeof(str)-1);
     88         assert(err == ios.goodbit);
     89         assert(v == 125e-1);
     90     }
     91     {
     92         const char str[] = "0x125p-1";
     93         hex(ios);
     94         std::ios_base::iostate err = ios.goodbit;
     95         input_iterator<const char*> iter =
     96             f.get(input_iterator<const char*>(str),
     97                   input_iterator<const char*>(str+sizeof(str)),
     98                   ios, err, v);
     99         assert(iter.base() == str+sizeof(str)-1);
    100         assert(err == ios.goodbit);
    101         assert(v == hexfloat<float>(0x125, 0, -1));
    102     }
    103     {
    104         const char str[] = "inf";
    105         hex(ios);
    106         std::ios_base::iostate err = ios.goodbit;
    107         input_iterator<const char*> iter =
    108             f.get(input_iterator<const char*>(str),
    109                   input_iterator<const char*>(str+sizeof(str)),
    110                   ios, err, v);
    111         assert(iter.base() == str+sizeof(str)-1);
    112         assert(err == ios.goodbit);
    113         assert(v == INFINITY);
    114     }
    115     {
    116         const char str[] = "INF";
    117         hex(ios);
    118         std::ios_base::iostate err = ios.goodbit;
    119         input_iterator<const char*> iter =
    120             f.get(input_iterator<const char*>(str),
    121                   input_iterator<const char*>(str+sizeof(str)),
    122                   ios, err, v);
    123         assert(iter.base() == str+sizeof(str)-1);
    124         assert(err == ios.goodbit);
    125         assert(v == INFINITY);
    126     }
    127     {
    128         const char str[] = "-inf";
    129         hex(ios);
    130         std::ios_base::iostate err = ios.goodbit;
    131         input_iterator<const char*> iter =
    132             f.get(input_iterator<const char*>(str),
    133                   input_iterator<const char*>(str+sizeof(str)),
    134                   ios, err, v);
    135         assert(iter.base() == str+sizeof(str)-1);
    136         assert(err == ios.goodbit);
    137         assert(v == -INFINITY);
    138     }
    139     {
    140         const char str[] = "-INF";
    141         hex(ios);
    142         std::ios_base::iostate err = ios.goodbit;
    143         input_iterator<const char*> iter =
    144             f.get(input_iterator<const char*>(str),
    145                   input_iterator<const char*>(str+sizeof(str)),
    146                   ios, err, v);
    147         assert(iter.base() == str+sizeof(str)-1);
    148         assert(err == ios.goodbit);
    149         assert(v == -INFINITY);
    150     }
    151     {
    152         const char str[] = "nan";
    153         hex(ios);
    154         std::ios_base::iostate err = ios.goodbit;
    155         input_iterator<const char*> iter =
    156             f.get(input_iterator<const char*>(str),
    157                   input_iterator<const char*>(str+sizeof(str)),
    158                   ios, err, v);
    159         assert(iter.base() == str+sizeof(str)-1);
    160         assert(err == ios.goodbit);
    161         assert(std::isnan(v));
    162     }
    163     {
    164         const char str[] = "NAN";
    165         hex(ios);
    166         std::ios_base::iostate err = ios.goodbit;
    167         input_iterator<const char*> iter =
    168             f.get(input_iterator<const char*>(str),
    169                   input_iterator<const char*>(str+sizeof(str)),
    170                   ios, err, v);
    171         assert(iter.base() == str+sizeof(str)-1);
    172         assert(err == ios.goodbit);
    173         assert(std::isnan(v));
    174     }
    175     {
    176         v = -1;
    177         const char str[] = "3.40283e+39"; // unrepresentable
    178         std::ios_base::iostate err = ios.goodbit;
    179         input_iterator<const char*> iter =
    180             f.get(input_iterator<const char*>(str),
    181                   input_iterator<const char*>(str+sizeof(str)),
    182                   ios, err, v);
    183         assert(iter.base() == str+sizeof(str)-1);
    184         assert(err == ios.failbit);
    185         assert(v == HUGE_VALF);
    186     }
    187     {
    188         v = -1;
    189         const char str[] = "-3.40283e+38"; // unrepresentable
    190         std::ios_base::iostate err = ios.goodbit;
    191         input_iterator<const char*> iter =
    192             f.get(input_iterator<const char*>(str),
    193                   input_iterator<const char*>(str+sizeof(str)),
    194                   ios, err, v);
    195         assert(iter.base() == str+sizeof(str)-1);
    196         assert(err == ios.failbit);
    197         assert(v == -HUGE_VALF);
    198 
    199     }
    200     {
    201         v = -1;
    202         const char str[] = "2-";
    203         std::ios_base::iostate err = ios.goodbit;
    204         input_iterator<const char*> iter =
    205             f.get(input_iterator<const char*>(str),
    206                   input_iterator<const char*>(str+sizeof(str)),
    207                   ios, err, v);
    208         assert(iter.base() == str+1);
    209         assert(err == ios.goodbit);
    210         assert(v == 2);
    211     }
    212 }
    213