diff options
Diffstat (limited to 'util/qlalr/compress.cpp')
-rw-r--r-- | util/qlalr/compress.cpp | 286 |
1 files changed, 0 insertions, 286 deletions
diff --git a/util/qlalr/compress.cpp b/util/qlalr/compress.cpp deleted file mode 100644 index 4ae0716047..0000000000 --- a/util/qlalr/compress.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the test suite module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "compress.h" - -#include <QtCore/qdebug.h> -#include <QtCore/qlist.h> - -#include <algorithm> -#include <iterator> -#include <iostream> - -#define QLALR_NO_CHECK_SORTED_TABLE - -struct _Fit: public std::binary_function<int, int, bool> -{ - inline bool operator () (int a, int b) const - { - return a == 0 || b == 0 || a == b; - } -}; - -struct _PerfectMatch: public std::binary_function<int, int, bool> -{ - inline bool operator () (int a, int b) const - { return a == b; } -}; - -struct _GenerateCheck -{ - QVector<int>::const_iterator iterator; - int initial; - - _GenerateCheck (QVector<int>::const_iterator it, int i): - iterator (it), - initial (i) {} - - inline int operator () () - { - int check = initial++; - return *iterator++ ? check : -1; - } -}; - -class UncompressedRow -{ -public: - typedef const int *const_iterator; - typedef const int *iterator; - -public: - inline UncompressedRow (): - _M_index (0), - _M_begin (0), - _M_end (0), - _M_beginNonZeros (0), - _M_endNonZeros (0) {} - - inline UncompressedRow (int index, const_iterator begin, const_iterator end) - { assign (index, begin, end); } - - inline int index () const { return _M_index; } - inline const_iterator begin () const { return _M_begin; } - inline const_iterator end () const { return _M_end; } - - inline void assign (int index, const_iterator begin, const_iterator end) - { - _M_index = index; - _M_begin = begin; - _M_end = end; - - _M_beginNonZeros = _M_begin; - _M_endNonZeros = _M_end; - - for (_M_beginNonZeros = _M_begin; _M_beginNonZeros != _M_end && ! _M_beginNonZeros [0]; ++_M_beginNonZeros) - /*continue*/ ; - -#if 0 - for (_M_endNonZeros = _M_end; _M_endNonZeros != _M_beginNonZeros && ! _M_endNonZeros [-1]; --_M_endNonZeros) - /*continue*/ ; -#endif - } - - inline int at (int index) const - { return _M_begin [index]; } - - inline bool isEmpty () const - { return _M_begin == _M_end; } - - inline int size () const - { return _M_end - _M_begin; } - - inline int nonZeroElements () const - { return _M_endNonZeros - _M_beginNonZeros; } - - inline int count (int value) const - { return std::count (begin (), end (), value); } - - inline const_iterator beginNonZeros () const - { return _M_beginNonZeros; } - - inline const_iterator endNonZeros () const - { return _M_endNonZeros; } - -private: - int _M_index; - const_iterator _M_begin; - const_iterator _M_end; - const_iterator _M_beginNonZeros; - const_iterator _M_endNonZeros; -}; - -struct _SortUncompressedRow: public std::binary_function<UncompressedRow, UncompressedRow, bool> -{ - inline bool operator () (const UncompressedRow &a, const UncompressedRow &b) const - { return a.count (0) > b.count (0); } -}; - -Compress::Compress () -{ -} - -void Compress::operator () (int *table, int row_count, int column_count) -{ - index.clear (); - info.clear (); - check.clear (); - - QVector<UncompressedRow> sortedTable (row_count); - - for (int i = 0; i < row_count; ++i) - { - int *begin = &table [i * column_count]; - int *end = begin + column_count; - - sortedTable [i].assign (i, begin, end); - } - - std::sort (sortedTable.begin (), sortedTable.end (), _SortUncompressedRow ()); - -#ifndef QLALR_NO_CHECK_SORTED_TABLE - int previous_zeros = INT_MAX; - - foreach (UncompressedRow row, sortedTable) - { - int zeros = row.count (0); - - Q_ASSERT (zeros <= previous_zeros); - zeros = previous_zeros; - qDebug () << "OK!"; - } -#endif - - index.fill (-999999, row_count); - - foreach (UncompressedRow row, sortedTable) - { - int first_token = std::distance (row.begin (), row.beginNonZeros ()); - QVector<int>::iterator pos = info.begin (); - - while (pos != info.end ()) - { - if (pos == info.begin ()) - { - // try to find a perfect match - QVector<int>::iterator pm = std::search (pos, info.end (), row.beginNonZeros (), row.endNonZeros (), _PerfectMatch ()); - - if (pm != info.end ()) - { - pos = pm; - break; - } - } - - pos = std::search (pos, info.end (), row.beginNonZeros (), row.endNonZeros (), _Fit ()); - - if (pos == info.end ()) - break; - - int idx = std::distance (info.begin (), pos) - first_token; - bool conflict = false; - - for (int j = 0; ! conflict && j < row.size (); ++j) - { - if (row.at (j) == 0) - conflict |= idx + j >= 0 && check [idx + j] == j; - - else - conflict |= check [idx + j] == j; - } - - if (! conflict) - break; - - ++pos; - } - - if (pos == info.end ()) - { - int size = info.size (); - - info.resize (info.size () + row.nonZeroElements ()); - check.resize (info.size ()); - - std::fill (check.begin () + size, check.end (), -1); - pos = info.begin () + size; - } - - int offset = std::distance (info.begin (), pos); - index [row.index ()] = offset - first_token; - - for (const int *it = row.beginNonZeros (); it != row.endNonZeros (); ++it, ++pos) - { - if (*it) - *pos = *it; - } - - int i = row.index (); - - for (int j = 0; j < row.size (); ++j) - { - if (row.at (j) == 0) - continue; - - check [index [i] + j] = j; - } - } - -#if 0 - foreach (UncompressedRow row, sortedTable) - { - int i = row.index (); - Q_ASSERT (i < sortedTable.size ()); - - for (int j = 0; j < row.size (); ++j) - { - if (row.at (j) == 0) - { - Q_ASSERT (index [i] + j < 0 || check [index [i] + j] != j); - continue; - } - - Q_ASSERT ( info [index [i] + j] == row.at (j)); - Q_ASSERT (check [index [i] + j] == j); - } - } -#endif -} |