Euphoria
minmax.h
Go to the documentation of this file.
1 #pragma once
2 
3 
4 #include <tuple>
5 
6 #include "assert/assert.h"
7 #include "base/range.h"
8 
9 namespace eu
10 {
11  template
12  <
13  std::size_t count,
14  typename T,
15  typename TContainer,
16  typename TExtract
17  >
18  std::pair<std::array<T, count>, std::array<T, count>>
20  (
21  const TContainer& ts,
22  TExtract extract
23  )
24  {
25  using A = std::array<T, count>;
26 
27  ASSERT(!ts.empty());
28  auto it = ts.begin();
29 
30  A min_value = extract(*it);
31  A max_value = extract(*it);
32 
33  it += 1;
34 
35  for(; it!=ts.end(); it+=1)
36  {
37  const A a = extract(*it);
38  for(size_t sub = 0; sub< count; sub += 1)
39  {
40  min_value[sub] = std::min(min_value[sub], a[sub]);
41  max_value[sub] = std::max(max_value[sub], a[sub]);
42  }
43  }
44 
45  return {min_value, max_value};
46  }
47 
48  template
49  <
50  typename T,
51  typename TContainer,
52  typename TExtract
53  >
54  Range<T>
56  (
57  const TContainer& ts,
58  TExtract extract
59  )
60  {
61  ASSERT(!ts.empty());
62  auto it = ts.begin();
63  T min_value = extract(*it);
64  T max_value = extract(*it);
65 
66  it += 1;
67 
68  for(; it!=ts.end(); it+=1)
69  {
70  min_value = std::min(min_value, extract(*it));
71  max_value = std::max(max_value, extract(*it));
72  }
73 
74  return {min_value, max_value};
75  }
76 
77 
78  template
79  <
80  typename T,
81  typename TContainer,
82  typename TMinFunc,
83  typename TMaxFunc
84  >
85  std::tuple<T, T>
87  (
88  const TContainer& ts,
89  TMinFunc min_func,
90  TMaxFunc max_func
91  )
92  {
93  ASSERT(!ts.empty());
94  auto it = ts.begin();
95  T min_value = *it;
96  T max_value = *it;
97 
98  it += 1;
99 
100  for(; it!=ts.end(); it+=1)
101  {
102  min_value = min_func(min_value, *it);
103  max_value = max_func(max_value, *it);
104  }
105 
106  return {min_value, max_value};
107  }
108 }
109 
#define ASSERT(x)
Definition: assert.h:29
Definition: assert.h:90
std::tuple< T, T > find_min_max(const TContainer &ts, TMinFunc min_func, TMaxFunc max_func)
Definition: minmax.h:87
Range< T > find_min_max_range(const TContainer &ts, TExtract extract)
Definition: minmax.h:56
std::pair< std::array< T, count >, std::array< T, count > > find_min_max_ranges(const TContainer &ts, TExtract extract)
Definition: minmax.h:20
size2f min(const size2f lhs, const size2f rhs)
Definition: size2.cc:140
size2f max(const size2f lhs, const size2f rhs)
Definition: size2.cc:149