51 lines
1.6 KiB
C++
51 lines
1.6 KiB
C++
|
/*-----------------------------------------------------------------------------+
|
||
|
Copyright (c) 2008-2009: Joachim Faulhaber
|
||
|
+------------------------------------------------------------------------------+
|
||
|
Copyright (c) 1999-2006: Cortex Software GmbH, Kantstrasse 57, Berlin
|
||
|
+------------------------------------------------------------------------------+
|
||
|
Distributed under the Boost Software License, Version 1.0.
|
||
|
(See accompanying file LICENCE.txt or copy at
|
||
|
http://www.boost.org/LICENSE_1_0.txt)
|
||
|
+-----------------------------------------------------------------------------*/
|
||
|
#ifndef BOOST_ICL_VALUE_SIZE_HPP_JOFA_081004
|
||
|
#define BOOST_ICL_VALUE_SIZE_HPP_JOFA_081004
|
||
|
|
||
|
namespace boost{ namespace icl
|
||
|
{
|
||
|
|
||
|
template <typename Type>
|
||
|
Type abs(Type val) { return val < 0 ? -val : val; }
|
||
|
|
||
|
/// static class template for the size of a type's value
|
||
|
/** This function is needed to be able to order values according
|
||
|
to their size. This is used to e.g. prefer simple test
|
||
|
instances and to express this simplicity independent of the
|
||
|
type of the test case.
|
||
|
|
||
|
@author Joachim Faulhaber
|
||
|
*/
|
||
|
template <class Type>
|
||
|
struct value_size
|
||
|
{
|
||
|
/** The size of a value is used to be able to order values according to
|
||
|
their simplicity */
|
||
|
static std::size_t apply(const Type& val);
|
||
|
};
|
||
|
|
||
|
|
||
|
template<> inline std::size_t value_size<int>::apply(const int& value)
|
||
|
{ return abs(value); }
|
||
|
|
||
|
template<> inline std::size_t value_size<double>::apply(const double& value)
|
||
|
{ return static_cast<int>(abs(value)); }
|
||
|
|
||
|
template <typename Type>
|
||
|
inline std::size_t value_size<Type>::apply(const Type& value)
|
||
|
{ return icl::iterative_size(value); }
|
||
|
|
||
|
|
||
|
|
||
|
}} // namespace boost icl
|
||
|
|
||
|
#endif
|