parser.ixx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // file : xml/parser.ixx
  2. // copyright : Copyright (c) 2013-2014 Code Synthesis Tools CC
  3. // license : MIT; see accompanying LICENSE file
  4. #include <cassert>
  5. #include <xml/value-traits>
  6. namespace xml
  7. {
  8. inline parser::
  9. parser (std::istream& is, const std::string& iname, feature_type f)
  10. : size_ (0), iname_ (iname), feature_ (f)
  11. {
  12. data_.is = &is;
  13. init ();
  14. }
  15. inline parser::
  16. parser (const void* data,
  17. std::size_t size,
  18. const std::string& iname,
  19. feature_type f)
  20. : size_ (size), iname_ (iname), feature_ (f)
  21. {
  22. assert (data != 0 && size != 0);
  23. data_.buf = data;
  24. init ();
  25. }
  26. inline parser::event_type parser::
  27. peek ()
  28. {
  29. if (state_ == state_peek)
  30. return event_;
  31. else
  32. {
  33. event_type e (next_ (true));
  34. state_ = state_peek; // Set it after the call to next_().
  35. return e;
  36. }
  37. }
  38. template <typename T>
  39. inline T parser::
  40. value () const
  41. {
  42. return value_traits<T>::parse (value (), *this);
  43. }
  44. inline const std::string& parser::
  45. attribute (const std::string& n) const
  46. {
  47. return attribute (qname_type (n));
  48. }
  49. template <typename T>
  50. inline T parser::
  51. attribute (const std::string& n) const
  52. {
  53. return attribute<T> (qname_type (n));
  54. }
  55. inline std::string parser::
  56. attribute (const std::string& n, const std::string& dv) const
  57. {
  58. return attribute (qname_type (n), dv);
  59. }
  60. template <typename T>
  61. inline T parser::
  62. attribute (const std::string& n, const T& dv) const
  63. {
  64. return attribute<T> (qname_type (n), dv);
  65. }
  66. template <typename T>
  67. inline T parser::
  68. attribute (const qname_type& qn) const
  69. {
  70. return value_traits<T>::parse (attribute (qn), *this);
  71. }
  72. inline bool parser::
  73. attribute_present (const std::string& n) const
  74. {
  75. return attribute_present (qname_type (n));
  76. }
  77. inline const parser::attribute_map_type& parser::
  78. attribute_map () const
  79. {
  80. if (const element_entry* e = get_element ())
  81. {
  82. e->attr_unhandled_ = 0; // Assume all handled.
  83. return e->attr_map_;
  84. }
  85. return empty_attr_map_;
  86. }
  87. inline void parser::
  88. next_expect (event_type e, const qname_type& qn)
  89. {
  90. next_expect (e, qn.namespace_ (), qn.name ());
  91. }
  92. inline void parser::
  93. next_expect (event_type e, const std::string& n)
  94. {
  95. next_expect (e, std::string (), n);
  96. }
  97. inline void parser::
  98. next_expect (event_type e, const qname_type& qn, content_type c)
  99. {
  100. next_expect (e, qn);
  101. assert (e == start_element);
  102. content (c);
  103. }
  104. inline void parser::
  105. next_expect (event_type e, const std::string& n, content_type c)
  106. {
  107. next_expect (e, std::string (), n);
  108. assert (e == start_element);
  109. content (c);
  110. }
  111. inline void parser::
  112. next_expect (event_type e,
  113. const std::string& ns, const std::string& n,
  114. content_type c)
  115. {
  116. next_expect (e, ns, n);
  117. assert (e == start_element);
  118. content (c);
  119. }
  120. template <typename T>
  121. inline T parser::
  122. element ()
  123. {
  124. return value_traits<T>::parse (element (), *this);
  125. }
  126. inline std::string parser::
  127. element (const std::string& n)
  128. {
  129. next_expect (start_element, n);
  130. return element ();
  131. }
  132. inline std::string parser::
  133. element (const qname_type& qn)
  134. {
  135. next_expect (start_element, qn);
  136. return element ();
  137. }
  138. template <typename T>
  139. inline T parser::
  140. element (const std::string& n)
  141. {
  142. return value_traits<T>::parse (element (n), *this);
  143. }
  144. template <typename T>
  145. inline T parser::
  146. element (const qname_type& qn)
  147. {
  148. return value_traits<T>::parse (element (qn), *this);
  149. }
  150. inline std::string parser::
  151. element (const std::string& n, const std::string& dv)
  152. {
  153. return element (qname_type (n), dv);
  154. }
  155. template <typename T>
  156. inline T parser::
  157. element (const std::string& n, const T& dv)
  158. {
  159. return element<T> (qname_type (n), dv);
  160. }
  161. inline void parser::
  162. content (content_type c)
  163. {
  164. assert (state_ == state_next);
  165. if (!element_state_.empty () && element_state_.back ().depth == depth_)
  166. element_state_.back ().content = c;
  167. else
  168. element_state_.push_back (element_entry (depth_, c));
  169. }
  170. inline parser::content_type parser::
  171. content () const
  172. {
  173. assert (state_ == state_next);
  174. return
  175. !element_state_.empty () && element_state_.back ().depth == depth_
  176. ? element_state_.back ().content
  177. : content_type (content_type::mixed);
  178. }
  179. inline const parser::element_entry* parser::
  180. get_element () const
  181. {
  182. return element_state_.empty () ? 0 : get_element_ ();
  183. }
  184. }