Repository files navigation

decodeless_mappedfile

decodeless is a collection of utility libraries for conveniently reading and writing files via memory mapping. Components can be used individually or combined.

decodeless_mappedfile is a small cross platform file mapping abstraction. It provides simple objects to read and write to existing files. However, the more interesting feature is a resizable mapped file. It works by reserving some virtual address space and growing a file mapping into it for a really convenient and fast way to write binary files.

decodeless_writer conbines this and decodeless_allocator to conveniently write complex data structures directly as binary data.

Advantages:

  • Data written is still accessible and can be random-access populated
  • Pointers remain valid after growing the file size
  • Write a file in one pass without computing the total size first
  • RAII intended
  • Memory mapping in general works well when combined with offset_ptr

Disadvantages:

  • If writing data structures directly, binary compatibility becomes a concern. For that, decodeless::allocator can handle alignment and decodeless::header adds some basics to detect if an architecture difference could be a problem.
  • Still needs a ballpark maximum size, but then virtual address space is cheap

Code Example

// Memory map a read-only file
decodeless::file mapped(filename);
constint* numbers = reinterpret_cast<constint*>(mapped.data());
...
// Create a filesize_t maxSize = 1 << 30; // reserved virtual address; can be huge
decodeless::resizable_file file(filename, maxSize);
EXPECT_EQ(file.size(), 0);
EXPECT_EQ(file.data(), nullptr);
// Resize and write some data
file.resize(sizeof(int) * 10);
int* numbers = reinterpret_cast<int*>(file.data());
numbers[9] = 9;
// Resize again. Pointer remains valid and there's more space
file.resize(sizeof(int) * 100);
EXPECT_EQ(numbers[9], 9);
numbers[99] = 99;

Building

This is a header-only C++20 library with CMake integration. Use any of:

  • add_subdirectory(path/to/mappedfile)
  • include(FetchContent)
    FetchContent_Declare(
    decodeless_mappedfile
    GIT_REPOSITORY https://github.com/decodeless/mappedfile.git
    GIT_TAG release_tag
    GIT_SHALLOWTRUE
    )
    FetchContent_MakeAvailable(decodeless_mappedfile)
  • find_package(decodeless_mappedfileREQUIREDCONFIGPATHSpaths/to/search)

Then,

target_link_libraries(myprojectPRIVATEdecodeless::mappedfile)

Notes

  • Windows implementation uses unofficial section API for NtExtendSection from wdm.h/ntdll.dll/"WDK". Please leave a comment if you know of an alternative. It works well, but technically could change at any time.

Contributing

Issues and pull requests are most welcome, thank you! Note the DCO and MIT LICENSE.

About

Cross platform growable file memory mapping for both reading and writing

Topics

Resources

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

decodeless_mappedfile

decodeless is a collection of utility libraries for conveniently reading and writing files via memory mapping. Components can be used individually or combined.

decodeless_mappedfile is a small cross platform file mapping abstraction. It provides simple objects to read and write to existing files. However, the more interesting feature is a resizable mapped file. It works by reserving some virtual address space and growing a file mapping into it for a really convenient and fast way to write binary files.

decodeless_writer conbines this and decodeless_allocator to conveniently write complex data structures directly as binary data.

Advantages:

  • Data written is still accessible and can be random-access populated
  • Pointers remain valid after growing the file size
  • Write a file in one pass without computing the total size first
  • RAII intended
  • Memory mapping in general works well when combined with offset_ptr

Disadvantages:

  • If writing data structures directly, binary compatibility becomes a concern. For that, decodeless::allocator can handle alignment and decodeless::header adds some basics to detect if an architecture difference could be a problem.
  • Still needs a ballpark maximum size, but then virtual address space is cheap

Code Example

// Memory map a read-only file
decodeless::file mapped(filename);
constint* numbers = reinterpret_cast<constint*>(mapped.data());
...
// Create a filesize_t maxSize = 1 << 30; // reserved virtual address; can be huge
decodeless::resizable_file file(filename, maxSize);
EXPECT_EQ(file.size(), 0);
EXPECT_EQ(file.data(), nullptr);
// Resize and write some data
file.resize(sizeof(int) * 10);
int* numbers = reinterpret_cast<int*>(file.data());
numbers[9] = 9;
// Resize again. Pointer remains valid and there's more space
file.resize(sizeof(int) * 100);
EXPECT_EQ(numbers[9], 9);
numbers[99] = 99;

Building

This is a header-only C++20 library with CMake integration. Use any of:

  • add_subdirectory(path/to/mappedfile)
  • include(FetchContent)
    FetchContent_Declare(
    decodeless_mappedfile
    GIT_REPOSITORY https://github.com/decodeless/mappedfile.git
    GIT_TAG release_tag
    GIT_SHALLOWTRUE
    )
    FetchContent_MakeAvailable(decodeless_mappedfile)
  • find_package(decodeless_mappedfileREQUIREDCONFIGPATHSpaths/to/search)

Then,

target_link_libraries(myprojectPRIVATEdecodeless::mappedfile)

Notes

  • Windows implementation uses unofficial section API for NtExtendSection from wdm.h/ntdll.dll/"WDK". Please leave a comment if you know of an alternative. It works well, but technically could change at any time.

Contributing

Issues and pull requests are most welcome, thank you! Note the DCO and MIT LICENSE.

About

Cross platform growable file memory mapping for both reading and writing

Topics

Resources

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

decodeless_mappedfile

decodeless is a collection of utility libraries for conveniently reading and writing files via memory mapping. Components can be used individually or combined.

decodeless_mappedfile is a small cross platform file mapping abstraction. It provides simple objects to read and write to existing files. However, the more interesting feature is a resizable mapped file. It works by reserving some virtual address space and growing a file mapping into it for a really convenient and fast way to write binary files.

decodeless_writer conbines this and decodeless_allocator to conveniently write complex data structures directly as binary data.

Advantages:

  • Data written is still accessible and can be random-access populated
  • Pointers remain valid after growing the file size
  • Write a file in one pass without computing the total size first
  • RAII intended
  • Memory mapping in general works well when combined with offset_ptr

Disadvantages:

  • If writing data structures directly, binary compatibility becomes a concern. For that, decodeless::allocator can handle alignment and decodeless::header adds some basics to detect if an architecture difference could be a problem.
  • Still needs a ballpark maximum size, but then virtual address space is cheap

Code Example

// Memory map a read-only file
decodeless::file mapped(filename);
constint* numbers = reinterpret_cast<constint*>(mapped.data());
...
// Create a filesize_t maxSize = 1 << 30; // reserved virtual address; can be huge
decodeless::resizable_file file(filename, maxSize);
EXPECT_EQ(file.size(), 0);
EXPECT_EQ(file.data(), nullptr);
// Resize and write some data
file.resize(sizeof(int) * 10);
int* numbers = reinterpret_cast<int*>(file.data());
numbers[9] = 9;
// Resize again. Pointer remains valid and there's more space
file.resize(sizeof(int) * 100);
EXPECT_EQ(numbers[9], 9);
numbers[99] = 99;

Building

This is a header-only C++20 library with CMake integration. Use any of:

  • add_subdirectory(path/to/mappedfile)
  • include(FetchContent)
    FetchContent_Declare(
    decodeless_mappedfile
    GIT_REPOSITORY https://github.com/decodeless/mappedfile.git
    GIT_TAG release_tag
    GIT_SHALLOWTRUE
    )
    FetchContent_MakeAvailable(decodeless_mappedfile)
  • find_package(decodeless_mappedfileREQUIREDCONFIGPATHSpaths/to/search)

Then,

target_link_libraries(myprojectPRIVATEdecodeless::mappedfile)

Notes

  • Windows implementation uses unofficial section API for NtExtendSection from wdm.h/ntdll.dll/"WDK". Please leave a comment if you know of an alternative. It works well, but technically could change at any time.

Contributing

Issues and pull requests are most welcome, thank you! Note the DCO and MIT LICENSE.

About

Cross platform growable file memory mapping for both reading and writing

Topics

Resources

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

decodeless_mappedfile

decodeless is a collection of utility libraries for conveniently reading and writing files via memory mapping. Components can be used individually or combined.

decodeless_mappedfile is a small cross platform file mapping abstraction. It provides simple objects to read and write to existing files. However, the more interesting feature is a resizable mapped file. It works by reserving some virtual address space and growing a file mapping into it for a really convenient and fast way to write binary files.

decodeless_writer conbines this and decodeless_allocator to conveniently write complex data structures directly as binary data.

Advantages:

  • Data written is still accessible and can be random-access populated
  • Pointers remain valid after growing the file size
  • Write a file in one pass without computing the total size first
  • RAII intended
  • Memory mapping in general works well when combined with offset_ptr

Disadvantages:

  • If writing data structures directly, binary compatibility becomes a concern. For that, decodeless::allocator can handle alignment and decodeless::header adds some basics to detect if an architecture difference could be a problem.
  • Still needs a ballpark maximum size, but then virtual address space is cheap

Code Example

// Memory map a read-only file
decodeless::file mapped(filename);
constint* numbers = reinterpret_cast<constint*>(mapped.data());
...
// Create a filesize_t maxSize = 1 << 30; // reserved virtual address; can be huge
decodeless::resizable_file file(filename, maxSize);
EXPECT_EQ(file.size(), 0);
EXPECT_EQ(file.data(), nullptr);
// Resize and write some data
file.resize(sizeof(int) * 10);
int* numbers = reinterpret_cast<int*>(file.data());
numbers[9] = 9;
// Resize again. Pointer remains valid and there's more space
file.resize(sizeof(int) * 100);
EXPECT_EQ(numbers[9], 9);
numbers[99] = 99;

Building

This is a header-only C++20 library with CMake integration. Use any of:

  • add_subdirectory(path/to/mappedfile)
  • include(FetchContent)
    FetchContent_Declare(
    decodeless_mappedfile
    GIT_REPOSITORY https://github.com/decodeless/mappedfile.git
    GIT_TAG release_tag
    GIT_SHALLOWTRUE
    )
    FetchContent_MakeAvailable(decodeless_mappedfile)
  • find_package(decodeless_mappedfileREQUIREDCONFIGPATHSpaths/to/search)

Then,

target_link_libraries(myprojectPRIVATEdecodeless::mappedfile)

Notes

  • Windows implementation uses unofficial section API for NtExtendSection from wdm.h/ntdll.dll/"WDK". Please leave a comment if you know of an alternative. It works well, but technically could change at any time.

Contributing

Issues and pull requests are most welcome, thank you! Note the DCO and MIT LICENSE.

About

Cross platform growable file memory mapping for both reading and writing

Topics

Resources

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

decodeless_mappedfile

decodeless is a collection of utility libraries for conveniently reading and writing files via memory mapping. Components can be used individually or combined.

decodeless_mappedfile is a small cross platform file mapping abstraction. It provides simple objects to read and write to existing files. However, the more interesting feature is a resizable mapped file. It works by reserving some virtual address space and growing a file mapping into it for a really convenient and fast way to write binary files.

decodeless_writer conbines this and decodeless_allocator to conveniently write complex data structures directly as binary data.

Advantages:

  • Data written is still accessible and can be random-access populated
  • Pointers remain valid after growing the file size
  • Write a file in one pass without computing the total size first
  • RAII intended
  • Memory mapping in general works well when combined with offset_ptr

Disadvantages:

  • If writing data structures directly, binary compatibility becomes a concern. For that, decodeless::allocator can handle alignment and decodeless::header adds some basics to detect if an architecture difference could be a problem.
  • Still needs a ballpark maximum size, but then virtual address space is cheap

Code Example

// Memory map a read-only file
decodeless::file mapped(filename);
constint* numbers = reinterpret_cast<constint*>(mapped.data());
...
// Create a filesize_t maxSize = 1 << 30; // reserved virtual address; can be huge
decodeless::resizable_file file(filename, maxSize);
EXPECT_EQ(file.size(), 0);
EXPECT_EQ(file.data(), nullptr);
// Resize and write some data
file.resize(sizeof(int) * 10);
int* numbers = reinterpret_cast<int*>(file.data());
numbers[9] = 9;
// Resize again. Pointer remains valid and there's more space
file.resize(sizeof(int) * 100);
EXPECT_EQ(numbers[9], 9);
numbers[99] = 99;

Building

This is a header-only C++20 library with CMake integration. Use any of:

  • add_subdirectory(path/to/mappedfile)
  • include(FetchContent)
    FetchContent_Declare(
    decodeless_mappedfile
    GIT_REPOSITORY https://github.com/decodeless/mappedfile.git
    GIT_TAG release_tag
    GIT_SHALLOWTRUE
    )
    FetchContent_MakeAvailable(decodeless_mappedfile)
  • find_package(decodeless_mappedfileREQUIREDCONFIGPATHSpaths/to/search)

Then,

target_link_libraries(myprojectPRIVATEdecodeless::mappedfile)

Notes

  • Windows implementation uses unofficial section API for NtExtendSection from wdm.h/ntdll.dll/"WDK". Please leave a comment if you know of an alternative. It works well, but technically could change at any time.

Contributing

Issues and pull requests are most welcome, thank you! Note the DCO and MIT LICENSE.

About

Cross platform growable file memory mapping for both reading and writing

Topics

Resources

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

decodeless_mappedfile

decodeless is a collection of utility libraries for conveniently reading and writing files via memory mapping. Components can be used individually or combined.

decodeless_mappedfile is a small cross platform file mapping abstraction. It provides simple objects to read and write to existing files. However, the more interesting feature is a resizable mapped file. It works by reserving some virtual address space and growing a file mapping into it for a really convenient and fast way to write binary files.

decodeless_writer conbines this and decodeless_allocator to conveniently write complex data structures directly as binary data.

Advantages:

  • Data written is still accessible and can be random-access populated
  • Pointers remain valid after growing the file size
  • Write a file in one pass without computing the total size first
  • RAII intended
  • Memory mapping in general works well when combined with offset_ptr

Disadvantages:

  • If writing data structures directly, binary compatibility becomes a concern. For that, decodeless::allocator can handle alignment and decodeless::header adds some basics to detect if an architecture difference could be a problem.
  • Still needs a ballpark maximum size, but then virtual address space is cheap

Code Example

// Memory map a read-only file
decodeless::file mapped(filename);
constint* numbers = reinterpret_cast<constint*>(mapped.data());
...
// Create a filesize_t maxSize = 1 << 30; // reserved virtual address; can be huge
decodeless::resizable_file file(filename, maxSize);
EXPECT_EQ(file.size(), 0);
EXPECT_EQ(file.data(), nullptr);
// Resize and write some data
file.resize(sizeof(int) * 10);
int* numbers = reinterpret_cast<int*>(file.data());
numbers[9] = 9;
// Resize again. Pointer remains valid and there's more space
file.resize(sizeof(int) * 100);
EXPECT_EQ(numbers[9], 9);
numbers[99] = 99;

Building

This is a header-only C++20 library with CMake integration. Use any of:

  • add_subdirectory(path/to/mappedfile)
  • include(FetchContent)
    FetchContent_Declare(
    decodeless_mappedfile
    GIT_REPOSITORY https://github.com/decodeless/mappedfile.git
    GIT_TAG release_tag
    GIT_SHALLOWTRUE
    )
    FetchContent_MakeAvailable(decodeless_mappedfile)
  • find_package(decodeless_mappedfileREQUIREDCONFIGPATHSpaths/to/search)

Then,

target_link_libraries(myprojectPRIVATEdecodeless::mappedfile)

Notes

  • Windows implementation uses unofficial section API for NtExtendSection from wdm.h/ntdll.dll/"WDK". Please leave a comment if you know of an alternative. It works well, but technically could change at any time.

Contributing

Issues and pull requests are most welcome, thank you! Note the DCO and MIT LICENSE.

About

Cross platform growable file memory mapping for both reading and writing

Topics

Resources

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

decodeless_mappedfile

decodeless is a collection of utility libraries for conveniently reading and writing files via memory mapping. Components can be used individually or combined.

decodeless_mappedfile is a small cross platform file mapping abstraction. It provides simple objects to read and write to existing files. However, the more interesting feature is a resizable mapped file. It works by reserving some virtual address space and growing a file mapping into it for a really convenient and fast way to write binary files.

decodeless_writer conbines this and decodeless_allocator to conveniently write complex data structures directly as binary data.

Advantages:

  • Data written is still accessible and can be random-access populated
  • Pointers remain valid after growing the file size
  • Write a file in one pass without computing the total size first
  • RAII intended
  • Memory mapping in general works well when combined with offset_ptr

Disadvantages:

  • If writing data structures directly, binary compatibility becomes a concern. For that, decodeless::allocator can handle alignment and decodeless::header adds some basics to detect if an architecture difference could be a problem.
  • Still needs a ballpark maximum size, but then virtual address space is cheap

Code Example

// Memory map a read-only file
decodeless::file mapped(filename);
constint* numbers = reinterpret_cast<constint*>(mapped.data());
...
// Create a filesize_t maxSize = 1 << 30; // reserved virtual address; can be huge
decodeless::resizable_file file(filename, maxSize);
EXPECT_EQ(file.size(), 0);
EXPECT_EQ(file.data(), nullptr);
// Resize and write some data
file.resize(sizeof(int) * 10);
int* numbers = reinterpret_cast<int*>(file.data());
numbers[9] = 9;
// Resize again. Pointer remains valid and there's more space
file.resize(sizeof(int) * 100);
EXPECT_EQ(numbers[9], 9);
numbers[99] = 99;

Building

This is a header-only C++20 library with CMake integration. Use any of:

  • add_subdirectory(path/to/mappedfile)
  • include(FetchContent)
    FetchContent_Declare(
    decodeless_mappedfile
    GIT_REPOSITORY https://github.com/decodeless/mappedfile.git
    GIT_TAG release_tag
    GIT_SHALLOWTRUE
    )
    FetchContent_MakeAvailable(decodeless_mappedfile)
  • find_package(decodeless_mappedfileREQUIREDCONFIGPATHSpaths/to/search)

Then,

target_link_libraries(myprojectPRIVATEdecodeless::mappedfile)

Notes

  • Windows implementation uses unofficial section API for NtExtendSection from wdm.h/ntdll.dll/"WDK". Please leave a comment if you know of an alternative. It works well, but technically could change at any time.

Contributing

Issues and pull requests are most welcome, thank you! Note the DCO and MIT LICENSE.

About

Cross platform growable file memory mapping for both reading and writing

Topics

Resources

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

decodeless_mappedfile

decodeless is a collection of utility libraries for conveniently reading and writing files via memory mapping. Components can be used individually or combined.

decodeless_mappedfile is a small cross platform file mapping abstraction. It provides simple objects to read and write to existing files. However, the more interesting feature is a resizable mapped file. It works by reserving some virtual address space and growing a file mapping into it for a really convenient and fast way to write binary files.

decodeless_writer conbines this and decodeless_allocator to conveniently write complex data structures directly as binary data.

Advantages:

  • Data written is still accessible and can be random-access populated
  • Pointers remain valid after growing the file size
  • Write a file in one pass without computing the total size first
  • RAII intended
  • Memory mapping in general works well when combined with offset_ptr

Disadvantages:

  • If writing data structures directly, binary compatibility becomes a concern. For that, decodeless::allocator can handle alignment and decodeless::header adds some basics to detect if an architecture difference could be a problem.
  • Still needs a ballpark maximum size, but then virtual address space is cheap

Code Example

// Memory map a read-only file
decodeless::file mapped(filename);
constint* numbers = reinterpret_cast<constint*>(mapped.data());
...
// Create a filesize_t maxSize = 1 << 30; // reserved virtual address; can be huge
decodeless::resizable_file file(filename, maxSize);
EXPECT_EQ(file.size(), 0);
EXPECT_EQ(file.data(), nullptr);
// Resize and write some data
file.resize(sizeof(int) * 10);
int* numbers = reinterpret_cast<int*>(file.data());
numbers[9] = 9;
// Resize again. Pointer remains valid and there's more space
file.resize(sizeof(int) * 100);
EXPECT_EQ(numbers[9], 9);
numbers[99] = 99;

Building

This is a header-only C++20 library with CMake integration. Use any of:

  • add_subdirectory(path/to/mappedfile)
  • include(FetchContent)
    FetchContent_Declare(
    decodeless_mappedfile
    GIT_REPOSITORY https://github.com/decodeless/mappedfile.git
    GIT_TAG release_tag
    GIT_SHALLOWTRUE
    )
    FetchContent_MakeAvailable(decodeless_mappedfile)
  • find_package(decodeless_mappedfileREQUIREDCONFIGPATHSpaths/to/search)

Then,

target_link_libraries(myprojectPRIVATEdecodeless::mappedfile)

Notes

  • Windows implementation uses unofficial section API for NtExtendSection from wdm.h/ntdll.dll/"WDK". Please leave a comment if you know of an alternative. It works well, but technically could change at any time.

Contributing

Issues and pull requests are most welcome, thank you! Note the DCO and MIT LICENSE.

About

Cross platform growable file memory mapping for both reading and writing

Topics

Resources

Contributing

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages