All pastes #1913674 Raw Edit

functional.h

public cpp v1 · immutable
#1913674 ·published 2010-08-09 05:29 UTC
rendered paste body
#pragma once/* *  functional.h *  Picross * */#include <vector>template <class _TArg1, class _TArg2, class _TRet>class binfunc {public:	virtual _TRet operator()(_TArg1 &, _TArg2 &) = 0;};template <class _TArg, class _TRet>class unfunc {public:	virtual _TRet operator()(_TArg &) = 0;};template <class _TA, class _TB>class couple {public:	couple(_TA a, _TB b) : m_a(a), m_b(b) { }		bool operator<(const couple<_TA, _TB> &other) const {		if (m_a==other.m_a) {			return m_b<other.m_b;		} else {			return m_a<other.m_a;		}	}private:	_TA m_a;	_TB m_b;};template <class _TA, class _TB>couple<_TA, _TB> makecouple(_TA a, _TB b) {	return couple<_TA, _TB>(a, b);}template <class _TA, class _TB, class _TC>class triplet {public:	triplet(_TA a, _TB b, _TC c) : m_a(a), m_b(b), m_c(c) { }	bool operator==(const triplet<_TA, _TB, _TC> &other) {		return other.m_a==m_a && other.m_b==m_b && other.m_c==m_c;	}private:	_TA m_a;	_TB m_b;	_TC m_c;};template <class _TA, class _TB, class _TC>triplet<_TA, _TB, _TC> maketrip(_TA a, _TB b, _TC c) {	return triplet<_TA, _TB, _TC>(a, b, c);}	template <class _TList>std::vector<_TList> filter(std::vector<_TList> &ls, unfunc<_TList, bool> &fn) {	std::vector<_TList> lr;	for (int i=0;i<ls.size();i++) {		if (fn(ls[i])) {			lr.push_back(ls[i]);		}	}		return lr;}template <class _TList>_TList reduce(std::vector<_TList> &ls, binfunc<_TList, _TList, _TList> &fn) {	if (ls.size()==1) {		return ls[0];	}		_TList tmp = fn(ls[0], ls[1]);	for (int i=0;i<ls.size();i++) {		tmp = fn(tmp, ls[i]);	}		return tmp;}