std::size_t hash<p0::intermediate::function_ref>::operator()(const p0::intermediate::function_ref &ref) const { auto const pair = to_pair(ref); //unfortunately, std::hash is not specialized for std::pair, //so we use boost here return boost::hash_value(pair); }
comparison_result::Enum compare( intermediate::function_ref const &left, intermediate::function_ref const &right) { auto const left_pair = to_pair(left); auto const right_pair = to_pair(right); if (left_pair < right_pair) { return comparison_result::less; } else if (left_pair > right_pair) { return comparison_result::greater; } return comparison_result::equal; }
void print_pair(ptr x) { pair* p = to_pair(x); print_ptr_rec(p->car); if (is_pair(p->cdr)) { printf(" "); print_pair(p->cdr); } else if (is_null(p->cdr)) { /*pass*/ } else { printf(" . "); print_ptr_rec(p->cdr); } }
struct point { T x, y; };ttt point<T> operator + (pca a, pca b) { return { a.x+b.x, a.y+b.y }; }ttt point<T> operator - (pca a, pca b) { return { a.x-b.x, a.y-b.y }; }ttt point<T> operator - (pca a) { return { -a.x, -a.y }; }ttt point<T> operator * (T a, pca b) { return { a*b.x, a*b.y }; }ttt std::pair<T,T> to_pair(pca a) { return { a.x, a.y }; }ttt bool operator == (pca a, pca b) { return to_pair(a) == to_pair(b); }ttt bool operator != (pca a, pca b) { return to_pair(a) != to_pair(b); }ttt bool operator < (pca a, pca b) { return to_pair(a) < to_pair(b); }ttt bool operator <= (pca a, pca b) { return to_pair(a) <= to_pair(b); }ttt bool operator >= (pca a, pca b) { return to_pair(a) >= to_pair(b); }ttt bool operator > (pca a, pca b) { return to_pair(a) > to_pair(b); }ttt T length_squared(pca p) { return p.x*p.x + p.y*p.y; }ttt double length(pca p) { return sqrt(length_squared(p)); }ttt point<T> normalized(pca a) { return (1 / length(a)) * a; }ttt T dot(pca p, pca q) { return p.x * q.x + p.y * q.y; }ttt T cross(pca p, pca q) { return p.x * q.y - p.y * q.x; }ttt int ccw(pca a, pca b, pca c) { T x = cross(b - a, c - a); return x > 0 ? 1 : x < 0 ? -1 : 0; }
bool operator < (function_ref const &left, function_ref const &right) { //make std::pair do the work return to_pair(left) < to_pair(right); }
bool operator == (function_ref const &left, function_ref const &right) { return to_pair(left) == to_pair(right); }
struct point { T x, y; };ttt point<T> operator + (cpa a, cpa b) { return { a.x+b.x, a.y+b.y }; }ttt point<T> operator - (cpa a, cpa b) { return { a.x-b.x, a.y-b.y }; }ttt point<T> operator - (cpa a) { return { -a.x, -a.y }; }ttt point<T> operator * (T a, cpa b) { return { a*b.x, a*b.y }; }ttt std::pair<T,T> to_pair(cpa a) { return { a.x, a.y }; }ttt bool operator == (cpa a, cpa b) { return to_pair(a) == to_pair(b); }ttt bool operator != (cpa a, cpa b) { return to_pair(a) != to_pair(b); }ttt bool operator < (cpa a, cpa b) { return to_pair(a) < to_pair(b); }ttt bool operator <= (cpa a, cpa b) { return to_pair(a) <= to_pair(b); }ttt bool operator >= (cpa a, cpa b) { return to_pair(a) >= to_pair(b); }ttt bool operator > (cpa a, cpa b) { return to_pair(a) > to_pair(b); }ttt T length_squared(cpa p) { return p.x*p.x + p.y*p.y; }ttt double length(cpa p) { return sqrt(length_squared(p)); }ttt T dot(cpa p, cpa q) { return p.x * q.x + p.y * q.y; }ttt T cross(cpa p, cpa q) { return p.x * q.y - p.y * q.x; }ttt int ccw(cpa a, cpa b, cpa c) { double x = cross(b - a, c - a); return x > 0 ? 1 : x < 0 ? -1 : 0; }