Xml.inl.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Util/Xml.h>
  6. #include <AnKi/Util/StringList.h>
  7. namespace anki {
  8. template<typename T>
  9. Error XmlElement::getNumber(T& out) const
  10. {
  11. ANKI_CHECK(check());
  12. const char* txt = m_el->GetText();
  13. if(txt != nullptr)
  14. {
  15. ANKI_CHECK(CString(txt).toNumber(out));
  16. }
  17. else
  18. {
  19. ANKI_UTIL_LOGE("Failed to return number. Element: %s", m_el->Value());
  20. return Error::USER_DATA;
  21. }
  22. return Error::NONE;
  23. }
  24. template<typename T>
  25. Error XmlElement::getNumbers(DynamicArrayAuto<T>& out) const
  26. {
  27. CString txt;
  28. ANKI_CHECK(getText(txt));
  29. if(txt)
  30. {
  31. return parseNumbers(txt, out);
  32. }
  33. else
  34. {
  35. out.destroy();
  36. return Error::NONE;
  37. }
  38. }
  39. template<typename TArray>
  40. Error XmlElement::getNumbers(TArray& out) const
  41. {
  42. CString txt;
  43. ANKI_CHECK(getText(txt));
  44. return parseNumbers(txt, out);
  45. }
  46. template<typename T>
  47. Error XmlElement::getAttributeNumbersOptional(CString name, DynamicArrayAuto<T>& out, Bool& attribPresent) const
  48. {
  49. CString txtVal;
  50. ANKI_CHECK(getAttributeTextOptional(name, txtVal, attribPresent));
  51. if(txtVal && attribPresent)
  52. {
  53. return parseNumbers(txtVal, out);
  54. }
  55. else
  56. {
  57. return Error::NONE;
  58. }
  59. }
  60. template<typename TArray>
  61. Error XmlElement::getAttributeNumbersOptional(CString name, TArray& out, Bool& attribPresent) const
  62. {
  63. CString txtVal;
  64. ANKI_CHECK(getAttributeTextOptional(name, txtVal, attribPresent));
  65. if(txtVal && attribPresent)
  66. {
  67. return parseNumbers(txtVal, out);
  68. }
  69. else
  70. {
  71. return Error::NONE;
  72. }
  73. }
  74. template<typename T>
  75. Error XmlElement::getAttributeNumberOptional(CString name, T& out, Bool& attribPresent) const
  76. {
  77. DynamicArrayAuto<T> arr(m_alloc);
  78. ANKI_CHECK(getAttributeNumbersOptional(name, arr, attribPresent));
  79. if(attribPresent)
  80. {
  81. if(arr.getSize() != 1)
  82. {
  83. ANKI_UTIL_LOGE("Expecting one element for attrib: %s", &name[0]);
  84. return Error::USER_DATA;
  85. }
  86. out = arr[0];
  87. }
  88. return Error::NONE;
  89. }
  90. template<typename T>
  91. Error XmlElement::parseNumbers(CString txt, DynamicArrayAuto<T>& out) const
  92. {
  93. ANKI_ASSERT(txt);
  94. ANKI_ASSERT(m_el);
  95. StringListAuto list(m_alloc);
  96. list.splitString(txt, ' ');
  97. out.destroy();
  98. out.create(U32(list.getSize()));
  99. Error err = Error::NONE;
  100. auto it = list.getBegin();
  101. auto end = list.getEnd();
  102. U32 i = 0;
  103. while(it != end && !err)
  104. {
  105. err = it->toNumber(out[i++]);
  106. ++it;
  107. }
  108. if(err)
  109. {
  110. ANKI_UTIL_LOGE("Failed to covert to numbers the element: %s", m_el->Value());
  111. }
  112. return err;
  113. }
  114. template<typename TArray>
  115. Error XmlElement::parseNumbers(CString txt, TArray& out) const
  116. {
  117. ANKI_ASSERT(!txt.isEmpty());
  118. ANKI_ASSERT(m_el);
  119. StringListAuto list(m_alloc);
  120. list.splitString(txt, ' ');
  121. const PtrSize listSize = list.getSize();
  122. if(listSize != out.getSize())
  123. {
  124. ANKI_UTIL_LOGE("Wrong number of elements for element: %s", m_el->Value());
  125. return Error::USER_DATA;
  126. }
  127. Error err = Error::NONE;
  128. auto it = list.getBegin();
  129. auto end = list.getEnd();
  130. U32 i = 0;
  131. while(it != end && !err)
  132. {
  133. err = it->toNumber(out[i++]);
  134. ++it;
  135. }
  136. if(err)
  137. {
  138. ANKI_UTIL_LOGE("Failed to covert to numbers the element: %s", m_el->Value());
  139. }
  140. return err;
  141. }
  142. } // end namespace anki