summaryrefslogtreecommitdiff
path: root/xml2cmp/source/support/heap.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xml2cmp/source/support/heap.cxx')
-rw-r--r--xml2cmp/source/support/heap.cxx207
1 files changed, 207 insertions, 0 deletions
diff --git a/xml2cmp/source/support/heap.cxx b/xml2cmp/source/support/heap.cxx
new file mode 100644
index 000000000000..74896302bd27
--- /dev/null
+++ b/xml2cmp/source/support/heap.cxx
@@ -0,0 +1,207 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include <string.h>
+#include "heap.hxx"
+
+
+#include <iostream>
+#include <stdlib.h>
+#define AssertionOf(x) {if (!(x)) {std::cerr << "Assertion failed: " << #x << __FILE__ << __LINE__ << std::endl; exit(3); }}
+
+#ifdef UNX
+#define stricmp strcasecmp
+#endif
+
+
+
+Heap::Heap(unsigned i_nWidth)
+ : dpColumnsArray(new Column[i_nWidth]),
+ nColumnsArraySize(i_nWidth),
+ nActiveColumn(nColumnsArraySize-1)
+{
+ for ( unsigned i = 0; i < nColumnsArraySize; i++)
+ {
+ dpColumnsArray[i] = 0;
+ } // end for
+}
+
+Heap::~Heap()
+{
+ for ( unsigned i = 0; i < nColumnsArraySize; i++)
+ {
+ HeapItem * & rColumn = dpColumnsArray[i];
+ for ( HeapItem * pValue = rColumn; pValue != 0; pValue = rColumn )
+ {
+ rColumn = rColumn->Next();
+ delete pValue;
+ }
+ } // end for
+
+ delete [] dpColumnsArray;
+}
+
+void
+Heap::InsertValue( const char * i_sKey,
+ const char * i_sValue )
+{
+ HeapItem * pSearch1 = 0;
+ HeapItem * pSearch2 = 0;
+ HeapItem * pNew = new HeapItem(i_sKey, i_sValue);
+
+ IncColumn();
+ pSearch1 = ActiveColumn();
+
+ if ( pSearch1 != 0 ? *pNew < *pSearch1 : true )
+ {
+ pNew->SetNext( pSearch1 );
+ ActiveColumn() = pNew;
+
+ if ( pNew->Next() != 0)
+ {
+ AssertionOf( *pNew <= *pNew->Next() );
+ }
+
+ return;
+ }
+
+ do
+ {
+ pSearch2 = pSearch1;
+ pSearch1 = pSearch1->Next();
+
+ if ( pSearch1 != 0 ? *pNew < *pSearch1 : true )
+ {
+ pNew->SetNext( pSearch1 );
+ pSearch2->SetNext(pNew);
+
+
+ AssertionOf( *pSearch2 <= *pNew );
+ if ( pNew->Next() != 0)
+ {
+ AssertionOf( *pNew <= *pNew->Next() );
+ }
+
+ }
+ } while (pSearch2->Next() != pNew);
+}
+
+
+Simstr sKey1;
+Simstr sValue1;
+Simstr sKey2;
+Simstr sValue2;
+int nCol1 = 0;
+int nCol2 = 0;
+
+
+HeapItem *
+Heap::ReleaseTop()
+{
+ unsigned nRetColumn = 0;
+ HeapItem * ret = dpColumnsArray[0];
+ HeapItem * pSearch = 0;
+
+ for ( unsigned i = 1; i < nColumnsArraySize; ++i )
+ {
+ pSearch = dpColumnsArray[i];
+ if (pSearch != 0)
+ {
+ if ( ret == 0 ? true : *pSearch < *ret)
+ {
+ ret = pSearch;
+ nRetColumn = i;
+ }
+ }
+ } // for
+
+ if (ret != 0)
+ {
+ dpColumnsArray[nRetColumn] = ret->Next();
+ }
+ return ret;
+}
+
+void
+Heap::IncColumn()
+{
+ if (++nActiveColumn >= nColumnsArraySize)
+ nActiveColumn = 0;
+}
+
+
+
+HeapItem::HeapItem( const char * i_sKey,
+ const char * i_sValue )
+ : sValue(i_sValue),
+ sKey(i_sKey),
+ pNext(0)
+{
+}
+
+HeapItem::~HeapItem()
+{
+}
+
+bool
+HeapItem::operator<( const HeapItem & i_rOther ) const
+{
+ int ret = stricmp(sKey.str(), i_rOther.sKey.str());
+ if (ret == 0)
+ ret = strcmp(sKey.str(), i_rOther.sKey.str());
+ if (ret == 0)
+ ret = stricmp(sValue.str(), i_rOther.sValue.str());
+ if (ret == 0)
+ ret = strcmp(sValue.str(), i_rOther.sValue.str());
+ return ret < 0;
+}
+
+const Simstr &
+HeapItem::Value() const
+{
+ return sValue;
+}
+
+const Simstr &
+HeapItem::Key() const
+{
+ return sKey;
+}
+
+HeapItem *
+HeapItem::Next() const
+{
+ return pNext;
+}
+
+void
+HeapItem::SetNext( HeapItem * i_pNext )
+{
+ pNext = i_pNext;
+}
+
+