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