Skip to content

Instantly share code, notes, and snippets.

#include <iostream>
#include <memory>
template<class F>
inline std::shared_ptr<void> scope_exit( F f )
{
void* const p = 0;
return std::shared_ptr<void>( p, [=](void*)mutable{ f(); } );
}
#include <iostream>
#include <memory>
#include <utility>
#include <functional> // for std::bind
// pointer, deleter のペアから unique_ptr を作る
// 本当は不適切( D に pointer の typedef があった場合など)
template< class T, class D >// = std::default_delete<T> は VC++ 対応のため泣く泣く削除
inline std::unique_ptr<T, D> to_unique( T* p, D d = D() )
{
// オレオレ性能測定
#include "xor128.hpp"
// ローパスフィルタ
// 結果のランダムな性質を少し和らげて、より正確な処理ができるよう(気休めレベルですが)
struct LPF
{
typedef double result_type;
explicit LPF( double x0 = 0 )
: x_(x0), y_(x0) {}
@gintenlabo
gintenlabo / optional_ref.hpp
Created October 19, 2010 14:29
boost::optional<T&> の省メモリな代替
//
// etude::optional_ref<T>
// ポインタの安全で軽快な代替として使えるクラス
// 一部を除き boost::optional<T&> と同じように使えます。
// 詳しくは http://d.hatena.ne.jp/gintenlabo/20101019/1287500776 を参照。
//
// Copyright (C) 2010 Takaya Saito (SubaruG).
// このコードは NYSL (http://www.kmonos.net/nysl/) の下で公開されています。
// 自分で書いたコードと同じように、自由に利用、改変、再配布を行って構いません。
// 何かあったら: gintensubaru あっと gmail.com まで。
@gintenlabo
gintenlabo / Stack.cc
Last active September 24, 2015 00:37
pImpl イディオム + thin template 技法の簡単な例
#include "Stack.hpp"
#include <vector>
// Impl_ の実装(今回はメンバのみ)
// 複雑なクラスの場合は Impl_ 内にメンバ関数を定義するのもアリ
struct StackImpl_::Impl_
{
std::vector< boost::shared_ptr<void> > v;
};
@gintenlabo
gintenlabo / algorithm.hpp
Created November 5, 2010 16:43
C++0x から <algorithm> に追加される関数の C++03 による実装
//
// C++0x から <algorithm> に追加される関数を C++03 で使えるよう実装したヘッダ
// やっつけテストも記述しました。
//
#ifndef ETUDE_INCLUDED_ALGORITHM_HPP_
#define ETUDE_INCLUDED_ALGORITHM_HPP_
#include <algorithm>
#include <iterator>
#include <utility>
@gintenlabo
gintenlabo / tuple.lua
Created November 21, 2010 15:30
Lua で作った flyweight な tuple の実装
-- tuple.lua
-- 簡潔なタプルの実装
-- 特徴:
-- ・immutable
-- タプルの各要素は完全に immutable である
-- というより、関数として実装されているので変更しようがない
-- ・flyweight
-- tuple.new(...) で得られたオブジェクトが生き残っている限り、
-- 常に tuple.new( ... ) == tuple.new( ... ) が成立する。
-- テーブルのキーとして使ったときに同一性を保証できる。
typedef double real;
struct cached_angle
{
cached_angle( real x = 0 )
: angle(x), angle_(0), s_(0), c_(1) {}
// get angle
real& get() { return angle; }
real const& get() const { return angle; }
@gintenlabo
gintenlabo / default_delete.hpp
Created November 24, 2010 14:00
カスタム削除子を指定可能 && 所有するポインタを release 出来る、俺々 scoped_ptr
/*
default_delete : std::default_delete の移植
boost::checked_delete を使って削除する deleter です。
配列の場合は checked_array_delete を使います。
定義を見れば一目瞭然。
*/
#ifndef ETUDE_INCLUDED_DEFAULT_DELETE_HPP_
#define ETUDE_INCLUDED_DEFAULT_DELETE_HPP_
@gintenlabo
gintenlabo / in_place_factory.hpp
Created November 28, 2010 21:45
Boost.InPlaceFactory の C++0x 移植
//
// in_place_factory:
// Boost.InPlaceFactory の C++0x 拡張
//
// boost::in_place を variadic templates + perfect forward に対応させた版です。
// 普通の apply に加え、rvalue を move させる move_apply が追加されています。
// 本当は move_apply は rvalue references for *this を使って対応すべきなのでしょうが、
// gcc 4.5.0 にはまだ実装されていないので、泣く泣く専用のメンバを用意しています。
// ただ、 move 時は専用の関数を使う、というのだと扱いにくいので、
// 統一したアクセスを可能にするために、自由関数 apply_in_place を提供しています。