Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homework/src/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,4 @@ add_subdirectory(hw06_strings)
add_subdirectory(hw07_structs)
add_subdirectory(hw08_linked_lists)
add_subdirectory(hw09_binary_search_trees)
add_subdirectory(hw10_skip_lists)
3 changes: 3 additions & 0 deletions homework/src/hw10_skip_lists/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
add_library(hw10 hw10.cpp)

target_include_directories(hw10 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${gtest_SOURCE_DIR}/include")
Empty file.
114 changes: 114 additions & 0 deletions homework/src/hw10_skip_lists/hw10.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
#pragma once

#include <cstddef> // for size_t

namespace cppclass
{
template <typename T, const size_t MAX_LEVEL> class SkipList
{
private:
struct Node
{
T data; ///< The data that the node contains.
Node **levels; ///< Pointer to an array of pointers. (heap-allocate)
size_t height; ///< The height of the node (the array).

/**
* @brief Constructs a node with the given @p.
*
* @param data Reference to the data to be contained.
* @param height The height of the node.
*/
Node(const T &data, const size_t height);

/**
* @brief Destroys a node.
*/
~Node();
};

public:
/**
* @brief Constructs an empty skip list.
*/
SkipList();

/**
* @brief Constructs a skip list from an array.
*
* @param arr Pointer to the array.
* @param size Size of the array.
*/
SkipList(const T *arr, const size_t size);

/**
* @brief Copy constructs a skip list from @p other.
*
* @param other Reference to the skip list to copy from.
*/
SkipList(const SkipList &other);

/**
* @brief Move contructs a skip list from @p other
*
* @param other R-Value reference to the skip list to move from.
*/
SkipList(SkipList &&other);

/**
* @brief Destroys the skip list.
*/
~SkipList();

/**
* @brief Searches the skip list for the node with @p data.
*
* @param data Data to search for.
* @return If found pointer to the node with @p data, else nullptr.
*/
Node *search(const T &data) const;

/**
* @brief Inserts a node with @p data into the skip list.
*
* @param data Data to add to skip list.
* @return True if inserted, otherwise false.
*/
bool insert(const T &data);

/**
* @brief Removes an element with @p data from the list.
*
* @param data The data of the item to be removed from the list.
* @return True if removed, otherwise false.
*/
bool remove(const T &data);

/**
* @brief Returns the number of nodes in the list.
*
* @return Number of nodes in the list.
*/
size_t size() const;

/**
* @brief Checks if two skip lists are equal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are identical. False otherwise.
*/
bool operator==(const SkipList &other) const;

/**
* @brief Checks if two skip lists are inequal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are not identical. False otherwise.
*/
bool operator!=(const SkipList &other) const;

private:
size_t m_size; ///< Number of nodes in the skip list.
Node *m_head; ///< Pointer to the first node in the skip list.
};
}
2 changes: 2 additions & 0 deletions homework/tests/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ set(SOURCE_FILES driver.cpp
tests_hw07.cpp
tests_hw08.cpp
tests_hw09.cpp
tests_hw10.cpp
)
set(HW_LIBS hw01
hw02
Expand All@@ -18,6 +19,7 @@ set(HW_LIBS hw01
hw07
hw08
hw09
hw10
)

add_executable(test_homework ${SOURCE_FILES})
Expand Down
1 change: 1 addition & 0 deletions homework/tests/tests_hw10.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
#include "hw10.h"
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homework/src/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,4 @@ add_subdirectory(hw06_strings)
add_subdirectory(hw07_structs)
add_subdirectory(hw08_linked_lists)
add_subdirectory(hw09_binary_search_trees)
add_subdirectory(hw10_skip_lists)
3 changes: 3 additions & 0 deletions homework/src/hw10_skip_lists/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
add_library(hw10 hw10.cpp)

target_include_directories(hw10 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${gtest_SOURCE_DIR}/include")
Empty file.
114 changes: 114 additions & 0 deletions homework/src/hw10_skip_lists/hw10.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
#pragma once

#include <cstddef> // for size_t

namespace cppclass
{
template <typename T, const size_t MAX_LEVEL> class SkipList
{
private:
struct Node
{
T data; ///< The data that the node contains.
Node **levels; ///< Pointer to an array of pointers. (heap-allocate)
size_t height; ///< The height of the node (the array).

/**
* @brief Constructs a node with the given @p.
*
* @param data Reference to the data to be contained.
* @param height The height of the node.
*/
Node(const T &data, const size_t height);

/**
* @brief Destroys a node.
*/
~Node();
};

public:
/**
* @brief Constructs an empty skip list.
*/
SkipList();

/**
* @brief Constructs a skip list from an array.
*
* @param arr Pointer to the array.
* @param size Size of the array.
*/
SkipList(const T *arr, const size_t size);

/**
* @brief Copy constructs a skip list from @p other.
*
* @param other Reference to the skip list to copy from.
*/
SkipList(const SkipList &other);

/**
* @brief Move contructs a skip list from @p other
*
* @param other R-Value reference to the skip list to move from.
*/
SkipList(SkipList &&other);

/**
* @brief Destroys the skip list.
*/
~SkipList();

/**
* @brief Searches the skip list for the node with @p data.
*
* @param data Data to search for.
* @return If found pointer to the node with @p data, else nullptr.
*/
Node *search(const T &data) const;

/**
* @brief Inserts a node with @p data into the skip list.
*
* @param data Data to add to skip list.
* @return True if inserted, otherwise false.
*/
bool insert(const T &data);

/**
* @brief Removes an element with @p data from the list.
*
* @param data The data of the item to be removed from the list.
* @return True if removed, otherwise false.
*/
bool remove(const T &data);

/**
* @brief Returns the number of nodes in the list.
*
* @return Number of nodes in the list.
*/
size_t size() const;

/**
* @brief Checks if two skip lists are equal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are identical. False otherwise.
*/
bool operator==(const SkipList &other) const;

/**
* @brief Checks if two skip lists are inequal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are not identical. False otherwise.
*/
bool operator!=(const SkipList &other) const;

private:
size_t m_size; ///< Number of nodes in the skip list.
Node *m_head; ///< Pointer to the first node in the skip list.
};
}
2 changes: 2 additions & 0 deletions homework/tests/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ set(SOURCE_FILES driver.cpp
tests_hw07.cpp
tests_hw08.cpp
tests_hw09.cpp
tests_hw10.cpp
)
set(HW_LIBS hw01
hw02
Expand All@@ -18,6 +19,7 @@ set(HW_LIBS hw01
hw07
hw08
hw09
hw10
)

add_executable(test_homework ${SOURCE_FILES})
Expand Down
1 change: 1 addition & 0 deletions homework/tests/tests_hw10.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
#include "hw10.h"
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homework/src/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,4 @@ add_subdirectory(hw06_strings)
add_subdirectory(hw07_structs)
add_subdirectory(hw08_linked_lists)
add_subdirectory(hw09_binary_search_trees)
add_subdirectory(hw10_skip_lists)
3 changes: 3 additions & 0 deletions homework/src/hw10_skip_lists/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
add_library(hw10 hw10.cpp)

target_include_directories(hw10 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${gtest_SOURCE_DIR}/include")
Empty file.
114 changes: 114 additions & 0 deletions homework/src/hw10_skip_lists/hw10.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
#pragma once

#include <cstddef> // for size_t

namespace cppclass
{
template <typename T, const size_t MAX_LEVEL> class SkipList
{
private:
struct Node
{
T data; ///< The data that the node contains.
Node **levels; ///< Pointer to an array of pointers. (heap-allocate)
size_t height; ///< The height of the node (the array).

/**
* @brief Constructs a node with the given @p.
*
* @param data Reference to the data to be contained.
* @param height The height of the node.
*/
Node(const T &data, const size_t height);

/**
* @brief Destroys a node.
*/
~Node();
};

public:
/**
* @brief Constructs an empty skip list.
*/
SkipList();

/**
* @brief Constructs a skip list from an array.
*
* @param arr Pointer to the array.
* @param size Size of the array.
*/
SkipList(const T *arr, const size_t size);

/**
* @brief Copy constructs a skip list from @p other.
*
* @param other Reference to the skip list to copy from.
*/
SkipList(const SkipList &other);

/**
* @brief Move contructs a skip list from @p other
*
* @param other R-Value reference to the skip list to move from.
*/
SkipList(SkipList &&other);

/**
* @brief Destroys the skip list.
*/
~SkipList();

/**
* @brief Searches the skip list for the node with @p data.
*
* @param data Data to search for.
* @return If found pointer to the node with @p data, else nullptr.
*/
Node *search(const T &data) const;

/**
* @brief Inserts a node with @p data into the skip list.
*
* @param data Data to add to skip list.
* @return True if inserted, otherwise false.
*/
bool insert(const T &data);

/**
* @brief Removes an element with @p data from the list.
*
* @param data The data of the item to be removed from the list.
* @return True if removed, otherwise false.
*/
bool remove(const T &data);

/**
* @brief Returns the number of nodes in the list.
*
* @return Number of nodes in the list.
*/
size_t size() const;

/**
* @brief Checks if two skip lists are equal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are identical. False otherwise.
*/
bool operator==(const SkipList &other) const;

/**
* @brief Checks if two skip lists are inequal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are not identical. False otherwise.
*/
bool operator!=(const SkipList &other) const;

private:
size_t m_size; ///< Number of nodes in the skip list.
Node *m_head; ///< Pointer to the first node in the skip list.
};
}
2 changes: 2 additions & 0 deletions homework/tests/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ set(SOURCE_FILES driver.cpp
tests_hw07.cpp
tests_hw08.cpp
tests_hw09.cpp
tests_hw10.cpp
)
set(HW_LIBS hw01
hw02
Expand All@@ -18,6 +19,7 @@ set(HW_LIBS hw01
hw07
hw08
hw09
hw10
)

add_executable(test_homework ${SOURCE_FILES})
Expand Down
1 change: 1 addition & 0 deletions homework/tests/tests_hw10.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
#include "hw10.h"
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homework/src/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,4 @@ add_subdirectory(hw06_strings)
add_subdirectory(hw07_structs)
add_subdirectory(hw08_linked_lists)
add_subdirectory(hw09_binary_search_trees)
add_subdirectory(hw10_skip_lists)
3 changes: 3 additions & 0 deletions homework/src/hw10_skip_lists/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
add_library(hw10 hw10.cpp)

target_include_directories(hw10 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${gtest_SOURCE_DIR}/include")
Empty file.
114 changes: 114 additions & 0 deletions homework/src/hw10_skip_lists/hw10.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
#pragma once

#include <cstddef> // for size_t

namespace cppclass
{
template <typename T, const size_t MAX_LEVEL> class SkipList
{
private:
struct Node
{
T data; ///< The data that the node contains.
Node **levels; ///< Pointer to an array of pointers. (heap-allocate)
size_t height; ///< The height of the node (the array).

/**
* @brief Constructs a node with the given @p.
*
* @param data Reference to the data to be contained.
* @param height The height of the node.
*/
Node(const T &data, const size_t height);

/**
* @brief Destroys a node.
*/
~Node();
};

public:
/**
* @brief Constructs an empty skip list.
*/
SkipList();

/**
* @brief Constructs a skip list from an array.
*
* @param arr Pointer to the array.
* @param size Size of the array.
*/
SkipList(const T *arr, const size_t size);

/**
* @brief Copy constructs a skip list from @p other.
*
* @param other Reference to the skip list to copy from.
*/
SkipList(const SkipList &other);

/**
* @brief Move contructs a skip list from @p other
*
* @param other R-Value reference to the skip list to move from.
*/
SkipList(SkipList &&other);

/**
* @brief Destroys the skip list.
*/
~SkipList();

/**
* @brief Searches the skip list for the node with @p data.
*
* @param data Data to search for.
* @return If found pointer to the node with @p data, else nullptr.
*/
Node *search(const T &data) const;

/**
* @brief Inserts a node with @p data into the skip list.
*
* @param data Data to add to skip list.
* @return True if inserted, otherwise false.
*/
bool insert(const T &data);

/**
* @brief Removes an element with @p data from the list.
*
* @param data The data of the item to be removed from the list.
* @return True if removed, otherwise false.
*/
bool remove(const T &data);

/**
* @brief Returns the number of nodes in the list.
*
* @return Number of nodes in the list.
*/
size_t size() const;

/**
* @brief Checks if two skip lists are equal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are identical. False otherwise.
*/
bool operator==(const SkipList &other) const;

/**
* @brief Checks if two skip lists are inequal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are not identical. False otherwise.
*/
bool operator!=(const SkipList &other) const;

private:
size_t m_size; ///< Number of nodes in the skip list.
Node *m_head; ///< Pointer to the first node in the skip list.
};
}
2 changes: 2 additions & 0 deletions homework/tests/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ set(SOURCE_FILES driver.cpp
tests_hw07.cpp
tests_hw08.cpp
tests_hw09.cpp
tests_hw10.cpp
)
set(HW_LIBS hw01
hw02
Expand All@@ -18,6 +19,7 @@ set(HW_LIBS hw01
hw07
hw08
hw09
hw10
)

add_executable(test_homework ${SOURCE_FILES})
Expand Down
1 change: 1 addition & 0 deletions homework/tests/tests_hw10.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
#include "hw10.h"
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homework/src/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,4 @@ add_subdirectory(hw06_strings)
add_subdirectory(hw07_structs)
add_subdirectory(hw08_linked_lists)
add_subdirectory(hw09_binary_search_trees)
add_subdirectory(hw10_skip_lists)
3 changes: 3 additions & 0 deletions homework/src/hw10_skip_lists/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
add_library(hw10 hw10.cpp)

target_include_directories(hw10 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${gtest_SOURCE_DIR}/include")
Empty file.
114 changes: 114 additions & 0 deletions homework/src/hw10_skip_lists/hw10.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
#pragma once

#include <cstddef> // for size_t

namespace cppclass
{
template <typename T, const size_t MAX_LEVEL> class SkipList
{
private:
struct Node
{
T data; ///< The data that the node contains.
Node **levels; ///< Pointer to an array of pointers. (heap-allocate)
size_t height; ///< The height of the node (the array).

/**
* @brief Constructs a node with the given @p.
*
* @param data Reference to the data to be contained.
* @param height The height of the node.
*/
Node(const T &data, const size_t height);

/**
* @brief Destroys a node.
*/
~Node();
};

public:
/**
* @brief Constructs an empty skip list.
*/
SkipList();

/**
* @brief Constructs a skip list from an array.
*
* @param arr Pointer to the array.
* @param size Size of the array.
*/
SkipList(const T *arr, const size_t size);

/**
* @brief Copy constructs a skip list from @p other.
*
* @param other Reference to the skip list to copy from.
*/
SkipList(const SkipList &other);

/**
* @brief Move contructs a skip list from @p other
*
* @param other R-Value reference to the skip list to move from.
*/
SkipList(SkipList &&other);

/**
* @brief Destroys the skip list.
*/
~SkipList();

/**
* @brief Searches the skip list for the node with @p data.
*
* @param data Data to search for.
* @return If found pointer to the node with @p data, else nullptr.
*/
Node *search(const T &data) const;

/**
* @brief Inserts a node with @p data into the skip list.
*
* @param data Data to add to skip list.
* @return True if inserted, otherwise false.
*/
bool insert(const T &data);

/**
* @brief Removes an element with @p data from the list.
*
* @param data The data of the item to be removed from the list.
* @return True if removed, otherwise false.
*/
bool remove(const T &data);

/**
* @brief Returns the number of nodes in the list.
*
* @return Number of nodes in the list.
*/
size_t size() const;

/**
* @brief Checks if two skip lists are equal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are identical. False otherwise.
*/
bool operator==(const SkipList &other) const;

/**
* @brief Checks if two skip lists are inequal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are not identical. False otherwise.
*/
bool operator!=(const SkipList &other) const;

private:
size_t m_size; ///< Number of nodes in the skip list.
Node *m_head; ///< Pointer to the first node in the skip list.
};
}
2 changes: 2 additions & 0 deletions homework/tests/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ set(SOURCE_FILES driver.cpp
tests_hw07.cpp
tests_hw08.cpp
tests_hw09.cpp
tests_hw10.cpp
)
set(HW_LIBS hw01
hw02
Expand All@@ -18,6 +19,7 @@ set(HW_LIBS hw01
hw07
hw08
hw09
hw10
)

add_executable(test_homework ${SOURCE_FILES})
Expand Down
1 change: 1 addition & 0 deletions homework/tests/tests_hw10.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
#include "hw10.h"
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homework/src/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,4 @@ add_subdirectory(hw06_strings)
add_subdirectory(hw07_structs)
add_subdirectory(hw08_linked_lists)
add_subdirectory(hw09_binary_search_trees)
add_subdirectory(hw10_skip_lists)
3 changes: 3 additions & 0 deletions homework/src/hw10_skip_lists/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
add_library(hw10 hw10.cpp)

target_include_directories(hw10 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${gtest_SOURCE_DIR}/include")
Empty file.
114 changes: 114 additions & 0 deletions homework/src/hw10_skip_lists/hw10.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
#pragma once

#include <cstddef> // for size_t

namespace cppclass
{
template <typename T, const size_t MAX_LEVEL> class SkipList
{
private:
struct Node
{
T data; ///< The data that the node contains.
Node **levels; ///< Pointer to an array of pointers. (heap-allocate)
size_t height; ///< The height of the node (the array).

/**
* @brief Constructs a node with the given @p.
*
* @param data Reference to the data to be contained.
* @param height The height of the node.
*/
Node(const T &data, const size_t height);

/**
* @brief Destroys a node.
*/
~Node();
};

public:
/**
* @brief Constructs an empty skip list.
*/
SkipList();

/**
* @brief Constructs a skip list from an array.
*
* @param arr Pointer to the array.
* @param size Size of the array.
*/
SkipList(const T *arr, const size_t size);

/**
* @brief Copy constructs a skip list from @p other.
*
* @param other Reference to the skip list to copy from.
*/
SkipList(const SkipList &other);

/**
* @brief Move contructs a skip list from @p other
*
* @param other R-Value reference to the skip list to move from.
*/
SkipList(SkipList &&other);

/**
* @brief Destroys the skip list.
*/
~SkipList();

/**
* @brief Searches the skip list for the node with @p data.
*
* @param data Data to search for.
* @return If found pointer to the node with @p data, else nullptr.
*/
Node *search(const T &data) const;

/**
* @brief Inserts a node with @p data into the skip list.
*
* @param data Data to add to skip list.
* @return True if inserted, otherwise false.
*/
bool insert(const T &data);

/**
* @brief Removes an element with @p data from the list.
*
* @param data The data of the item to be removed from the list.
* @return True if removed, otherwise false.
*/
bool remove(const T &data);

/**
* @brief Returns the number of nodes in the list.
*
* @return Number of nodes in the list.
*/
size_t size() const;

/**
* @brief Checks if two skip lists are equal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are identical. False otherwise.
*/
bool operator==(const SkipList &other) const;

/**
* @brief Checks if two skip lists are inequal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are not identical. False otherwise.
*/
bool operator!=(const SkipList &other) const;

private:
size_t m_size; ///< Number of nodes in the skip list.
Node *m_head; ///< Pointer to the first node in the skip list.
};
}
2 changes: 2 additions & 0 deletions homework/tests/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ set(SOURCE_FILES driver.cpp
tests_hw07.cpp
tests_hw08.cpp
tests_hw09.cpp
tests_hw10.cpp
)
set(HW_LIBS hw01
hw02
Expand All@@ -18,6 +19,7 @@ set(HW_LIBS hw01
hw07
hw08
hw09
hw10
)

add_executable(test_homework ${SOURCE_FILES})
Expand Down
1 change: 1 addition & 0 deletions homework/tests/tests_hw10.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
#include "hw10.h"
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homework/src/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,4 @@ add_subdirectory(hw06_strings)
add_subdirectory(hw07_structs)
add_subdirectory(hw08_linked_lists)
add_subdirectory(hw09_binary_search_trees)
add_subdirectory(hw10_skip_lists)
3 changes: 3 additions & 0 deletions homework/src/hw10_skip_lists/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
add_library(hw10 hw10.cpp)

target_include_directories(hw10 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${gtest_SOURCE_DIR}/include")
Empty file.
114 changes: 114 additions & 0 deletions homework/src/hw10_skip_lists/hw10.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
#pragma once

#include <cstddef> // for size_t

namespace cppclass
{
template <typename T, const size_t MAX_LEVEL> class SkipList
{
private:
struct Node
{
T data; ///< The data that the node contains.
Node **levels; ///< Pointer to an array of pointers. (heap-allocate)
size_t height; ///< The height of the node (the array).

/**
* @brief Constructs a node with the given @p.
*
* @param data Reference to the data to be contained.
* @param height The height of the node.
*/
Node(const T &data, const size_t height);

/**
* @brief Destroys a node.
*/
~Node();
};

public:
/**
* @brief Constructs an empty skip list.
*/
SkipList();

/**
* @brief Constructs a skip list from an array.
*
* @param arr Pointer to the array.
* @param size Size of the array.
*/
SkipList(const T *arr, const size_t size);

/**
* @brief Copy constructs a skip list from @p other.
*
* @param other Reference to the skip list to copy from.
*/
SkipList(const SkipList &other);

/**
* @brief Move contructs a skip list from @p other
*
* @param other R-Value reference to the skip list to move from.
*/
SkipList(SkipList &&other);

/**
* @brief Destroys the skip list.
*/
~SkipList();

/**
* @brief Searches the skip list for the node with @p data.
*
* @param data Data to search for.
* @return If found pointer to the node with @p data, else nullptr.
*/
Node *search(const T &data) const;

/**
* @brief Inserts a node with @p data into the skip list.
*
* @param data Data to add to skip list.
* @return True if inserted, otherwise false.
*/
bool insert(const T &data);

/**
* @brief Removes an element with @p data from the list.
*
* @param data The data of the item to be removed from the list.
* @return True if removed, otherwise false.
*/
bool remove(const T &data);

/**
* @brief Returns the number of nodes in the list.
*
* @return Number of nodes in the list.
*/
size_t size() const;

/**
* @brief Checks if two skip lists are equal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are identical. False otherwise.
*/
bool operator==(const SkipList &other) const;

/**
* @brief Checks if two skip lists are inequal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are not identical. False otherwise.
*/
bool operator!=(const SkipList &other) const;

private:
size_t m_size; ///< Number of nodes in the skip list.
Node *m_head; ///< Pointer to the first node in the skip list.
};
}
2 changes: 2 additions & 0 deletions homework/tests/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ set(SOURCE_FILES driver.cpp
tests_hw07.cpp
tests_hw08.cpp
tests_hw09.cpp
tests_hw10.cpp
)
set(HW_LIBS hw01
hw02
Expand All@@ -18,6 +19,7 @@ set(HW_LIBS hw01
hw07
hw08
hw09
hw10
)

add_executable(test_homework ${SOURCE_FILES})
Expand Down
1 change: 1 addition & 0 deletions homework/tests/tests_hw10.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
#include "hw10.h"
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions homework/src/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,3 +7,4 @@ add_subdirectory(hw06_strings)
add_subdirectory(hw07_structs)
add_subdirectory(hw08_linked_lists)
add_subdirectory(hw09_binary_search_trees)
add_subdirectory(hw10_skip_lists)
3 changes: 3 additions & 0 deletions homework/src/hw10_skip_lists/CMakeLists.txt
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
add_library(hw10 hw10.cpp)

target_include_directories(hw10 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${gtest_SOURCE_DIR}/include")
Empty file.
114 changes: 114 additions & 0 deletions homework/src/hw10_skip_lists/hw10.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
#pragma once

#include <cstddef> // for size_t

namespace cppclass
{
template <typename T, const size_t MAX_LEVEL> class SkipList
{
private:
struct Node
{
T data; ///< The data that the node contains.
Node **levels; ///< Pointer to an array of pointers. (heap-allocate)
size_t height; ///< The height of the node (the array).

/**
* @brief Constructs a node with the given @p.
*
* @param data Reference to the data to be contained.
* @param height The height of the node.
*/
Node(const T &data, const size_t height);

/**
* @brief Destroys a node.
*/
~Node();
};

public:
/**
* @brief Constructs an empty skip list.
*/
SkipList();

/**
* @brief Constructs a skip list from an array.
*
* @param arr Pointer to the array.
* @param size Size of the array.
*/
SkipList(const T *arr, const size_t size);

/**
* @brief Copy constructs a skip list from @p other.
*
* @param other Reference to the skip list to copy from.
*/
SkipList(const SkipList &other);

/**
* @brief Move contructs a skip list from @p other
*
* @param other R-Value reference to the skip list to move from.
*/
SkipList(SkipList &&other);

/**
* @brief Destroys the skip list.
*/
~SkipList();

/**
* @brief Searches the skip list for the node with @p data.
*
* @param data Data to search for.
* @return If found pointer to the node with @p data, else nullptr.
*/
Node *search(const T &data) const;

/**
* @brief Inserts a node with @p data into the skip list.
*
* @param data Data to add to skip list.
* @return True if inserted, otherwise false.
*/
bool insert(const T &data);

/**
* @brief Removes an element with @p data from the list.
*
* @param data The data of the item to be removed from the list.
* @return True if removed, otherwise false.
*/
bool remove(const T &data);

/**
* @brief Returns the number of nodes in the list.
*
* @return Number of nodes in the list.
*/
size_t size() const;

/**
* @brief Checks if two skip lists are equal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are identical. False otherwise.
*/
bool operator==(const SkipList &other) const;

/**
* @brief Checks if two skip lists are inequal in values and order.
*
* @param other Reference to other skip list.
* @return True, if values and order are not identical. False otherwise.
*/
bool operator!=(const SkipList &other) const;

private:
size_t m_size; ///< Number of nodes in the skip list.
Node *m_head; ///< Pointer to the first node in the skip list.
};
}
2 changes: 2 additions & 0 deletions homework/tests/CMakeLists.txt
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,7 @@ set(SOURCE_FILES driver.cpp
tests_hw07.cpp
tests_hw08.cpp
tests_hw09.cpp
tests_hw10.cpp
)
set(HW_LIBS hw01
hw02
Expand All@@ -18,6 +19,7 @@ set(HW_LIBS hw01
hw07
hw08
hw09
hw10
)

add_executable(test_homework ${SOURCE_FILES})
Expand Down
1 change: 1 addition & 0 deletions homework/tests/tests_hw10.cpp
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
#include "hw10.h"