5 #define JSON_ASSERT_UNIQUE(x) JSON_ASSERT(internal -> refcount == 1, json_string(JSON_TEXT(x)) + JSON_TEXT(" in non single reference"))
7 #define JSON_ASSERT_UNIQUE(x) (void)0
10 #ifdef JSON_MUTEX_CALLBACKS
11 #define JSON_MUTEX_COPY2 ,internal -> mylock
13 #define JSON_MUTEX_COPY2
16 JSONNode::json_iterator JSONNode::find(
const json_string & name_t) json_nothrow {
17 JSON_CHECK_INTERNAL();
18 JSON_ASSERT(type() == JSON_NODE, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"find"));
20 if (JSONNode ** res =
internal -> at(name_t)){
21 return ptr_to_json_iterator(res);
26 #ifdef JSON_CASE_INSENSITIVE_FUNCTIONS
27 JSONNode::json_iterator JSONNode::find_nocase(
const json_string & name_t) json_nothrow {
28 JSON_CHECK_INTERNAL();
29 JSON_ASSERT(type() == JSON_NODE, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"find_nocase"));
31 if (JSONNode ** res =
internal -> at_nocase(name_t)){
32 return ptr_to_json_iterator(res);
38 JSONNode::json_iterator JSONNode::erase(json_iterator pos) json_nothrow {
39 JSON_CHECK_INTERNAL();
40 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"erase"));
41 JSON_ASSERT_UNIQUE(
"erase 1");
42 JSON_ASSERT_SAFE(pos < end(), JSON_TEXT(
"erase out of range"),
return end(););
43 JSON_ASSERT_SAFE(pos >= begin(), JSON_TEXT(
"erase out of range"),
return begin(););
44 deleteJSONNode(*(json_iterator_ptr(pos)));
45 internal -> CHILDREN -> erase(json_iterator_ptr(pos));
46 return (empty()) ? end() : pos;
49 JSONNode::json_iterator JSONNode::erase(json_iterator _start,
const json_iterator & _end) json_nothrow {
50 if (_start == _end)
return _start;
51 JSON_CHECK_INTERNAL();
52 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"erase"));
53 JSON_ASSERT_UNIQUE(
"erase 3");
54 JSON_ASSERT_SAFE(_start <= end(), JSON_TEXT(
"erase out of lo range"),
return end(););
55 JSON_ASSERT_SAFE(_end <= end(), JSON_TEXT(
"erase out of hi range"),
return end(););
56 JSON_ASSERT_SAFE(_start >= begin(), JSON_TEXT(
"erase out of lo range"),
return begin(););
57 JSON_ASSERT_SAFE(_end >= begin(), JSON_TEXT(
"erase out of hi range"),
return begin(););
58 for (JSONNode ** pos = json_iterator_ptr(_start); pos < json_iterator_ptr(_end); ++pos){
62 internal -> CHILDREN -> erase(json_iterator_ptr(_start), (json_index_t)(json_iterator_ptr(_end) - json_iterator_ptr(_start)));
63 return (empty()) ? end() : _start;
67 JSONNode::json_iterator JSONNode::insert(json_iterator pos, JSONNode * x) json_nothrow {
69 JSONNode::json_iterator JSONNode::insert(json_iterator pos,
const JSONNode & x) json_nothrow {
71 JSON_CHECK_INTERNAL();
72 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"insert"));
73 JSON_ASSERT_UNIQUE(
"insert 1");
74 if (json_iterator_ptr(pos) >=
internal -> CHILDREN -> end()){
75 internal -> push_back(x);
78 JSON_ASSERT_SAFE(pos >= begin(), JSON_TEXT(
"insert out of lo range"),
return begin(););
80 internal -> CHILDREN -> insert(json_iterator_ptr(pos), x);
82 internal -> CHILDREN -> insert(json_iterator_ptr(pos), newJSONNode(x));
87 JSONNode::json_iterator JSONNode::insertFFF(json_iterator pos, JSONNode **
const _start, JSONNode **
const _end) json_nothrow {
88 JSON_CHECK_INTERNAL();
89 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"insertFFF"));
90 JSON_ASSERT_UNIQUE(
"insertFFF");
91 JSON_ASSERT_SAFE(pos <= end(), JSON_TEXT(
"insert out of high range"),
return end(););
92 JSON_ASSERT_SAFE(pos >= begin(), JSON_TEXT(
"insert out of low range"),
return begin(););
93 const json_index_t num = (json_index_t)(_end - _start);
94 json_auto<JSONNode *> mem(num);
95 JSONNode ** runner = mem.ptr;
96 for (JSONNode ** po = _start; po < _end; ++po){
97 *runner++ = newJSONNode(*(*po) JSON_MUTEX_COPY2);
99 internal -> CHILDREN -> insert(json_iterator_ptr(pos), mem.ptr, num);
104 JSONNode::const_iterator JSONNode::find(
const json_string & name_t)
const json_nothrow {
105 JSON_CHECK_INTERNAL();
106 JSON_ASSERT(type() == JSON_NODE, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"find"));
107 if (JSONNode ** res =
internal -> at(name_t)){
108 return JSONNode::const_iterator(res);
110 return JSONNode::const_iterator(
internal -> end());
113 #ifdef JSON_CASE_INSENSITIVE_FUNCTIONS
114 JSONNode::const_iterator JSONNode::find_nocase(
const json_string & name_t)
const json_nothrow {
115 JSON_CHECK_INTERNAL();
116 JSON_ASSERT(type() == JSON_NODE, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"find_nocase"));
117 if (JSONNode ** res =
internal -> at_nocase(name_t)){
118 return JSONNode::const_iterator(res);
120 return JSONNode::const_iterator(
internal -> end());
124 JSONNode::reverse_iterator JSONNode::erase(reverse_iterator pos) json_nothrow {
125 JSON_CHECK_INTERNAL();
126 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"erase"));
127 JSON_ASSERT_UNIQUE(
"erase 2");
128 JSON_ASSERT_SAFE(pos < rend(), JSON_TEXT(
"erase out of range"),
return rend(););
129 JSON_ASSERT_SAFE(pos >= rbegin(), JSON_TEXT(
"erase out of range"),
return rbegin(););
130 deleteJSONNode(*(pos.it));
131 internal -> CHILDREN -> erase(pos.it);
132 return (empty()) ? rend() : pos + 1;
135 JSONNode::reverse_iterator JSONNode::erase(reverse_iterator _start,
const reverse_iterator & _end) json_nothrow {
136 if (_start == _end)
return _start;
137 JSON_CHECK_INTERNAL();
138 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"erase"));
139 JSON_ASSERT_UNIQUE(
"erase 4");
140 JSON_ASSERT_SAFE(_start <= rend(), JSON_TEXT(
"erase out of lo range"),
return rend(););
141 JSON_ASSERT_SAFE(_end <= rend(), JSON_TEXT(
"erase out of hi range"),
return rend(););
142 JSON_ASSERT_SAFE(_start >= rbegin(), JSON_TEXT(
"erase out of lo range"),
return rbegin(););
143 JSON_ASSERT_SAFE(_end >= rbegin(), JSON_TEXT(
"erase out of hi range"),
return rbegin(););
144 for (JSONNode ** pos = _start.it; pos > _end.it; --pos){
145 deleteJSONNode(*pos);
147 const json_index_t num = (json_index_t)(_start.it - _end.it);
148 internal -> CHILDREN -> erase(_end.it + 1, num, _start.it);
149 return (empty()) ? rend() : _start + num;
152 JSONNode::reverse_iterator JSONNode::insert(reverse_iterator pos,
const JSONNode & x) json_nothrow {
153 JSON_CHECK_INTERNAL();
154 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"insert"));
155 JSON_ASSERT_UNIQUE(
"insert 1");
156 if (pos.it < internal -> CHILDREN -> begin()){
157 internal -> push_front(x);
160 JSON_ASSERT_SAFE(pos >= rbegin(), JSON_TEXT(
"insert out of range"),
return rbegin(););
161 internal -> CHILDREN -> insert(++pos.it, newJSONNode(x),
true);
165 JSONNode::reverse_iterator JSONNode::insertRFF(reverse_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(
"insertRFF"));
168 JSON_ASSERT_UNIQUE(
"insert RFF");
169 JSON_ASSERT_SAFE(pos <= rend(), JSON_TEXT(
"insert out of range"),
return rend(););
170 JSON_ASSERT_SAFE(pos >= rbegin(), JSON_TEXT(
"insert out of range"),
return rbegin(););
171 const json_index_t num = (json_index_t)(_end - _start);
172 json_auto<JSONNode *> mem(num);
173 JSONNode ** runner = mem.ptr + num;
174 for (JSONNode ** po = _start; po < _end; ++po){
175 *(--runner) = newJSONNode(*(*po) JSON_MUTEX_COPY2);
177 internal -> CHILDREN -> insert(++pos.it, mem.ptr, num);
178 return pos - num + 1;
181 JSONNode::iterator JSONNode::insertFRR(json_iterator pos, JSONNode **
const _start, JSONNode **
const _end) json_nothrow {
182 JSON_CHECK_INTERNAL();
183 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"insertFRR"));
184 JSON_ASSERT_UNIQUE(
"insert FRR");
185 JSON_ASSERT_SAFE(pos <= end(), JSON_TEXT(
"insert out of range"),
return end(););
186 JSON_ASSERT_SAFE(pos >= begin(), JSON_TEXT(
"insert out of range"),
return begin(););
187 const json_index_t num = (json_index_t)(_start - _end);
188 json_auto<JSONNode *> mem(num);
189 JSONNode ** runner = mem.ptr;
190 for (JSONNode ** po = _start; po > _end; --po){
191 *runner++ = newJSONNode(*(*po) JSON_MUTEX_COPY2);
193 internal -> CHILDREN -> insert(pos.it, mem.ptr, num);
197 JSONNode::reverse_iterator JSONNode::insertRRR(reverse_iterator pos, JSONNode **
const _start, JSONNode **
const _end) json_nothrow {
198 JSON_CHECK_INTERNAL();
199 JSON_ASSERT(type() == JSON_NODE || type() == JSON_ARRAY, json_global(ERROR_NON_ITERATABLE) + JSON_TEXT(
"insertRRR"));
200 JSON_ASSERT_UNIQUE(
"insert RRR");
201 JSON_ASSERT_SAFE(pos <= rend(), JSON_TEXT(
"insert out of range"),
return rend(););
202 JSON_ASSERT_SAFE(pos >= rbegin(), JSON_TEXT(
"insert out of range"),
return rbegin(););
203 const json_index_t num = (json_index_t)(_start - _end);
204 json_auto<JSONNode *> mem(num);
205 JSONNode ** runner = mem.ptr;
206 for (JSONNode ** po = _start; po > _end; --po){
207 *runner++ = newJSONNode(*(*po) JSON_MUTEX_COPY2);
209 internal -> CHILDREN -> insert(++pos.it, mem.ptr, num);
210 return pos - num + 1;