- Timestamp:
- Apr 1, 2011 3:03:59 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 70924
- Location:
- trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/cpp/autores.h
r36499 r36508 4 4 5 5 /* 6 * Copyright (C) 2008 Oracle Corporation6 * Copyright (C) 2008-2011 Oracle Corporation 7 7 * 8 8 * This file is part of VirtualBox Open Source Edition (OSE), as … … 31 31 32 32 /** 33 * @addtogroup grp_rt_cpp_util34 * @{35 */36 37 /**38 33 * A simple class used to prevent copying and assignment. 39 34 * 40 35 * Inherit from this class in order to prevent automatic generation 41 36 * of the copy constructor and assignment operator in your class. 37 * 38 * @todo Functionality duplicated by iprt::non_copyable. grr! 39 * 40 * @addtogroup grp_rt_cpp_util 42 41 */ 43 42 class RTCNonCopyable … … 51 50 }; 52 51 53 /** @} */ 54 55 /** 56 * @defgroup grp_rt_cpp_autores C++ Resource Management 52 53 /** @defgroup grp_rt_cpp_autores C++ Resource Management 57 54 * @ingroup grp_rt_cpp 58 55 * @{ … … 85 82 */ 86 83 template <class T> 87 inline void RTAutoResDestruct(T a Handle)84 inline void RTAutoResDestruct(T a_h) 88 85 { 89 86 AssertFatalMsgFailed(("Unspecialized template!\n")); 90 NOREF(a Handle);87 NOREF(a_h); 91 88 } 92 89 -
trunk/include/iprt/cpp/exception.h
r36499 r36508 4 4 5 5 /* 6 * Copyright (C) 2006-201 0Oracle Corporation6 * Copyright (C) 2006-2011 Oracle Corporation 7 7 * 8 8 * This file is part of VirtualBox Open Source Edition (OSE), as … … 32 32 { 33 33 34 /** 35 * @defgroup grp_rt_cpp_exceptions C++ Exceptions 34 /** @defgroup grp_rt_cpp_exceptions C++ Exceptions 36 35 * @ingroup grp_rt_cpp 37 36 * @{ -
trunk/include/iprt/cpp/list.h
r36500 r36508 29 29 #include <iprt/cpp/meta.h> 30 30 #include <iprt/mem.h> 31 #include <iprt/string.h> /* for memcpy */ 31 32 32 33 #include <new> /* For std::bad_alloc */ … … 35 36 { 36 37 37 /** 38 * @defgroup grp_rt_cpp_list C++ List support 38 /** @defgroup grp_rt_cpp_list C++ List support 39 39 * @ingroup grp_rt_cpp 40 40 * … … 312 312 { 313 313 /* Prevent self assignment */ 314 if (this == &other) return *this; 314 if (this == &other) 315 return *this; 316 315 317 /* Values cleanup */ 316 318 ListHelper<T, list_type>::eraseRange(m_pArray, 0, m_cSize); 319 317 320 /* Copy */ 318 321 if (other.m_cSize != m_cCapacity) … … 520 523 521 524 /** 522 525 * Generic realloc, which does some kind of boundary checking. 523 526 */ 524 527 void realloc(size_t cNewSize) … … 527 530 if (cNewSize == m_cCapacity) 528 531 return; 532 529 533 /* If we get smaller we have to delete some of the objects at the end 530 534 of the list. */ … … 535 539 m_cSize -= m_cSize - cNewSize; 536 540 } 541 537 542 /* If we get zero we delete the array it self. */ 538 543 if ( cNewSize == 0 … … 543 548 } 544 549 m_cCapacity = cNewSize; 550 545 551 /* Resize the array. */ 546 552 if (cNewSize > 0) … … 549 555 if (!m_pArray) 550 556 { 557 /** @todo you leak memory. */ 551 558 m_cCapacity = 0; 552 559 m_cSize = 0; 553 560 #ifdef RT_EXCEPTIONS_ENABLED 554 561 throw std::bad_alloc(); 555 #endif /* RT_EXCEPTIONS_ENABLED */562 #endif 556 563 } 557 564 } … … 570 577 if (!m_pArray) 571 578 { 579 /** @todo you leak memory. */ 572 580 m_cCapacity = 0; 573 581 m_cSize = 0; 574 582 #ifdef RT_EXCEPTIONS_ENABLED 575 583 throw std::bad_alloc(); 576 #endif /* RT_EXCEPTIONS_ENABLED */584 #endif 577 585 } 578 586 } … … 604 612 */ 605 613 template <class T, typename TYPE = typename if_<(sizeof(T) > sizeof(void*)), T*, T>::result> 606 class list : public ListBase<T, TYPE> {};614 class list : public ListBase<T, TYPE> {}; 607 615 608 616 /** … … 628 636 } /* namespace iprt */ 629 637 630 #endif /* ___iprt_cpp_list_h */631 638 #endif /* !___iprt_cpp_list_h */ 639 -
trunk/include/iprt/cpp/lock.h
r36499 r36508 4 4 5 5 /* 6 * Copyright (C) 2007 Oracle Corporation6 * Copyright (C) 2007-2011 Oracle Corporation 7 7 * 8 8 * This file is part of VirtualBox Open Source Edition (OSE), as … … 34 34 RT_C_DECLS_BEGIN 35 35 36 /** 37 * @defgroup grp_rt_cpp_lock C++ Scope-based Locking 36 /** @defgroup grp_rt_cpp_lock C++ Scope-based Locking 38 37 * @ingroup grp_rt_cpp 39 38 * @{ … … 53 52 class RTLockMtx 54 53 { 55 54 friend class RTLock; 56 55 57 58 56 private: 57 RTCRITSECT mMtx; 59 58 60 61 62 59 public: 60 RTLockMtx() 61 { 63 62 #ifdef RT_LOCK_STRICT_ORDER 64 65 66 63 RTCritSectInitEx(&mMtx, 0 /*fFlags*/, 64 RTLockValidatorClassCreateUnique(RT_SRC_POS, NULL), 65 RTLOCKVAL_SUB_CLASS_NONE, NULL); 67 66 #else 68 67 RTCritSectInit(&mMtx); 69 68 #endif 70 69 } 71 70 72 73 74 71 /** Use to when creating locks that belongs in the same "class". */ 72 RTLockMtx(RT_SRC_POS_DECL, uint32_t uSubClass = RTLOCKVAL_SUB_CLASS_NONE) 73 { 75 74 #ifdef RT_LOCK_STRICT_ORDER 76 77 78 75 RTCritSectInitEx(&mMtx, 0 /*fFlags*/, 76 RTLockValidatorClassForSrcPos(RT_SRC_POS_ARGS, NULL), 77 uSubClass, NULL); 79 78 #else 80 81 82 79 NOREF(uSubClass); 80 RTCritSectInit(&mMtx); 81 RT_SRC_POS_NOREF(); 83 82 #endif 84 83 } 85 84 86 87 88 89 85 ~RTLockMtx() 86 { 87 RTCritSectDelete(&mMtx); 88 } 90 89 91 92 93 94 95 96 97 90 // lock() and unlock() are private so that only 91 // friend RTLock can access them 92 private: 93 inline void lock() 94 { 95 RTCritSectEnter(&mMtx); 96 } 98 97 99 100 101 102 98 inline void unlock() 99 { 100 RTCritSectLeave(&mMtx); 101 } 103 102 }; 104 103 … … 129 128 class RTLock 130 129 { 131 132 133 130 private: 131 RTLockMtx &mMtx; 132 bool mfLocked; 134 133 135 public: 136 RTLock(RTLockMtx &aMtx) 137 : mMtx(aMtx) 134 public: 135 RTLock(RTLockMtx &aMtx) 136 : mMtx(aMtx) 137 { 138 mMtx.lock(); 139 mfLocked = true; 140 } 141 142 ~RTLock() 143 { 144 if (mfLocked) 145 mMtx.unlock(); 146 } 147 148 inline void release() 149 { 150 if (mfLocked) 138 151 { 139 mMtx. lock();140 mfLocked = true;152 mMtx.unlock(); 153 mfLocked = false; 141 154 } 142 143 ~RTLock() 144 { 145 if (mfLocked) 146 mMtx.unlock(); 147 } 148 149 inline void release() 150 { 151 if (mfLocked) 152 { 153 mMtx.unlock(); 154 mfLocked = false; 155 } 156 } 155 } 157 156 }; 158 157 -
trunk/include/iprt/cpp/meta.h
r36500 r36508 30 30 { 31 31 32 /** 33 * @defgroup grp_rt_cpp_meta C++ Meta programming utilities 32 /** @defgroup grp_rt_cpp_meta C++ Meta programming utilities 34 33 * @ingroup grp_rt_cpp 35 34 * @{ -
trunk/include/iprt/cpp/ministring.h
r36501 r36508 4 4 5 5 /* 6 * Copyright (C) 2007-20 09Oracle Corporation6 * Copyright (C) 2007-2011 Oracle Corporation 7 7 * 8 8 * This file is part of VirtualBox Open Source Edition (OSE), as … … 37 37 { 38 38 39 /** 40 * @defgroup grp_rt_cpp_string C++ String support 39 /** @defgroup grp_rt_cpp_string C++ String support 41 40 * @ingroup grp_rt_cpp 42 41 * @{ 43 42 */ 44 43 45 /** 46 * @brief Mini C++ string class. 44 /** @brief Mini C++ string class. 47 45 * 48 46 * "MiniString" is a small C++ string class that does not depend on anything … … 825 823 * Splits a string separated by strSep into its parts. 826 824 * 827 * @param strSepThe separator to search for.828 * @param modeHow should empty parts be handled.825 * @param a_rstrSep The separator to search for. 826 * @param a_enmMode How should empty parts be handled. 829 827 * @returns separated strings as string list. 830 828 */ 831 iprt::list<iprt::MiniString, iprt::MiniString*> split(const iprt::MiniString &strSep, SplitMode mode = RemoveEmptyParts); 829 iprt::list<iprt::MiniString, iprt::MiniString *> split(const iprt::MiniString &a_rstrSep, 830 SplitMode a_enmMode = RemoveEmptyParts); 832 831 833 832 /** 834 833 * Joins a list of strings together using the provided separator. 835 834 * 836 * @param listThe list to join.837 * @param strSepThe separator used for joining.835 * @param a_rList The list to join. 836 * @param a_rstrSep The separator used for joining. 838 837 * @returns joined string. 839 838 */ 840 static iprt::MiniString join(const iprt::list<iprt::MiniString, iprt::MiniString*> &list, const iprt::MiniString &strSep = ""); 841 839 static iprt::MiniString join(const iprt::list<iprt::MiniString, iprt::MiniString *> &a_rList, 840 const iprt::MiniString &a_rstrSep = ""); 841 842 842 protected: 843 843 … … 919 919 } /* namespace iprt */ 920 920 921 /** 922 * @addtogroup grp_rt_cpp_string 921 /** @addtogroup grp_rt_cpp_string 923 922 * @{ 924 923 */ 925 924 926 925 /** 926 * Concatenate two strings. 927 * 928 * @param a_rstr1 String one. 929 * @param a_rstr2 String two. 930 * @returns the concatenate string. 931 * 927 932 * @relates iprt::MiniString 928 * 933 */ 934 RTDECL(const iprt::MiniString) operator+(const iprt::MiniString &a_rstr1, const iprt::MiniString &a_rstr2); 935 936 /** 929 937 * Concatenate two strings. 930 938 * 931 * @param oneString one.932 * @param otherString two.939 * @param a_rstr1 String one. 940 * @param a_psz2 String two. 933 941 * @returns the concatenate string. 942 * 943 * @relates iprt::MiniString 934 944 */ 935 RTDECL(const iprt::MiniString) operator+(const iprt::MiniString & one, const iprt::MiniString &other);945 RTDECL(const iprt::MiniString) operator+(const iprt::MiniString &a_rstr1, const char *a_psz2); 936 946 937 947 /** 948 * Concatenate two strings. 949 * 950 * @param a_psz1 String one. 951 * @param a_rstr2 String two. 952 * @returns the concatenate string. 953 * 938 954 * @relates iprt::MiniString 939 *940 * Concatenate two strings.941 *942 * @param one String one.943 * @param pcszOther String two.944 * @returns the concatenate string.945 955 */ 946 RTDECL(const iprt::MiniString) operator+(const iprt::MiniString &one, const char *pcszOther); 947 948 /** 949 * @relates iprt::MiniString 950 * 951 * Concatenate two strings. 952 * 953 * @param pcszOne String one. 954 * @param other String two. 955 * @returns the concatenate string. 956 */ 957 RTDECL(const iprt::MiniString) operator+(const char *pcszOne, const iprt::MiniString &other); 956 RTDECL(const iprt::MiniString) operator+(const char *a_psz1, const iprt::MiniString &a_rstr2); 958 957 959 958 /** @} */ -
trunk/include/iprt/cpp/utils.h
r36499 r36508 4 4 5 5 /* 6 * Copyright (C) 2006-20 07Oracle Corporation6 * Copyright (C) 2006-2011 Oracle Corporation 7 7 * 8 8 * This file is part of VirtualBox Open Source Edition (OSE), as … … 27 27 #define ___iprt_cpputils_h 28 28 29 /** 30 * @defgroup grp_rt_cpp IPRT C++ support 31 * @ingroup grp_rt 32 */ 29 /** @defgroup grp_rt_cpp IPRT C++ APIs */ 33 30 34 /** 35 * @defgroup grp_rt_cpp_util C++ Utilitis 31 /** @defgroup grp_rt_cpp_util C++ Utilities 36 32 * @ingroup grp_rt_cpp 37 33 * @{ … … 41 37 * Shortcut to |const_cast<C &>()| that automatically derives the correct 42 38 * type (class) for the const_cast template's argument from its own argument. 39 * 43 40 * Can be used to temporarily cancel the |const| modifier on the left-hand side 44 41 * of assignment expressions, like this: 45 42 * @code 46 * const Class that;43 * const Class That; 47 44 * ... 48 * unconst (that) = some_value;45 * unconst(That) = SomeValue; 49 46 * @endcode 50 47 */ 51 48 template <class C> 52 inline C& unconst(const C &that) { return const_cast<C&>(that); } 49 inline C &unconst(const C &that) 50 { 51 return const_cast<C &>(that); 52 } 53 53 54 54 … … 56 56 * Shortcut to |const_cast<C *>()| that automatically derives the correct 57 57 * type (class) for the const_cast template's argument from its own argument. 58 * 58 59 * Can be used to temporarily cancel the |const| modifier on the left-hand side 59 60 * of assignment expressions, like this: 60 61 * @code 61 * const Class * that;62 * const Class *pThat; 62 63 * ... 63 * unconst (that) = some_value;64 * unconst(pThat) = SomeValue; 64 65 * @endcode 65 66 */ 66 67 template <class C> 67 inline C* unconst(const C *that) { return const_cast<C*>(that); } 68 inline C *unconst(const C *that) 69 { 70 return const_cast<C *>(that); 71 } 68 72 69 73 /** @} */ … … 73 77 74 78 /** 79 * A simple class used to prevent copying and assignment. 80 * 81 * Inherit from this class in order to prevent automatic generation of the copy 82 * constructor and assignment operator in your class. 83 * 75 84 * @ingroup grp_rt_cpp_util 76 * @{ 77 */ 78 79 /** 80 * A simple class used to prevent copying and assignment. Inherit from this 81 * class in order to prevent automatic generation of the copy constructor 82 * and assignment operator in your class. 85 * @todo Functionality duplicated by RTCNonCopyable. grr! 83 86 */ 84 87 class non_copyable … … 88 91 ~non_copyable() {} 89 92 private: 90 non_copyable(non_copyable const &);91 non_copyable const &operator=(non_copyable const &);93 non_copyable(non_copyable const &); 94 non_copyable const &operator=(non_copyable const &); 92 95 }; 93 96 94 /** @}*/97 } /* namespace iprt */ 95 98 96 } // namespace iprt 99 #endif 97 100 98 #endif // ___iprt_cpputils_h99 -
trunk/include/iprt/cpp/xml.h
r36499 r36508 36 36 #include <iprt/cpp/exception.h> 37 37 38 /** 39 * @defgroup grp_rt_cpp_xml C++ XML support 38 /** @defgroup grp_rt_cpp_xml C++ XML support 40 39 * @ingroup grp_rt_cpp 41 40 * @{ … … 747 746 748 747 #endif /* !___iprt_xml_h */ 748 -
trunk/include/iprt/initterm.h
r33540 r36508 32 32 RT_C_DECLS_BEGIN 33 33 34 /** @defgroup grp_rt IPRT APIs34 /** @defgroup grp_rt IPRT C/C++ APIs 35 35 * @{ 36 36 */ -
trunk/src/VBox/Runtime/common/string/ministring.cpp
r36501 r36508 8 8 9 9 /* 10 * Copyright (C) 2007-201 0Oracle Corporation10 * Copyright (C) 2007-2011 Oracle Corporation 11 11 * 12 12 * This file is part of VirtualBox Open Source Edition (OSE), as … … 200 200 } 201 201 202 size_t MiniString::find(const char *pcszFind, size_t pos /*= 0*/) 203 const 202 size_t MiniString::find(const char *pcszFind, size_t pos /*= 0*/) const 204 203 { 205 204 const char *pszThis, *p; … … 224 223 } 225 224 226 MiniString MiniString::substrCP(size_t pos /*= 0*/, size_t n /*= npos*/) 227 const 225 MiniString MiniString::substrCP(size_t pos /*= 0*/, size_t n /*= npos*/) const 228 226 { 229 227 MiniString ret; … … 288 286 if (cs == CaseSensitive) 289 287 return ::RTStrCmp(&m_psz[l], that.m_psz) == 0; 290 else 291 return ::RTStrICmp(&m_psz[l], that.m_psz) == 0; 288 return ::RTStrICmp(&m_psz[l], that.m_psz) == 0; 292 289 } 293 290 … … 304 301 if (cs == CaseSensitive) 305 302 return ::RTStrNCmp(m_psz, that.m_psz, l2) == 0; 306 else 307 return ::RTStrNICmp(m_psz, that.m_psz, l2) == 0; 303 return ::RTStrNICmp(m_psz, that.m_psz, l2) == 0; 308 304 } 309 305 … … 314 310 if (cs == CaseSensitive) 315 311 return ::RTStrStr(m_psz, that.m_psz) != NULL; 316 else 317 return ::RTStrIStr(m_psz, that.m_psz) != NULL; 312 return ::RTStrIStr(m_psz, that.m_psz) != NULL; 318 313 } 319 314 … … 332 327 } 333 328 334 iprt::list<iprt::MiniString, iprt::MiniString*> MiniString::split(const iprt::MiniString &strSep, SplitMode mode /* = RemoveEmptyParts */) 335 { 336 iprt::list<iprt::MiniString> res; 329 iprt::list<iprt::MiniString, iprt::MiniString *> 330 MiniString::split(const iprt::MiniString &a_rstrSep, SplitMode mode /* = RemoveEmptyParts */) 331 { 332 iprt::list<iprt::MiniString> strRet; 337 333 if (!m_psz) 338 return res;339 if ( strSep.isEmpty())340 { 341 res.append(iprt::MiniString(m_psz));342 return res;343 } 344 345 size_t cch= m_cch;346 char *pszTmp = m_psz;347 while (cch > 0)348 { 349 char *pszNext = strstr(pszTmp,strSep.c_str());334 return strRet; 335 if (a_rstrSep.isEmpty()) 336 { 337 strRet.append(iprt::MiniString(m_psz)); 338 return strRet; 339 } 340 341 size_t cch = m_cch; 342 char const *pszTmp = m_psz; 343 while (cch > 0) 344 { 345 char const *pszNext = strstr(pszTmp, a_rstrSep.c_str()); 350 346 if (!pszNext) 347 { 348 strRet.append(iprt::MiniString(pszTmp, cch)); 351 349 break; 352 size_t chNext = pszNext - pszTmp; 353 if ( chNext > 0 350 } 351 size_t cchNext = pszNext - pszTmp; 352 if ( cchNext > 0 354 353 || mode == KeepEmptyParts) 355 res.append(iprt::MiniString(pszTmp, chNext)); 356 pszTmp += chNext + strSep.length(); 357 cch -= chNext + strSep.length(); 358 } 359 /* Some characters left at the end? */ 360 if (cch > 0) 361 res.append(iprt::MiniString(pszTmp, cch)); 362 363 return res; 354 strRet.append(iprt::MiniString(pszTmp, cchNext)); 355 pszTmp += cchNext + a_rstrSep.length(); 356 cch -= cchNext + a_rstrSep.length(); 357 } 358 359 return strRet; 364 360 } 365 361 366 362 /* static */ 367 iprt::MiniString MiniString::join(const iprt::list<iprt::MiniString, iprt::MiniString*> &list, const iprt::MiniString &strSep /* = "" */) 368 { 369 MiniString res; 370 if (list.size() > 1) 371 { 372 for(size_t i = 0; i < list.size() - 1; ++i) 373 res += list.at(i) + strSep; 374 res += list.last(); 375 } 376 377 return res; 378 } 379 380 const iprt::MiniString operator+(const iprt::MiniString &one, const iprt::MiniString &other) 381 { 382 iprt::MiniString res(one); 383 384 return res += other; 385 } 386 387 const iprt::MiniString operator+(const iprt::MiniString &one, const char *pcszOther) 388 { 389 iprt::MiniString res(one); 390 391 return res += pcszOther; 392 } 393 394 const iprt::MiniString operator+(const char *pcszOne, const iprt::MiniString &other) 395 { 396 iprt::MiniString res(pcszOne); 397 398 return res += other; 399 } 400 363 iprt::MiniString 364 MiniString::join(const iprt::list<iprt::MiniString, iprt::MiniString*> &a_rList, 365 const iprt::MiniString &a_rstrSep /* = "" */) 366 { 367 MiniString strRet; 368 if (a_rList.size() > 1) 369 { 370 for (size_t i = 0; i < a_rList.size() - 1; ++i) 371 strRet += a_rList.at(i) + a_rstrSep; 372 strRet += a_rList.last(); 373 } 374 375 return strRet; 376 } 377 378 const iprt::MiniString operator+(const iprt::MiniString &a_rStr1, const iprt::MiniString &a_rStr2) 379 { 380 iprt::MiniString strRet(a_rStr1); 381 strRet += a_rStr2; 382 return strRet; 383 } 384 385 const iprt::MiniString operator+(const iprt::MiniString &a_rStr1, const char *a_pszStr2) 386 { 387 iprt::MiniString strRet(a_rStr1); 388 strRet += a_pszStr2; 389 return strRet; 390 } 391 392 const iprt::MiniString operator+(const char *a_psz1, const iprt::MiniString &a_rStr2) 393 { 394 iprt::MiniString strRet(a_psz1); 395 strRet += a_rStr2; 396 return strRet; 397 } 398 -
trunk/src/VBox/Runtime/testcase/Makefile.kmk
r36500 r36508 68 68 tstRTHeapSimple \ 69 69 tstRTInlineAsm \ 70 tstIprtList \ 70 71 tstIprtMiniString \ 71 tstIprtList \72 72 tstLdr \ 73 73 tstLdrLoad \ … … 262 262 tstRTInlineAsmPIC3_DEFS = PIC 263 263 264 tstIprtList_TEMPLATE = VBOXR3TSTEXE 265 tstIprtList_SOURCES = tstIprtList.cpp 266 264 267 tstIprtMiniString_TEMPLATE = VBOXR3TSTEXE 265 268 tstIprtMiniString_SOURCES = tstIprtMiniString.cpp 266 267 tstIprtList_TEMPLATE = VBOXR3TSTEXE268 tstIprtList_SOURCES = tstIprtList.cpp269 269 270 270 tstLdr_SOURCES = tstLdr.cpp -
trunk/src/VBox/Runtime/testcase/tstIprtList.cpp
r36500 r36508 34 34 #include <iprt/rand.h> 35 35 36 36 37 /******************************************************************************* 37 * Test Data*38 * Global Variables * 38 39 *******************************************************************************/ 39 static const char *gs_apcszTestStrings[] = 40 /** Used for the string test. */ 41 static const char *g_apszTestStrings[] = 40 42 { 41 43 "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", … … 141 143 }; 142 144 143 /******************************************************************************* 144 * Tests * 145 *******************************************************************************/ 145 146 /** 147 * Does a list test. 148 * 149 * @param T1 The list type. 150 * @param T2 The input type 151 * @param pcszDesc The test description. 152 * @param paTestData Pointer to the array with the test input data. 153 * @param cTestItems The size of the input data. 154 */ 146 155 template<typename T1, typename T2> 147 static void test(const char * pcszDesc, T2 aTestData[], size_t cSize)156 static void test(const char *pcszDesc, T2 paTestData[], size_t cTestItems) 148 157 { 149 RTTestISubF("%s with size of %u (items=%u)", pcszDesc, sizeof(T1), c Size);158 RTTestISubF("%s with size of %u (items=%u)", pcszDesc, sizeof(T1), cTestItems); 150 159 151 160 /* … … 166 175 /* Add the second half of the test data */ 167 176 size_t cAdded = 1; 177 168 178 /* Start adding the second half of our test list */ 169 for (size_t i = c Size / 2; i < cSize; ++i, ++cAdded)179 for (size_t i = cTestItems / 2; i < cTestItems; ++i, ++cAdded) 170 180 { 171 testList.append( aTestData[i]);181 testList.append(paTestData[i]); 172 182 RTTESTI_CHECK_RETV(testList.size() == cAdded); 173 RTTESTI_CHECK(testList.at(0) == aTestData[cSize/ 2]);174 RTTESTI_CHECK(testList[0] == aTestData[cSize/ 2]);175 RTTESTI_CHECK(testList.first() == aTestData[cSize/ 2]);176 RTTESTI_CHECK(testList.at(cAdded - 1) == aTestData[i]);177 RTTESTI_CHECK(testList[cAdded - 1] == aTestData[i]);178 RTTESTI_CHECK(testList.last() == aTestData[i]);183 RTTESTI_CHECK(testList.at(0) == paTestData[cTestItems / 2]); 184 RTTESTI_CHECK(testList[0] == paTestData[cTestItems / 2]); 185 RTTESTI_CHECK(testList.first() == paTestData[cTestItems / 2]); 186 RTTESTI_CHECK(testList.at(cAdded - 1) == paTestData[i]); 187 RTTESTI_CHECK(testList[cAdded - 1] == paTestData[i]); 188 RTTESTI_CHECK(testList.last() == paTestData[i]); 179 189 } 190 180 191 /* Check that all is correctly appended. */ 181 RTTESTI_CHECK_RETV(testList.size() == c Size/ 2);192 RTTESTI_CHECK_RETV(testList.size() == cTestItems / 2); 182 193 RTTESTI_CHECK_RETV(testList.isEmpty() == false); 183 194 for (size_t i = 0; i < testList.size(); ++i) 184 RTTESTI_CHECK(testList.at(i) == aTestData[cSize / 2 + i]); 195 RTTESTI_CHECK(testList.at(i) == paTestData[cTestItems / 2 + i]); 196 185 197 /* Start prepending the first half of our test list. Iterate reverse to get 186 198 * the correct sorting back. */ 187 for (size_t i = c Size/ 2; i > 0; --i, ++cAdded)199 for (size_t i = cTestItems / 2; i > 0; --i, ++cAdded) 188 200 { 189 testList.prepend( aTestData[i - 1]);201 testList.prepend(paTestData[i - 1]); 190 202 RTTESTI_CHECK_RETV(testList.size() == cAdded); 191 RTTESTI_CHECK(testList.at(0) == aTestData[i - 1]);192 RTTESTI_CHECK(testList[0] == aTestData[i - 1]);193 RTTESTI_CHECK(testList.first() == aTestData[i - 1]);194 RTTESTI_CHECK(testList.at(cAdded - 1) == aTestData[cSize- 1]);195 RTTESTI_CHECK(testList[cAdded - 1] == aTestData[cSize- 1]);196 RTTESTI_CHECK(testList.last() == aTestData[cSize- 1]);203 RTTESTI_CHECK(testList.at(0) == paTestData[i - 1]); 204 RTTESTI_CHECK(testList[0] == paTestData[i - 1]); 205 RTTESTI_CHECK(testList.first() == paTestData[i - 1]); 206 RTTESTI_CHECK(testList.at(cAdded - 1) == paTestData[cTestItems - 1]); 207 RTTESTI_CHECK(testList[cAdded - 1] == paTestData[cTestItems - 1]); 208 RTTESTI_CHECK(testList.last() == paTestData[cTestItems - 1]); 197 209 } 210 198 211 /* Check that all is correctly prepended. */ 199 RTTESTI_CHECK_RETV(testList.size() == c Size);212 RTTESTI_CHECK_RETV(testList.size() == cTestItems); 200 213 RTTESTI_CHECK_RETV(testList.isEmpty() == false); 201 214 for (size_t i = 0; i < testList.size(); ++i) 202 RTTESTI_CHECK(testList.at(i) == aTestData[i]);215 RTTESTI_CHECK(testList.at(i) == paTestData[i]); 203 216 204 217 /* … … 206 219 */ 207 220 iprt::list<T1> testList2(testList); 221 208 222 /* Check that all is correctly appended. */ 209 RTTESTI_CHECK_RETV(testList2.size() == c Size);210 for (size_t i = 0; i < testList2.size(); ++i) 211 RTTESTI_CHECK(testList2.at(i) == aTestData[i]);223 RTTESTI_CHECK_RETV(testList2.size() == cTestItems); 224 for (size_t i = 0; i < testList2.size(); ++i) 225 RTTESTI_CHECK(testList2.at(i) == paTestData[i]); 212 226 213 227 /* … … 216 230 iprt::list<T1> testList3; 217 231 testList3 = testList; 232 218 233 /* Check that all is correctly appended. */ 219 RTTESTI_CHECK_RETV(testList3.size() == c Size);234 RTTESTI_CHECK_RETV(testList3.size() == cTestItems); 220 235 for (size_t i = 0; i < testList3.size(); ++i) 221 RTTESTI_CHECK(testList3.at(i) == aTestData[i]);236 RTTESTI_CHECK(testList3.at(i) == paTestData[i]); 222 237 223 238 /* … … 225 240 */ 226 241 testList2.append(testList3); 242 227 243 /* Check that all is correctly appended. */ 228 RTTESTI_CHECK_RETV(testList2.size() == c Size* 2);229 for (size_t i = 0; i < testList2.size(); ++i) 230 RTTESTI_CHECK(testList2.at(i) == aTestData[i % cSize]);244 RTTESTI_CHECK_RETV(testList2.size() == cTestItems * 2); 245 for (size_t i = 0; i < testList2.size(); ++i) 246 RTTESTI_CHECK(testList2.at(i) == paTestData[i % cTestItems]); 231 247 232 248 /* … … 234 250 */ 235 251 testList2.prepend(testList3); 252 236 253 /* Check that all is correctly appended. */ 237 RTTESTI_CHECK_RETV(testList2.size() == c Size* 3);238 for (size_t i = 0; i < testList2.size(); ++i) 239 RTTESTI_CHECK(testList2.at(i) == aTestData[i % cSize]);254 RTTESTI_CHECK_RETV(testList2.size() == cTestItems * 3); 255 for (size_t i = 0; i < testList2.size(); ++i) 256 RTTESTI_CHECK(testList2.at(i) == paTestData[i % cTestItems]); 240 257 241 258 /* … … 243 260 */ 244 261 for (size_t i = 0; i < testList2.size(); ++i) 245 RTTESTI_CHECK(testList2.value(i) == aTestData[i % cSize]);246 for (size_t i = 0; i < testList2.size(); ++i) 247 RTTESTI_CHECK(testList2.value(i, T1()) == aTestData[i % cSize]);262 RTTESTI_CHECK(testList2.value(i) == paTestData[i % cTestItems]); 263 for (size_t i = 0; i < testList2.size(); ++i) 264 RTTESTI_CHECK(testList2.value(i, T1()) == paTestData[i % cTestItems]); 248 265 RTTESTI_CHECK(testList2.value(testList2.size() + 1) == T1()); /* Invalid index */ 249 266 RTTESTI_CHECK(testList2.value(testList2.size() + 1, T1()) == T1()); /* Invalid index */ … … 253 270 */ 254 271 for (size_t i = 0; i < testList.size(); ++i) 255 RTTESTI_CHECK(testList[i] == aTestData[i]); 272 RTTESTI_CHECK(testList[i] == paTestData[i]); 273 256 274 /* 257 275 * operator[] (writing) … … 259 277 * Replace with inverted array. 260 278 */ 261 for (size_t i = 0; i < c Size; ++i)262 testList[i] = aTestData[cSize- i - 1];263 RTTESTI_CHECK_RETV(testList.size() == c Size);264 for (size_t i = 0; i < testList.size(); ++i) 265 RTTESTI_CHECK(testList[i] == aTestData[cSize- i - 1]);279 for (size_t i = 0; i < cTestItems; ++i) 280 testList[i] = paTestData[cTestItems - i - 1]; 281 RTTESTI_CHECK_RETV(testList.size() == cTestItems); 282 for (size_t i = 0; i < testList.size(); ++i) 283 RTTESTI_CHECK(testList[i] == paTestData[cTestItems - i - 1]); 266 284 267 285 /* … … 270 288 * Replace with inverted array (Must be original array when finished). 271 289 */ 272 for (size_t i = 0; i < c Size; ++i)273 testList.replace(i, aTestData[i]);274 RTTESTI_CHECK_RETV(testList.size() == c Size);275 for (size_t i = 0; i < testList.size(); ++i) 276 RTTESTI_CHECK(testList[i] == aTestData[i]);290 for (size_t i = 0; i < cTestItems; ++i) 291 testList.replace(i, paTestData[i]); 292 RTTESTI_CHECK_RETV(testList.size() == cTestItems); 293 for (size_t i = 0; i < testList.size(); ++i) 294 RTTESTI_CHECK(testList[i] == paTestData[i]); 277 295 278 296 /* … … 281 299 282 300 /* Remove Range */ 283 testList2.removeRange(c Size, cSize* 2);284 RTTESTI_CHECK_RETV(testList2.size() == c Size* 2);285 for (size_t i = 0; i < testList2.size(); ++i) 286 RTTESTI_CHECK(testList2.at(i) == aTestData[i % cSize]);301 testList2.removeRange(cTestItems, cTestItems * 2); 302 RTTESTI_CHECK_RETV(testList2.size() == cTestItems * 2); 303 for (size_t i = 0; i < testList2.size(); ++i) 304 RTTESTI_CHECK(testList2.at(i) == paTestData[i % cTestItems]); 287 305 288 306 /* Remove the first half (reverse) */ 289 307 size_t cRemoved = 1; 290 for (size_t i = c Size/ 2; i > 0; --i, ++cRemoved)308 for (size_t i = cTestItems / 2; i > 0; --i, ++cRemoved) 291 309 { 292 310 testList.removeAt(i - 1); 293 RTTESTI_CHECK_RETV(testList.size() == c Size- cRemoved);311 RTTESTI_CHECK_RETV(testList.size() == cTestItems - cRemoved); 294 312 } 295 RTTESTI_CHECK_RETV(testList.size() == cSize / 2); 313 RTTESTI_CHECK_RETV(testList.size() == cTestItems / 2); 314 296 315 /* Check that all is correctly removed and only the second part of the list 297 316 * is still there. */ 298 317 for (size_t i = 0; i < testList.size(); ++i) 299 RTTESTI_CHECK(testList.at(i) == aTestData[cSize/ 2 + i]);318 RTTESTI_CHECK(testList.at(i) == paTestData[cTestItems / 2 + i]); 300 319 301 320 /* 302 321 * setCapacitiy 303 322 */ 304 testList.setCapacity(cSize * 5); 305 RTTESTI_CHECK(testList.capacity() == cSize * 5); 306 RTTESTI_CHECK_RETV(testList.size() == cSize / 2); 323 testList.setCapacity(cTestItems * 5); 324 RTTESTI_CHECK(testList.capacity() == cTestItems * 5); 325 RTTESTI_CHECK_RETV(testList.size() == cTestItems / 2); 326 307 327 /* As the capacity just increased, we should still have all entries from 308 328 * the previous list. */ 309 329 for (size_t i = 0; i < testList.size(); ++i) 310 RTTESTI_CHECK(testList.at(i) == aTestData[cSize / 2 + i]); 330 RTTESTI_CHECK(testList.at(i) == paTestData[cTestItems / 2 + i]); 331 311 332 /* Decrease the capacity so it will be smaller than the count of items in 312 333 * the list. The list should be shrink automatically, but the remaining 313 334 * items should be still valid. */ 314 testList.setCapacity(c Size/ 4);315 RTTESTI_CHECK_RETV(testList.size() == c Size/ 4);316 RTTESTI_CHECK(testList.capacity() == c Size/ 4);317 for (size_t i = 0; i < testList.size(); ++i) 318 RTTESTI_CHECK(testList.at(i) == aTestData[cSize/ 2 + i]);335 testList.setCapacity(cTestItems / 4); 336 RTTESTI_CHECK_RETV(testList.size() == cTestItems / 4); 337 RTTESTI_CHECK(testList.capacity() == cTestItems / 4); 338 for (size_t i = 0; i < testList.size(); ++i) 339 RTTESTI_CHECK(testList.at(i) == paTestData[cTestItems / 2 + i]); 319 340 320 341 /* Clear all */ … … 325 346 } 326 347 348 327 349 int main() 328 350 { … … 331 353 332 354 RTTEST hTest; 333 int rc= RTTestInitAndCreate("tstIprtList", &hTest);334 if (rc )335 return rc ;355 RTEXITCODE rcExit = RTTestInitAndCreate("tstIprtList", &hTest); 356 if (rcExit) 357 return rcExit; 336 358 RTTestBanner(hTest); 337 359 … … 348 370 uint8_t au8TestInts[s_cTestCount]; 349 371 for (size_t i = 0; i < RT_ELEMENTS(au8TestInts); ++i) 350 au8TestInts[i] = ( float)RTRandU32() / UINT32_MAX * UINT8_MAX;372 au8TestInts[i] = (uint8_t)RTRandU32Ex(0, UINT8_MAX); 351 373 test<uint8_t, uint8_t>("Native type", au8TestInts, RT_ELEMENTS(au8TestInts)); 374 352 375 uint16_t au16TestInts[s_cTestCount]; 353 376 for (size_t i = 0; i < RT_ELEMENTS(au16TestInts); ++i) 354 au16TestInts[i] = ( float)RTRandU32() / UINT32_MAX * UINT16_MAX;377 au16TestInts[i] = (uint16_t)RTRandU32Ex(0, UINT16_MAX); 355 378 test<uint16_t, uint16_t>("Native type", au16TestInts, RT_ELEMENTS(au16TestInts)); 379 356 380 uint32_t au32TestInts[s_cTestCount]; 357 381 for (size_t i = 0; i < RT_ELEMENTS(au32TestInts); ++i) 358 382 au32TestInts[i] = RTRandU32(); 359 383 test<uint32_t, uint32_t>("Native type", au32TestInts, RT_ELEMENTS(au32TestInts)); 384 360 385 /* 361 386 * Specialized type. … … 365 390 au64TestInts[i] = RTRandU64(); 366 391 test<uint64_t, uint64_t>("Specialized type", au64TestInts, RT_ELEMENTS(au64TestInts)); 392 367 393 /* 368 394 * Big size type (translate to internal pointer list). 369 395 */ 370 test<iprt::MiniString, const char *>("Class type", gs_apcszTestStrings, RT_ELEMENTS(gs_apcszTestStrings));396 test<iprt::MiniString, const char *>("Class type", g_apszTestStrings, RT_ELEMENTS(g_apszTestStrings)); 371 397 372 398 /*
Note:
See TracChangeset
for help on using the changeset viewer.