2688. clamp misses preconditions and has extraneous condition on result

Section: 28.7.9 [alg.clamp] Status: C++17 Submitter: Martin Moene Opened: 2016-03-23 Last modified: 2017-07-30

Priority: 0

View all issues with C++17 status.

Discussion:

In Jacksonville (2016), P0025R0 was voted in instead of the intended P0025R1. This report contains the necessary mending along with two other improvements.

This report:

Thanks to Carlo Assink and David Gaarenstroom for making us aware of the extraneous condition in the returns: specification and for suggesting the fix and to Jeffrey Yasskin for suggesting to add a note like p3.

Previous resolution [SUPERSEDED]:

  1. Edit 28.7.9 [alg.clamp] as indicated:

    template<class T>
      constexpr const T& clamp(const T& v, const T& lo, const T& hi);
    template<class T, class Compare>
      constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp);
    

    -1- Requires: The value of lo shall be no greater than hi. For the first form, type T shall be LessThanComparable (Table 18).

    -2- Returns: lo if v is less than lo, hi if hi is less than v, otherwise vThe larger value of v and lo if v is smaller than hi, otherwise the smaller value of v and hi.

    -3- NoteRemarks: If NaN is avoided, T can be float or doubleReturns the first argument when it is equivalent to one of the boundary arguments.

    -4- Complexity: At most two comparisons.

[2016-05 Issues Telecon]

Reworded p3 slightly.

Proposed resolution:

This wording is relative to N4582.

  1. Edit 28.7.9 [alg.clamp] as indicated:

    template<class T>
      constexpr const T& clamp(const T& v, const T& lo, const T& hi);
    template<class T, class Compare>
      constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp);
    

    -1- Requires: The value of lo shall be no greater than hi. For the first form, type T shall be LessThanComparable (Table 18).

    -2- Returns: lo if v is less than lo, hi if hi is less than v, otherwise vThe larger value of v and lo if v is smaller than hi, otherwise the smaller value of v and hi.

    -3- NoteRemarks: If NaN is avoided, T can be a floating point type Returns the first argument when it is equivalent to one of the boundary arguments.

    -4- Complexity: At most two comparisons.