Skip to content

Instantly share code, notes, and snippets.

Avatar

Jorge jbelloncastro

View GitHub Profile
@jbelloncastro
jbelloncastro / ytsearch.sh
Last active Mar 28, 2020
Search in youtube using youtube-dl and pipe the audio to VLC
View ytsearch.sh
#!/bin/bash -x
search="$@"
vlc_options=":sout=#transcode{vcodec=none,scodec=none}:http{mux=ogg,dst=:8080/} :no-sout-all :sout-keep"
youtube-dl "ytsearch1:$search" -r 200k -f 'bestaudio[ext=m4a]' -o - | cvlc - ${vlc_options}
@jbelloncastro
jbelloncastro / ddispatch.cc
Created Jan 28, 2020
Double dispatch C++
View ddispatch.cc
enum class Kind : unsigned int;
struct Base {
const Kind kind;
explicit Base(Kind kind) : kind(kind) {}
template <class T> bool is() const { return kind == T::kind; }
template <class T> const T* cast() const { return is<T>()? static_cast<const T*>(this) : nullptr; }
};
@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; }
};
@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 / 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
};
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 / 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
@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 / 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 / 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());