Skip to content

saturate_cast #200

@gpeterhoff

Description

@gpeterhoff

With C++26, there is std::saturate_cast https://en.cppreference.com/w/cpp/numeric/saturate_cast.html
Can you provide this as well?
I'm not sure if boost::core is the right library.
My implementation requires boost::is_integer (boostorg/type_traits#186), but they didn't understand what I meant and therefore rejected/closed it.

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

#ifndef BOOST_CORE_SATURATE_CAST_HPP
#define BOOST_CORE_SATURATE_CAST_HPP

#include <boost/type_traits/is_integer.hpp>
#include <limits>



namespace boost
{
namespace core
{
template <typename To, typename From>
inline BOOST_CXX14_CONSTEXPR typename std::enable_if<boost::is_integer<To>::value && boost::is_integer<From>::value, To>::type	saturate_cast(const From& from)	noexcept
{
	using limits = std::numeric_limits<To>;

	BOOST_IF_CONSTEXPR (std::is_same<To, From>::value)
	{
		return from;
	}
	else BOOST_IF_CONSTEXPR (std::is_signed<To>::value && std::is_unsigned<From>::value)
	{
		using type = typename std::make_unsigned<To>::type;
		return
			(from > type(limits::max())) ? limits::max() :
			To(from);
	}
	else BOOST_IF_CONSTEXPR (std::is_unsigned<To>::value && std::is_signed<From>::value)
	{
		using type = typename std::make_unsigned<From>::type;
		return
			(from < 0) ? To{} :
			(type(from) > limits::max()) ? limits::max() :
			To(from);
	}
	else BOOST_IF_CONSTEXPR (std::is_signed<To>::value && std::is_signed<From>::value)
	{
		return
			(from < limits::min()) ? limits::min() :
			(from > limits::max()) ? limits::max() :
			To(from);
	}
	else
	{
		return
			(from > limits::max()) ? limits::max() :
			To(from);
	}
}

}	//	core
}	//	boost

#endif	//	BOOST_CORE_SATURATE_CAST_HPP

thx
Gero

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