mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
using uint for non negative numbers
This commit is contained in:
parent
59111de57f
commit
87e7df55bd
@ -59,82 +59,82 @@ namespace others {
|
||||
* @namespace lru_cache
|
||||
* @brief Implementation of LRU caching algorithm
|
||||
*/
|
||||
namespace lru_cache {
|
||||
namespace lru_cache {
|
||||
|
||||
/**
|
||||
* @brief LRU cache class
|
||||
*/
|
||||
class LRUCache {
|
||||
int pageFrame; ///< Page frame, or total size of the cache.
|
||||
std::list<int> cache; ///< Cache linked list (using the STL)
|
||||
std::unordered_map<int, std::list<int>::iterator>
|
||||
pageMap; ///< Hash map containing pages and their addresses
|
||||
class LRUCache {
|
||||
uint64_t pageFrame; ///< Page frame, or total size of the cache.
|
||||
std::list<uint64_t> cache; ///< Cache linked list (using the STL)
|
||||
std::unordered_map<uint64_t , std::list<uint64_t >::iterator>
|
||||
pageMap; ///< Hash map containing pages and their addresses
|
||||
|
||||
int hits = 0; ///< Total number of hits, or total number of times a page
|
||||
///< was found in cache.
|
||||
int pageFault = 0; ///< Total number of miss/page fault, or total number of
|
||||
///< times a page was not found in cache
|
||||
uint64_t hits = 0; ///< Total number of hits, or total number of times a page
|
||||
///< was found in cache.
|
||||
uint64_t pageFault = 0; ///< Total number of miss/page fault, or total number of
|
||||
///< times a page was not found in cache
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Constructor, Initialize thee LRU class with page frame.
|
||||
* @param pf Page frame or total size of cache.
|
||||
* */
|
||||
explicit LRUCache(int pf) { pageFrame = pf; }
|
||||
public:
|
||||
/**
|
||||
* @brief Constructor, Initialize thee LRU class with page frame.
|
||||
* @param pf Page frame or total size of cache.
|
||||
* */
|
||||
explicit LRUCache(uint64_t pf) { pageFrame = pf; }
|
||||
|
||||
/**
|
||||
* @brief Refer to a page, or request a page from memory.
|
||||
* @param page The page that you are referring to.
|
||||
* @returns void
|
||||
* */
|
||||
void refer(int page) {
|
||||
// If the page requested not in cache.
|
||||
if (pageMap.find(page) == pageMap.end()) {
|
||||
pageFault++; ///< Increase the page fault by one.
|
||||
/**
|
||||
* @brief Refer to a page, or request a page from memory.
|
||||
* @param page The page that you are referring to.
|
||||
* @returns void
|
||||
* */
|
||||
void refer(uint64_t page) {
|
||||
// If the page requested not in cache.
|
||||
if (pageMap.find(page) == pageMap.end()) {
|
||||
pageFault++; ///< Increase the page fault by one.
|
||||
|
||||
// Check if the cache is full
|
||||
if (cache.size() == pageFrame) {
|
||||
// delete the last page from cache
|
||||
int lastPage = cache.back();
|
||||
cache.pop_back();
|
||||
pageMap.erase(lastPage);
|
||||
// Check if the cache is full
|
||||
if (cache.size() == pageFrame) {
|
||||
// delete the last page from cache
|
||||
uint64_t lastPage = cache.back();
|
||||
cache.pop_back();
|
||||
pageMap.erase(lastPage);
|
||||
}
|
||||
}
|
||||
// The requested page is in the cache
|
||||
else {
|
||||
hits++;
|
||||
// present in cache, erase from current position to bring in front
|
||||
cache.erase(pageMap[page]);
|
||||
}
|
||||
// Push it in the front of the cache and update the page reference in
|
||||
// page map.
|
||||
cache.push_front(page);
|
||||
pageMap[page] = cache.begin();
|
||||
}
|
||||
}
|
||||
// The requested page is in the cache
|
||||
else {
|
||||
hits++;
|
||||
// present in cache, erase from current position to bring in front
|
||||
cache.erase(pageMap[page]);
|
||||
}
|
||||
// Push it in the front of the cache and update the page reference in
|
||||
// page map.
|
||||
cache.push_front(page);
|
||||
pageMap[page] = cache.begin();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief A function to display the current cache
|
||||
* @returns Void
|
||||
* */
|
||||
void display() {
|
||||
for (int &it : cache) {
|
||||
std::cout << it << " ";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
/**
|
||||
* @brief A function to get page hits
|
||||
* @returns int
|
||||
* */
|
||||
int getHits() const { return hits; }
|
||||
/**
|
||||
* @brief A function to get page fault
|
||||
* @returns int
|
||||
* */
|
||||
int getPageFault() const { return pageFault; }
|
||||
};
|
||||
/**
|
||||
* @brief A function to display the current cache
|
||||
* @returns Void
|
||||
* */
|
||||
void display() {
|
||||
for (uint64_t &it : cache) {
|
||||
std::cout << it << " ";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
/**
|
||||
* @brief A function to get page hits
|
||||
* @returns int
|
||||
* */
|
||||
uint64_t getHits() const { return hits; }
|
||||
/**
|
||||
* @brief A function to get page fault
|
||||
* @returns int
|
||||
* */
|
||||
uint64_t getPageFault() const { return pageFault; }
|
||||
};
|
||||
|
||||
} // namespace lru_cache
|
||||
} // namespace lru_cache
|
||||
} // namespace others
|
||||
|
||||
namespace lru_tests {
|
||||
@ -143,11 +143,11 @@ namespace lru_tests {
|
||||
* @tparam T Type of the given message.
|
||||
* @returns void
|
||||
* */
|
||||
template <typename T>
|
||||
void log(T msg) {
|
||||
// It's just to avoid writing cout and endl
|
||||
std::cout << "[TESTS] : ---> " << msg << std::endl;
|
||||
}
|
||||
template <typename T>
|
||||
void log(T msg) {
|
||||
// It's just to avoid writing cout and endl
|
||||
std::cout << "[TESTS] : ---> " << msg << std::endl;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief A simple test case
|
||||
@ -155,26 +155,26 @@ void log(T msg) {
|
||||
* miss
|
||||
* @returns void
|
||||
* */
|
||||
static void test_1() {
|
||||
int expected_hits = 2;
|
||||
int expected_pageFault = 4;
|
||||
static void test_1() {
|
||||
uint64_t expected_hits = 2;
|
||||
uint64_t expected_pageFault = 4;
|
||||
|
||||
log("Running Test-1...");
|
||||
log("Running Test-1...");
|
||||
|
||||
others::lru_cache::LRUCache cache(4);
|
||||
cache.refer(1);
|
||||
cache.refer(2);
|
||||
cache.refer(5);
|
||||
cache.refer(1);
|
||||
cache.refer(4);
|
||||
cache.refer(5);
|
||||
others::lru_cache::LRUCache cache(4);
|
||||
cache.refer(1);
|
||||
cache.refer(2);
|
||||
cache.refer(5);
|
||||
cache.refer(1);
|
||||
cache.refer(4);
|
||||
cache.refer(5);
|
||||
|
||||
log("Checking assert statement...");
|
||||
assert(cache.getHits() == expected_hits &&
|
||||
cache.getPageFault() == expected_pageFault);
|
||||
log("Assert successful!");
|
||||
log("Test-1 complete!");
|
||||
}
|
||||
log("Checking assert statement...");
|
||||
assert(cache.getHits() == expected_hits &&
|
||||
cache.getPageFault() == expected_pageFault);
|
||||
log("Assert successful!");
|
||||
log("Test-1 complete!");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief A test case contains hits more than cache size
|
||||
@ -182,26 +182,26 @@ static void test_1() {
|
||||
* miss
|
||||
* @returns void
|
||||
* */
|
||||
static void test_2() {
|
||||
int expected_hits = 4;
|
||||
int expected_pageFault = 2;
|
||||
static void test_2() {
|
||||
uint64_t expected_hits = 4;
|
||||
uint64_t expected_pageFault = 2;
|
||||
|
||||
log("Running Test-2...");
|
||||
log("Running Test-2...");
|
||||
|
||||
others::lru_cache::LRUCache cache(4);
|
||||
cache.refer(1);
|
||||
cache.refer(1);
|
||||
cache.refer(1);
|
||||
cache.refer(1);
|
||||
cache.refer(1);
|
||||
cache.refer(5);
|
||||
others::lru_cache::LRUCache cache(4);
|
||||
cache.refer(1);
|
||||
cache.refer(1);
|
||||
cache.refer(1);
|
||||
cache.refer(1);
|
||||
cache.refer(1);
|
||||
cache.refer(5);
|
||||
|
||||
log("Checking assert statement...");
|
||||
assert(cache.getHits() == expected_hits &&
|
||||
cache.getPageFault() == expected_pageFault);
|
||||
log("Assert successful!");
|
||||
log("Test-2 complete!");
|
||||
}
|
||||
log("Checking assert statement...");
|
||||
assert(cache.getHits() == expected_hits &&
|
||||
cache.getPageFault() == expected_pageFault);
|
||||
log("Assert successful!");
|
||||
log("Test-2 complete!");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief A simple test case
|
||||
@ -209,38 +209,38 @@ static void test_2() {
|
||||
* miss
|
||||
* @returns void
|
||||
* */
|
||||
static void test_3() {
|
||||
int expected_hits = 1;
|
||||
int expected_pageFault = 5;
|
||||
static void test_3() {
|
||||
uint64_t expected_hits = 1;
|
||||
uint64_t expected_pageFault = 5;
|
||||
|
||||
log("Running Test-3...");
|
||||
log("Running Test-3...");
|
||||
|
||||
others::lru_cache::LRUCache cache(4);
|
||||
cache.refer(1);
|
||||
cache.refer(2);
|
||||
cache.refer(3);
|
||||
cache.refer(4);
|
||||
cache.refer(5);
|
||||
cache.refer(5);
|
||||
others::lru_cache::LRUCache cache(4);
|
||||
cache.refer(1);
|
||||
cache.refer(2);
|
||||
cache.refer(3);
|
||||
cache.refer(4);
|
||||
cache.refer(5);
|
||||
cache.refer(5);
|
||||
|
||||
log("Checking assert statement...");
|
||||
assert(cache.getHits() == expected_hits &&
|
||||
cache.getPageFault() == expected_pageFault);
|
||||
log("Assert successful!");
|
||||
log("Test-3 complete!");
|
||||
}
|
||||
log("Checking assert statement...");
|
||||
assert(cache.getHits() == expected_hits &&
|
||||
cache.getPageFault() == expected_pageFault);
|
||||
log("Assert successful!");
|
||||
log("Test-3 complete!");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief A function to invoke all test cases
|
||||
* @returns void
|
||||
* */
|
||||
static void run_tests() {
|
||||
test_1();
|
||||
test_2();
|
||||
test_3();
|
||||
log("");
|
||||
log("TESTS COMPLETED!");
|
||||
}
|
||||
static void run_tests() {
|
||||
test_1();
|
||||
test_2();
|
||||
test_3();
|
||||
log("");
|
||||
log("TESTS COMPLETED!");
|
||||
}
|
||||
} // namespace lru_tests
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user