25 #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 29 virtual ~DefaultValueArrayAllocator()
53 if ( minNewIndexCount > newIndexCount )
54 newIndexCount = minNewIndexCount;
55 void *newIndexes = realloc( indexes,
sizeof(
Value*) * newIndexCount );
57 indexCount = newIndexCount;
58 indexes =
static_cast<Value **
>( newIndexes );
79 #else // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 84 virtual ~DefaultValueArrayAllocator()
107 arraysAllocator_.release( array );
116 if ( minNewIndexCount > newIndexCount )
117 newIndexCount = minNewIndexCount;
118 void *newIndexes = realloc( indexes,
sizeof(
Value*) * newIndexCount );
120 indexCount = newIndexCount;
121 indexes =
static_cast<Value **
>( newIndexes );
132 return static_cast<Value *
>( pagesAllocator_.allocate() );
138 pagesAllocator_.release( value );
141 BatchAllocator<ValueInternalArray,1> arraysAllocator_;
142 BatchAllocator<Value,ValueInternalArray::itemsPerPage> pagesAllocator_;
144 #endif // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 148 static DefaultValueArrayAllocator defaultAllocator;
153 static struct DummyArrayAllocatorInitializer {
154 DummyArrayAllocatorInitializer()
164 ValueInternalArray::equals(
const IteratorState &x,
165 const IteratorState &other )
167 return x.array_ == other.array_
168 && x.currentItemIndex_ == other.currentItemIndex_
169 && x.currentPageIndex_ == other.currentPageIndex_;
174 ValueInternalArray::increment( IteratorState &it )
177 (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_
179 "ValueInternalArray::increment(): moving iterator beyond end" );
180 ++(it.currentItemIndex_);
181 if ( it.currentItemIndex_ == itemsPerPage )
183 it.currentItemIndex_ = 0;
184 ++(it.currentPageIndex_);
190 ValueInternalArray::decrement( IteratorState &it )
193 && it.currentItemIndex_ == 0,
194 "ValueInternalArray::decrement(): moving iterator beyond end" );
195 if ( it.currentItemIndex_ == 0 )
197 it.currentItemIndex_ = itemsPerPage-1;
198 --(it.currentPageIndex_);
202 --(it.currentItemIndex_);
208 ValueInternalArray::unsafeDereference(
const IteratorState &it )
210 return (*(it.currentPageIndex_))[it.currentItemIndex_];
215 ValueInternalArray::dereference(
const IteratorState &it )
218 (it.currentPageIndex_ - it.array_->pages_)*itemsPerPage + it.currentItemIndex_
220 "ValueInternalArray::dereference(): dereferencing invalid iterator" );
221 return unsafeDereference( it );
225 ValueInternalArray::makeBeginIterator( IteratorState &it )
const 228 it.currentItemIndex_ = 0;
229 it.currentPageIndex_ = pages_;
234 ValueInternalArray::makeIterator( IteratorState &it,
ArrayIndex index )
const 237 it.currentItemIndex_ = index % itemsPerPage;
238 it.currentPageIndex_ = pages_ + index / itemsPerPage;
243 ValueInternalArray::makeEndIterator( IteratorState &it )
const 245 makeIterator( it, size_ );
259 , size_( other.size_ )
265 "ValueInternalArray::reserve(): bad reallocation" );
266 IteratorState itOther;
267 other.makeBeginIterator( itOther );
269 for (
ArrayIndex index = 0; index < size_; ++index, increment(itOther) )
275 pages_[pageIndex] = value;
277 new (value)
Value( dereference( itOther ) );
296 makeBeginIterator( it);
297 makeEndIterator( itEnd );
298 for ( ; !equals(it,itEnd); increment(it) )
300 Value *value = &dereference(it);
305 for (
PageIndex pageIndex = 0; pageIndex < lastPageIndex; ++pageIndex )
315 Value **tempPages = pages_;
316 pages_ = other.pages_;
317 other.pages_ = tempPages;
320 other.size_ = tempSize;
322 pageCount_ = other.pageCount_;
323 other.pageCount_ = tempPageCount;
339 else if ( newSize < size_ )
343 makeIterator( it, newSize );
344 makeIterator( itEnd, size_ );
345 for ( ; !equals(it,itEnd); increment(it) )
347 Value *value = &dereference(it);
352 for ( ; pageIndex < lastPageIndex; ++pageIndex )
356 else if ( newSize > size_ )
362 ValueInternalArray::makeIndexValid(
ArrayIndex index )
367 PageIndex minNewPages = (index + 1) / itemsPerPage;
369 JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages,
"ValueInternalArray::reserve(): bad reallocation" );
374 (size_ %
itemsPerPage) != 0 ? size_ - (size_%itemsPerPage) + itemsPerPage
376 if ( nextPageIndex <= index )
379 PageIndex pageToAllocate = (index - nextPageIndex) / itemsPerPage + 1;
380 for ( ; pageToAllocate-- > 0; ++pageIndex )
387 makeIterator( it, size_ );
389 makeIterator( itEnd, size_ );
390 for ( ; !equals(it,itEnd); increment(it) )
392 Value *value = &dereference(it);
400 if ( index >= size_ )
401 makeIndexValid( index );
408 if ( index >= size_ )
420 ValueInternalArray::distance(
const IteratorState &x,
const IteratorState &y )
422 return indexOf(y) - indexOf(x);
427 ValueInternalArray::indexOf(
const IteratorState &iterator )
429 if ( !iterator.array_ )
432 (iterator.currentPageIndex_ - iterator.array_->pages_) *
itemsPerPage 433 + iterator.currentItemIndex_ );
440 int sizeDiff( size_ - other.size_ );
444 for (
ArrayIndex index =0; index < size_; ++index )
Experimental: do not use.
int compare(const ValueInternalArray &other) const
#define JSON_ASSERT_MESSAGE(condition, message)
Value & resolveReference(ArrayIndex index)
virtual void reallocateArrayPageIndex(Value **&indexes, ValueInternalArray::PageIndex &indexCount, ValueInternalArray::PageIndex minNewIndexCount)=0
Reallocate array page index.
int compare(const Value &other) const
static struct Json::DummyArrayAllocatorInitializer dummyArrayAllocatorInitializer
Value::ArrayIndex ArrayIndex
static ValueArrayAllocator *& arrayAllocator()
void swap(ValueInternalArray &other)
virtual void destructArray(ValueInternalArray *array)=0
virtual ~ValueArrayAllocator()
ValueInternalArray & operator=(const ValueInternalArray &other)
virtual ValueInternalArray * newArray()=0
virtual ValueInternalArray * newArrayCopy(const ValueInternalArray &other)=0
void resize(ArrayIndex newSize)
JSON (JavaScript Object Notation).
Value * find(ArrayIndex index) const
A simplified deque implementation used internally by Value.
virtual Value * allocateArrayPage()=0
virtual void releaseArrayPage(Value *value)=0
virtual void releaseArrayPageIndex(Value **indexes, ValueInternalArray::PageIndex indexCount)=0