summaryrefslogtreecommitdiff
path: root/i18npool/source/search/levdis.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'i18npool/source/search/levdis.hxx')
-rw-r--r--i18npool/source/search/levdis.hxx216
1 files changed, 0 insertions, 216 deletions
diff --git a/i18npool/source/search/levdis.hxx b/i18npool/source/search/levdis.hxx
deleted file mode 100644
index 08adb0f51f..0000000000
--- a/i18npool/source/search/levdis.hxx
+++ /dev/null
@@ -1,216 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * 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.
- *
- ************************************************************************/
-
-#ifndef INCLUDED_I18NPOOL_LEVDIS_HXX
-#define INCLUDED_I18NPOOL_LEVDIS_HXX
-
-#include <rtl/ustring.hxx>
-
-/*
- maximal X Ersetzungen (User: gefundenes darf X Zeichen anders sein)
- maximal Y Einfuegungen (User: gefundenes darf Y Zeichen kuerzer sein)
- maximal Z Loeschungen (User: gefundenes darf Z Zeichen laenger sein)
- mathematische WLD oder SplitCount (User: strikt oder relaxed)
-
- Joker ('?' und '*') fallen natuerlich nicht unter diese Bedingungen.
- Bei einem '?' wird eine Ersetzung nicht gezahlt, bei einem '*' darf
- der gefundene String an dieser Stelle beliebig viele Zeichen laenger sein.
-
- Strikt: entweder maximal X anders oder Y kuerzer oder Z laenger
- Relaxed: maximal X anders und/oder Y kuerzer und/oder Z laenger
-
- Wertebereich fuer X,Y,Z ist 0..33 um mit Limit sicher unter
- 16-bit-signed-int-max zu bleiben, 31*32*33 gibt das Maximum
- KGV(31,32,33) == 32736
- */
-
-#define LEVDISDEFAULT_XOTHER 2
-#define LEVDISDEFAULT_YSHORTER 1
-#define LEVDISDEFAULT_ZLONGER 3
-#define LEVDISDEFAULT_RELAXED TRUE
-
-#define LEVDISDEFAULTLIMIT 6 // default nLimit, passt zu x=2, y=1, z=3,
- // p=3, q=6, r=2
-#define LEVDISDEFAULT_P0 3 // default nRepP0, Gewichtung Ersetzen
-#define LEVDISDEFAULT_Q0 6 // default nInsQ0, Gewichtung Einfuegen
-#define LEVDISDEFAULT_R0 2 // default nDelR0, Gewichtung Loeschen
-/*
- Berechnung von angegebenen Userwerten max Ersetzen, Kuerzer, Laenger mittels
- CalcLPQR(). Unschoen: wenn in WLD z.B. nLimit durch nDelR0 erreicht ist
- (String ist nZ laenger als Pattern), kann kein Zeichen mehr ersetzt werden.
- Dies kann durch Erhoehung von nX oder/und nZ vermieden werden, natuerlich
- mit den entsprechenden Seiteneffekten.. oder aber mit SplitCount (s.u.), was
- der Default bei CalcLPQR() ist.
-
- Achtung: Kuerzer = WLD.Insert, Laenger = WLD.Delete
-
- Gezaehlt wird von String nach Pattern (eine Loeschung bedeutet, dass aus
- String etwas geloescht werden muss, um auf Pattern zu kommen)
-
- Loeschungen zaehlen in diesem Beispiel am wenigsten, da meistens weniger
- bekannt ist, als gesucht wird. Ersetzungen erhalten mittlere Gewichtung
- wegen z.B. falscher Schreibweisen. Einfuegungen werden teuer.
-
- Oder z.B.: P0 = 1, Q0 = 4, R0 = 4, Limit = 3
- Erlaubt sind maximal 4 Ersetzungen, keine Einfuegung, keine Loeschung
- Entspricht den Userangaben X = 3, Y = 0, Z = 0
-
- bSplitCount: wenn TRUE, werden Rep/Ins/Del anders gezaehlt. Der
- Rueckgabewert von WLD ist dann nicht mehr unbedingt die Levenshtein-Distanz,
- sondern kann negativ (-WLD) sein, wenn die WLD groesser als nLimit ist, aber
- die Einzelwerte jeweils innerhalb der Grenzen liegen.
- Bei den Default-Werten hiesse das z.B.: auch wenn der gefundene String 2
- Zeichen laenger ist (nLongerZ), koennen noch 3 Ersetzungen (nOtherX)
- erfolgen. Zusatz-Gimmick: Buchstabendreher zaehlen als eine Ersetzung.
- Mathematisch voellig unkorrekt, aber gut fuer den User ;-)
-
- Zur Erlaeuterung: bei der echten WLD schoepfen alle Aktionen aus einem
- gemeinsamen 100%-Pool, wenn einer alles hat, ist fuer die anderen nichts
- mehr da. Mit bSplitCount hat Replace sein eigenes Wildwasser..
- */
-
-class WLevDisPatternMem // "sichere" Speicheranforderung im cTor
-{
- sal_Unicode *cp;
- bool *bp;
-public:
- WLevDisPatternMem( sal_Int32 s ) { cp = new sal_Unicode[ s ];
- bp = new bool[ s ];
- }
- ~WLevDisPatternMem() { if (cp) delete [] cp;
- if (bp) delete [] bp;
- }
- sal_Unicode* GetcPtr() const { return cp; }
- bool* GetbPtr() const { return bp; }
-};
-
-class WLevDisDistanceMem
-{
- int* p;
-public:
- WLevDisDistanceMem( size_t s ) { p = 0; NewMem(s); }
- ~WLevDisDistanceMem() { if (p) delete [] p; }
- int* GetPtr() const { return p; }
- int* NewMem( size_t s ) { if (p) delete [] p;
- return (p = new int[ s<3 ? 3 : s ]);
- }
-};
-
-class WLevDistance
-{
- sal_Int32 nPatternLen; // Laenge des Pattern
- WLevDisPatternMem aPatMem; // Verwaltung des Pattern Arrays
- sal_Unicode* cpPattern; // Pointer auf Pattern Array
- bool* bpPatIsWild; // Pointer auf bool Array, ob Pattern Wildcard ist
- sal_Int32 nArrayLen; // Laenge des Distanz Arrays
- WLevDisDistanceMem aDisMem; // Verwaltung des Distanz Arrays
- int* npDistance; // Pointer auf Distanz Array
- int nLimit; // WLD Limit Ersetzungen/Einfuegungen/Loeschungen
- int nRepP0; // Ersetzen Gewichtung
- int nInsQ0; // Einfuegen Gewichtung
- int nDelR0; // Loeschen Gewichtung
- int nStars; // Anzahl '*' Joker im Pattern
- bool bSplitCount; // wenn TRUE, werden Rep/Ins/Del getrennt gezaehlt
-
- void InitData( const sal_Unicode* cPattern ); // fuer die CToren
- inline int Min3( int x, int y, int z ); // inline wegen Schleife
- int Mid3( int x, int y, int z );
- int Max3( int x, int y, int z );
- int GGT( int a, int b ); // Groesster Gemeinsamer Teiler
- int KGV( int a, int b ); // Kleinstes Gemeinsames Vielfaches
-
-public:
- // CToren mit Userangaben, danach mit GetLimit() Limit holen
- // interner Aufruf von CalcLPQR()
- // die mathematisch unkorrekte Berechnung wird als Default genommen!
- WLevDistance( const sal_Unicode* cPattern, int nOtherX, int nShorterY,
- int nLongerZ, bool bRelaxed = true );
-
- WLevDistance( const WLevDistance& rWLD );
- ~WLevDistance();
-
- // Berechnung der Levenshtein-Distanz von String zu Pattern
- int WLD( const sal_Unicode* cString, sal_Int32 nStringLen );
-
- // Berechnung der Gewichtung aus Userangaben, return nLimit
- int CalcLPQR( int nOtherX, int nShorterY, int nLongerZ,
- bool bRelaxed = true );
-
- inline int GetLimit() const { return( nLimit ); } // Limit holen
- inline int GetReplaceP0() const { return( nRepP0 ); } // Gewichtungen holen
- inline int GetInsertQ0() const { return( nInsQ0 ); }
- inline int GetDeleteR0() const { return( nDelR0 ); }
- inline bool GetSplit() const { return( bSplitCount ); }
- inline int SetLimit( int nNewLimit ); // Limit setzen,
- inline int SetReplaceP0( int nNewP0 ); // Gewichtungen setzen,
- inline int SetInsertQ0( int nNewQ0 ); // returnen bisherigen Wert
- inline int SetDeleteR0( int nNewR0 );
- inline bool SetSplit( bool bNewSplit );
- // SetSplit( TRUE ) macht nur mit Werten nach CalcLPQR() Sinn!
-
- inline bool IsNormal( sal_Int32 nPos ) const { return( !bpPatIsWild[nPos] ); }
-};
-
-inline int WLevDistance::SetLimit( int nNewLimit )
-{
- int nTmp = nLimit;
- nLimit = nNewLimit;
- return( nTmp );
-}
-
-inline int WLevDistance::SetReplaceP0( int nNewP0 )
-{
- int nTmp = nRepP0;
- nRepP0 = nNewP0;
- return( nTmp );
-}
-
-inline int WLevDistance::SetInsertQ0( int nNewQ0 )
-{
- int nTmp = nInsQ0;
- nInsQ0 = nNewQ0;
- return( nTmp );
-}
-
-inline int WLevDistance::SetDeleteR0( int nNewR0 )
-{
- int nTmp = nDelR0;
- nDelR0 = nNewR0;
- return( nTmp );
-}
-
-inline bool WLevDistance::SetSplit( bool bNewSplit )
-{
- bool bTmp = bSplitCount;
- bSplitCount = bNewSplit;
- return( bTmp );
-}
-
-#endif // _LEVDIS_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */