Skip to content

Instantly share code, notes, and snippets.

Avatar

Jorge jbelloncastro

View GitHub Profile
View clang dump layouts
clang++ -Xclang -fdump-record-layouts file.cpp
@jbelloncastro
jbelloncastro / generate_array.cpp
Last active Jul 8, 2019
Create arrays of no-default-constructible elements with std::generate like syntax.
View generate_array.cpp
#include <array>
#include <utility>
template < class F, size_t... Ns >
constexpr
std::array<decltype(std::declval<F>()(size_t(0))),sizeof...(Ns)>
generate_array( F&& f, std::index_sequence<Ns...> )
{
return { f(Ns)... };
}
@jbelloncastro
jbelloncastro / literal.hpp
Last active Aug 22, 2019
Embed string literals in a datatype
View literal.hpp
#include <array>
#include <tuple>
#include <string_view>
#include <utility>
template < class CharT, CharT... cs >
struct Literal {
static bool match( std::basic_string_view<CharT> s ) {
static constexpr std::array<CharT,sizeof...(cs)> value{cs...};
return std::equal(value.begin(), value.end(), s.begin(), s.end());
@jbelloncastro
jbelloncastro / sax_parse.cc
Last active Aug 28, 2019
nlohmann::json SAX parsing example
View sax_parse.cc
#ifndef SAX_H
#define SAX_H
#include <nlohmann/json.hpp>
#include <bitset>
#include <string_view>
#include <sstream>
template < class T >
struct sax_reader;
@jbelloncastro
jbelloncastro / integer-string-literal.cpp
Created Sep 9, 2019
Create a string from an integer without using std::to_string or std::printf
View integer-string-literal.cpp
#include <algorithm>
#include <cstring>
#include <string>
#include <limits>
// Literal for the IEC Mebi binary prefix
static
std::string operator""_Mi( unsigned long long value ) {
struct Generator {
Generator( unsigned long long value ) :
@jbelloncastro
jbelloncastro / plot.gnuplot
Created Sep 30, 2019
Gnuplot chart for a histogram with error bars
View plot.gnuplot
#!/usr/bin/gnuplot
# Output format
set terminal png enhanced font "freesans,16" linewidth 2
# Caption
set key inside top horizontal nobox font ",12"
set xlabel ''
set ylabel ''
set auto x
View dispatch.cpp
#include <memory>
#include <tuple>
#include <algorithm>
#include <experimental/array>
#include <type_traits>
namespace {
// This fails to evaluate if any element in Args is not a valid type.
// Otherwise it evaluates to void.
@jbelloncastro
jbelloncastro / tuple_switch.cpp
Last active Oct 8, 2019
Switch/case like function for tuples/pairs
View tuple_switch.cpp
#include <tuple>
#include <type_traits>
enum class A {
a, b
};
enum class B {
c, d
};
@jbelloncastro
jbelloncastro / dispatch_functor.cpp
Last active Oct 23, 2019
Deduce function argument type and perform runtime type dispatch based on that type
View dispatch_functor.cpp
#include <type_traits>
#include <llvm/ADT/STLExtras.h>
struct Base { virtual ~Base() = default; };
bool traverse( const Base* base, llvm::function_ref<bool(const Base*)> );
struct dispatcher {
template <class F, class U, class... Args>
auto operator()( F &&f, U &&u, Args&&... args ) const {
@jbelloncastro
jbelloncastro / ival_overwrite.cpp
Last active Oct 26, 2019
Interval map that overwrites values instead of accumulating
View ival_overwrite.cpp
#include <boost/icl/interval_map.hpp>
#include <boost/optional.hpp>
#include <iostream>
using namespace boost::icl;
template <class Type>
struct inplace_overwrite : identity_based_inplace_combine<Type> {
void operator()(Type &object, const Type &operand) const { object = operand; }
};
You can’t perform that action at this time.