Virtual Testbed
Ship dynamics simulator for extreme conditions
mass.hh
1 #ifndef VTESTBED_CORE_MASS_HH
2 #define VTESTBED_CORE_MASS_HH
3 
4 #include <vector>
5 
6 #include <vtestbed/base/blitz.hh>
7 #include <vtestbed/core/types.hh>
8 
9 namespace vtb {
10 
11  namespace core {
12 
14  template <class T>
15  struct Mass {
16 
17  public:
18  using vec3 = blitz::TinyVector<T,3>;
19 
20  public:
21  T m{};
22  vec3 x{T{}};
23 
24  Mass() = default;
25  inline Mass(T mass, const vec3& point): m(mass), x(point) {}
26 
27  inline T mass() const { return m; }
28  inline const vec3& point() const { return x; }
29 
30  };
31 
32  template <class T>
33  class Mass_array: public std::vector<Mass<T>> {
34 
35  private:
37 
38  public:
39  using base_type::base_type;
40 
41  inline T
42  sum() const {
43  T s{};
44  for (const auto& m : *this) { s += m.mass(); }
45  return s;
46  }
47 
48  };
49 
50  template <class T, class ... Args>
52  flatten(const Args& ... args) {
53  std::reference_wrapper<const Mass_array<T>> arrays[sizeof...(args)] = {args...};
54  size_t n = 0;
55  for (const auto& a : arrays) { n += a.get().size(); }
56  Mass_array<T> result;
57  result.reserve(n);
58  for (const auto& a : arrays) {
59  for (const auto& m : a.get()) { result.emplace_back(m); }
60  }
61  return result;
62  }
63 
64  }
65 
66 }
67 
68 #endif // vim:filetype=cpp
Mass attached to specified point in space.
Definition: mass.hh:15
Main namespace.
Definition: convert.hh:9