Skip to content

Instantly share code, notes, and snippets.

View saxbophone's full-sized avatar
🏳️‍⚧️

saxbophone

🏳️‍⚧️
View GitHub Profile
@saxbophone
saxbophone / span_babysitter.c++
Created September 16, 2023 13:31
using std::span to babysit array-new-allocated data
#include <cstddef>
#include <span>
template <typename T>
constexpr std::span<T> allocate(std::size_t size) {
return {new T[size], size};
}
@saxbophone
saxbophone / unpack_constexpr.c++
Last active September 7, 2023 21:26
Unpacking containers with variable-size at compile-time, without needing two duplicate functions to do so.
#include <cstddef>
#include <span>
constexpr std::size_t populate(std::span<int> data) {
std::size_t w = 0;
for (; w < 1000; ++w) {
// this should maybe be a bounds-check instead, but in theory
// this should only be called on containers that are exactly
@saxbophone
saxbophone / stringview.py
Last active August 3, 2023 03:33
Python StringView implementation. Supports slicing, iteration and creating sub-views of existing StringViews. No copying, only reference semantics.
class StringView:
"""
StringView implementation using minimal copying with maximum use of
reference semantics. Creating a sub-view of an existing StringView using
either object slicing or constructing one from another will reüse the same
source string object, using a reference rather than a copy.
The contents() method can similarly be used to get an iterator (Generator)
to access the view contents sequentially without putting it all in memory
at once.
A brand new string object is only created if the StringView is cast to str.
@saxbophone
saxbophone / rwlock.py
Created July 30, 2023 23:49 — forked from tylerneylon/rwlock.py
A simple read-write lock implementation in Python.
# -*- coding: utf-8 -*-
""" rwlock.py
A class to implement read-write locks on top of the standard threading
library.
This is implemented with two mutexes (threading.Lock instances) as per this
wikipedia pseudocode:
https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock#Using_two_mutexes
@saxbophone
saxbophone / c̴̎̓u̴͌̂r̵̛̓s̸̎̽é̵̉̉d̷͑̚.cpp
Last active June 11, 2023 12:23
Some truly c̴̎̓u̴͌̂r̵̛̓s̸̎̽é̵̉̉d̷͑̚ C++ code
struct $ {
$ (*$)($*);
};
$ d($* x) {
return *x;
}
int main() {
$ d = {::d};
@saxbophone
saxbophone / generic-multidim.c++
Created May 28, 2023 19:08
Dimension-generic multidimensional array in C++23
#include <cstddef>
#include <concepts>
// version with static bounds on the dimensions
template <typename T, std::size_t... DIMS>
struct vec {
template <std::convertible_to<std::size_t>... Is>
requires (sizeof...(Is) == sizeof...(DIMS))
T operator[](Is... indices) { return {}; }
};
@saxbophone
saxbophone / thread-safe-memoiser.c++
Last active April 7, 2023 14:46
Thread-safe function memoisation in C++
#include <functional>
#include <mutex>
#include <shared_mutex>
#include <tuple>
#include <unordered_map>
#include <boost/container_hash/hash.hpp>
template <class>
@saxbophone
saxbophone / float_test.c++
Last active May 4, 2024 17:39
Generate and verify safe ranges of integers for to-and-from float-int conversion
/*
* Written by Joshua Saxby ("saxbophone") 2023-03-14 -- saxbophone.com
*
* This demonstration program for how to derive max/min "safe" integers for
* conversion to and from floating point is hereby released into the public domain.
*/
#include <limits> // numeric_limits
#include <type_traits> // make_signed
@saxbophone
saxbophone / xflow_detect.c++
Created February 3, 2023 15:45
Overflow/underflow detection without having to operate twice
#include <iostream>
#include <climits>
unsigned detect_overflow(unsigned x) {
auto old_x = x++;
if (old_x > x) {
std::cerr << "Overflow occurred: " << x - 1 << " -> " << x << std::endl;
}
return x;
}
@saxbophone
saxbophone / sfml-deps.sh
Created January 31, 2023 21:23
Installs for SFML on linux
sudo apt-get install libx11-dev libxrandr-dev libudev-dev libfreetype-dev libopengl-dev libflac-dev libogg-dev libvorbis-dev libvorbisenc2 libvorbisfile3 libopenal-dev