Euphoria
tablelayout.h
Go to the documentation of this file.
1 #pragma once
2 
3 
4 #include "base/numeric.h"
5 
6 #include "assert/assert.h"
7 
8 
9 namespace eu::core
10 {
20  template <typename T>
21  std::vector<T>
22  perform_table_layout(const std::vector<T>& pieces, T total_size, T zero = 0)
23  {
24  ASSERTX(total_size >= 0, total_size);
25  ASSERT(zero <= 0);
26 
27  T min_size = 0;
28  T total_percentage = 0;
29  for(T f: pieces)
30  {
31  if(f > 0)
32  {
33  min_size += f;
34  }
35  else
36  {
37  total_percentage += -f;
38  }
39  }
40  const T size_left = total_size - min_size;
41  const T fixed_scale = min_size < total_size ? 1 : total_size / min_size;
42 
43  std::vector<T> ret;
44  ret.reserve(pieces.size());
45  for(T f: pieces)
46  {
47  if(f > 0)
48  {
49  ret.push_back(f * fixed_scale);
50  }
51  else
52  {
53  if(size_left <= 0)
54  {
55  // no more room, add 0
56  ret.push_back(zero);
57  }
58  else
59  {
60  const T p = (-f / total_percentage);
61  const T size = p * size_left;
62  ret.push_back(size);
63  }
64  }
65  }
66  return ret;
67  }
68 
69 }
70 
#define ASSERTX(x,...)
Definition: assert.h:48
#define ASSERT(x)
Definition: assert.h:29
std::vector< T > perform_table_layout(const std::vector< T > &pieces, T total_size, T zero=0)
Calculates a table layout based on the input layout.
Definition: tablelayout.h:22