stdcxx-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Liviu Nicoara <nikko...@hates.ms>
Subject Re: STDCXX-1056 [was: Re: STDCXX forks]
Date Sat, 15 Sep 2012 13:01:22 GMT
On 9/15/12 1:47 AM, Stefan Teleman wrote:
> On Thu, Sep 13, 2012 at 1:40 AM, Stefan Teleman
> <stefan.teleman@gmail.com> wrote:
>
>> The performance of 22.locale.numpunct.mt is also much better with your
>> _numpunct.h patch:
>>
>> real 668.93
>> user 804.00
>> sys 34.24
>
> Unfortunately, the resulting facet is non-conformant. For this simple test case:
>
> #include <locale>
>
> #include <cstdio>
> #include <cstdlib>
>
> template<class _CharT>
> class my_numpunct : public std::numpunct<_CharT>
> {
> public:
>      typedef _CharT char_type;
>
>      explicit my_numpunct<_CharT>() : std::numpunct<_CharT>() { }
>      ~my_numpunct ()  { }
>
> protected:
>      virtual char_type do_decimal_point () const {
>          std::printf("Hello, my name is my_numpunct::do_decimal_point.\n");
>          return std::numpunct<_CharT>::do_decimal_point ();
>      }
>
>      virtual std::string do_grouping () const {
>          std::printf("Hello, my name is my_numpunct::do_grouping.\n");
>          return std::numpunct<_CharT>::do_grouping ();
>      }
> };
>
> int
> main(int argc, char* argv[])
> {
>
>      if (argc != 2) {
>          std::fprintf(stderr, "Usage: %s <locale-name>\n", argv[0]);
>          return -1;
>      }
>
>      std::locale l(argv[1]);
>      std::locale loc(l, new my_numpunct<char> ());
>
>      my_numpunct<char> const& fac =
>          std::use_facet<my_numpunct<char> > (loc);
>
>      char dp = fac.decimal_point();
>      char ts = fac.thousands_sep();
>      std::string gr = fac.grouping();
>      std::string tn = fac.truename();
>
>      std::fprintf(stderr, "dp = '%c' ts = '%c' gr = \"%s\" tn = \"%s\"\n",
>                      dp, ts, gr.c_str(), tn.c_str());
>
>      return 0;
> }
>
> I expect the following output:

That is funny. What compiler are you using? What does the following test case 
return for you?

template< typename T >
struct S
{
     int f () const {
         return g ();
     }

     virtual int g () const {
         return 1;
     }
};

template< typename T >
struct U : S< T >
{
     int g () const {
         return S< T >::g () - 1;
     }
};

int
main ()
{
     return U< char > ().f ();
}


Thanks.

Liviu

>
> [steleman@darthvader][/src/steleman/programming/stdcxx-ss122/stdcxx-4.2.1/tests/localization][09/15/2012
> 1:44:35][1134]>> ./22.locale.numpunct.stefan-1-gcc en_US.utf-8
> Hello, my name is my_numpunct::do_decimal_point.
> Hello, my name is my_numpunct::do_grouping.
> dp = '.' ts = ',' gr = "" tn = "true"
>
> I get this instead:
>
> [steleman@darthvader][/src/steleman/programming/stdcxx-intel/stdcxx-4.2.1-thread-safe/build/tests][09/14/2012
> 22:31:22][1449]>> ./22.locale.numpunct.stefan-1 en_US.utf-8
> dp = '.' ts = ',' gr = "" tn = "true"
>
> --Stefan
>


Mime
View raw message