* high performance text completion with weighted btrees to get pseudo

random-access (i.e. O(log n)) to the n-th element in a list/set. Try
  it with 1000000 keys ... no problem.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@23213 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Stefan Schimanski 2008-02-25 01:56:53 +00:00
parent b78dbb5999
commit 9f21b7f9ad
4 changed files with 127 additions and 3 deletions

View File

@ -138,6 +138,7 @@ src_header_files = Split('''
sgml.h
update_flags.h
version.h
WordList.h
''')
@ -234,6 +235,7 @@ src_pre_files = Split('''
rowpainter.cpp
sgml.cpp
version.cpp
WordList.cpp
''')

View File

@ -127,6 +127,7 @@ SOURCEFILESCORE = \
lengthcommon.cpp \
Lexer.cpp \
LyX.cpp \
LyXAction.cpp
lyxfind.cpp \
LyXFunc.cpp \
LyXRC.cpp \
@ -142,6 +143,7 @@ SOURCEFILESCORE = \
output_plaintext.cpp \
Paragraph.cpp \
paragraph_funcs.cpp \
ParagraphMetrics.cpp \
ParagraphParameters.cpp \
ParIterator.cpp \
PDFOptions.cpp \
@ -165,8 +167,7 @@ SOURCEFILESCORE = \
VCBackend.cpp \
version.cpp \
VSpace.cpp \
ParagraphMetrics.cpp \
LyXAction.cpp
WordList.cpp
HEADERFILESCORE = \
Author.h \
@ -270,8 +271,9 @@ HEADERFILESCORE = \
update_flags.h \
VCBackend.h \
version.h \
VSpace.h \
WordLangTuple.h \
VSpace.h
WordList.h
STANDALONEFILES = \
Layout.cpp \

80
src/WordList.cpp Normal file
View File

@ -0,0 +1,80 @@
/**
* \file GuiCompleter.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Stefan Schimanski
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include <boost/assert.hpp>
#include <support/convert.h>
#include <support/debug.h>
#include <support/docstring.h>
#include <support/weighted_btree.h>
#include <WordList.h>
#include <algorithm>
#include <map>
#include <iostream>
#include <set>
namespace lyx {
///
struct WordList::Impl {
///
size_t c_;
///
typedef stx::weighted_btree<docstring, size_t> Words;
///
Words words_;
};
WordList::WordList()
{
d = new Impl;
d->c_ = 0;
#if 0
for (size_t i = 1000000; i > 0; --i) {
d->words_.insert("a" + convert<docstring>(i), size_t(1), stx::Void());
}
#endif
}
WordList::~WordList()
{
delete d;
}
docstring const & WordList::word(size_t idx) const
{
Impl::Words::const_iterator it
= d->words_.find_summed_weight(idx);
BOOST_ASSERT(it != d->words_.end());
return it->first;
}
size_t WordList::size() const
{
return d->words_.size();
}
void WordList::insert(docstring const & w)
{
d->words_.insert(w, size_t(1), stx::Void());
}
} // namespace lyx

40
src/WordList.h Normal file
View File

@ -0,0 +1,40 @@
// -*- C++ -*-
/**
* \file WordList.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Stefan Schimanski
*
* Full author contact details are available in file CREDITS.
*/
#ifndef WORDLIST_H
#define WORDLIST_H
#include "support/docstring.h"
namespace lyx {
class WordList {
public:
///
WordList();
///
~WordList();
///
docstring const & word(size_t idx) const;
///
size_t size() const;
///
void insert(docstring const & w);
private:
class Impl;
Impl * d;
};
} // namespace lyx
#endif // WORDLIST_H