On 9/15/12 1:47 AM, Stefan Teleman wrote:
On Thu, Sep 13, 2012 at 1:40 AM, Stefan Teleman
<stefan.tele...@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


Reply via email to