3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Stefan Schimanski
8 * Full author contact details are available in file CREDITS.
15 #include "support/convert.h"
16 #include "support/debug.h"
17 #include "support/docstring.h"
18 #include "support/weighted_btree.h"
20 #include "support/lassert.h"
25 WordList theGlobalWordList
;
27 WordList
& theWordList()
29 return theGlobalWordList
;
33 struct WordList::Impl
{
37 typedef stx::weighted_btree
<docstring
, size_t, int> Words
;
49 for (size_t i
= 1000000; i
> 0; --i
) {
50 d
->words_
.insert("a" + convert
<docstring
>(i
), size_t(1), stx::Void());
62 docstring
const & WordList::word(size_t idx
) const
64 Impl::Words::const_iterator it
= d
->words_
.find_summed_weight(idx
);
65 LASSERT(it
!= d
->words_
.end(), /**/);
67 // We use the key() method here, and not something like it->first
68 // because the btree only returns (iterator-) temporary value pairs.
69 // If we returned the first component of those here, we get an
70 // invalid reference and therefore strange crashes.
75 size_t WordList::size() const
77 return d
->words_
.summed_weight();
81 void WordList::insert(docstring
const & w
)
83 Impl::Words::iterator it
= d
->words_
.find(w
);
84 if (it
== d
->words_
.end())
85 d
->words_
.insert(w
, size_t(1), 1);
88 d
->words_
.change_weight(it
, 1);
93 void WordList::remove(docstring
const & w
)
95 Impl::Words::iterator it
= d
->words_
.find(w
);
96 if (it
!= d
->words_
.end()) {
98 d
->words_
.change_weight(it
, 0);
99 // We will not erase here, but instead we just leave it
100 // in the btree with weight 0. This avoid too much
101 // reorganisation of the tree all the time.
102 //if (it.data() == 0)
103 // d->words_.erase(w);