[cfe-commits] [Patch][Review] constexpr-ification of <limits> and random number generators

Howard Hinnant hhinnant at apple.com
Sun Apr 1 11:23:41 PDT 2012


On Apr 1, 2012, at 3:33 AM, Jonathan Sauer wrote:

> Hello,
> 
> the attached patch constexpr-ifies <limits> as specified in FDIS as well as removes the
> workarounds in libc++'s random number generators due to missing constexpr (the workarounds
> don't work when using a non-standard PRNG). The corresponding tests are modified as well.
> 
> Please review and, if ok, commit.
> 
> 
> With many thanks in advance,
> Jonathan

Thanks Jonathan.  I've been meaning to take care of this.  The current libc++ is a mess with respect to constexpr.

One of the things I want to do is to allow libc++ to emulate correct behavior even when it is compiled in C++03 mode.  And I don't believe this patch will do this.

Another thing that is wrong is that I have an ugly hack in <__config> that needs to be fixed:

#ifdef _LIBCPP_HAS_NO_CONSTEXPR
#define constexpr const
#endif

This is just wrong, but taking it out is going to take a little more work.  I haven't nailed down exactly how we want to support both C++03 and C++11 mode, but I'm imagining something similar to the way we're handling noexcept:

#ifndef _LIBCPP_HAS_NO_CONSTEXPR
#define _CONSTEXPR_1 constexpr
#define _CONSTEXPR_0 constexpr
#else
#define _CONSTEXPR_1 const
#define _CONSTEXPR_0
#endif

(better macro names would be great!)

Like I said, this has been on my to-do list, and I guess now is the time.

> P.S: I noticed that class uniform_int_distribution is defined in <algorithm> instead of
> <random>, even though according to 26.5.2 it should be in <random>. Is there a special
> reason for this move?

Yes, it is to support:

template<class _RandomAccessIterator, class _UniformRandomNumberGenerator>
    void shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last,
                 _UniformRandomNumberGenerator&& __g);

which is declared/defined in <algorithm>.

<random> includes <algorithm> as an implementation detail, so this refactoring should not cause a problem.  Getting the "right" (non-circular) header dependency for the std::lib is just loads of fun. ;-)

Howard




More information about the cfe-commits mailing list