Untitled

 avatar
unknown
plain_text
a year ago
1.8 kB
4
Indexable
#include <chrono>
#include <ctime>
#include <iostream>
#include <deque>
#include <queue>
#include <thread>
using namespace std;

class RateLimitedCalculator {
private:
    int callLimit;
    queue<chrono::time_point<chrono::system_clock>> callHistory;

public:
    RateLimitedCalculator(int callLimit) {
        this->callLimit = callLimit;
    }
    
    int getSum(int a, int b) {
        auto now = chrono::system_clock::now();

        // Remove calls older than a minute
        while (!callHistory.empty() && chrono::duration_cast<chrono::minutes>(now - callHistory.front()).count() >= 1) {
            callHistory.pop();
        }
        // Check if call limit is reached
        if (callHistory.size() >= callLimit) {
            throw runtime_error("Rate limit exceeded. Please try again later.");
        }
        // Add current call to callHistory queue
        callHistory.push(now);
        return a + b;
    }
};

int main() {
    // Allow 3 calls per minute
    RateLimitedCalculator calculator(3);

    try {
        cout << calculator.getSum(1, 2) << endl;
        cout << calculator.getSum(3, 4) << endl;
        cout << calculator.getSum(5, 6) << endl;
        // Throws error
        cout << calculator.getSum(7, 8) << endl;
        // Throws error
        cout << calculator.getSum(9, 10) << endl;
    }
    catch (const exception& e) {
        cout << "Error: " << e.what() << endl;
    }

    try{
        // Sleep for 1 minute
        this_thread::sleep_for(chrono::minutes(1)); 
        cout << calculator.getSum(11, 12) << endl; // Allowed again after reset
    }
    catch (const exception& e) {
        cout << "Error: " << e.what() << endl;
    }
    return 0;
}
Editor is loading...
Leave a Comment