00001
00002
00003 #ifndef DUNE_COMMON_RANGE_UTILITIES_HH
00004 #define DUNE_COMMON_RANGE_UTILITIES_HH
00005
00006 #include <dune/common/typetraits.hh>
00007 #include <algorithm>
00008 #include <utility>
00009 #include <type_traits>
00010 #include <bitset>
00011
00023 namespace Dune
00024 {
00030 template <typename T,
00031 typename std::enable_if<is_range<T>::value, int>::type = 0>
00032 typename T::value_type
00033 max_value(const T & v) {
00034 using std::max_element;
00035 return *max_element(v.begin(), v.end());
00036 }
00037
00038 template <typename T,
00039 typename std::enable_if<!is_range<T>::value, int>::type = 0>
00040 const T & max_value(const T & v) { return v; }
00041
00047 template <typename T,
00048 typename std::enable_if<is_range<T>::value, int>::type = 0>
00049 typename T::value_type
00050 min_value(const T & v) {
00051 using std::min_element;
00052 return *min_element(v.begin(), v.end());
00053 }
00054
00055 template <typename T,
00056 typename std::enable_if<!is_range<T>::value, int>::type = 0>
00057 const T & min_value(const T & v) { return v; }
00058
00064 template <typename T,
00065 typename std::enable_if<is_range<T>::value, int>::type = 0>
00066 bool any_true(const T & v) {
00067 bool b = false;
00068 for (const auto & e : v)
00069 b = b or bool(e);
00070 return b;
00071 }
00072
00073 template <typename T,
00074 typename std::enable_if<!is_range<T>::value, int>::type = 0>
00075 bool any_true(const T & v) { return v; }
00076
00077 template<std::size_t N>
00078 bool any_true(const std::bitset<N> & b)
00079 {
00080 return b.any();
00081 }
00082
00088 template <typename T,
00089 typename std::enable_if<is_range<T>::value, int>::type = 0>
00090 bool all_true(const T & v) {
00091 bool b = true;
00092 for (const auto & e : v)
00093 b = b and bool(e);
00094 return b;
00095 }
00096
00097 template <typename T,
00098 typename std::enable_if<!is_range<T>::value, int>::type = 0>
00099 bool all_true(const T & v) { return v; }
00100
00101 template<std::size_t N>
00102 bool all_true(const std::bitset<N> & b)
00103 {
00104 return b.all();
00105 }
00106
00107 }
00108
00109 #endif // DUNE_COMMON_RANGE_UTILITIES_HH