Skip to content

add is_quotrem_order #191

@gpeterhoff

Description

@gpeterhoff

Problem:
std::Xdiv_t can be implemented as {quot, rem} or {rem, quot} (what a mess). This means that structured binding are not unique:
auto [a, b] = std::div(x, y);
is a quot or rem or is b quot or rem ?
is_quotrem_order.hpp

//	Distributed under the Boost Software License Version 1.0 https://www.boost.org/LICENSE_1_0.txt
//	Copyright Gero Peterhoff

#ifndef BOOST_TYPE_TRAITS_IS_QUOTREM_ORDER_HPP
#define BOOST_TYPE_TRAITS_IS_QUOTREM_ORDER_HPP

#include <boost/type_traits/is_bool.hpp>
#include <type_traits>
#include <cmath>



namespace boost
{
namespace detail
{
template <typename Type>
inline constexpr bool	is_quotrem_order()	noexcept
{
	static_assert(std::is_arithmetic<Type>::value, "invalid type");

	//	std::div need signed integer
	using value_type = typename std::conditional_t
		<
			std::is_floating_point<Type>::value || boost::is_bool<Type>::value,
			int,
			typename std::make_signed<Type>::type
		>;
	using div_type = decltype(std::div(value_type{}, value_type{}));

	constexpr div_type
		div{value_type{0}, value_type{1}};

	return div.quot == value_type{0};
}
}	//	detail



template <typename Type> struct is_quotrem_order : public std::integral_constant
<
	bool,
	detail::is_quotrem_order<Type>()
>	{};


#if !defined(BOOST_NO_CXX17_INLINE_VARIABLES)
template <typename Type> inline constexpr bool is_quotrem_order_v = is_quotrem_order<Type>::value;
#endif
}	//	boost

#endif	//	BOOST_TYPE_TRAITS_IS_QUOTREM_ORDER_HPP

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions