BsString.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. #include "BsColor.h"
  2. #include "BsMath.h"
  3. #include "BsMatrix3.h"
  4. #include "BsMatrix4.h"
  5. #include "BsQuaternion.h"
  6. #include "BsVector2.h"
  7. #include "BsVector3.h"
  8. #include "BsVector4.h"
  9. #include "BsException.h"
  10. namespace BansheeEngine
  11. {
  12. const String StringUtil::BLANK;
  13. const WString StringUtil::WBLANK;
  14. void StringUtil::trim(String& str, bool left, bool right)
  15. {
  16. static const String delims = " \t\r";
  17. trim(str, delims, left, right);
  18. }
  19. void StringUtil::trim(WString& str, bool left, bool right)
  20. {
  21. static const WString delims = L" \t\r";
  22. trim(str, delims, left, right);
  23. }
  24. void StringUtil::trim(String& str, const String& delims, bool left, bool right)
  25. {
  26. if(right)
  27. str.erase(str.find_last_not_of(delims)+1); // trim right
  28. if(left)
  29. str.erase(0, str.find_first_not_of(delims)); // trim left
  30. }
  31. void StringUtil::trim(WString& str, const WString& delims, bool left, bool right)
  32. {
  33. if(right)
  34. str.erase(str.find_last_not_of(delims)+1); // trim right
  35. if(left)
  36. str.erase(0, str.find_first_not_of(delims)); // trim left
  37. }
  38. Vector<String> StringUtil::split(const String& str, const String& delims, unsigned int maxSplits)
  39. {
  40. return splitInternal<char>(str, delims, maxSplits);
  41. }
  42. Vector<WString> StringUtil::split(const WString& str, const WString& delims, unsigned int maxSplits)
  43. {
  44. return splitInternal<wchar_t>(str, delims, maxSplits);
  45. }
  46. Vector<String> StringUtil::tokenise(const String& str, const String& singleDelims, const String& doubleDelims, unsigned int maxSplits)
  47. {
  48. return tokeniseInternal<char>(str, singleDelims, doubleDelims, maxSplits);
  49. }
  50. Vector<WString> StringUtil::tokenise(const WString& str, const WString& singleDelims, const WString& doubleDelims, unsigned int maxSplits)
  51. {
  52. return tokeniseInternal<wchar_t>(str, singleDelims, doubleDelims, maxSplits);
  53. }
  54. void StringUtil::toLowerCase(String& str)
  55. {
  56. std::transform(str.begin(), str.end(), str.begin(), tolower);
  57. }
  58. void StringUtil::toLowerCase(WString& str)
  59. {
  60. std::transform(str.begin(), str.end(), str.begin(), tolower);
  61. }
  62. void StringUtil::toUpperCase(String& str)
  63. {
  64. std::transform(str.begin(), str.end(), str.begin(), toupper);
  65. }
  66. void StringUtil::toUpperCase(WString& str)
  67. {
  68. std::transform(str.begin(), str.end(), str.begin(), toupper);
  69. }
  70. bool StringUtil::startsWith(const String& str, const String& pattern, bool lowerCase)
  71. {
  72. return startsWithInternal<char>(str, pattern, lowerCase);
  73. }
  74. bool StringUtil::startsWith(const WString& str, const WString& pattern, bool lowerCase)
  75. {
  76. return startsWithInternal<wchar_t>(str, pattern, lowerCase);
  77. }
  78. bool StringUtil::endsWith(const String& str, const String& pattern, bool lowerCase)
  79. {
  80. return endsWithInternal<char>(str, pattern, lowerCase);
  81. }
  82. bool StringUtil::endsWith(const WString& str, const WString& pattern, bool lowerCase)
  83. {
  84. return endsWithInternal<wchar_t>(str, pattern, lowerCase);
  85. }
  86. bool StringUtil::match(const String& str, const String& pattern, bool caseSensitive)
  87. {
  88. return matchInternal<char>(str, pattern, caseSensitive);
  89. }
  90. bool StringUtil::match(const WString& str, const WString& pattern, bool caseSensitive)
  91. {
  92. return matchInternal<wchar_t>(str, pattern, caseSensitive);
  93. }
  94. const String StringUtil::replaceAll(const String& source, const String& replaceWhat, const String& replaceWithWhat)
  95. {
  96. return replaceAllInternal<char>(source, replaceWhat, replaceWithWhat);
  97. }
  98. const WString StringUtil::replaceAll(const WString& source, const WString& replaceWhat, const WString& replaceWithWhat)
  99. {
  100. return replaceAllInternal<wchar_t>(source, replaceWhat, replaceWithWhat);
  101. }
  102. /************************************************************************/
  103. /* VARIOUS TO STRING CONVERSIONS */
  104. /************************************************************************/
  105. WString toWString(const String& source)
  106. {
  107. return WString(source.begin(), source.end());
  108. }
  109. WString toWString(float val, unsigned short precision,
  110. unsigned short width, char fill, std::ios::fmtflags flags)
  111. {
  112. WStringStream stream;
  113. stream.precision(precision);
  114. stream.width(width);
  115. stream.fill(fill);
  116. if (flags)
  117. stream.setf(flags);
  118. stream << val;
  119. return stream.str();
  120. }
  121. WString toWString(double val, unsigned short precision,
  122. unsigned short width, char fill, std::ios::fmtflags flags)
  123. {
  124. WStringStream stream;
  125. stream.precision(precision);
  126. stream.width(width);
  127. stream.fill(fill);
  128. if (flags)
  129. stream.setf(flags);
  130. stream << val;
  131. return stream.str();
  132. }
  133. WString toWString(Radian val, unsigned short precision,
  134. unsigned short width, char fill, std::ios::fmtflags flags)
  135. {
  136. return toWString(val.valueRadians(), precision, width, fill, flags);
  137. }
  138. WString toWString(Degree val, unsigned short precision,
  139. unsigned short width, char fill, std::ios::fmtflags flags)
  140. {
  141. return toWString(val.valueDegrees(), precision, width, fill, flags);
  142. }
  143. WString toWString(int val,
  144. unsigned short width, char fill, std::ios::fmtflags flags)
  145. {
  146. WStringStream stream;
  147. stream.width(width);
  148. stream.fill(fill);
  149. if (flags)
  150. stream.setf(flags);
  151. stream << val;
  152. return stream.str();
  153. }
  154. WString toWString(unsigned int val, unsigned short width, char fill, std::ios::fmtflags flags)
  155. {
  156. WStringStream stream;
  157. stream.width(width);
  158. stream.fill(fill);
  159. if (flags)
  160. stream.setf(flags);
  161. stream << val;
  162. return stream.str();
  163. }
  164. WString toWString(long val,
  165. unsigned short width, char fill, std::ios::fmtflags flags)
  166. {
  167. WStringStream stream;
  168. stream.width(width);
  169. stream.fill(fill);
  170. if (flags)
  171. stream.setf(flags);
  172. stream << val;
  173. return stream.str();
  174. }
  175. WString toWString(unsigned long val, unsigned short width, char fill, std::ios::fmtflags flags)
  176. {
  177. WStringStream stream;
  178. stream.width(width);
  179. stream.fill(fill);
  180. if (flags)
  181. stream.setf(flags);
  182. stream << val;
  183. return stream.str();
  184. }
  185. WString toWString(INT64 val, unsigned short width, char fill, std::ios::fmtflags flags)
  186. {
  187. WStringStream stream;
  188. stream.width(width);
  189. stream.fill(fill);
  190. if (flags)
  191. stream.setf(flags);
  192. stream << val;
  193. return stream.str();
  194. }
  195. WString toWString(UINT64 val, unsigned short width, char fill, std::ios::fmtflags flags)
  196. {
  197. WStringStream stream;
  198. stream.width(width);
  199. stream.fill(fill);
  200. if (flags)
  201. stream.setf(flags);
  202. stream << val;
  203. return stream.str();
  204. }
  205. WString toWString(char val, unsigned short width, char fill, std::ios::fmtflags flags)
  206. {
  207. WStringStream stream;
  208. stream.width(width);
  209. stream.fill(fill);
  210. if (flags)
  211. stream.setf(flags);
  212. stream << val;
  213. return stream.str();
  214. }
  215. WString toWString(wchar_t val, unsigned short width, char fill, std::ios::fmtflags flags)
  216. {
  217. WStringStream stream;
  218. stream.width(width);
  219. stream.fill(fill);
  220. if (flags)
  221. stream.setf(flags);
  222. stream << val;
  223. return stream.str();
  224. }
  225. WString toWString(const Vector2& val)
  226. {
  227. WStringStream stream;
  228. stream << val.x << L" " << val.y;
  229. return stream.str();
  230. }
  231. WString toWString(const Vector3& val)
  232. {
  233. WStringStream stream;
  234. stream << val.x << L" " << val.y << L" " << val.z;
  235. return stream.str();
  236. }
  237. WString toWString(const Vector4& val)
  238. {
  239. WStringStream stream;
  240. stream << val.x << L" " << val.y << L" " << val.z << L" " << val.w;
  241. return stream.str();
  242. }
  243. WString toWString(const Matrix3& val)
  244. {
  245. WStringStream stream;
  246. stream << val[0][0] << L" "
  247. << val[0][1] << L" "
  248. << val[0][2] << L" "
  249. << val[1][0] << L" "
  250. << val[1][1] << L" "
  251. << val[1][2] << L" "
  252. << val[2][0] << L" "
  253. << val[2][1] << L" "
  254. << val[2][2];
  255. return stream.str();
  256. }
  257. WString toWString(bool val, bool yesNo)
  258. {
  259. if (val)
  260. {
  261. if (yesNo)
  262. {
  263. return L"yes";
  264. }
  265. else
  266. {
  267. return L"true";
  268. }
  269. }
  270. else
  271. if (yesNo)
  272. {
  273. return L"no";
  274. }
  275. else
  276. {
  277. return L"false";
  278. }
  279. }
  280. WString toWString(const Matrix4& val)
  281. {
  282. WStringStream stream;
  283. stream << val[0][0] << L" "
  284. << val[0][1] << L" "
  285. << val[0][2] << L" "
  286. << val[0][3] << L" "
  287. << val[1][0] << L" "
  288. << val[1][1] << L" "
  289. << val[1][2] << L" "
  290. << val[1][3] << L" "
  291. << val[2][0] << L" "
  292. << val[2][1] << L" "
  293. << val[2][2] << L" "
  294. << val[2][3] << L" "
  295. << val[3][0] << L" "
  296. << val[3][1] << L" "
  297. << val[3][2] << L" "
  298. << val[3][3];
  299. return stream.str();
  300. }
  301. WString toWString(const Quaternion& val)
  302. {
  303. WStringStream stream;
  304. stream << val.w << L" " << val.x << L" " << val.y << L" " << val.z;
  305. return stream.str();
  306. }
  307. WString toWString(const Color& val)
  308. {
  309. WStringStream stream;
  310. stream << val.r << L" " << val.g << L" " << val.b << L" " << val.a;
  311. return stream.str();
  312. }
  313. WString toWString(const Vector<BansheeEngine::WString>& val)
  314. {
  315. WStringStream stream;
  316. Vector<BansheeEngine::WString>::const_iterator i, iend, ibegin;
  317. ibegin = val.begin();
  318. iend = val.end();
  319. for (i = ibegin; i != iend; ++i)
  320. {
  321. if (i != ibegin)
  322. stream << L" ";
  323. stream << *i;
  324. }
  325. return stream.str();
  326. }
  327. String toString(const WString& source)
  328. {
  329. return String(source.begin(), source.end());
  330. }
  331. String toString(float val, unsigned short precision,
  332. unsigned short width, char fill, std::ios::fmtflags flags)
  333. {
  334. StringStream stream;
  335. stream.precision(precision);
  336. stream.width(width);
  337. stream.fill(fill);
  338. if (flags)
  339. stream.setf(flags);
  340. stream << val;
  341. return stream.str();
  342. }
  343. String toString(double val, unsigned short precision,
  344. unsigned short width, char fill, std::ios::fmtflags flags)
  345. {
  346. StringStream stream;
  347. stream.precision(precision);
  348. stream.width(width);
  349. stream.fill(fill);
  350. if (flags)
  351. stream.setf(flags);
  352. stream << val;
  353. return stream.str();
  354. }
  355. String toString(Radian val, unsigned short precision,
  356. unsigned short width, char fill, std::ios::fmtflags flags)
  357. {
  358. return toString(val.valueRadians(), precision, width, fill, flags);
  359. }
  360. String toString(Degree val, unsigned short precision,
  361. unsigned short width, char fill, std::ios::fmtflags flags)
  362. {
  363. return toString(val.valueDegrees(), precision, width, fill, flags);
  364. }
  365. String toString(int val,
  366. unsigned short width, char fill, std::ios::fmtflags flags)
  367. {
  368. StringStream stream;
  369. stream.width(width);
  370. stream.fill(fill);
  371. if (flags)
  372. stream.setf(flags);
  373. stream << val;
  374. return stream.str();
  375. }
  376. String toString(unsigned int val, unsigned short width, char fill, std::ios::fmtflags flags)
  377. {
  378. StringStream stream;
  379. stream.width(width);
  380. stream.fill(fill);
  381. if (flags)
  382. stream.setf(flags);
  383. stream << val;
  384. return stream.str();
  385. }
  386. String toString(long val,
  387. unsigned short width, char fill, std::ios::fmtflags flags)
  388. {
  389. StringStream stream;
  390. stream.width(width);
  391. stream.fill(fill);
  392. if (flags)
  393. stream.setf(flags);
  394. stream << val;
  395. return stream.str();
  396. }
  397. String toString(unsigned long val, unsigned short width, char fill, std::ios::fmtflags flags)
  398. {
  399. StringStream stream;
  400. stream.width(width);
  401. stream.fill(fill);
  402. if (flags)
  403. stream.setf(flags);
  404. stream << val;
  405. return stream.str();
  406. }
  407. String toString(INT64 val,
  408. unsigned short width, char fill, std::ios::fmtflags flags)
  409. {
  410. StringStream stream;
  411. stream.width(width);
  412. stream.fill(fill);
  413. if (flags)
  414. stream.setf(flags);
  415. stream << val;
  416. return stream.str();
  417. }
  418. String toString(UINT64 val, unsigned short width, char fill, std::ios::fmtflags flags)
  419. {
  420. StringStream stream;
  421. stream.width(width);
  422. stream.fill(fill);
  423. if (flags)
  424. stream.setf(flags);
  425. stream << val;
  426. return stream.str();
  427. }
  428. String toString(const Vector2& val)
  429. {
  430. StringStream stream;
  431. stream << val.x << " " << val.y;
  432. return stream.str();
  433. }
  434. String toString(const Vector3& val)
  435. {
  436. StringStream stream;
  437. stream << val.x << " " << val.y << " " << val.z;
  438. return stream.str();
  439. }
  440. String toString(const Vector4& val)
  441. {
  442. StringStream stream;
  443. stream << val.x << " " << val.y << " " << val.z << " " << val.w;
  444. return stream.str();
  445. }
  446. String toString(const Matrix3& val)
  447. {
  448. StringStream stream;
  449. stream << val[0][0] << " "
  450. << val[0][1] << " "
  451. << val[0][2] << " "
  452. << val[1][0] << " "
  453. << val[1][1] << " "
  454. << val[1][2] << " "
  455. << val[2][0] << " "
  456. << val[2][1] << " "
  457. << val[2][2];
  458. return stream.str();
  459. }
  460. String toString(bool val, bool yesNo)
  461. {
  462. if (val)
  463. {
  464. if (yesNo)
  465. {
  466. return "yes";
  467. }
  468. else
  469. {
  470. return "true";
  471. }
  472. }
  473. else
  474. if (yesNo)
  475. {
  476. return "no";
  477. }
  478. else
  479. {
  480. return "false";
  481. }
  482. }
  483. String toString(const Matrix4& val)
  484. {
  485. StringStream stream;
  486. stream << val[0][0] << " "
  487. << val[0][1] << " "
  488. << val[0][2] << " "
  489. << val[0][3] << " "
  490. << val[1][0] << " "
  491. << val[1][1] << " "
  492. << val[1][2] << " "
  493. << val[1][3] << " "
  494. << val[2][0] << " "
  495. << val[2][1] << " "
  496. << val[2][2] << " "
  497. << val[2][3] << " "
  498. << val[3][0] << " "
  499. << val[3][1] << " "
  500. << val[3][2] << " "
  501. << val[3][3];
  502. return stream.str();
  503. }
  504. String toString(const Quaternion& val)
  505. {
  506. StringStream stream;
  507. stream << val.w << " " << val.x << " " << val.y << " " << val.z;
  508. return stream.str();
  509. }
  510. String toString(const Color& val)
  511. {
  512. StringStream stream;
  513. stream << val.r << " " << val.g << " " << val.b << " " << val.a;
  514. return stream.str();
  515. }
  516. String toString(const Vector<BansheeEngine::String>& val)
  517. {
  518. StringStream stream;
  519. Vector<BansheeEngine::String>::const_iterator i, iend, ibegin;
  520. ibegin = val.begin();
  521. iend = val.end();
  522. for (i = ibegin; i != iend; ++i)
  523. {
  524. if (i != ibegin)
  525. stream << " ";
  526. stream << *i;
  527. }
  528. return stream.str();
  529. }
  530. float parseFloat(const String& val, float defaultValue)
  531. {
  532. // Use istringstream for direct correspondence with toString
  533. StringStream str(val);
  534. float ret = defaultValue;
  535. str >> ret;
  536. return ret;
  537. }
  538. int parseInt(const String& val, int defaultValue)
  539. {
  540. // Use istringstream for direct correspondence with toString
  541. StringStream str(val);
  542. int ret = defaultValue;
  543. str >> ret;
  544. return ret;
  545. }
  546. unsigned int parseUnsignedInt(const String& val, unsigned int defaultValue)
  547. {
  548. // Use istringstream for direct correspondence with toString
  549. StringStream str(val);
  550. unsigned int ret = defaultValue;
  551. str >> ret;
  552. return ret;
  553. }
  554. long parseLong(const String& val, long defaultValue)
  555. {
  556. // Use istringstream for direct correspondence with toString
  557. StringStream str(val);
  558. long ret = defaultValue;
  559. str >> ret;
  560. return ret;
  561. }
  562. unsigned long parseUnsignedLong(const String& val, unsigned long defaultValue)
  563. {
  564. // Use istringstream for direct correspondence with toString
  565. StringStream str(val);
  566. unsigned long ret = defaultValue;
  567. str >> ret;
  568. return ret;
  569. }
  570. bool parseBool(const String& val, bool defaultValue)
  571. {
  572. if ((StringUtil::startsWith(val, "true") || StringUtil::startsWith(val, "yes")
  573. || StringUtil::startsWith(val, "1")))
  574. return true;
  575. else if ((StringUtil::startsWith(val, "false") || StringUtil::startsWith(val, "no")
  576. || StringUtil::startsWith(val, "0")))
  577. return false;
  578. else
  579. return defaultValue;
  580. }
  581. bool isNumber(const String& val)
  582. {
  583. StringStream str(val);
  584. float tst;
  585. str >> tst;
  586. return !str.fail() && str.eof();
  587. }
  588. float parseFloat(const WString& val, float defaultValue)
  589. {
  590. // Use istringstream for direct correspondence with toString
  591. WStringStream str(val);
  592. float ret = defaultValue;
  593. str >> ret;
  594. return ret;
  595. }
  596. int parseInt(const WString& val, int defaultValue)
  597. {
  598. // Use istringstream for direct correspondence with toString
  599. WStringStream str(val);
  600. int ret = defaultValue;
  601. str >> ret;
  602. return ret;
  603. }
  604. unsigned int parseUnsignedInt(const WString& val, unsigned int defaultValue)
  605. {
  606. // Use istringstream for direct correspondence with toString
  607. WStringStream str(val);
  608. unsigned int ret = defaultValue;
  609. str >> ret;
  610. return ret;
  611. }
  612. long parseLong(const WString& val, long defaultValue)
  613. {
  614. // Use istringstream for direct correspondence with toString
  615. WStringStream str(val);
  616. long ret = defaultValue;
  617. str >> ret;
  618. return ret;
  619. }
  620. unsigned long parseUnsignedLong(const WString& val, unsigned long defaultValue)
  621. {
  622. // Use istringstream for direct correspondence with toString
  623. WStringStream str(val);
  624. unsigned long ret = defaultValue;
  625. str >> ret;
  626. return ret;
  627. }
  628. bool parseBool(const WString& val, bool defaultValue)
  629. {
  630. if ((StringUtil::startsWith(val, L"true") || StringUtil::startsWith(val, L"yes")
  631. || StringUtil::startsWith(val, L"1")))
  632. return true;
  633. else if ((StringUtil::startsWith(val, L"false") || StringUtil::startsWith(val, L"no")
  634. || StringUtil::startsWith(val, L"0")))
  635. return false;
  636. else
  637. return defaultValue;
  638. }
  639. bool isNumber(const WString& val)
  640. {
  641. WStringStream str(val);
  642. float tst;
  643. str >> tst;
  644. return !str.fail() && str.eof();
  645. }
  646. void __string_throwDataOverflowException()
  647. {
  648. BS_EXCEPT(InternalErrorException, "Data overflow! Size doesn't fit into 32 bits.");
  649. }
  650. }