Document number: N1439=03-0021
 
Howard E. Hinnant
hinnant@twcny.rr.com
February 28, 2003

Proposed Resolution To LWG issues 225, 226, 229

Introduction

The LWG met in Santa Cruz and reviewed n1387. The consensus to come out of that meeting is that we want to create " swappable requirements" and then endow specific algorithms with this new requirement. This paper is an attempt to address that desire.

Swappable Requirements

Add new section: 20.1.6

20.1.6 - Swappable requirements [lib.swappable.requirements]

-1- In the following Table ??, T is a non-const type to be supplied by a C++ program instantiating a template, t and u are values of type T.

Swappable requirements

expression

return type

post-condition

swap(t, u)

void

t has the value originally held by u, and u has the value originally held by t

-2- The swappable requirement is met by satisfying either (or both) of the following conditions:

a. T is swappable if T is copyconstructible and assignable.

b. T is swappable if a namespace scope function named swap exists in the same namespace as the definition of T, accepts two arguments of type T, and provides the post-condition from Table ??.

Algorithms

25.2.2: swap_ranges

-4- Requires: The two ranges [first1 ,last1 )and [first2 ,first2 + ( last1 -first1 )) shall not overlap. ForwardIterator1::value_type and ForwardIterator2::value_type must be the same type, and that type must be swappable.

25.2.2: iter_swap

-7- Effects: Calls swap with the values pointed to by the two iterators a and b.

-8- Requires: ForwardIterator1::value_type and ForwardIterator2::value_type must be the same type, and that type must be swappable.

25.2.9: reverse

-0- Requires: BidirectionalIterator::value_type must be swappable.

25.2.10: rotate

-3- Requires: [first ,middle )and [middle ,last )are valid ranges. ForwardIterator::value_type must be swappable.

25.2.11: random_shuffle

-4- Requires: RandomAccessIterator::value_type must be swappable.

25.2.12: partition

-4- Requires: BidirectionalIterator::value_type must be swappable.

25.2.12: stable_partition

-7- Requires: BidirectionalIterator::value_type must be swappable.

25.3.1.1: sort

-3- Requires: RandomAccessIterator::value_type must be swappable.

25.3.1.2: stable_sort

-4- Requires: RandomAccessIterator::value_type must be swappable.

25.3.1.3: partial_sort

-3- Requires: RandomAccessIterator::value_type must be swappable.

25.3.1.4: partial_sort_copy

-4- Requires: RandomAccessIterator::value_type must be swappable.

25.3.2: nth_element

-3- Requires: RandomAccessIterator::value_type must be swappable.

25.3.4: inplace_merge

-9- Requires: BidirectionalIterator::value_type must be swappable.

25.3.6.2: pop_heap

-1- Requires: The range [first ,last )shall be a valid heap. RandomAccessIterator::value_type must be swappable.

25.3.6.4: sort_heap

-4- Requires: RandomAccessIterator::value_type must be swappable.

25.3.9: next_permutation

-?- Requires: BidirectionalIterator::value_type must be swappable.

25.3.9: prev_permutation

-6- Requires: BidirectionalIterator::value_type must be swappable.

26.3.3.3/1: valarray transcendentals

-1- Each of these functions may only be instantiated for a type T to which a unique function with the indicated name can be applied (unqualified). This function shall return a value which is of type T or which can be unambiguously converted to type T .