#pragma once

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