[cmp.partialord] (original) (raw)

17 Language support library [support]

17.11 Comparisons [cmp]

17.11.2 Comparison category types [cmp.categories]

17.11.2.2 Class partial_­ordering [cmp.partialord]

The partial_­ordering type is typically used as the result type of a three-way comparison operatorthat (a) admits all of the six two-way comparison operators ([expr.rel], [expr.eq]), (b) does not imply substitutability, and (c) permits two values to be incomparable.215

namespace std { class partial_ordering { int value;
bool is_ordered;

constexpr explicit
  partial_ordering(eq v) noexcept : value(int(v)), is_ordered(true) {}      
constexpr explicit
  partial_ordering(ord v) noexcept : value(int(v)), is_ordered(true) {}     
constexpr explicit
  partial_ordering(ncmp v) noexcept : value(int(v)), is_ordered(false) {}   

public:

static const partial_ordering less;
static const partial_ordering equivalent;
static const partial_ordering greater;
static const partial_ordering unordered;


friend constexpr bool operator==(partial_ordering v, unspecified) noexcept;
friend constexpr bool operator==(partial_ordering v, partial_ordering w) noexcept = default;
friend constexpr bool operator< (partial_ordering v, unspecified) noexcept;
friend constexpr bool operator> (partial_ordering v, unspecified) noexcept;
friend constexpr bool operator<=(partial_ordering v, unspecified) noexcept;
friend constexpr bool operator>=(partial_ordering v, unspecified) noexcept;
friend constexpr bool operator< (unspecified, partial_ordering v) noexcept;
friend constexpr bool operator> (unspecified, partial_ordering v) noexcept;
friend constexpr bool operator<=(unspecified, partial_ordering v) noexcept;
friend constexpr bool operator>=(unspecified, partial_ordering v) noexcept;
friend constexpr partial_ordering operator<=>(partial_ordering v, unspecified) noexcept;
friend constexpr partial_ordering operator<=>(unspecified, partial_ordering v) noexcept;

};

inline constexpr partial_ordering partial_ordering::less(ord::less); inline constexpr partial_ordering partial_ordering::equivalent(eq::equivalent); inline constexpr partial_ordering partial_ordering::greater(ord::greater); inline constexpr partial_ordering partial_ordering::unordered(ncmp::unordered); }

constexpr bool operator==(partial_ordering v, unspecified) noexcept;constexpr bool operator< (partial_ordering v, unspecified) noexcept;constexpr bool operator> (partial_ordering v, unspecified) noexcept;constexpr bool operator<=(partial_ordering v, unspecified) noexcept;constexpr bool operator>=(partial_ordering v, unspecified) noexcept;

Returns:For operator@, v.is_­ordered && v.value @ 0.

constexpr bool operator< (unspecified, partial_ordering v) noexcept;constexpr bool operator> (unspecified, partial_ordering v) noexcept;constexpr bool operator<=(unspecified, partial_ordering v) noexcept;constexpr bool operator>=(unspecified, partial_ordering v) noexcept;

Returns:For operator@, v.is_­ordered && 0 @ v.value.

constexpr partial_ordering operator<=>(partial_ordering v, unspecified) noexcept;

constexpr partial_ordering operator<=>(unspecified, partial_ordering v) noexcept;

Returns: v < 0 ? partial_­ordering​::​greater : v > 0 ? partial_­ordering​::​less : v.