19 #if !defined(XALANDEQUE_HEADER_GUARD_1357924680) 20 #define XALANDEQUE_HEADER_GUARD_1357924680 34 XALAN_CPP_NAMESPACE_BEGIN
38 template <
class Value>
47 template <
class Value>
56 template <
class Traits,
class XalanDeque>
91 m_deque(iterator.m_deque),
103 m_deque = iterator.m_deque;
104 m_pos = iterator.m_pos;
137 return &(*m_deque[m_pos]);
143 return (*m_deque)[m_pos];
149 return (*m_deque)[m_pos];
167 return m_pos - theRHS.m_pos;
173 return theRHS.m_deque == m_deque &&
174 theRHS.m_pos == m_pos;
180 return !(theRHS == *
this);
186 return m_pos < theRHS.m_pos;
199 template <
class Type,
class ConstructionTraits = MemoryManagedConstructionTraits<Type> >
218 #if defined(XALAN_HAS_STD_ITERATORS) 221 #elif defined(XALAN_RW_NO_CLASS_PARTIAL_SPEC) 228 value_type> reverse_iterator_;
233 const value_type> const_reverse_iterator_;
252 MemoryManager& memoryManager,
253 size_type initialSize = 0,
254 size_type blockSize = 10) :
255 m_memoryManager(&memoryManager),
256 m_blockSize(blockSize),
257 m_blockIndex(memoryManager,
258 initialSize / blockSize + (initialSize % blockSize == 0 ? 0 : 1)),
259 m_freeBlockVector(memoryManager)
261 const ConstructableType defaultValue(*m_memoryManager);
263 XALAN_USING_STD(fill_n)
264 XALAN_USING_STD(back_inserter)
267 back_inserter(*
this),
274 MemoryManager& theMemoryManager) :
275 m_memoryManager(&theMemoryManager),
276 m_blockSize(theRHS.m_blockSize),
277 m_blockIndex(*theRHS.m_memoryManager,
278 theRHS.size() / theRHS.m_blockSize + (theRHS.size() % theRHS.m_blockSize == 0 ? 0 : 1)),
279 m_freeBlockVector(theMemoryManager)
281 XALAN_USING_STD(copy)
282 XALAN_USING_STD(back_inserter)
287 back_inserter(*
this));
292 MemoryManager& theManager,
293 size_type initialSize = 0,
294 size_type blockSize = 10)
298 ThisType*
const theResult =
299 new (theGuard.get()) ThisType(theManager, initialSize, blockSize);
308 destroyBlockList(m_freeBlockVector);
310 destroyBlockList(m_blockIndex);
316 return iterator(
this, 0);
322 return const_iterator(const_cast<XalanDeque*>(
this), 0);
328 return iterator(
this, size());
334 return const_iterator(const_cast<XalanDeque*>(
this), size());
337 const_reverse_iterator
340 return const_reverse_iterator(end());
343 const_reverse_iterator
346 return const_reverse_iterator(begin());
352 return m_blockIndex.empty();
358 if (m_blockIndex.empty())
364 return (m_blockIndex.size() - 1) * m_blockSize
365 + m_blockIndex.back()->size();
372 return m_blockIndex.back()->back();
378 BlockType& block = *m_blockIndex[index / m_blockSize];
380 return block[index % m_blockSize];
386 BlockType& block = *m_blockIndex[index / m_blockSize];
388 return block[index % m_blockSize];
396 m_freeBlockVector.reserve(m_freeBlockVector.size() + m_blockIndex.size());
398 while (iter != m_blockIndex.end())
401 m_freeBlockVector.push_back(*iter);
405 m_blockIndex.clear();
411 if (m_blockIndex.empty() ||
412 m_blockIndex.back()->size() >= m_blockSize)
417 m_blockIndex.back()->push_back(value);
425 BlockType& lastBlock = *m_blockIndex.back();
428 if (lastBlock.
empty())
430 m_freeBlockVector.push_back(&lastBlock);
431 m_blockIndex.pop_back();
438 const ConstructableType defaultValue(*m_memoryManager);
440 if (newSize > size())
442 for (size_type i = 0; i < newSize - size(); ++i)
444 push_back(defaultValue.value);
449 for (size_type i = 0; i < size() - newSize; ++i)
459 MemoryManager*
const temp = m_memoryManager;
460 m_memoryManager = theRHS.m_memoryManager;
461 theRHS.m_memoryManager = temp;
463 theRHS.m_blockIndex.
swap(m_blockIndex);
464 theRHS.m_freeBlockVector.
swap(m_freeBlockVector);
472 XALAN_USING_STD(copy)
473 XALAN_USING_STD(back_inserter)
480 back_inserter(*
this));
489 assert (m_memoryManager != 0);
491 return *m_memoryManager;
502 m_blockIndex.push_back(0);
504 if (m_freeBlockVector.empty())
514 m_blockIndex.back() = m_freeBlockVector.back();
518 m_freeBlockVector.pop_back();
521 assert(m_blockIndex.back() != 0);
525 destroyBlockList(BlockIndexType& theBlockIndex)
528 theBlockIndex.
begin();
530 while (iter != theBlockIndex.
end())
546 MemoryManager* m_memoryManager;
548 const size_type m_blockSize;
550 BlockIndexType m_blockIndex;
551 BlockIndexType m_freeBlockVector;
562 XALAN_CPP_NAMESPACE_END
566 #endif // XALANDEQUE_HEADER_GUARD_1357924680
bool operator!=(const XalanDequeIterator &theRHS) const
XalanVector< BlockType * > BlockIndexType
XalanDequeIterator(const Iterator &iterator)
XalanDeque(MemoryManager &memoryManager, size_type initialSize=0, size_type blockSize=10)
XalanDequeIterator< XalanDequeIteratorTraits< value_type >, XalanDeque > Iterator
XalanDequeIterator operator+(difference_type difference) const
XalanDequeIterator operator-(difference_type difference) const
XalanDequeIterator & operator--()
const_reverse_iterator rbegin() const
void resize(size_type newSize)
Traits::const_reference const_reference
XalanDequeIterator< XalanDequeConstIteratorTraits< value_type >, ThisType > const_iterator
Traits::value_type value_type
XalanDeque & operator=(const XalanDeque &theRHS)
XalanDequeIterator operator++(int)
void push_back(const value_type &value)
bool operator==(const XalanDequeIterator &theRHS) const
void clear(XalanDOMString &theString)
Remove all elements from target string.
difference_type operator-(const XalanDequeIterator &theRHS) const
static XalanDeque * create(MemoryManager &theManager, size_type initialSize=0, size_type blockSize=10)
XalanVector< Type, ConstructionTraits > BlockType
XalanDequeIterator & operator=(const Iterator &iterator)
value_type & operator[](size_type index)
const value_type & operator[](size_type index) const
ptrdiff_t difference_type
const Value & const_reference
reverse_iterator_ reverse_iterator
Traits::reference reference
const Value & const_reference
const Type & const_reference
XalanDeque< Type, ConstructionTraits > ThisType
const_iterator end() const
void XalanDestroy(Type &theArg)
const_reverse_iterator_ const_reverse_iterator
XALAN_STD_QUALIFIER reverse_iterator< const_iterator, value_type, const_reference > const_reverse_iterator_
XALAN_STD_QUALIFIER reverse_iterator< iterator, value_type > reverse_iterator_
bool operator<(const ElemAttributeSet &theLHS, const ElemAttributeSet &theRHS)
void swap(XalanDeque &theRHS)
XALAN_STD_QUALIFIER random_access_iterator_tag iterator_category
XalanDequeIterator< XalanDequeIteratorTraits< value_type >, ThisType > iterator
MemoryManager & getMemoryManager()
XalanDeque(const XalanDeque &theRHS, MemoryManager &theMemoryManager)
XalanDequeIterator(XalanDeque *deque, size_type pos)
void swap(ThisType &theOther)
XalanDequeIterator & operator++()
ConstructionTraits::Constructor Constructor
Type * XalanConstruct(MemoryManager &theMemoryManager, Type *&theInstance)
const_iterator begin() const
Constructor::ConstructableType ConstructableType
const_reference operator*() const
Xalan implementation of deque.
const_reverse_iterator rend() const