dbertoni 2004/08/03 08:58:46
Modified: c/src/xalanc/Include XalanVector.hpp
Log:
Fixed inadvertant allocation in constructor and miscellaneous cleanup.
Revision Changes Path
1.2 +261 -272 xml-xalan/c/src/xalanc/Include/XalanVector.hpp
Index: XalanVector.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/Include/XalanVector.hpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- XalanVector.hpp 31 Jul 2004 06:05:03 -0000 1.1
+++ XalanVector.hpp 3 Aug 2004 15:58:46 -0000 1.2
@@ -14,6 +14,11 @@
* limitations under the License.
*/
+/**
+ * @author David Bertoni ([EMAIL PROTECTED])
+ * @author Matthew Hoyt ([EMAIL PROTECTED])
+ */
+
#if !defined(XALANVECTOR_HEADER_GUARD_1357924680)
#define XALANVECTOR_HEADER_GUARD_1357924680
@@ -26,7 +31,6 @@
#include <algorithm>
#include <cassert>
#include <new>
-#include <cstring>
#include <iterator>
#include <stdexcept>
@@ -38,6 +42,8 @@
XALAN_CPP_NAMESPACE_BEGIN
+#pragma warning(push)
+#pragma warning(disable: 4100)
template <class Type>
class XalanVector
@@ -54,17 +60,17 @@
typedef size_t size_type;
typedef value_type* iterator;
typedef const value_type* const_iterator;
- typedef ptrdiff_t difference_type;
-
+ typedef ptrdiff_t difference_type;
+
#if defined(_MSC_VER) && (_MSC_VER < 1300)
- typedef XALAN_STD_QUALIFIER reverse_iterator<iterator,value_type>
reverse_iterator;
- typedef XALAN_STD_QUALIFIER reverse_iterator<const_iterator,
value_type, const_reference> const_reverse_iterator;
+ typedef XALAN_STD_QUALIFIER reverse_iterator<iterator,value_type>
reverse_iterator;
+ typedef XALAN_STD_QUALIFIER reverse_iterator<const_iterator, value_type,
const_reference> const_reverse_iterator;
#else
- typedef XALAN_STD_QUALIFIER reverse_iterator<iterator> reverse_iterator;
- typedef XALAN_STD_QUALIFIER reverse_iterator<const_iterator>
const_reverse_iterator;
+ typedef XALAN_STD_QUALIFIER reverse_iterator<iterator> reverse_iterator;
+ typedef XALAN_STD_QUALIFIER reverse_iterator<const_iterator>
const_reverse_iterator;
#endif
- typedef XalanVector<value_type> ThisType;
+ typedef XalanVector<value_type> ThisType;
XalanVector(
MemoryManagerType* theManager = 0,
@@ -84,7 +90,7 @@
m_memoryManager(theManager != 0 ? theManager :
theSource.m_memoryManager),
m_size(0),
m_allocation(0),
- m_data(0)
+ m_data(0)
{
if (theSource.m_size > 0)
{
@@ -93,58 +99,59 @@
initialAllocation = theSource.m_size;
}
- ThisType theTemp(theManager, initialAllocation);
+ ThisType theTemp(theManager, initialAllocation);
-
theTemp.insert(theTemp.begin(),theSource.begin(),theSource.end());
+ theTemp.insert(theTemp.begin(), theSource.begin(),
theSource.end());
- swap(theTemp);
-
+ swap(theTemp);
+
}
else if (initialAllocation > 0)
{
- m_data = allocate(initialAllocation);
- m_allocation = initialAllocation;
+ m_data = allocate(initialAllocation);
+
+ m_allocation = initialAllocation;
}
invariants();
}
- XalanVector(
- const_iterator theStart,
- const_iterator theEnd,
- MemoryManagerType* theManager = 0) :
- m_memoryManager(theManager),
+ XalanVector(
+ const_iterator theStart,
+ const_iterator theEnd,
+ MemoryManagerType* theManager = 0) :
+ m_memoryManager(theManager),
m_size(0),
m_allocation(0),
m_data(0)
- {
- ThisType theTemp(theManager);
+ {
+ ThisType theTemp(theManager);
- theTemp.insert(theTemp.begin(),theStart,theEnd);
+ theTemp.insert(theTemp.begin(), theStart, theEnd);
- swap(theTemp);
+ swap(theTemp);
- invariants();
- }
+ invariants();
+ }
- XalanVector(
- size_type theInsertSize,
- value_type data,
- MemoryManagerType* theManager = 0) :
- m_memoryManager(theManager),
+ XalanVector(
+ size_type theInsertSize,
+ value_type data,
+ MemoryManagerType* theManager = 0) :
+ m_memoryManager(theManager),
m_size(0),
m_allocation(theInsertSize),
- m_data(theInsertSize > 0 ? allocate(theInsertSize) : 0)
- {
- ThisType theTemp(theManager);
+ m_data(0)
+ {
+ ThisType theTemp(theManager);
- theTemp.insert(theTemp.begin(), theInsertSize, data);
+ theTemp.insert(theTemp.begin(), theInsertSize, data);
- swap(theTemp);
+ swap(theTemp);
- invariants();
- }
+ invariants();
+ }
~XalanVector()
{
@@ -191,19 +198,20 @@
iterator start,
iterator end)
{
+ invariants();
+
if (start != end)
{
-
- using XALAN_STD_QUALIFIER copy;
-
- copy(
- end,
- endPointer(),
- start);
+ XALAN_STD_QUALIFIER copy(
+ end,
+ endPointer(),
+ start);
shrink(size() - (end - start));
}
+ invariants();
+
return start;
}
@@ -213,16 +221,18 @@
const_iterator theStart,
const_iterator theEnd)
{
+ invariants();
+
const size_type theInsertSize = theEnd - theStart;
- if (theInsertSize == 0)
- {
- return;
- }
+ if (theInsertSize == 0)
+ {
+ return;
+ }
- const size_type theTotalSize = size() + theInsertSize;
+ const size_type theTotalSize = size() + theInsertSize;
- if (thePosition == end())
+ if (thePosition == end())
{
pointer thePointer = ensureCapacity(theTotalSize);
@@ -239,7 +249,7 @@
{
if (theTotalSize > capacity())
{
- ThisType theTemp(m_memoryManager, theTotalSize);
+ ThisType theTemp(m_memoryManager, theTotalSize);
// insert everything up to the position...
theTemp.insert(theTemp.end(), begin(), thePosition);
@@ -254,76 +264,80 @@
}
else
{
- // insert into the middle of the vector that
has enough capacity
- iterator theOriginalEnd = end();
- size_type theRightSplitSize = end() -
thePosition;
-
- if (theRightSplitSize <= theInsertSize)
- {
- // inserted range will go to or beyond
edge of current vector
-
- // append from inserted range, all
values that will extend
- // beyond the current vector
- const_iterator toInsertSplit = theStart
+ theRightSplitSize;
- const_iterator toInsertIter =
toInsertSplit;
- while (toInsertIter != theEnd)
- {
-
construct(endPointer(),*toInsertIter);
- ++m_size;
- ++toInsertIter;
- }
-
- // copy the "right" of the current
vector to the end
- toInsertIter = thePosition;
- while (toInsertIter != theOriginalEnd)
- {
-
construct(endPointer(),*toInsertIter);
- ++m_size;
- ++toInsertIter;
- }
-
- // copy the remaining part of inserted
range into
- // the original vector spaces
- XALAN_STD_QUALIFIER copy(theStart,
toInsertSplit, thePosition);
- }
- else
- {
- // inserted range will not extend
beyond edge of current vector
-
- // move end of current vector by
insertion size
- const_iterator toMoveIter = end() -
theInsertSize;
-
- while (toMoveIter != theOriginalEnd)
- {
-
construct(endPointer(),*toMoveIter);
- ++m_size;
- ++toMoveIter;
- }
-
- // reverse copy the remaining part of
the "right" piece of the current vector
- XALAN_STD_QUALIFIER
copy_backward(thePosition, theOriginalEnd - theInsertSize, theOriginalEnd);
-
- // insert into current vector
- XALAN_STD_QUALIFIER copy(theStart,
theEnd, thePosition);
- }
- }
+ // insert into the middle of the vector that has enough
capacity
+ iterator theOriginalEnd = end();
+ size_type theRightSplitSize = end() - thePosition;
+
+ if (theRightSplitSize <= theInsertSize)
+ {
+ // inserted range will go to or beyond edge of current
vector
+
+ // append from inserted range, all values that will
extend
+ // beyond the current vector
+ const_iterator toInsertSplit = theStart +
theRightSplitSize;
+ const_iterator toInsertIter = toInsertSplit;
+ while (toInsertIter != theEnd)
+ {
+ construct(endPointer(),*toInsertIter);
+ ++m_size;
+ ++toInsertIter;
+ }
+
+ // copy the "right" of the current vector to the end
+ toInsertIter = thePosition;
+ while (toInsertIter != theOriginalEnd)
+ {
+ construct(endPointer(),*toInsertIter);
+ ++m_size;
+ ++toInsertIter;
+ }
+
+ // copy the remaining part of inserted range into
+ // the original vector spaces
+ XALAN_STD_QUALIFIER copy(theStart, toInsertSplit,
thePosition);
+ }
+ else
+ {
+ // inserted range will not extend beyond edge of current
vector
+
+ // move end of current vector by insertion size
+ const_iterator toMoveIter = end() - theInsertSize;
+
+ while (toMoveIter != theOriginalEnd)
+ {
+ construct(endPointer(),*toMoveIter);
+ ++m_size;
+ ++toMoveIter;
+ }
+
+ // reverse copy the remaining part of the "right" piece
of the current vector
+ XALAN_STD_QUALIFIER copy_backward(thePosition,
theOriginalEnd - theInsertSize, theOriginalEnd);
+
+ // insert into current vector
+ XALAN_STD_QUALIFIER copy(theStart, theEnd, thePosition);
+ }
+ }
}
+
+ invariants();
}
- void
- insert(
- iterator thePosition,
- size_type theInsertSize,
- value_type data)
- {
+ void
+ insert(
+ iterator thePosition,
+ size_type theInsertSize,
+ value_type data)
+ {
+ invariants();
+
const size_type theTotalSize = size() + theInsertSize;
- // Needs to be optimized
- if (thePosition == end())
+ // Needs to be optimized
+ if (thePosition == end())
{
pointer thePointer = ensureCapacity(theTotalSize);
- size_type index = 0;
+ size_type index = 0;
while (index < theInsertSize)
{
construct(thePointer, data);
@@ -333,18 +347,18 @@
++index;
}
}
- else
- {
- if (theTotalSize > capacity())
+ else
+ {
+ if (theTotalSize > capacity())
{
- ThisType theTemp(m_memoryManager,
theTotalSize);
+ ThisType theTemp(m_memoryManager, theTotalSize);
// insert everything up to the position...
theTemp.insert(theTemp.end(), begin(), thePosition);
// insert the new stuff...
- theTemp.insert(theTemp.end(), theInsertSize,
data);
-
+ theTemp.insert(theTemp.end(), theInsertSize, data);
+
// insert everything from the position to the end...
theTemp.insert(theTemp.end(), thePosition, end());
@@ -352,75 +366,78 @@
}
else
{
- // insert into the middle of the vector that
has enough capacity
- iterator theOriginalEnd = end();
- size_type theRightSplitSize = end() -
thePosition;
-
- if (theRightSplitSize <= theInsertSize)
- {
- // inserted range will go to or beyond
edge of current vector
-
- // append all copies that will extend
- // beyond the current vector
- size_type i = 0;
- for (; i < (theInsertSize -
theRightSplitSize); ++i)
- {
- construct(endPointer(),data);
- ++m_size;
- }
-
- // copy the "right" of the current
vector to the end
- iterator toInsertIter = thePosition;
- while (toInsertIter != theOriginalEnd)
- {
-
construct(endPointer(),*toInsertIter);
- ++m_size;
- ++toInsertIter;
- }
-
- // copy the remaining part of inserted
range into
- // the original vector spaces
- XALAN_STD_QUALIFIER fill(thePosition,
thePosition + theRightSplitSize, data);
- }
- else
- {
- // inserted range will not extend
beyond edge of current vector
-
- // move end of current vector by
insertion size
- const_iterator toMoveIter = end() -
theInsertSize;
-
- while (toMoveIter != theOriginalEnd)
- {
-
construct(endPointer(),*toMoveIter);
- ++m_size;
- ++toMoveIter;
- }
-
- // reverse copy the remaining part of
the "right" piece of the current vector
- XALAN_STD_QUALIFIER
copy_backward(thePosition, theOriginalEnd - theInsertSize, theOriginalEnd);
-
- // insert into current vector
- XALAN_STD_QUALIFIER fill(thePosition,
thePosition + theInsertSize, data);
-
- }
- }
- }
- }
-
- void
- insert(
- iterator thePosition,
- value_type data)
- {
- insert(thePosition,1,data);
- }
-
- void
- assign(const_iterator theStart, const_iterator theEnd)
- {
- clear();
- insert(0,theStart,theEnd);
- }
+ // insert into the middle of the vector that has enough
capacity
+ iterator theOriginalEnd = end();
+ size_type theRightSplitSize = end() - thePosition;
+
+ if (theRightSplitSize <= theInsertSize)
+ {
+ // inserted range will go to or beyond edge of current
vector
+
+ // append all copies that will extend
+ // beyond the current vector
+ size_type i = 0;
+ for (; i < (theInsertSize - theRightSplitSize); ++i)
+ {
+ construct(endPointer(),data);
+ ++m_size;
+ }
+
+ // copy the "right" of the current vector to the end
+ iterator toInsertIter = thePosition;
+ while (toInsertIter != theOriginalEnd)
+ {
+ construct(endPointer(),*toInsertIter);
+ ++m_size;
+ ++toInsertIter;
+ }
+
+ // copy the remaining part of inserted range into
+ // the original vector spaces
+ XALAN_STD_QUALIFIER fill(thePosition, thePosition +
theRightSplitSize, data);
+ }
+ else
+ {
+ // inserted range will not extend beyond edge of current
vector
+
+ // move end of current vector by insertion size
+ const_iterator toMoveIter = end() - theInsertSize;
+
+ while (toMoveIter != theOriginalEnd)
+ {
+ construct(endPointer(),*toMoveIter);
+ ++m_size;
+ ++toMoveIter;
+ }
+
+ // reverse copy the remaining part of the "right" piece
of the current vector
+ XALAN_STD_QUALIFIER copy_backward(thePosition,
theOriginalEnd - theInsertSize, theOriginalEnd);
+
+ // insert into current vector
+ XALAN_STD_QUALIFIER fill(thePosition, thePosition +
theInsertSize, data);
+
+ }
+ }
+ }
+
+ invariants();
+ }
+
+ void
+ insert(
+ iterator thePosition,
+ value_type data)
+ {
+ insert(thePosition,1,data);
+ }
+
+ void
+ assign(const_iterator theStart, const_iterator theEnd)
+ {
+ clear();
+
+ insert(0,theStart,theEnd);
+ }
size_type
size() const
@@ -561,34 +578,38 @@
return endPointer();
}
- reverse_iterator
- rbegin()
- {
- invariants();
- return reverse_iterator(end());
- }
-
- const_reverse_iterator
- rbegin() const
- {
- invariants();
- return const_reverse_iterator(end());
- }
-
- reverse_iterator
- rend()
- {
- invariants();
- return reverse_iterator(begin());
- }
-
- const_reverse_iterator
- rend() const
- {
- invariants();
- return const_reverse_iterator(begin());
- }
-
+ reverse_iterator
+ rbegin()
+ {
+ invariants();
+
+ return reverse_iterator(end());
+ }
+
+ const_reverse_iterator
+ rbegin() const
+ {
+ invariants();
+
+ return const_reverse_iterator(end());
+ }
+
+ reverse_iterator
+ rend()
+ {
+ invariants();
+
+ return reverse_iterator(begin());
+ }
+
+ const_reverse_iterator
+ rend() const
+ {
+ invariants();
+
+ return const_reverse_iterator(begin());
+ }
+
reference
at(size_type theIndex)
@@ -650,10 +671,6 @@
}
else
{
-#if !defined(XALAN_NO_STD_NAMESPACE)
- using std::copy;
-#endif
-
const_iterator theRHSEnd = theRHS.end();
if (m_size > theRHS.m_size)
@@ -663,14 +680,14 @@
}
else if (m_size < theRHS.m_size)
{
- insert(
+ insert(
end(),
theRHS.begin() + m_size,
theRHS.end());
}
// Copy everything that already exists...
- copy(
+ XALAN_STD_QUALIFIER copy(
theRHS.begin(),
theRHSEnd,
begin());
@@ -734,50 +751,8 @@
return theTemp;
}
- friend bool operator==(const ThisType&, const ThisType&);
- friend bool operator<(const ThisType&, const ThisType&);
-
private:
- bool
- eq(const ThisType& theRHS) const
- {
- invariants();
-
- if (m_size != theRHS.m_size)
- {
- return false;
- }
- else if (m_size == 0)
- {
- return true;
- }
- else
- {
-#if !defined(XALAN_NO_STD_NAMESPACE)
- using std::equal;
-#endif
-
- return equal(begin(), end(), theRHS.begin());
- }
- }
-
- bool
- lt(const ThisType& theRHS) const
- {
- invariants();
-
-#if !defined(XALAN_NO_STD_NAMESPACE)
- using std::lexicographical_compare;
-#endif
-
- return lexicographical_compare(
- begin(),
- end(),
- theRHS.begin(),
- theRHS.end());
- }
-
#if defined(NDEBUG)
void
invariants() const
@@ -924,11 +899,7 @@
void
rangeError()
{
-#if !defined(XALAN_NO_STD_NAMESPACE)
- using std::out_of_range;
-#endif
-
- throw out_of_range("");
+ throw XALAN_STD_QUALIFIER out_of_range("");
}
void
@@ -971,7 +942,18 @@
const XalanVector<Type>& theLHS,
const XalanVector<Type>& theRHS)
{
- return theLHS.eq(theRHS);
+ if (theLHS.size() != theRHS.size())
+ {
+ return false;
+ }
+ else if (theLHS.size() == 0)
+ {
+ return true;
+ }
+ else
+ {
+ return XALAN_STD_QUALIFIER equal(theLHS.begin(), theLHS.end(),
theRHS.begin());
+ }
}
@@ -993,7 +975,11 @@
const XalanVector<Type>& theLHS,
const XalanVector<Type>& theRHS)
{
- return theLHS.lt(theRHS);
+ return XALAN_STD_QUALIFIER lexicographical_compare(
+ theLHS.begin(),
+ theLHS.end(),
+ theRHS.begin(),
+ theRHS.end());
}
@@ -1029,6 +1015,9 @@
return !(x < y);
}
+
+
+#pragma warning(pop)
XALAN_CPP_NAMESPACE_END
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]