Interview Question
SDE-2sCountry: United States
#include <string>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <thread>
#include <list>
#include <chrono>
using namespace std;
class Cache {
map <string, time_t> CacheItems;
public:
void add(string url, time_t timeoutSeconds)
{
timeoutSeconds += time(NULL);
CacheItems[url] = timeoutSeconds;
cout << "Added ==> " << url << ": " << timeoutSeconds << endl;
}
void eraseTimedOut() {
time_t now = time(NULL);
cout << now << endl;
list<string> expiredCacheItems;
for (auto iItem = CacheItems.rbegin(); iItem != CacheItems.rend(); ++iItem) {
if (0 >= difftime(iItem->second, now)) {
cout << "Expired: " << iItem->first << endl;
expiredCacheItems.push_back(iItem->first);
}
}
if (!expiredCacheItems.empty()) {
for (auto expiredItem : expiredCacheItems) {
CacheItems.erase(expiredItem);
}
expiredCacheItems.clear();
}
}
bool empty() {
return CacheItems.empty();
}
volatile static bool AbortCache;
static void waitForCacheExpiry()
{
Cache CacheItems;
CacheItems.add("google", 6);
CacheItems.add("quickexpire", 3);
CacheItems.add("myurl", 12);
while ((!CacheItems.empty()) && (!AbortCache)) {
this_thread::sleep_for(chrono::milliseconds(1000));
CacheItems.eraseTimedOut();
}
}
};
volatile bool Cache::AbortCache = false;
int main()
{
Cache c;
thread cacheExpiry(c.waitForCacheExpiry);
cacheExpiry.join();
string line;
cout << "Press enter to close.";
getline(cin, line);
return 0;
}
Please ignore earlier unformatted posts.. For some reason links are not allowed. Had to remove data and format the code..
#include <string>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <thread>
#include <list>
#include <chrono>
using namespace std;
class Cache {
map <string, time_t> CacheItems;
public:
void add(string url, time_t timeoutSeconds)
{
timeoutSeconds += time(NULL);
CacheItems[url] = timeoutSeconds;
cout << "Added ==> " << url << ": " << timeoutSeconds << endl;
}
void eraseTimedOut() {
time_t now = time(NULL);
cout << now << endl;
list<string> expiredCacheItems;
for (auto iItem = CacheItems.rbegin(); iItem != CacheItems.rend(); ++iItem) {
if (0 >= difftime(iItem->second, now)) {
cout << "Expired: " << iItem->first << endl;
expiredCacheItems.push_back(iItem->first);
}
}
if (!expiredCacheItems.empty()) {
for (auto expiredItem : expiredCacheItems) {
CacheItems.erase(expiredItem);
}
expiredCacheItems.clear();
}
}
bool empty() {
return CacheItems.empty();
}
volatile static bool AbortCache;
static void waitForCacheExpiry()
{
Cache CacheItems;
CacheItems.add("google", 6);
CacheItems.add("quickexpire", 3);
CacheItems.add("myurl", 12);
while ((!CacheItems.empty()) && (!AbortCache)) {
this_thread::sleep_for(chrono::milliseconds(1000));
CacheItems.eraseTimedOut();
}
}
};
volatile bool Cache::AbortCache = false;
int main()
{
Cache c;
thread cacheExpiry(c.waitForCacheExpiry);
cacheExpiry.join();
string line;
cout << "Press enter to close.";
getline(cin, line);
return 0;
}
#include <string>
- Omkar June 17, 2017#include <sstream>
#include <iostream>
#include <algorithm>
#include <map>
#include <thread>
#include <list>
#include <chrono>
using namespace std;
class Cache {
map <string, time_t> CacheItems;
public:
void add(string url, time_t timeoutSeconds)
{
timeoutSeconds += time(NULL);
CacheItems[url] = timeoutSeconds;
cout << "Added ==> " << url << ": " << timeoutSeconds << endl;
}
void eraseTimedOut() {
time_t now = time(NULL);
cout << now << endl;
list<string> expiredCacheItems;
for (auto iItem = CacheItems.rbegin(); iItem != CacheItems.rend(); ++iItem) {
if (0 >= difftime(iItem->second, now)) {
cout << "Expired: " << iItem->first << endl;
expiredCacheItems.push_back(iItem->first);
}
}
if (!expiredCacheItems.empty()) {
for (auto expiredItem : expiredCacheItems) {
CacheItems.erase(expiredItem);
}
expiredCacheItems.clear();
}
}
bool empty() {
return CacheItems.empty();
}
volatile static bool AbortCache;
static void waitForCacheExpiry()
{
Cache CacheItems;
CacheItems.add("google", 6);
CacheItems.add("quickexpire", 3);
CacheItems.add("myurl", 12);
while ((!CacheItems.empty()) && (!AbortCache)) {
this_thread::sleep_for(chrono::milliseconds(1000));
CacheItems.eraseTimedOut();
}
}
};
volatile bool Cache::AbortCache = false;
int main()
{
Cache c;
thread cacheExpiry(c.waitForCacheExpiry);
cacheExpiry.join();
string line;
cout << "Press enter to close.";
getline(cin, line);
return 0;
}