Skip to content

Instantly share code, notes, and snippets.

@glampert
glampert / in_place_function.hpp
Created May 15, 2017 00:06
std::function-like functor with an inline buffer that never dynamically allocates. Also doesn't use C++ exceptions.
#pragma once
// ============================================================================
// About:
// std::function-like functor that has an inline buffer to store the
// callable object. It is guaranteed to never allocate. If the callable
// is too big, a static_assert is triggered. The size of the functor is
// defined as a template argument, so it can be of any size. It also doesn't
// use C++ exceptions.
//
@glampert
glampert / lockless_hash_table.cpp
Created May 29, 2017 02:02
Fixed-size concurrent/lockless hash table for integer types using C++11 atomics.
// License:
// Public Domain. Feel free to copy, distribute, and modify this file as you see fit.
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <array>
#include <atomic>
//
// Simple allocator for small memory blocks (from 1 to 255 bytes).
// It keeps freelists of small blocks, built on top of 8K pages.
// The allocator only grows - empty pages are never freed back
// to the system.
//
// This allocator could easily be made lockless with atomic freelists.
//
#include <cstdint>
//
// General purpose minimal heap allocator.
//
// Keeps a freelist of chunks of arbitrary size. First round of allocations
// will use the whole heap block before it starts going into the freelist.
// Freeing just pushes the block back into the freelist and is constant time.
// Allocating might search the freelist if the whole heap was already allocated
// once.
//
// To reduce fragmentation we could merge free nodes either on free or allocate.
@glampert
glampert / asan_guarded_allocator.cpp
Created September 11, 2017 23:10
Simple allocator wrapper that adds ASan-poisoned header and footer buffers to each allocation.
// ----------------------------------------------------------------------------
// c++ -std=c++11 -Wall -Wextra -Wshadow -Wunused -pedantic -fsanitize=address -fno-omit-frame-pointer asan_guarded_allocator.cpp
#include <cassert>
#include <cstdio>
#include <cstdint>
#include <cstdlib>
#include <unordered_map>
@glampert
glampert / cplusrust_option_result.cpp
Created January 7, 2018 20:03
Mostly complete and usable C++ version of Rust's Option<T> and Result<T,E> using only standard C++14.
// Mostly complete and usable C++ version of Rust's Option<T> and Result<T,E> using only standard C++14, for fun.
// This code is in the public domain.
///////////////////////////////////////////////////////////////////////////////
// Option.hpp
///////////////////////////////////////////////////////////////////////////////
#pragma once
// ----------------------------------------------------------------------------
// Includes
@glampert
glampert / fast_itoa.cpp
Created May 8, 2018 23:35
Fast integer to ASCII string conversion functions.
#include <cassert>
#include <cstdint>
#include <cstdarg>
#include <cstdio>
#include <cmath>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <intrin.h>
@glampert
glampert / Memset.cpp
Created February 16, 2020 18:45
Silly memset function with optimizations for 4,8,16-byte aligned types.
#include <cstdio>
#include <cstdint>
#include <cassert>
#include <xmmintrin.h>
///////////////////////////////////////////////////////////////////////////////
namespace detail
{