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 // XFAIL: with_system_lib=x86_64-apple-darwin11
     11 // XFAIL: with_system_lib=x86_64-apple-darwin12
     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, double& 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 class my_numpunct
     39     : public std::numpunct<char>
     40 {
     41 public:
     42     my_numpunct() : std::numpunct<char>() {}
     43 
     44 protected:
     45     virtual char_type do_decimal_point() const {return ';';}
     46     virtual char_type do_thousands_sep() const {return '_';}
     47     virtual std::string do_grouping() const {return std::string("\1\2\3");}
     48 };
     49 
     50 int main()
     51 {
     52     const my_facet f(1);
     53     std::ios ios(0);
     54     double v = -1;
     55     {
     56         const char str[] = "123";
     57         assert((ios.flags() & ios.basefield) == ios.dec);
     58         assert(ios.getloc().name() == "C");
     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";
     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);
     78     }
     79     {
     80         const char str[] = "123.5";
     81         std::ios_base::iostate err = ios.goodbit;
     82         input_iterator<const char*> iter =
     83             f.get(input_iterator<const char*>(str),
     84                   input_iterator<const char*>(str+sizeof(str)),
     85                   ios, err, v);
     86         assert(iter.base() == str+sizeof(str)-1);
     87         assert(err == ios.goodbit);
     88         assert(v == 123.5);
     89     }
     90     {
     91         const char str[] = "125e-1";
     92         hex(ios);
     93         std::ios_base::iostate err = ios.goodbit;
     94         input_iterator<const char*> iter =
     95             f.get(input_iterator<const char*>(str),
     96                   input_iterator<const char*>(str+sizeof(str)),
     97                   ios, err, v);
     98         assert(iter.base() == str+sizeof(str)-1);
     99         assert(err == ios.goodbit);
    100         assert(v == 125e-1);
    101     }
    102     {
    103         const char str[] = "0x125p-1";
    104         hex(ios);
    105         std::ios_base::iostate err = ios.goodbit;
    106         input_iterator<const char*> iter =
    107             f.get(input_iterator<const char*>(str),
    108                   input_iterator<const char*>(str+sizeof(str)),
    109                   ios, err, v);
    110         assert(iter.base() == str+sizeof(str)-1);
    111         assert(err == ios.goodbit);
    112         assert(v == hexfloat<double>(0x125, 0, -1));
    113     }
    114     {
    115         const char str[] = "inf";
    116         hex(ios);
    117         std::ios_base::iostate err = ios.goodbit;
    118         input_iterator<const char*> iter =
    119             f.get(input_iterator<const char*>(str),
    120                   input_iterator<const char*>(str+sizeof(str)),
    121                   ios, err, v);
    122         assert(iter.base() == str+sizeof(str)-1);
    123         assert(err == ios.goodbit);
    124         assert(v == INFINITY);
    125     }
    126     {
    127         const char str[] = "INF";
    128         hex(ios);
    129         std::ios_base::iostate err = ios.goodbit;
    130         input_iterator<const char*> iter =
    131             f.get(input_iterator<const char*>(str),
    132                   input_iterator<const char*>(str+sizeof(str)),
    133                   ios, err, v);
    134         assert(iter.base() == str+sizeof(str)-1);
    135         assert(err == ios.goodbit);
    136         assert(v == INFINITY);
    137     }
    138     {
    139         const char str[] = "-inf";
    140         hex(ios);
    141         std::ios_base::iostate err = ios.goodbit;
    142         input_iterator<const char*> iter =
    143             f.get(input_iterator<const char*>(str),
    144                   input_iterator<const char*>(str+sizeof(str)),
    145                   ios, err, v);
    146         assert(iter.base() == str+sizeof(str)-1);
    147         assert(err == ios.goodbit);
    148         assert(v == -INFINITY);
    149     }
    150     {
    151         const char str[] = "-INF";
    152         hex(ios);
    153         std::ios_base::iostate err = ios.goodbit;
    154         input_iterator<const char*> iter =
    155             f.get(input_iterator<const char*>(str),
    156                   input_iterator<const char*>(str+sizeof(str)),
    157                   ios, err, v);
    158         assert(iter.base() == str+sizeof(str)-1);
    159         assert(err == ios.goodbit);
    160         assert(v == -INFINITY);
    161     }
    162     {
    163         const char str[] = "nan";
    164         hex(ios);
    165         std::ios_base::iostate err = ios.goodbit;
    166         input_iterator<const char*> iter =
    167             f.get(input_iterator<const char*>(str),
    168                   input_iterator<const char*>(str+sizeof(str)),
    169                   ios, err, v);
    170         assert(iter.base() == str+sizeof(str)-1);
    171         assert(err == ios.goodbit);
    172         assert(std::isnan(v));
    173     }
    174     {
    175         const char str[] = "NAN";
    176         hex(ios);
    177         std::ios_base::iostate err = ios.goodbit;
    178         input_iterator<const char*> iter =
    179             f.get(input_iterator<const char*>(str),
    180                   input_iterator<const char*>(str+sizeof(str)),
    181                   ios, err, v);
    182         assert(iter.base() == str+sizeof(str)-1);
    183         assert(err == ios.goodbit);
    184         assert(std::isnan(v));
    185     }
    186     {
    187         v = -1;
    188         const char str[] = "123_456_78_9;125";
    189         std::ios_base::iostate err = ios.goodbit;
    190         input_iterator<const char*> iter =
    191             f.get(input_iterator<const char*>(str),
    192                   input_iterator<const char*>(str+sizeof(str)),
    193                   ios, err, v);
    194         assert(iter.base() == str+3);
    195         assert(err == ios.goodbit);
    196         assert(v == 123);
    197     }
    198     {
    199         v = -1;
    200         const char str[] = "2-";
    201         std::ios_base::iostate err = ios.goodbit;
    202         input_iterator<const char*> iter =
    203             f.get(input_iterator<const char*>(str),
    204                   input_iterator<const char*>(str+sizeof(str)),
    205                   ios, err, v);
    206         assert(iter.base() == str+1);
    207         assert(err == ios.goodbit);
    208         assert(v == 2);
    209     }
    210     ios.imbue(std::locale(std::locale(), new my_numpunct));
    211     {
    212         v = -1;
    213         const char str[] = "123_456_78_9;125";
    214         std::ios_base::iostate err = ios.goodbit;
    215         input_iterator<const char*> iter =
    216             f.get(input_iterator<const char*>(str),
    217                   input_iterator<const char*>(str+sizeof(str)),
    218                   ios, err, v);
    219         assert(iter.base() == str+sizeof(str)-1);
    220         assert(err == ios.goodbit);
    221         assert(v == 123456789.125);
    222     }
    223     {
    224         v = -1;
    225         const char str[] = "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    226                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    227                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    228                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    229                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    230                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    231                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    232                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    233                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    234                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
    235                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_";
    236         std::ios_base::iostate err = ios.goodbit;
    237         input_iterator<const char*> iter =
    238             f.get(input_iterator<const char*>(str),
    239                   input_iterator<const char*>(str+sizeof(str)),
    240                   ios, err, v);
    241         assert(iter.base() == str+sizeof(str)-1);
    242         assert(err == ios.failbit);
    243     }
    244     {
    245         v = -1;
    246         const char str[] = "3;14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+10";
    247         std::ios_base::iostate err = ios.goodbit;
    248         input_iterator<const char*> iter =
    249             f.get(input_iterator<const char*>(str),
    250                   input_iterator<const char*>(str+sizeof(str)),
    251                   ios, err, v);
    252         assert(iter.base() == str+sizeof(str)-1);
    253         assert(err == ios.goodbit);
    254         assert(std::abs(v - 3.14159265358979e+10)/3.14159265358979e+10 < 1.e-8);
    255     }
    256 }
    257