76 template<ElementConcept>
80 using ParentMeshType = MeshType;
88 static const uint ELEMENT_ID = ELEM_ID;
97 template<u
int COMP_ID>
100 using Comp = comp::ComponentTypeFromID<COMP_ID, Components>;
101 return *
static_cast<Comp*
>(
this);
104 template<u
int COMP_ID>
105 const auto& component()
const
107 using Comp = comp::ComponentTypeFromID<COMP_ID, Components>;
108 return *
static_cast<const Comp*
>(
this);
111 template<
typename ElType>
112 void importFrom(
const ElType& v,
bool importRefs =
true)
117 (importComponent<Comps>(v, importRefs), ...);
120 void swap(Element& other)
122 using PM = comp::ParentMeshPointer<MeshType>;
124 assert(PM::parentMesh() == other.parentMesh());
126 (swap((Comps&) *
this, (Comps&) other), ...);
127 if (PM::parentMesh()) {
128 PM::parentMesh()->swapVerticalComponents(*
this, other);
132 friend void swap(Element& a, Element& b) { a.swap(b); }
134 void serialize(std::ostream& out)
const
139 (serializeComponent<Comps>(out), ...);
142 void deserialize(std::istream& in)
147 (deserializeComponent<Comps>(in), ...);
154 bool isAvailable()
const {
return true; }
157 void initVerticalComponents() { (construct<Comps>(), ...); }
159 template<
typename Comp>
163 comp::IsVerticalComponent<Comp> &&
164 comp::HasInitMemberFunction<Comp>) {
165 if constexpr (comp::HasIsAvailableMemberFunction<Comp>) {
166 if (Comp::isAvailable()) {
178 template<
typename Comp,
typename ElType>
179 void importComponent(
const ElType& v,
bool importRefs)
181 if constexpr (!comp::IsOptionalComponent<Comp>) {
182 Comp::importFrom(v, importRefs);
185 if (Comp::isAvailable()) {
186 Comp::importFrom(v, importRefs);
191 template<
typename Comp>
192 void serializeComponent(std::ostream& out)
const
194 if constexpr (!comp::IsOptionalComponent<Comp>) {
195 Comp::serialize(out);
198 if (Comp::isAvailable()) {
199 Comp::serialize(out);
204 template<
typename Comp>
205 void deserializeComponent(std::istream& in)
207 if constexpr (!comp::IsOptionalComponent<Comp>) {
208 Comp::deserialize(in);
211 if (Comp::isAvailable()) {
212 Comp::deserialize(in);