00001
00002
00003
00004
00005
00006
00007
00008 #ifndef IMP_UTILITY_H
00009 #define IMP_UTILITY_H
00010
00011 #include "macros.h"
00012 #include "kernel_config.h"
00013 #include <boost/version.hpp>
00014 #include <boost/static_assert.hpp>
00015 #include <boost/type_traits.hpp>
00016 #include <boost/utility.hpp>
00017 #include <algorithm>
00018
00019 #if BOOST_VERSION >= 103500
00020 #include <boost/math/special_functions/fpclassify.hpp>
00021 #else
00022 #ifdef __GNUC__
00023 #include <cmath>
00024 #endif // __GNUC__
00025 #endif // BOOST_VERSION
00026
00027 IMP_BEGIN_NAMESPACE
00028
00029
00030 #ifndef IMP_DOXYGEN
00031
00032
00033 template <class T>
00034 T square(T t)
00035 {
00036 return t*t;
00037 }
00038
00039
00040 template <class T>
00041 T cube(T t)
00042 {
00043 return t*t*t;
00044 }
00045
00046
00047
00048
00049
00050
00051 template <class T>
00052 inline bool is_nan(const T& a) {
00053 #if BOOST_VERSION >= 103500
00054 return (boost::math::isnan)(a);
00055 #else
00056
00057 #if defined(_GLIBCXX_USE_C99_MATH) && defined(__GNUC__)
00058 return (std::isnan)(a);
00059 #else
00060 return a != a;
00061 #endif // C99
00062 #endif // BOOST_VERSION
00063 }
00064
00065
00066
00067
00068
00069 template <class Range, class Functor>
00070 void for_each(const Range &r, const Functor &f) {
00071 std::for_each(r.begin(), r.end(), f);
00072 }
00073
00074 template <class T>
00075 int compare(const T &a, const T &b) {
00076 return a.compare(b);
00077 }
00078 #endif
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 class RAII IMP_NO_SWIG(: public boost::noncopyable) {
00094 #ifdef DOXYGEN
00095 RAII(args);
00096 void set(args);
00097 void reset();
00098 ~RAII();
00099 #endif
00100 };
00101
00102 IMP_END_NAMESPACE
00103
00104 #endif