Changeset 11002 for code/branches/cpp11_v2/src
- Timestamp:
- Dec 30, 2015, 9:13:14 PM (9 years ago)
- Location:
- code/branches/cpp11_v2/src/libraries
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/cpp11_v2/src/libraries/network/synchronisable/Synchronisable.h
r10996 r11002 207 207 { 208 208 template <class T, bool = std::is_enum<T>::value> 209 struct RealType;209 struct UnderlyingType; 210 210 template <class T> 211 struct RealType<T, true> { typedef typename std::underlying_type<T>::type type; };211 struct UnderlyingType<T, true> { typedef typename std::underlying_type<T>::type type; }; 212 212 template <class T> 213 struct RealType<T, false> { typedef T type; };213 struct UnderlyingType<T, false> { typedef T type; }; 214 214 } 215 215 … … 217 217 void Synchronisable::registerVariable(T& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional) 218 218 { 219 typedef typename detail:: RealType<T>::type RealType;219 typedef typename detail::UnderlyingType<T>::type UnderlyingType; 220 220 if (bidirectional) 221 221 { 222 syncList_.push_back(new SynchronisableVariableBidirectional< RealType>(reinterpret_cast<RealType&>(variable), mode, cb));222 syncList_.push_back(new SynchronisableVariableBidirectional<UnderlyingType>(reinterpret_cast<UnderlyingType&>(variable), mode, cb)); 223 223 this->dataSize_ += syncList_.back()->getSize(state_); 224 224 } 225 225 else 226 226 { 227 syncList_.push_back(new SynchronisableVariable< RealType>(reinterpret_cast<RealType&>(variable), mode, cb));227 syncList_.push_back(new SynchronisableVariable<UnderlyingType>(reinterpret_cast<UnderlyingType&>(variable), mode, cb)); 228 228 if ( this->state_ == mode ) 229 229 this->dataSize_ += syncList_.back()->getSize(state_); … … 255 255 void Synchronisable::registerVariable( std::set<T>& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional) 256 256 { 257 typedef typename detail:: RealType<T>::type RealType;257 typedef typename detail::UnderlyingType<T>::type UnderlyingType; 258 258 SynchronisableVariableBase* sv; 259 259 if (bidirectional) 260 sv = new SynchronisableVariableBidirectional<std::set< RealType>>(reinterpret_cast<std::set<RealType>&>(variable), mode, cb);260 sv = new SynchronisableVariableBidirectional<std::set<UnderlyingType>>(reinterpret_cast<std::set<UnderlyingType>&>(variable), mode, cb); 261 261 else 262 sv = new SynchronisableVariable<std::set< RealType>>(reinterpret_cast<std::set<RealType>&>(variable), mode, cb);262 sv = new SynchronisableVariable<std::set<UnderlyingType>>(reinterpret_cast<std::set<UnderlyingType>&>(variable), mode, cb); 263 263 syncList_.push_back(sv); 264 264 stringList_.push_back(sv); -
code/branches/cpp11_v2/src/libraries/util/Math.h
r10978 r11002 47 47 #include <cstdlib> 48 48 #include <random> 49 #include <type_traits> 49 50 50 51 #include <OgreMath.h> … … 178 179 @c Vector3 you get <tt>Vector3(0, 0, 0)</tt>. 179 180 */ 180 template <typename T> 181 inline Tzeroise()181 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, T>::type 182 inline /*T*/ zeroise() 182 183 { 183 184 // If you reach this code, you abused zeroise()! 184 185 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 186 } 187 /// Implementation for enum classes: uses the underlying type to create a zero value. 188 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, T>::type 189 inline /*T*/ zeroise() 190 { 191 return static_cast<T>(zeroise<typename std::underlying_type<T>::type>()); 185 192 } 186 193 -
code/branches/cpp11_v2/src/libraries/util/MultiType.h
r11001 r11002 183 183 /// Returns the type of the current value. 184 184 inline const Type::Enum& getType() const { return this->type_; } 185 /// Returns true if the type of the stored value is T. 186 template <typename T> inline bool isType() const { return false; } 185 186 /// Returns true if the type of the stored value is T. Note: the actual implementations for all supported types are defined outside of the class. 187 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 188 inline /*bool*/ isType() const 189 { 190 // If you reach this code, you used MultiType with an unsupported type T 191 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 192 return false; 193 } 194 /// Implementation for enum classes: Returns true if the type of the stored value is the underlying type of T. 195 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 196 inline /*bool*/ isType() const 197 { 198 return this->isType<typename std::underlying_type<T>::type>(); 199 } 187 200 188 201 /// Checks whether the value is a default one. … … 215 228 virtual bool setValue(const MultiType& other) = 0; 216 229 230 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 231 inline /*bool*/ setValue(const T& value) 232 { 233 // If you reach this code, you used MultiType with an unsupported type T 234 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 235 return false; 236 } 237 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 238 inline /*bool*/ setValue(const T& value) 239 { 240 typedef typename std::underlying_type<T>::type UnderlyingType; 241 return this->setValue(reinterpret_cast<const UnderlyingType&>(value)); 242 } 243 217 244 virtual bool getValue(char* value) const = 0; 218 245 virtual bool getValue(unsigned char* value) const = 0; … … 239 266 virtual bool getValue(orxonox::Degree* value) const = 0; 240 267 268 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 269 inline /*bool*/ getValue(T* value) const 270 { 271 // If you reach this code, you used MultiType with an unsupported type T 272 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 273 return false; 274 } 275 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 276 inline /*bool*/ getValue(T* value) const 277 { 278 typedef typename std::underlying_type<T>::type UnderlyingType; 279 return this->getValue(reinterpret_cast<UnderlyingType*>(value)); 280 } 281 241 282 template <typename T> T get() const 242 283 { … … 431 472 } 432 473 /// Creates a new value container (works only with specialized types). 433 template <typename T> inline void createNewValueContainer(const T& value) 474 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value>::type 475 inline /*void*/ createNewValueContainer(const T& value) 434 476 { 435 477 // If you reach this code, you used MultiType with an unsupported type T 436 478 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 479 } 480 /// Creates a new value container (implementation for enum classes that must be cast to the underlying type). 481 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value>::type 482 inline /*void*/ createNewValueContainer(const T& value) 483 { 484 typedef typename std::underlying_type<T>::type UnderlyingType; 485 this->createNewValueContainer<UnderlyingType>(reinterpret_cast<const UnderlyingType&>(value)); 437 486 } 438 487
Note: See TracChangeset
for help on using the changeset viewer.