Latest commit

History

345 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

tinyheaders

Various single-file cross-platform C/C++ headers implementing self-contianed libraries.

librarydescriptionlatest versionlanguage(s)license
tinyc22D collision detection routines on primitives, boolean results and/or manifold generation1.03C/C++zlib
tinysoundLoad/play/loop/pitch/pan WAV + OGG in mono/stereo, high performance custom mixer, decent performance custom pitch shifter (does not stretch time)1.08C/C++zlib
tinynet *Netcode for multiplayer games, reliable/unreliable packets, send/recieve large chunks reliably, encryption, network simulator, flow control, serialization + data integrity checks, compression0.0C/C++zlib
tinytimeQuick and dirty "main loop" timer function, along with utilities for integer-based high resolution timing1.0C/C++zlib
tinymemfileUtility for calling fscanf-alike functions on files embedded in memory1.0C++zlib
tinyfilesDirectory traversal, both recursive and manual1.0C/C++public domain
tinysidCompile time string hashing via preprocessing; turns strings into integers1.0C/C++zlib
tinymathProfessional level 3D vector math via SIMD intrinsics1.1C++zlib
tinypngload/save PNG, texture atlas compiler, DEFLATE compliant decompressor1.03C/C++public domain
tinyglOpenGL ES 3.0+ wrapper with carefully designed API to foster fast iteration1.02C/C++zlib
tinyutfutf-8 and utf-16 encoder/decoder1.0C/C++public domain
tinyhuffminimal static huffman encoder/decoder (compression)1.0C/C++zlib
tinyspheremeshGenerates beautiful vertices (triangles) of a sphere1.0C/C++zlib
tinypathc-string utility functions for Shlwapi.h style path manipulation1.01C/C++public domain
tinyallocstraight-forward but useful allocator collection1.01C/C++public domain
tinymath2d2d vector math and shape routines1.0C++public domain
tinyspritebatchrun-time 2d sprite batcher0.01C/C++public domain

* Not yet hit first release

How to Use

Generally these headers do not have dependencies and are intended to be included directly into your source (check each header for specific documentation at the top of the file). Each header has a LIBNAME_IMPLEMENTATION symbol; add this to a single translation unit in your code and include the header right after in order to define library symbols. Just include the header as normal otherwise.

Examples and Tests

Some headers also have example code or demos. In this repo just look for the corresponding examples or tests folders. The example folders are particularly useful for figuring out how to use a particular header.

FAQ

  • What's the point of making a single file? Why is there implementation and static functions in the headers?

Including these headers is like including a normal header. However, to define the implementation each header looks something like this:

#define LIBNAME_IMPLEMENTATION
#include "libname.h"

This will turn the file into a header + c file combo, one time. The point of this is: A) handling the header or sending it to people is easy, no zip files or anything just copy and paste a single file; B) build scripts are a pain in the ass, and these single-file libs can be integrated into any project without modifying a single build script.

  • Doesn't writing all the code in a header ruin compile times?

The stigma that header implementations slow compile time come from inline'd code and template spam. In either case every single translation unit must churn through the header and place inline versions of functions, or for templates generate various type-specific functions. It gets worse once the linker kicks in and needs to coalesce translation units together, deleting duplicated symbols. Often linkers are single-threaded tasks and can really bottleneck build times.

A well constructed single-file header will not use any templates and make use of inline sparingly. Additionally well constructed single-file headers use a #define to place implementation (the function definitions and symbols) into a single translation unit. In this way a well crafted single-file header is pretty much the best thing a C compiler can come across, as far as build times go. Especially when the header can optionally #define out unneeded features.

  • Aren't these header only libraries just a new fad?

I personally don't really know if it's a fad or not, but these files aren't really just headers. They are headers with the .C file part (the implementation) attached to the end. It's two different files stuck together with the C preprocessor, but the implementation part never shows up unless the user does #define LIB_IMPLEMENTATION. This define step is the only integration step required to use these headers.

Unfortunately writing a good header library is pretty hard, so just any random header lib out there in the wild is probably not a good one. The STB and RJM are my favorite header libs, and are a good reference to get an idea at what a good header lib looks like. Mattias Gustavsson also has some nice libraries. miniz is a little odd in the repository, but the releases are packed into a nice .c and .h combo -- a very useful library for creating wrapper libs!

  • Why do many of these libraries use zlib license, instead of public domain?

I am a younger engineer early in my career. The zlib license is a nice way to get my name out there a little more. It is very permissive. Basically nobody can claim they wrote the original code, or say I wrote modified versions. The difference between zlib and public domain is very minimal. If anyone needs a public domain version I would be happy to create a copy with a public domain license -- just contact me and ask.

  • Why are only a few libraries public domain?

The public domain libraries in this repository contain code I myself didn't write, and isntead extracted from other open source libraries. Usually the inside of each header will document where the code came from.

About

Collection of one-file C/C++ libraries with no dependencies, primarily used for games

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Latest commit

History

345 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

tinyheaders

Various single-file cross-platform C/C++ headers implementing self-contianed libraries.

librarydescriptionlatest versionlanguage(s)license
tinyc22D collision detection routines on primitives, boolean results and/or manifold generation1.03C/C++zlib
tinysoundLoad/play/loop/pitch/pan WAV + OGG in mono/stereo, high performance custom mixer, decent performance custom pitch shifter (does not stretch time)1.08C/C++zlib
tinynet *Netcode for multiplayer games, reliable/unreliable packets, send/recieve large chunks reliably, encryption, network simulator, flow control, serialization + data integrity checks, compression0.0C/C++zlib
tinytimeQuick and dirty "main loop" timer function, along with utilities for integer-based high resolution timing1.0C/C++zlib
tinymemfileUtility for calling fscanf-alike functions on files embedded in memory1.0C++zlib
tinyfilesDirectory traversal, both recursive and manual1.0C/C++public domain
tinysidCompile time string hashing via preprocessing; turns strings into integers1.0C/C++zlib
tinymathProfessional level 3D vector math via SIMD intrinsics1.1C++zlib
tinypngload/save PNG, texture atlas compiler, DEFLATE compliant decompressor1.03C/C++public domain
tinyglOpenGL ES 3.0+ wrapper with carefully designed API to foster fast iteration1.02C/C++zlib
tinyutfutf-8 and utf-16 encoder/decoder1.0C/C++public domain
tinyhuffminimal static huffman encoder/decoder (compression)1.0C/C++zlib
tinyspheremeshGenerates beautiful vertices (triangles) of a sphere1.0C/C++zlib
tinypathc-string utility functions for Shlwapi.h style path manipulation1.01C/C++public domain
tinyallocstraight-forward but useful allocator collection1.01C/C++public domain
tinymath2d2d vector math and shape routines1.0C++public domain
tinyspritebatchrun-time 2d sprite batcher0.01C/C++public domain

* Not yet hit first release

How to Use

Generally these headers do not have dependencies and are intended to be included directly into your source (check each header for specific documentation at the top of the file). Each header has a LIBNAME_IMPLEMENTATION symbol; add this to a single translation unit in your code and include the header right after in order to define library symbols. Just include the header as normal otherwise.

Examples and Tests

Some headers also have example code or demos. In this repo just look for the corresponding examples or tests folders. The example folders are particularly useful for figuring out how to use a particular header.

FAQ

  • What's the point of making a single file? Why is there implementation and static functions in the headers?

Including these headers is like including a normal header. However, to define the implementation each header looks something like this:

#define LIBNAME_IMPLEMENTATION
#include "libname.h"

This will turn the file into a header + c file combo, one time. The point of this is: A) handling the header or sending it to people is easy, no zip files or anything just copy and paste a single file; B) build scripts are a pain in the ass, and these single-file libs can be integrated into any project without modifying a single build script.

  • Doesn't writing all the code in a header ruin compile times?

The stigma that header implementations slow compile time come from inline'd code and template spam. In either case every single translation unit must churn through the header and place inline versions of functions, or for templates generate various type-specific functions. It gets worse once the linker kicks in and needs to coalesce translation units together, deleting duplicated symbols. Often linkers are single-threaded tasks and can really bottleneck build times.

A well constructed single-file header will not use any templates and make use of inline sparingly. Additionally well constructed single-file headers use a #define to place implementation (the function definitions and symbols) into a single translation unit. In this way a well crafted single-file header is pretty much the best thing a C compiler can come across, as far as build times go. Especially when the header can optionally #define out unneeded features.

  • Aren't these header only libraries just a new fad?

I personally don't really know if it's a fad or not, but these files aren't really just headers. They are headers with the .C file part (the implementation) attached to the end. It's two different files stuck together with the C preprocessor, but the implementation part never shows up unless the user does #define LIB_IMPLEMENTATION. This define step is the only integration step required to use these headers.

Unfortunately writing a good header library is pretty hard, so just any random header lib out there in the wild is probably not a good one. The STB and RJM are my favorite header libs, and are a good reference to get an idea at what a good header lib looks like. Mattias Gustavsson also has some nice libraries. miniz is a little odd in the repository, but the releases are packed into a nice .c and .h combo -- a very useful library for creating wrapper libs!

  • Why do many of these libraries use zlib license, instead of public domain?

I am a younger engineer early in my career. The zlib license is a nice way to get my name out there a little more. It is very permissive. Basically nobody can claim they wrote the original code, or say I wrote modified versions. The difference between zlib and public domain is very minimal. If anyone needs a public domain version I would be happy to create a copy with a public domain license -- just contact me and ask.

  • Why are only a few libraries public domain?

The public domain libraries in this repository contain code I myself didn't write, and isntead extracted from other open source libraries. Usually the inside of each header will document where the code came from.

About

Collection of one-file C/C++ libraries with no dependencies, primarily used for games

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Latest commit

History

345 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

tinyheaders

Various single-file cross-platform C/C++ headers implementing self-contianed libraries.

librarydescriptionlatest versionlanguage(s)license
tinyc22D collision detection routines on primitives, boolean results and/or manifold generation1.03C/C++zlib
tinysoundLoad/play/loop/pitch/pan WAV + OGG in mono/stereo, high performance custom mixer, decent performance custom pitch shifter (does not stretch time)1.08C/C++zlib
tinynet *Netcode for multiplayer games, reliable/unreliable packets, send/recieve large chunks reliably, encryption, network simulator, flow control, serialization + data integrity checks, compression0.0C/C++zlib
tinytimeQuick and dirty "main loop" timer function, along with utilities for integer-based high resolution timing1.0C/C++zlib
tinymemfileUtility for calling fscanf-alike functions on files embedded in memory1.0C++zlib
tinyfilesDirectory traversal, both recursive and manual1.0C/C++public domain
tinysidCompile time string hashing via preprocessing; turns strings into integers1.0C/C++zlib
tinymathProfessional level 3D vector math via SIMD intrinsics1.1C++zlib
tinypngload/save PNG, texture atlas compiler, DEFLATE compliant decompressor1.03C/C++public domain
tinyglOpenGL ES 3.0+ wrapper with carefully designed API to foster fast iteration1.02C/C++zlib
tinyutfutf-8 and utf-16 encoder/decoder1.0C/C++public domain
tinyhuffminimal static huffman encoder/decoder (compression)1.0C/C++zlib
tinyspheremeshGenerates beautiful vertices (triangles) of a sphere1.0C/C++zlib
tinypathc-string utility functions for Shlwapi.h style path manipulation1.01C/C++public domain
tinyallocstraight-forward but useful allocator collection1.01C/C++public domain
tinymath2d2d vector math and shape routines1.0C++public domain
tinyspritebatchrun-time 2d sprite batcher0.01C/C++public domain

* Not yet hit first release

How to Use

Generally these headers do not have dependencies and are intended to be included directly into your source (check each header for specific documentation at the top of the file). Each header has a LIBNAME_IMPLEMENTATION symbol; add this to a single translation unit in your code and include the header right after in order to define library symbols. Just include the header as normal otherwise.

Examples and Tests

Some headers also have example code or demos. In this repo just look for the corresponding examples or tests folders. The example folders are particularly useful for figuring out how to use a particular header.

FAQ

  • What's the point of making a single file? Why is there implementation and static functions in the headers?

Including these headers is like including a normal header. However, to define the implementation each header looks something like this:

#define LIBNAME_IMPLEMENTATION
#include "libname.h"

This will turn the file into a header + c file combo, one time. The point of this is: A) handling the header or sending it to people is easy, no zip files or anything just copy and paste a single file; B) build scripts are a pain in the ass, and these single-file libs can be integrated into any project without modifying a single build script.

  • Doesn't writing all the code in a header ruin compile times?

The stigma that header implementations slow compile time come from inline'd code and template spam. In either case every single translation unit must churn through the header and place inline versions of functions, or for templates generate various type-specific functions. It gets worse once the linker kicks in and needs to coalesce translation units together, deleting duplicated symbols. Often linkers are single-threaded tasks and can really bottleneck build times.

A well constructed single-file header will not use any templates and make use of inline sparingly. Additionally well constructed single-file headers use a #define to place implementation (the function definitions and symbols) into a single translation unit. In this way a well crafted single-file header is pretty much the best thing a C compiler can come across, as far as build times go. Especially when the header can optionally #define out unneeded features.

  • Aren't these header only libraries just a new fad?

I personally don't really know if it's a fad or not, but these files aren't really just headers. They are headers with the .C file part (the implementation) attached to the end. It's two different files stuck together with the C preprocessor, but the implementation part never shows up unless the user does #define LIB_IMPLEMENTATION. This define step is the only integration step required to use these headers.

Unfortunately writing a good header library is pretty hard, so just any random header lib out there in the wild is probably not a good one. The STB and RJM are my favorite header libs, and are a good reference to get an idea at what a good header lib looks like. Mattias Gustavsson also has some nice libraries. miniz is a little odd in the repository, but the releases are packed into a nice .c and .h combo -- a very useful library for creating wrapper libs!

  • Why do many of these libraries use zlib license, instead of public domain?

I am a younger engineer early in my career. The zlib license is a nice way to get my name out there a little more. It is very permissive. Basically nobody can claim they wrote the original code, or say I wrote modified versions. The difference between zlib and public domain is very minimal. If anyone needs a public domain version I would be happy to create a copy with a public domain license -- just contact me and ask.

  • Why are only a few libraries public domain?

The public domain libraries in this repository contain code I myself didn't write, and isntead extracted from other open source libraries. Usually the inside of each header will document where the code came from.

About

Collection of one-file C/C++ libraries with no dependencies, primarily used for games

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Latest commit

History

345 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

tinyheaders

Various single-file cross-platform C/C++ headers implementing self-contianed libraries.

librarydescriptionlatest versionlanguage(s)license
tinyc22D collision detection routines on primitives, boolean results and/or manifold generation1.03C/C++zlib
tinysoundLoad/play/loop/pitch/pan WAV + OGG in mono/stereo, high performance custom mixer, decent performance custom pitch shifter (does not stretch time)1.08C/C++zlib
tinynet *Netcode for multiplayer games, reliable/unreliable packets, send/recieve large chunks reliably, encryption, network simulator, flow control, serialization + data integrity checks, compression0.0C/C++zlib
tinytimeQuick and dirty "main loop" timer function, along with utilities for integer-based high resolution timing1.0C/C++zlib
tinymemfileUtility for calling fscanf-alike functions on files embedded in memory1.0C++zlib
tinyfilesDirectory traversal, both recursive and manual1.0C/C++public domain
tinysidCompile time string hashing via preprocessing; turns strings into integers1.0C/C++zlib
tinymathProfessional level 3D vector math via SIMD intrinsics1.1C++zlib
tinypngload/save PNG, texture atlas compiler, DEFLATE compliant decompressor1.03C/C++public domain
tinyglOpenGL ES 3.0+ wrapper with carefully designed API to foster fast iteration1.02C/C++zlib
tinyutfutf-8 and utf-16 encoder/decoder1.0C/C++public domain
tinyhuffminimal static huffman encoder/decoder (compression)1.0C/C++zlib
tinyspheremeshGenerates beautiful vertices (triangles) of a sphere1.0C/C++zlib
tinypathc-string utility functions for Shlwapi.h style path manipulation1.01C/C++public domain
tinyallocstraight-forward but useful allocator collection1.01C/C++public domain
tinymath2d2d vector math and shape routines1.0C++public domain
tinyspritebatchrun-time 2d sprite batcher0.01C/C++public domain

* Not yet hit first release

How to Use

Generally these headers do not have dependencies and are intended to be included directly into your source (check each header for specific documentation at the top of the file). Each header has a LIBNAME_IMPLEMENTATION symbol; add this to a single translation unit in your code and include the header right after in order to define library symbols. Just include the header as normal otherwise.

Examples and Tests

Some headers also have example code or demos. In this repo just look for the corresponding examples or tests folders. The example folders are particularly useful for figuring out how to use a particular header.

FAQ

  • What's the point of making a single file? Why is there implementation and static functions in the headers?

Including these headers is like including a normal header. However, to define the implementation each header looks something like this:

#define LIBNAME_IMPLEMENTATION
#include "libname.h"

This will turn the file into a header + c file combo, one time. The point of this is: A) handling the header or sending it to people is easy, no zip files or anything just copy and paste a single file; B) build scripts are a pain in the ass, and these single-file libs can be integrated into any project without modifying a single build script.

  • Doesn't writing all the code in a header ruin compile times?

The stigma that header implementations slow compile time come from inline'd code and template spam. In either case every single translation unit must churn through the header and place inline versions of functions, or for templates generate various type-specific functions. It gets worse once the linker kicks in and needs to coalesce translation units together, deleting duplicated symbols. Often linkers are single-threaded tasks and can really bottleneck build times.

A well constructed single-file header will not use any templates and make use of inline sparingly. Additionally well constructed single-file headers use a #define to place implementation (the function definitions and symbols) into a single translation unit. In this way a well crafted single-file header is pretty much the best thing a C compiler can come across, as far as build times go. Especially when the header can optionally #define out unneeded features.

  • Aren't these header only libraries just a new fad?

I personally don't really know if it's a fad or not, but these files aren't really just headers. They are headers with the .C file part (the implementation) attached to the end. It's two different files stuck together with the C preprocessor, but the implementation part never shows up unless the user does #define LIB_IMPLEMENTATION. This define step is the only integration step required to use these headers.

Unfortunately writing a good header library is pretty hard, so just any random header lib out there in the wild is probably not a good one. The STB and RJM are my favorite header libs, and are a good reference to get an idea at what a good header lib looks like. Mattias Gustavsson also has some nice libraries. miniz is a little odd in the repository, but the releases are packed into a nice .c and .h combo -- a very useful library for creating wrapper libs!

  • Why do many of these libraries use zlib license, instead of public domain?

I am a younger engineer early in my career. The zlib license is a nice way to get my name out there a little more. It is very permissive. Basically nobody can claim they wrote the original code, or say I wrote modified versions. The difference between zlib and public domain is very minimal. If anyone needs a public domain version I would be happy to create a copy with a public domain license -- just contact me and ask.

  • Why are only a few libraries public domain?

The public domain libraries in this repository contain code I myself didn't write, and isntead extracted from other open source libraries. Usually the inside of each header will document where the code came from.

About

Collection of one-file C/C++ libraries with no dependencies, primarily used for games

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Latest commit

History

345 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

tinyheaders

Various single-file cross-platform C/C++ headers implementing self-contianed libraries.

librarydescriptionlatest versionlanguage(s)license
tinyc22D collision detection routines on primitives, boolean results and/or manifold generation1.03C/C++zlib
tinysoundLoad/play/loop/pitch/pan WAV + OGG in mono/stereo, high performance custom mixer, decent performance custom pitch shifter (does not stretch time)1.08C/C++zlib
tinynet *Netcode for multiplayer games, reliable/unreliable packets, send/recieve large chunks reliably, encryption, network simulator, flow control, serialization + data integrity checks, compression0.0C/C++zlib
tinytimeQuick and dirty "main loop" timer function, along with utilities for integer-based high resolution timing1.0C/C++zlib
tinymemfileUtility for calling fscanf-alike functions on files embedded in memory1.0C++zlib
tinyfilesDirectory traversal, both recursive and manual1.0C/C++public domain
tinysidCompile time string hashing via preprocessing; turns strings into integers1.0C/C++zlib
tinymathProfessional level 3D vector math via SIMD intrinsics1.1C++zlib
tinypngload/save PNG, texture atlas compiler, DEFLATE compliant decompressor1.03C/C++public domain
tinyglOpenGL ES 3.0+ wrapper with carefully designed API to foster fast iteration1.02C/C++zlib
tinyutfutf-8 and utf-16 encoder/decoder1.0C/C++public domain
tinyhuffminimal static huffman encoder/decoder (compression)1.0C/C++zlib
tinyspheremeshGenerates beautiful vertices (triangles) of a sphere1.0C/C++zlib
tinypathc-string utility functions for Shlwapi.h style path manipulation1.01C/C++public domain
tinyallocstraight-forward but useful allocator collection1.01C/C++public domain
tinymath2d2d vector math and shape routines1.0C++public domain
tinyspritebatchrun-time 2d sprite batcher0.01C/C++public domain

* Not yet hit first release

How to Use

Generally these headers do not have dependencies and are intended to be included directly into your source (check each header for specific documentation at the top of the file). Each header has a LIBNAME_IMPLEMENTATION symbol; add this to a single translation unit in your code and include the header right after in order to define library symbols. Just include the header as normal otherwise.

Examples and Tests

Some headers also have example code or demos. In this repo just look for the corresponding examples or tests folders. The example folders are particularly useful for figuring out how to use a particular header.

FAQ

  • What's the point of making a single file? Why is there implementation and static functions in the headers?

Including these headers is like including a normal header. However, to define the implementation each header looks something like this:

#define LIBNAME_IMPLEMENTATION
#include "libname.h"

This will turn the file into a header + c file combo, one time. The point of this is: A) handling the header or sending it to people is easy, no zip files or anything just copy and paste a single file; B) build scripts are a pain in the ass, and these single-file libs can be integrated into any project without modifying a single build script.

  • Doesn't writing all the code in a header ruin compile times?

The stigma that header implementations slow compile time come from inline'd code and template spam. In either case every single translation unit must churn through the header and place inline versions of functions, or for templates generate various type-specific functions. It gets worse once the linker kicks in and needs to coalesce translation units together, deleting duplicated symbols. Often linkers are single-threaded tasks and can really bottleneck build times.

A well constructed single-file header will not use any templates and make use of inline sparingly. Additionally well constructed single-file headers use a #define to place implementation (the function definitions and symbols) into a single translation unit. In this way a well crafted single-file header is pretty much the best thing a C compiler can come across, as far as build times go. Especially when the header can optionally #define out unneeded features.

  • Aren't these header only libraries just a new fad?

I personally don't really know if it's a fad or not, but these files aren't really just headers. They are headers with the .C file part (the implementation) attached to the end. It's two different files stuck together with the C preprocessor, but the implementation part never shows up unless the user does #define LIB_IMPLEMENTATION. This define step is the only integration step required to use these headers.

Unfortunately writing a good header library is pretty hard, so just any random header lib out there in the wild is probably not a good one. The STB and RJM are my favorite header libs, and are a good reference to get an idea at what a good header lib looks like. Mattias Gustavsson also has some nice libraries. miniz is a little odd in the repository, but the releases are packed into a nice .c and .h combo -- a very useful library for creating wrapper libs!

  • Why do many of these libraries use zlib license, instead of public domain?

I am a younger engineer early in my career. The zlib license is a nice way to get my name out there a little more. It is very permissive. Basically nobody can claim they wrote the original code, or say I wrote modified versions. The difference between zlib and public domain is very minimal. If anyone needs a public domain version I would be happy to create a copy with a public domain license -- just contact me and ask.

  • Why are only a few libraries public domain?

The public domain libraries in this repository contain code I myself didn't write, and isntead extracted from other open source libraries. Usually the inside of each header will document where the code came from.

About

Collection of one-file C/C++ libraries with no dependencies, primarily used for games

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Latest commit

History

345 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

tinyheaders

Various single-file cross-platform C/C++ headers implementing self-contianed libraries.

librarydescriptionlatest versionlanguage(s)license
tinyc22D collision detection routines on primitives, boolean results and/or manifold generation1.03C/C++zlib
tinysoundLoad/play/loop/pitch/pan WAV + OGG in mono/stereo, high performance custom mixer, decent performance custom pitch shifter (does not stretch time)1.08C/C++zlib
tinynet *Netcode for multiplayer games, reliable/unreliable packets, send/recieve large chunks reliably, encryption, network simulator, flow control, serialization + data integrity checks, compression0.0C/C++zlib
tinytimeQuick and dirty "main loop" timer function, along with utilities for integer-based high resolution timing1.0C/C++zlib
tinymemfileUtility for calling fscanf-alike functions on files embedded in memory1.0C++zlib
tinyfilesDirectory traversal, both recursive and manual1.0C/C++public domain
tinysidCompile time string hashing via preprocessing; turns strings into integers1.0C/C++zlib
tinymathProfessional level 3D vector math via SIMD intrinsics1.1C++zlib
tinypngload/save PNG, texture atlas compiler, DEFLATE compliant decompressor1.03C/C++public domain
tinyglOpenGL ES 3.0+ wrapper with carefully designed API to foster fast iteration1.02C/C++zlib
tinyutfutf-8 and utf-16 encoder/decoder1.0C/C++public domain
tinyhuffminimal static huffman encoder/decoder (compression)1.0C/C++zlib
tinyspheremeshGenerates beautiful vertices (triangles) of a sphere1.0C/C++zlib
tinypathc-string utility functions for Shlwapi.h style path manipulation1.01C/C++public domain
tinyallocstraight-forward but useful allocator collection1.01C/C++public domain
tinymath2d2d vector math and shape routines1.0C++public domain
tinyspritebatchrun-time 2d sprite batcher0.01C/C++public domain

* Not yet hit first release

How to Use

Generally these headers do not have dependencies and are intended to be included directly into your source (check each header for specific documentation at the top of the file). Each header has a LIBNAME_IMPLEMENTATION symbol; add this to a single translation unit in your code and include the header right after in order to define library symbols. Just include the header as normal otherwise.

Examples and Tests

Some headers also have example code or demos. In this repo just look for the corresponding examples or tests folders. The example folders are particularly useful for figuring out how to use a particular header.

FAQ

  • What's the point of making a single file? Why is there implementation and static functions in the headers?

Including these headers is like including a normal header. However, to define the implementation each header looks something like this:

#define LIBNAME_IMPLEMENTATION
#include "libname.h"

This will turn the file into a header + c file combo, one time. The point of this is: A) handling the header or sending it to people is easy, no zip files or anything just copy and paste a single file; B) build scripts are a pain in the ass, and these single-file libs can be integrated into any project without modifying a single build script.

  • Doesn't writing all the code in a header ruin compile times?

The stigma that header implementations slow compile time come from inline'd code and template spam. In either case every single translation unit must churn through the header and place inline versions of functions, or for templates generate various type-specific functions. It gets worse once the linker kicks in and needs to coalesce translation units together, deleting duplicated symbols. Often linkers are single-threaded tasks and can really bottleneck build times.

A well constructed single-file header will not use any templates and make use of inline sparingly. Additionally well constructed single-file headers use a #define to place implementation (the function definitions and symbols) into a single translation unit. In this way a well crafted single-file header is pretty much the best thing a C compiler can come across, as far as build times go. Especially when the header can optionally #define out unneeded features.

  • Aren't these header only libraries just a new fad?

I personally don't really know if it's a fad or not, but these files aren't really just headers. They are headers with the .C file part (the implementation) attached to the end. It's two different files stuck together with the C preprocessor, but the implementation part never shows up unless the user does #define LIB_IMPLEMENTATION. This define step is the only integration step required to use these headers.

Unfortunately writing a good header library is pretty hard, so just any random header lib out there in the wild is probably not a good one. The STB and RJM are my favorite header libs, and are a good reference to get an idea at what a good header lib looks like. Mattias Gustavsson also has some nice libraries. miniz is a little odd in the repository, but the releases are packed into a nice .c and .h combo -- a very useful library for creating wrapper libs!

  • Why do many of these libraries use zlib license, instead of public domain?

I am a younger engineer early in my career. The zlib license is a nice way to get my name out there a little more. It is very permissive. Basically nobody can claim they wrote the original code, or say I wrote modified versions. The difference between zlib and public domain is very minimal. If anyone needs a public domain version I would be happy to create a copy with a public domain license -- just contact me and ask.

  • Why are only a few libraries public domain?

The public domain libraries in this repository contain code I myself didn't write, and isntead extracted from other open source libraries. Usually the inside of each header will document where the code came from.

About

Collection of one-file C/C++ libraries with no dependencies, primarily used for games

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Latest commit

History

345 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

tinyheaders

Various single-file cross-platform C/C++ headers implementing self-contianed libraries.

librarydescriptionlatest versionlanguage(s)license
tinyc22D collision detection routines on primitives, boolean results and/or manifold generation1.03C/C++zlib
tinysoundLoad/play/loop/pitch/pan WAV + OGG in mono/stereo, high performance custom mixer, decent performance custom pitch shifter (does not stretch time)1.08C/C++zlib
tinynet *Netcode for multiplayer games, reliable/unreliable packets, send/recieve large chunks reliably, encryption, network simulator, flow control, serialization + data integrity checks, compression0.0C/C++zlib
tinytimeQuick and dirty "main loop" timer function, along with utilities for integer-based high resolution timing1.0C/C++zlib
tinymemfileUtility for calling fscanf-alike functions on files embedded in memory1.0C++zlib
tinyfilesDirectory traversal, both recursive and manual1.0C/C++public domain
tinysidCompile time string hashing via preprocessing; turns strings into integers1.0C/C++zlib
tinymathProfessional level 3D vector math via SIMD intrinsics1.1C++zlib
tinypngload/save PNG, texture atlas compiler, DEFLATE compliant decompressor1.03C/C++public domain
tinyglOpenGL ES 3.0+ wrapper with carefully designed API to foster fast iteration1.02C/C++zlib
tinyutfutf-8 and utf-16 encoder/decoder1.0C/C++public domain
tinyhuffminimal static huffman encoder/decoder (compression)1.0C/C++zlib
tinyspheremeshGenerates beautiful vertices (triangles) of a sphere1.0C/C++zlib
tinypathc-string utility functions for Shlwapi.h style path manipulation1.01C/C++public domain
tinyallocstraight-forward but useful allocator collection1.01C/C++public domain
tinymath2d2d vector math and shape routines1.0C++public domain
tinyspritebatchrun-time 2d sprite batcher0.01C/C++public domain

* Not yet hit first release

How to Use

Generally these headers do not have dependencies and are intended to be included directly into your source (check each header for specific documentation at the top of the file). Each header has a LIBNAME_IMPLEMENTATION symbol; add this to a single translation unit in your code and include the header right after in order to define library symbols. Just include the header as normal otherwise.

Examples and Tests

Some headers also have example code or demos. In this repo just look for the corresponding examples or tests folders. The example folders are particularly useful for figuring out how to use a particular header.

FAQ

  • What's the point of making a single file? Why is there implementation and static functions in the headers?

Including these headers is like including a normal header. However, to define the implementation each header looks something like this:

#define LIBNAME_IMPLEMENTATION
#include "libname.h"

This will turn the file into a header + c file combo, one time. The point of this is: A) handling the header or sending it to people is easy, no zip files or anything just copy and paste a single file; B) build scripts are a pain in the ass, and these single-file libs can be integrated into any project without modifying a single build script.

  • Doesn't writing all the code in a header ruin compile times?

The stigma that header implementations slow compile time come from inline'd code and template spam. In either case every single translation unit must churn through the header and place inline versions of functions, or for templates generate various type-specific functions. It gets worse once the linker kicks in and needs to coalesce translation units together, deleting duplicated symbols. Often linkers are single-threaded tasks and can really bottleneck build times.

A well constructed single-file header will not use any templates and make use of inline sparingly. Additionally well constructed single-file headers use a #define to place implementation (the function definitions and symbols) into a single translation unit. In this way a well crafted single-file header is pretty much the best thing a C compiler can come across, as far as build times go. Especially when the header can optionally #define out unneeded features.

  • Aren't these header only libraries just a new fad?

I personally don't really know if it's a fad or not, but these files aren't really just headers. They are headers with the .C file part (the implementation) attached to the end. It's two different files stuck together with the C preprocessor, but the implementation part never shows up unless the user does #define LIB_IMPLEMENTATION. This define step is the only integration step required to use these headers.

Unfortunately writing a good header library is pretty hard, so just any random header lib out there in the wild is probably not a good one. The STB and RJM are my favorite header libs, and are a good reference to get an idea at what a good header lib looks like. Mattias Gustavsson also has some nice libraries. miniz is a little odd in the repository, but the releases are packed into a nice .c and .h combo -- a very useful library for creating wrapper libs!

  • Why do many of these libraries use zlib license, instead of public domain?

I am a younger engineer early in my career. The zlib license is a nice way to get my name out there a little more. It is very permissive. Basically nobody can claim they wrote the original code, or say I wrote modified versions. The difference between zlib and public domain is very minimal. If anyone needs a public domain version I would be happy to create a copy with a public domain license -- just contact me and ask.

  • Why are only a few libraries public domain?

The public domain libraries in this repository contain code I myself didn't write, and isntead extracted from other open source libraries. Usually the inside of each header will document where the code came from.

About

Collection of one-file C/C++ libraries with no dependencies, primarily used for games

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

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

Latest commit

History

345 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

tinyheaders

Various single-file cross-platform C/C++ headers implementing self-contianed libraries.

librarydescriptionlatest versionlanguage(s)license
tinyc22D collision detection routines on primitives, boolean results and/or manifold generation1.03C/C++zlib
tinysoundLoad/play/loop/pitch/pan WAV + OGG in mono/stereo, high performance custom mixer, decent performance custom pitch shifter (does not stretch time)1.08C/C++zlib
tinynet *Netcode for multiplayer games, reliable/unreliable packets, send/recieve large chunks reliably, encryption, network simulator, flow control, serialization + data integrity checks, compression0.0C/C++zlib
tinytimeQuick and dirty "main loop" timer function, along with utilities for integer-based high resolution timing1.0C/C++zlib
tinymemfileUtility for calling fscanf-alike functions on files embedded in memory1.0C++zlib
tinyfilesDirectory traversal, both recursive and manual1.0C/C++public domain
tinysidCompile time string hashing via preprocessing; turns strings into integers1.0C/C++zlib
tinymathProfessional level 3D vector math via SIMD intrinsics1.1C++zlib
tinypngload/save PNG, texture atlas compiler, DEFLATE compliant decompressor1.03C/C++public domain
tinyglOpenGL ES 3.0+ wrapper with carefully designed API to foster fast iteration1.02C/C++zlib
tinyutfutf-8 and utf-16 encoder/decoder1.0C/C++public domain
tinyhuffminimal static huffman encoder/decoder (compression)1.0C/C++zlib
tinyspheremeshGenerates beautiful vertices (triangles) of a sphere1.0C/C++zlib
tinypathc-string utility functions for Shlwapi.h style path manipulation1.01C/C++public domain
tinyallocstraight-forward but useful allocator collection1.01C/C++public domain
tinymath2d2d vector math and shape routines1.0C++public domain
tinyspritebatchrun-time 2d sprite batcher0.01C/C++public domain

* Not yet hit first release

How to Use

Generally these headers do not have dependencies and are intended to be included directly into your source (check each header for specific documentation at the top of the file). Each header has a LIBNAME_IMPLEMENTATION symbol; add this to a single translation unit in your code and include the header right after in order to define library symbols. Just include the header as normal otherwise.

Examples and Tests

Some headers also have example code or demos. In this repo just look for the corresponding examples or tests folders. The example folders are particularly useful for figuring out how to use a particular header.

FAQ

  • What's the point of making a single file? Why is there implementation and static functions in the headers?

Including these headers is like including a normal header. However, to define the implementation each header looks something like this:

#define LIBNAME_IMPLEMENTATION
#include "libname.h"

This will turn the file into a header + c file combo, one time. The point of this is: A) handling the header or sending it to people is easy, no zip files or anything just copy and paste a single file; B) build scripts are a pain in the ass, and these single-file libs can be integrated into any project without modifying a single build script.

  • Doesn't writing all the code in a header ruin compile times?

The stigma that header implementations slow compile time come from inline'd code and template spam. In either case every single translation unit must churn through the header and place inline versions of functions, or for templates generate various type-specific functions. It gets worse once the linker kicks in and needs to coalesce translation units together, deleting duplicated symbols. Often linkers are single-threaded tasks and can really bottleneck build times.

A well constructed single-file header will not use any templates and make use of inline sparingly. Additionally well constructed single-file headers use a #define to place implementation (the function definitions and symbols) into a single translation unit. In this way a well crafted single-file header is pretty much the best thing a C compiler can come across, as far as build times go. Especially when the header can optionally #define out unneeded features.

  • Aren't these header only libraries just a new fad?

I personally don't really know if it's a fad or not, but these files aren't really just headers. They are headers with the .C file part (the implementation) attached to the end. It's two different files stuck together with the C preprocessor, but the implementation part never shows up unless the user does #define LIB_IMPLEMENTATION. This define step is the only integration step required to use these headers.

Unfortunately writing a good header library is pretty hard, so just any random header lib out there in the wild is probably not a good one. The STB and RJM are my favorite header libs, and are a good reference to get an idea at what a good header lib looks like. Mattias Gustavsson also has some nice libraries. miniz is a little odd in the repository, but the releases are packed into a nice .c and .h combo -- a very useful library for creating wrapper libs!

  • Why do many of these libraries use zlib license, instead of public domain?

I am a younger engineer early in my career. The zlib license is a nice way to get my name out there a little more. It is very permissive. Basically nobody can claim they wrote the original code, or say I wrote modified versions. The difference between zlib and public domain is very minimal. If anyone needs a public domain version I would be happy to create a copy with a public domain license -- just contact me and ask.

  • Why are only a few libraries public domain?

The public domain libraries in this repository contain code I myself didn't write, and isntead extracted from other open source libraries. Usually the inside of each header will document where the code came from.

About

Collection of one-file C/C++ libraries with no dependencies, primarily used for games

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages