/src/aspell/modules/speller/default/primes.hpp
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2000 |
2 | | // Kevin Atkinson |
3 | | // |
4 | | // Permission to use, copy, modify, distribute and sell this software |
5 | | // and its documentation for any purpose is hereby granted without |
6 | | // fee, provided that the above copyright notice appear in all copies |
7 | | // and that both that copyright notice and this permission notice |
8 | | // appear in supporting documentation. Kevin Atkinson makes no |
9 | | // representations about the suitability of this software for any |
10 | | // purpose. It is provided "as is" without express or implied |
11 | | // warranty. |
12 | | |
13 | | #include <vector> |
14 | | |
15 | | namespace aspeller { |
16 | | |
17 | | class Primes { |
18 | | private: |
19 | | typedef std::vector<bool> Data; |
20 | | Data data; |
21 | | public: |
22 | | typedef Data::size_type size_type; |
23 | | typedef Data::size_type value_type; |
24 | | |
25 | 0 | Primes() {} |
26 | 0 | Primes(size_type s) {resize(s);} |
27 | 0 | size_type size() const {return data.size();} |
28 | | void resize(size_type s); |
29 | 0 | bool operator[] (size_type pos) const {return data[pos];} |
30 | | bool is_prime(size_type n) const; |
31 | 0 | size_type max_num() const {return (size()-1)*(size()-1);} |
32 | | |
33 | | // |
34 | | // Iterators |
35 | | // |
36 | | |
37 | | class const_reverse_iterator; |
38 | | class const_iterator { |
39 | | friend class Primes; |
40 | | friend class const_reverse_iterator; |
41 | | protected: |
42 | | size_type pos; |
43 | | const Primes* data; |
44 | 0 | const_iterator(const Primes *d, size_type p) {data = d; pos = p;} |
45 | | public: |
46 | 0 | const_iterator() {} |
47 | 0 | size_type operator* () {return pos;} |
48 | 0 | const_iterator& operator++ () { |
49 | 0 | size_type size = data->size(); |
50 | 0 | if (pos != size) |
51 | 0 | do {++pos;} while (pos != size && !(*data)[pos]); |
52 | 0 | return *this; |
53 | 0 | } |
54 | 0 | const_iterator operator++ (int) { |
55 | 0 | const_iterator temp = *this; |
56 | 0 | operator++(); |
57 | 0 | return temp; |
58 | 0 | } |
59 | 0 | const_iterator& operator-- () { |
60 | 0 | if (pos != 0) |
61 | 0 | do {--pos;} while (pos != 0 && !(*data)[pos]); |
62 | 0 | return *this; |
63 | 0 | } |
64 | 0 | const_iterator operator-- (int) { |
65 | 0 | const_iterator temp = *this; |
66 | 0 | operator--(); |
67 | 0 | return temp; |
68 | 0 | } |
69 | 0 | const_iterator& jump(size_type p) { |
70 | 0 | pos = p; |
71 | 0 | if (!(*data)[pos]) |
72 | 0 | operator++(); |
73 | 0 | return *this; |
74 | 0 | } |
75 | | |
76 | | inline friend bool operator == (const const_iterator &rhs, |
77 | 0 | const const_iterator &lhs) { |
78 | 0 | return rhs.data == lhs.data && rhs.pos == lhs.pos; |
79 | 0 | } |
80 | | }; |
81 | | typedef const_iterator iterator; |
82 | | |
83 | | class const_reverse_iterator : private const_iterator { |
84 | | friend class Primes; |
85 | | protected: |
86 | 0 | const_reverse_iterator(const Primes *d, size_type p) {data = d; pos = p;} |
87 | | public: |
88 | 0 | const_reverse_iterator() {} |
89 | | const_reverse_iterator(const const_iterator &other) : |
90 | 0 | const_iterator(other) {} |
91 | 0 | size_type operator* () const {return pos;} |
92 | 0 | const_reverse_iterator& operator++ () {const_iterator::operator--(); return *this;} |
93 | 0 | const_reverse_iterator operator++ (int){return const_iterator::operator--(1);} |
94 | 0 | const_reverse_iterator& operator-- () {const_iterator::operator++(); return *this;} |
95 | 0 | const_reverse_iterator operator-- (int) {return const_iterator::operator++(1); return *this;} |
96 | | |
97 | 0 | const_reverse_iterator& jump(size_type p) { |
98 | 0 | pos = p; |
99 | 0 | if (!(*data)[pos]) |
100 | 0 | operator++(); |
101 | 0 | return *this; |
102 | 0 | } |
103 | | |
104 | | inline friend bool operator == (const const_reverse_iterator &rhs, |
105 | 0 | const const_reverse_iterator &lhs) { |
106 | 0 | return rhs.data == lhs.data && rhs.pos == lhs.pos; |
107 | 0 | } |
108 | | }; |
109 | | typedef const_reverse_iterator reverse_iterator; |
110 | | |
111 | | typedef Data::const_iterator const_ra_iterator; |
112 | | typedef const_ra_iterator ra_iterator; |
113 | | typedef Data::const_reverse_iterator const_reverse_ra_iterator; |
114 | | typedef const_reverse_ra_iterator reverse_ra_iterator; |
115 | | |
116 | 0 | const_iterator begin() const {return const_iterator(this, 2);} |
117 | 0 | const_iterator end() const {return const_iterator(this, size());} |
118 | 0 | const_iterator jump(size_type p) {return const_iterator(this,0).jump(p);} |
119 | 0 | const_reverse_iterator rbegin() const {return ++const_reverse_iterator(this, size());} |
120 | 0 | const_reverse_iterator rend() const {return const_reverse_iterator(this, 0);} |
121 | 0 | const_reverse_iterator rjump(size_type p) {return const_reverse_iterator(this,0).jump(p);} |
122 | | |
123 | 0 | const_ra_iterator ra_begin() const {return data.begin();} |
124 | 0 | const_ra_iterator ra_end() const {return data.end();} |
125 | 0 | const_reverse_ra_iterator r_ra_begin() const {return data.rbegin();} |
126 | 0 | const_reverse_ra_iterator r_ra_end() const {return data.rend();} |
127 | | }; |
128 | | |
129 | | } |