Changeset 11068 for code/branches/cpp11_v3/src/libraries/util
- Timestamp:
- Jan 17, 2016, 6:41:22 PM (10 years ago)
- Location:
- code/branches/cpp11_v3
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/cpp11_v3
- Property svn:mergeinfo changed
/code/branches/cpp11_v2 merged: 10996-11008,11010
- Property svn:mergeinfo changed
-
code/branches/cpp11_v3/src/libraries/util/Math.h
r11054 r11068 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_v3/src/libraries/util/MultiType.cc
r9550 r11068 43 43 @param type The type 44 44 */ 45 bool MultiType::convert(Type ::Enumtype)45 bool MultiType::convert(Type type) 46 46 { 47 47 switch (type) … … 106 106 std::string MultiType::getTypename() const 107 107 { 108 Type ::Enumtype = (this->value_) ? this->value_->type_ : Type::Null;108 Type type = (this->value_) ? this->value_->type_ : Type::Null; 109 109 110 110 switch (type) -
code/branches/cpp11_v3/src/libraries/util/MultiType.h
r11054 r11068 132 132 template <typename T> friend class MT_Value; 133 133 134 struct Type 134 /** 135 @brief Enum of all possible types of a MultiType. 136 */ 137 enum class Type : uint8_t 135 138 { 136 /** 137 @brief Enum of all possible types of a MultiType. 138 */ 139 enum Enum 140 { 141 Null, 142 Char, 143 UnsignedChar, 144 Short, 145 UnsignedShort, 146 Int, 147 UnsignedInt, 148 Long, 149 UnsignedLong, 150 LongLong, 151 UnsignedLongLong, 152 Float, 153 Double, 154 LongDouble, 155 Bool, 156 VoidPointer, 157 String, 158 Vector2, 159 Vector3, 160 Vector4, 161 ColourValue, 162 Quaternion, 163 Radian, 164 Degree 165 }; 139 Null, 140 Char, 141 UnsignedChar, 142 Short, 143 UnsignedShort, 144 Int, 145 UnsignedInt, 146 Long, 147 UnsignedLong, 148 LongLong, 149 UnsignedLongLong, 150 Float, 151 Double, 152 LongDouble, 153 Bool, 154 VoidPointer, 155 String, 156 Vector2, 157 Vector3, 158 Vector4, 159 ColourValue, 160 Quaternion, 161 Radian, 162 Degree 166 163 }; 167 164 … … 174 171 { 175 172 public: 176 inline MT_ValueBase(void* data, Type ::Enumtype) : type_(type), bLastConversionSuccessful(true), data_(data) {}173 inline MT_ValueBase(void* data, Type type) : type_(type), bLastConversionSuccessful(true), data_(data) {} 177 174 virtual inline ~MT_ValueBase() {} 178 175 … … 182 179 183 180 /// Returns the type of the current value. 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; } 181 inline const Type& getType() const { return this->type_; } 182 183 /// 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. 184 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 185 inline /*bool*/ isType() const 186 { 187 // If you reach this code, you used MultiType with an unsupported type T 188 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 189 return false; 190 } 191 /// Implementation for enum classes: Returns true if the type of the stored value is the underlying type of T. 192 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 193 inline /*bool*/ isType() const 194 { 195 return this->isType<typename std::underlying_type<T>::type>(); 196 } 187 197 188 198 /// Checks whether the value is a default one. … … 215 225 virtual bool setValue(const MultiType& other) = 0; 216 226 227 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 228 inline /*bool*/ setValue(const T& value) 229 { 230 // If you reach this code, you used MultiType with an unsupported type T 231 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 232 return false; 233 } 234 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 235 inline /*bool*/ setValue(const T& value) 236 { 237 typedef typename std::underlying_type<T>::type UnderlyingType; 238 return this->setValue(reinterpret_cast<const UnderlyingType&>(value)); 239 } 240 217 241 virtual bool getValue(char* value) const = 0; 218 242 virtual bool getValue(unsigned char* value) const = 0; … … 239 263 virtual bool getValue(orxonox::Degree* value) const = 0; 240 264 265 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 266 inline /*bool*/ getValue(T* value) const 267 { 268 // If you reach this code, you used MultiType with an unsupported type T 269 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 270 return false; 271 } 272 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 273 inline /*bool*/ getValue(T* value) const 274 { 275 typedef typename std::underlying_type<T>::type UnderlyingType; 276 return this->getValue(reinterpret_cast<UnderlyingType*>(value)); 277 } 278 241 279 template <typename T> T get() const 242 280 { … … 257 295 virtual uint8_t getSize() const = 0; 258 296 259 Type ::Enum type_;///< The type of the current value297 Type type_; ///< The type of the current value 260 298 bool bLastConversionSuccessful; ///< True if the last conversion was successful 261 299 void* data_; ///< For direct access to the value if the type is known … … 354 392 template <typename T> inline bool getValue(T* value) const { if (this->value_) { return this->value_->getValue(value); } return false; } 355 393 356 /// Returns the current value, converted to the requested type. This base implementation works only for pointers. All other supported types are 357 /// implemented in specialized functions at the bottom of this file. 358 template <typename T> inline T get() const { return static_cast<T>(this->get<void*>()); } 394 /// Returns the current value, converted to the requested type. 395 template <typename T> /* for normal types */ typename std::enable_if<!std::is_pointer<T>::value, T>::type 396 inline /*T*/ get() const { return (this->value_ ? this->value_->get<T>() : NilValue<T>()); } 397 /// Returns the current value, converted to a pointer of the requested type. 398 template <typename T> /* for pointers */ typename std::enable_if<std::is_pointer<T>::value, T>::type 399 inline /*T*/ get() const { return this->value_ ? static_cast<T>(this->value_->get<void*>()) : nullptr; } 359 400 360 401 … … 365 406 inline void exportData(uint8_t*& mem) const 366 407 { 367 assert(sizeof(Type ::Enum) <= 8);368 *static_cast<uint8_t*>(mem) = this->getType();408 assert(sizeof(Type) <= 8); 409 *static_cast<uint8_t*>(mem) = static_cast<uint8_t>(this->getType()); 369 410 mem += sizeof(uint8_t); 370 411 this->value_->exportData(mem); … … 373 414 inline void importData(uint8_t*& mem) 374 415 { 375 assert(sizeof(Type ::Enum) <= 8);376 this->setType(static_cast<Type ::Enum>(*static_cast<uint8_t*>(mem)));416 assert(sizeof(Type) <= 8); 417 this->setType(static_cast<Type>(*static_cast<uint8_t*>(mem))); 377 418 mem += sizeof(uint8_t); 378 419 this->value_->importData(mem); … … 414 455 415 456 /// Resets the value and changes the internal type to the given type. 416 inline void setType(Type ::Enumtype) { this->reset(); this->convert(type); this->resetValue(); }457 inline void setType(Type type) { this->reset(); this->convert(type); this->resetValue(); } 417 458 /// Returns the current type. 418 inline Type ::EnumgetType() const { return (this->value_) ? this->value_->type_ : Type::Null; }459 inline Type getType() const { return (this->value_) ? this->value_->type_ : Type::Null; } 419 460 /// Converts the current value to the given type. 420 bool convert(Type ::Enumtype);461 bool convert(Type type); 421 462 422 463 /// Changes the value container. … … 428 469 } 429 470 /// Creates a new value container (works only with specialized types). 430 template <typename T> inline void createNewValueContainer(const T& value) 471 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value>::type 472 inline /*void*/ createNewValueContainer(const T& value) 431 473 { 432 474 // If you reach this code, you used MultiType with an unsupported type T 433 475 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 476 } 477 /// Creates a new value container (implementation for enum classes that must be cast to the underlying type). 478 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value>::type 479 inline /*void*/ createNewValueContainer(const T& value) 480 { 481 typedef typename std::underlying_type<T>::type UnderlyingType; 482 this->createNewValueContainer<UnderlyingType>(reinterpret_cast<const UnderlyingType&>(value)); 434 483 } 435 484 … … 475 524 template <> inline bool MultiType::isType<void>() const { return this->null(); } 476 525 template <> inline bool MultiType::convert<void>() { this->reset(); return true; } 477 478 template <> inline char MultiType::get() const { return (this->value_ ? this->value_->get<char>() : 0); }479 template <> inline unsigned char MultiType::get() const { return (this->value_ ? this->value_->get<unsigned char>() : 0); }480 template <> inline short MultiType::get() const { return (this->value_ ? this->value_->get<short>() : 0); }481 template <> inline unsigned short MultiType::get() const { return (this->value_ ? this->value_->get<unsigned short>() : 0); }482 template <> inline int MultiType::get() const { return (this->value_ ? this->value_->get<int>() : 0); }483 template <> inline unsigned int MultiType::get() const { return (this->value_ ? this->value_->get<unsigned int>() : 0); }484 template <> inline long MultiType::get() const { return (this->value_ ? this->value_->get<long>() : 0); }485 template <> inline unsigned long MultiType::get() const { return (this->value_ ? this->value_->get<unsigned long>() : 0); }486 template <> inline long long MultiType::get() const { return (this->value_ ? this->value_->get<long long>() : 0); }487 template <> inline unsigned long long MultiType::get() const { return (this->value_ ? this->value_->get<unsigned long long>() : 0); }488 template <> inline float MultiType::get() const { return (this->value_ ? this->value_->get<float>() : 0); }489 template <> inline double MultiType::get() const { return (this->value_ ? this->value_->get<double>() : 0); }490 template <> inline long double MultiType::get() const { return (this->value_ ? this->value_->get<long double>() : 0); }491 template <> inline bool MultiType::get() const { return (this->value_ ? this->value_->get<bool>() : 0); }492 template <> inline void* MultiType::get() const { return (this->value_ ? this->value_->get<void*>() : nullptr); }493 template <> inline std::string MultiType::get() const { return (this->value_ ? this->value_->get<std::string>() : NilValue<std::string>()); }494 template <> inline orxonox::Vector2 MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Vector2>() : NilValue<orxonox::Vector2>()); }495 template <> inline orxonox::Vector3 MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Vector3>() : NilValue<orxonox::Vector3>()); }496 template <> inline orxonox::Vector4 MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Vector4>() : NilValue<orxonox::Vector4>()); }497 template <> inline orxonox::ColourValue MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::ColourValue>() : NilValue<orxonox::ColourValue>()); }498 template <> inline orxonox::Quaternion MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Quaternion>() : NilValue<orxonox::Quaternion>()); }499 template <> inline orxonox::Radian MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Radian>() : NilValue<orxonox::Radian>()); }500 template <> inline orxonox::Degree MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Degree>() : NilValue<orxonox::Degree>()); }501 526 502 527 template <> _UtilExport void MultiType::createNewValueContainer(const char& value); -
code/branches/cpp11_v3/src/libraries/util/MultiTypeValue.h
r11054 r11068 55 55 public: 56 56 /// Constructor: Assigns the value and the type identifier. 57 MT_Value(const T& value, MultiType::Type ::Enumtype) : MT_ValueBase(&this->value_, type), value_(value) {}57 MT_Value(const T& value, MultiType::Type type) : MT_ValueBase(&this->value_, type), value_(value) {} 58 58 59 59 /// Creates a copy of itself. -
code/branches/cpp11_v3/src/libraries/util/SubString.cc
r11054 r11068 265 265 bool inSafemode = false; 266 266 267 if(start_state != S L_NORMAL && tokens.size() > 0)267 if(start_state != SPLIT_LINE_STATE::NORMAL && tokens.size() > 0) 268 268 { 269 269 token = tokens[tokens.size()-1]; 270 270 tokens.pop_back(); 271 271 } 272 if(start_state != S L_NORMAL && bTokenInSafemode.size() > 0)272 if(start_state != SPLIT_LINE_STATE::NORMAL && bTokenInSafemode.size() > 0) 273 273 { 274 274 inSafemode = bTokenInSafemode[bTokenInSafemode.size()-1]; … … 280 280 switch(state) 281 281 { 282 case S L_NORMAL:282 case SPLIT_LINE_STATE::NORMAL: 283 283 if(line[i] == escapeChar) 284 284 { 285 state = S L_ESCAPE;285 state = SPLIT_LINE_STATE::ESCAPE; 286 286 if (!bRemoveEscapeChar) 287 287 token += line[i]; … … 290 290 else if(line[i] == safemodeChar) 291 291 { 292 state = S L_SAFEMODE;292 state = SPLIT_LINE_STATE::SAFEMODE; 293 293 inSafemode = true; 294 294 if (!bRemoveSafemodeChar) … … 298 298 else if(line[i] == openparenthesisChar) 299 299 { 300 state = S L_PARENTHESES;300 state = SPLIT_LINE_STATE::PARENTHESES; 301 301 inSafemode = true; 302 302 if (!bRemoveParenthesisChars) … … 318 318 } 319 319 token += line[i]; // EAT 320 state = S L_COMMENT;320 state = SPLIT_LINE_STATE::COMMENT; 321 321 } 322 322 else if(delimiters.find(line[i]) != std::string::npos) … … 334 334 inSafemode = false; 335 335 } 336 state = S L_NORMAL;336 state = SPLIT_LINE_STATE::NORMAL; 337 337 } 338 338 else … … 353 353 } 354 354 break; 355 case S L_ESCAPE:355 case SPLIT_LINE_STATE::ESCAPE: 356 356 if (!bRemoveSafemodeChar) 357 357 token += line[i]; … … 368 368 else token += line[i]; // EAT 369 369 } 370 state = S L_NORMAL;371 break; 372 case S L_SAFEMODE:370 state = SPLIT_LINE_STATE::NORMAL; 371 break; 372 case SPLIT_LINE_STATE::SAFEMODE: 373 373 if(line[i] == safemodeChar) 374 374 { 375 state = S L_NORMAL;375 state = SPLIT_LINE_STATE::NORMAL; 376 376 if (!bRemoveSafemodeChar) 377 377 token += line[i]; … … 379 379 else if(line[i] == escapeChar) 380 380 { 381 state = S L_SAFEESCAPE;381 state = SPLIT_LINE_STATE::SAFEESCAPE; 382 382 } 383 383 else … … 387 387 break; 388 388 389 case S L_SAFEESCAPE:389 case SPLIT_LINE_STATE::SAFEESCAPE: 390 390 if(line[i] == 'n') token += '\n'; 391 391 else if(line[i] == 't') token += '\t'; … … 397 397 else if(line[i] == '?') token += '\?'; 398 398 else token += line[i]; // EAT 399 state = S L_SAFEMODE;400 break; 401 402 case S L_PARENTHESES:399 state = SPLIT_LINE_STATE::SAFEMODE; 400 break; 401 402 case SPLIT_LINE_STATE::PARENTHESES: 403 403 if(line[i] == closeparenthesisChar) 404 404 { 405 state = S L_NORMAL;405 state = SPLIT_LINE_STATE::NORMAL; 406 406 if (!bRemoveParenthesisChars) 407 407 token += line[i]; … … 409 409 else if(line[i] == escapeChar) 410 410 { 411 state = S L_PARENTHESESESCAPE;411 state = SPLIT_LINE_STATE::PARENTHESESESCAPE; 412 412 } 413 413 else … … 417 417 break; 418 418 419 case S L_PARENTHESESESCAPE:419 case SPLIT_LINE_STATE::PARENTHESESESCAPE: 420 420 if(line[i] == 'n') token += '\n'; 421 421 else if(line[i] == 't') token += '\t'; … … 427 427 else if(line[i] == '?') token += '\?'; 428 428 else token += line[i]; // EAT 429 state = S L_PARENTHESES;430 break; 431 432 case S L_COMMENT:429 state = SPLIT_LINE_STATE::PARENTHESES; 430 break; 431 432 case SPLIT_LINE_STATE::COMMENT: 433 433 if(line[i] == '\n') 434 434 { … … 441 441 inSafemode = false; 442 442 } 443 state = S L_NORMAL;443 state = SPLIT_LINE_STATE::NORMAL; 444 444 } 445 445 else -
code/branches/cpp11_v3/src/libraries/util/SubString.h
r9550 r11068 102 102 { 103 103 /// An enumerator for the internal state of the parser 104 enum SPLIT_LINE_STATE104 enum class SPLIT_LINE_STATE 105 105 { 106 SL_NORMAL, //!< Normal state107 SL_ESCAPE, //!< After an escape character108 S L_SAFEMODE, //!< In safe mode (usually between quotation marks).109 S L_SAFEESCAPE, //!< In safe mode with the internal escape character, that escapes even the savemode character.110 SL_COMMENT, //!< In Comment mode.111 SL_PARENTHESES, //!< Between parentheses (usually '{' and '}')112 SL_PARENTHESESESCAPE, //!< Between parentheses with the internal escape character, that escapes even the closing parenthesis character.106 NORMAL, //!< Normal state 107 ESCAPE, //!< After an escape character 108 SAFEMODE, //!< In safe mode (usually between quotation marks). 109 SAFEESCAPE, //!< In safe mode with the internal escape character, that escapes even the savemode character. 110 COMMENT, //!< In Comment mode. 111 PARENTHESES, //!< Between parentheses (usually '{' and '}') 112 PARENTHESESESCAPE, //!< Between parentheses with the internal escape character, that escapes even the closing parenthesis character. 113 113 }; 114 114 … … 204 204 bool bRemoveParenthesisChars = true, 205 205 char commentChar = '\0', 206 SPLIT_LINE_STATE start_state = S L_NORMAL);206 SPLIT_LINE_STATE start_state = SPLIT_LINE_STATE::NORMAL); 207 207 208 208 std::vector<std::string> tokens_; ///< The tokens after splitting the input line -
code/branches/cpp11_v3/src/libraries/util/UtilPrereqs.h
r11054 r11068 37 37 38 38 #include "OrxonoxConfig.h" 39 #include <string> 39 40 40 41 //-----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.