2 Cafu Engine, http://www.cafu.de/
3 Copyright (c) Carsten Fuchs and other contributors.
4 This project is licensed under the terms of the MIT license.
7 #include "Variables.hpp"
8 #include "Network/State.hpp"
15 bool cf::TypeSys::VarBaseT::HasFlag(const char* Flag
) const
17 if (!m_Flags
) return false;
19 for (unsigned int i
= 0; m_Flags
[i
]; i
++)
20 if (strcmp(Flag
, m_Flags
[i
]) == 0)
27 const char* cf::TypeSys::VarBaseT::GetFlag(const char* Flag
, unsigned int Nr
, const char* Default
) const
29 if (!m_Flags
) return Default
;
33 for (i
= 0; m_Flags
[i
]; i
++)
34 if (strcmp(Flag
, m_Flags
[i
]) == 0)
37 for (unsigned int j
= i
; m_Flags
[j
]; j
++)
50 void cf::TypeSys::VarT
<T
>::Serialize(cf::Network::OutStreamT
& Stream
) const
56 // With g++, we cannot write cf::TypeSys::VarT<Vector3fT>::Serialize(...),
57 // see search results for "g++ error specialization in different namespace" for details.
62 template<> // Must specialize, because an OutStreamT cannot take a Vector2fT directly.
63 void VarT
<Vector2fT
>::Serialize(cf::Network::OutStreamT
& Stream
) const
69 template<> // Must specialize, because an OutStreamT cannot take a Vector3fT directly.
70 void VarT
<Vector3fT
>::Serialize(cf::Network::OutStreamT
& Stream
) const
77 template<> // Must specialize, because an OutStreamT cannot take a Vector3dT directly.
78 void VarT
<Vector3dT
>::Serialize(cf::Network::OutStreamT
& Stream
) const
85 template<> // Must specialize, because an OutStreamT cannot take a BoundingBox3dT directly.
86 void VarT
<BoundingBox3dT
>::Serialize(cf::Network::OutStreamT
& Stream
) const
88 Stream
<< Get().Min
.x
;
89 Stream
<< Get().Min
.y
;
90 Stream
<< Get().Min
.z
;
92 Stream
<< Get().Max
.x
;
93 Stream
<< Get().Max
.y
;
94 Stream
<< Get().Max
.z
;
101 void cf::TypeSys::VarT
<T
>::Deserialize(cf::Network::InStreamT
& Stream
)
107 // Derived classes may have overridden Set() to add "side-effects", such as updating graphical resources.
108 // Therefore, we cannot write `m_Value = v;` in place of `Set(v);` here.
113 // With g++, we cannot write cf::TypeSys::VarT<Vector3fT>::Deserialize(...),
114 // see search results for "g++ error specialization in different namespace" for details.
119 template<> // Must specialize, because an InStreamT cannot take a Vector2fT directly.
120 void VarT
<Vector2fT
>::Deserialize(cf::Network::InStreamT
& Stream
)
127 // Derived classes may have overridden Set() to add "side-effects", such as updating graphical resources.
128 // Therefore, we cannot write `m_Value = v;` in place of `Set(v);` here.
132 template<> // Must specialize, because an InStreamT cannot take a Vector3fT directly.
133 void VarT
<Vector3fT
>::Deserialize(cf::Network::InStreamT
& Stream
)
141 // Derived classes may have overridden Set() to add "side-effects", such as updating graphical resources.
142 // Therefore, we cannot write `m_Value = v;` in place of `Set(v);` here.
146 template<> // Must specialize, because an InStreamT cannot take a Vector3dT directly.
147 void VarT
<Vector3dT
>::Deserialize(cf::Network::InStreamT
& Stream
)
155 // Derived classes may have overridden Set() to add "side-effects", such as updating graphical resources.
156 // Therefore, we cannot write `m_Value = v;` in place of `Set(v);` here.
160 template<> // Must specialize, because an InStreamT cannot take a BoundingBox3dT directly.
161 void VarT
<BoundingBox3dT
>::Deserialize(cf::Network::InStreamT
& Stream
)
173 // Derived classes may have overridden Set() to add "side-effects", such as updating graphical resources.
174 // Therefore, we cannot write `m_Value = BB;` in place of `Set(BB);` here.
182 void cf::TypeSys::VarT
<T
>::accept(VisitorT
& Visitor
)
184 Visitor
.visit(*this);
189 void cf::TypeSys::VarT
<T
>::accept(VisitorConstT
& Visitor
) const
191 Visitor
.visit(*this);
195 /********************/
196 /*** VarArrayT<T> ***/
197 /********************/
200 cf::TypeSys::VarArrayT
<T
>::VarArrayT(const char* Name
, unsigned int InitSize
, const T
& InitValue
, const char* Flags
[])
201 : VarBaseT(Name
, Flags
)
203 m_Array
.PushBackEmptyExact(InitSize
);
205 for (unsigned int i
= 0; i
< InitSize
; i
++)
206 m_Array
[i
] = InitValue
;
211 void cf::TypeSys::VarArrayT
<T
>::Serialize(cf::Network::OutStreamT
& Stream
) const
218 void cf::TypeSys::VarArrayT
<T
>::Deserialize(cf::Network::InStreamT
& Stream
)
220 // Contrary to `VarT::Deserialize()`, which calls `VarT::Set()` in order to account for
221 // side-effects resulting from derived classes that have provided an override for `VarT::Set()`,
222 // any such side-effects are not supported and not accounted for here.
228 void cf::TypeSys::VarArrayT
<T
>::accept(VisitorT
& Visitor
)
230 Visitor
.visit(*this);
235 void cf::TypeSys::VarArrayT
<T
>::accept(VisitorConstT
& Visitor
) const
237 Visitor
.visit(*this);
245 void cf::TypeSys::VarManT::Add(VarBaseT
* Var
)
247 m_VarsArray
.PushBack(Var
);
248 m_VarsMap
[Var
->GetName()] = Var
;
252 void cf::TypeSys::VarManT::AddAlias(const char* Alias
, VarBaseT
* Var
)
254 m_VarsMap
[Alias
] = Var
;
258 /*******************************/
259 /*** Template Instantiations ***/
260 /*******************************/
262 template class cf::TypeSys::VarT
<float>;
263 template class cf::TypeSys::VarT
<double>;
264 template class cf::TypeSys::VarT
<int>;
265 template class cf::TypeSys::VarT
<unsigned int>;
266 template class cf::TypeSys::VarT
<uint16_t>;
267 template class cf::TypeSys::VarT
<uint8_t>;
268 template class cf::TypeSys::VarT
<bool>;
269 template class cf::TypeSys::VarT
<std::string
>;
270 template class cf::TypeSys::VarT
<Vector2fT
>;
271 template class cf::TypeSys::VarT
<Vector3fT
>;
272 template class cf::TypeSys::VarT
<Vector3dT
>;
273 template class cf::TypeSys::VarT
<BoundingBox3dT
>;
274 template class cf::TypeSys::VarArrayT
<uint32_t>;
275 template class cf::TypeSys::VarArrayT
<uint16_t>;
276 template class cf::TypeSys::VarArrayT
<uint8_t>;
277 template class cf::TypeSys::VarArrayT
<std::string
>;