/** * Defines a few widely used, widely spread structures. Imported pervasively. **/ #include // Hash struct Point { Point(double x, double y, double z) : x(x), y(y), z(z) {} double x, y, z; }; struct Face { Face(int v0, int v1, int v2) { vert[0] = v0; vert[1] = v1; vert[2] = v2; } int vert[3]; int operator[](unsigned i) const { return vert[i % 3]; // dodge errors } }; namespace std { template<> struct hash { typedef Face argument_type; typedef std::size_t result_type; result_type operator()(argument_type const& s) const noexcept { result_type const h1 ( std::hash{}(s[0]) ); result_type const h2 ( std::hash{}(s[1]) ); result_type const h3 ( std::hash{}(s[2]) ); return h1 ^ h2 ^ h3; } }; }