]> git.lyx.org Git - lyx.git/blob - src/WordList.cpp
30ba5b63afc379c5af77090e95f370f6279e4386
[lyx.git] / src / WordList.cpp
1 /**
2  * \file WordList.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Stefan Schimanski
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "WordList.h"
14
15 #include "support/convert.h"
16 #include "support/debug.h"
17 #include "support/docstring.h"
18 #include "support/weighted_btree.h"
19
20 #include <boost/assert.hpp>
21
22 namespace lyx {
23
24 ///
25 WordList theGlobalWordList;
26
27 WordList & theWordList()
28 {
29         return theGlobalWordList;
30 }
31
32 ///
33 struct WordList::Impl {
34         ///
35         size_t c_;
36         ///
37         typedef stx::weighted_btree<docstring, size_t, int> Words;
38         ///
39         Words words_;
40 };
41
42
43 WordList::WordList()
44 {
45         d = new Impl;
46         d->c_ = 0;
47
48 #if 0
49         for (size_t i = 1000000; i > 0; --i) {
50                 d->words_.insert("a" + convert<docstring>(i), size_t(1), stx::Void());
51         }
52 #endif
53 }
54
55
56 WordList::~WordList()
57 {
58         delete d;
59 }
60
61
62 docstring const & WordList::word(size_t idx) const
63 {
64         Impl::Words::const_iterator it = d->words_.find_summed_weight(idx);
65         BOOST_ASSERT(it != d->words_.end());
66         return it->first;
67 }
68
69
70 size_t WordList::size() const
71 {
72         return d->words_.summed_weight();
73 }
74
75
76 void WordList::insert(docstring const & w)
77 {
78         Impl::Words::iterator it = d->words_.find(w);
79         if (it == d->words_.end())
80                 d->words_.insert(w, size_t(1), 1);
81         else {
82                 it.data()++;
83                 d->words_.change_weight(it, 1);
84         }
85 }
86
87
88 void WordList::remove(docstring const & w)
89 {
90         Impl::Words::iterator it = d->words_.find(w);
91         if (it != d->words_.end()) {
92                 it.data()--;
93                 d->words_.change_weight(it, 0);
94                 // We will not erase here, but instead we just leave it
95                 // in the btree with weight 0. This avoid too much
96                 // reorganisation of the tree all the time.
97                 //if (it.data() == 0)
98                 //      d->words_.erase(w);
99         }
100 }
101
102 } // namespace lyx