2
0

JSONIterators.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "JSONNode.h"
  2. #ifdef JSON_ITERATORS
  3. #ifdef JSON_REF_COUNT
  4. #define JSON_ASSERT_UNIQUE(x) JSON_ASSERT(internal -> refcount == 1, json_string(JSON_TEXT(x)) + JSON_TEXT(" in non single reference"))
  5. #else
  6. #define JSON_ASSERT_UNIQUE(x) (void)0
  7. #endif
  8. #ifdef JSON_MUTEX_CALLBACKS
  9. #define JSON_MUTEX_COPY2 ,internal -> mylock
  10. #else
  11. #define JSON_MUTEX_COPY2
  12. #endif
  13. JSONNode::json_iterator JSONNode::find(const json_string & name_t) json_nothrow {
  14. JSON_CHECK_INTERNAL();
  15. JSON_ASSERT(type() == JSON_NODE, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("find"));
  16. makeUniqueInternal();
  17. if (JSONNode ** res = internal -> at(name_t)){
  18. return ptr_to_json_iterator(res);
  19. }
  20. return end();
  21. }
  22. #ifdef JSON_CASE_INSENSITIVE_FUNCTIONS
  23. JSONNode::json_iterator JSONNode::find_nocase(const json_string & name_t) json_nothrow {
  24. JSON_CHECK_INTERNAL();
  25. JSON_ASSERT(type() == JSON_NODE, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("find_nocase"));
  26. makeUniqueInternal();
  27. if (JSONNode ** res = internal -> at_nocase(name_t)){
  28. return ptr_to_json_iterator(res);
  29. }
  30. return end();
  31. }
  32. #endif
  33. JSONNode::json_iterator JSONNode::erase(json_iterator pos) json_nothrow {
  34. JSON_CHECK_INTERNAL();
  35. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("erase"));
  36. JSON_ASSERT_UNIQUE("erase 1");
  37. JSON_ASSERT_SAFE(pos < end(), JSON_TEXT("erase out of range"), return end(););
  38. JSON_ASSERT_SAFE(pos >= begin(), JSON_TEXT("erase out of range"), return begin(););
  39. deleteJSONNode(*(json_iterator_ptr(pos)));
  40. internal -> CHILDREN -> erase(json_iterator_ptr(pos));
  41. return (empty()) ? end() : pos;
  42. }
  43. JSONNode::json_iterator JSONNode::erase(json_iterator _start, const json_iterator & _end) json_nothrow {
  44. if (_start == _end) return _start;
  45. JSON_CHECK_INTERNAL();
  46. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("erase"));
  47. JSON_ASSERT_UNIQUE("erase 3");
  48. JSON_ASSERT_SAFE(_start <= end(), JSON_TEXT("erase out of lo range"), return end(););
  49. JSON_ASSERT_SAFE(_end <= end(), JSON_TEXT("erase out of hi range"), return end(););
  50. JSON_ASSERT_SAFE(_start >= begin(), JSON_TEXT("erase out of lo range"), return begin(););
  51. JSON_ASSERT_SAFE(_end >= begin(), JSON_TEXT("erase out of hi range"), return begin(););
  52. for (JSONNode ** pos = json_iterator_ptr(_start); pos < json_iterator_ptr(_end); ++pos){
  53. deleteJSONNode(*pos);
  54. }
  55. internal -> CHILDREN -> erase(json_iterator_ptr(_start), (json_index_t)(json_iterator_ptr(_end) - json_iterator_ptr(_start)));
  56. return (empty()) ? end() : _start;
  57. }
  58. #ifdef JSON_LIBRARY
  59. JSONNode::json_iterator JSONNode::insert(json_iterator pos, JSONNode * x) json_nothrow {
  60. #else
  61. JSONNode::json_iterator JSONNode::insert(json_iterator pos, const JSONNode & x) json_nothrow {
  62. #endif
  63. JSON_CHECK_INTERNAL();
  64. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("insert"));
  65. JSON_ASSERT_UNIQUE("insert 1");
  66. if (json_iterator_ptr(pos) >= internal -> CHILDREN -> end()){
  67. internal -> push_back(x);
  68. return end() - 1;
  69. }
  70. JSON_ASSERT_SAFE(pos >= begin(), JSON_TEXT("insert out of lo range"), return begin(););
  71. #ifdef JSON_LIBRARY
  72. internal -> CHILDREN -> insert(json_iterator_ptr(pos), x);
  73. #else
  74. internal -> CHILDREN -> insert(json_iterator_ptr(pos), newJSONNode(x));
  75. #endif
  76. return pos;
  77. }
  78. JSONNode::json_iterator JSONNode::insertFFF(json_iterator pos, JSONNode ** const _start, JSONNode ** const _end) json_nothrow {
  79. JSON_CHECK_INTERNAL();
  80. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("insertFFF"));
  81. JSON_ASSERT_UNIQUE("insertFFF");
  82. JSON_ASSERT_SAFE(pos <= end(), JSON_TEXT("insert out of high range"), return end(););
  83. JSON_ASSERT_SAFE(pos >= begin(), JSON_TEXT("insert out of low range"), return begin(););
  84. const json_index_t num = (json_index_t)(_end - _start);
  85. json_auto<JSONNode *> mem(num);
  86. JSONNode ** runner = mem.ptr;
  87. for (JSONNode ** po = _start; po < _end; ++po){
  88. *runner++ = newJSONNode(*(*po) JSON_MUTEX_COPY2);
  89. }
  90. internal -> CHILDREN -> insert(json_iterator_ptr(pos), mem.ptr, num);
  91. return pos;
  92. }
  93. #ifndef JSON_LIBRARY
  94. JSONNode::const_iterator JSONNode::find(const json_string & name_t) const json_nothrow {
  95. JSON_CHECK_INTERNAL();
  96. JSON_ASSERT(type() == JSON_NODE, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("find"));
  97. if (JSONNode ** res = internal -> at(name_t)){
  98. return JSONNode::const_iterator(res);
  99. }
  100. return JSONNode::const_iterator(internal -> end());
  101. }
  102. #ifdef JSON_CASE_INSENSITIVE_FUNCTIONS
  103. JSONNode::const_iterator JSONNode::find_nocase(const json_string & name_t) const json_nothrow {
  104. JSON_CHECK_INTERNAL();
  105. JSON_ASSERT(type() == JSON_NODE, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("find_nocase"));
  106. if (JSONNode ** res = internal -> at_nocase(name_t)){
  107. return JSONNode::const_iterator(res);
  108. }
  109. return JSONNode::const_iterator(internal -> end());
  110. }
  111. #endif
  112. JSONNode::reverse_iterator JSONNode::erase(reverse_iterator pos) json_nothrow {
  113. JSON_CHECK_INTERNAL();
  114. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("erase"));
  115. JSON_ASSERT_UNIQUE("erase 2");
  116. JSON_ASSERT_SAFE(pos < rend(), JSON_TEXT("erase out of range"), return rend(););
  117. JSON_ASSERT_SAFE(pos >= rbegin(), JSON_TEXT("erase out of range"), return rbegin(););
  118. deleteJSONNode(*(pos.it));
  119. internal -> CHILDREN -> erase(pos.it);
  120. return (empty()) ? rend() : pos + 1;
  121. }
  122. JSONNode::reverse_iterator JSONNode::erase(reverse_iterator _start, const reverse_iterator & _end) json_nothrow {
  123. if (_start == _end) return _start;
  124. JSON_CHECK_INTERNAL();
  125. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("erase"));
  126. JSON_ASSERT_UNIQUE("erase 4");
  127. JSON_ASSERT_SAFE(_start <= rend(), JSON_TEXT("erase out of lo range"), return rend(););
  128. JSON_ASSERT_SAFE(_end <= rend(), JSON_TEXT("erase out of hi range"), return rend(););
  129. JSON_ASSERT_SAFE(_start >= rbegin(), JSON_TEXT("erase out of lo range"), return rbegin(););
  130. JSON_ASSERT_SAFE(_end >= rbegin(), JSON_TEXT("erase out of hi range"), return rbegin(););
  131. for (JSONNode ** pos = _start.it; pos > _end.it; --pos){
  132. deleteJSONNode(*pos);
  133. }
  134. const json_index_t num = (json_index_t)(_start.it - _end.it);
  135. internal -> CHILDREN -> erase(_end.it + 1, num, _start.it);
  136. return (empty()) ? rend() : _start + num;
  137. }
  138. JSONNode::reverse_iterator JSONNode::insert(reverse_iterator pos, const JSONNode & x) json_nothrow {
  139. JSON_CHECK_INTERNAL();
  140. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("insert"));
  141. JSON_ASSERT_UNIQUE("insert 1");
  142. if (pos.it < internal -> CHILDREN -> begin()){
  143. internal -> push_front(x);
  144. return rend() - 1;
  145. }
  146. JSON_ASSERT_SAFE(pos >= rbegin(), JSON_TEXT("insert out of range"), return rbegin(););
  147. internal -> CHILDREN -> insert(++pos.it, newJSONNode(x), true);
  148. return pos;
  149. }
  150. JSONNode::reverse_iterator JSONNode::insertRFF(reverse_iterator pos, JSONNode ** const _start, JSONNode ** const _end) json_nothrow {
  151. JSON_CHECK_INTERNAL();
  152. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("insertRFF"));
  153. JSON_ASSERT_UNIQUE("insert RFF");
  154. JSON_ASSERT_SAFE(pos <= rend(), JSON_TEXT("insert out of range"), return rend(););
  155. JSON_ASSERT_SAFE(pos >= rbegin(), JSON_TEXT("insert out of range"), return rbegin(););
  156. const json_index_t num = (json_index_t)(_end - _start);
  157. json_auto<JSONNode *> mem(num);
  158. JSONNode ** runner = mem.ptr + num;
  159. for (JSONNode ** po = _start; po < _end; ++po){ //fill it backwards
  160. *(--runner) = newJSONNode(*(*po) JSON_MUTEX_COPY2);
  161. }
  162. internal -> CHILDREN -> insert(++pos.it, mem.ptr, num);
  163. return pos - num + 1;
  164. }
  165. JSONNode::iterator JSONNode::insertFRR(json_iterator pos, JSONNode ** const _start, JSONNode ** const _end) json_nothrow {
  166. JSON_CHECK_INTERNAL();
  167. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("insertFRR"));
  168. JSON_ASSERT_UNIQUE("insert FRR");
  169. JSON_ASSERT_SAFE(pos <= end(), JSON_TEXT("insert out of range"), return end(););
  170. JSON_ASSERT_SAFE(pos >= begin(), JSON_TEXT("insert out of range"), return begin(););
  171. const json_index_t num = (json_index_t)(_start - _end);
  172. json_auto<JSONNode *> mem(num);
  173. JSONNode ** runner = mem.ptr;
  174. for (JSONNode ** po = _start; po > _end; --po){
  175. *runner++ = newJSONNode(*(*po) JSON_MUTEX_COPY2);
  176. }
  177. internal -> CHILDREN -> insert(pos.it, mem.ptr, num);
  178. return pos;
  179. }
  180. JSONNode::reverse_iterator JSONNode::insertRRR(reverse_iterator pos, JSONNode ** const _start, JSONNode ** const _end) json_nothrow {
  181. JSON_CHECK_INTERNAL();
  182. JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT("insertRRR"));
  183. JSON_ASSERT_UNIQUE("insert RRR");
  184. JSON_ASSERT_SAFE(pos <= rend(), JSON_TEXT("insert out of range"), return rend(););
  185. JSON_ASSERT_SAFE(pos >= rbegin(), JSON_TEXT("insert out of range"), return rbegin(););
  186. const json_index_t num = (json_index_t)(_start - _end);
  187. json_auto<JSONNode *> mem(num);
  188. JSONNode ** runner = mem.ptr;
  189. for (JSONNode ** po = _start; po > _end; --po){
  190. *runner++ = newJSONNode(*(*po) JSON_MUTEX_COPY2);
  191. }
  192. internal -> CHILDREN -> insert(++pos.it, mem.ptr, num);
  193. return pos - num + 1;
  194. }
  195. #endif
  196. #endif