$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r63791 - sandbox/SOC/2010/bits_and_ints/boost/integer
From: muriloufg_at_[hidden]
Date: 2010-07-09 15:57:01
Author: murilov
Date: 2010-07-09 15:56:57 EDT (Fri, 09 Jul 2010)
New Revision: 63791
URL: http://svn.boost.org/trac/boost/changeset/63791
Log:
Implemented the run-time and compile-times version of isign function (transfer of sign function)
Added tests for isign functions:
Added:
   sandbox/SOC/2010/bits_and_ints/boost/integer/isign.hpp   (contents, props changed)
   sandbox/SOC/2010/bits_and_ints/boost/integer/static_isign.hpp   (contents, props changed)
Added: sandbox/SOC/2010/bits_and_ints/boost/integer/isign.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/bits_and_ints/boost/integer/isign.hpp	2010-07-09 15:56:57 EDT (Fri, 09 Jul 2010)
@@ -0,0 +1,32 @@
+//  Boost integer/isign.hpp header file  ------------------------------//
+
+//  (C) Copyright Murilo Adriano Vasconcelos 2010.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+
+//  See http://www.boost.org for updates, documentation, and revision history. 
+
+#ifndef BOOST_ISIGN_INCLUDED
+#define BOOST_ISIGN_INCLUDED
+
+namespace boost {
+	
+/*
+ *	`isign' or transfer of sign function is defined by:
+ *	
+ *	isign(x, y) =
+ *		abs(x), if y is greater than or equal 0,
+ *		-abs(x), if y is less than 0.
+ */
+	
+template <typename T>
+T isign(T x, T y)
+{
+	const T tmp = (x ^ y) >> (sizeof(T) * 8 - 1);
+	return (x ^ tmp) - tmp;
+}
+	
+} // boost
+
+#endif
Added: sandbox/SOC/2010/bits_and_ints/boost/integer/static_isign.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/bits_and_ints/boost/integer/static_isign.hpp	2010-07-09 15:56:57 EDT (Fri, 09 Jul 2010)
@@ -0,0 +1,60 @@
+//  Boost integer/static_isign.hpp header file  ------------------------------//
+
+//  (C) Copyright Murilo Adriano Vasconcelos 2010.
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+
+//  See http://www.boost.org for updates, documentation, and revision history. 
+
+#ifndef BOOST_STATIC_ISIGN_INCLUDED
+#define BOOST_STATIC_ISIGN_INCLUDED
+
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/integral_c.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/integer/is_integral_constant.hpp>
+
+namespace boost {
+	
+/*
+ *	MPL and static version of isign (transfer of sign function)
+ */
+	
+
+namespace mpl {
+
+/*
+ *	This metafunction requires IC1 and IC2 to be mpl::integral_c<> types
+ */
+template <typename IC1, typename IC2, 
+	class Enable = typename enable_if< 
+		and_<
+			is_integral_constant<IC1>,
+			is_integral_constant<IC2>
+		>
+	>::type
+>
+struct isign : integral_c<typename IC1::value_type, 
+	((IC1::value ^ ((IC1::value ^ IC2::value) >> sizeof(typename IC1::value_type) * 8 - 1))
+		- ((IC1::value ^ IC2::value) >> sizeof(typename IC1::value_type) * 8 - 1))
+>
+{};
+
+} // mpl
+
+/*
+ *	This metafunction requires T to be an integral type
+ */
+template <typename T, T Value1, T Value2, 
+	class Enable = typename enable_if< is_integral<T> >::type>
+struct static_isign : mpl::isign< 
+	mpl::integral_c<T, Value1>, 
+	mpl::integral_c<T, Value2>
+>
+{};
+	
+} // boost
+
+#endif