Coverage Report

Created: 2025-07-12 06:08

/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
}