summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/numeric/conversion/test/test_helpers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/numeric/conversion/test/test_helpers.cpp')
-rw-r--r--src/boost/libs/numeric/conversion/test/test_helpers.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/boost/libs/numeric/conversion/test/test_helpers.cpp b/src/boost/libs/numeric/conversion/test/test_helpers.cpp
new file mode 100644
index 00000000..5f2d88d3
--- /dev/null
+++ b/src/boost/libs/numeric/conversion/test/test_helpers.cpp
@@ -0,0 +1,152 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+//
+// 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)
+//
+
+
+//
+// NOTE: This file is intended to be used ONLY by the test files
+// from the Numeric Conversions Library
+//
+//
+#include <cmath>
+
+#include "boost/limits.hpp"
+#include "boost/utility.hpp"
+
+#include "boost/test/included/test_exec_monitor.hpp"
+
+// Convenience macros to help with compilers which don't parse
+// explicit template function instantiations (MSVC6)
+#define MATCH_FNTPL_ARG(t) t const*
+#define SET_FNTPL_ARG(t) (static_cast< t const* >(0))
+
+//
+// *Minimal* example of a User Defined Numeric Type
+//
+//
+namespace MyUDT
+{
+
+template<class T>
+struct UDT
+{
+ typedef T builtin_type ;
+
+ UDT ( T v_ ) : v (v_) {}
+
+ T to_builtin() const { return v ; }
+
+ friend bool operator == ( UDT const& lhs, UDT const& rhs )
+ { return lhs.to_builtin() == rhs.to_builtin() ; }
+
+ // NOTE: This operator is *required* by the Numeric Conversion Library
+ // if Turnc<> is used as the Float2IntRounder policy.
+ friend bool operator < ( UDT const& lhs, UDT const& rhs )
+ { return lhs.to_builtin() < rhs.to_builtin() ; }
+
+ friend std::ostream& operator << ( std::ostream& os, UDT const& n )
+ { return os << n.to_builtin() ; }
+
+ T v ;
+} ;
+
+typedef UDT<int> MyInt ;
+typedef UDT<double> MyFloat ;
+
+//
+// The Float2IntRounder policies *require* a visible 'ceil' or 'floor' math function
+// with standard semantics.
+// In a conformant compiler, ADL can pick these functions even if they are defined
+// within a user namespace, as below.
+//
+inline MyInt ceil ( MyInt const& x ) { return x ; }
+inline MyInt floor ( MyInt const& x ) { return x ; }
+
+inline MyFloat floor ( MyFloat const& x )
+{
+#if !defined(BOOST_NO_STDC_NAMESPACE)
+ return MyFloat ( std::floor(x.to_builtin()) ) ;
+#else
+ return MyFloat ( ::floor(x.to_builtin()) ) ;
+#endif
+}
+
+inline MyFloat ceil ( MyFloat const& x )
+{
+#if !defined(BOOST_NO_STDC_NAMESPACE)
+ return MyFloat ( std::ceil(x.to_builtin()) ) ;
+#else
+ return MyFloat ( ::ceil(x.to_builtin()) ) ;
+#endif
+}
+
+} // namespace MyUDT
+
+
+//
+// The Numeric Conversion Library *requires* User Defined Numeric Types
+// to properly specialize std::numeric_limits<>
+//
+namespace std
+{
+
+template<>
+class numeric_limits<MyUDT::MyInt> : public numeric_limits<int>
+{
+ public :
+
+ BOOST_STATIC_CONSTANT(bool, is_specialized = false);
+} ;
+
+template<>
+class numeric_limits<MyUDT::MyFloat> : public numeric_limits<double>
+{
+ public :
+
+ BOOST_STATIC_CONSTANT(bool, is_specialized = false);
+} ;
+
+} // namespace std
+
+
+
+//
+// The functions floor and ceil defined within namespace MyUDT
+// should be found by koenig loopkup, but some compilers don't do it right
+// so we inyect them into namespace std so ordinary overload resolution
+// can found them.
+#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) || defined(__BORLANDC__) || defined(__GNUC__)
+namespace std {
+using MyUDT::floor ;
+using MyUDT::ceil ;
+} // namespace std
+#endif
+
+
+std::string to_string( bool arg )
+{
+ return arg ? "true" : "false" ;
+}
+
+std::string to_string( ... ) { throw std::runtime_error("to_string() called with wrong type!") ; }
+
+//
+// This is used to print 'char' values as numbers instead of characters.
+//
+template<class T> struct printable_number_type { typedef T type ; } ;
+template<> struct printable_number_type<signed char> { typedef int type ; } ;
+template<> struct printable_number_type<unsigned char> { typedef unsigned type ; } ;
+template<> struct printable_number_type<char> { typedef int type ; } ;
+
+template<class T>
+inline
+typename printable_number_type<T>::type
+printable( T n ) { return n ; }
+
+
+//
+///////////////////////////////////////////////////////////////////////////////////////////////
+