Xml.inl.h 3.2 KB

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