25 #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
29 virtual ~DefaultValueArrayAllocator()
33 virtual ValueInternalArray *newArray()
35 return new ValueInternalArray();
38 virtual ValueInternalArray *newArrayCopy(
const ValueInternalArray &other )
40 return new ValueInternalArray( other );
43 virtual void destructArray( ValueInternalArray *array )
48 virtual void reallocateArrayPageIndex( Value **&indexes,
53 if ( minNewIndexCount > newIndexCount )
54 newIndexCount = minNewIndexCount;
55 void *newIndexes = realloc( indexes,
sizeof(Value*) * newIndexCount );
57 indexCount = newIndexCount;
58 indexes = static_cast<Value **>( newIndexes );
60 virtual void releaseArrayPageIndex( Value **indexes,
67 virtual Value *allocateArrayPage()
72 virtual void releaseArrayPage( Value *value )
79 #else // #ifdef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
80 class DefaultValueArrayAllocator :
public ValueArrayAllocator
84 virtual ~DefaultValueArrayAllocator()
88 virtual ValueInternalArray *newArray()
90 ValueInternalArray *array = arraysAllocator_.allocate();
91 new (array) ValueInternalArray();
95 virtual ValueInternalArray *newArrayCopy(
const ValueInternalArray &other )
97 ValueInternalArray *array = arraysAllocator_.allocate();
98 new (array) ValueInternalArray( other );
102 virtual void destructArray( ValueInternalArray *array )
106 array->~ValueInternalArray();
107 arraysAllocator_.release( array );
111 virtual void reallocateArrayPageIndex( Value **&indexes,
116 if ( minNewIndexCount > newIndexCount )
117 newIndexCount = minNewIndexCount;
118 void *newIndexes = realloc( indexes,
sizeof(Value*) * newIndexCount );
120 indexCount = newIndexCount;
121 indexes = static_cast<Value **>( newIndexes );
123 virtual void releaseArrayPageIndex( Value **indexes,
130 virtual Value *allocateArrayPage()
132 return static_cast<Value *>( pagesAllocator_.allocate() );
135 virtual void releaseArrayPage( Value *value )
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_);
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 )
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
227 it.array_ = const_cast<ValueInternalArray *>(
this );
228 it.currentItemIndex_ = 0;
229 it.currentPageIndex_ = pages_;
234 ValueInternalArray::makeIterator( IteratorState &it,
ArrayIndex index )
const
236 it.array_ = const_cast<ValueInternalArray *>(
this );
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 )
369 JSON_ASSERT_MESSAGE( pageCount_ >= minNewPages,
"ValueInternalArray::reserve(): bad reallocation" );
376 if ( nextPageIndex <= index )
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 )