Skip to content

Instantly share code, notes, and snippets.

View elbeno's full-sized avatar

Ben Deane elbeno

View GitHub Profile
@elbeno
elbeno / enum_class_abuse.cpp
Last active November 28, 2016 10:48
Treating enum class as flags or iterable
#include <cstdint>
#include <iostream>
#include <iterator>
#include <type_traits>
using namespace std;
// -----------------------------------------------------------------------------
// Traits for treating enums like flags, and/or giving the ability to loop over
// them
@elbeno
elbeno / forward_tuple.cpp
Last active March 5, 2016 18:56
Forwarding to a member function using a tuple
#include <cstddef>
#include <iostream>
#include <string>
#include <tuple>
#include <type_traits>
#include <utility>
using namespace std;
template <typename T>
@elbeno
elbeno / auto_pitfall.cpp
Last active February 16, 2016 03:58
C++ auto may cause unwanted copies with getters
#include <iostream>
#include <string>
#include <type_traits>
using namespace std;
struct Foo
{
Foo() {}
Foo(const Foo&)
@elbeno
elbeno / fizzbuzz.cpp
Created January 6, 2016 05:06
FizzBuzz in C++14
#include <cstddef>
#include <iostream>
#include <string>
#include <utility>
using namespace std;
template <bool div3, bool div5>
struct printer
{
@elbeno
elbeno / knights_knaves.cpp
Last active August 29, 2015 14:22
Knights & Knaves solved with the list monad in C++
#include <iostream>
#include <iterator>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
using namespace std;
//------------------------------------------------------------------------------
// The "many-worlds" method of solving problems with the list monad
@elbeno
elbeno / constexpr_hash.cpp
Last active August 29, 2015 14:21
constexpr __FILE__ hashing
#include <iostream>
using namespace std;
constexpr unsigned long long fnv_hash64_r(unsigned long long result, const char* string)
{
return (*string == 0) ? result : fnv_hash64_r(1099511628211ULL * result ^ *string, string + 1);
}
constexpr unsigned long long fnv_hash64(const char* string)
{
@elbeno
elbeno / large_tuples.cpp
Last active August 29, 2015 14:21
Quick compilation of large tuples
#include <iostream>
#include <tuple>
using namespace std;
// When tuples get large, compile times suffer because the compiler is hashing
// the name of a really long type. Lambdas offer a way to truncate that type
// name, leading to faster compile times and the ability to instantiate larger
// tuples (the template depth quickly exceeds the max).
// Compare compile times:
@elbeno
elbeno / constexpr_lambda.cpp
Created May 19, 2015 01:05
A macro for constexpr lambdas in C++
#include <iostream>
#include <type_traits>
#include <utility>
template<class F>
struct wrapper
{
static_assert(std::is_empty<F>(), "Lambdas must be empty");
template<class... Ts>
decltype(auto) operator()(Ts&&... xs) const
@elbeno
elbeno / with_macro.cpp
Last active August 29, 2015 14:21
WITH macro for C++
#include <algorithm>
#include <cassert>
#include <utility>
#include <iostream>
using namespace std;
class Light
{
public:
void turn_on() { m_on = true; };
@elbeno
elbeno / for_each_args.cpp
Created May 17, 2015 00:21
Functions that work over their arguments
//------------------------------------------------------------------------------
// A function that will apply a function to each argument
#include <initializer_list>
#include <utility>
template <typename F, typename... Ts>
void for_each_arg(F&& f, Ts&&... ts)
{
using I = std::initializer_list<int>;
(void) I { (std::forward<F>(f)(std::forward<Ts>(ts)), 0)... };