#pragma once

#include <vector>

class PrimeNumberGenerator {
 public:
    explicit PrimeNumberGenerator(int start) : start(start <= 1 ? 2 : start) {}

    int GetNextPrime() {
        int end = this->start * 2 + 1;
        std::vector<bool> matrix(end, false);
        int p = 1;
        while (true) {
            for (int i = p + 1; i < end; ++i) {
                if (!matrix[i]) {
                    p = i;
                    break;
                }
            }
            if (p * p > end - 1) {
                break;
            }
            int i = p;
            while (i * p < end) {
                matrix[i * p] = true;
                i++;
            }
        }
        for (int i = this->start; i < end; ++i) {
            if (!matrix[i]) {
                this->start = i + 1;
                return i;
            }
        }
        return this->start;
    }

 private:
    int start;
};